04 Dezember 2009

Mit JNDI ein Active Directory anfragen

Die Aufgabe, ein Active Directory aus JAVA anzufragen, ist nicht ganz trivial.

Ein kleines Beispiel ist das verwendete Timestamp-format, das in 100 Nanosekunden Schritten seit dem 01.01.1601 zählt.
Zur Umrechnung in JAVA Date, empfehle ich diesen Foreneintrag bei Sun. (unbedingt bis zum Ende lesen...).

Weitere empfehlenswerte Links:
und noch eine Kleinigkeit über keystores...
und das importieren von SSL Zertifikaten.

Labels: , , , , ,

29 April 2009

Comparing Code Folders, the groovy way

Ich habe mir vor einiger Zeit mal die Zeit genommen, ein wenig mit Groovy rumzuspielen, da ich glaube dass Groovy eine Prima Scriptingergänzung zu JAVA darstellt. Und heute hatte ich mal einen typischen Scripting Task aufm Schreibtisch:

Das Vergleichen zweier Verzeichnisse, in dem einen JAVA Code aus einer älteren Iteration und in dem anderen die neue Version. Mich haben nur die groben Zahlen (LoC, Files) interessiert und so sieht die Groovy-Lösung aus:

// Pattern for Java Files
def p = ~/.*\.java/
// Pathes to the directories containing the code
def newPath ='c:\\code\\20090427'
def oldPath ='c:\\code\\20090213'
// variables for counting
def newFilecount = 0
def oldFilecount = 0
def newLOCcount = 0
def oldLOCcount = 0

 
//define a closure for recursive directory access
// in the new code folder
def directoryClosNew
directoryClosNew = {
    it.eachDir(directoryClosNew);
    it.eachFileMatch(p){
        newFilecount++
        println "New source: $it"
        it.eachLine {
            newLOCcount++
        }
    }
}

//define a closure for recursive directory access
// in the old code folder
def directoryClosOld
directoryClosOld = {
    it.eachDir(directoryClosOld);
    it.eachFileMatch(p){
        oldFilecount++
        println "Old source: $it"
        it.eachLine {
            oldLOCcount++
        }
    }
}

// call closure on directories
directoryClosNew(new File( newPath ))
directoryClosOld(new File( oldPath ))
println " Old number of Java Files $oldFilecount \n New number of Java Files $newFilecount "
println " Old Lines of Code $oldLOCcount \n New Lines of Code $newLOCcount"

Schick, nicht? :-)

Labels: ,

26 März 2009

Nokia E71 mit Exchange Server verbinden

Das alte Lied, ein Nokia mit einem Exchangeserver zuverbinden: Das Nokia akzeptiert das Zertifikat nicht.

Natürlich gibt das Nokia das nicht zu, sondern fragt beim ersten Verbinden nach, ob man das Zertifikat akzeptieren will. Man stimmt den zu, macht 1001 weitere Einstellungen und versucht sich zu verbinden - Ergebnis:  "Verbindungsfehler. Versuchen Sie es später erneut."

Nach längerer Webrecherche habe ich rausgefunden, dass man sich am Besten das Rootzertifikat downloaded und mit hilfe dieses Services für sein Nokia aufbereiten lässt.

Dann nur noch auf die entsprechende URL surfen und alles akzeptieren. *Have Fun*

Labels: ,

17 März 2009

JSF, JPA und Oracle

Ziel: Eine einfache CRUD Anwendung in NetBeans 6.5 generieren.

Kontext: Ein Schema ist in der Oracle DB bereits hinterlegt. Mittels der Generate JSF-CRUD aus DB Funktion in NB soll nun eine kleine JEE Anwendung erzeugt und im Glassfisch V2 deployed werden.

Probleme:
  • Glassfish lässt sich nicht als Resource bei NetBeans einbinden -> gelöst (Bug in NB 6.5 in Kombination mit JDK 1.6 U 12, Lösung Downgrade auf JDK 1.6 U11)
  • Oracle DB Resource lässt sich in NB nicht hinzufügen -> gelöst Oracle Thin JDBC Treiber ojdbc14.jar einbinden
  • Zugriff auf OracleDB mittels TNS Name will nicht funktionieren "Unable to add Connection. Cannot establish connection to jdbc:oracle:thin:... E/A-Exception:Unknown host specified", TNSPING auf den TNS Namen funktioniert jedoch -> Lösung Oracle läuft im Cluster Betrieb, Zugriff nur über TNS auf eine bestimmte DB des Clusters möglich
  • Generierte Anwendung lässt sich nicht deployen "javax.faces.FacesException: Can't parse configuration file: jndi:/server/GUI-war/WEB-INF/faces-config.xml: Error at line 29 column 82: Error at (29, 82: java.lang.ClassNotFoundException: jpa.entities.PmAnsprechpartner
    at com.sun.faces.config.ConfigureListener.parse(ConfigureListener.java:1438)
    ..." Die Klasse ist vorhanden und sollte sich deployen lassen. Es handelt sich dabei um den ersten eintrag in der faces-config.xml-> die übliche Lösung: Projekt einstampfen und neu generieren lassen, dann ging's wieder. (dann darf man nur nicht vergessen, die alte Anwendung aus dem Server zu löschen ;-)
Achja, noch 2 nette Links bezüglich kryptischen Glassfish Stack Traces:

Labels: , , ,

08 Januar 2009

SOA ist tot, es lebe der Service

Anne Thomas Mane hat in ihrem Blog das Ende von Service Oriented Architectures verkündet. Das ist insofern bemerkenswert, dass sie Vice President und Research Director der Burton Group für Application Platform Strategies ist. Zu ihren Aufgabenbereichen gehören: SOA, web services, XML, governance, Java, application servers, superplatforms, und application security.


(Bildquelle: burtongroup.com)

Sie argumentiert, dass der SOA Ansatz zu viel gekostet und zu wenig gebracht hat. Die Versprechen von mehr Flexibilität und geringeneren Kosten wären nicht eingelöst worden. Im Gegenteil, es wären sogar höhere Kosten angefallen und viele Projekte gescheitert.

Trotzdem war die Arbeit nicht umsonst, da viele verwandte auf Services gründende Technologien die SOA beerben sollen. (SaaS, MashUps, Clouds...)

Aus meinen eigenen Erfahrungen kann ich insofern beipflichten, dass das Einführen einer SOA in bestehenden komplexen Systemen sehr teuer und aufwändig ist und damit quasi alle Probleme der Softwarekrise in sich vereint, auf die SOA ja eigentlich die neueste Antwort war.

Hier sehen wir ein typisches Problem des Software Engineerings, dass Ansätze für die Neuentwicklung eines Systems erdacht werden. Quasi für Entwicklungen auf der grünen Wiese.
Im "wahren Leben" wird aber selten ein Software aus dem Nichts erschaffen. Meist baut man auf vorhandenem Code auf.
Von Grund auf eine SOA aufzubauen, um ein komplexes System zu implementieren ist sicherlich ein verlockender Gedanke, aber beispielsweise ein SAP System (ca. 300 Millionen LoC) im Nachhinein auf eine solche radikal andersartige Architektur umzubauen ist in einem solchen Ansatz nicht berücksichtigt.

Hat sie mit ihrer Analyse recht, dann gehört die Zukunft einmal mehr den evolutionären Ansätzen, die sich - weniger radikal - mit geringerem Aufwand in bestehende System einfügen lassen.

Labels: ,

30 Dezember 2008

Immer dann, wenn man's am wenigsten gebrauchen kann...

...erwischt es einen immer wieder: Am 2. Januar muss ich meine Master Thesis abgeben, entsprechend bin ich dezeit sehr forciert am Schreiben und dann das:(ohne Worte)

Naja, zumindest liess sich der Text noch rauskopieren und in Open Office speichern.
Und btw das speichern auf einem USB Stick hat natürlich auch nicht funktioniert, ist klar, oder?


:-)

Labels: ,

01 Dezember 2008

Kleider machen Leute, Titel machen Bestseller...

aber trotzdem muss ich eindringlich vor diesem Buch warnen: C# for Artists: The Art, Philosophy, and Science of Object-Oriented Programming.
Das Buch ist mir in meinem Books24x7 Newsletter aufgefallen, der Titel klang vielversprechend, fand ich. Ein bisschen "The Art of Computer Programming" und dazu noch ein paar tiefgründige Einblicke in die Welt von C#, hoffte ich. Allerdings war der Titel irreführend. Schon das Vorwort des Autors liess mich fürchten.
Thank you for supporting the writing efforts of a independent author and small
publisher. I spent two years of my life crafting this book. My goal was to
create a book with no spelling mistakes or typographical errors, a book whose
programming examples are complete and actually compile, a book that serves
equally well both novice and practitioner, a book that stretches your brain with
in-depth material and challenging projects. Above all, I wanted to create a book
that gives you the absolute best value for your money. I hope I’ve achieved my
goal. I tried my best and that’s all one can do.


Da fällt mir nur Yoda ein:"Tu es oder tu es nicht, es gibt keinen Versuch."

Meine Kritik: Der Titel ist leider sehr irreführend, das Buch ist eher eine Einführung in C# für Studenten. Ich habe ein wenig quergelesen und bin nicht sehr angetan. Der Aufbau entspricht dem typischen Yet Another C# Book, "angereichert" um einige Binsenweisheiten, wie beispielsweise:
Believe it or not, the hardest part about learning to program a computer, in any
programming language, is not the learning of the language itself; rather, it is
learning how to approach the art of problem solving with a computer.

oder
If you have a family computer that everyone shares, adults as well as children,
then get another computer, put it off limits to everyone but yourself, and
password-protect it.

Für eine studentische Einführung OK, aber bei dem Titel hätte ich mehr erwartet. Just my 2 Cents.

Labels: ,

30 November 2008

Die Requirements Falle...

jetzt bin ich doch tatsächlich mal wieder selbst reingetappt.
Mein aktuelles Projekt ist, grob beschrieben, ein MDA Tool zur Codegenerierung aus UML Diagrammen. Ich war mir ziemlich - aber nicht völlig - sicher, dass die Definition eines Attributes im Klassendiagramm dem Schema type:name (ähnlich JAVA/C* Notation: int myNumber) folgt und habe meinen Stringparser entsprechend geschrieben. Natürlich nicht nur für die Attribute, sondern auch für die Operationen.
Tja, als er fertig war, habe ich die 2 Minuten aufgewendet nachzuschlagen und dabei herausgefunden, dass die Notation genau andersherum ist, also: name:type (bsp: myNumber:Integer). Inklusive Testing ein schlapper Tag Extraarbeit für 2 gesparte Minuten nicht nachsehen. :(

Naja, ich hätte es ja wissen müssen... :D

Labels: ,

25 November 2008

Der Weg des Programmierers

Heute möchte ich meinen Blog mal Nutzen, um meine Gedanken ein bisschen zu ordnen und ein wenig Rückschau und Ausblick zu betreiben.

Diese Woche bin ich, eher zufällig über Joel on Software gestolpert und habe einige interessante Artikel gelesen. Ein Term, den Joel immer wieder benutzt, ist der des "Great Developers". Aus seiner Sicht, als Inhaber einer Softwarefirma, geht es ihm natürlich darum, diese selten, großartigen, Best of the Breed Programmierer anzuwerben.

Natürlich stellte sich für mich die Frage, was einen großartigen Programmierer ausmacht. Ich habe in meinem professionellen Leben schon einige gute, wenige sehr gute, viele schlechte und ein paar richtig schlechte Programmierer kennen gelernt. Aber großartige?

Wie wird man ein großartiger Programmierer? Ein Indiz sollte wohl sein, dass man großartige Software entwickelt (also richtige, wartbare und erweiterbare Software, vielleicht sogar schöne). Aber ich glaube, da steckt noch mehr dahinter: Es dürfte etwas mit der Art des Denkens zu tun haben - wie ein großartiger Programmierer denkt - auf diese Spur hat mich Paul Grahams Artikel über LISP gebracht. Ich vermute ein großartiger Programmierer denkt nicht in den Kategorien seiner Language du Jour oder in abstrakten Architekturen, obwohl im beides bewußt ist, sondern auf mehreren Ebenen gleichzeitig - von High-Level Komponenten bis hinunter zur Speicherbehandlung im Prozessor Cache; in der Sprache in der die Lösung umgesetzt werden soll ebenso wie auf einer Ebene des tieferen Verständnisses von Rechnern.

Die Gretchenfrage ist natürlich, kann man ein großartiger Programmierer werden oder wird man als einer geboren? Prinzipiell gilt natürlich, es ist noch kein Meister vom Himmel gefallen, aber Talent spielt mit Sicherheit eine Rolle.

Wenn ich meinen eigenen Wertegang betrachte, dann wurde mir das Programmieren auch nicht gerade in die Wiege gelegt. Nach meinem ersten Studium war ich bestenfalls ein Programmierer im unteren Mittelfeld (wenn auch wenigstens mit "Ich weiss, dass ich nichts weiss"-Erkenntnis), trotzdem ist aus meinem letzten Projekt eine richtig gute Software geworden und das obwohl die Eckdaten zuerst nicht dafür gesprochen haben (unbekannte Programmiersprache, unbekannte IDE, neue Umgebung (technisch, wie vom Umfeld) und eine unbekannte Domäne).
Jetzt, da ich mein Masterstudium beende bin ich einen weiten Weg gegangen und würde mich durchaus als guten Programmierer bezeichnen, mit berechtigten Ambitionen zum sehr guten (bei aller Bescheidenheit ;-). Natürlich würde ich eher vom Software Engineer, als vom Programmierer sprechen, da dies meiner Meinung nach das Aufgabenspektrum des Informatikers in der Wirtschaft besser wiederspiegelt.
Auf meinem Weg haben mich 3 Persönlichkeiten an meiner Hochschule nachhaltig geprägt und mir vermittelt, dass es in der Informatik ebenso um das theoretische Bild dessen was man tut geht (welches eine fundierte mathematische Grundlage hat), als auch um (programmier-)technische Details, als auch um die Sicht auf das Design und die Architektur, dessen das man zu erschaffen strebt.

Erlauben mir diese Erkenntnisse, ein großartiger Programmierer zu werden? (Ist es nicht schön, ein Studium zu machen, das einem noch Epiphanien ermöglicht... :-)

Ich weiss es nicht, aber es ist ein wahres Vergnügen, diesen Weg zu beschreiten.

Ach ja, kleine Notitz an mich selbst: LISP lernen. :)

Labels: ,

02 September 2008

Eine schöne verchromte Architektur

Google hat einen eigenen Webbrowser entwickelt -
von einer führenden Technologiefirma erwarte ich dabei auch ein schönes Stück Technik, was ich nicht erwartet hätte, war die sehr eindrucksvolle Art und Weise, wie Google die anspruchsvolle Materie einer Software Architektur als Comic präsentiert.

Eine sehr wirkungsvolle und ansprechende Art, Software Technologie einer breiten Öffentlichkeit verständlich zu machen: Google über Chrome

Labels: , ,

20 Februar 2008

Speichermodell

Im Programmierumfeld betrachten wir vier Speichersegmente:
  1. Code-Segement (auch Text-Segment genannt)
  2. Data-Segment
  3. Heap
  4. Stack
Im Code-Segment sind die ausführbaren (Programm-)Codezeilen gespeichert, übrigens auch der Startup-Code der vor der main ausgeführt und den Terminate-Code, der nach Beenden des eigentlichen Programms ausgeführt wird. Das Code-Segment ist während der Programmausführung read-only.
Im Data-Segement befinden sich die Daten, die über die gesammte Programmlaufzeit erhalten bleiben (globale und statische Variablen). Es besteht aus einem const-Bereich, und je einem Bereich für initialisierte und nicht-initialisierte Daten.
Das Heap-Segment ist gleichbedeutend mit dem freien Arbeitsspeicher, der zur Laufzeit allokiert werden kann.
Das Stack-Segment ist ein LIFO (Kellerspeicher) und nur durch push/pop , aber nicht wahlfrei zugreifbar. Auf dem Stack werden lokale Daten abgelegt, sowie Rücksprungadressen und Parameter von Funktionen.

Ablauf der Speicherzugriffe eines Programmes:
  1. nach compiling/binding -> load des Programmes (in den Prozessorspeicher)
  2. Loader legt Maschinenbefehle ins Code-Segment
  3. Instruktionszeiger zeigt auf den ersten auszuführenden Befehl im Code-Segment
  4. Programm im Code-Segment wird linear abgearbeitet.
  5. erfolgt ein Funktionsaufruf, wird in die entsprechende Stelle im Code-Segment gesprungen - der letzte Instruktionszeigerwert(Rücksprungadresse) wird auf dem Stack gelegt und die Einsprungadresse in den Instruktionszeiger geladen.
  6. beim Verlassen der Funktion wird die alte Adresse vom Stack geholt und das Programm bei der nächsten folgenden Adresse fortgesetzt.
  • Über den Stack können auch Parameter an die Funktion übergeben oder Return-Werte an das Hauptprogramm zurück gegeben werden.
  • Variablenübergaben (bei C/C++) erfolgen durch Übergabe der Werte, indem die Werte auf den Stack geschrieben werden. Entweder durch Schreiben des Wertes (primitive Datentypen) oder Aufruf des Copy-Konstruktors (Objekte und Klassen) -> Call-by-Value
  • Möchte man Call-by-Reference einsetzen, muss man explizit Zeiger oder Referenzen übergeben.

Labels: ,

23 Mai 2007

Buzzword Olympiade

Gerade war an unserer sommerlich-schwitzenden Hochschule ein netter Vortrag über das Social Web. Dabei wurde in erfrischenderweise auf inflationäre Buzzwordnutzung verzichtet - außer vielleicht seitens des Publikums.

However, um diesen sinnlosen Post zu finalisieren, wenn Ihr noch ein paar schöne neue Buzzwords habt, die Ihr der digitalen Bewegung zukommen lassen wollt, schreibt sie einfach ins Bolsche-Wiki oder schreibt sie auf Charmin-Toilettenpapier und spült sie runter, demnächst gibts bestimmt einen Webservice, der die auswertet und online stellt, außer die Blase blatzt zuvor.

Hiermit erkläre ich die Schreibblogade für beendet, vielleicht steckts Schommi Crane ja an.

Labels: , ,

09 Mai 2007

ein Post in eigener Sache

als kleine Anmerkung an meine geneigten Leser: Ich habe einige technische Schwierigkeiten am lebenden Blog beseitigt, will heißen:

  1. Die Archivlinks funktionieren wieder
  2. Die Stylesheets und Grafiken sollten nun durchgehend vorhanden sein

Technorati Profile

Labels:

26 April 2007

Ist mir doch ein munteres Reh vor den Computer gelaufen...

...Feisty Fawn has landed.
Es begab sich, dass mal wieder eine Neuinstallation des Systems anstand. Da Gerade das krachneue Ubuntu 7-04 veröffentlicht wurde, natürlich mit Feisty Fawn.

Erwartungsgemäß muss ich sagen: Schönst.

Nach der Installation wieder das alte Bild: Ein Bild, gleich auf beiden Monitoren. Aber meine xorg.conf (siehe unten) hat genau so wieder funktioniert ebenso das DVD Lib Script (dito).

Die Installation der ATI funktionierte diesmal automatisch, ergo funktioniert auch die 3D Beschleunigung ohne Probleme.


Labels: ,

13 April 2007

Ubuntu und die Digitale Versatile Scheibe


Ja, ja. Das leidige Thema "Kopierschutz". Obwohl im Falle des CSS von DVDs wohl kaum von einem wirksamen Kopierschutz sprechen kann, werden viele Linux Distributionen ohne die zum Anschauen von DVDs notwendige Bibliothek ausgeliefert.

Nun ärgere ich mich ja schon, dass mitlerweile auf jeder gekauften DVD ein dämlicher "Raubkopierer sind Verbrecher" Spot kommt (Hallo! Ich habe die Dinger gekauft, erzählt das bitte den Raubkopierern!!). Ich möchte meine DVDs dann aber wenigstens unter Linux ansehen.

Ich folge hier der rechtlichen Einschätzung aus der Wikipedia:
"In Deutschland und weiteren Ländern ist es verboten, Programme zu schreiben oder zu vertreiben, die Kopierschutzmaßnahmen umgehen. Würde ein deutsches Gericht CSS in letzter Instanz für eine „wirksame technische Maßnahme“ erklären (§ 95a Urheberrechtsgesetz, in der durch Artikel 1 des Gesetzes vom 10. September 2003 geänderten Fassung[1]), so wäre die Benutzung dieser Bibliothek in Deutschland nicht gestattet. So ein Gerichtsurteil gibt es zur Zeit nicht.

Es gibt auch die Darstellung, nach der CSS lediglich einen Abspielschutz darstellt: Die DVD kann zwar kopiert werden, allerdings ist das Anschauen ohne Entschlüsselungsprogramm nicht möglich. Es ist unklar, ob Gerichte dieser Auffassung folgen würden (wobei – im Gegensatz zur Benutzung von DeCSS – die Anwendung der libdvdcss noch nicht Thema vor Gericht war).

Schlussendlich ist dies auf den Hinblick auf § 95a Urheberrechtsgesetz vermutlich irrelevant, da CSS als Schutz gegen unlizenziertes Abspielen eine technisch wirksame Einschränkung der Nutzungsrechte darstellt und somit potentiell den entsprechenden legalen Einschränkungen unterliegt.

Die Benutzung der libdvdcss würde in diesem Fall auch nach § 108b Urheberrechtsgesetz strafbar sein, soweit sie nicht „ausschließlich zum eigenen privaten Gebrauch des Täters oder mit dem Täter persönlich verbundener Personen erfolgt“. Im Falle des Privatgebrauchs kommen lediglich zivilrechtliche Ansprüche der Rechteinhaber in Betracht."

Hilfreiche User im Ubuntuforum haben dann glücklicherweise auch eine schmerzlose Anleitung zum nachinstallieren unter Edgy gepostet - einfach das bereits vorhandene Script mit:

sudo /usr/share/doc/libdvdread3/install-css.sh

auf der Konsole (Terminal) ausführen und DVDs gucken. C'est tout.
-hille crane ;-)

Labels: ,

02 April 2007

Ubuntu rockt (jetzt auch auf zwei Bildschirmen)

Nach längerem Überlegen und mit dem Gedanken schwanger gehen, bin ich nun mit meinem Arbeitsrechner zu Linux migriert. Um genauer zu sein: Zu Ubunut (06.10 Edgy Eft). Und zwei Dinge kann ich gleich schonmal sagen:
1) Das ist die verdammt benutzerfreundlichste Distribution, die ich je installiert habe
2) Normale Menschen dürften trotzdem noch immer ihre Probleme damit haben, alles zu konfigurieren. (Aber wenns mal läuft, warum nicht?)


Mein Hauptproblem bestand darin, den Desktop auf zwei Monitore auszudehnen.
Mein Setup: Dell Optiplex 745, 2 Gig RAM, ATI X1300 pro mit dual DVI über Kabelpeitsche, Zwei Dell 19" TFT.
Alles probieren hat nix geholfen, ich bekam immer nur einen geklonten Bildschirm.
Wie ihr auf meinem Screenshot seht, hats dann aber doch geklappt (für den Screenshot Tip ein Dank an Günther).

Im Endeffekt blieb mir nichts anderes übrig, als die xorg.conf zu editieren (/etc/X11/xorg.conf) und zwar folgendermaßen:



# /etc/X11/xorg.conf (xorg X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the /etc/X11/xorg.conf manual page.
# (Type "man /etc/X11/xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
# sudo dpkg-reconfigure -phigh xserver-xorg

Section "ServerLayout"
Identifier "Default Layout"
#Screen 0 "aticonfig-Screen[0]" 0 0
#Screen 1 "aticonfig-Screen[1]" 0 0
Screen 0 "aticonfig-Screen[0]"
Screen 1 "aticonfig-Screen[1]" RightOf "aticonfig-Screen[0]"
InputDevice "Generic Keyboard"
InputDevice "Configured Mouse"
InputDevice "stylus" "SendCoreEvents"
InputDevice "cursor" "SendCoreEvents"
InputDevice "eraser" "SendCoreEvents"
EndSection


Section "Files"

# path to defoma fonts
FontPath "/usr/share/X11/fonts/misc"
FontPath "/usr/share/X11/fonts/cyrillic"
FontPath "/usr/share/X11/fonts/100dpi/:unscaled"
FontPath "/usr/share/X11/fonts/75dpi/:unscaled"
FontPath "/usr/share/X11/fonts/Type1"
FontPath "/usr/share/X11/fonts/100dpi"
FontPath "/usr/share/X11/fonts/75dpi"
FontPath "/usr/share/fonts/X11/misc"
FontPath "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"
Load "i2c"
Load "bitmap"
Load "ddc"
Load "dri"
Load "extmod"
Load "freetype"
Load "glx"
Load "int10"
Load "type1"
Load "vbe"
EndSection

Section "ServerFlags"
Option "Xinerama" "true"
EndSection

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "de"
Option "XkbOptions" "lv3:ralt_switch"
EndSection

Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ExplorerPS/2"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "true"
EndSection

Section "InputDevice"

# /dev/input/event
# for USB
Identifier "stylus"
Driver "wacom"
Option "Device" "/dev/wacom" # Change to
Option "Type" "stylus"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection

Section "InputDevice"

# /dev/input/event
# for USB
Identifier "eraser"
Driver "wacom"
Option "Device" "/dev/wacom" # Change to
Option "Type" "eraser"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection

Section "InputDevice"

# /dev/input/event
# for USB
Identifier "cursor"
Driver "wacom"
Option "Device" "/dev/wacom" # Change to
Option "Type" "cursor"
Option "ForceDevice" "ISDV4" # Tablet PC ONLY
EndSection

#Section "Monitor"
# Identifier "DELL 1907FPV"
# Option "DPMS"
#EndSection

Section "Monitor"
Identifier "aticonfig-Monitor[0]"
Option "VendorName" "ATI Proprietary Driver"
Option "ModelName" "Generic Autodetecting Monitor"
Option "DPMS" "true"
EndSection

Section "Monitor"
Identifier "aticonfig-Monitor[1]"
Option "VendorName" "ATI Proprietary Driver"
Option "ModelName" "Generic Autodetecting Monitor"
Option "DPMS" "true"
EndSection

Section "Device"
Identifier "aticonfig-Device[0]"
Driver "fglrx"
BusID "PCI:1:0:0"
Option "CRT2Position" "LeftOf"
EndSection

Section "Device"
Identifier "aticonfig-Device[1]"
Driver "fglrx"
BusID "PCI:1:0:0"
## here the needed values for 'Dual' are starting:
Option "AGPMode" "4"
Option "AGPFastWrite" "true"
Option "BusType" "PCIE"
Option "MonitorLayout" "LVDS, CRT"
Option "MergedFB" "true"
#Option "CRT2HSync" "31.0-80.0"
#Option "CRT2VRefresh" "60.0-76.0"
Option "CRT2Position" "RightOf"
#Option "MetaModes" "1920x1200-1600x1200"
Option "PanelOff" "false"
Option "DynamicClocks" "true"
Option "DesktopSetup" "horizontal"
## Change this to "false" if there are any problems:
Option "EnablePageFlip" "true"
Screen 1
EndSection

Section "Screen"
Identifier "aticonfig-Screen[0]"
Device "aticonfig-Device[0]"
Monitor "aticonfig-Monitor[0]"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1280x1024" "1152x864" "1024x768" "800x600" "720x400" "640x480"
EndSubSection
EndSection

Section "Screen"
Identifier "aticonfig-Screen[1]"
Device "aticonfig-Device[1]"
Monitor "aticonfig-Monitor[1]"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1280x1024" "1152x864" "1024x768" "800x600" "720x400" "640x480"
EndSubSection
EndSection

Section "DRI"
Mode 0666
EndSection

Labels: , ,

25 Januar 2007

Velocity if-else ohne Whitespace

Letztes Jahr hatte ich das Problem, dass ich in einem Template mit Velocity Tags nach dem else Block einer if-else Schleife immer Whitespace hatte:

#if ( $firstString == "Nummer 1")Das ist Nummer 1. #else Das ist nicht Nummer 1.


Das kam daher, dass Velocity den Whitespace nach dem else erhielt. Das dumme war nur, das damit meine Überschrift im fertigen Text mit " " begann.
Lesen in der Doku und Googeln haben nichts gebracht, schließlich kam mir dann die zündende Idee: Velocity-Comments! Sie trennen die Ausdrücke und werden vom Parser entfernt. Die Lösung ist also:

#if ( $firstString == "Nummer 1")Das ist Nummer 1. #else#**#Das ist nicht Nummer 1.


Vielleicht nutzt jemanden. :)

Labels: ,