Category Archives: Mac

Mac workflow: klikkmentes to do

Régen nagy örömmel használtam OS X alatt a Things alkalmazást. Ez egész odáig tartott, míg a fejlesztő srácok el nem kezdték ígérgetni a cloud sync támogatást, ami csak nem akart megérkezni – én pedig továbbléptem, előbb a The Hit List-re, aztán az OS X / iOS gyári Reminders alkalmazására, majd a német Wunderlist appra. Mindegyikkel volt valami bajom, aztán nemrég szembejött egy review, amiben újra nyakig dícsérték a Things-et, ezért úgy gondoltam, visszanézek – és nem bántam meg :)

Amivel már jó ideje kísérletezek az az, hogy a munka közben eszembe jutó teendőket minél kevesebb erőfeszítéssel rögzíthessem. Erre optimális lenne, ha a feladatkezelő alkalmazás korrektül scriptelhető lenne, én meg egy Alfred workflow-val beletolhatnám a mondandómat – ezt fogjuk most megcsinálni a Things mellé.

A Things-hez létezik már többféle Alfred workflow, én viszont egyikkel sem voltam elégedett. Olyat szerettem volna, amihez egy sorban kitölthetem a taskhoz tartozó összes paramétert mindenféle egerezés nélkül. Ehhez még hozzáálmodtam azt is, hogy felszedhetné az aktív Safari ablak URL-jét és az oldal címét, hátha csak épp azt akarom elmenteni. Tudom, van Reading list Safariban, amit viszont nem tudok taggelni és főleg fejlesztői doksiknál sokszor élem át azt, hogy emiatt nem találok meg egy korábban látott oldalt.

Szóval legyen benne task description meg task note kitaláló, de gyorsan állíthassak határidőt, feladatcsoportot és tageket is. Kitaláltam ehhez a következő szintaxist:

things-workflow-sample

Az eleje a feladat leírása, a @ után álló “3d print” a feladatcsoport (a Things nyelvén “project vagy area of responsibility”), a # utáni “Ultimaker” a feladatra akasztott címke, a > karaktert követő 1 érték pedig azt mondja a workflownak, hogy ez a munka holnap határidős. Mindezt látod is on-the-fly, ahogy gépeled be a feladatot. Csak elsőre hangzik bonyolultan, 5 task kézzel és már ott is van az izommemóriában :)

Ez pedig a Safari autofill – így néz ki, amikor felszedi az aktív Safari ablak címét és URL-jét:

things-workflow-safari-autofill-sample

A > karakter utáni dátummal tud minimálisat matekozni. Megadhatsz neki 8 (=YYYYMMDD), 6 (=YYMMDD), 4 (=MMDD), vagy 2 (=DD) jegyű dátumot – ha nem teljes a dátum, akkor a hiányzó darabokat az aktuális napi dátumból kiegészíti. Magyarul a >1201 ma 2014 december elsejét jelenti a workflownak.
Ezen túlmenően tud hozzáadni illetve elvenni napokat az aktuális dátumból: az első karakter az előjel, azt követi egy szám, majd az utolsó karakter opcionálisan jelölhet nap helyett hetet (w), hónapot (m) vagy évet (y). Egy példán keresztül: a mai napon gyártott to do-n a >+3w dátummatek 2014 december 17-ét állítja be due date-nek, mivel az van 3 hét múlva.

Ha tetszik és kipróbálnád, a workflow-t szedheted tőlem vagy a packal.org-ról is.

Update: kicsit szellősebbre vettem a parser által kitalált to do elemeket, illetve most már felismeri a @today és @someday targeteket is és a megfelelő Things listákba pakolja az így címzett to do itemeket:

things-alfred-workflow-v1_1

Mac workflow: iTunes playlist tagger

A probléma

Elég régóta használok tageket OS X alatt – a gyári óperenciás rendszerben még nem léteztek, már gyártottam őket valami toollal, ami openmeta kompatibilis volt. Amióta a Finderrel is lehet taggelni, azóta nem értem, hogy az iTunes médiaszörnyeteg miért nincs ugyanerre felkészítve. Számtalan alkalommal került már elő, hogy mondjuk hangulat alapján hallgatnék zenét, vagy mondjuk csak egy szál vékony női énekhangot akarok hallani – ilyesfajta keresésre pedig semmi nem képes.

Léteznek mindenféle toolok, amik ezt próbálják segíteni valahogyan: a Tangerine pl. ütemet próbál számolni, a Moody pedig egy 4×4 osztású 2D sebesség vs. hangulat mátrixba soroltatná veled a trackeket.

A megoldás

Mindkét fent említett játékos a trackekbe irkálna valami custom metaadatot, én viszont kitaláltam valami sokkal ügyesebbet! Egy track tetszőleges számú playlistben szerepelhet – legyen hát a playlist neve a tag, amit a trackre akasztunk! Már csak egy olyan eszköz kell, ami az aktuálisan játszott tracket gyorsan bedobálja ezekbe a “tag” playlistekbe anélkül, hogy ehhez egerezni kellene meló közben.
Szerencsére a platformon létezik Alfred, a csodás productivity tool, ami szénné scriptelhető, az iTunes meg nagy haverja az AppleScriptnek, úgyhogy már csak össze kell engedni őket.

Azt találtam ki, hogy ezek a speciális, tag-ként funkcionáló playlistek egy közös, “Tags” nevű playlist folderben fognak lakni és a nevük @ prefixxel kezdődik majd, így különböztetve meg őket a többi listától. Az Alfred workflow-nak pedig a következőket kell szolgáltatnia:

  • mondja meg, hogy épp mi szól
  • lássam egy listában az éppen lejátszott trackra összes releváns és irreleváns taget
  • egyszerre akárhány taget rápakolhassak az aktuális trackre

Nos, ilyen lett:

iTunes playlist tagger

Keyword vagy shortcut indítja. A listában zöld + ikonnal szerepelnek az aktuális trackre még nem ráakasztott, de egyébként létező tag-ek, piros – ikonnal pedig azok, amelyek már hozzá vannak rendelve. Értelemszerűen a pirosak törlik az adott tag-et, a zöldek hozzáadják.

Ez azonban a rendes power usernek még kevés lenne, mert mi van, ha több új tag-re van szükségünk? Ilyenkor jön az, hogy a “plst ” kulcsszó után space-szel elválasztva irkálhatjuk a tageket. Ha a tag neve – prefixszel kezdődik, akkor az a tag törlődni fog, ha + karakterrel (a + nem kötelező, a nem mínusz első karakter automatikusan +-at jelent), akkor pedig hozzácsapjuk az adott tracket. Így akármennyi taget írhatunk egymás után, a tagger script szép sorban feldolgozza őket egyesével.

Na de nem lennék rendes kocka, ha nem néznénk meg a forrást. Itt van a script filter rész, ami felépíti a kiválasztó listát:

on run argv
	set q to argv as text

(*
	if not (itunes_is_running()) then 
		set xml to xml & linefeed & "" & linefeed
		set xml to xml & "iTunes is not running" & linefeed
		set xml to xml & "Start iTunes and retry" & linefeed
		set xml to xml & "now_paused.png" & linefeed
		set xml to xml & "" & linefeed

		return xml & "" & linefeed
	end if
*)

	-- pick up info from iTunes
	tell application "iTunes"
		set dbid to the database ID of the current track
		set artist_name to (get artist of the current track)
		set track_name to the name of the current track
		set pls to (get name of user playlists)
	end tell

	-- xml header
	set xml to "" & linefeed
	set xml to xml & "" & linefeed

	-- track info list item
	set xml to xml & linefeed & "" & linefeed
	set xml to xml & "" & track_name & "" & linefeed
	set xml to xml & "" & artist_name & "" & linefeed
	set xml to xml & "now_playing.png" & linefeed
	set xml to xml & "" & linefeed

	-- add new tag list item
	set xml to xml & linefeed & "" & linefeed
	set xml to xml & "New Playlist Tag" & linefeed
	if q is equal to "" then 
		set xml to xml & "To remove tags use - prefix, e.g: slow -fast" & linefeed
	else
		set xml to xml & "" & q & "" & linefeed
	end if
	set xml to xml & "playlist_new.png" & linefeed
	set xml to xml & "" & linefeed

	return xml & getTags(dbid) & ""
end run

on getTags(dbid)
	-- assemble tag list

	set tags to ""
	tell application "iTunes"
		set artist_name to (get artist of the current track)
		set track_name to the name of the current track
		set pls to (get name of user playlists)
	end tell
	
	set tagsToRemove to {}
	set tagsToAdd to {}
	
	-- collect used/unused tags into lists
	repeat with pl in pls
		if pl starts with "@" then
			tell application "iTunes"
				set results to (every file track of user playlist pl whose database id is dbid)
			end tell
			
			if (count of results) > 0 then
				set end of tagsToRemove to pl
			else
				set end of tagsToAdd to pl
			end if
		end if
	end repeat
	
	repeat with pl in tagsToRemove
		set tags to tags & getItem("-", pl, dbid)
	end repeat
	
	repeat with pl in tagsToAdd
		set tags to tags & getItem("+", pl, dbid)
	end repeat
	
	return tags
	
end getTags

on getItem(prefix, myID, dbid)
	-- create tag list item

	set myIcon to ""
	tell application "iTunes"
		set track_name to the name of the current track
		set results to (every file track of playlist myID whose database id is dbid)
	end tell
	if (count of results) > 0 then
		set icon to "playlist_remove.png"
	else
		set icon to "playlist_add.png"
	end if
	
	set AppleScript's text item delimiters to "@"
	set myID to (text item 2 of myID)
	
	set myItem to ""
	set myItem to myItem & linefeed & "" & linefeed
	set myItem to myItem & "" & myID & "" & linefeed
	if prefix is equal to "+" then 
		set myItem to myItem & "Add this tag" & linefeed
	else
		set myItem to myItem & "Remove this tag" & linefeed
	end if
	set myItem to myItem & "" & icon & "" & linefeed
	set myItem to myItem & "" & linefeed
	
	return myItem
	
end getItem

on itunes_is_running()
	-- iTunes detect - too slow to use
	tell application "System Events" to return (exists process "iTunes")
end itunes_is_running

Ez pedig a tagger, ami a playlist managementet csinálja:

on run argv
	set q to argv as text

	-- create folder playlist for tags
	tell application "iTunes"
		if not (exists folder playlist "Tags") then make folder playlist with properties {name:"Tags"}
	end tell

	set tid to AppleScript's text item delimiters

	-- separate dbid and tags
	set AppleScript's text item delimiters to "|"
	set dbid to (item 1 of (text items of q))
	set tags to (item 2 of (text items of q))
	set AppleScript's text item delimiters to tid

	-- get list of tags
	set AppleScript's text item delimiters to " "
	set qList to text items of tags -- not text of, text items of
	set AppleScript's text item delimiters to tid

	-- collect add/remove tags
	set addTags to {}
	set removeTags to {}

	repeat with qItem in qList
		set prefix to (character 1 of qItem)
		if (prefix is not equal to "+") and (prefix is not equal to "-") then
			set qItem to "+" & qItem
		end if
		
		if character 1 of qItem is equal to "-" then
			set end of removeTags to getToken(qItem)
		else
			set end of addTags to getToken(qItem)
		end if
		
	end repeat

	-- add tags
	repeat with addTag in addTags
		tell application "iTunes"
			set tagFolder to folder playlist "Tags"
			if (exists playlist addTag) then
				set newTag to (playlist addTag)
			else
				set newTag to (make playlist at tagFolder with properties {name:addTag})
			end if
			
			
			set results to (every file track of playlist addTag whose database ID is dbid)
			if (count of results) = 0 then
				duplicate (current track) to newTag
			end if
		end tell
	end repeat

	-- remove tags
	repeat with removeTag in removeTags
		tell application "iTunes"
			set tagFolder to folder playlist "Tags"
			if not (exists playlist removeTag) then exit repeat
			
			set results to (every file track of playlist removeTag whose database ID is dbid)
			if (count of results) > 0 then
				delete (some track of playlist (removeTag as text) whose database ID is dbid)
			end if
		end tell
	end repeat
end run

on getToken(the_string)
	return "@" & text 2 thru length of the_string
end getToken

Ha idáig eljutsz, be kell írjak egy pirosat, annyira száraz az egész. Azonban ha hozzám hasonlóan dolgozol és neked is hiányzik az iTunes-ből a tagging funkcionalitás, akkor szeretnéd a toolt! Ha tetszik és használnád, innen vagy a packal.org-ról vihető a komplett workflow.

Mac workflow: arrange multiple windows

A probléma

  • több, egymás mellé pakolt ablakban szeretnénk dolgozni különböző szoftverekkel
  • az aktuális feladattól függően más-más alkalmazásablakokra van szükségünk más-más layouttal
  • az egyszer már jól beállított munkakörnyezetet a lehető legkevesebb pöcsöléssel szeretnénk újra beállítani

A megoldás

A layourok elmentéséhez Moom-ot fogunk használni. A Many Tricks alkalmazása rengeteg egyéb mellett képes arra, hogy az épp látható ablakok méretét és pozícióját úgynevezett Snapshotként elmentse és ezt az állapotot aztán visszaállítsa. Ezeket a snapshotokat aztán aktiválhatjuk a Moom menüjéből, vagy akár egy keyboard shortcut segítségével, de mi most inkább az Alfred nevű launchert fogjuk megkérni arra, hogy segítsen ebben.

Gyártunk Alfredben egy workflowt, ami egy script filterrel összeszedi nekünk a lementett snapshotokat, aztán pedig megkéri a user által kiválasztott snapshot beállítására a Moom-ot.

A nagyon szimpla workflownk így néz ki:

mooms-workflow-dataflow

A script filterünkbe egy Alfred által kívánt formátumú XML-t kell legyártanunk, majd azt átadnunk a launchernek, amiből ő megjeleníti a snapshot listát:

mooms-workflow-in-action

Így néz ki a script filterünk snapshot gyűjtést végző része:

tell application "Moom"
	set snaps to list of snapshots
	
	set xml to ""
	set xml to xml & ""
	
	repeat with snap in snaps
		set xml to xml & ""
		set xml to xml & "" & snap & ""
		set xml to xml & "/Applications/Moom.app"
		set xml to xml & ""
	end repeat
	
	set xml to xml & ""
	
end tell

return xml

Ezt a selectort már csak egy Applescript futtató elemmel kell összedrótozni, amiben megkérjük a Moom-ot a kiválasztott snapshot beállítására:

on alfred_script(q)
	tell application "Moom"
		arrange windows according to snapshot named q
	end tell
end alfred_script

Voila – az eredmény az Alfredből aktiválható snapshot lista. Lusták szedhetik innen.

Mac workflow: Alfred

Preface: száraz, geek bejegyzés jön, OS X addict kockáknak.

Jó ideje agyalok már, hogy egyszer megírom ezt a posztot. Nem biztos, hogy a legjobb időben, hiszen ősszel jön a Mac OS X Yosemite, amiben a Spotlight majd jól megokosodik. Én azonban nem játszottam még a bétával, a poszt tárgyául szolgáló Alfred viszont annál inkább a szívemhez nőtt.

Az Alfred a készítők definíciója szerint egy “productivity” alkalmazás, mely a korábbi Quicksilver, illetve a most is aktívan fejlesztett Launchbar launcherek konkurrense.

Most eltekintek attól, hogy a sok default Alfred jóságot részletesen ismertessem, azokról született már kismillió jó írás. Rettenet erő lakik a szoftverben, főleg, ha pénzt áldozol a 17 GBP-be kerülő PowerPack kiegészítésre. Amint van PowerPackod, már gyárthatod is a friss workflow-kat Alfredben. Én is csináltam sok ilyet és használok mások által fejlesztetteket – ebből szedtem most össze egy csokorra valót kedvcsinálónak. Lássuk a macit!

Uni-Call

FaceTime vagy Skype hívást tudok desktopról indítani anélkül, hogy az egeret használnám, így:

callf

calls

Currency converter

Árfolyamot vált, baromi gyorsan, bármiről bármire. Beállíthatod a kedvenc célárfolyamod default targetnek, de harmadik paraméterként bármikor konvertálhatsz tetszőleges másikra is:

curr1

curr2

curr3

Image dimensions

Kép méretét adja vissza azonnal:

dim1

dim2

Encode

URL/UTF8/Base64 formába konvertálja az inputot:

encode

Animgif search

giffy

Google translate

UI-ben tökölés nélkül fordítja az inputot azonnal. Csináltam belőle 3 targetet: magyarra, angolra és lengyelre:

gt-2hu

gt-2en

gt-2pl

Safari history search

h

IP és Mac addressek CLI nélkül, gyorsan

ip

mac

Disk space check azonnal

space

Compose mail

m

Keresés a menubarban egér nélkül

menu

Új file gyártása és azonnali megnyitása

nf

nfo

Cheatsheet azonnal

qr

Rate current iTunes track és add current iTunes track to singalong playlist

rate

singalong

Recent items

rec

rec-doc

rec-downloads

rec-folders

Save current URL with tags

save1

save2

Send current URL

send1

send2

Show all iCloud tabs

tabs

Timezones

tz

Ha kedvet csináltam, már megérte!

Solarized for OS X CLI

Tegnap megküzdöttem azzal, hogy solarized color scheme-et gyártsak az OS X Terminal és a vim alá. Eredmény egyetlen zip-ben erre.

terminal-solarized

terminal-solarized

A linkelt zipben van egy Solarized shell config, egy .vimrc és egy .vim folder – ez utóbbi kettő megy a home folderedbe, az elsőt meg nyitja a Terminal.

Vim-ben az F2 billentyű átkapcsol a solarized dark/light témák között, továbbá a .vim/plugin folderben lakik egy diacritics.vim, ami a vim-be töltött file ékezetlenítésére szolgál – ez utóbbihoz HOWTO erre.

Persze nem én találtam fel a spanyolviaszt, a fentiekhez csak túrni kellett a netet. A patchelt terminal configot Schorin Ionescu készítette, a Solarized téma pedig Ethan Schoonover érdeme.

Mac workflow: Tagged bookmarks

Már az OpenMeta tagging felfedezése óta használom OS X alatt a tageket (btw OpenMeta tagek: OS X 10.9 alatt bevezetett kMDItemOMUserTags tagekké konvertálására itt ez a csodás script). A 10.9 megjelenése óta várom, hogy majd csak belekerül a Safari bookmarkok mellé is a tagging lehetősége – aztán egy nap meguntam a várakozást és csináltam magamnak egy scriptet a probléma megoldására:

set defaultPath to "SYSTEM:Users:fns:Dropbox:URL" as alias

tell application "Safari"
	set theName to name of front document
	set theURL to URL of front document
end tell
set theName to replace_chars(theName, ":", " -")

tell application "Safari"
	activate
	set resultFile to (choose file name with prompt "Save .webloc File" default name theName default location defaultPath) as text
end tell

set text item delimiters to ":"
set fileName to last text item of resultFile
set filePath to text 1 thru lastpos(resultFile, ":") of resultFile
	
tell application "Finder" to make new internet location file at filePath to theURL with properties {name:fileName}

on replace_chars(this_text, search_string, replacement_string)
	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 ""
	return this_text
end replace_chars

on lastpos(textstring, thischar)
	return (length of textstring) - (offset of thischar in (reverse of text items of textstring as string))
end lastpos

Ha elindítod a scriptet, akkor az feldob egy file save requestert, amiben átírhatod a mentendő .webloc file nevét, illetve tageket definiálhatsz. Nálam az így mentett .webloc file-ok a Dropboxban tartott URL nevű folderbe kerülnek, így minden gépemre szépen szinkronizálódnak, metadatával együtt. A default mentési foldert ebben a sorban definiálhatod át:

set defaultPath to "SYSTEM:Users:fns:Dropbox:URL" as alias

A scriptet nálam egy Alfred workflow indítja, de futtathatod akár egy FastScripts keyboard shortcuttal, csinálhatsz belőle Automator service-et, vagy ahogy neked kényelmes – TIMTOWTD.

Mac workflow: screenshot megosztás

Józsinál olvastam az előbb, hogy szerinte az optimális megoldás screenshot megosztásra, ha bekapcsolja a Dropbox automata képernyőfotó uploaderét, ami majd feltölt minden screenshotot a cloudba. Én ettől kifejezetten viszolygok, viszont egészen hasonló, csak picit paranoidabban kontrollált megoldást használok ugyanerre. Józsi nem szereti a 3rd party szoftvereket, így neki ez a verzió valószínűleg nem játszik, de ha te is hozzám hasonló shareware junkie vagy, akkor neked még jól jöhet az én workflow-m.

Megosztásra én is a Dropboxot használom, csak épp nem hagyom neki, hogy hübele-Balázs mindent feltöltsön a felhőbe. Ehelyett létrehoztam a Dropbox folderben egy screenshots mappát, ami droptargetként kint van a dokkon és abba dobom a megosztandó screenshotot.
A folderen ül egy Hazel folder rule, ami a beérkező file nevéből kitalálja, hogy mi lesz a Dropbox URL, majd azt bepakolja a Clipboardra:

set file_path to theFile as text
try
	set text item delimiters to ":"
	set file_name to last text item of file_path
	set text item delimiters to ""
on error
	set text item delimiters to ""
end try

set file_name to (do shell script "/usr/bin/php -r 'echo rawurlencode("" & file_name & "");'")

set dropboxPath to "https://dl.dropboxusercontent.com/u/MYDROPBOXID/screenshots/" & file_name
set the clipboard to dropboxPath

A scriptben szereplő MYDROPBOXID szöveget a saját Dropbox ID-dre kell cserélni, hogy működjön a dolog. Ehhez elég, ha egyetlen, a Dropbox felhőben levő file URL-jét meglesed, ott van benne az ID.

Én ezen túl még “kettőre zárom” a dolgot: futás után megváltoztatom a file color labelét tagjét szürkére:

hazel-getdropboxlink-rule

A módszer egyetlen hátránya, hogy sokszor a Hazel rule előbb készül el a clipboardba rakott URL-lel, mint ahogy a file felérne a felhőbe, így ha gyorsan osztod meg a linket, akkor előfordulhat, hogy az még nem él. Ha a Dropbox folderében levő file-okról meg lehetne tudni valahogy, hogy azok felkerültek-e már a felhőbe, akkor ez a probléma is megoldódna.

Mielőtt bárki “de hát van stock Folder Acctions!”-t kiáltana, fűszerezzük meg még egy Hazel szépséggel: ha kidobnád, vagy csak archiválnád a screenshotjaidat, mert mondjuk zavar, hogy foglalja a Dropbox tárhelyed, akkor archiváltasd őket automatikusan:

hazel-removeoldscreenshots-rule

Ugyanezt persze meg lehetne csinálni saját tárhelyre FTP-zve is – akkor még a feltöltés-linkgyártás combo sem csúszna meg. Aki megírná ehhez a scriptet, nosza itt a comment box!-)

Update

Csak azért, hogy kiálljak a szerintem egyik leghasznosabb OS X alkalmazás mellett, olvastam Hazel doksit és megcsináltam az egészet Dropbox nélkül is. Ehhez mindössze egy FTP tárhelyre van szükséged – íme a rule:

hazel-screenshot-uploader-ftp-only-rule

A fenti scripthez képest természetesen csak a https://dl.dropboxusercontent.com/u/MYDROPBOXID/screenshots/ értékét kell arra a folderre változtatnod, ahova feltöltetted a képet.

A Mac Pro gyártása

Az Apple tegnapelőtt megmutatott egy klipet a világnak, amin az idén decemberben fogrlomba kerülő Mac Pro gyártásába engednek bepillantást. Greg Koenig, a Luma Labs tervezőmérnöke úgy gondolta, hogy elmagyarázza nekünk mezei usereknek, mit is látunk a két perces videóban (btw a Luma Labs gyártotta a szerintem tökéletes kameraszíjat, egész addig, míg egy versenytársuk úgy gondolta, hogy ennek véget vet). A hozzám hasonló automatizálás buziknak mind a videó, mind a szakkommentár kötelező darab – ha te is hasonlóan izgulsz az ilyesmire, akkor előbb nézd meg a videót:

Most pedig olvasd el Greg magyarázatát.

Mac workflow: másolás lockolt pdf-ből

Az EDF DÉMÁSZnak mostanában támadt az az ötlete, hogy a pdf-ben letölthető számlákba minden létező lockot bekapcsolnak, így nem megy a számlaszám másolása sem a clipboardra. Már épp írtam egy kéretlen mailt az ügyfélszolgálatukra, amikor fds barátom előállt a megoldással: Quick Look.
Mac-en ugyanis a pdf file-t Quick Look-kal megnyitva másolható annak tartalma.

A Mesternek jövök egy csülökkel.