In eigener Sache: Jobsuche mal anders

Hallo zusammen,

Ich suche eine Job, vorzugsweise als Apple-Techniker/-Supporter. Der Blog ist vielleicht nicht der ultimative Weg einen Job zu suchen (auch nicht der einzige für mich), doch wäre es vermutlich ziemlich dumm, nicht auch hier die Möglichkeit zu ergreifen.
Sollte also jemand eine entsprechende vakante Stelle in Aussicht haben und nach einem kreativen, motvierten und lernbereiten neuen Mitarbeiter suchen. Holá me llamo Hubi. I can repair PCs and Macintosh Computers. Ich bin ausgebildeter System-Elekotroniker mit >5 Jahren Berufserfahrung und war neben einer längeren Beschäftung bei einem “nahmhaften” Apple-Serviceprovider, über ein Jahr in der Veranstalltungsbranche tätig (Netzwerktechnik und Boxen schleppen). Ich lerne Windows und iOS gerade so richtig kennen, verstehen und zeitweise verabscheuen und bin ein Terminal-Fan. Ich mag auch Pinguine und kleine Teufel. Ich bin zeitweise etwas exzentrisch, gestehe mir aber auch gerne Fehler ein(meine eigenen und auch die von anderen) ;-P.
Ich bin auch dankbar für jeden Hinweis, Tips oder Anregungen, sei es via Kommentar oder Email.

Yours Hubi

AppleScript: der etwas andere Aufruf eines AppleScript Handlers

Manchmal hat man einen Haufen Handler in AppleScript. Respekt, wenn man den Nerv hat, das alles sauber, in insich stimmige Handler zu verfrachten. Das ist ein guter Weg und macht Änderungen am späteren Code (gerade bei längeren Skripten) um einiges unkomplizierter. Nur wenn man ein solches Handler-Konstrukt aufgebaut hat, ist es vom Code oft ziemlich aufwendig (viel zu tippen) diese dann auch auszuführen und kann am Ende auch wieder unübersichtlich werden.
Nach eine Anfrage an mich, habe ich mir mal ein paar Gedanken dazu gemacht und bin zu diesem Code-Beispiel gekommen.

Continue reading

Adressbuch: Adressbucheinträge an Hand des Mailaccounts einer Gruppe zuordnen

Die Idee ist folgende, alle Leute die jemanden über einen bestimmten Email-Account kontaktieren, sollen in eine Gruppe im Adressbuch einsortiert werden. Gibt es noch keinen Adressbuch-Eintrag zu der Email, wird ein neuer angelegt und entsprechend einsortiert.
Das ganze läuft entweder als Email-Regel oder kann auch bei Skript-Aufruf auf eine Auswahl von Nachrichten angewendet werden. Die Namen der Gruppen kann im Skript über das Property: AddressBookGroups definiert werden, ansonsten wird einfach der Account-Name als Gruppen-Name verwendet.

-- hubionmac.com 17.02.2012
-- AppleMail Script, zum Anhängen an eine Regel oder zum Anwenden auf eine Auswahl in Mail
-- Ordnet Email-Adressen in Adressbucheinträgen Gruppen zu, bzw. legt neue Einträge im an
-- und fügt diese dann einer entsprechenden Gruppe zu. (angefragt von M.Lach)
global AddressBookGroups, proccessed_mails, alreadyThere_counter, add_counter, created_counter, duplicat_counter

--liste mit Zuordnung {{< ;Account-Name,Gruppenname im Addressbuch}}
--Wenn die Zuordnung nicht passt, wird der Account-Name benutzt.  
property AddressBookGroups : {{"hubionmac.com", "hubionmac"}, {"Bla.com", "BlaFasel-Group"}}

using terms from application "Mail"
  on perform mail action with messages theMessages for rule theRule
    try
      my addEmailToAddressBook_Group(theMessages)
    on error msg
      display dialog msg
    end try
  end perform mail action with messages
  
  on run
    try
      tell application "Mail"
        set theMessages to selection
        my addEmailToAddressBook_Group(theMessages)
      end tell
    on error msg
      display dialog msg
    end try
  end run
end using terms from

on addEmailToAddressBook_Group(theMessages)
  set proccessed_mails to {}
  set alreadyThere_counter to 0
  set add_counter to 0
  set created_counter to 0
  set duplicat_counter to 0
  tell application "Mail"
    repeat with theMessage in theMessages
      set thesender to sender of theMessage
      --manchmal stimmen Abensender und Antwort-Adresse nicht überein...
      set replyto to reply to of theMessage
      if replyto contains "< ;" then
        set replyto to (characters ((offset of "< ;" in replyto) + 1) through ((offset of ">" in replyto) - 1) of replyto) as rich text
      end if
      set theSenderName to ""
      --email adresse und ggf. Name aufsplitten
      if thesender contains "< ;" then
        set theMailAdress to (characters ((offset of "< ;" in thesender) + 1) through ((offset of ">" in thesender) - 1) of thesender) as rich text
        set theSenderName to (characters 1 through ((offset of "< ;" in thesender) - 2) of thesender) as rich text
      else
        set theMailAdress to thesender
      end if
      --manchmal stimmen Abensender und Antwort-Adresse nicht überein... wir nehmen dann mal die Antwort-Adresse sofern diese eine andere ist
      if replyto ≠ theMailAdress then set theMailAdress to replyto
      --ab hier lohnt es sich nur noch weiterzumachen, wenn die Email Adresse in diesem Durchlauf noch nicht vorkam
      if proccessed_mails does not contain theMailAdress then
        set proccessed_mails to proccessed_mails & theMailAdress
        --den Account Namen auslesen und so ggf. einer Gruppe im
        --Adressbuch zuordnen, ansonsten einfach den Account namen verwenden
        set theaccount to name of account of mailbox of theMessage
        set thegroupname to theaccount
        repeat with AddressBookGroup in AddressBookGroups
          if item 1 of AddressBookGroup = theaccount then
            set thegroupname to item 2 of AddressBookGroup
            exit repeat
          end if
        end repeat
        
        tell application "Address Book"
          --gibt es die EINE Gruppe eigentlich schon? sonst anlegen
          set groupexists to (count of (every group whose id does not end with "SmartGroup" and name is thegroupname)) ≥ 1
          if groupexists is false then
            my notifyMe("Status", "Neuigkeiten:", "Die Gruppe \"" & thegroupname & "\" gibt es noch nicht…")
            make new group with properties {name:thegroupname}
            save
            my notifyMe("Status", "", "jetzt schon... ")
          end if
          
          --gibt es denn schon eine Person mit dieser Email-Adresse?
          set foundpersons to (every person whose value of every email contains my delete_space(theMailAdress as text))
          if (count of foundpersons) = 0 then
            --in dem Fall gibt es die Adresse noch gar nicht, also anlegen
            set thenewperson to make new person with properties {first name:theSenderName, note:"Per Mail-Skript hinzugefügt"}
            make new email at end of emails of thenewperson with properties {label:"Arbeit", value:theMailAdress}
            add thenewperson to group thegroupname
            save
            set created_counter to created_counter + 1
          else if (count of foundpersons) > 0 then
            repeat with theperson in foundpersons
              set thispersons_groups to name of groups of theperson
              if thispersons_groups contains thegroupname then
                --Kontakt exisitiert bereits und wurde auch schon der entsprechendn Gruppe zugeordnet
                set alreadyThere_counter to alreadyThere_counter + 1
              else
                --Kontakt gib es zwar schon, aber er ist noch nicht in der Gruppe
                add theperson to group thegroupname
                save
                set add_counter to add_counter + 1
              end if
              --wenn es mehr als nur eine Person mit der gleichen Email gibt,
              --kann man das ja zumindest mal vermerken
              if (count of foundpersons) > 1 then
                set duplicat_counter to duplicat_counter + 1
                if note of theperson does not contain "-Email ist doppelt-" then
                  set note of theperson to (note of theperson & "\n-Email ist doppelt-") as text
                  save
                end if
              end if
            end repeat
          end if
        end tell
      end if
    end repeat
  end tell
  set totalcount to created_counter + add_counter + alreadyThere_counter
  my notifyMe("Status", "Neuigkeiten:", "Zur Gruppe \"" & thegroupname & "\" wurden " & totalcount - alreadyThere_counter & " Adressen hinzugefügt.\nUnverändert: " & alreadyThere_counter & "\nHinzugefügt: " & add_counter & "\nNeu angelegt: " & created_counter & "\n\ngeprüft total: " & (count of theMessages))
  if duplicat_counter > 0 then
    my notifyMe("Status", "Achtung:", "Von den Emails waren " & duplicat_counter & " in mehr als einem Adressbuch-Eintrag vorhanden, das kann ja gewollt sein, wurde aber in den Notizen vermerkt (Suche: Email ist doppel).")
  end if
end addEmailToAddressBook_Group
to delete_space(thestring)
  try
    --delete every double-space...
    set AppleScript's text item delimiters to " "
    set theparts to every text item of thestring
    set AppleScript's text item delimiters to ""
    
    set finalparts to {}
    repeat with t in theparts
      if t as text is not "" then
        set finalparts to finalparts & t
      end if
      
    end repeat
    set AppleScript's text item delimiters to " "
    set theparts to finalparts as text
    set AppleScript's text item delimiters to ""
    --replace spaces at the end of line (if new line comes after it) +++and at beginning
    return replace_chars(replace_chars(theparts, " \r", "\r"), "\r ", "\r")
  on error msg
    display dialog "error on delete_space" & return & msg
  end try
end delete_space

on notifyMe(theType, theTitle, theContents)
  --show growl information if available otherwhise display a timedout alert
  --theType -> "status" or "error" 
  --theTitle -> The title of the Message
  --theContents -> The message/info itself
  tell application "System Events"
    set GrowlRunning to (count of (every process whose bundle identifier is "com.Growl.GrowlHelperApp")) > 0
  end tell
  if GrowlRunning is true then
    tell application id "com.Growl.GrowlHelperApp"
      set the allNotificationsList to ¬
        {"Status", "Error"}
      set the enabledNotificationsList to ¬
        allNotificationsList
      register as application "Address Book" all notifications allNotificationsList ¬
        default notifications enabledNotificationsList ¬
        icon of application "Address Book"
      notify with name ¬
        theType title ¬
        theTitle description ¬
        theContents application name "Address Book"
    end tell
  else
    --das lassen wir hier mal sein
    (**activate
  if theType = "status" then
   display alert (theTitle & return & return & theContents) as informational giving up after 2
  else
   display alert (theTitle & return & return & theContents) as warning giving up after 2
  end if**)
  end if
end notifyMe

to replace_chars(this_text, search_string, replacement_string)
  try
    if this_text contains the search_string then
      set AppleScript's text item delimiters to the search_string
      set the item_list to every text item of this_text
      set AppleScript's text item delimiters to the replacement_string
      set this_text to the item_list as string
      set AppleScript's text item delimiters to ""
    end if
    return this_text
  on error msg
    display dialog "error on replace_chars" & return & msg
  end try
end replace_chars
									

Address Book: Normale Gruppen von Smart-Groups unterscheiden

In den Adress-Buch-Funktionsverzeichnis gibt es als Property nur den Namen und leider keinen Wert den man auslesen könnte, um zu erkennen, ob es sich um eine Smart-Group oder eine echte Gruppe handelt. Um das nun doch zu können sind zumindest die jeweiligen IDs der Gruppe recht eindeutig und enden ggf. mit dem String “SmartGroup”.
Möchte man zum Beispiel alle Namen der normalen Gruppe:

tell application "Address Book"
 set groupnames to name of every group whose id does not end with "SmartGroup"
end tell
									

BLADE SCOUT CX RTF 3 KANAL HELIKOPTER

Ich bin sichtlich begeistert von diesem genialen Hubschrauben. Nur einen neuralgischen Punkt scheint die Kiste leider zu haben, denn die oberen Rotor-Blätter sind bei 3 von 4 Hubschraubern nach kürzester Zeit kaputt gegangen. Die Rotor-Blätter stecken in der Mitte mit kleinen Stiften in einer Halterung, die an der Antriebswelle befestigt ist. Diese Stifte halten die Belastung bei Flugfehlern nicht auf Dauer aus. Als um Himmels Willen den Motor abschalten, wenn die Rotoren den Boden oder eine Wand berühren, ansonsten zertrümmert der kleine diese Halte-Stifte recht zuverlässig.

PDF: Dynamisches Wasserzeichen mit SVG->PDF Overlay

Ich habe einen neuen Trick gefunden automatisch PDFs zu erstellen, ohne dabei auf allzu teure (Indesign, Quark), komplizierte (ruby pawn z.B.) oder nicht gerade performante Tools (Pages, Word) angewiesen zu sein. SVG-Dateien sind quasi nichts anderes als XML bzw. Text-Dateien, und lassen sich leicht per Skript manipulieren. Zudem lassen sich auch exakte Format-Angabe (A4, Letter usw.) definieren.

Das Wandeln von SVG in PDF übernimmt dann Inkscape und zwar als Shell-Anwendung. Auf diese Art lassen sich schnell (ohne GUI) PDFs erstellen, die anders als bei der wkpdf-Lösung auch über einen Transparente Hintergrund verfügen.
Ich habe jetzt kein direktes Beispiel zur Hand, verweise aber mal /Applications/Inkscape.app/Contents/Resources/bin/inkscape-bin --help

Mail: Bewege flagged Emails in Ordner XY

Es ist schon erstaunlich, dass es keine Regel in Apple Mail zu geben scheint, mit der man markierte (diese kleine rote Flage) Emails automatisch in einen anderen Ordner verschieben kann… hm Vielleicht weil die Regeln in der Regel nur auf neue Emails angewendet werden, die von Natur aus nicht markiert sind…
Nun, dieses Skript springt sofort auf markierte E-Mails an und verschiebt diese in definierbaren Ordner. In den Einstellungen die am Anfang des Skriptes gemacht werden können, kann der Account-Name, die zu durchsuchenden Ordner (Plural!) und der Zielordner angegeben werden. Um auch verschachtelte Ordner als Quelle oder Ziel angeben zu können, werden diese “Pfade” als Liste eingegeben… Erläuterung im Quelltext…
Ein netter Zusatz ist die Abfrage, ob Mail überhaupt läuft. So wird ein unfreiwilliger Start von Mail durch das Skript (z.B. via crontab) verhindert.

--10.12.2011 hubionmac.com
--Beweg Emails die markiert sind in einen anderen Ordner
-- In den Prefs können als Quelle mehrere Ordner angegeben werden
-- Unterordner werden in Form einer Liste angegeben z.B. um den Ordner Bla im Ordner Fasel anzugeben -> {"Fasel","Bla"}
--Beim Ziel-Ordner kann wahlweise angegeben werden, ob es sich um einen lokal oder ggf. um einen IMAP-Ordner des jeweiligen Accounts handelt

set theprefs to {¬
  {AccountName:"hubionmac.com", SourceFolders:{{"INBOX"}, {"Archive", "Kleiner Test"}}, DestinationFolder:{"Sammel", "Lager"}, DestinationFolderIsLocal:false}, ¬
  {AccountName:"gmx.net", SourceFolders:{{"INBOX"}, {"bla", "blafasel"}}, DestinationFolder:{"Sammel", "Lager"}, DestinationFolderIsLocal:false} ¬
    }
--prüfer erst mal ob Mail läuft… denn extra gestartet werden soll es deswegen mal nicht
tell application "System Events"
  set MailIsRunning to (count of (every process whose bundle identifier is "com.apple.mail")) > 0
end tell
end
if MailIsRunning then
  tell application "Mail"
    repeat with todo in theprefs
      set AccountName to AccountName of todo
      set SourceFolders to SourceFolders of todo
      set DestinationFolder to DestinationFolder of todo
      set islocal to DestinationFolderIsLocal of todo
      set TheDestinationFolder to my getFolderReference(AccountName, DestinationFolder, islocal)
      repeat with SourceFolder in SourceFolders
        set TheSourceFolder to my getFolderReference(AccountName, SourceFolder, false)
        -- get the mails that are interesting
        set themails to (every message of TheSourceFolder whose flagged status is true)
        
        --movethemails
        repeat with themail in themails
          move themail to TheDestinationFolder
        end repeat
      end repeat
    end repeat
  end tell
end if

on getFolderReference(AccountName, DestinationFolder, isAlwayslocal)
  tell application "Mail"
    set TheDestinationFolder to ""
    set islocal to (get account type of account AccountName is pop)
    if isAlwayslocal = true then set islocal to true
    repeat with FolderName in DestinationFolder
      if islocal then
        if FolderName as string ≠ "INBOX" then
          if TheDestinationFolder = "" then
            set TheDestinationFolder to mailbox FolderName
          else
            set TheDestinationFolder to mailbox FolderName of TheDestinationFolder
          end if
        else
          set TheDestinationFolder to mailbox FolderName of account AccountName
        end if
      else
        if TheDestinationFolder = "" then
          set TheDestinationFolder to mailbox FolderName of account AccountName
        else
          set TheDestinationFolder to mailbox FolderName of TheDestinationFolder
        end if
      end if
    end repeat
    return TheDestinationFolder
  end tell
end getFolderReference

									

Um das Skript immer mal wieder ablaufen zu lassen, kann man z.B. den crontab nutzen. Dazu am einfachsten via CronniX einen solchen für den aktuellen Nutzer einrichten und das Script mit dem Befehl osascript /Pfad/zur/.scpt-Datei alle x-Minuten laufen lassen. Wie so ein Intervall einzurichten ist, wird sehr gut in der Cronnix-Hilfe erläutert. (was lange währt wird endlich programmiert Thorkillar :-) )

Episoden Benenner – Episode Namer

Ich bin ja leidenschaftlicher Serien-Gucker, nur das Bennen der aufgezeichneten Sendungen nervt auf Dauer. Deshalb habe ich mir ein kleines Skript gebaut, mit dem sich die Dateien quasi von selber umbenennen.
Das läuft so ab, die Dateien haben meist schon eine teilweise korrekte Namensgebung, z.B. die Laufende Nummer (Folge 23.mp4) oder “S01E03.mp4” oder einfach direkt der Titel “Mr Monk unterwegs als Weihnachtsmann.mp4”.
Jetzt habe ich mir von meinen Lieblings-Serien Episoden-Listen erstellt in der Form:
LaufendeNummer → Season Nummer → EpisodenNummer → Episoden Titel als tab separierte Text-Datei. Diese Benutzt dann das Skript zum erstellen eines Index. Jetzt muss ich nur noch die Datei auf das Skript ziehen, angeben um welche Serie es sich handelt, woran das Skript die jeweilige Episode erkennen kann und wie ich die Episoden benannt haben möchte… zack sind 100 Episoden entsprechend benannt. Zur Sicherheit speichert das Skript aber auch noch den alten Dateinamen im Kommentar der Datei ab.

Episode Benenner (449 downloads)