Skip to content
accelerando

Category Archives: German posts

Apple AFP SharePoints

17-Dec-06

Im Moment baue ich einen Mac Mini Core Solo zum Media und Webserver aus. Für diesen Zweck hat das Gerät eine nette, externe Platte mit hinreichend Platz bekommen.

Hin- und herüberlegt: Wenn ich Samba nutze, müssen die Kennwörter des entsprechenden Accounts “unsicher” gespeichert werden. Das klingt nicht gut. Also habe ich mich für AFP entschieden.

Und da ging der Palaver los: Angemeldet, hmm, wo ist das Laufwerk? Stimmt, es werden immer nur die Homeverzeichnisse geshared. So eine Scheisse. Normalerweise findet man ja überall die Konfigurationsdatei, nicht so in diesem Fall. Und wir mir Tante Google gesagt hat, bin ich nicht der einzige der sie sucht. Hab sie auch nicht gefunden. Wenn das jemand weiß, wo das ist… Bitte eine kurze Email schreiben.

Jedenfalls, geholfen habe ich mir mit Sharepoints von HornWare. Entweder als Standalone oder als Pref Pane nutzbar und voila, externe Laufwerke lassen sich als AFP Sharepoint bereitstellen. Das Ergebnis:

afp

Fantastisch!

Alle sagen immer, der Mac Mini Core Solo wäre langsam, aber das muß man mal in Relation zu einem Mac Mini G4 oder einem PC in der Größe sehen. Das Dingen rockt.

Das fertige Ergebnis:

Apple Mac Mini Core Solo Server

Auf dem Rechner läuft übrigens auch Daily Fratze.

Blöde Kleinigkeit (es sind immer!!! die Kleinigkeiten): Warum hat Iomega nicht die Farbe gescheit hinbekommen? Die Platte (Iomega Minimax) ist sonst absolut super. Man kann sie per FireWire und USB gleichzeitig anschliessen und per DIP Schalter einen Anschluss auswählen. Das hat den Vorteil: Man kann beide Hubs (FireWire und USB nutzen). Das geht bei vielen billigen Platten nicht.

Das schöne an AFP ist, dass es ein sogenanntes transparentes Protokol ist. Das heißt, nutzende Programme bekommen nichts davon mit, dass ihre Dateien janz woanders sind. So kann man z.B. in iTunes beim Start die ALT Taste drücken und eine andere Bibliothek auswählen. Ganz transparent habe ich dann auf jedem Rechner die gleichen Daten. Der Vorteil gegenüber dem Musicsharing via iTunes: Ganz einfach, die Playcounts erhöhen sich, ich kann die Ratings ändern und sogar übers Netz CDs rippen.

Praktischerweise funktionieren so auch alle Skripte fürs Backup, genau wie bisher.

Reverse PathIterator

24-Apr-06

Ein PathIterator ist in Java eine elegante Möglichkeit, alle Knoten und Kanten einer Form zu iterieren. Was dem eingebauten PathIterator leider fehlt, ist die Möglichkeit, die Form umgekehrt zu iterieren.

Nach eingem Suchen bin ich auf die tolle Klasse ReversePathIterator von caff.de gestoßen: Reverse PathIterator, mit Quelltext und allem. Sehr praktisch, zumal er sich vollkommen transparent statt des Originals nutzen lässt.

Haufenweise: Bulk Insert, Update, Delete

24-Apr-06

Bulk Methoden in PL/SQL sind praktisch und schnell. Auch recht einfach anzuwenden. Allerdings ist mir in Oracle 9.2.0.6 ein sehr komisches Verhalten aufgefallen:

DECLARE
  TYPE id_table IS TABLE OF NUMBER;
  objekt_ids id_table;
BEGIN
    SELECT id
    BULK COLLECT INTO objekt_ids
    FROM   irgendwas
    WHERE  irgendwasanderes = 'wasweißich';
 
    FORALL idx IN objekt_ids.first .. objekt_ids.last
      DELETE FROM table1 WHERE objekt_id = objekt_ids(idx);
 
    FORALL idx IN objekt_ids.first .. objekt_ids.last
      DELETE FROM table2 WHERE objekt_id = objekt_ids(idx);
 
    -- ...
END;

Das Beispiel ist jetzt natürlich erstmal sinnlos, ist aber auch egal. Der Haken an der Sache: Das BULK COLLECT INTO Statement wirft keine NO_DATA_FOUND Exception, wenn die Ergebnismenge leer ist (im Gegensatz zu einem normalen SELECT INTO). Nichts desto trotz ist object_ids danach eine korrekt initialisierte Zusammenstellung.

War die Ergebnismenge leer, gibt es trotzdem eine Exception. Und zwar eine INVALID_NUMBER. Aus irgendeinem Grund laufen die forall Schleifen, auch wenn die virtuelle Tabelle leer ist.

Deshalb gilt für BULK Methoden: Abfragen, ob die Indextabellen leer sind!

DECLARE
  TYPE id_table IS TABLE OF NUMBER;
  objekt_ids id_table;
BEGIN
  IF(objekt_ids.COUNT > 0)THEN
    SELECT id
    BULK COLLECT INTO objekt_ids
    FROM   irgendwas
    WHERE  irgendwasanderes = 'wasweißich';
 
    FORALL idx IN objekt_ids.first .. objekt_ids.last
      DELETE FROM table1 WHERE objekt_id = objekt_ids(idx);
 
    FORALL idx IN objekt_ids.first .. objekt_ids.last
      DELETE FROM table2 WHERE objekt_id = objekt_ids(idx);
 
    -- ...
  END IF;
END;
Close
E-mail It