Dienstag, 30. November 2010

JavaScript/DOM: Verhalten von appendChild()

Folgendes ist mir bei der JavaScript-Entwicklung aufgefallen.

Verwendet man die Methode appendChild(), um ein vorher bspw. mittels getElementById() (oder der PrototypeJS- bzw. JQuery-Funktion "$()") aus dem DOM geholtes Element an anderer Stelle oder in ein anderes Dokument (ein anderes Browserfenster) einzufügen, wird das an der ursprünglichen Stelle stehende Element gelöscht (!).

Dies ist kein Bug, sondern laut DOM-Spezifikation so gewollt.
If the newChild is already in the tree, it is first removed.
Soll das Element an der ursprünglichen Stelle bestehen bleiben, ist diese zunächst mittels der Methode cloneNode() zu duplizieren.

Sonntag, 14. November 2010

GrowlMail und OS X 10.6.5 / Mail 4.4

Nach meinem Update auf Mac OS X 10.6.5 (vorher hatte ich noch 10.5.x) funktionierte das Apple Mail Plugin GrowlMail nicht mehr, welches Growl Benachrichtigungen anzeigt, wenn neue Mails eintreffen.
Leider ist es so, dass bei der neuen Version von Apple Mail Plugins für jede Version von Apple-Mail, für die sie verwendbar sind, eine UUID dieser Version von Apple Mail enthalten müssen. Es kann also ein Plugin nicht mehr die Information enthalten "Ich bin für alle Versionen von Mail ab 4.0 geeignet", sondern muss alle Versionen (bzw. deren UUIDs) explizit auflisten.

Wurde GrowlMail beim Start von Mail aufgrund der (vermeintlichen) Inkompatibilität bereits deaktiviert, muss man es von dem Ordner
Users/Library/Mail/Bundles (deaktiviert)/GrowlMail.mailbundle
wieder in den Ordner
Users/Library/Mail/Bundles/GrowlMail.mailbundle
verschieben.

Dann fügt man zur in dem Bundle enthaltenen Datei Info.plist unter SupportedPluginCompatibilityUUIDs die beiden UUIDs von Apple Mail 4.4
"857A142A-AB81-4D99-BECC-D1B55A86D94E"
und
"BDD81F4D-6881-4A8D-94A7-E67410089EEB"
hinzu.

Alternativ kann man das auch über das Terminal lösen:
defaults write ~/Library/Mail/Bundles/GrowlMail.mailbundle/Contents/Info SupportedPluginCompatibilityUUIDs -array-add "857A142A-AB81-4D99-BECC-D1B55A86D94E"
defaults write ~/Library/Mail/Bundles/GrowlMail.mailbundle/Contents/Info SupportedPluginCompatibilityUUIDs -array-add "BDD81F4D-6881-4A8D-94A7-E67410089EEB"


Quelle: http://langui.sh/2010/10/14/fixing-growlmail-in-10-6-5-mail-4-4/


Nachtrag:

Für
Apple Mail 4.5 (kommt mit Mac OS X 10.6.7) lauten die UUIDs
"1C58722D-AFBD-464E-81BB-0E05C108BE06"
und
"9049EF7D-5873-4F54-A447-51D722009310".

Siehe http://langui.sh/2011/03/21/fixing-growlmail-in-10-6-7-mail-4-5/

Sonntag, 29. August 2010

Yahoo! Pipes: RSS-Feeds "subtrahieren"

Wenn man (wie ich) ein fleißiger Leser von Newsfeeds ist, kommt es u.U. vor, dass man einen abonnierten (RSS-/Atom-)Feed ohne bestimmte Beiträge bekommen möchte. Wenn diese Beiträge nicht mittels eines einfachen Filters definiert werden können, sondern Inhalte eines anderen Feeds sind, wird es schwierig und es kann dafür Yahoo! Pipes verwendet werden.

Nochmal die Aufgabenstellung: Ziel ist es, einen Feed zu bekommen, in dem alle Beiträge von Feed A vorkommen, aber alle Beiträge, die auch in Feed B vorhanden sind, herausgefiltert wurden, also die Differenzmenge von Feed A und Feed B. Um es noch etwas konkreter zu machen: Ich möchte alle Spiegel-Online-Beiträge (RSS-Feed) ohne die Beiträge des Sport-Feeds von Spiegel Online (RSS-Feed).

Leider gibt es für diesen Fall keinen vordefinierten Operator-Block bei Yahoo! Pipes, sodass man selbst Hand anlegen muss.


Hier eine Erklärung, wie das Ganze funktioniert:

  • Zunächst legt man für jeden Feed (in meinem Fall SP.ON komplett sowie SP.ON Sport) ein Fetch-Feed-Modul an und kopiert die URL der Feeds in das jeweilige URL-Feld.
  • Anschließend wird mit einer Loop über einen String Builder jedem Beitrag ("item") der beiden Feeds eine Markierung hinzugefügt, die die Beiträge eindeutig einem der Feeds zuordnet. Einträge des ersten Feeds bekommen ein zusätzliches Feld "source" ("item.source") mit dem Inhald "Feed A", analog werden Beiträge des zweiten Feeds mit item.source = "Feed B" gekennzeichnet.
  • Beide Feeds werden nun mit einem Union-Modul vereinigt.
  • Mit Hilfe eines Unique-Moduls werden anschließend Einträge, deren "link"-Feld identisch ist, kombiniert.
    Anmerkung: Hier muss man bei anderen Quellen evtl. auf andere Felder ("title") zurückgreifen, wenn die Links der Einträge sich bspw. durch einen Parameter unterscheiden.
  • Jetzt kommt der Trick des Aussortierens: Über ein Filter-Modul werden nun nur Einträge weitergereicht, deren "y:repeatcount"-Feld gleich 1 und die Quelle (item.source) "Feed A" ist.
    Info: Das "y:repeatcount"-Feld wird vom Unique-Modul für jeden Beitrag gesetzt und enthält die Anzahl der Beiträge, die es zu dem jeweiligen Beitrag zusammengefasst hat.
  • Das Ergebnis wird schließlich an den Pipe Output weitergereicht (und kann hier abgerufen werden: http://pipes.yahoo.com/pipes/pipe.run?_id=e95a7dc4cd639af9710a95d62000e9d5&_render=rss)

Sollte jemand noch ein paar coole Dinge mit Yahoo! Pipes angestellt haben, möge er/sie einen Kommentar posten...


Ergänzung:

Freitag, 9. Juli 2010

Windows 7 Installation vom USB-Stick

Es soll ja vorkommen, dass man Windows 7 auf einem Rechner ohne optisches Laufwerk installieren muss.

Microsoft stellt dafür ein Tool bereit, das aus einem von deren Shop online gekauften ISO-Image einen bootbaren USB-Stick erstellt. Leider hat das Tool zwei Nachteile (außer dass es das .NET Framework benötigt): Zum einen akzeptiert es scheinbar nur ISO-Images, die von Microsoft vertrieben werden, was einem nicht weiterhilft, wenn man nur die Windows 7 DVD vorliegen hat; zum anderen wird (zumindest unter Windows XP) die Installation eines "Image Mastering API v2.0" vorausgesetzt. Also muss eine andere Lösung her.

Hier habe ich folgende funktionierende Vorgehensweise gefunden:
  • Alle wichtigen Daten auf dem USB-Stick in Sicherheit bringen (z.B. mit USB Image Tool im Device Mode).
  • Die folgenden Befehle setzen voraus, dass der angeschlossene USB-Stick als „drive 1“ von Windows erkannt worden ist! Um herauszufinden, unter welcher Kennung der Stick erkannt worden ist, an der Eingabeaufforderung "diskpart" und anschließend den Befehl "list disk" eingeben. Unter "Datentr" steht Ziffer, die dem eingelegten USB-Stick zugewiesen ist! Die Zeile "select disk 1" (unten fett markiert) muss dann entsprechend angepasst werden!
  • Folgendes an der Eingabeaufforderung eingeben:
diskpart
select disk 1 (ggf . muss der Wert angepasst werden!)
clean
create
partition primary

select partition 1
active
format fs=fat32
assign
exit
  • Nun den Inhalt der kompletten Windows-7-DVD auf den USB-Stick kopieren:
xcopy (DVD-ROM-Laufwerksbuchstabe):\*.* /s/e/f (USB-Stick-Laufwerksbuchstabe):\
  • Wenn im BIOS das Booten vom USB-Stick aktiviert ist, startet beim Start mit eingelegtem Stick das Windows 7 Installationsprogramm.
Folgendes habe ich noch herausbekommen:
War die Festplatte vorher unpartitioniert oder nur Windows unbekannte Partitionen (wie ext3) vorhanden waren, kann es vorkommen, dass sich das Installationsprogramm weigert, Windows auf der Festplatte zu installieren, weil der Stick bereits den Laufwerksbuchstaben C: abbekommen hat. Dazu auf der Festplatte eine Partition anlegen und formatieren (geht innerhalb des Windows Setup mit den erweiterten Optionen), neu booten und die Partition wieder löschen. Windows kann dann in diesen unpartitionierten Bereich installiert werden (Partition wird automatisch angelegt und formatiert).

Freitag, 1. Januar 2010

Ein Rätsel...

Zum neuen Jahrzehnt möchte ich ein Rätsel stellen, was mir vor einiger Zeit über den Weg gelaufen und mir heute wieder in die Hände gefallen ist.

Lösungsvorschläge bitte in die Kommentare!

Drei Personen wohnen zusammen in einem Haus. Das Produkt des Alters der Personen beträgt 2450. Die Summe ihres Alters entspricht der Hausnummer vom Haus nebenan. Des weiteren ist keiner so alt wie die Nummer der Buslinie, die an dem Haus vorbeiführt.

Wie alt sind die Personen?

Fleißaufgabe:
a) Wie lautet die Hausnummer vom Haus nebenan?
b) Wie lautet die Nummer der Buslinie?

Hinweis: Die Aufgabe ist eindeutig lösbar!