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:
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:
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:
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.
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.
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:
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:
Végül nézzük meg a scriptet egyben, úgy, ahogy magamnak implementáltam:
(*
Translate
by Gabor PENOFF (http://fns.csokolade.hu)
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.
*)onrun{input, parameters}set srcText to input astextset srcLang to"en"-- source languageset tgtLang to"hu"-- target languageset myKey to"AIzaSyCI-2oapEkMpRFfd6Ltv4HkZhf1Zq-VU9o"set myScriptID to"Translate"-- ID for Growl displayset myTranslation todo shell script"/usr/bin/curl -G --data-urlencode q=""ed formof srcText &" --data-urlencode key=""ed formof myKey &" --data-urlencode source=""ed formof srcLang &" --data-urlencode target=""ed formof tgtLang &space"ed formof"https://www.googleapis.com/language/translate/v2"if myTranslation =""thentellmeto notifyWithGrowl(myScriptID, "ERROR")returnendif-- 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 totext myStartPos thru-1of myTranslation
set myEndPos to(offset of myPostfix in myText)set myText totext1thru(myEndPos -1)of myText
tellmeto notifyWithGrowl(myScriptID, myText)return""-- myTextendrun-- GrowlCheck:on growlInstalled()trydo shell script"ls /Library/PreferencePanes/Growl.prefPane/"returntrueonerrorreturnfalseendtryend growlInstalled
-- Growl notifier:on notifyWithGrowl(myApp, myText)set myIconApp to"Safari"set notificationID to myApp &".default"if growlInstalled()thentellapplication"GrowlHelperApp"-- list of notification typessetthe ANL to{notificationID}-- list of enabled notificationssetthe DNL to{notificationID}-- register script
register asapplication myApp all notifications ANL default notifications DNL icon ofapplication myIconApp
-- send notification
notify withname notificationID title myApp description myText applicationname myApp
endtellelse-- skip alert if no Growl installed--display alert "Growl is not installed"endifend 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.
Egy ideje megy az adok-kapok thread a neten a Motorola friss reklámjával kapcsolatban. Először csak commentet kezdtem írni a meglevő postokhoz / megosztásokhoz, aztán úgy döntöttem, hogy mégis inkább saját post lesz belőle, mivel van az egész dologban egy gondolat, ami mindig elbújik, márpedig szerintem nem szabadna, hiszen az a legfontosabb.
Nézzük meg a Motorola releváns reklámját, mellyel az iPad-gyilkos tabletjüket kívánják beharangozni:
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.
Ha előfordult már veled is, hogy az asztalon levő MacBook*-ot gyorsan mobillá kellett tenned és ezért a sleep előtt egy rakat volume-ot kellett kézzel unmountolnod, akkor itt egy kis segítség. A beforesleep.sh unmountol mindenkit:
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{}
A 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:
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!
Régóta gyűjtöm már a neten megjelenő Star Wars saga related képeket. Ma, fél nap debug csapta ki annyira a biztosítékot, hogy félretegyem a melót és összerakjam egy részükből az első klipet azokból, amiket már egy ideje tervezgetek - íme:
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:
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:
A dolog ott indult, amikor az Apple 2010 szeptemberében bemutatta az új, 2. generációs 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ü.
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.
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:
Á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:
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:
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:
Végül az emlegetett stock Finder ablak az alábbi képre klikkolva rendes méretben:
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/shSCRIPT=`basename$0`if["$#"!= "1"]; thenecho"$SCRIPT - list changes made within a month"echo"Usage: $SCRIPT yyyymm"exit1fiMYPATH=/Users/fns/Documents/xp/support/_code
PATHLEN=$((${#MYPATH}+1))#+1 to cut first slash character as wellecho"$SCRIPT - list of changes made on $1\n"for f in $(find$MYPATH-iname"changelog*")doif[-a$f]; thenLOG=`cat$f|grep"'$1"`if["$LOG"!= ""]; thenSRC=${f:PATHLEN}echo"Log from $SRC:"echo"$LOG\n"fifidone
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.