Alex Online Today

some experience to be shared

By

Java:deprecated – welche Strategie verfolgt Apple?

Kurz nach Vorstellung des neuen Macbook Air hat Apple auch ein Update für Java veröffentlicht. In den release Notes ist folgendes prominent an erster Stelle zu lesen:

As of the release of Java for Mac OS X 10.6 Update 3, the version of Java that is ported by Apple, and that ships with Mac OS X, is deprecated.
This means that the Apple-produced runtime will not be maintained at the same level, and may be removed from future versions of Mac OS X. The Java runtime shipping in Mac OS X 10.6 Snow Leopard, and Mac OS X 10.5 Leopard, will continue to be supported and maintained through the standard support cycles of those products.

darauf hat mich vorhin ein Artikel auf heise.de aufmerksam gemacht.

Welche Bedeutung hat die Java Runtime auf der Mac Plattform? Einige Fakten

– Die Java Runtime dient als Grundlage für viele Anwendungen, von denen einige auch nur deshalb für den Mac portiert wurden, da sich durch die Verwendung von Java der Aufwand in Grenzen hält.
– Besonders beliebt war Java auf dem Mac auch deshalb, weil es stets mit dem Betriebsystem mitgeliefert wurde. Bis heute ist die JRE auf jedem Mac vorinstalliert.
– Die gute Integration erlaubt, dass viele Java Anwendungen optisch nicht von Cocoa Anwendungen (der nativen Mac Umgebung) zu unterscheiden sind.

Die Alternative
– z.B. für Windows wurde die Java Runtime immer von Oracle bzw. Sun entwickelt.
– Das Open Source Projekt SoyLatte bietet schon seit langem aktuellere Releases des JDK für die Mac Plattform (insbesondere relevant für Entwickler).

Die möglichen Gründe für Apple von der eigenen Runtime abzuweichen?
– Apple möchte den Mac als Anwendungsplattform geschlossener gestalten und versucht zukünftig ausschließlich auf Cocoa zu setzen.
– Apple sieht in der Entwicklung von Java auf Clientseite keinen so großen Nutzen mehr und hofft auf andere Anbieter (Oracle, Open Source Community).
– Apple ist von der neuen Abmahn-Politik Oracles eingeschüchtert und möchte einen Rechtsstreit verhindern.

Was bedeutet das für die Zukunft von Java auf dem Mac?

Hier sind verschiedene Szenarien möglich, manche machen den Mac für Java Entwickler und High-End User sehr uninteressant. Aber Ich kann mir nicht vorstellen, dass Apple es sich unbedingt mit der (Java-) Entwicklergemeinde verscherzen möchte, schließlich gibt es hier viele Zusammenhänge auch zur Mac Entwicklergemeinde und der Mac als Entwicklungsplattform hat gerade in letzter Zeit enormen Zuwachs erfahren.

1. Szenario: Apple möchte den Mac als Anwendungsplattform geschlossener gestalten und versucht zukünftig ausschließlich auf Cocoa zu setzen.
Folge: Im App Store werden keine Java Applikationen zugelassen. Zu erwarten ist dann allerdings, dass Oracle relativ schnell eine eigene und auch möglichst gute Runtime zur Verfügung stellen wird, um Apple gegenzusteuern. Könnte für Apple nach hinten losgehen, weil man erstens die Entwickler verärgert und zweitens nicht wirklich etwas erreicht.

2. Szenario: Apple hat schon seit einiger Zeit sehr zögerlich neue Java-Versionen übernommen. Offenbar hat man einfach die Lust daran verloren und hofft, Oracle oder OpenSource Projekte wie SoyLatte werden zukünftig die Arbeit übernehmen.
Folge: Genau das passiert auch, eine Verzögerung ist jedoch vorerst nicht auszuschließen. Die Folgen sind besonders schlimm, denn von Oracle oder der Open Source community sind keine derartig guten Integrationen der JRE in Mac OS zu erwarten, wie wir sie momentan kennen. Dies könnte Java auf dem Mac tatsächlich gehörig schaden.

Die Zukunft von Java wird auch für Mac OS eine wichtige Rolle spielen. Ich persönlich als Entwickler würde mich eventuell von Apple trennen, wenn zukünftig keine ordentliche JRE mehr aufzutreiben ist. Denn selbst wenn ich auf einige Javaprogramme verzichten könnte, so basieren doch die alle Eclipse-Derivate ebenso auf Java. Das SKD alleine reicht zum Entwickeln leider nicht aus.

By

JavaScript Schnipsel: eval()

Mit eval() kann man in JavaScript Code nachträglich laden und ausführen. Aus diesem Grund ist es auch besonders wichtig, vorsichtig damit umzugehen! Eval ist besonders praktisch, um z.B. mathematische Funktionen dynamisch zusammen zu setzen.

Folgend ein kleines Beispiel:

function bar(a,b){
	var str = 'a*x+b';
	return (function(x){ 
		return eval(str);
	});
}
 
var foo = bar(4,5);
document.write(foo(1));

Diese Dynamisch erstellten Funktionen sind z.B. sehr hilfreich beim Zeichnen von Graphen.

By

jQuery Plugins

Ich beschäftige mich momentan mit der JavaScript Bibliothek jQuery. jQuery bietet viele Funktionen, die das Gestalten dynamischer Webseiten vereinfachen. Z.B. nutzt auch WordPress die jQuery Bibliothek.

Das Projekt mit dem ich mich beschäftige, ist sehr textorientiert, deshalb sollen alle Dialogfenster auf der Seite stets ausgeblendet sein, wenn man sie gerade nicht benötigt. Somit wird der Darstellungsbereich für den Text größer. Auf folgendem Screenshot wird das verdeutlicht:

Auf der linken Seite verdeckt ein Dialogfenster die Sicht auf den Text. Sobald man nun den Mauszeiger vom Dialogfenster nimmt, wird das Dokument wieder voll sichtbar. Klickt man auf einen Teil im Dokument oder auf eine Funktion, die das Dialogfenster benötigt, wird es wieder eingeblendet.

Dieses Verhalten könnte man nun mühsam für jedes Bedienelement, auf das man die Funktionalität anwenden möchten, ausprogrammieren. Eine elegantere Weise ist es, eine Plugin für jQuery zu schreiben.

Der Name meines Plugins lautet “hideous”. Wenn es geladen ist, reicht ein einfacher Aufruf von

$('#WindowID').hideous();

um einem Fenster mit einer ID bzw.

$('#WindowClass').hideous();

um einer Fensterklasse dieses “Verhalten” anzugewöhnen.

Das exakte einblende/ausblende Verhalten lässt sich desweiteren mit einigen Attributen beeinflussen:
Um z.B. das Plugin, wie in der Demo, mit Attributen auf die Klasse “.example” anzuwenden, verwendet man folgenden Code:

  $(".example").hideous(
  new Object({
    HIDETIME:300,
    TRANSPARENCY_FACTOR:0.15,
    VISIBILITY_FACTOR:0.75,
    FADEOUTTIME: 50,
    FADEINTIME: 50
  }));

HIDETIME legt die Zeit fest, wie lange das Element eingeblendet bleibt, wenn der Mauszeiger das Fenster verlassen hat.
TRANSPARENCY_FACTOR und VISIBILITY_FACTOR legen die exakte Transparenz fest. Bei 0.15 ist das Element nur noch zu 15% zu sehen bzw. zu 85% transparent!
FADEOUTTIME und FADEINTIME legen fest, wie lange der Effekt des Ein-/Ausblendens dauert.

In der folgenden Demo wird das Plugin auf eine Liste angewandt. Fährt man mit dem Mauszeiger über die Einträge, werden Sie für einen kurzen Moment hervorgehoben/eingeblendet.

Demo und Code

Achso, wenn ihr das verwenden möchtet, haltet euch bitte an die Lizenz oder meldet euch kurz bei mir:
Creative Commons Licence
Hideous jQuery Plugin by Alexander Wolf is licensed under a Creative Commons Attribution 3.0 Unported License.

By

Automatisches Backup von FAT32 USB Sticks auf dem Mac

Leider unterstützt die hervorragende Backuplösung von Apple – Time Maschine – keine FAT32 formatierten USB Sticks als Quellmedien. Gerade bei diesen kleinen Dingern ist die Wahrscheinlichkeit eines Verlustes jedoch besonders hoch, weshalb man entweder gar keine kritischen Daten darauf speichern, oder regelmäßig Backups erstellen sollte.

Mein Ziel: Bei jedem Anstecken des USB Sticks wird der gesamte Inhalt automatisch via AppleScript und rSync auf ein Verzeichnis auf meinen Mac kopiert. Vor korrupten Dateien schützt mich dann das automatische Time Maschine Backup.

Ich bin natürlich nicht der erste, der sich mit der Thematik befasst. Im Internet fand  zwei etwas angestaubte Einträge, einer beschrieb eine Lösung mit AppleScript und dem Tool “Do Something When” [Link1], der andere mit einer FolderAction im Volumes Verzeichnis und einem Script auf jedem USB Stick [Link2]. Wem meine Lösung nicht gefällt, der wird eventuell dort glücklich.

Der Ansatz mit der FolderAction und einem Script auf dem USB Stick gefällt mir am besten. Allerdings habe ich das Script ein wenig für meine Bedürfnisse angepasst, da ich das Archivieren der Daten im Endeffekt Time Maschine überlassen möchte. Ausserdem habe ich eine Abfrage eingebaut, denn das Script startet in der ursprünglichen Form beim Anschließen eines Datenträgers ohne Rückfrage das Script rsync.app vom Stick, was Sicherheitstechnisch bedenklich ist.

Also folgend meine Lösung: (Der Code wurde größtenteils von hier kopiert und modifiziert)

Teil 1: Das Folderaction Script:

property backup_script : "rsync.app" (* add/change this string to match the name of your script *)
 
on adding folder items to this_folder after receiving these_volumes
tell application "Finder"
try
set the volume_list to every file of this_folder
 
(* go through all entries in /Volumes/ *)
repeat with i from 1 to number of items in volume_list
set this_item to the original item of item i of volume_list
if the kind of this_item is "Volume" then
set this_disk to (this_item as alias)
 
(* is this item the newly mounted disk? *)
if this_disk is in these_volumes then
 
(* iterate through all files in the root of disk *)
set searchCmd to "ls -d " & quoted form of POSIX path of this_disk & backup_script
(* check to see if a backup script is available *)
set searchResult to ""
try
set searchResult to do shell script searchCmd
end try
(* run the backup script *)
if (searchResult starts with "/Volumes") then
set backupFile to POSIX file searchResult as alias
display dialog "Backupscript auf Volume gefunden, backup ausführen?" buttons {"JA", "NEIN"} default button 2 with icon stop
if button returned of result is "NEIN" then return
open backupFile
end if
 
end if
end if
end repeat
on error error_message number error_number
if the error_number is not -128 then
display dialog error_message buttons {"OK"} default button 1
end if
end try
end tell
end adding folder items to

1. Kopiere das Script in den Script Editor

2. Speichern als… “Script” unter /Library/Scripts/Folder Action Scripts/

3.-  Mit 10.6 und folgenden: Öffne im Finder die Systempartition

Rechtsklicke auf /Volumes und wähle im Kontextmenü Folder Action Setup

– Mit 10.5 und früher: Öffne den Finder und wähle Gehe zu Ordner > /Volumes/

Öffne Folder Actions Setup (aus dem Dienstprogrammen)

Dragge das Ordnericon aus der Titelleiste des Finder Fensters auf das geöffnete Formular und klicke OK

4. Wähle im Dialogfenster das gespeicherte Script aus.

Teil 2: Das Script auf dem Datenträger

property display_notification : false
property backup_target : "Documents/Backups/" (* MUST be a folder location with trailing slash! Always relative to home folder *)
 
property rsync_params : "-aEz --delete-excluded"
(* END OF PREFERENCES *)
 
set WhereImRunningFrom to path to me
tell application "Finder"
 
(* NEVER run from the hard drive! comment: nice feature, thats why it stays!*)
set bootVolume to name of disk of home (* safety feature! *)
set NameOfDisk to name of disk of WhereImRunningFrom
if NameOfDisk is bootVolume then
beep
display alert "Should not run this script from the boot volume!"
return
end if
 
(* setup backup dir *)
set homeDir to path to home folder from user domain
set backup_folder to POSIX path of homeDir & backup_target
try
(* quick and dirty check to see if folder exists - must be a good way to do this in applescript? *)
do shell script "cd " & backup_folder
on error
try
do shell script "mkdir " & backup_folder
on error
display alert "There was an error creating the backup folder " & backup_folder
return
end try
end try
 
(* find source and target *)
set backupBase to NameOfDisk & "-Backup"
set targetDir to backup_folder & quoted form of backupBase
set sourceDir to quoted form of ("/Volumes/" & NameOfDisk & "/")
end tell
 
(* do the backup *)
 
set excluded to " --exclude='.Trash*' --exclude='.Spotlight*'  "
 
set theScript to "rsync " & rsync_params & excluded & sourceDir & " " & targetDir & "; touch " & targetDir
 
do shell script theScript
 
activate of me
beep
if display_notification then display alert NameOfDisk & " drive backed up"

1. Kopiere das Script in den Script Editor

2. Ändere die Konstante backup_targets, beachte dass das Script keine Adminrechte hat und deshalb nur in den Benutzerordner speichern kann!

3. Speichere das Script auf dem USB Stick als Application mit dem Namen rsync.app (oder dem Namen, der im anderen Script angegeben ist).

4. Teste ob es funktioniert! Beim erneuten Anschließen des USB Sticks sollte eine Warnung erscheinen, die fragt ob ein Backup erstellt werden soll.