Blitz ohne Donner, Flash ohne Sound

Linux ist ja nicht mehr Lustig. Früher war man froh und stolz über jede Taste die funktioniert hat, heute muss man sich ganz andere Gründe zum Saufen suchen. Doch nun habe ich wieder einen Nachmittag verbracht um das zu erreichen, was unter Windows schon lange läuft und ich bin unglaublich stolz darauf *lach*.

Wie eine Seuche hat es in meinem kleinen Rechenzentrum um sich gegriffen: Eine Computerine nach der Anderen verweigerte den Sound zu Flash Videos. Ich selbst schaue mangels Multitasking eh nur ohne Ton, aber Frauen und Kinder möchten schon die volle Dröhnung. Nach den typischen „Jaja“s und „reboot mal“s (das tun sie nicht, und so kann man sich wunderbar drücken) wurde die Opposition zu gross und ich habe mich hingesetzt. Schnell habe ich gemerkt, dass ich nicht der Einzige mit dem Problem bin, und die Lösungen sind vielfältig und unterschiedlich.

Hier einen kleinen Ablauf, der anderen gequälten Machmals das Leben vielleicht erleichtert.
Weiterlesen

Bookmarklets: Kleine Helferlein

bookmarkBookmarklets sind eigentlich ganz normale Links, die aber Javascript beinhalten. Sie können aus einer beliebigen Website direkt an den bevorzugten Bookmark-Ort (Toolbar, Menü, Sidebar, …) gezogen und verwendet werden. Die Idee ist so einfach und genial, dass es schon grosse Verzeichnisse für sie gibt. Da sie in Javascript programmiert sind, kann man auch den Quellcode direkt ansehen und für sich anpassen.

Beispiele sind:

  • Das auf der aktuellen Seite markierte Wort nachschlagen, übersetzen, auf der ganzen Seite markieren, …
  • Seitendaten (Bilder, Links, Texte) oder -metadaten (Frische, Grösse, …) auslesen.
  • Seite verändern: (Schrift, Farbe, …)

Hier ein Trivialbeispiel: ddo.com ist ein MMPORG, das den Service „my.ddo.com“ anbietet. Dort können Detaildaten über die Charakteren der Spieler abgerufen werden indem eine spezielle URL nach dem Schema http://my.ddo.com/character/welt/name/ zusammengestellt wird. Das erste Bookmarklet nimmt vom Benutzer Welt und Name entgegen und ruft die entsprechende URL auf (Test: Senthessel auf Ghallanda):

<a href="javascript:void(Tn=prompt('Toon name:',''));void(Sr=prompt('Server:',''));if(Tn && Sr) location.href='http://my.ddo.com/character/'+escape(Sr.toLowerCase())+'/'+escape(Tn.toLowerCase())+'/'">Suche DDO-Toon</a>

Es ist voll bookmarkfähig und sieht folgendermassen aus: Suche DDO-Toon.

Ein zweites Bookmarklet sucht auf einer bestimmten Welt und nimmt als Namen entweder den auf einer Webseite markierten Text oder die Eingabe in einem Dialog:

<a href="javascript:Tn=document.getSelection();if(!Tn){void(Tn=prompt('Toon name:',''))};if(Tn) location.href='http://my.ddo.com/character/ghallanda/'+escape(Tn.toLowerCase())+'/'">Search DDO-Toon On Ghallanda</a>

Beispiel: Search DDO-Toon On Ghallanda

Folgendes Bookmarklet sucht ein entsprechendes Ausbildungsmodul von I-CH (Quelltext anzeigen für die Source 😉 ): Modulsuche auf I-CH

Am besten nimmt man ein bestehendes Bookmarklet und passt es auf seine Bedürfnisse an.


Hier eine Liste der kompletten DDO-Bookmarklets:

Zeitintervalle (Erledigungsfristen) in PHP

timeIch bin wiedereinmal am Coden und irgendwie scheine ich mit fortschreitendem Alter auf immer mehr ungelöste Probleme zu treffen. In der aktuellen Applikation geht es darum, dass Erledigungsfristen als Intervalle eingegeben werden können: Beispielsweise muss eine Aufgabe immer in 2 Monaten, 1 Woche und 4 Sekunden nach dem Erfassen erledigt sein. Daraus ergeben sich ein Strauss an Problemen (oder ein Problemkorb, wie man neuerdings zu sagen scheint. Was für eine schreckliche Vorstellung, nur FRÜCHTE-Körbe finde ich noch abschreckender):

  • Jemand muss die Aufgabe erledigen. Zum Glück ist das ein PAL (Problem anderer Leute) 🙂 .
  • „In einem Monat“ und „In einem Jahr“ kann nicht trivial in Sekunden umgerechnet werden. Irgendein Soziopath hat mal bestimmt, dass nicht alle Monate und Jahre die gleiche Anzahl Tage haben. Ganz zu schweigen von Schaltsekunden und Sommer-/Winterzeit.
  • Aus hier zu verschweigenden Gründen habe ich weder Lust noch Zeit ein GUI mit 7 Textfeldern für Jahre, Monate, Wochen, Tage, Stunden, Minuten und Sekunden aufzubauen.

Ich habe mich für ein simples Eingabefeld entschieden, in denen das Erledigungsintervall in der Form „Zahl Zeitbezeichner Zahl Zeitbezeichner …“ eingegeben werden kann. In obigem Beispiel wäre das: „2m 1w 4s„.

Weiterlesen

Webanwendungen: Office 2007 Dateien werden als ZIP heruntergeladen

zipper Ein Server von uns versuchte wiedereinmal besonders originell zu sein: Eine in WordPress hochgeladene „.docx“ Datei wurde im Internet Explorer als „.zip“ zum Download offeriert. So richtig böse kann man dem dem Server nicht sein, hat er doch recht: Die Office 2007 Dateien sind an sich Zips, und trotzdem möchte man sie mit Word öffnen, oder?

Nach einigem Fluchen bin ich auf den korrekten Eintrag gestossen und konnte die Lösung ableiten. In der Datei /etc/mime.types folgendes am Ende hinzufügen und gut is:

application/vnd.ms-word.document.macroEnabled.12 .docm
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx
application/vnd.ms-powerpoint.template.macroEnabled.12 potm
application/vnd.openxmlformats-officedocument.presentationml.template potx
application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam
application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm
application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx
application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
application/vnd.ms-excel.addin.macroEnabled.12 xlam
application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb
application/vnd.ms-excel.sheet.macroEnabled.12 xlsm
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
application/vnd.ms-excel.template.macroEnabled.12 xltm
application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx 

Der Stand der Technik: One for All Xsight Universalfernbedienungen

[Trigami-Review]
remote Ein weiteres Problem in einem Techie-Haushalt (und wenn ich mich so umschaue, wohl langsam aber sicher auch bei „normalen“ Menschen): Die Inflation der Fernbedienungen. TV-0, TV-1, DVD, Sound-System-0 und Sound-System-1, Satellitenreceiver, ja sogar mein Laptop verfügt mittlerweile über eine Fernsteuerung. Das führt dazu, dass ich über die Zeit ein ganzes IKEA-Körbchen mit diesen Dingern gefüllt habe. Um eine DVD zu sehen (und zu hören) brauche ich drei davon, die dann fröhlich auf meinem Bauch drapiert jedes wohlige Räkeln verhindern und gierig jedes Krümelchen gedünstete Kartoffelscheibchen in sich aufnehmen. Mindestens einmal pro Film muss ich aufstehen und einem dieser Geräte neue Batterien spendieren (und gleichzeitig die beiden Anderen gekonnt auf den Boden werfen).

Meine Experimente mit Universalfernbedienungen sind bis jetzt leider immer an meiner Unfähigkeit gescheitert, papierne Unterlagen wieder-zugriffsfähig abzulegen. Wer kann sich schon die komplizierten Griffe merken, die Notwendig sind, um die Teile nach einer längeren Ruhepause neu zu programmieren? Ohne Kohl: bei einem Modell musste man sogar nach einer Fingerbrecher-Knopfkombination eine ganz bestimmte Zeit warten, damit das Reprogrammieren geklappt hat.

Ich war daher mehr als gespannt auf die „One for All“ Xsight Geräte Xsight Colour und Xsight Touch . Sie haben einen Bildschirm, viele Knöpfe und einen USB-Anschluss. Was braucht es mehr, um des Geeken Herz höher schlagen zu lassen? (ok, ein SDK wär nicht schlecht 🙂 ).

Universalfernbedienungen auf höchstem Niveau

Links die Touch, in der Mitte die Colour und rechts eine Zigarettenschachtel zum Grössenvergleich

Links die Touch, in der Mitte die Colour und rechts eine Zigarettenschachtel zum Grössenvergleich

Schon beim Auspacken gefallen die Geräte. Sie sind etwas gross, sehen aber sehr elegant aus, und die blaue Beleuchtung bringt Star-Trek-Feeling. Beide Geräte können entweder direkt oder per USB über den PC konfiguriert werden. Das direkte Konfigurieren geht dank dem Bildschirm sehr schnell, aber die Datenbank ist nicht so gross wie bei der Online-Variante.

Konfigurieren über USB

Nach der (leider Windows-Only) Installation der Software auf dem PC, wird das Gerät über eine Webseite upgedated (Firmware) und konfiguriert. Das hat den Vorteil, dass die Datenbanken der Geräte aktuell gehalten werden können. Man ist theoretisch also auch für Geräte gerüstet, die es noch gar nicht gibt. Der Nachteil dabei dürfte sein, dass One for All ziemlich viele Infos über mich erhält. Ich habe mich zum Beispiel sehr gefragt, wieso ich meinen Geburtstag und den Wohnort angeben muss.

ActiveX muss aktiviert werden, dann klappts auch mit dem USB

ActiveX muss aktiviert werden, dann klappts auch mit dem USB

Nachdem ich ActiveX aktiviert habe, ging das Procedere dann auch ohne Probleme und speditiv vonstatten. Als Coder hat mich die Idee fasziniert, wie hier lokale Geräte mit online-Applikationen gesteuert werden. Das muss man im Auge behalten.

Weiterlesen

Text- oder Quellcodedateien auf Ähnlichkeit prüfen unter Linux

mirrorManchmal überfällt mich der starke Drang nachzuforschen, wieviel von meinem vermittelten Wissen auch tatsächlich angekommen, gespeichert und wiedergegeben werden kann. Im Volksmund heisst dies „Prüfung“, im Mund der Lernenden „Folter“. Im Zeitalter der Kommunikation könnte es natürlich sein, dass Dateien weitergegeben werden. Als Beurteiler sollte man das herausfinden, so dass man diese Dateien wieder zurückgeben kann :)…

Eine der Möglichkeiten unter Linux ist der similarity-tester. Er kann Code in verschiedenen Programmiersprachen oder auch Text vergleichen. Als Argument übernimmt er eine Liste von Dateien für den Vergleich.

Angenommen, man hat die Dateinamen vorgeschrieben und alle Resultate lokal, so listet folgender Befehl die Ähnlichkeiten prozentual auf, absteigend geordnet.

sim_text -e -s -p `find . -name 'aufgabe.vb'`

Wer sich in die Optionen einarbeiten möchte, sei auf die Manpage verwiesen.

Eine weitere Möglichkeit wäre Simhash. Leider bin ich zu dumm es zu verstehen und für meine Bedürfnisse aufzurufen.

Hat jemand vielleicht eine noch komfortablere Lösung? Vielleicht auch für Binärdateien?

m:n Beziehungen zu Lookup-Tables mit einem SQL-Befehl erstellen

puzzleBei diesen Beitrag habe ich echt überlegt, ihn unter einem anderen Namen zu veröffentlichen. Ist der Inhalt doch eigentlich sowas von trivial und für Menschen mit mehr als zwei Hirnzellen wahrscheinlich sowieso offensichtlich. Aber das Gefühl, das mich durchflutet hat als mich Erkenntnis küsste war so erfüllend und erhebend, dass ich dieses gerne mit Euch teilen würde.

SQL ist eine geniale Erfindung. Zwar wird es im Moment arg von den schmächtigen noSQL bedrängt, aber es wird wie triumphieren *star-wars-musik-on*, denn die Anderen werden untergehen wie die noAngels, es wird gewinnen wie die Maden über die noMaden, häufiger verwendet werden, so wie es das Ah gegenüber noAh wird und edler sein, wie der Orden gegenüber noRden! Ich bin heute noch auf der Suche nach der vernünftigen Frage, die nicht in ein einziges SQL-Statement verpackt werden kann.*star-wars-musik-off*

Beispiel-Schema

Doch zurück zum Problem: Es seien Entitäten gegeben, die m:n Beziehungen zu „lookup-Werten“ haben. Ein bestehender Wert in einem Set also, das sich selten ändert wie beispielsweise Kategorien, Zustände, Farben, Ländercodes, Geschlechter oder so etwas. Ein weiterer Use Case wäre ein Import, bei dem die Datensätze schon erstellt wurden und nun nur noch die Verbindungen fehlen.

Hier ein Beispiel:
Personen beinhalten, ja ratet mal, Personen.Hier vereinfacht nur mit Namen und Vornamen.
Personentypen bezeichnen die Art der Person. Beispielsweise Lernender, Lehrperson, Verwaltungsangestellter oder auch Schulleiter.

Jede Person kann mehreren Personentypen entsprechen. Diagnose: klassisches m:n mit Verbindungstabelle (personen_personentypen).

Weiterlesen

Kubuntu update und GRUB Wiederherstellung

facepalmEntropie in Reinkultur: Alles tendiert zum grösstmöglichen Chaos und guter Wille pflastert den Weg ins Grab. Auf meinem Lieblingsrechner wurde vor langer Zeit Kubuntu installiert. Mit dem Update auf Version 9.10 hat sich gerade eine schon lange fällige Neuinstallation von Windows gekreuzt. (Neuinstallation weil: Vista Basic Home Premium – entgegen der Meinung des MS Update-Assistant – nicht auf Windows 7 Professional upgedatet werden kann. Warum? Das weiss wohl nur ein Microsoft Certified Client System Upgrade Engineer, der wohl ein Live Upgrade über Windows Vista Home Half Master Business Game Edition oder so empfehlen würde *gna*.)

Windows startet nun wunderbar, hat aber natürlich meinen Bootloader (GRUB) überschrieben und ich kann nimmer in mein geliebtes, frisch upgedatetes Kubuntu booten. Das kennen wir von früher und mit Hilfe einer Boot-CD hat das schon bei Lilo wunderbar geklappt. Nicht jedoch dieses mal: Fehlermeldungen von nicht gefundenen Partitionen ("Could not find device for /boot: Not found or not a block device.") lachten Hohn über ganz verschiedene Anleitungen.

Ein paar ausgerissene Haarbüschel später und nach einer sehr formal geordneten Analyse (*lach*) hab ich dann das Problem erfasst. Beim Update wird der alte Grub 0.97 weiterverwendet, eine Neuinstallation (und auf der 9.10 Life-CD) ist der neue Grub 1.97.

Nach ein paar weiteren Tritten gegen die Maschine war die Lösung dann einfach: Eine alte Knoppix mit altem Grub rausgekramt, gebootet:

$> sudo grub
grub> find /boot/grub/stage1
 (hd0,5)
grub> root (hd0,5)
grub> setup (hd0)
grub> quit

Und alle sind wieder glücklich, die Haare wachsen nach, die Falten werden sich wieder glätten und die neuen Dellen im PC werden nicht weiter auffallen (is ja ein Dell *höhö_und_schenkelklopf*).

Website mit Java-Programmieraufgaben, die automatisch korrigiert werden

batUnd es gibt sie: Die Perlen im Web. Man surft sich einfach so die Zeit weg, weil die Arbeit lauert und nur darauf wartet zuzupacken und versucht verzweifelt das schlechte Gewissen wegzusurfen und dann trifft einem der Hammer und eine Rechtfertigung für das Prokastrinieren: JavaBat. JavaBat ist undesigned, sehr technisch, aber einfach genial um Java zu lernen.

Auf JavaBat gibt es Programmieraufgaben zu verschiedenen Themen. Die Lösung wird als Java-Quellcode eingereicht, auf dem Server compiliert, ausgeführt und mittels Unit-Tests korrigiert. Eine geniale Idee: Schlicht und ergreifend und mit dem Potential süchtig zu machen. Zusätzlich besteht die Möglichkeit, einen „Teacher“ anzugeben, dieser kann dann die Fortschritte beobachten.

Diese Aufgabe wurde gelöst

Diese Aufgabe wurde gelöst

Aber wie machen die denn das? Wie bewahren sie sich davor, dass ich ihnen mit den Dateioperationen den Server überschreibe? Es wäre doch wunderbar, wenn man dieses Prinzip auch für andere Programmiersprachen anwenden könnte… Es scheint so, dass es bei Java sehr einfach ist: JavaBat verbietet Import-Statements, oder es kann über die JVM-Security-Policies gelöst werden (sagen sie bei Stackoverflow). Eine generellere Herangensweise zeigt Geordi: Hier werden die System-Calls geblockt. Mal sehen, wie sich das zum Nutzen Aller verwenden lässt…

Avira Antivir Personal will nicht updaten

aviraDa Windows noch nicht ganz verschwunden ist, muss ich mich ab und an auch damit ein Bisschen herumschlagen. Es rächt sich für die Vernachlässigung , indem es jedesmal wenn es gebootet wird eine zuerst eine halbstündige Updateorgie abzieht.

Einer der Updatewilligen ist Avira Antivir. Avira ist mein bevorzugter Virenschutz, weil es sich schön im Hintergrund hält, seine Arbeit macht und mir nicht allzuweit ins System hineinfunkt. Leider scheinen die Server ab und zu überlastet zu sein und dann werde ich von Windows und Avira generft.

Doch Hilfe naht: In einem Beitrag in der Avira Knowledge Base steht, wie man manuell updaten kann:

  1. Verlinkte Datei downloaden.
  2. Avira Hauptprogramm starten.
  3. Update → Manual Update auswählen.
  4. Die Datei – wie sie ist – angeben.
  5. Und schon sind alle glücklich.