Category Archives: Mac

Mac workflow: a supporter fegyvere az embeddelő userek ellen

A probléma A gonosz user küld nekünk egy hibaüzenet screenshotot, jó esetben csak egy, rosszabb esetben több, általában Office dokumentumban egymásba ágyazva (jött már olyan, hogy a szép fejléces (!) PowerPointba ágyazott debug screenshot csini Word dokumentumba gyógyítva, szép veretes picture frame-mel). Megkapom, ránézek és máris nem kell lemennem evezni, hogy 150-re szökjön a pulzus: user-embeddelt-hibauzenete

A megoldás

Azért jó ideje már nem szökik. Egyfelől van nekem szép \screenshot fedőnevű TextExpander shortcutom, ami ilyet csinál azonnal a válaszmailbe:
Képernyőfotók küldése Windows alatt a legegyszerűbb módon
1. Tegyük aktívvá a fotózandó ablakot (egyszerűen rá kell csak kattintani).
2. Nyomjuk meg az Alt+Print Screen billentyűkombinációt — a fotó az aktív ablakról a vágólapra kerül.
3. Indítsuk el a levelező programunkat, kezdjünk el egy új levelet.
4. Kattintsunk a levél törzsébe, és oda illesszük be a vágólap tartalmát a Control+V billentyűkombinációval.
5. Címezzük meg a levelet és küldjük el!
Másrészt nem lennék címzetes shareware junkie lovag, ha ne tartanék erre fent egy appot. Az app neve File Juicer. A kis 13 EUR-ba kerülő shareware alkalmazás az univerzális kicsomagoló – rengetegszer behozta már az árát nekem. Számos formátumot képes atomjaira szedni, továbbá nagy segítség tud lenni, ha memóriakártyáról kell visszahozni törölt adatot. A File Juicer kis ronda ikonnal rendelkezik, valamint az UI sem egy díjnyertes csődör: file-juicer-UI Az ablak bal oldalán található drop target boxba, vagy az alkalmazás dokkon levő ikonjára kell dobnod a gonosz felhasználó által küldött dokumentumot, amit az app szétszed, ahogy illik: file-juicer-result A File Juicer természetesen AppleScriptelhető, így semeddig nem tart egy Service-t gyártani hozzá, ami jobb clickre indítja a konverziót. Minden embeddelő userellenséggel találkozó Mac OS X usernek kötelező fegyver ez a kis gyöngyszem. Update: Józsi párhuzamos postja a témában erre. ]]>

Mac workflow: fordító service

Preface: a workflow Google API-t használ, így feltételezem, hogy rendelkezel a használatához szükséges Google accounttal, továbbá Growl felhasználó vagy. Ha nincs Google accountod és nem is akarsz gyártani magadnak, illetve a Growl-tól is kiver a víz, akkor ez a leírás számodra nem nyújt explicit megoldást. Update: fds Mester hatására kigyomláltam a gusztustalan urlencode függvényt és az amúgyis nagyon okos curl binárisra róttam ezt a terhet.

A probléma

Idegen szóval / kifejezéssel találkozunk a computeren olvasás közben, amire a gyári Dictionary.app-ba integrált szótárunk nem ad fordítást.

A megoldás

Van a Google-nek jóféle online translation API-ja, amit megkérhetünk szépen, hogy fordítson nekünk. Az OS X nagy varázslata a rendszer szintű AppleScript támogatás és az Automator fedőnevű makrózó csoda – őket szólítjuk most csatába. Első körben ellátogatunk a Google Translate API oldalára és végigolvassuk a doksit. A dokumentáció szépen elmagyarázza, hogy Google-ék egy ilyen GET requestre adnak értelmes választ:
https://www.googleapis.com/language/translate/v2?parameters
A HTTPS request felparaméterezve így néz ki:
https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&q=hello%20world&source=en&target=hu
Miután ezt megtudtuk, a doksiban leírtak szerint látogassunk el a Google APIs Console oldalra, készítsünk egy új Translate projectet és már meg is szereztük a Translate API híváshoz szükséges kulcsot. Megvan a kulcs, csinálhatunk jó kis Service-et! Elindítod az Automator alkalmazást, majd kiválasztod a Service típusú template-et: A megjelenő editorban a Library/Utilities szekcióból kikeresed a Run AppleScript actiont és behúzod a munkaterületre: Ezután már csak bepakolod a script helyére azt, amint én hajnalban már kiszenvedtem, beteszed a set myKey to "PUT_YOUR_GOOGLE_API_KEY_HERE" sorba a te saját Google Translate API kulcsod és lemented a file-t Translate néven. Ha mindent jól csináltál, akkor megjelent egy Translate nevű service a gépeden, ami úgy működik, hogy egy tetszőleges alkalmazásban kijelölt szövegen jobb clicket nyomva, majd a Services menü Translate opcióját kiválasztva a script megküldi a Google Translate APInak a kijelölt szöveget és a visszakapott fordítást megjeleníti neked egy Growl notification buborékban, valahogy így: [video mp4="/fns.hu/video/mac-workflow-translate-service.mov" width="500" options="controls"] Végül nézzük meg a scriptet egyben, úgy, ahogy magamnak implementáltam:
(*
	Translate
	by Gabor PENOFF (//fns.pappito.com)
	release 20110208_092849
	About:
	Requirements:
	- insert your own Google API key
	- install Growl from http://growl.info to get non-modal notification dialogs
	Usage:
	- select some text and run the service
	That's all.
*)
on run {input, parameters}
	set srcText to input as text
	set srcLang to "en" -- source language
	set tgtLang to "hu" -- target language
	set myKey to "AIzaSyCI-2oapEkMpRFfd6Ltv4HkZhf1Zq-VU9o"
	set myScriptID to "Translate" -- ID for Growl display
	set myTranslation to do shell script "/usr/bin/curl -G --data-urlencode q=" & quoted form of srcText & " --data-urlencode key=" & quoted form of myKey & " --data-urlencode source=" & quoted form of srcLang & " --data-urlencode target=" & quoted form of tgtLang & space & quoted form of "https://www.googleapis.com/language/translate/v2"
	if myTranslation = "" then
		tell me to notifyWithGrowl(myScriptID, "ERROR")
		return
	end if
	-- get rid of JSON (ugly but works)
	set myPrefix to "translatedText\": \""
	set myPostfix to "\""
	set myStartPos to (offset of myPrefix in myTranslation) + (length of myPrefix)
	set myText to text myStartPos thru -1 of myTranslation
	set myEndPos to (offset of myPostfix in myText)
	set myText to text 1 thru (myEndPos - 1) of myText
	tell me to notifyWithGrowl(myScriptID, myText)
	return "" -- myText
end run
-- GrowlCheck:
on growlInstalled()
	try
		do shell script "ls /Library/PreferencePanes/Growl.prefPane/"
		return true
	on error
		return false
	end try
end growlInstalled
-- Growl notifier:
on notifyWithGrowl(myApp, myText)
	set myIconApp to "Safari"
	set notificationID to myApp & ".default"
	if growlInstalled() then
		tell application "GrowlHelperApp"
			-- list of notification types
			set the ANL to {notificationID}
			-- list of enabled notifications
			set the DNL to {notificationID}
			-- register script
			register as application myApp all notifications ANL default notifications DNL icon of application myIconApp
			-- send notification
			notify with name notificationID title myApp description myText application name myApp
		end tell
	else
		-- skip alert if no Growl installed
		--display alert "Growl is not installed"
	end if
end notifyWithGrowl
Türelmetleneknek / elfoglaltaknak / lustáknak az egész service szedhető innen – persze még ebben is be kell pakolnod a saját magad Google API kulcsát, hogy működjön.]]>

1984s

A reklámban emlegetett, Apple által készített 1984 reklám pedig: Végül a Motorola által legyőzendő versenytársnak tekintett iPad első reklámja: Jelen postnak nem az a célja, hogy elemezze, melyik reklám mennyire jó, mennyire eltalált. Az sem célja, hogy még jobban rám vasalja a “Steve-nek megtért Apple buzi” bélyeget. Egyetlen egy dolgot szeretnék megértetni ezzel a post-tal – ugyanazt, amit minden egyes alkalommal elmondok a barátaimnak is, ha a “miért Apple” kezdetű kérdést nekem szegezik. Nem érdekel a gigahertz mánia, nem érdekel a CPU magok száma, hidegen hagy a cserélhető memóriakártya opció is. Egyetlen dolgot nem lehet kapni a boltban, amire szükségem lenne – pedig ha lehetne, minden pénzem arra költeném. Ez pedig az idő. Amit jelenleg használok, az nekem időt spórol. Kivettem a dobozából és azóta hiba nélkül működik. Nem kéri, hogy konfiguráljam, nem idegesít halálba avval, hogy belassul, nem kell törődnöm vele. Amikor szükségem van rá, felveszem az asztalról és megy. Nem csak egy darab vasat, egy kis szelet időt is vásároltam vele. ]]>

Sleep/wake unmount/mount [restored post]

beforesleep.sh

#!/bin/sh
osascript -e 'tell application "Finder" to eject (disks where free space ≠ 0)'
Az afterwake.sh pedig az asztalra visszatéve a Mac-et felmountolja az összes lokálisan látszó (= USB || FW portokon csücsülő, de nem mountolt) volumét:
afterwake.sh
#!/bin/sh
/usr/sbin/diskutil list | grep -e ' \+[0-9]\+: \+[^ ]\+ [^ ]\+' | sed 's/.*\(disk[0-9].*\)/\1/' | xargs -I{} /usr/sbin/diskutil mount {}
]]>

QuickCal

QuickCal egy OS X alá fejlesztett desktop alkalmazás, mely CLI dzsánkiknak hozza el a természetes nyelven írt iCal bejegyzés nirvánát. Ahelyett, hogy tovább ragoznám, nézd meg egy rövid videón, hogy mire képes:

Use QuickCal with Spotlight, Alfred, LaunchBar or any other application launcher from Quicktipps on Vimeo.

QuickCal Dashboard widget formájában már létezett korábban is, de nekem ő valahogy nem állt kézre. Spotlightból egy szemvillanás alatt indul, s ha egyszer megszokod az általa használt natural language szintaxist, soha többet nem húzod át az egérre a kezed egy gyors emlékeztetőért!]]>

Imperial fun és egy kis scripting

Imperial Fun from Gabor Penoff on Vimeo.

Természetesen inkorrekt lenne, ha nem soroltam volna fel, hogy honnan jöttek a képek. Persze a franc nem regisztrálja ezeket magának, amíg gyűlik a netről levadászott anyag… vagy mégis? Hála az Safari és az OS X codereinek, a Safariból kiráncigált/letöltött állományok kMDItemWhereFroms meta tagja megkapja a linket, ahonnan a leechelt file származik. Innen már csak két lépés és készen vagyunk! Elsőnek írjuk meg a geturl scriptet, ami a későbbiekben is hasznunkra válhat, ha CLI-ből akarjuk megtudni, honnan szedtünk le egy file-t:
#!/bin/sh
mdls -name kMDItemWhereFroms "$*"
Ha kész, másoljuk össze egy külön folderbe a képeket amiket felhasználunk, majd eresszük rá ezt a onelinert:
for file in `ls .`; do (geturl ${file} | grep http >>~/Desktop/urls.txt); done
Fenti példánkban persze a képeket tartalmazó folderben állunk, mikor elindítjuk a ciklust. Persze a geturl script begyógyítható a ciklusba, hogy valódi egysoros megoldásunk legyen. Nekem így áll kézre, mert a geturl-t többször hívom meg másképpen (btw akár alias is lehetne belőle – hát nem csodás ez a *nix-like világ?!). Végül, de nem utolsó sorban a vimeo-n található klip leírás mellett álljon itt is a felhasznált netről szedett képek listája, melyek a post írásának pillanatában még fellelhetők a neten ott, ahol én találtam őket: 1118180545_c84adabb58_o.jpg 2burgstrikesback1210.jpg 3931_056b_800.jpeg 3burgstrikesback1210.jpg 42_atat-under-fog.jpg 42_c3po-and-the-fire.jpg 42_sand-storm-day.jpg 42_slave1s-parking.jpg 42_speederbikes-wash.jpg 42_stop-at-the-burj-dubai.jpg 42_the-buick.jpg 42_the-droid-army-under-arch.jpg 42_the-falcons-route.jpg 42_the-line.jpg 42_the-night-droid-patrol.jpg 42_the-robbery.jpg 42_the-secret-meeting.jpg 42_the-x-wings-restoration.jpg 4628795545_c951619eaa_b.jpg 4638969387_0d82bf7273_b_d.jpg 4burgstrikesback1210.jpg 500x_schoolAT_AT.jpg McDsDarth.jpg best_star_wars_flickr_pics_17.jpg burgstrikesback1210.jpg rohamosztagosok-vs-police.jpeg santa-imperial-troopers.jpg star-wars-birodalmi-katona-sleeping.jpg star-wars-pixel-dudes.png star-wars-singing-in-the-rain.jpg tumblr_kyemf8GEV21qz5ed1o1_500.jpg ww2-darth-vader.jpg ]]>

Media Center Szent Grál kutatás: az AirPlay technológia

Apple TV-t. Az eszköz egy 100 USD-ba kerülő, tenyérnyi dobozka. A doboz hátoldalán egy borotvazsinór aljzat (=beépített tápja van), egy HDMI anya, egy micro USB anya, egy optikai audio out és egy gigabit ethernet aljzat lakik, belsejében b/g/n-es WiFi és Bluetooth 2.1 EDR. A CPU az iOS eszközökbe fejlesztett Apple A4 ARM, a streaming tartalom puffereléséhez 8 GB RAM lakik a készülékben. 5 wattot eszik, mozgó alkatrésztől mentes, fekete fényes porfogó, de amúgy gyönyörű kis kütyü. appletv Egy hihetetlenül bosszantó tulajdonsága van: ugyan HDMI 1.3a aljzattal rendelkezik, mégsem implementálták benne a HDMI CEC standardet, amely azt tenné lehetővé, hogy a CEC buszvezetéken keresztül ébreszthetné/altathatná a belőle kijövő tartalom megjelenítéséért felelős HDMI CEC kompatibilis audio és video eszközöket. Remélem egyszer ezt meghozza egy firmware update. A dobozka megjelenése után mohó haxor kezek neki is estek és alaposan körbenézték. Kiderült, hogy ő is iOS-t futtat, így nem elképzelhetetlen, hogy az Apple később a kis fekete kockát képzeli el az iOS platform megjelenítő frontendjének – na de ne szaladjunk így előre! A kis kütyünek csak ott van igazán értelme, ahol streaming tartalmat is vásárolhatsz hozzá (ergo Magyarországon nincs), így az itthoni almás kereskedőknél sehol nem lehetett kapni. Jofkovot kértem hát meg, hogy kerítsen nekem egyet és ő azonnal intézte is: a tenyérnyi gépezet pár hét múlva költözött be a TV mellé. Azon túl, hogy a kis dobozkával remekül nézhetsz trailereket, YouTube videokat meg Flickr fotókat, sok mindenre nem volt használható idehaza, egészen a 4.2-es iOS firmware megjelenéséig. Az új iOS firmware mellett jött az Apple TV-re is egy update, ami meghozta a Steve által már szeptemberben demozott AirPlay technológiát: Az AirPlay nem más, mint egy mezei audio/video streaming, zeroconf (Bonjour) alapokra helyezve. Magyarul ez annyit tesz, hogy bármely AirPlay streamet adni képes eszköz (ezek jelenleg _hivatalosan_ az Apple iOS eszközei) képes bármelyik AirPlay streamet fogadni képes eszközre (ezek az új Apple TV, illetve az Airport Express, valamint 3rd party gyártók AirPlay kompatibilis eszközei (B&W, JBL, Denon, …)) audio és video streamet küldeni. Az AirPlay fogadó “output” eszközök csak megjelenítik a nekik sugárzott tartalmat, fogalmuk nincs annak mibenlétéről (azaz pl. az iPhone-ról streamelt YouTube videot továbbra is az iPhone tölti a netről és mintegy gatewayként továbbküldi mondjuk az Apple TV-nek megjelenítésre). A dologra akkor figyeltem fel, amikor Steve apu szeptemberben azt mondta, hogy az AirPlay nyitott technológiák gyurmája, azt 3rd party gyártók beépíthetik a termékeikbe. Ebből azonnal jött, hogy előbb-utóbb megjelennek az AirPlay sender / receiver alkalmazások – és így is történt. A TUAW Erica Sadun-ja volt az első, aki nekiállt az AirPlay hacknek: előbb elkészített egy AirPlayer nevű alkalmazást, mely a Mac-edet képes AirPlay receiver állomássá alakítani, majd a héten kiadta az AirFlick nevű AirPlay sender klienst, mely tetszőleges iTunes kompatibilis videofolyamot (offline tartalmat vagy akár online streamet) tud egy AirPlay receivernek küldeni. A héten a történet úgy folytatódott, hogy az XBMC coder srácok portolták az AirPlay receiver funkcionalitást a media playerükbe, AirPlay vevővé téve ezáltal bármilyen, XMBC media centert futtató gépet (az első demóban egy Ubuntu Linuxon futó XBMC volt az AirPlay receiver). Az iOS eszközök hackelése (jailbreak) után ott a lehetőség az AirVideoEnabler installjára, amely után az AirVideo iOS app képessé válik az AirPlay receiverek felé történő streamelésre. Summa summarum, alakul ez az over-the-air streaming. Már most is baromi kényelmes, hogy esténként leülhetsz a TV elé és ott nézheted meg a napközben beesett YouTube videókat a nagy képernyőn, kényelmesen. Ha ez odáig fokozódik, hogy tetszőleges tartalmat küldhetsz a levegőben a TV-d és az erősítőd irányába, akkor már megint egy lépéssel közelebb került a Media Center Nirvana. ]]>

Mac workflow: válogassunk video nyersanyagot

Preface: ezt a postot ma délután egy agyatlan flame-mel támadó kolegám indukálta, aki csak a gonoszt látta mindenben, ami harapott almás, incl. az általam használt computer és annak operációs rendszere. Jómagam azt vallom, hogy feladathoz kell választani az eszközt: épületet nem akarunk mindenáron Silicon Graphics mainfarme-ekkel vezérelni, mikor egy 5 Wattos kis ARM masina is elviszi, viszont 3D-t biztos azon renderelnék legnagyobb örömmel. Hogy az eszközt a feladathoz teóriát demonstráljam, elengedtem a 3rd party tooljaimat és megszültem ezt a workflowt. Tegyük a $SUBJECT-et a vanilla óperenciás rendszer segítségével – semmi extra alkalmazás!

  • Legyen egy folderünk, tele videós nyersanyaggal, amit nyissunk meg Finderben.
  • Nyomjunk egy ⌘1 kombinációt a billentyűzeten, hogy a Finder ablakunk ikon nézetet mutasson.
  • Klikkeljünk a Finder ablak jobb felső sarkában tanyázó kis gombra, ami eltünteti a Finder sidebart és a toolbart is, valamint átköltözteti a Finder ablak aljáról a statusbart és a zoom slidert az ablak tetejére, maximális helyet hagyva nekünk a nézelődéshez:
Finder-with-sidebar Finder-without-sidebar
  • Állítsuk a Finder ablakot böszme méretűre, majd húzzuk odáig a zoom slidert, hogy már élvezhető méretű thumbnaileket kapjunk a nyers videókból:
Finder-zoom-slider
  • Húzzuk az egérkurzort egy videó fölé, majd klikkeljünk a közepén megjelenő ikonra, hogy elinduljon a kívánt méretűre állított thumbnailben (!) a lejátszás:
Finder-video-play-icon
  • Ha a thumbnail kicsi, csak jelöljük ki a videófile-t és nyomjunk egy SPACE-t az ablakos lejátszáshoz, vagy egy ⌥SPACE-t a fullscreen-en történő lejátszáshoz:
quick-look-video-play Végül az emlegetett stock Finder ablak az alábbi képre klikkolva rendes méretben: ]]>

Mac workflow: worklog generator

Preface: a mai workflow mese nem annyira strict OS X dolog, pusztán egy mezei Bash shell scriptet írunk meg benne. Hónap eleje van – ilyenkor számlázok és írom a worklogot – ez utóbbiról lesz most szó. eFi munkája software support munka: többek között fejlesztek új toolokat és karbantartom a régieket, zömmel VBA-ban. A Microsoft Office VBA nem haszontalan stuff, ám több szempontból is szörnyűséges egy szerzet – elég csak arra gondolni, hogy az Office dokumentumba írt kódot (WTF?) csak egyesével, ún. modulonként tudod kézzel plain text file-ba menteni, az IDE semmi ettől extrább támogatást nem ad. Anno, amikor elkezdtem VBA-val foglalkozni, írtam magamnak olyan környezetet, ami egy klikkre release ID-t generál az adott verziónak, új sort nyit a kódhoz tartozó changelogban és képes az így megjelölt kódfát tokkal-vonóval plain text file-okba egy verzióként kipakolni. Ehhez aztán készlült egy VBA updater motor is, ami ezt a mentést képes volt visszatölteni, de az egy másik történet – maradjunk most a lementett kódfánál, ami changelogostól pihen a HDD-n egy hierarchikus folder struktúrában. A velem support szerződést kötő cégnek havonta számlázok, a számla mellé pedig logot kell mellékelnem, ami elmagyarázza, hogy a kiszámlázott hónapban milyen munkákat végeztem el. Ennek a lognak az előállítását automatizálja némiképp a worklog script. Nézzük meg, azt a végén elmagyarázom röviden, hogy hogy is megy ez az egész:

#!/bin/sh
SCRIPT=`basename $0`
if [ "$#" != "1" ]; then
	echo "$SCRIPT - list changes made within a month"
	echo "Usage: $SCRIPT yyyymm"
	exit 1
fi
MYPATH=/Users/fns/Documents/xp/support/_code
PATHLEN=$((${#MYPATH}+1)) #+1 to cut first slash character as well
echo "$SCRIPT - list of changes made on $1\n"
for f in $(find $MYPATH -iname "changelog*")
do
if [ -a $f ]; then
	LOG=`cat $f | grep "'$1"`
	if [ "$LOG" != "" ]; then
		SRC=${f:PATHLEN}
		echo "Log from $SRC:"
		echo "$LOG\n"
	fi
fi
done
A script a kódfákat tartalmazó top level folderen elindulva végigszalad és előszedi a subfolderekben lakó changelog file-okat. Ilyen changelog minden kódfában csak egy van és historikusan tartalmazza a forrásban elkövetett változtatások rövid szöveges leírását. Egy sor a changelogban 3 elemből áll:
  • az eleje mindíg a release ID, ami yyyymmdd hh:mm formátumú,
  • a közepe egy byte-nyi flag, ami azt jelöli, hogy az adott módosítás új feature (+), törölt feature (-), bugfix (*), vagy éppen csak hangosan gondolkodok (?),
  • a vége pedig maga a változás szöveges leírása.
Namármost, ha a changelog sorok elején található ‘yyyymm kezdetű stringre szűrünk és csak azokat a changelog-okat jelenítjük meg a szűrt tartalommal együtt, amelyek az adott yyyymm patternre illeszkednek, akkor már le is generáltuk a munka leigazolását. Ezek után nincs más hátra, mint a különböző projectek szűrt changelogját a megfelelő kuncsaftnak megküldeni. Végül itt egy minta a script által gyártott eredményből:
worklog - list of changes made on 201010
Log from cpt/modules/ChangeLog.bas:
'20101011 20:00 *   Default report fix (default report created instead of last used one when no SF ARCHIVE present and the last used report wants it).
'20101011 20:46 *   Asset efficiency % report regional fix.
'20101012 12:16 *   Demand cmp Reports disabled when no SF ARCHIVE present.
'20101013 18:57 +   Forced forecast archive generation if user omits it to prevent freezing of forecast archive related reports.
'20101013 20:04 +   Asset group selection support for Demand share per family report.
'20101015 08:20 *   Demand share per family report MSO/FCODE array empty fix.
'20101016 10:41 +   Forecast archive generator hack improved.
]]>