Monthly Archives: July 2010

/me away

Preface: a fotókat eFi búvár barátai követték el, amelyek közléséért ezúton küldenék nekik később élesre váltható, ám jelenleg még virtuális seritalt. Feleim, “Elhúzok egy hétre víz alá” – mindig ezt mondom, ha merülni megyek. Több kolegám szokott rácsodálkozni erre – ott csillog a szemükben a “de mi abban a jó?” kérdés, amit csak ritkán fogalmaznak meg. Ezért gondoltam arra, hogy mielőtt elmegyek, hat példán keresztül megmutatom, nekem mi ebben a jó – íme:

1. Relax

Amint a hajó kiér a nyílt vízre, a térerőnek annyi, garantáltan nem jönnek a support request hívások. A legfontosabb “dolgod” az, hogy csendben nézz, megfigyeld a víz alatti világot.

2. Más a fény

A vízalatti világban teljesen mások a fények. A felszín hullámzása a széltől függő intenzitással lengeti a Nap fénykardjait a mélykék felé. Ez valami olyan csoda, amit minden fotósnak látnia kellene élőben. A víztömeg fokozatosan nyeli el a különböző hullámhosszú fényt – ~10 métertől nincs vörös, ~30-tól sárga sem, ~50-től minden kék. Van valami nyugtató az egyre kékülő mélyben.

3. A csend

Amint a füled is a vízbe ér, megszűnik a külső zajok nagy része és csak a kék marad, a fények, és benne a csend. Az egyetlen maradandó hangélményed a saját és társaid légzésének morgósan buborékoló zaja, mely merülésről merülésre szép lassan sztereotíp reflexszé alakul és azonnal kiváltja belőled a lassabb légzés – lassabb mozgás, nyugodt szemlélés viselkedésmintát, amint meghallod. Ez kell a búvárembernek, én mondom.

4. Zegzugok

A kíváncsi búvár mindenhova bekukkant a víz alatt. Na jó, kezdetben még nem, mert visszatartja a default félsz az ismeretlentől, de ahogy nő a gyakorlata, ez egyre inkább felszínre tör benne. Aki nem fél az üregektől, az előbb-utóbb bujkálós-merülés fanatikus lesz, legyen szó akár sziklaüreges merülőhelyről, akár egy belül is bejárható roncsról – mindegy, csak bujkálni lehessen egy kicsit. Az én személyes kedvencem bujkálós merülés témában a Claudia reef – megnézed a tavaly ősszel készült klipet és megérzed, hogy milyen:

Egypt 2009/11 – Claudia from Gabor Penoff on Vimeo.

5. Nyugalom

Szinte teljesen mindegy, hogy a hajnalban felkelni készülő napot nézed, a víz fodrát bámulod, vagy a naplementében figyeled a hazainduló halászokat – az egész túrát átjárja egy máshol általam nem tapasztalt nyugalom. Testestől-lelkestől valóban pihensz: szabadnak érzed magad, friss levegőn vagy, a családod / barátaid között.

6. Fun faktor

Végül, de nem utolsó sorban a dilis búvárok sok olyan dologra képesek a víz alatt, amit nem kifejezetten a tanfolyamon oktatnak nekik. Az utolsó búcsúzós merülés még csak rátesz az egész túrára egy lapáttal. Summa summarum, megyek, kipihenem az eddigi 2010-et egy kicsit, aztán jövök vissza friss élményekkel megpakolva. Stay tuned! ]]>

Safari tab render fix

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

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. Licencelé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. ]]>