SucheBlog abonnierenVerwaltung des BlogsKategorienKontaktMarkus Brückner |
Freitag, 11. Dezember 2009Jabber-Probleme hinter DSL-RouterInteressante Erfahrung gerade: seit einem Neustart meines Jabber-Servers funktioniert der Kontakt dorthin nicht mehr aus meinem privaten Netz. Ein wenig Sucherei später stellt sich heraus, dass mein DSL-Router (bzw. der darauf laufende DNSMasq) DNS-Queries vom Typ SRV sperrt. Dazu muss man wissen, dass Jabberclients aus dem Domainpart der Jabber-ID mittels eines DNS-Queries ermitteln, auf welchem Server man sich einloggen muss. Sie fragen einfach nach _xmpp-client._tcp.domain.part mit RR-Type SRV und verbinden sich zu dem in der Antwort stehendem Server. Klappt das nicht lösen sie den Domainpart normal auf und verbinden sich dort hin. Nun hatte ich bisher nach einigen Umbauarbeiten immer noch eine Umleitung laufen, die ich aber im Zuge eines Systemupdates mal entfernt habe. Damit klappt das nicht mehr, dass man sich einfach auf die IP aus dem A-Record des Domainparts verbinden kann und den Jabberserver erreicht. In der Welt draußen kein Problem, gibt es doch einen passenden SRV-Record, der verrät, wie's geht. Dummerweise war mein DNSMasq hier mit der Option filterwin2k konfiguriert, was ihn dazu veranlasst (unter anderem) SRV-Records wegzufiltern. Nimmt man die raus funktioniert alles. Wieder was gelernt... Mittwoch, 18. November 2009Drei Stunden war der Laptop krank... (und außerdem russische Propaganda)... jetzt läuft er wieder, Gott sei Dank! Frei nach Wilhelm Busch mach ich grad drei Kreuze. Glücklicherweise habe ich mir mal irgendwann ein Thinkpad gegönnt. Ebenso glücklicherweise war bei IBM jemand mal der Meinung, dass man in eine Tastatur Ablaufkanäle einbauen müsse, falls mal Flüssigkeiten in die Tastatur kommen. Tja... ich bin heute offenbar nicht sooo geschickt und hab es geschafft, ein Glas Cola über meiner Tastatur zu entleeren. Während der größte Teil durch die dafür vorgesehenen Kanäle abgelaufen ist, musste ein relativ kleiner Teil gewaltsam aus dem größtenteils zerlegten Gerät entfernt werden. Nach einer gründlichen Dusche für die Tastatur (die funktioniert plötzlich wieder einwandfrei ohne zu knirschen und so...) scheint soweit wieder alles in Ordnung. Hoffen wir mal das beste... And now for something completely different: Panzerkreuzer Potemkin, ein Meisterwerk russische Propaganda. Gab's heute im Hochschulkino. Und weil das ganze ja ein Stummfilm ist und man heute audio-visuelle Berieselung gewohnt ist, haben sich die Jungs und Mädels vom HFC mit dem Kammerorchester der TU Ilmenau und der Jazzband nuzz zusammengetan und das ganze mit klassischer Musik unterlegt. Sehr interessante Erfahrung. Ich bin ja sonst nicht so für die Klassik, aber so ein komplettes Orchester hat schon was... Sonntag, 15. November 2009(K)Ubuntu in eine schon existierende LVM-Struktur installierenIch wollte aus verschiedenen Gründen meiner Linux-Installation mal einen kompletten Neustart gönnen und Kubuntu Karmic Koala frisch aufsetzen. Dabei wollte ich allerdings vorzugsweise darauf verzichten mein aktuell 83 GB schweres Home-Directory komplett aus dem Backup wieder einspielen zu müssen. Gedacht, ... fast getan. Backup wurde natürlich vorher gemacht (ich bin ja nicht wahnsinnig. Jedenfalls nicht wesentlich mehr, als üblich. Außerdem hatte jemand in der näheren Umgebung letztens erst den Fall, dass sämtliche Daten zwar noch da, aber dank Festplattenverschlüsselung mit kaputtem Keystore nicht mehr zugreifbar waren. Das wollte ich mir natürlich ersparen. Erstmal dazu, wie meine Platte grob aussieht:
/dev/sda
|
+---sda1 (/boot)
+---sda2 (dm-crypt-Volume)
|
+---ec_root (/)
+---ec_swap (swap)
+---ec_home (/home)
Soweit, so unpraktisch. Speziell /home sollte unbedingt erhalten bleiben. Erster Anlauf: ganz naiv den Installer gestartet und geschaut, was er so erkennt. Klappt natürlich nicht. Der sieht sda2 und interessiert sich kein bischen für die Innereien. Ok, zweiter Anlauf: Situation herstellen, die dem Installer erlaubt die Innereien zu erkennen: cryptsetup luksOpen /dev/sda2 sda2_crypt lvm vgchange -a y Das erste öffnet das verschlüsselte Volume, das zweite aktiviert die darin enthaltene Volume Group und alle logischen Volumes innerhalb dieser. Das ganze macht man am besten in einer zweiten Konsole, während der Installer gerade auf Nutzereingaben wartet (bspw. wenn er sich grad aufregt, dass er kein Netz findet). Danach kann man die Installation gemütlich weiterlaufen lassen und der Installer wird beruhigt die Volumes erkennen, so dass man in der manuellen Partitionierung (alles andere wäre Unsinn) alles entsprechend wieder zuweisen kann, wie es sein soll. Mir ist hier noch ne Kleinigkeit unangenehm aufgefallen: sda2 wird aus irgendeinem Grund als Swap eingestuft. Aus Sicherheitsgründen habe ich das komplett rausgenommen (also auch nicht als Crypto-Volume definiert), was zur Folge hatte, dass hinterher etwas Handarbeit angesagt war. Wenn die Installation durchgelaufen ist (auch das kann ein Problem sein, wenn das CD-Laufwerk auf einmal I/O-Error wie Kekse verteilt...), dann muss man noch einige kleinere Anpassungen machen um das System bootfähig zu machen. Was ist das Problem? Dadurch, dass das Crypto-Volume von Hand geöffnet wurde und der Installer so nichts davon weiß, fehlt der entsprechende Eintrag in der /etc/crypttab des frisch installierten Systems. Das wiederum führt dazu, dass das initrd nichts über die Verschlüsselung weiß und nicht nach dem Passwort fragt, was wiederum den Bootprozess einfach stillstehen lässt. Blöd. Eine Lösung muss her... Im Prinzip isses einfach: man macht das System von Hand bootfähig. Man mountet noch im laufenden Installersystem /dev und /proc mittels -o bind nach /target/dev und /target/proc (/target ist der Punkt, wo der Installer die Platte einhängt. Wenn nicht: einfach selbst machen), wechselt mittels chroot /target ins installierte System, passt die /etc/crypttab entsprechend an (sprich: man trägt in meinem Fall /dev/sda2 passend ein. Eventuell muss man die /etc/fstab auch noch anfassen, wenn man schonmal da ist.), ruft update-grub und update-initramfs auf, wechselt wieder raus, macht alle Mounts rückgängig und rebootet. Wenn man großes Glück hat, geht's danach. Wenn nicht, dann ist Fehlersuche angesagt. Für diese Sucherei hab ich heute dann doch etwas gebraucht. Vor allem immer unter der Prämisse: bloß nüscht kaputtmachen, sonst musst du das doofe Backup zurückspielen. Mittlerweile läuft alles, nur eine Warnung beim Systemstart bzgl. des Einbindens von /home irritiert mich noch. Hat zwar keine Auswirkungen, aber das will ich auch noch rauskriegen. Später... Donnerstag, 15. Oktober 2009State-Machine-Bibliothek für JavaLetzte Woche waren meine Holde und ich ja im Urlaub und wie das so ist kommt man da ja meist zu den Sachen, für die man sonst nie Zeit hat. Da ich schon seit längerer Zeit mal TDD ausprobieren wollte, war die Zeit also günstig. Herausgekommen ist ein kleines Spielzeug namens StateMachine (kreativere Namensvorschläge werden in den Kommentaren gern entgegengenommen): eine kleine Bibliothek für State Machines in Java. Brauch ich demnächst wahrscheinlich sowieso für verschiedene Dinge, so dass die Zeit nicht vergeudet war. Fazit der testgetriebenen Entwicklung? Anfangs etwas gewöhnungsbedürftig, weil man den klassischen Entwicklungsprozess (Entwickeln-Testen) quasi rumdreht. Für so Sachen wie die Entwicklung von Bibliotheken ist das allerdings ganz interessant, weil man relativ früh merkt, wenn die Schnittstellen murksig zu benutzen sind. Durch das "auf den grünen Test" hin programmieren hat man auch klar abgesteckte Aufgaben für jeden Entwicklungsschritt. Ich werd das also bei der Library (und auch sonst wo sich's lohnt) durchaus weiter ausprobieren. Ach ja: bitbucket.org ist richtig angenehm zu benutzen. So angenehm, dass ich zu faul war, den Kram selbst aufzusetzen. Mercurial ist eh geil. Sag ich ja meiner Frau immer, aber die hört ja nicht... Sonntag, 16. August 2009PostgreSQL weigert sich zu startenKleine Nettigkeit über die ich gerade gestolpert bin. Mein PostgreSQL 8.3 weigert sich zu starten. Er meldet: 2009-08-16 16:12:55 UTC WARNING: could not create listen socket for "localhost" 2009-08-16 16:12:55 UTC FATAL: could not create any TCP/IP sockets Die erste Zeile hat mich dann richtig raten lassen: wenn man mittels debootstrap ein Debian aufgesetzt hat, dann fehlt üblicherweise die /etc/hosts. Deswegen kann er localhost nicht auflösen und weigert sich, zu starten. Ergo: echo "127.0.0.1 localhost" >> /etc/hosts und schon sollte er wollen. Bei der Gelegenheit kann man auch gleich noch die IP des Servers auf den internen Namen mappen (bspw. echo "1.2.3.4 servername" >> /etc/hosts. Wenn man eh schonmal dran ist... Donnerstag, 13. August 2009Sound in Java unter Linux (speziell: JOSM)Man kann ja mittels OSMTracker während des Trackens Audioaufzeichnungen anfertigen um sich gewisse Sachen zu markieren (sehr praktisch zum Beispiel bei der Erfassung von Hausnummern). In JOSM geöffnet werden die Aufzeichnungen als kleine Icons in der Karte angezeigt und können via Klick abgespielt werden. JOSM ist ja ein Java-Programm und will als solches in einer JVM laufen. Nun habe ich standardmäßig Suns JVM installiert (unter Kubuntu: sun-java6-jre). Die hat aus irgendwelchen Gründen Probleme mit der Audioausgabe (Meldung: "Audio device unavailable"). Längeres suchen und probieren brachte mich darauf, die OpenSource-Variante der VM zu installieren (wieder unter Kubuntu: openjdk-6-jre). Die kann Audio. Theoretisch. Praktisch besteht das Problem, dass sie den PulseAudio-Server mit installiert und damit die Audioausgabe endgültig kaputtspielt. Keine Ahnung, was genau das Problem ist. Der Effekt ist folgender: sobald die JVM (oder das Flash-Plugin im Browser. Die scheinen die gleiche Infrastruktur zu nutzen) eine Audio-Ausgabe machen will, startet im Hintergrund der PulseAudio-Server. Danach geht gar kein Sound mehr. Liest man ein wenig im Netz rum, dann hat dieses Programm den Ruf nur Probleme zu verursachen. Die übliche Empfehlung: deinstallieren. Hab ich gemacht. Hilft. Plötzlich geht sowohl in der JVM, als auch im Flash der Sound völlig problemlos. Wenn ich jetzt noch ne Ahnung hätte, wozu das Audioverhinderungsprogramm PulseAudio genau da ist... Sonntag, 9. August 2009Zugriff auf die Dateien eines Windows Mobile Gerätes unter KubuntuMit vereinten Kräften gerade rausgefunden: um auf die Dateien eines Windows-Mobile-Gerätes von Ubuntu (in dem Fall Karmic, sollte aber auch mit Jaunty gehen) aus zugreifen zu können ist das Paket synce-kio-rapip-kde4 notwendig. Dieses enthält den notwendigen KIO-Slave, der einem erlaubt auf das WM6-Gerät zuzugreifen. Dummerweise ist dieses Paket nicht in den Standardquellen vorhanden (weder bei Jaunty, noch beim kommenden Karmic). Man kann sich behelfen, indem man folgendes in der /etc/apt/sources.list nachträgt: deb http://ppa.launchpad.net/synce/ubuntu jaunty main Danach kann man das Paket installieren und durch die Eingabe von rapip:/ in die Adresszeile des Dolphin auf die Dateien des WM6-Gerätes zugreifen. Ja, auch unter Karmic muss man jaunty in der Zeile stehen haben. Für Karmic gibt es (noch?) kein eigenes Repository. Macht aber nix: die Version von Jaunty lässt sich problemlos installieren (zumindest im Moment. Jetzt bloss kein Update!). So, jetzt aufgezeichnete GPS-Tracks von heute ziehen und wieder ein wenig was an OSM tun. Serendipity Shared Installation und mod_vhostUff, da hab ich mal wieder länger ringen müssen. Aus ominösen Gründen wollte ich mal wieder eine Instanz meiner bevorzugten Blogsoftware aufsetzen. Weil sich aber die Platte des Servers mittlerweile ganz gut mit Instanzen füllt, sollte diesmal eine Shared-Installation her, bei der sich früher oder später mal alle Instanzen eine Code-Basis teilen (weniger mangels Platz, sondern wegen des Pflegeaufwandes). Soweit der Plan... Nun gibt es dafür eine Anleitung, über der dick und fett steht: "WARNING: THIS FEATURE IS EXPERIMENTAL!". Experimentell ist es in der Tat, vor allem wenn die Anleitung und meine Vorstellung davon, was gewisse Dinge bedeuten, aufeinander treffen. Wenn man dann noch zusätzlich mod_vhost mit in den Ring schmeißt, dann ist das Chaos fast perfekt. Aber von vorn. Ziel der Aktion war folgendes: eine Subdomain blogs.example.com unter der man einfach und ohne Probleme neue Blogs anlegen kann. Dazu sollte nur eine Serendipity-Installation verwendet werden (kein Bock da mehrere zu pflegen). Gut, der Anfang ist einfach: mod_vhost ist schon aktiv, einen neuen VirtualHost im Apachen anlegen (ServerName blogs.example.com, ServerAlias *.blogs.example.com) und im DNS *.blogs.example.com auf die IP des VirtualHost zeigen lassen. In dem VirtualHost Ersetzt man nun noch DocumentRoot durch folgende Zeilen (vorausgesetzt die Bloginstallation liegt am Ende mal unter /home/blogs.example.com/: UseCanonicalName Off VirtualDocumentRoot /home/blogs.example.com/subdomains/%1 Nun kann man ganz einfach durch Anlegen eines neuen Verzeichnisses in /home/blogs.example.com/subdomains eine neue Subdomain anlegen. (Beispiel: test.blogs.example.com wird mit der Konfiguration auf /home/blogs.example.com/subdomains/test abgebildet). Ausprobieren, ob das Konstrukt funktioniert und dann weitermachen. Nächster Schritt: die Installation von Serendipity. Man lädt das normale Package runter (die LITE-Installation bringt die Dateien nicht mit, die man für die Shared-Installation-Geschichte braucht) und entpackt es nach /home/blogs.example.com/s9y. WICHTIG: der Pfad MUSS als letzten Teil s9y haben. Entpackt man die Dateien standardgemäß, dann landen sie in einem neuen Verzeichnis namens serendipity. Dessen Inhalt muss man nach s9y verschieben. Der Pfad ist im Code hart verdrahtet. Wenn man das Verzeichnis anders benennt, dann darf man sich auf unerklärliche Internal Server Errors freuen. Zuguterletzt muss man dem Apache noch sagen, wo er sich seine PHP-Dateien zusammensuchen soll. Tut man das nicht, dann findet der Deployment-Code (siehe unten) die Dateien der Shared Installation nicht. Dazu trägt man in den VirtualHost noch folgende Zeile ein (ob /usr/share/php und /usr/share/pear hier wirklich notwendig sind, weiß ich nicht. Eigentlich stehen die bei Debian im "Master Value" für include_path. Vielleicht weiß da jemand ja mehr...): php_value include_path ".:/usr/share/php:/usr/share/pear:/home/blogs.example.com:/home/blogs.example.com/s9y:/home/blogs.example.com/s9y/bundled-libs" Außerdem hilft es, wenn man dem Apache noch erlaubt die .htaccess-Dateien, die Serendipity so mitbringt auch zu interpretieren. Dazu muss man in den Block <Directory /home/blogs.example.com/subdomains>...<Directory> in der Apache-Config bei AllowOverride All eintragen. Damit darf die .htaccess innerhalb der Subdomain-Verzeichnisse alle möglichen Änderungen vornehmen. Wer das einschränken will muss rausfinden, was genau benötigt wird und das dann dort entsprechend angeben. Nun kann man mit folgendem Skript recht einfach eine neue Bloginstanz anlegen:
#! /bin/sh
BASE_DIR=/home/blogs.example.com
if [ x$1 == x ]; then
echo "Please supply a subdomain-name for the blog.";
exit 1;
fi
mkdir /home/$BASE_DIR/subdomains/$1
$(
cd /home/$BASE_DIR/subdomains/$1
cp -r ../../s9y/deployment/* .
ln -s ../../s9y/templates .
ln -s ../../s9y/htmlarea .
)
chown -R www-data.www-data /home/$BASE_DIR/subdomains/$1
su - postgres -c "createdb $1blogsexamplecom"
su - postgres -c "createuser -S -D -R -P -E $1blogsexamplecom"
Das Skript tut eigentlich nicht viel: es legt ein passendes Verzeichnis an um die Subdomain zu aktivieren, kopiert die Deployment-Dateien von Serendipity (ein paar kleine PHP-Dateien, die am Ende mal dafür sorgen, dass aus der Shared-Installation die gemeinsamen Dateien angesprungen werden), verlinkt templates und WYSIWYG-Editor passend und überträgt die Rechte an den Webserver-User. Die letzten beiden Zeilen legen noch die Datenbank und den passenden User zum neuen Blog an (Passwort wird erfragt). Das ist natürlich nur für die bei mir verwendete PostgreSQL gültig. Wer was anderes verwendet muss hier entsprechend anpassen. Tja, wenn das alles fehlerfrei durchgelaufen ist, dann kann man eigentlich schon die Domain http://<name>.blogs.example.com besuchen. Dort wird man vom Installationsskript von Serendipity begrüßt, welches den eben angelegten DB-Nutzer wissen will und dann seine Arbeit erledigt. Für das (doch eigentlich recht einfache) Vorgehen hab ich jetzt doch 2 Stunden gebraucht um's auszutüfteln.. P.S: Das in der Originalanleitung erwähnte open_basedir muss man leider weglassen, weil es nicht zusammen mit mod_vhost spielen mag. Speziell der Subdomain-spezifische Teil des Pfades würde hier Probleme machen. Samstag, 20. Juni 2009Update von etch auf lennyFürchterlich! Irgendwann kommt man mal auf die glorreiche Idee, seinen Server auf Debian Lenny bringen zu wollen. Warum auch nicht? Ist ja mittlerweile schon ein Stück stable und außerdem und überhaupt. Also gestern fix angekündigt und heute morgen begonnen. Paketquellen geändert, apt-get dist-upgrade angeworfen und los. Joar, alles kein Problem, wenn da nicht so ein kleines Problem wäre: seit einiger Zeit kann ich OpenVPN auf dem Server nicht mehr beenden. Das bleibt dann mit der (sich alle 10 Sekunden wiederholenden) Meldung: kernel: unregister_netdevice: waiting for tap1 to become free. Usage count = 1. Tja... das OpenSSL-Update wollte dann OpenVPN neu starten... Plöt. Mitten im Update bleibt das ganze also mal gepflegt hängen. Intelligenterweise kann man sich nachdem das begonnen hat nicht mehr einloggen. Ich hatte also nichtmal mehr ne Konsole um die Kiste hart neu zu starten und zu hoffen. *gnaaa* Ok, Hetzner anrufen, Rettungssystem etc.pp. Blöd zum Zweiten: der im chroot auf dem halbfertigen System weitergeführte Update-Prozess war dann irgendwie der Meinung Mailserver etc. neu zu starten, was dazu führte, dass plötzlich der Secondary MX mit der Einlieferung begann. Ich hätte nicht erwartet, dass das ein Problem darstellen würde. Irgendwie war dem aber offensichtlich so, jedenfalls verabschiedete sich das System bei der Konfiguration des Bootloaders (Hurra! Wenn es einen dämlichen Moment gibt, dann diesen!) Also nochmal Hetzner angerufen (der arme Kerl, der da heute Dienst hatte...), Rettungssystem zum zweiten, Bootloader konfiguriert und installiert, neu gestartet und bibbernd davor gesessen. Zu meiner Überraschung hatte das dann aber geklappt. Die üblichen Verdächtigen (ein paar Django-Programme) wollten mal wieder nicht mehr starten und PostgreSQL wollte gern ein pg_updatecluster haben, damit es wieder lieb mit mir ist, aber sonst war alles locker. So, jetzt aber erstmal wieder 5 Jahre Ruhe... *grmpf* Freitag, 5. Juni 2009Presenter ScreenGeilste OpenOffice.org-Erweiterung ever: Presenter Screen. Aus ominösen Gründen bin ich heute auf ein wenig Hirnunterstützung in Form von Notizen angewiesen und bin dabei über dieses Teil gestolpert. Nach dem Starten einer Präsentation im Impress präsentiert sich der Bildschirm zum Vortragenden (zwei Bildschirme natürlich vorausgesetzt) recht aufgeräumt: ![]() Presenter Screen auf dem Bildschirm des Vortragenden Alles da, was man braucht: Uhr, Folienübersicht, Notizen, nächste Folie etc.pp. Hoffentlich wird diese Extension mal standardmäßig in OpenOffice.org mit eingebaut. BTW: Unter Ubuntu ist Presenter Screen als openoffice.org-presenter-console verfügbar. Aber wahrscheinlich weiß das außer mit eh schon wieder jeder. Donnerstag, 30. April 2009Kaputte Tages-/Wochenansicht im KOrganizer KalenderSo ein paar Geburtswehwechen hat mein frisch installiertes Kubuntu 9.04 dann doch. Nachdem ich etwas länger aus Google Earth einklopfen musste und auch ein Bug im Handling von USB-Sticks schon behoben werden wollte (wenn man einen, der in Benutzung ist, über den Device Notifier auswerfen will, dann friert der ein. Patch ist im Upstream bereits drin.), war nun nur noch das Problem mit dem KOrganizer zu beheben. In der Tages-, Wochen- und Arbeitswochenansicht war nix zu sehen (vgl. passender Bug im Launchpad). Blöd, wenn man wie ich das Teil eigentlich recht exzessiv nutzt (ehrlich mal: ich würde meine Seminare vergessen ohne das Ding). Der Übeltäter ist folgender Eintrag in der ~/.kde/share/config/korganizerrc: [Views]
Der gibt die Trennung zwischen der Zeittafel und den zeitunabhängigen Events in den entsprechenden Ansichten an. Deswegen ist das auch in der Monatsansicht kein Problem: dort gibt es diesen Trenner nicht. Wenn man statt 0,0 sinnvolle Werte einsetzt (ich hab bspw. 800,600 eingesetzt und dann im GUI das wieder zurechtgezogen), dann ist alles wieder wie gewohnt. Eigentlich sollte das Problem laut Bugreport in 4.2.2 gefixt sein (was ich hier installiert habe). Ist es wohl aber für mich nicht. Mal kommentieren... Sonntag, 26. April 2009Google Earth Error Code 29Wenn's mal wieder länger dauert... Jetzt hab ich doch einige Zeit versucht auf meinem 64-Bit-Kubuntu 9.04 Google Earth ans Laufen zu kriegen. Blöderweise verabschiedet sich das Programm immer mit Error 29, wenn es startet und stellt dann nichts dar. Folgender Thread enthält die Lösung des Rätsels: Auf einem 64-Bit-System sind normalerweise nicht unbedingt alle Bibliotheken installiert, die GE so erwartet (es ist ja leider "nur" ein 32-Bit-Programm). In meinem Fall fehlte lib32nss-mdns. Nach einer Installation beschwert es sich wieder über das bekannte OpenSSL-Problem (die GE-eigene libcrypto im Programmverzeichnis ist der Übeltäter. Einfach löschen und schon geht's) und wenn man das auch noch behoben hat, dann läuft das ganze. Einfacher geht's zumindest unter Ubuntu mit aptitude install googleearth-package. Danach kann man sich mit make-googleearth-package ein Debian-Paket bauen, welches die nötigen Dinge tut, damit alles funktioniert. Donnerstag, 12. Februar 2009Eclipse ohne Code CompletionEclipse ist ja auch gerade wegen der Code Completion die Java-IDE. Blöd nur, wenn die nicht tut. Wenn weder nach Eingabe eines Punktes noch nach Strg+Space die erwartete Vervollständigung kommt, sondern stattdessen in der Statusleiste nur "No completions available" erscheint, dann hat man unter Umständen in den Projekteinstellungen oder in den generellen Einstellungen für den Java-Editor (unter Window->Preferences: Java->Editor->Content Assist->Advanced) die Vervollständigung verkonfiguriert. Im Zweifelsfall einfach in beiden Listen alle Einträge aktivieren (die obere Liste ist das, was im normalen Assitententenpopup hochploppt, die untere das, wo man mit Strg+Space durchschalten kann). Aus irgendeinem Grund war das bei mir verpfriemelt (ich hab ja das JBoss-Plugin in Verdacht, kann ihm aber nix nachweisen *grml*) und ich hatte daher keine Code-Completion mehr. Naja, wieder mal was gelernt und gestandene Eclipser zum Rätseln gebracht. Samstag, 31. Januar 2009Mein Google mag mich nicht mehrHm, mag mein Google mich nicht mehr, weil ich auf meine Privatsphäre achte und seine Cookies blockiere? Oder mag mein Google keine Dateisystemverschlüsselung? Fragen über Fragen... ![]() Mein Google ist kaputt... Dienstag, 18. November 2008Pylons und Elixir + Session-HandlingWer mal entspannt Webapplikationen entwickeln will/muss, dem sei Pylons ans Herz gelegt. Nettes Framework, noch einige kleinere Ecken, aber schonmal sehr angenehm zum Entwickeln geeignet. Meist liegt hinter einer Webapplikation ja ein entsprechendes Datenmodell in Form einer Datenbank. Um die bequem ansteuern zu können (SQL von Hand zu coden ist mittlerweile definitiv nicht mehr schön) bringt Pylons eine Integration für SQLAlchemy mit. Nun ist SQLAlchemy flexibel und mächtig, dafür aber manchmal etwas komplexer als nötig. Für viele Anwendungsfälle reichen die Möglichkeiten, die Elixir mitbringt (Elixir ist eine auf SQLAlchemy aufsetzende Bibliothek, die einen deklarativen Stil zur Erstellung des Datenmodells ermöglicht). Mit diesem Trio kann man schonmal recht viel Interessantes tun. Blöd nur, wenn man ein wenig faul bei der Einbindung der verschiedenen Module ist. Dann kann es nämlich dazu kommen, dass plötzlich folgende Fehlermeldung auftritt, wenn man versucht was in der Nutzersession im Pylons zu speichern: TypeError: 'ScopedSession' object is unsubscriptable Der Datentyp deutet es an: das session-Objekt von Pylons ist unter diesem Namen nicht verfügbar. Der Fehler ist simpel: im Datenmodell der Applikation stand mal from elixir import * (um Schreibarbeit bei den Elixir-Datentypen zu sparen). Im Controller wiederum wurde das Datenmodell mit from app.model import * importiert. Tja... Elixir definiert dummerweise ein eigenes session-Objekt, welches durch diese Import-Kette in den Namensraum der Applikation gerät und dort dann das eigentliche Pylons-Objekt überschreibt. Als Lösung bleiben drei Möglichkeiten: man kann den Import im Datenmodell in import elixir ändern und allen Datentypen ein elixir. voransetzen, die benötigten Elixirtypen mittels from elixir import Field, .... im Datenmodell importieren (und dabei keinesfalls session mit reinnehmen) oder in der Applikation das Datenmodell mittels import app.model as m und dann jedem Zugriff auf Elemente des Modells ein m. voranstellen. Danach hat man wieder wie gewünscht Zugriff auf seine Session und kann Daten darin speichern und daraus lesen.
(Seite 1 von 8, insgesamt 107 Einträge)
» nächste Seite
|