Skip navigation.

NoobSaibots I/O

Posts tagged with "programmierung"

WebKit Browser

, , , ...

Aus reiner Neugier wie weit ich wohl kommen könnte, hab ich mal einen Versuch gestartet einen ähnlichen Browser zu implementieren wie der uzbl.

Wodurch zeichnet sich der uzbl Browser aus. Diese Software ist einzig und allein dafür geschaffen worden eine Seite anzuzeigen. Sonst nichts. Klingt erst einmal recht bescheiden an. Keine Favoriten, keine Extensions, kein gar nichts.

Dafür ist er sehr gut konfigurierbar. Ehrlich gesagt habe ich keine Ahnung wie gut er konfiguriert werden kann, genauer gesagt an die eigenen Bedürfnisse angepasst werden kann, da ich ihn noch nie ausprobiert habe.

Wieso? Ganz einfach. Der uzbl verwendet die Gtk Version von WebKit. Das bedeutet für mich unnötige Bibliotheken auf meinem System, komisch aussehende Dialoge und GUI-Elemente. Keine Integration in mein KDE System. Sei es drum.

Ich verwende die Qt Version von WebKit. Die gesamte Software ist recht übersichtlich und besteht soweit aus 2 Klassen und einer main.cpp. Die Hauptkomponenten des Browsers, die GUI und die WebView sind bei der Script Engine registriert. Das bedeutet, daß man durch selbstgeschriebene Skripte einiges am System drehen kann.

Wer Lust hat das ganze auszuprobieren, hier ist das Code-Repo

Bin offen für Anregungen.

Qt Creator

, , ,

Seit ein paar Wochen trage ich ein wenig Code zum Projekt Qt Creator bei. Qt Creator ist ein Cross-Plattform Entwicklungseditor, der mithilfe von Qt geschrieben wird. Bisher bietet dieser Editor nur Unterstützung für C++/Qt Entwicklung. Dennoch, da die Struktur sehr pluginlastig ist, ist es möglich jedwede Sprache zu unterstützen. Natürlich muß jemand die Implementierung in Angriff nehmen :wink:.

Ein Paar Sachen, die ich soweit implementiert habe:

1. Copy Lines/Selection Up/Down

Das Verhalten habe ich einfach aus Eclipse übernommen. Hier wird entweder die aktuelle Zeile, oder alle Zeilen, die markiert sind, hoch oder runter kopiert. Die Keysequenz dafür ist CTRL+ALT+(UP|DOWN)

2. Minimap

Minimap, hier ein Beispiel, stellt die stark verkleinerte Version des aktuellen Dokumentes dar und ist links von der Editierkomponente positioniert (direkt neben den zeilennummern). Dadurch hat der Entwickler mehr Übersicht über das Dokument. Ferner wird auch der aktuelle sichtbare Bereich durch ein kleines Fenster angezeigt. Dieses Fenster kann auch zum Scrollen benutzt werden.

3. SmartReplace

Diese Funktionalität ermöglicht ein CaseSensitives Ersetzen. Hier ein Beispiel:

#ifndef FOO_H
#define FOO_H

class FooClass {
public:
    FooClass();
    ~FooClass();

private:
    int foo;
};


nun soll das "foo" durch "bar" ersetzt werden. Vorher würde der Ersetzungsalgorithmus jedes Vorkommen von foo (foo, Foo, FOO, ...) exakt durch das ersetzen was im "ersetzen durch:" steht; also durch "bar". Mit meinem kleinen Beitrag würde folgendes rauskommen.

#ifndef BAR_H
#define BAR_H

class BarClass {
public:
    BarClass();
    ~BarClass();

private:
    int bar;
};


Ferner kann auch beliebige Abfolge von klein-/großschreibung beachtet werden, solange die länge von "suchen nach" und "ersetzen durch" gleich ist. CamelCase funktioniert leider nicht, wenn die der ersetzte String nicht die gleiche Länge hat wie der String mit der er ersetzt wird.

Leider hat mein Arbeitgeber mir die Unterschrift des Copyright Assignments versagt. Da das Projekt zwar OpenSource sei, aber dahinter ein kommerzieller Konzern steht würde ich Nokia einen Vorteil erbringen in einem Geschäft, das nicht das geringste das unsere tangiert! Ich frage mich ob ich jetzt auch mein Nokia handy abgeben muß. :furious: :bomb: :jester:

Qt 4: Teil 4 - Nachtrag: Hintergrundbild setzen

, ,

Vor einiger Zeit habe ich mal beschrieben wie ein Hintergrundbild eines Widgets zu setzen ist. Für die jenigen, die es noch nicht mitgekriegt haben; Qt 4 unterstützt CSS. Also hier nochmal das Gleiche nur diesmal verwende ich Stylesheets.

Seit ihr bereit? Hier kommt es ...

myWidget->setStyleSheet( "background: url(':/graphics/images/splash.png')" );


jepp, das ist alles :smile:

Qt: Mein Dateiexplorer 0.2

, , ,

Hier kommt die Weiterentwicklung des Dateibrowsers ( v0.2 ) download

Einiges wurde verbessert:

- Drag&Drop implementiert
- multiple Reiter im Lister jetzt möglich
- Spitznamen für Verzeichnisse ( verwaltbar über die GUI )
die Eingabe des Spitznamens wird ausgelöst durch ":"
- i18n umgesetzt. zu den unterstützten sprachen gehören deutsch, englisch und russisch
- Löschen von Einträgen
- Kopieren und Löschen von Einträgen in eigene Threads ausgelagert um die GUI nicht einzufrieren.
- Programmweites Benachrichtigungssystem implementiert
- Vorschau für Textbasierte Dateien implementiert
- Vorschau wird über externe Plugins realisiert
- Bugfix


bild

Rails - Custom Form Builder

, , , ...

Seit langem versuche ich eine Antwort auf die Frage zu bekommen, wie man das select html Element von einem Custom Form Builder erfassen lassen kann. Der CFB akzeptiert text_field, text_area und sonstige Formularfelder. Jedoch nicht das select Feld und auch nicht den Submit Knopf. Wieso auch immer.

Gestern hatte ich die Nase voll. Keiner weiß anscheinend eine Antwort. Also habe ich meinen CFB selbst erweitert. Hier ist der Code

class TableFormBuilder < CustomFormBuilder
  (field_helpers - %w(check_box radio_button hidden_field)).each do |selector|
    src = <<-END_SRC
      def #{selector}(field, options = {})
        @template.content_tag("tr" ,
        @template.content_tag("th" , ( options[:label] || field.to_s.humanize ) + ":" ) +
        @template.content_tag("td" , super))
      end
    END_SRC
    class_eval src, __FILE__, __LINE__
  end
  
  def submit( value, options = {} )
    @template.content_tag("tr" ,
    @template.content_tag("th" , ( value ) + ":" ) +
    @template.content_tag("td" , @template.submit_tag( value, options )))
  end
  
  def select(method, choices, options = {}, html_options = {})
    @template.content_tag("tr" ,
    @template.content_tag("th" , ( options[:label] || method.to_s.humanize ) + ":" ) +
    @template.content_tag("td" , @template.select( object_name, method, choices, options, html_options )))
  end
end


Habe noch die Möglichkeit eingebaut einem Feld eine Beschriftung (Label) mitübergeben zu können.

Hier ist auch noch der Beitrag im RoR - Forum

Qt 4.3 ist unterwegs

, , , ...

Qt 4.3 ist unterwegs und bringt wieder neue und leckere Sachen mit. Intro

ich bin echt gespannt ob Opera auf Qt 4 umsteigt. Einige Sachen in Qt 4 sind doch ziemlich verlockend.

Vorausgesetzt natürlich Opera verwendet Qt nicht nur für kleine Dialoge. Ich denke Opera verwendet Qt für die Darstellung der gesamten UI, jedoch sind die Widgets soweit an ihre Anforderungen angepasst worden, daß der Umstieg nicht einfach so möglich wäre.

Naja, nur mal so ...

ColdFusion Reactor

, , , ...

Endlich habe ich auch ein ORM Framework für ColdFusion gefunden. Das ständige Absetzen und Zusammensetzen von Queries ist umständlich, lästig und unschön. Nach dem Einbinden des Frameworks wurde der Code sofort übersichtlicher, kürzer und pflegeleichter.

Ach so, Reactor heißt das Gute Stück. Dem Framework fehlen zwar noch ein Paar Sachen, die ich von ActiveRecord in Ruby kenne, trotzdem erleichtert es die Arbeit ungemein.

Z. B. ist es möglich Objekte und ihre Beziehungen zu anderen Tabellen zu definieren. Wie in ActiveRecord ist es auch hier möglich zu definieren welche Art der Beziehung es ist; 1 zu 1, 1 zu n, usw..

Was zum jetzigen Zeitpunkt fehlt ist die Definition mehrerer DSNs. Denn die Daten der Anwendung erstrecken sich über zwei Datenbanken. Deshalb können einige Beziehungen zum jetzigen Zeitpunkt nicht deklariert werden, schade. Mit der Version 2.0 soll es aber kommen, juhuuu.

Ferner fehlt mir die Definition eines Constraints in der Beziehung. Es ist möglich in ActiveRecord eine Einschränkung zu definieren, der die Beziehung genügen muß. Z. B. kann ein Mitarbeiter viele Untergebene haben. Hier wäre die Einschränkung die, daß die Untergebenen die supervisor_id gleich der Id des Chefs haben.

Ob das kommt ist ungewiss. Würde mich aber sehr freuen.

Qt4 - Teil 3

, , , ...

Den dritten Teil des Tutorials habe ich im Forum verfasst. Hier ist der Link dazu.

Ein neuer Stern?

, , , ...

Vor kurzem bin ich über Ruby und ein Web Framework RubyOnRails gestolpert. Nach dem ich ein Paar Artikel (1, 2, 3) dazu gelesen habe, war ich überzeugt, dass das mein Werkzeug werden wird womit ich in Zukunft meine Seiten erstellen werde.

Die Werkzeuge, die ich in der Vergangenheit verwendet habe, sind zu nennen: PHP, Java und ColdFusion.

PHP ist natürlich die Skriptsprache mit der man den Einstieg in die Webentwicklung wagen sollte. Sie ist einfach zu erlernen und bietet - mittlerweile - auch genügend Werkzeuge um ernsthafte Anwendungen in Betracht ziehen zu können. Was mir an PHP jedoch schon immer missfallen hat ist die Inkonsistenz der Namensgebung. Z. B. sind viele Methodennamen in der CamelCase-Weise definiert. Andere wiederum sind nach der alten C Variante definiert, bei der die einzelnen Wörter durch einen Unterstrich verbunden werden.

Nichtsdestotrotz war PHP die Sprache meiner Wahl für die Webentwicklung.

Während meiner Arbeit bei einem Unternehmen -- das ich nicht nennen werde --, war ich "gezwungen" Java einzusetzen. In den ersten Wochen meiner Tätigkeit arbeiteten wir noch mit JSPs. Eigentlich sind ja die JSPs nichts anderes als invertierte Servlets. Da hier keine Trennung von Geschäftslogik/Präsentationsschicht gegeben ist waren die JSPs auch dementsprechend überfüllt mit Java Code und HTML.

Nach ein Paar Wochen wurden eine neue Entwicklungsumgebung (eclipse), ein "neues" Versionsverwaltungswerkzeug (cvs) und ein neues Framework (Struts) eingeführt.

Mit diesen Hilfsmitteln ging die Arbeit wesentlich flotter voran und machte Spass. Jedoch basiert Struts auf dem Prinzip der Konfiguration. Was Konfigurationsdateien mit sich bringt, was wiederum Konfigurationsarbeit mit sich bringt. Wer will das schon? :smile:

Nach einem Jobwechsel bin ich nun dazu verdonnert ColdFusion einzusetzen. Wie alles andere auf der Welt auch, hat ColdFusion Vor- und Nachteile. Zu den Vorteilen gehört der ColdFusion Application Server der mitinstalliert wird. Mit dem lassen sich viele Aspekte der Anwendungen konfigurieren. Z. B. die Datenquellen. Das erleichtert die spätere Migration.

Die Nachteile sind in der Sprache selbst. Z. B. stosse ich immer wieder auf ein Verschachtelungsproblem in ColdFusion, bei dem sich zwei Schleifen <cfloop> <cfoutput query=""> (oder andersrum?) in den Weg kommen. Oder, dass die Verschachtelung überhaupt nicht funktioniert. Wie z. B. bei zwei <cfoutput query=""> der Fall ist.

Das sind schwerwiegende Nachteile, die zwar umgangen werden können aber nicht missachtet werden sollten.

Hier kommt Ruby On Rails (ror). Nachdem man alles nötige dafür installiert hat -- und es ist nicht viel -- kann man direkt und aus dem Stand eine Webanwendung generieren, durch

rails meineAnwendung

Dabei werden eine Verzeichnisstruktur und ein Paar Konfigurationsdateien generiert.

Was mich bei dem Framework wirklich überzeugt hat ist das Mapping der Relationalen Modelle (aus der Datenbank) zu den Ruby Objekten. Es geht so einfach und bringt so viel Flexibilität mit sich, dass man sich fragt wieso es bei den anderen sowas nicht gibt.

Das entwickeln macht einen riesen Spass, weil viele Kleinigkeiten vom Framework übernommen werden und das Framework nach dem Prinzip der Konvention funktioniert.

Vielleicht werde ich es schaffen dieses Framework in dem Unternehmen einzuführen für das ich tätig bin.

Qt4 - Teil 2

, , , ...

Weiter geht's mit dem Tutorial. Wie versprochen wird es ganz einfach. Ein kleines "Hello World" Programm.

Als Erstes erstellen wir ein neues Projekt in Eclipse. Ein "Standard Make C++ Project" damit uns Eclipse nicht mit dem Erzeugen von eigenen Makefiles in die Quere kommt. Wir haben ja mit Qt alles was wir brauchen ... vorerst. Verpasst eurem Projektnamen einen Namen. Ich habe es "helloQt" genannt ... und auf Finish gedrückt.

Jetzt haben wir ein jungfreuliches Projekt vor uns liegen. Was wir jetzt brauchen sind die Qt Include Dateien, damit wir die ganzen netten Sachen in Eclipse nutzen können; Codevervollständigung z. B.. Also, Rechtsklick auf das neuerstellte Projekt und im Kontextmenü die Properties auswählen. Hier geht auf den Menüpunkt C/C++ Include Paths & Symbols und klickt auf den Knopf Add External Include Path ... und hier auf den Browse ... Knopf. Navigiert nun zum Verzeichnis $QTDIR/include/Qt und bestätigt zwei Mal mit ok.


projekt_properties.png

So* müsste bei Euch das Fenster aussehen nach dem zweimaligen Bestätigen. Jetzt wird die Autovervollständigung auch die Methoden anzeigen, die in den Qt Klassen enthalten sind. Hört sich logisch an :) ... es war nicht immer so in CDT.

Jetzt kommen wir zum Eigentlichen. Wir programmieren *Tim Taylor grunzen hier einfügen*.

Was wir brauchen ist eine *.cpp Datei. Erstellen wir doch einfach eine. Strg+N drücken, C++ Verzeichnis runterklappen und Source File auswählen. Benennt die Datei, "main.cpp" zum Beispiel.

Jetzt fügen wir entweder alle Dateien die für das Erstellen einer GUI Anwendung nötig ist, oder nur die Dateien, die wir wirklich benötigen.

Variante 1
#include <QtGui>

Variante 2
#include <QApplication>
#include <QLabel>


Bei der Variante 1 werden eine Menge Dateien mit eingefügt, die unter Umständen überhaupt nicht benötigt werden. Ihr könnt den Inhalt der Datei QtGui einsehen indem ihr einfach in das Outline Panel in Eclipse geht und dort auf QtGui doppelklickt.

Also die Variante 2.

Jetzt kommen wir zum Wesentlichen.

#include <QApplication>
#include <QLabel>

int main(int argc, char **argv) {
    QApplication app(argc, argv);

    QLabel lbl("Hallo Qt Welt!");
    lbl.setWindowTitle("halloQt");
    lbl.setGeometry(500, 300, 300, 300);
    lbl.show();

    return app.exec();
}


Die ersten zwei Zeilen sind die Includes, die ich schon beschrieben habe. Die main Funktion sollte auch bekannt sein. Hier erzeugen wir als erstes eine QApplication Instanz auf dem Stack. Das hat den Vorteil, dass die automatisch beim Beenden der main Funktion zerstört wird.

Im nächsten Schritt erzeugen wir eine QLabel Instanz ... ebenso auf dem Stack. Dem Konstruktor übergeben wir einen String "Hallo Qt Welt!", der dann später auch im Fenster angezeigt wird. Die Funktion setWindowTitle setzt den Fenstertitel. Dieser wird im Fensterrahmen und in der Taskbar angezeigt. setGeometry(x, y, w, h) definiert die Position sowie die Breite und die Höhe des Fensters. Mit show() lassen wir schliesslich das Fenster erscheinen. Das Fenster enthält nur unser Label mit dem Text "Hallo Qt Welt!".

Die letzte Zeile ruft die Funktion exec() auf. Die exec() Funktion in qapplication.cpp sieht folgendermaßen aus:

int QApplication::exec()
{
#ifndef QT_NO_ACCESSIBILITY
    QAccessible::setRootObject(qApp);
#endif
    return QCoreApplication::exec();
}

Im Wesentlichen wird die exec() Funktion der QCoreApplication ausgeführt. Hier ist sie:

int QCoreApplication::exec()
{
    if (!QCoreApplicationPrivate::checkInstance("exec"))
        return -1;
    QThread *currentThread = QThread::currentThread();
    if (currentThread != self->thread()) {
        qWarning("QApplication::exec() failed: must be called from the main thread.");
        return -1;
    }
    QThreadData *data = QThreadData::get(currentThread);
    if (!data->eventLoops.isEmpty()) {
        qWarning("QApplication::exec() failed: the event loop is already running.");
        return -1;
    }
    QEventLoop eventLoop;
    int returnCode = eventLoop.exec();
    if (self) {
        emit self->aboutToQuit();
        sendPostedEvents(0, QEvent::DeferredDelete);
    }
    return returnCode;
}

In dieser Funktion pumpt quasi das Herz einer Jeden Anwendung. Die Ereignisschleife "eventLoop". In dieser Schleife werden Nachrichten zwischen der Anwendung dem System und dem Benutzer verschickt. Darauf werde ich jedoch nicht tiefer eingehen.

Das ist wirklich beeindruckend wenig Code den wir zu schreiben hatten, nicht wahr. Im nächsten Schritt muß die [verzeichnisname*].pro Datei erstellt werden. Das erledigt für uns das Externe Tool qmake project, das wir im Teil 1 erstellt haben. Einfach das Tool aufrufen und schon wird eine helloQt.pro Datei in unserem Verzeichnis angelegt.

Der Inhalt der Datei helloQt.pro sollte ungefähr -- eigentlich genau so -- aussehen:

######################################################################
# Automatically generated by qmake (2.00a) Do Nov 24 19:05:18 2005
######################################################################

TEMPLATE = app
TARGET += 
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += main.cpp

Was in dieser Datei stehen muss und was das alles bedeutet wird in der qmake Dokumentation genauestens beschrieben.

Jetzt muß die Makefile Datei erzeugt werden. Das nächste nützliche Externe Tool ... qmake. Einfach das Werkzeug aufrufen und schon erscheint eine Makefile Datei mit allem was nötig ist.

Das weitere Vorgehen ist das Folgende. Wir sollten unsere Anwendung aus Eclipse heraus ausführen können. Dazu gehen wir in das Menü mit dem grünen Pfeil und wählen dort den Menüpunkt Run ... aus.

Im folgenden Dialog erzeugen wir unter C/C++ Local Application einen neuen Eintrag mit dem Betätigen des New Knopfes.


neues_projekt.png

Project:
helloQt

C/C++ Application:
helloQt

Passt die Daten im rechten Dialogfenster entsprechend an; Wenn ihr meine Benennung übernommen habt sollten die Einträge meinen entsprechen. Unter Umständen müsst ihr noch den Debugger auswählen. Geht dazu einfach auf den Registerreiter "Debugger" und wählt dort einen Debugger aus. Damit ihr Eure Anwendung später direkt aus dem Run Menü auswählen könnt müsst ihr noch im Register "Common" unter den "Display in favorites menu" am besten beide Checkboxen anwählen; für das Run und das Debug Menü. Bestätigt alle Eingaben mit dem Apply Knopf.

Jetzt müsste alles funktionieren. Wählt im Run Menü helloQt aus und das Projekt wird kompilliert und gestartet. Das Resultat sollte aussehen wie im Folgenden Bild:



Ziel erreicht. Glückwunsch. Bis zum nächsten Mal.

* Da ich mittlerweile Qt als rpm installiert habe hat sich der Pfad der Includedateien entsprächend geändert. Dem alten Beispiel folgend wäre der Pfad natürlich "/usr/local/Trolltech/Qt-4.0.0/include/Qt"
* Der Verzeichnisname entspricht bei einem Eclipseprojekt dem Projektnamen.
December 2009
M T W T F S S
November 2009January 2010
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31