Feeds ohne SSL
Seit einer Weile weiß ich, dass einige Feedreader Probleme mit dem hier genutzten Zertifikat haben, wahrscheinlich mit SNI. Daher erzwingt der Server nun per .htaccess, dass die Feeds über http ausgeliefert werden. Das ist irgendwo unschön, und es dauerte ewig um das hinzukriegen, aber es ist immer noch besser als abgeklemmte Feedreader.
Der relevante Part in der .htaccess:
RewriteCond %{HTTPS} off RewriteCond %{QUERY_STRING} !^.*/feeds/.* RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} RewriteCond %{HTTPS} on RewriteCond %{QUERY_STRING} ^.*/feeds/.* RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}
Bashguard bei 52 Zähnen
Mein Fahrrad ist hier noch nicht groß aufgetaucht. Nach Jahren ohne wurde es Zeit, eines zu besitzen. In Siegen war es keine Option, keine Fahrradwege und zu viele Berge. Hier in Troyes aber ist es flach, und ein Fahrrad verdammt praktisch.
Es ist ein Rennrad geworden, das ich günstig bei boncoin.fr gefunden habe. Rennräder sind neu für mich, ich hatte bisher nur City- und Mountainbikes. Und es ist toll! Es macht einen großen Unterschied, ist viel einfacher zu treten als alles vorher.
Aber als Rennrad hat es so ein paar Eigenheiten, die mich störten. Kein Gepäckträger, damit komm ich zurecht. Ebenso wie der fehlenden Spritzschutz, im Regen macht das Rad sowieso keinen Spaß. Den fehlenden Fahrradständer konnte ich nachrüsten. Aber was als Problem blieb, war das Kettenblatt.
Bei Rennrädern ist typischerweise kein Kettenschutz angebaut. Für die Kette hinten ist das für mich auch kein Problem, aber die Zähne des Kettenblattes - oder eben die Kette, wenn im großen Gang - standen ebenfalls frei. Das ist gefährlich, will man nicht immer mit kurzen Hosen fahren oder vergisst einmal, das Hosenbein hochzubinden. Außerdem sind die Schmutzflecken durch die Kette an Schuhen und Hosen ärgerlich.
Aber einen Kettenschutz für ein Rennrad zu finden ist schwierig. Die gehen nur bis 48 Zähne. Das gleiche gilt für Kettenblattschutze (=Bashguards), zumindest in Deutschland. Bashguards sind Scheiben, die auf das Kettenblatt aufgeschraubt werden. Manchmal, gerade bei Mountainbikes, montieren Leute das Bashguard anstatt des größeren Kettenblattes, das wollte ich keinesfalls. Man findet aber fast nur Anleitungen, die das genau so machen.
Entsprechend kritisch war ich, ob ich das anders hinkriege.
Die einzige Lösung war Ebay. Dort gibt es den suberbycicle.shop, der von Taiwan aus Fahrradteile verschickt. Inklusive Bashguards, inklusive der nötigen Montageschrauben mit Abstandshaltern.
Die Montage ist dann einfach: Mit einem Imbusschlüssel die alten Schrauben lösen, die neuen samt Abstandshalter einsetzen, die Bashguard drauf und zuschrauben. Ich musste nichtmal die Kettenblätter abmontieren.
Funktionieren tut es auch. Obwohl das nur eine Scheibe ist, verbirgt sie die Zähne samt Kette effektiv genug, zumindest vor Hosenbeinen und Schuhen.
Caffier gegen Snowden
Wer wissen will, was für blöde, blinde, hirnverbrannte Arschlöcher in der CDU herumlaufen, der schaue sich diesen Zeit-Artikel an.
Beschissene Standardrhetorik, die falsch ist und unsere Freiheit gefährdet:
Ich finde: Man sollte sich im Internet nicht komplett entblößen, dann geht es einem auch besser. Das war aber, wie gesagt, schon vor Snowden klar.
Maßlose Selbstüberschätzung:
Sollte der Fall am Ende beim Kultusminister landen, weil man sich an der Rostocker Uni nicht über die Titelvergabe einigen kann – dann werde ich mich am Kabinettstisch zu Wort melden.
Blinde Autoritätshörigkeit:
Wir brauchen Geheimdienste, um innere und äußere Sicherheit zu gewährleisten
Blinde Amerikaverehrung:
Die USA, wie auch immer es letztlich um deren Geheimdienstkontrolle bestellt ist, sind die größte freiheitliche Demokratie.
Beschwörung des Feindbilds:
Ich sehe nur, dass er sich von Putin für dessen PR einspannen lässt.
Und dann noch die Aufahme der DDR-Rechtsstaatsdebatte (natürlich war die DDR ein Rechtsstaat, nur eben keiner guter), um den strammen deutschen Antikommunsten am Nazi-Stammtisch zu überzeugen; und eine seltsame Verehrung für Gauck, dessen Beitrag für "unser Land" sehr wohl strittig ist.
swrast_dri.so fehlt
Nach dem Upgrade von Ubuntu 12.04 auf 14.04 war direct rendering deaktiviert, was mir erst überhaupt nicht auffiel. Es ist aber ziemlich normal, denn das Upgrade war auch ein Wechsel von fglrx auf den radeon-Treiber, das gibt immer mal wieder Probleme. Diesmal wurde die swrast_dri.so nicht gefunden:
onli@Fallout:~$ glxinfo name of display: :0.0 libGL error: dlopen /usr/lib/dri/swrast_dri.so failed (/usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory) libGL error: unable to load driver: swrast_dri.so libGL error: failed to load driver: swras display: :0 screen: 0 direct rendering: No (If you want to find out why, try setting LIBGL_DEBUG=verbose
Lösung auf meinem 32-bit-System:
sudo ln -s /usr/lib/i386-linux-gnu/dri /usr/lib/dri
Ubuntu 14.04 auf F2FS
Warnung: F2FS ist recht neu im Kernel und noch nicht stabil. Es ist wahrscheinlich keine gute Idee, es für die Rootpartition zu nutzen. Man braucht ein Backup.
F2FS ist ein für NAND-Speicher entworfenes Dateisystem. Eine detaillierte Erklärung ist auf lwn.net. Auf mich wirkte es verlockend, es ist relativ simpel aufgebaut und doch ist klar, warum es für SSDs gut funktionieren sollte. Bisher ist es aber eher im Gespräch für Smartphones und USB-Sticks, auch wenn die initiale Ankündigung explizit SSDs erwähnt. Wahrscheinlich weil ausgewachsene SSDs mit normalen Dateisystemen gut umgehen können.
Unter Ubuntu 14.04 ist es im Kernel, aber nicht in den Installer integriert und es wird nicht beim Boot geladen. Das macht die Installation etwas schwierig. Die Hauptknackpunkte:
- Es braucht eine separate Bootpartition mit einem Dateisystem, mit dem Grub umgehen kann
- Die initramfs muss das F2FS-Modul integrieren
Mein Szenario ist so: Ich habe ein bestehendes Ubuntu-System auf einer alten Festplatte, /dev/sda mit ext4, frisch auf Ubuntu 14.04 aktualisiert, ohne separate Boot-Partition. Die neue SSD ist unter /dev/sdc (Vorsicht: Mit dem neuen Kernel sind diese Zuweisungen wirklich nicht mehr zuverlässig, die Platten springen. Man muss Labels und UUIDs nutzen). Mein Mainboard hat ein BIOS, kein UEFI.
Zuerst wird mit gparted die SSD formatiert.
Da ich als Partitionstabelle GPT ausgewählt habe, muss auf meinem BIOS-System eine 2MB-Partition ohne Dateisystem mit dem Flag bios_grub am Anfang stehen (ein UEFI-System bräuchte laut Wiki stattdessen eine 200MB große FAT32-Partition mit boot-flag, die später unter /boot/efi eingebunden werden müsste). Dann die boot-Partition mit einem beliebigen Linux-Dateisystem, hier ext2, Label boot. Und schließlich die Root-Partition mit f2fs und Label linuxssd; wie man auf dem Bild sieht, kann gparted damit später nicht mehr umgehen, man muss sich das merken und kann gparteds Arbeit hier nicht kontrollieren.
Nun das alte System auf die SSD kopieren:
sudo modprobe f2fs sudo mkdir /media/ssd sudo mount /dev/sdc3 /media/ssd sudo cp -a / /media/ssd
Das dauert.
Allerdings wird so auch /boot auf sdc3 kopiert, das wollen wir nicht. Also rückgängig und richtig machen:
sudo rm -R /media/ssd/boot/* sudo mount /dev/sdc2 /media/ssd/boot sudo cp -a /boot /media/ssd
Noch ist weder Grub installiert noch die fstab angepasst. Letzteres zuerst. Meine /media/sdd/etc/fstab sieht so aus:
# /etc/fstab: static file system information. # # Use 'blkid -o value -s UUID' to print the universally unique identifier # for a device; this may be used with UUID= as a more robust way to name # devices that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc nodev,noexec,nosuid 0 0 # Linux Root LABEL=linuxssd / f2fs noatime,discard 0 1 UUID=36a84be5-21aa-4f23-ba29-da62adbe4216 /boot ext2 defaults 0 0 # have /tmp in ram tmpfs /tmp tmpfs defaults,noatime 0 0 # have logs in ram tmpfs /var/log tmpfs defaults,noatime 0 0
Klar, die UUID für /boot muss angepasst werden, entweder per blkid
oder mit gparted auslesen. Edit: Stellt sich raus, dass das nicht funktioniert, weil das label nicht unter /dev/disk/by-label aufgeführt wird. Stattdessen muss man derzeit die id verwenden, also statt der LABEL-Zeile:
/dev/disk/by-id/ata-SanDisk_SDSSDHP128G_140203400869-part3 / f2fs noatime,discard 0 1
Nun ist es Zeit, in das neue System zu chrooten um den Bootvorgang einzurichten:
sudo mount --bind /dev /media/ssd/dev sudo mount --bind /proc /media/ssd/proc sudo mount --bind /sys /media/ssd/sys sudo chroot /media/ssd
Auf der SSD kann nun die initramfs gefixt werden:
echo "f2fs" >> /etc/initramfs-tools/modules update-initramfs -u
Dann fehlt nur noch Grub:
Edit: Da update-grub irrigerweise /dev/disk/by-id/…
ignoriert und stattdessen /dev/sdc3 einträgt, muss zuerst in der /etc/default/grub
GRUB_DEVICE="/dev/disk/by-id/…"
eingetragen werden. Dann:
grub-install /dev/sdc update-grub
Jetzt sollte von der SSD Ubuntu mit F2FS gebootet werden können.
Ohloh - Statistiken für FOSS-Projekte
Ohloh erinnert mich an ein modernes freshmeat, auch wenn das inzwischen freecode heißen mag. Es listet Softwareprojekte mit ihren Metadaten, baut aus ihrem Quellcode nette Statistiken und zieht Schlussfolgerungen über den Zustand des Projektes.
Das funktioniert nicht immer fehlerfrei, aber die Fehler sind verständlich. So denkt Ohloh, dass izulu ein neues Projekt sei, weil der Code auf Github eben erst vor drei Monaten eingecheckt wurde und vorher fast 5 Jahre in Archiven auf sourceforge herumlag, mit denen es natürlich nichts anfangen kann.
Bei Serendipity stoppte die Analyse auf einem Stand von vor mehreren Jahren, wahrscheinlich kam es mit dem abgeschalteten - aber nicht aus der Repoliste entfernten - berlios-svn nicht zurecht. Dem abgeholfen denkt es, dass s9y zu 30% aus XML-Dateien bestehen würden, weil die XML-Dateien in additional_plugins eben entsprechend groß sind. Und ausschließen kann man sie nicht alle, dafür sind sie zu viele (mehr als 1000 Zeichen verbietet das Disallow-Tool). Edit: Ich habe da nochmal drüber nachgedacht und jetzt einfach das Repo rausgeschmissen, sodass nur s9y selbst analysiert wird. Ermöglicht einen besseren Vergleich mit Wordpress.
Der Sprung um 1 Millionen LoC Ende 2011 ist wohl eine Fehlberechnung, weil seitdem git und svn parallel betrieben werden
Aber zumindest werden jetzt die Serendipity-Statistiken überhaupt wieder berechnet, und aus einem vermeintlich toten Projekt ist ein angeblich sehr aktives geworden, was inzwischen auch wirklich stimmt. Und ich glaube, den 2.0-Branch ignoriert er, das wird nach dem Merge nochmal ein hübscher Sprung, zumindest bei den Commits.
Die Projekte so präsentiert zu sehen ist hübsch, und sicher nicht unnütz, falls sich ab und an Nutzer tatsächlich damit ein Bild einer bestimmten Software machen, oder eher Entwickler Projekte in einem bestimmten Feld suchen.
Für mich spaßiger sind die Entwicklerstatistiken. Als Entwickler kann ich meine Commits claimen, und Ohloh baut dann für mich ein paar Graphen und Fakten. So sei ich am erfahrensten in PHP, was mit meinem Selbstbild kollidiert, aber inzwischen wahrscheinlich schlicht stimmt, auch wenn ein gewisser Teil meines PHPs s9y-spezifisch sein dürfte.
Dann noch ein paar Badges dazu und schon hat die Seite es geschafft, dass ich mein Profil dort ein bisschen ausgefüllt habe. Und nebenbei fehlende Projekte in das Register eingetragen habe, was den Wert der Seite erhöht - saubere Manipulation mithilfe der eigenen Eitelkeit, oder nennen es wir Interesse; gutes Handwerk.
Ich finde es gut, eine zusätzliche und moderne Softwarepräsentationsseite gefunden zu haben. Es ist nun sicher nicht so, dass ich die Seite täglich besuchen werde, aber ab und an mal vorbeischauen oder mich von dort auf die eigentliche Projektwebseite leiten zu lassen, das kann ich mir schon vorstellen. Und als Gegengewicht für Github erfüllt es auch eine sinnvolle Funktion, sodass dieses neben dem Hosten der Projekte selbst nicht zwingend auch Hauptanlaufpunkt für Statistiken der Projekte und Selbstrepräsentation der Entwickler sein muss.
Simdock und die richtige Animation
Fährt man mit der Maus über die Icons in simdock, vergrößern sich diese in einer Animation. Ich fand das damals ganz nett und habe es drin gelassen, immerhin sieht man so schnell, welches Programm durch einen Klick ausgewählt würde, und es ist deaktivierbar.
Als ich dann später den Code etwas besser überschaute sah ich, dass das geschickt umgesetzt ist: Bei jeder Bewegung des Mauszeigers wird die Distanz zu seinem Mittelpunkt berechnet und die Größe je nach Distanz gewählt. Diese Zoom-Funktion hat einen hübschen Verlauf:
double zoom (int stand_dev, float dist_center, int maximum_size) { return maximum_size * exp (-pow (dist_center, 2) / pow (stand_dev, 2)); }
Für mich sieht das wie eine schöne Animationskurve ist.
Es gab nur ein Problem: Den Mousemove-Event für die Animation mitzubenutzen ist eine naheliegende Lösung, die durch den gesparten Thread/Timer Code und durch wenige geworfene Events CPU spart, dabei vom Nutzer gut zu kontrollieren ist und hinreichend gut aussieht - sie sieht aber eben auch nur hinreichend gut aus. Selbst, nachdem ich die Icongrößenberechnung und Positionsbestimmung so umgeschrieben hatte, dass sich Icons sowohl nach links und rechts (und nicht nur nach rechts) erweitern - was das Bild beruhigen sollte - blieb die Animation immer noch etwas hakelig. Eben genau dann, wenn der Mauszeiger etwas hakelig bewegt wurde, besonders im Grenzbereich zwischen den Icons und beim Sprung von der vorherigen zur Maximalgröße.
So sah es vor dieser Änderung aus:
So mit:
Besser, aber immer noch hakelig. Das Icon selbst, das vergößert wird, ist meist ok. Aber besonders die weiter entfernten Icons und Aktivitätsmarker ruckeln ein bisschen sehr hin und her.
Meine momentane Lösung ist, die Animation von der Mausbewegung zu entkoppeln. In einem Timer, der alle alle 32ms feuert, werden gehoverte Icons animiert vergrößert und die anderen falls nötig ebenso verkleinert, alles unabhängig von der Distanz zum Iconcenter. Das brauchte ein bisschen Optimierungsarbeit, um sauber zu funktionieren und nicht zu viel CPU zu fressen, und man kann sicher noch viel verbessern. Aber bisher bin ich ganz zufrieden.
So sieht die neue Animation aus:
Auf mich wirkt das wesentlich flüssiger, auch wenn ich noch etwas Zeit brauchen werde, um die geringere Kontrolle über die Animation zu verdauen. Netter Nebeneffekt des ganzen ist, dass - entgegen meiner Erwartung und von mir erst nachträglich entdeckt, ich musste diesen Artikel deswegen ein bisschen umschreiben - die CPU-Belastung durch die neue Animation sinkt. In der ersten Variante ging sie während der Animation bis auf 70% hoch, je nach Mauszeigergeschwindigkeit, hiermit pendelt sie auf meinem System unabhängig von der Zeigergeschwindigkeit bei 20%. Das ist immer noch viel, eigentlich zu viel, aber es ist trotzdem besser als vorher.