Archive for the 'Mac' Category

Új user input device: Apple Magic Trackpad

Kifejezetten kerülöm, hogy Apple hardverről írjak, de a mostani mellett nem tudok szó nélkül elmenni. Már régóta várom, hogy megjöjjön az eszük, és letegyék az asztalra ezt:

Apple-Magic-Trackpad

Ma végre letették. Remélem minél előbb elkészül a driver minden létező OS-re, hogy minél több user élhesse meg, milyen fantaszikus user interface-et alkotott a multitouch trackpaddel az emberiség!

Update: Boot Camp-es Win* alá már itt is van.

Safari tab render fix

Furcsa hibára figyeltem fel nem rég: a Safariban egy linken ⌘-clickelve a háttérben megnyíló tab fület a Safari hibásan rendereli: a háttérbe küldött tab is úgy néz ki, mintha az előtérben lenne. Furán hangzik, megmutatom:


Nem egy nagy probléma, de amikor egérrel szeretnéd az aktív tabot bezárni, akkor nagyon zavaró, ugyanis nem látod, hogy igaziból melyik is az aktív tab. Fogalmam nem volt, mi okozhatja ezt, így tegnap este fds-sel nyomozni kezdtünk.

Kiderült, hogy a hiba mind az aktuális Safariban, mind az utolsó WebKitben jelentkezik, de csak akkor, ha az általam egyébként nagyra becsült 1Password jelszómanager beintegrálja magát a browserekbe. Ezzel úgy gondoltam, hogy a ludas meg is van és írtam egy mailt az 1Password techsupportnak, felhívva az általuk generált anomáliára a figyelmet.

Ma reggel megjött a válasz: mégsem ők a hibásak, hanem a Logitech egérhez adott hibás Logitech Control Center. Íme a support válasza:

Thank you for taking the time to contact us. I'm really sorry for the trouble you're seeing with the graphical glitch with the tabs. By any chance, do you have Logitech Control Center installed? If so, please try this:

- Quit Safari
- Remove
/Library/ScriptingAddons/LCC Scroll Enhancer Loader.osax
- Start Safari

For more information, please refer to the following discussion on our forums:
http://support.agilewebsolutions.com/showthread.php?t=20069

Kidobtam a fent megjelölt hacket és BOOOM! - a probléma eltűnt.

Mac workflow: HandBrake gyípaci

Preface: mielőtt szerzői jogos hisztibe kezdene bárki - az alábbi post természetesen a saját, avi-ba konvertált, ám korábban legálisan vásárolt DVD gyűjteményem transzkódolásáról szól. Na ugorgyunk!

A tegnapi házimozis workflowból kimaradt az eFis bonus: a coder véremnek muszáj hozzátennie valamit a media centeres Nirvánához. Miután egy Perl-ben írt batch DVD konverter scriptet találtam még tegnap este a HandBrake-hez (az van linkelve az előző post-ba), agyaltam egy kicsit tovább, hogy hogy lehetne a kényelmet fokozni. Jöttek egyre vadabb ötletek, amikből készült egy röpke feature lista, aztán ern0 barátomtól jól eltanulva nagy lendülettel dobáltam ki a fancybbnél fancybb dolgokat belőle. Ennek az lett az eredménye, hogy három Excel makró tesztfutás közben megírtam egy scriptet ajándékba.

Elmesélem, hogy miket dobált elő az agyam implementálandó featureként. Az alapötlet az volt, hogy csinálok egy HandBrakeCLI-t hajtó shell scriptet, ami kihasználja a 0.9.4-es release soft subtitle opcióját és jól belegyógyítja a felirat{ok}at a transzkódolt mp4 fileokba. Ez volt a bázis, innen jött az így utólag szerintem tanulságos agymenés:

  • A HandBrakeCLI csak SRT feliratokat támogat. Nem minden felirat SRT, úgyhogy jó lenne a többi, non-SRT feliratot SRT formátumúra konvertálni.
  • Ha már ilyen okos feliratkitalációs script lesz, akkor miért ne találná ki magától, hogy milyen nyelvű a felirat?! Mi sem egyszerűbb, a Google Translate tud ilyet, van is demo oldal a language detectionról!
  • Biztos lesz egy csomó avi, amihez nem lesz felirat - ezekhez de jó lenne automatikusan keresni a neten! Hopsz, az opensubtitles.org-nak pont nyitott az API-ja, majd használjuk azt jól!

Miután ern0s vehemenciával kihúztam három izmos dolgot, elkezdtem agyalni, hogy azért valami okosság csak kellene egy rekurzív find híváson túl. Így jött az ötlet, hogy a script megkeresi, hogy van-e az avi file-ok mellé felirat és ha van, akkor bele is rámoltatja őket a készülő mp4-be.
Az algoritmus azt feltételezi, hogy a HandBrakeCLI számára használható subtitle file-ok .srt kiterjesztésűek, bázisnevük (=basename) megegyezik az avi file nevével, illetve opcionálisan a bázisnév kiegészülhetett {-en|-eng} és {-hu|-hun} tagokkal. Magyarul mondva egy példán keresztül az anyámtyúkja.avi-hoz az alábbi subtitle file-okat találja meg a script:

  • anyámtyúkja.srt
  • anyámtyúkja-hu.srt
  • anyámtyúkja-hun.srt
  • anyámtyúkja-en.srt
  • anyámtyúkja-eng.srt

A basename végéhez csapott utótag alapján dönti el a script, hogy a felirat angol vagy magyar nyelvű-e és ennek megfelelően ISO-8859-1, illetve Windows-1250 codepage-dzsel renderelteti bele a készítendő mp4 file-ba. Amennyiben az avi basename-mel megegyező nevű (=utótag nélküli) feliratfile-t talál, azt magyarnak tekinti. Az alábbi scriptben csak három darab echo szerepel, hogy a transzkódolás megindítása nélkül kipróbálhasd a scriptet - ha transzkódoltatni akarsz, az echo-kat értelemszerűen dobáld ki.

A kis minimalista toolt fds Mester lektorálta, amiért ezúton is jár a hála és a köszönet. Have fun:

#!/bin/sh
#
# Handbrake gyipaci
# lmdate 2010.07.05
#
# Végigmegy rekurzívan egy könytáron és megkeresi a filmcim-hu{n}.srt, filmcim-en{g}.srt feliratfile-okat,
# aztán ha igazán akarod, csinál neked soft subtitle-os mp4-eket az avi-jaidból.
#
# A script feltételezi, hogy ha csak egy, az avi file-lal megegyező nevű srt file-t talál, akkor abban magyar
# subtitle lakik. 
#
getsubs() {
	film="$*"
	base="${film%.*}"
	srt="$base".srt
	hu="$base"-hu.srt
	hun="$base"-hun.srt
	en="$base"-en.srt
	eng="$base"-eng.srt
 
	srthuc=0
	srthu=""
	if [ -e "$srt" ];	then
		srthuc=1
		srthu="$srt"
	elif [ -e "$hu" ]; then 
		srthuc=1
		srthu="$hu"
	elif [ -e "$hun" ]; then 
		srthuc=1
		srthu="$hun"
	fi
 
	srtenc=0
	srten=""
	if [ -e "$en" ]; then 
		srtenc=1
		srten="$en"
	elif [ -e "$eng" ]; then 
		srtenc=1
		srten="$eng"
	fi
 
	let srtc=$srthuc+$srtenc
 
	srtfiles=""
	srtcodes=""
	srtlangs=""
	case $srtc in
		0 ) ;;
 
		1 ) 
			if [ -s "$srthu" ]; then 
				srtfiles="$srthu"
				srtcodes="WINDOWS-1250"
				srtlangs="hun"
			else 
				srtfiles="$srten"
				srtcodes="ISO-8859-1"
				srtlangs="eng"
			fi
			;;
		2 ) 
			srtfiles="$srthu","$srten"
			srtcodes="WINDOWS-1250,ISO-8859-1"
			srtlangs="hun,eng"
			;;
	esac
 
	if [ $srtc -ne 0 ]; then
		echo Found $srtc subtitles:
		echo "$srtfiles"
		echo "$srtcodes"
		echo "$srtlangs"
	else
		echo No subtitles found.
	fi
 
	case $srtc in
		0 )
			# ezt az echo-t akkor dobd ki a /Applications/HandBrakeCLI elől, ha felirat nélkül is konvertálnál
			echo /Applications/HandBrakeCLI -v -i "$film" -o "$base".mp4  -e x264 -b 3000 -T -E faac -B 192 -R 48 -d slow -5 -8 medium
			;;
		1 )
			# ezt az echo-t akkor dobd ki a /Applications/HandBrakeCLI elől, ha konvertálnád a home videód akkor is, ha csak a default magyar felirat van meg hozzá
			echo /Applications/HandBrakeCLI -v -i "$film" -o "$base".mp4  -e x264 -b 3000 -T -E faac -B 192 -R 48 -d slow -5 -8 medium --srt-file "$srtfiles" --srt-codeset "$srtcodes" --srt-lang "$srtlangs"
			;;
		2 )
			# ezt az echo-t akkor dobd ki a /Applications/HandBrakeCLI elől, ha konvertálnád a home videód mind az angol, mind a magyar felirat birtokában a kétnyelvű családod számára
			echo /Applications/HandBrakeCLI -v -i "$film" -o "$base".mp4  -e x264 -b 3000 -T -E faac -B 192 -R 48 -d slow -5 -8 medium --srt-file "$srtfiles" --srt-codeset "$srtcodes" --srt-lang "$srtlangs"
		 ;;
	esac
 
	return
}
 
find . -type f -iname '*.avi' -print0 | while read -rd $'\0' f
do 
	getsubs ${f}
	echo .
done

Végül, de nem utolsósorban kiemelnék pár apró tuningot, mely a Mester nélkül nem került volna a scriptbe:

find . -type f -iname '*.avi' -print0 | while read -rd $'\0' f

A bash-ba intergrált read parancs -rd $'\0' paramétere az egyik szépség:

  • A -r nem hagyja az escape karaktereknek a "szökést", azaz pl. az Anyám\Tyúkja.avi filenéven sem bukik el a find.
  • A -d $'\0' pedig egy nulla byte-ot deklarál delimiternek, így egy buzi \n sem okoz{na} gondot a filenévben.

Szintén a Mestertől jött, hogy a magyar feliratfile-oknak ne ISO-8859-2 codepage-et definiáljak, hanem jobb lesz helyette a Windows-1250 (btw a használható codepage-ek listáját egy iconv -l mondja meg, ahogy arról a HandBrakeCLI -h is említést tesz). Ahogy ő indokolja:

ISO-8859-2-ben nincs pl „ ” vagy …

Jogos.

Mac workflow: házimozi HOWTO

Ma Mac Mini alapú media centert pakolunk össze és körbejárjuk az általam kedvelt hozzávaló software komponenseket.

A vas

Nálam egy 2. generációs Mac Mini látja el az otthoni média server feladatát. Ezt a perfekt kis Mac-et az Apple épp az elmúlt hetekben tuningolta meg: unibody házba került, vaddisznó GPU-t forrasztottak az alaplapra, akár 8 GB RAM is belefér, 1.3-as, audio jelet is szállítani képes HDMI portot integráltak bele, de ami a legfontosabb: idle állapotában 10 Wattot eszik a kis dög! Sajnos az itthoni ára ijesztően magas (240kHUF), ellenben gyönyörűséges egy szerkezet:

Mac Mini mid2010

A CEC pofon

Ha már szó esik az új Mac Miniről, nem állhatom meg, hogy ne osszak ki a gyártónak egy virtuális sallert a CEC kompatibilitás hiánya miatt 2010-ben - ezt nézzük meg kicsit belülről.

A HDMI három kommunikációs csatornát definiál: ezek sorjában a DDC, a TMDS és az opcionális CEC:

  • A DDC (=Display Data Channel) a megjelenítő eszközök paramétereit cipeli, mint kontraszt, fényerő.
  • A TMDS (=Transition Minimized Differential Signaling) hordja a képet és a hangot.
  • A CEC (Consumer Electronic Control) lenne felelős az egy HDMI láncba kötött eszközök közös vezérléséért.

HDMI_Connector_PinoutA CEC lényegében egy egy lábas soros busz a HDMI madzagban (a 13. láb az övé, a 17. láb pedig a GND-je), ami arra lenne hivatott, hogy a különböző gyártók készülékei egymás között ezen a buszon beszélgessenek és bármelyikük masterként a többit utasíthassa slave funkciók elvégzésére. Humánra fordítva ez kb. úgy hangzik, hogy a master HDMI eszközöd (jellemzően a TV) távirányítója az összes többi, a HDMI láncba kötött eszközt instruálja, azaz mondjuk a TV távirányítóján levő REC button utasíthatja a HDD rekordered, hogy kapcsoljon be, álljon be ugyanarra a csatornára, amit a TV-n nézel és kezdjen el rögzíteni. Vagy egy másik példa: legyen elég egy darab OFF button megnyomása ahhoz, hogy minden komponens (erősítő, HDD rekorder, TV) kikapcsoljon.

Csak hogy lásd, a mocsok gyártók milyen szinten sz@rnak a próbálkozásra, ami a XXI. században eljuttatná a világot a single remote Nirvánába, íme a lista a HDMI-CEC támogatás jelölésére a különböző márkák készülékein:

  • Anynet (Samsung)
  • Aquos Link (Sharp)
  • BRAVIA Sync (Sony)
  • HDMI-CEC (Hitachi)
  • Kuro Link (Pioneer)
  • CE-Link, Regza Link (Toshiba)
  • RIHD (Remote Interactive over HDMI) (Onkyo)
  • SimpLink (LG)
  • HDAVI Control, EZ-Sync, and VIERA Link (Panasonic)
  • EasyLink (Philips)
  • NetCommand for HDMI (Mitsubishi)

Klassz. Ezek után bármilyen eladót kérdezhetsz, ha nem kellően kocka, fogalma nem lesz arról, ki fia-borja az a HDMI-CEC.

A CEC dróton (13. láb) tehát bőszen küldhetnénk a Mac Miniről a TV felé a "bekapcsol + csatornát vált + hangerő beállít" commandokat, amint felébresztjük a házi almás media playerünket, de sajna az Apple-t ez egyelőre nem hatja meg. Ha a TV-n van soros port, akkor még mindig nekiállhatunk izmozni némi vezérléssel (egyszer majd lesz erről is post, ígérem), azonban amíg ez nincs, addig marad a Logitech Harmony univerzális távirányító, ami pöpecül képes vezérelni az általam is favorizált media center software-t, a Plexet is (HOWTO erre).

A software

A korrekt média gyűjtemény összeállításához az alábbi alkalmazásokat állítjuk csatasorba:

  • RipIt - egy klikkes DVD archiválás
  • FairMount - DVD mounter, ha nem kell nekünk a RipIt
  • Handbrake - videó formátumok egymásba konvertálása
  • Plex - media center a Mac-re
  • Air Video - video streamer iPhone/iPad-re
  • Rivet - az Air Video kihívója: video/audio/photo streamer iPhone/iPad-re

Mindegyikről érdemes pár szót ejteni, nézzük őket szép sorjában!

RipIt
RipIt
A RipIt rém egyszerű alkalmazás: app elindít, DVD bedug, némi pörgés azt már meg is kaptuk a másolatot a DVD-nkről. Az app jelenleg az 1.5.1-es verziónál jár, a fejlesztő srácok folyamatosan mennek utána a DVD gyártók által alkalmazott másolásvédelmi trükköknek és adják ki az újabbnál újabb release-eket (saját site-jukon áll, hogy ha találnak egy nem rippelhető DVD-t, abból beszereznek egyet és beépítik az alkalmazásukba a fixet, amint lehet).
A RipIt képes a DiscIdent DVD azonosító szolgáltatását használni ahhoz, hogy felismerje az épp rippelés alatt álló lemezt. A fejlesztők most kezdenek integrálni bele egy "Compress" névre keresztelt (egyelőre beta) feature-t, ami lényegében a DVD leghosszabb trackjének egy darab MP4 file-lá való konverzióját teszi lehetővé.
Azzal sincs gond, ha inkább a full DVD copy mellett maradnál és nem konvertálnád a lemezeidet, akkor megkérheted a RipIt-et, hogy csapja hozzá a DVD folderéhez a .dvdmedia kiterjesztést, amitől OS X alatt a folder tartalmát azonnal az óperenciás rendszerbe épített DVD Player nyitja meg.
A RipIt talán legnagyobb vonzereje, hogy a media centernek használt Mac-en futtatva "zsinórban" etetheted az alkalmazást a még be nem grabbelt lemezekkel: az esetek nagy százalékában (=amikor nincs gondja a rippelendő lemezzel) nem kell ránézned az UI-ra, mivel a kiköpött diszkről már látod, hogy adhatod neki az újabb korongot (nota bene: a RipIt a sok cimborám által gyűlölt Growl notifikációra is képes, ami meg akár értesít a munkagépen, ha kész a rip, sőt, push üzenetet küld a telefonomra a Prowl.app segítségével ha kérem, de ez majd egy másik workflow post témája lesz ;)).

FairMount

A FairMount egy olyan DVD mounter app, ami bármely DVD-t olvasó alkalmazás számára lehetővé teszi a lemez hibamentes olvasását. A FairMount fejlesztői készítik DVDRemaster nevű ripper alkalmazást is - ennek egy része a FairMount, mely a DVDRemasterrel ellentétben ingyenesen szedhető tőlük.
A FairMount-tal felcsatolt DVD lemez tartalmát tehát nagy esélyyel akár egy Finder copyval is lemásolhatod a HDD-re - onnantól pedig semmi nem állíthat meg, hogy meg ne etesd a Handbrake-kel.

Handbrake

A keresztségben a "Kézifék" nevet kapó app az igazi MP4 generátor harcos! Létezik neki remekül scriptelhető, CLI-only verziója is.
A HandbrakeCLI hajtására számos script született - ez például rekurzívan végigmegy az inputként specifikált folderben és az ott található összes VIDEO_TS mappa tartalmát könyörtelenül átzúzza mp4-be - cool.
A 0.9.4-es Handbrake kiadásban megjelent a várva várt soft subtitle támogatás, melynek segítségével kikapcsolható feliratokat (akár többet is) rendelhetünk a mozi mellé, ráadásul úgy, hogy a felirat jöhet egy külső SRT file-ból. Na, erre nemsokára varrok egy scriptet és közzé is teszem itt, csak türelem :)

Plex

A Plexről, mint a Mac-es media centerek királyáról már írtam bőven a Logitech Harmonys postban - ami mégis ide kívánkozik, az a Plex "scraper" funkciója, amivel a media librarynk metaadatait lebányássza a netről.
Nálam a filmek a /Volumes/video/film/a-film-imdb-syntax-szerinti-neve/filmcim.mp4 hierarchiában laknak. Ez a struktúra ideális a Plex scraper számára, aki szépen a háttérben gyűjtögeti a libraryban megjelent mozikhoz a metaadatot. A folder nevében az invalid folderneveket generáló karaktereket (ilyen OS X alatt a kettőspont) egyszerűen elhagyom - a Plex scraper így is megtalálja őket az adatbázisban:

Újmagyarul mondva a /Volumes/video folder a NAS-ról felmountolt AFP share. Igenám, csakhogy mind a Mac Mini, mind a NAS néha bealszanak, a NAS-t firmware update esetén újrabootolom (hosszabb áramszünet esetén az UPS teszi vele ugyanezt), azaz az AFP mount elmúlik. Így volt ez egészen Mac OS X Leopard-ig, amikor jött a megváltó automount! Az automount minden esetben megcsinálja a mountot, amint valamely alkalmazásunk az automount-ra jelölt folder tartalmához nyúlna. Nézzük meg, mi kell a fenti /Volumes/video AFP share automountjához.

Első lépésnek csinálj egy bejegyzést a /etc/fstab file-ban (sudo nano /etc/fstab):

mynas:/mozi /Volumes/video url automounted,url==afp://username:password@mynas/mozi 0 0

A fenti példára az alábbiak igazak:

  • mynas: a gép neve, ami a network share-t biztosítja
  • mozi: a network share neve a mynas gépen
  • /Volumes/video: a helyi folder neve, ahova mountoljuk az AFP share-t (=mount point)
  • username: a felhasználó neve a mynas serveren
  • password: a felhasználó jelszava a mynas serveren

Ezután már csak egy sudo automount -vc kell és már kész is a csoda: innentől kezdve az AFP share magától mountolódik, valahányszor szükséged van rá.

Air Video

Az Air Video volt az első streaming app, amire rátaláltam. Ez az alkalmazás arra képes, hogy egy tetszőleges Mac-en levő videókat iOS alapú eszközökre (iPod Touch, iPhone, iPad) streameljen. Amennyiben nem a natív H.264 kódolású videót kéred tőle, úgy képes a host gépet megkérve konvertálni, sőt, akár on-the-fly konverzióval azonnal rendelkezésre tudja bocsájtani a streamet.
Az Air Video iOS alkalmazása fizetős. A konverziót FFmpeg végzi, így a server oldal ingyen van. Az FFmpeg backendnek köszönhetően létezik belőle Linux oldali streaming server port, így háttérMac hiányában is remekül használható az app.

Rivet

A végére maradt a frissen felfedezett üdvöske, akinek a server oldala egyelőre még csak trial módban fut a munkaMac-en.
A Rivet-et ugyanaz a The Little App Factory készíti, aki az előbb már emlegetett RipIt alkalmazást. A Rivet az Air Videohoz képest zenét és képet is kiszolgál a saját iOS kliensének, ráadásul a képeket hajlandó a hagyományos folderen kívül iPhoto és/vagy Aperture libraryból is szedni - ez kell nekem!
Számtalanszor fordult már elő, hogy este megmutatnék pár napközben készült képet a családnak, amelyek a frissességükből fakadóan még nincsenek archiválva és csak a munkaMac-en laknak - erre a helyzetre tökéletes megoldást látszik kínálni a Rivet. Liszenszelés szempontjából a Rivet esetében fordított a helyzet: az iOS kliensek ingyenesek, míg a Mac-only server pénzes.

Air Video vs Rivet

Ha videóról van szó, még sokáig marad az Air Video a nyeregben: az UI egyszerűen átgondoltabb / átláthatóbb, a streaming hihetetlen zökkenésmentes. A Rivet esetében sajna ugyanezt nem tudom elmondani: a bufferelés lassú, a videóknál hajlamos valami torz aspect ratio-t használni és a kép minősége is hagy kívánnivalót maga után.
A Rivet ennek ellenére még marad: ezidáig ő az egyetlen eszköz, amivel a workMac-en lakó fotókat mutogathatom a famíliának.

Mac workflow: blogpic HOWTO

A mai mese arról fog szólni, hogy hogyan készítem el egy-egy postba a szép felgörbült szélű thumbnailes képeket, mint amilyen ez a kovászos uborka itt alant:

A Mac recept

Hozzávalók:

  • Acorn - image editor Gus Mueller billentyűzetéből. Puritán, letisztult, szeretem.
  • JSTalk - script bridge, szintén Gustól. Segítségével a scriptelhető OS X alkalmazásokhoz JavaScriptes vagy Objective C-s stílusban írhatsz scripteket.
  • TextExpander - (akár) scriptelhető text makrózó tool, mely számos változó használatát (dátum és idő, clipboard tartalom, kép, kurzorműveletek) engedi meg.
  • WordPress FancyZoom plugin - Cabel Sasser JavaScriptben írt remeke. Ő állítja elő az oldalba pakolt img HTML tag-ekhez a zoom effektet, amikor a thumbnailre klattyolsz.

A workflow

A dolog onnan indul, hogy a kívánt képet 1280x1280 max méretre cropolom, majd lementem jpg formátumban. Az így előkészített képet bedobom az Acorn-ba, majd lefuttatom a Framer fedőnevű JSTalk scriptet, aki előállít egy 500 pixel széles smallDoc.png thumbnail image-et a beledobott képből.
A két képet feltöltöm a WordPressbe, majd egy TextExpander makró segítségével berámolom a postba a thumbnailhez és az alatta levő image-hez szükséges HTML kódot.

Nézzük meg a JSTalk scriptet és a TextExpander snippetet, aztán jöhet a kovászos ubi receptje. Elsőként itt a script - ehhez túl sok közöm nincs, Gus csomagolta a JSTalk példák közé, nekem meg nagyon megtetszett az eredménye. Persze lehetne ez egyszer CSS3, de amíg nem, addig jó ez így is, hardcoded módon:

 
 
var acorn = [JSTalk application:"Acorn"];
// var doc = acorn.open_("/path/to/SomeImage.jpg");
var doc = [[acorn orderedDocuments] objectAtIndex:0];
 
// scale our image down
[doc scaleImageToWidth:492];
 
var image = [[[NSImage alloc] initWithData:[doc dataRepresentationOfType:"public.png"]] autorelease];
 
// close the doc, since we've already got the data we need.
[doc close];
 
var bitmap = [image bestRepresentationForDevice:nil];
 
var extent = NSMakeRect(0, 0, [bitmap pixelsWide], [bitmap pixelsHigh]);
var xOffset = 5;
var yOffset = 35;
var curveHeight = 15;
var imageYOffset = 10;
var whiteBorderWidth = 4;
var doubleBorderWidth = whiteBorderWidth * 2;
 
var newSize = NSMakeSize(extent.size.width + (whiteBorderWidth * 2),
                         extent.size.height + imageYOffset + (whiteBorderWidth * 2));
 
var newImage = [[[NSImage alloc] initWithSize:newSize] autorelease];
 
[newImage lockFocus];
 
[[NSGraphicsContext currentContext] saveGraphicsState];
 
var shadow = [[NSShadow alloc] init];
[shadow setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:.6]];
 
var shadowOffset = NSMakeSize(0, -(yOffset + 5));
[shadow setShadowOffset:shadowOffset];
[shadow setShadowBlurRadius:5];
shadow.set()
 
// make a curved path, at the bottom of our image.
bezierPath = NSBezierPath.bezierPath();
 
[bezierPath moveToPoint:NSMakePoint(xOffset, 40 + yOffset)];
[bezierPath lineToPoint:NSMakePoint(extent.size.width - (xOffset) + doubleBorderWidth, 40 + yOffset)];
[bezierPath lineToPoint:NSMakePoint(extent.size.width - (xOffset) + doubleBorderWidth, 10 + yOffset)];
 
[bezierPath curveToPoint:NSMakePoint(newSize.width / 2, curveHeight + yOffset)
           controlPoint1:NSMakePoint(extent.size.width - (xOffset), 10 + yOffset)
           controlPoint2:NSMakePoint(newSize.width *.75, curveHeight + yOffset)];
 
[bezierPath curveToPoint:NSMakePoint(xOffset, 10 + yOffset)
           controlPoint1:NSMakePoint(newSize.width *.25, curveHeight + yOffset)
           controlPoint2:NSMakePoint(xOffset, 10 + yOffset)];
 
[bezierPath fill];
 
// get rid of our shadow
[[NSGraphicsContext currentContext] restoreGraphicsState];
 
// draw a white border
[[NSColor whiteColor] set];
[[NSBezierPath bezierPathWithRect:NSMakeRect(0, imageYOffset, newSize.width, extent.size.height + whiteBorderWidth * 2)] fill];
 
// draw our gray border around the white border
[[NSColor lightGrayColor] set];
[[NSBezierPath bezierPathWithRect:NSMakeRect(.5, imageYOffset + .5 , newSize.width - 1, (extent.size.height - 1) + (whiteBorderWidth * 2))] stroke];
 
// NSImage takes into account dpi of the image.  So we force it's size, to avoid small images.
[image setSize: extent.size];
 
// draw our image
[image drawAtPoint:NSMakePoint(whiteBorderWidth, imageYOffset + whiteBorderWidth)
          fromRect:NSMakeRect(0, 0, extent.size.width, extent.size.height)
         operation:NSCompositeCopy
          fraction:1];
 
[newImage unlockFocus];
 
 
var smallDoc = [[acorn sharedDocumentController] newDocumentWithImageData: [newImage TIFFRepresentation]];
 
[[smallDoc dataRepresentationOfType:"public.png"] writeToFile:"/Users/fns/Desktop/smallDoc.png"];
 
[smallDoc close];

Ez pedig a TextExpander snippet:

<a href="http://fns.csokolade.hu/files/%Y/%m/%clipboard.jpg"><img src="http://fns.csokolade.hu/files/%Y/%m/%clipboard.png" alt="" title="%clipboard"/></a>

A TextExpander snippetnél mindössze annyi dolgom van pluszban, hogy a kép nevét a clipboardba másoljam. Ez meg OS X alatt egy Enter a filenéven, majd ⌘C és Sanyi.

A kovászos ubi recept

Egy 5 literes befőttes üvegbe kb. 3 kiló uborka fér. Az üveget forró vízzel kimosom, majd elfektetem, hogy könnyebb legyen bele pakolni.
Az uborkák két végét levágom, hosszában 4-5-6 vágást ejtek rajtuk. Nekiállok úgy bepakolni az uborkákat, hogy függőlegesen álljanak majd az üvegben, mikor érleli őket a Nap.
Egy réteg uborka után egy nagy adag kaprot teszek be az üvegbe (persze csak akkor, ha épp nem Pappitonak készül a cucc :)), majd megint ubi és ez így megy addig, amíg meg nem telik a bödön.
Óvatosan felállítom az üveget, majd 2 púpos evőkanál sót teszek a tetejére. Felforralok 3-4 liter vizet és egy merőkanállal rákanalazom az uborkákra, amíg tele nem lesz az üveg.
A végén egy szelet kenyeret nyomok a tetejébe, letakarom az egészet egy tányérral és megy ki a Napra, 3-4 napig. Mikor a lé már zavaros, leszedem a kenyeret, de 1-2 napot adok még neki a melegen, hadd érjen össze.

Mac workflow: gyors text sync

Preface: tegnap éjjel szántam el magam, hogy egy postsorozatot indítsak. Az ötlet régóta érik: olvastam már számtalan hasonló, HOWTO jellegű általános leírást, sok user review-t egy-egy felhasznált eszközről. Most jött el az ideje, hogy hetente legalább egyszer letegyek az asztalra egy "hogy kezeli az X problémát digitálisan az eFi?" típusú szösszenetet. Na ez lesz a Mac workflow sorozat, kicsit történetmesélősen, terjengősen - ha bírod az ilyet, akkor olvass tovább.

A mostani post onnan indult, hogy tegnap délután kimentem a kertbe és megéreztem az udvaron szinte mindenhol gazként burjánzó friss kapor illatát. Ez rögtön behúzta a "kapros-túrós sütit akarok" triggert, aminek nem sokkal később az alábbi eredménye született:

Tudni kell még, hogy a látszattal ellentétben nekem nem nagyon megy a süteményes világ - bármi más jön zsigerből, de az édességeket nagy lendülettel vagyok képes elrontani, s pont ezért ilyen esetekben sokszor 3rdparty receptekhez nyúlok. Így történt ez most is.

Nekiálltam hát a neten kapros-túrós pite receptet guglizni és a wiselady.hu blogon rá is találtam a nagyanyám pitéjére hajazó HOWTO-ra - ebből már csak bevásárlólistát kell rittyenteni, elmenni a cuccokért, majd összerakni az egészet.

eFi köztudottan programozó gyerek. Ez az állatfajta arról ismerszik meg, hogy 10 perc kézimunka kiváltására simán ír egy óra alatt magának algoritmust - ergo lusta, vagy legalábbis afféle szerzet.
Namármost a recept ott van digitálisan: ebből kell egyszer egy bevásárlólista, egyszer meg egy másolat a konyhába. Persze kézenfekvő dolog lenne nyomtatni, de környezettudatosak vagyunk, úgyhogy ez az opció ugrott... ezért jön a képbe a tegnap használt két alkalmazás, jelesül a Notational Velocity és a Simplenote.

A Notational Velocity egy vérminimalista note taking alkalmazás OS X-re, míg a Simplenote egy iPhone platformra fejlesztett hasonló jegyzettömb. Mindkettő ingyen van - a Simplenote némi hirdetéseket húzgál be a statusbar-ba ezért cserébe, de ez legyen a legnagyobb baja.

A Notational Velocity jelen esetben legnagyobb előnye, hogy Simplenote sync-re képes. Innentől már egyszerű az egész:

  • Safariban recept kijelöl, bedob Notational Velocitybe, iPhone felmarkol, elmegy bolt.
  • Boltban Simplenote indít, lista alapján bevásárol, hazamegy.
  • Konyhában iPhone vagy iPad indít, recept alapján pite összerak, megesz.

A Notational Velocity szépségét nem lehet eléggé hangsúlyozni: teljesen keyboard oriented, minimalista, tag supporttal rendelkező brilliáns note taking app. Mivel nem kerül semmibe, mindenképp javaslom a kipróbálását akár magában is. Amióta rátaláltam, eFi gastro HOWTO-i mind benne laknak:

notational-velocity

User Input forr-a-dalom: 10GUI [restored post]

Remélem Steve leteszi ma az asztalra a Magic Trackpad fedőnevű kistesót:

10/GUI from C. Miller on Vimeo.

A koncepció teljesen lenyűgözött – olyannyira, hogy ma egész nap úgy nyüstöltem a keyboardot, hogy kihagytam az asztalon alatta annyi helyet, amennyit a fenti UI fizikai megvalósítása igényelne – és láss csodát, nem volt kényelmetlen egyáltalán. Sőt, csak most esett le, hogy az asztal széle és a bill között nagyjából mindig ott van ez a kb. 20 centis kihasználatlan darab.
Kicsit azért csal a concept video: a billentyűzettel együtt demonstrált multitouch pad még nagyjából A5 méretű, míg az új input device a bill nélkül már ~35 centi széles teret feltételez (az én böszme kezemmel legalábbis).

Akárcsak Józsi, én is rettentően érzem az elképzelésben az erőt. Mielőtt anno az Apple piacra dobta az új multi touch egerét, kicsit reménykedtem, hogy kijön egy olyan Alu bill, amibe integrálják a Macbook Prokban használt multitouch trackpadet (=media center input device Nirvana) – de sajna nem ez történt.

Mindettől függetlenül optimistán, nagy lelkesedéssel várom, hogy rátaláljon valaki és a conceptből termék legyen.

Az OS X esete a tagekkel

Az OS X régóta (fds tudja mióta, de talán 10.5) tárol a fileokhoz különböző metaadatokat - teszi ő ezt azért, hogy a beleintegrált Spotlight keresőmotor a metaadatok alapján is képes legyen gyorsan megtalálni valamit az általunk épített adatdzsungelben. A Mac óperenciás rendszerébe integrált metadata engine kivesézését már jóval korábban megtette a kiváló John Siracusa az Ars Techina divjein - ez a post igyekszik inkább a felhasználóbarát, kevésbé nerd oldalról hozzátenni egy keveset, amikor azt mondja: itt az ultimate tagging megoldás a Gravity Applications Tags nevű software-e személyében:

A Tags az openmeta standardot használja, s a tageket szabványos "extended attribute"-ként (=xattr) tárolja.
Az openmeta project wiki oldalán számos software közül választhat az OS X user, ha épp a Spotlight motoron túl saját metaadatot gyártani támadna épp kedve - az én választásom több próbálkozás után a Tags-re esett (az igazat megvallva jó rég láttam először, de mostanában angelday hívta fel rá a figyelmem).
A Tags UI korrekt, kedvelem. A keresője egy okosított Spotlight: a találatokon SPACE-t nyomva ugrik azonnal elő a QuickLook ablak (igen hasznos featúra), a találatok között szereplő folderekben mászkálhatok még a kereső ablakon belül, a találatok szabadon draggelhetőek. A sebessége is teljesen jó (nota bene: a gyári Spotlight kereső ugyanúgy használható egy tag keresésére a tag:amitkeresel szintaxissal).

A legvégére maradt a legfontosabb kérdés: "de minek taggelsz kézzel, eFi?"

A választ javarészt a képként pdf-be scannelt hivatalos papírok adják meg. Jó két éve vásároltam egy Fujitsu ScanSnap S500M nevű dokumentumscannert - azóta minden egyes beérkező hivatalos levél átmegy a scanneren, aki egyszerre olvassa a papír 2 oldalát, majd a képként behúzott dokumentumot beágyazza egy pdf-be és időbélyegző-szerű névvel ellátva elteszi egy folderbe. Ezek a file-ok aztán megkapják a tagjeiket és onnantól bármikor egy mozdulattal előránthatóak.
De ugyanígy taggelhetem a Safariban/Firefoxban olvasott oldalt, vagy akár a Mailplane-ben olvasott levelet is - a támogatott alkalmazások listája erre.

A Tags jelenleg a 2.0.2-es verziónál tart. Az aktuális változatban találtam egy fura hibát: ha egy másik, szintén openmetát használó tagging app már felvett egy ő vagy ű karaktert tartalmazó taget, akkor azt a Tags nem hajlandó felismerni és alkalmazni sem egyetlen dokumentumon sem. A bugreport ment a fejlesztőknek, egy napra rá jött a köszönőlevél, melyben írják, hogy dolgoznak rajta és értesítenek, amint kész a fix.

Egy szó, mint száz, eddig tetszik.

Update: fds Mester elmondja a historyt (ezúton köszönjük az infot):

xattr támogatás 10.4 óta van, resource forkok meg classic mac óta, meg a Finder comment mező HFS-ben.

Érdekességképpen Mefi postja 2 évvel ezelőttről: Címkézett vincseszter

Meteo script update

Tavaly írtam még ezt a pici AppleScriptet, ami leszedi a koponyeg.hu és az idokep.hu site-ok időjárás-vizualizációs képeit és feldobja a monitorodra full screenben az OS X Quick Look-ja segítségével (slight keyboard hack, de megy). A site-ok frissültek, eljött az update ideje is: mostantól nem nyakló nélkül jpg-nek ment a script mindent, hanem amire utasítod. Ennek köszönhetően pl. az idokep.hu széltérkép animgif-je animgif marad és teljesen jól mutatja a felhőtérkép után pakolva, hogy merre visszi a szél az előző képen látható felhőket (ma pont jól is jön).

Lustáknak a script app-ba fordítva, zip-be csomagolva itt, magyar billentyűzethez itt, a forrás meg alant (a script a ~/Pictures könyváradban létre fog hozni egy delme-meteo nevű foldert, amibe a leszippantott képeket menti. Ezt a foldert törli és létrehozza minden alkalommal újra és újra.):

(*
	Meteo
	by Gabor PENOFF (http://fns.csokolade.hu)
 
	release 20100516-1002
 
	Requirements:
	- before run you need to Enable Access for Assistive Devices in SysPrefs/Universal Access
	- install Growl from http://growl.info to get non-modal notification dialogs
 
	Usage:
	- just run the script
 
	That's all.
*)
 
set myScriptID to "Meteo" -- ID for Growl display
 
-- set date variables:
set myYear to get text 1 thru 4 of (year of (current date) as string)
set myMonth to month of (current date) as number
if myMonth < 10 then set myMonth to "0" & myMonth as string
set myDay to day of (current date)
if myDay < 10 then set myDay to "0" & myDay as string
set myHour to hours of (current date)
if myHour < 10 then set myHour to "0" & myHour as string
set myMinute to "00"
 
set tmpDir to "delme-meteo"
set myFilePrefix to "delme-met-"
set tIdokepStart to "http://www.idokep.hu/arch_kep.php?kep="
 
set myURLs to {¬
	"http://img.koponyeg.hu/img/15napos/" & myYear & "/" & myMonth & "/1_" & myYear & "-" & myMonth & "-" & myDay & "grafikon.png|png", ¬
	"http://terkep.idokep.hu/kep.php?kep=mix|jpg", ¬
	"http://terkep.idokep.hu/kep.php?kep=hoterkep2&regio=hu1680|jpg", ¬
	"http://terkep.idokep.hu/kep.php?kep=felhokep2&regio=hu1680|jpg", ¬
	"http://terkep.idokep.hu/kep.php?kep=szelterkep2_anim|gif", ¬
	"http://terkep.idokep.hu/kep.php?kep=szelterkep2&regio=hu1680|jpg", ¬
	"http://terkep.idokep.hu/kep.php?kep=legnyomasterkep|jpg", ¬
	"http://feny.idokep.hu/kep.php?kep=csap24|jpg", ¬
	"http://feny.idokep.hu/kep.php?kep=csap1|jpg", ¬
	"http://feny.idokep.hu/kep.php?kep=aqua|jpg", ¬
	"http://terkep.idokep.hu/kep.php?kep=rh|jpg", ¬
	"http://terkep.idokep.hu/kep.php?kep=uv|jpg", ¬
	"http://terkep.idokep.hu/kep.php?kep=pollen0|jpg"}
 
set rootDir to (path to home folder as string) & "Pictures"
tell application "Finder" to set fullDir to rootDir & ":" & tmpDir -- save fullDir
 
set myNotification to "Downloading METEO images to " & fullDir & "..."
tell me to notifyWithGrowl(myScriptID, myNotification)
 
try
	tell application "Finder" to delete fullDir
end try
 
tell application "Finder" to make new folder at alias rootDir with properties {name:tmpDir}
 
-- download files:
tell application "URL Access Scripting"
	set i to 1
	repeat with myURL in myURLs
		set thisURL to (text 1 thru ((offset of "|" in myURL) - 1) of myURL)
		set thisExt to (text ((offset of "|" in myURL) + 1) thru (length of myURL) of myURL)
		set the myFile to fullDir & ":" & myFilePrefix & i & "." & thisExt
		download thisURL to file myFile replacing yes
		set i to i + 1
	end repeat
end tell
 
-- display images using full-featured QuickLook window:
tell application "Finder"
	activate
	open folder fullDir
	set current view of front Finder window to list view
end tell
 
tell application "System Events"
	key code 0 using {command down} -- cmd+a
	key code 6 using {command down, option down} -- cmd+opt+y; y is 16 for US, 6 for Hungarians :)
end tell
 
-- that would be the callback after QuickLook:
--tell application "Finder"
--	activate
--	set current view of front Finder window to v
--	close front Finder window
--end tell
 
-- display images using a very limited (dumb) QuickLook window:
--do shell script "qlmanage -p  " & (POSIX path of fullDir) & "/* >& /dev/null"
 
-- 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 "Preview"
	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

Az iPad, a Magic Piano és én

A január 27-i iPad bejelentés után én is furcsán néztem Steve új kütyüjére. Hiányzott belőle a sok forradalmi hardware megvalósítás, amit a PatentlyApple.com-on sorra megjelent szabadalmak alapján a készülékbe képzeltem.

Lehetne most a cucc zártságán, vagy bármi más rossznak gondolt tulajdonságán vitatkozni, én azonban nem fogok - egyrészt ezt megteszik a témában szakérteni akaró tech és nemtech blogok, másrészt ez a post ezzel szemben azért jött létre, hogy megosszon egy friss élményt Veled.

A tegnapi nap csak úgy ömlött be a meló, valaki nagy kanállal keverte a problémás bödönt odafent. Kora reggeltől cirka este 8-ig dolgoztam, majd 8 óra tájban lehuppantam az iPad-del a fotelbe kiolvasni a világot. Ekkor jött szembe a display-en a Smule alkalmazásának, a Magic Piano-nak az ikonja.

Kisgyerek korom óta él bennem erősen valami látens zenélni akarás, amit egy fekete-fehér billentyűzet rögtön triggerelni képes: leülök elé és elkezdek a fejemben járó dallamokkal próbálkozni, egy-két ujjal, akkordmentesen, de nagyon élvezve mindezt. Per pillanat nincs itthon fekete-fehér keyboard, ellenben a Smule alkalmazásában pont van, így be is húzott a trigger és elkezdtem vele játszani.

Pár perc után jutott eszembe kipróbálni a duet módot, amit a coderek arra találtak ki, hogy összehozzanak két, iPad-re rajzolt zongorabillentyűzeten klimpírozó dilist a bolygón: az internet közvetíti a két gép között egymás játékát.
Természetesen az ilyesfajta "duett" nem egy klasszikus koncertélmény: sokszor jön disszonáns hang a másik oldalról, illetve nyilván te is adsz a másik fülének keményen. Azonban egyszer kell kifogni egy olyat, mint amire tegnap este én leltem: Jon, az USA Georgia államából lógott egy másik iPad-en és pöttyögött a saját Magic Piano alkalmazásában.

Sajnos csak a negyedik kör után jutott eszembe, hogy rögzítsem az egészet és az is lehet, hogy egy külső szemlélőnek nem ad annyit vissza, mint amennyit én átéltem. A legjobb, közösen produlkált részek lemaradtak, de azért talán mégis valamit visszaad a 3 perces mozi:

Magic Piano duet from Gabor Penoff on Vimeo.

A jólnevelt eFi.blog olvasó jól tudja, hogy nem szokásom frissen megjelenő gadget-ekről istenítve írni, így ezúttal sem ezt teszem. Mindössze arra szerettem volna felhívni a figyelmet, hogy micsoda élményt képes adni ez az 1 dolláros alkalmazás egy ilyen multitouch eszközön. Ha emlékszel gyerekkorodból, mit éltél át, amikor a Harmadik típusú találkozásokban először szól vissza a pentaton dallamra az idegen űrhajó:

...na, ez pont ugyanilyen érzés. Jon, neked meg ezúton köszönöm az élményt és nagyon remélem, hogy találkozunk még a Magic Piano-ban!