Category Archives: workflow

Mac workflow: Markdown to MS Word .docx

Ma szembejött két állásajánlat is, amiben a fejvadász kikötötte, hogy az önéletrajzot és a cover lettert is csak Microsoft Word .docx formátumban hajlandóak elfogadni. Én az ilyesmit Markdownban tartom, a Word dokumentumoktól meg az Isten óvjon, úgyhogy a pandoc becenevű fegyverrel tüzeltem az ajánlatokra:

brew install pandoc
pandoc -o cv.docx -f markdown -t docx cv.md

A pandoc az a minden OS-re megírt svájci bicska, amit először kell körbenézni akkor, ha valaha arra lenne szükséged, hogy két különböző markup formáttum között konvertálj.

Update: ha ezen fellelkesültél volna és mondjuk innentől minden Markdown doksit is CLI-ből szeretnél PDF formátumúvá konvertálni, az sem lehetetlen. A pandoc ehhez a pdflatex binárist használja, ami a basictex csomagban lakik eltemetve, de mi kibányásszuk:

brew cask install basictex
ln -s /Library/TeX/texbin/pdflatex /usr/local/bin/pdflatex

Innentől látszik a pdflatex a pandocnak, már onthatjuk a README.pdf-eket:

pandoc -o README.pdf -f markdown README.md

Mac workflow: hátha SONOSt hoz a Jézuska

Régóta szerettem volna rendes multiroom audio rendszert, valami olyat, amit én is könnyen bővítgetek és persze ami nem zárt, hanem beszélgethetek vele elektromosan. Long story short: az eddig használt Apple AirPlay nem ilyen, sőt, több sebből vérzik:

  • Apple === zártság, ezt tudtuk eddig is. Persze AirPlay servert azért csinálhatunk egy Raspberry Pi-ből, használhatunk hozzá egy kis Airport Expresst vagy egy Apple TV-t ha elég annak az egy darab digitális audiokimenete, de ezekhez még mind speakert kell illesztenünk ugye.
  • Az AirPlay lagos. Isten látja lelkemet, amióta az AirPlay megjelent, azóta várom, hogy majd a szuper mérnökök megoldják azt, hogy az egymástól 10 méterre levő két hangszóróból egyszerre szóló zene ne legyen a késés miatt visszhangos, de a 2010 szeptembere óta létező AirPlay a mai napig késik, úgyhogy épp 6. éve már, hogy képtelenek orvosolni a bosszantó problémát.
  • Ahhoz, hogy AirPlayen játszak le, a mai napig futnia kell egy AirPlay targetre zenét küldő szoftvernek valami dedikált frontend vason.

Sokat olvastam már a SONOS-ról, csábított is, de az Apple Music támogatás hiánya mindig vissza tartott. Pár hónapja azonban megjött a SONOSokba ez is, úgyhogy az idei karácsonyi hajrában bevásároltunk egy kazal speakert.

A SONOS speakerek saját maguk cibálják el a zenét a forrásból, a controller szoftvernek csak addig kell futnia, amíg te kiválasztod, hogy mit akarsz hallgatni, melyik hangszórókon és milyen hangerőn. Hab a tortán, hogy brit szoftveresek rég meg tudták oldani a lag problémát: az összes hangszóró teljes szinkronban tolja ugyanazt a kontentot.

Ez így közel tökéletes lenne, ám nekem sokszor jött elő munka közben, hogy egy playlistben olyan track került sorra, ami zavart. Ilyenkor taskot kell váltani meg egerezni ahelyett, hogy a billentyűzet elengedése nélkül foshatnám a kódot. Na ezért született a SONOS Controller workflow.

A SONOS Controller egy Alfred 3-ba begyógyítható workflow. Az agyát nem én írtam, hanem 2012-ben itt Sydneyben a Music Hack Day nevű eseményen kezdte Rahim Sonawalla, majd egy csodálatos Python fejlesztői közösség gyűlt köré és tartja karban a projektet a mai napig.
Ahhoz, hogy az általam hackolt Alfred workflow bármit is csináljon a SONOS speakereiddel, előbb a SoCo python classt kell installálnod mondjuk a Python csomagkezelőjével:

pip install soco

Eszembe nem jutott zeneválasztó funkcionalitást gyártani, hiszen egyfelől a SONOS kismillió adatforrásból képes audiot lejátszani, másfelől erre tökéletesek a desktop és mobil appok, amiket a gyártó ingyen kínál, végül pedig nem ez volt a cél, hanem csak annyi, hogy meló közben gyorsan tracket léptessek, halkítsam/hangosítsam a cuccot, vagy megállítsam a streamet, mindezt úgy, hogy a kezemnek ne kelljen elhagynia a billentyűzetet.

A workflow két keywordöt ismer:

  • sc - ha ezzel a kulcsszóval indítasz, akkor az összes zónát vezérled egyszerre:
    soco_alfred-commands_on_selected_zone
  • scs - ez a kulcsszó pedig előbb összeszedi a LAN-odon látható SONOS speakereket, amikből választasz egyet, majd ezután kapod a parancsmenüt, ami így értelemszerűen a már az előbb kiválasztott speakerre fog vonatkozni:
    soco_alfred-zone_selector

A parancslista sincsen széjjel bonyolítva:

  • play - elindítja a lejátszást
  • pause - megállítja a lejátszást
  • next - a következő trackre ugrik
  • inc - emel a hangerőn 5%-ot
  • dec - csökkent a hangerőn 5%-ot
  • vol XX - beállítja a hangerőt XX% értékre, ha XX-nek 0-100 közötti egész számot definiáltál:
    soco_alfred-set_volume

Az ikonokon nem megbotránkozni, én Mórickáztam össze őket éjjel amíg ti alukáltatok (a 10 óra timezone offset legrosszabb tulajdonsága, hogy az azonnali agymenéses petprojecthez nem tudok leakasztani egy ingyendesignert :))

A workflowt szokás szerint szedheted a packal.org-ról vagy tőlem. Boldog Karácsonyt!

Mac workflow: Alfred set color label

A probléma

Egér nélkül akarjuk a Finderben kiválasztott elemek color label tag-jét beállítani.

A megoldás

Csinálunk hozzá Alfred workflow-t.

A workflow kétféleképpen használható:

  1. Van benne 8, paraméter nélkül használható keyword: lred, lorange, lyellow, lpurple, lblue, lgreen, lgray, lnone - ezek értelemszerűen a nevekben szereplő színűre állítják a kiválasztott Finder elemeket.
    set-color-label_workflow2
  2. Az "scl" kulcsszóval és az utána írt color paraméterrel ugyanígy beállítja a kívánt színt a Finder által használt 7 féle variációból:
    set-color-label_workflow1

A workflowt szedheted a packal.org-ról, vagy tőlem innen.

Mac workflow: textfile to Reminders items

Rövid, de annál szárazabb, scriptelős post lesz. Mivel bármilyen unalmas contentet jótékonyan meg tud támogatni akár egy irreleváns kép is, ezért itt egy panoráma a Tátrából, mielőtt scriptet kéne olvasnod:

Tatra panorama

Erától kaptam szép hosszú szerelmetes levelet to-do listát emailben, amit nekem kényelmesebb lenne kipipálgatni egy Reminders listában. Szerencsére van egy kis eszünk, AppleScriptünk, meg a Remindersnek AppleScript supportja, úgyhogy csak bemásoljuk az emailből a hosszú listát a clipboardba, aztán ráeresztjük ezt a scriptet és voila:

tell application "System Events"
	set myText to paragraphs of (the clipboard as text)
end tell
repeat with myLine in myText
	if length of myLine is greater than 0 then
		tell application "Reminders"
			tell list q
				make new reminder with properties {name:myLine}
			end tell
		end tell
	end if
end repeat

Mac workflow: Alfred translate-shell CLI translation

Régóta küzdök a különböző dictionary megoldásokkal - legutóbb pl. a dict.cc szótáraihoz csináltam Alfred workflowt.
Nemrég szembejött a csodás shell-ben való fordításhoz írt translate-shell, amely használja a Google Translate, Bing Translator és a Yandex online service-eket, ráadásul a fejlesztők naprakészen tartják az alkalmazást, így ha a Google teker egyet az API-n, csak a translate-shellt kell frissíteni és már működik is újra minden. Ez kell nekem, ebből csináltam is gyorsan egy Alfred workflow-t (a workflowban szerepel egy, az Alfred 3 által bevezetett var/arg manipulator widget, így Alfred 2-vel nem lesz kompatibilis, de mivel az Alfred 3 már kijött a bétából, így ez nem lehet gond).

A trans workflow "trans" keywordjét a translate-shell szintaxissal kell használni:

trans-keyword

trans-output

trans-multilang

trans-multilang-output

A nyelv-specifikus keywordöknél a target language előre definiált és a kifejezéseket nem kell idézőjelbe tenned:

thu-keyword

trans-output

A trans workflow-t viheted innen, vagy a packal.org-ról.

Mac workflow: Alfred dict.cc translation

Azonnali fordításhoz (=nem akarom levenni a billentyűzetről a kezem ahhoz, hogy lefordítsak egy szót) jó ideig nagy örömmel használtam a Thomas Hempel féle Alfred Google Translate workflow-t, ám a Google egy ideje DDOS attacknak veszi a workflow ismétlődő lekérdezéseit és ez azt eredményezi, hogy viszonylag gyorsan kizár a szolgáltatásból egy teljes napra. Nem volt mese, más fordító megoldás után kellett nézni - így akadtam rá a dict.cc-re.

Innen már csak pár lépés volt Raphael Baron dict.cc-hez írt Python kódja, onnan meg Thomas Hirsch Alfredre szabott workflow-ja.
Thomas megoldása sajna bedrótozta a workflowba, hogy az angol->német irányban fordítson, viszont a dict.cc angolról és németről számos más nyelvre képes fordítani, így csak egy picit kellett megpiszkálni a workflowt ahhoz, hogy angol<->magyar és angol<->lengyel irányokban is fordítson:

dict_cc-en-hu

dict_cc-hu-en

dict_cc-en-pl

dict_cc-pl-en

Újabb forrás->cél nyelv hozzáadásához csak újabb script filtert kell létrehozni:

dict_cc-definitions

amiben csak ezeket kell cserélgetned:

dict_cc-script-filter-details

A workflow-t szedheted tőlem, vagy a github forkból.

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 4x4 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 & "<item uid=\"itunes_not_running\" arg=\"itunes_not_running\" valid=\"no\">" & linefeed
		set xml to xml & "<title>iTunes is not running</title>" & linefeed
		set xml to xml & "<subtitle>Start iTunes and retry</subtitle>" & linefeed
		set xml to xml & "<icon>now_paused.png</icon>" & linefeed
		set xml to xml & "</item>" & linefeed
 
		return xml & "</items>" & 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 "<?xml version=\"1.0\"?>" & linefeed
	set xml to xml & "<items>" & linefeed
 
	-- track info list item
	set xml to xml & linefeed & "<item uid=\"trackinfo\" arg=\"trackinfo\" valid=\"yes\">" & linefeed
	set xml to xml & "<title>" & track_name & "</title>" & linefeed
	set xml to xml & "<subtitle>" & artist_name & "</subtitle>" & linefeed
	set xml to xml & "<icon>now_playing.png</icon>" & linefeed
	set xml to xml & "</item>" & linefeed
 
	-- add new tag list item
	set xml to xml & linefeed & "<item uid=\"newtag\" arg=\"" & dbid & "|" & q & "\" valid=\"yes\">" & linefeed
	set xml to xml & "<title>New Playlist Tag</title>" & linefeed
	if q is equal to "" then 
		set xml to xml & "<subtitle>To remove tags use - prefix, e.g: slow -fast</subtitle>" & linefeed
	else
		set xml to xml & "<subtitle>" & q & "</subtitle>" & linefeed
	end if
	set xml to xml & "<icon>playlist_new.png</icon>" & linefeed
	set xml to xml & "</item>" & linefeed
 
	return xml & getTags(dbid) & "</items>"
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 & "<item uid=\"" & myID & "\" arg=\"" & dbid & "|" & prefix & myID & "\" valid=\"YES\" autocomplete=\"" & myID & "\" type=\"default\">" & linefeed
	set myItem to myItem & "<title>" & myID & "</title>" & linefeed
	if prefix is equal to "+" then 
		set myItem to myItem & "<subtitle>Add this tag</subtitle>" & linefeed
	else
		set myItem to myItem & "<subtitle>Remove this tag</subtitle>" & linefeed
	end if
	set myItem to myItem & "<icon>" & icon & "</icon>" & linefeed
	set myItem to myItem & "</item>" & 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 "<?xml version=\"1.0\"?>"
	set xml to xml & "<items>"
 
	repeat with snap in snaps
		set xml to xml & "<item uid=\"" & snap & "\" arg=\"" & snap & "\" valid=\"YES\" autocomplete=\"" & snap & "\" type=\"default\">"
		set xml to xml & "<title>" & snap & "</title>"
		set xml to xml & "<icon type=\"fileicon\">/Applications/Moom.app</icon>"
		set xml to xml & "</item>"
	end repeat
 
	set xml to xml & "</items>"
 
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.

Android a házban, avagy egy geek ebédje

A probléma: ebédet is kéne főzni, de közben munka is van meg printelek is és a konyha 10 méterre van a munkagéptől.

A megoldás: monitorozzuk Androidos mobillal a sülő pecsenyét! Az egészhez csak az IP Webcam alkalmazás kell, meg persze némi mount a telefonnak a konyhában, valahogy így:

IP_webcam-in-da-kitchen

Kamera a helyére, app elindít, aztán már jön is a secondary monitorra a stream egy Chrome ablakban, mi meg nem aggódjuk halálra magunkat, hogy véletlenül odaég a drága pecsenye:

IP_camera-UI

Persze ugyanez megy iOS alatt is, ott IP Cam az áhított alkalmazás neve, csak én szívesebben állítottam a Moto G-t a sercegő hús mellé.