Category Archives: workflow

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

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

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

IP_webcam-in-da-kitchen

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

IP_camera-UI

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

Mac workflow: Alfred

Preface: száraz, geek bejegyzés jön, OS X addict kockáknak.

Jó ideje agyalok már, hogy egyszer megírom ezt a posztot. Nem biztos, hogy a legjobb időben, hiszen ősszel jön a Mac OS X Yosemite, amiben a Spotlight majd jól megokosodik. Én azonban nem játszottam még a bétával, a poszt tárgyául szolgáló Alfred viszont annál inkább a szívemhez nőtt.

Az Alfred a készítők definíciója szerint egy “productivity” alkalmazás, mely a korábbi Quicksilver, illetve a most is aktívan fejlesztett Launchbar launcherek konkurrense.

Most eltekintek attól, hogy a sok default Alfred jóságot részletesen ismertessem, azokról született már kismillió jó írás. Rettenet erő lakik a szoftverben, főleg, ha pénzt áldozol a 17 GBP-be kerülő PowerPack kiegészítésre. Amint van PowerPackod, már gyárthatod is a friss workflow-kat Alfredben. Én is csináltam sok ilyet és használok mások által fejlesztetteket – ebből szedtem most össze egy csokorra valót kedvcsinálónak. Lássuk a macit!

Uni-Call

FaceTime vagy Skype hívást tudok desktopról indítani anélkül, hogy az egeret használnám, így:

callf

calls

Currency converter

Árfolyamot vált, baromi gyorsan, bármiről bármire. Beállíthatod a kedvenc célárfolyamod default targetnek, de harmadik paraméterként bármikor konvertálhatsz tetszőleges másikra is:

curr1

curr2

curr3

Image dimensions

Kép méretét adja vissza azonnal:

dim1

dim2

Encode

URL/UTF8/Base64 formába konvertálja az inputot:

encode

Animgif search

giffy

Google translate

UI-ben tökölés nélkül fordítja az inputot azonnal. Csináltam belőle 3 targetet: magyarra, angolra és lengyelre:

gt-2hu

gt-2en

gt-2pl

Safari history search

h

IP és Mac addressek CLI nélkül, gyorsan

ip

mac

Disk space check azonnal

space

Compose mail

m

Keresés a menubarban egér nélkül

menu

Új file gyártása és azonnali megnyitása

nf

nfo

Cheatsheet azonnal

qr

Rate current iTunes track és add current iTunes track to singalong playlist

rate

singalong

Recent items

rec

rec-doc

rec-downloads

rec-folders

Save current URL with tags

save1

save2

Send current URL

send1

send2

Show all iCloud tabs

tabs

Timezones

tz

Ha kedvet csináltam, már megérte!

Mac workflow: Tagged bookmarks

Már az OpenMeta tagging felfedezése óta használom OS X alatt a tageket (btw OpenMeta tagek: OS X 10.9 alatt bevezetett kMDItemOMUserTags tagekké konvertálására itt ez a csodás script). A 10.9 megjelenése óta várom, hogy majd csak belekerül a Safari bookmarkok mellé is a tagging lehetősége – aztán egy nap meguntam a várakozást és csináltam magamnak egy scriptet a probléma megoldására:

set defaultPath to "SYSTEM:Users:fns:Dropbox:URL" as alias

tell application "Safari"
	set theName to name of front document
	set theURL to URL of front document
end tell
set theName to replace_chars(theName, ":", " -")

tell application "Safari"
	activate
	set resultFile to (choose file name with prompt "Save .webloc File" default name theName default location defaultPath) as text
end tell

set text item delimiters to ":"
set fileName to last text item of resultFile
set filePath to text 1 thru lastpos(resultFile, ":") of resultFile
	
tell application "Finder" to make new internet location file at filePath to theURL with properties {name:fileName}

on replace_chars(this_text, search_string, replacement_string)
	set AppleScript's text item delimiters to the search_string
	set the item_list to every text item of this_text
	set AppleScript's text item delimiters to the replacement_string
	set this_text to the item_list as string
	set AppleScript's text item delimiters to ""
	return this_text
end replace_chars

on lastpos(textstring, thischar)
	return (length of textstring) - (offset of thischar in (reverse of text items of textstring as string))
end lastpos

Ha elindítod a scriptet, akkor az feldob egy file save requestert, amiben átírhatod a mentendő .webloc file nevét, illetve tageket definiálhatsz. Nálam az így mentett .webloc file-ok a Dropboxban tartott URL nevű folderbe kerülnek, így minden gépemre szépen szinkronizálódnak, metadatával együtt. A default mentési foldert ebben a sorban definiálhatod át:

set defaultPath to "SYSTEM:Users:fns:Dropbox:URL" as alias

A scriptet nálam egy Alfred workflow indítja, de futtathatod akár egy FastScripts keyboard shortcuttal, csinálhatsz belőle Automator service-et, vagy ahogy neked kényelmes – TIMTOWTD.

Mac workflow: screenshot megosztás

Józsinál olvastam az előbb, hogy szerinte az optimális megoldás screenshot megosztásra, ha bekapcsolja a Dropbox automata képernyőfotó uploaderét, ami majd feltölt minden screenshotot a cloudba. Én ettől kifejezetten viszolygok, viszont egészen hasonló, csak picit paranoidabban kontrollált megoldást használok ugyanerre. Józsi nem szereti a 3rd party szoftvereket, így neki ez a verzió valószínűleg nem játszik, de ha te is hozzám hasonló shareware junkie vagy, akkor neked még jól jöhet az én workflow-m.

Megosztásra én is a Dropboxot használom, csak épp nem hagyom neki, hogy hübele-Balázs mindent feltöltsön a felhőbe. Ehelyett létrehoztam a Dropbox folderben egy screenshots mappát, ami droptargetként kint van a dokkon és abba dobom a megosztandó screenshotot.
A folderen ül egy Hazel folder rule, ami a beérkező file nevéből kitalálja, hogy mi lesz a Dropbox URL, majd azt bepakolja a Clipboardra:

set file_path to theFile as text
try
	set text item delimiters to ":"
	set file_name to last text item of file_path
	set text item delimiters to ""
on error
	set text item delimiters to ""
end try

set file_name to (do shell script "/usr/bin/php -r 'echo rawurlencode("" & file_name & "");'")

set dropboxPath to "https://dl.dropboxusercontent.com/u/MYDROPBOXID/screenshots/" & file_name
set the clipboard to dropboxPath

A scriptben szereplő MYDROPBOXID szöveget a saját Dropbox ID-dre kell cserélni, hogy működjön a dolog. Ehhez elég, ha egyetlen, a Dropbox felhőben levő file URL-jét meglesed, ott van benne az ID.

Én ezen túl még “kettőre zárom” a dolgot: futás után megváltoztatom a file color labelét tagjét szürkére:

hazel-getdropboxlink-rule

A módszer egyetlen hátránya, hogy sokszor a Hazel rule előbb készül el a clipboardba rakott URL-lel, mint ahogy a file felérne a felhőbe, így ha gyorsan osztod meg a linket, akkor előfordulhat, hogy az még nem él. Ha a Dropbox folderében levő file-okról meg lehetne tudni valahogy, hogy azok felkerültek-e már a felhőbe, akkor ez a probléma is megoldódna.

Mielőtt bárki “de hát van stock Folder Acctions!”-t kiáltana, fűszerezzük meg még egy Hazel szépséggel: ha kidobnád, vagy csak archiválnád a screenshotjaidat, mert mondjuk zavar, hogy foglalja a Dropbox tárhelyed, akkor archiváltasd őket automatikusan:

hazel-removeoldscreenshots-rule

Ugyanezt persze meg lehetne csinálni saját tárhelyre FTP-zve is – akkor még a feltöltés-linkgyártás combo sem csúszna meg. Aki megírná ehhez a scriptet, nosza itt a comment box!-)

Update

Csak azért, hogy kiálljak a szerintem egyik leghasznosabb OS X alkalmazás mellett, olvastam Hazel doksit és megcsináltam az egészet Dropbox nélkül is. Ehhez mindössze egy FTP tárhelyre van szükséged – íme a rule:

hazel-screenshot-uploader-ftp-only-rule

A fenti scripthez képest természetesen csak a https://dl.dropboxusercontent.com/u/MYDROPBOXID/screenshots/ értékét kell arra a folderre változtatnod, ahova feltöltetted a képet.

Mac workflow: Open source URL, v2

A probléma

Leszedtél egy file-t valahonnan, a browser beletette a file metaadatai közé, hogy honnan kotortad azt elő a neten és most vissza kellene találnod a forráshoz.

A megoldás

Korábban ezt megcsináltuk Thingiverse-specifikusra, de nem tetszett, hogy a script önkényesen dönt, hogy nekem épp melyik URL kell, ezért faragtam belőle popup menüset, amivel Te választhatsz, hogy melyik metában tárolt URL-t nyissa a Safari. Lustáknak itt a bezippelt workflow, aki meg olvasgatná itt a postban a forrást az ide nézzen:

on run {input, parameters}
	
	set theFile to (input)
	set aFile to quoted form of POSIX path of theFile
	set theURL to (do shell script "mdls -name kMDItemWhereFroms -raw " & aFile)
	
	if theURL is "(null)" then -- no attribute
		set theURL to "(URL info not found)"
		set theMessage to ""
	else
		
		set URLs to {}
		repeat with i from 1 to the count of paragraphs of theURL
			set p to paragraph i of the theURL
			set firstQ to findFirst(p, """)
			set lastQ to lastOffset(p, """)
			
			if firstQ > 0 and lastQ > 0 and (lastQ - firstQ > 1) then
				copy characters (firstQ + 1) through (lastQ - 1) of p as string to q
				set end of URLs to q
			end if
		end repeat
		
		set selectedURL to false
		if (count of URLs) = 1 then
			set selectedURL to (item 1 of URLs)
		else if (count of URLs) > 1 then
			set selectedURL to (choose from list URLs with title "Open URL" with prompt "Select URL to open:" without multiple selections allowed)
		end if
		
		if (selectedURL is not false) then
			tell application "Safari"
				tell window 1
					set current tab to (make new tab with properties {URL:selectedURL as text})
				end tell
			end tell
		end if
	end if
	return input
end run

on findFirst(str, findString)
	-- HAS (http://applemods.sourceforge.net/mods/Data/String.php)
	local str, findString, len, oldTIDs
	set oldTIDs to AppleScript's text item delimiters
	try
		set str to str as string
		set AppleScript's text item delimiters to findString
		considering case
			set len to str's first text item's length
		end considering
		set AppleScript's text item delimiters to oldTIDs
		if len is str's length then
			return 0
		else
			return len + 1
		end if
	on error eMsg number eNum
		set AppleScript's text item delimiters to oldTIDs
		error "Can't findFirst: " & eMsg number eNum
	end try
end findFirst

on lastOffset(the_text, char)
	try
		set i to 1
		set last_occurrence to 0
		repeat count of the_text times
			if item i of the_text as string = char then
				set last_occurrence to i
			end if
			set i to i + 1
		end repeat
	on error
		return 0
	end try
	return last_occurrence
end lastOffset

Mac workflow: Open source URL service

Update: kicsit szebb, v2-es megoldás erre.

Ahogy töltögettem le Karácsony előtt a sok printelni való STL file-t a Thingiverse-ről, egyre többször jött elő, hogy meg kellene újra néznem valamit az STL file-t tartalmazó oldalon újra. Szerencsére OS X alatt a kMDItemWhereFroms metadata attribútumba bekerül a letöltés URL-je, amit én néha meg-meg néztem már korábban is egy vérbuta shell scripttel, ami nálam eddig így nézett ki:

#!/bin/sh
mdls -name kMDItemWhereFroms -raw "$*"

Ez egy zárójelek közé zárt comma delimited URL listát ad vissza. Nekem ebből az URL listából az utolsó kellene (a Thingiverse Amazon S3 storage-et használ, az első URL a storage-ra mutat, míg a második az eredeti Thingiverse oldalra), mégpedig minél kevesebb szüttyögéssel, azaz monjduk egy Service formájában.
Némi rövid googling után dobta a gép a közel konyhakész scriptet a MacScripter oldaláról, már csak hozzá kellett ragasztani az Automator Service script számára szükséges paraméterátvételt és kész is:

property getSpecific : false -- show the specific download URL?
on run {input, parameters}
	
	set theFile to (input)
	set aFile to quoted form of POSIX path of theFile
	set theURL to (do shell script "mdls -name kMDItemWhereFroms -raw " & aFile)
	if theURL is "(null)" then -- no attribute
		set theURL to "(URL info not found)"
		set theMessage to ""
	else
		if getSpecific then -- get the first item (the download URL)
			set theURL to paragraph 2 of theURL
			set here to offset of """ in theURL
			set theURL to text (here + 1) thru -3 of theURL -- the download URL
			tell application "Finder"
				set name of theFile to theURL --I have no idea what im doing
			end tell
		else -- get the last item (the page/site URL)
			set theMessage to "page/site "
			set theURL to paragraph -2 of theURL
			set here to offset of """ in theURL
			set theURL to text (here + 1) thru -2 of theURL
		end if
		
		tell application "Safari"
			tell window 1
				set current tab to (make new tab with properties {URL:theURL})
			end tell
		end tell
	end if
	
	return input
end run

Ebből nagyjából két klikk az Automator workflow megalkotása, de ha ezzel bajban lennél, akkor

  • konyhakész service zippelt változata leszed innen
  • bemásol a ~/Library/Services/ folderbe, majd ott kicsomagol

Find duplicates

A probléma

Szorgosan fotózunk. Idővel rákapunk arra is, hogy a fényképeinket szépen rendszerezett formában tároljuk valamelyik fotós workflow alkalmazás segítségével. A fotóink egy folder struktúrába importálódnak, példás rendben. Minden oké, amikor egyszer csak véletlenül egy nagy kupac régi képet kétszer húzunk be a libraryba – kész a baj, egy zsák fotónk lesz meg két példányban, feleslegesen. Lista kellene a duplikált file-jainkról!

A megoldás

Mielőtt alkalmazást keresnénk a feladat leküzdésére, agyalunk egy kicsit és kitaláljuk, hogy *nix-like környezetben menni fog ez külső segítség nélkül is.
Két file egyezésének megállapításához pont elég, ha azok MD5 hash-e megegyezik. Írjunk hát egy scriptet, amely az egyező MD5 hash-ek alapján elkészít egy duplikált file listát:

# A script a duplikált file-okat tartalmazó foldert várja paraméterként
# és a jpg kiterjesztésű állományok egyezését vizsgálja csak.

NAME="*.jpg"
ALLFILES="/tmp/finddups.allfiles.tmp"
DUPHASHES="/tmp/finddups.duphashes.tmp"

find $1 -name "$NAME" -exec md5 {} \; | sort >$ALLFILES
find $1 -name "$NAME" -exec md5 -q {} \; |sort|uniq -d|sort -n >$DUPHASHES

while read hash
do
	cat $ALLFILES | grep $hash | grep -oE '\((.*-[0-9].jpg)\)' | sed "s/(// ; s/)//"
done <$DUPHASHES

Nézzük meg, mit csinálunk. Az első find-del kezdődő sor a célfolderben levő összes jpg file-unkból számol egy MD5 hash-t, majd a filelistát hash-estől leteszi egy file-ba. Ez a file valahogy így fog kinézni:

MD5 (./2000/05/15/20000515-0084.jpg) = 747888000b422d619a1b308346b7d81e
MD5 (./2000/05/15/20000515-0086-2.jpg) = d3a064924fb8306519475b09cb90d66b
MD5 (./2000/05/15/20000515-0086-3.jpg) = d3a064924fb8306519475b09cb90d66b
MD5 (./2000/05/15/20000515-0086.jpg) = d3a064924fb8306519475b09cb90d66b

A következő sorban mégegyszer végigmegyünk a jpg filejainkon, de csak az MD5 hash-üket kérjük, mindenféle sallang nélkül (=ezt adja az md5 -q opciója), majd a uniq binárissal csak a duplikált hash-eket szűrve (=-d opció) letesszük az összes, többször előforduló MD5 hasht egy másik file-ba.
Ezután már csak végig kell rohannunk a duplikált hash-eken, kikeresni, hogy mely file-okhoz tartoznak és kilistázni azokat - ezt teszi a script végi ciklus.
A ciklus közepén levő regexp arra hivatott, hogy az első körben előállított hash-es filelistából csak a filenevek jelenjenek meg - azok közül is csak azok a file-ok, amelyek neve -[0-9].jpg-re végződik.

Tudom, hogy a végén levő sed (amellyel a kibányászott filenevek elől és mögül lecsippentjük a zárójeleket) ágyúval verébre kategória. Nekem sem tetszik, gusztustalan - azonban szűk egy órán át nem találtam más megoldást, ezért maradt ilyen. Commentben lehet szárnyalni, ki hogyan választaná le így shellben az egrep által elkapott első capture group-ot.

Media Center Szent Grál: behódolunk a H264-nek

A probléma

Mondjuk, hogy van egy zsák DVD-nk (tényleg van), adja Isten találtunk hozzájuk .SRT feliratokat is és mindezt cakkumpúder csinosított formában szeretnénk felajánlani az iTunes librarynknak népgazdasági hasznosításra (egy üveg fröccs már bennem van, elnézést a hablatyért).

A megoldás

A feladatot két részre bontjuk: előbb hagyjuk a computerünket tömegesen konvertálni, aztán majd szerzünk az eredményhez metaadatot is, végül megszólítjuk iTunes komát is. Csapjunk bele!

1. lépés: tömeges konverzió

Szóval nagyjából úgy, ahogy a fenti bagoly rajzolós HOWTO mutatja. Igaziból persze leszedünk egy HandbrakeCLI-t, bemásoljuk a /Applications mappánkba a binárist és megírjuk az alábbi scriptet:

#!/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 m4v-ket 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. 
#
convert() {
	film="$1"
	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

	options="-e x264 -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 -X 960 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500 -C 8"
	
	case $srtc in
		0 )
			# ha felirat nélkül is konvertálnál
			echo "" | $hbcli -v -i "$film" -o "$2" $options
			;;
		1 )
			# ha konvertálnád a home videód akkor is, ha csak a default magyar felirat van meg hozzá
			echo "" | $hbcli -v -i "$film" -o "$2" $options --srt-file "$srtfiles" --srt-codeset "$srtcodes" --srt-lang "$srtlangs"
			;;
		2 )
			# 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 "" | $hbcli -v -i "$film" -o "$2" $options --srt-file "$srtfiles" --srt-codeset "$srtcodes" --srt-lang "$srtlangs"
		 ;;
	esac

	return
}

hbcli=/Applications/HandBrakeCLI
source_dir="."
input_file_type="avi"
output_file_type="m4v"

echo "# Using HandBrakeCLI at "$hbcli
echo "# Using source directory "$source_dir
echo "# Converting "$input_file_type" to "$output_file_type

# Convert from one file to another
convert() {
   # The beginning part, echo "" | , is really important.  Without that, HandBrake exits the while loop.
   echo "" | $hbcli -i "$1" -o "$2" --preset="AppleTV 2" -C 8;
}

# Find the files and pipe the results into the read command.  The read command properly handles spaces in directories and files names.
find "$source_dir" -iname "*.$input_file_type" | while read in_file
do
        echo "Processing…"
   echo ">Input  "$in_file

   # Replace the file type
   out_file=$(echo $in_file|sed "s/\(.*\.\)$input_file_type/\1$output_file_type/g")
   echo ">Output "$out_file

   # Convert the file
   convert "$in_file" "$out_file" 

   if [ $? != 0 ]
        then
            echo "$in_file had problems" >> handbrake-errors.log  
        fi

   echo ">Finished "$out_file "\n\n"
done

echo "DONE CONVERTING FILES"

A sctiptünkben az options= kezdetű sorban a -C utáni számot kicseréljük a rendelkezésünkre álló CPU magok számára.

Egy folderbe bepakoljuk az eddig bután .avi formában tárolt filmjeinket / sorozatainkat, melléjük tesszük az .srt file-okat (ha ezt nem értjük, elolvassuk a scriptet, nem csak nyakló nélkül mentjük). Ha ez kész, nyitunk egy shellt, bemászunk a filmek könyvtárába és elindítjuk a scriptünket, majd a végén örülünk a sok szép új m4v file-nak.

2. lépés: metázunk

Az előbb lett sok szép mv4 file-unk – ezekbe kell nekünk proper metadata. Ehhez vásároljuk meg a Mac App Storeból az iDentify alkalmazást, esetleg szedjük le a trialt innen.
Az iDentifybe bedobáljuk az m4v file-jainkat, ő meg szépen feltaggeli őket. Ha ezt mégsem teszi meg magától, akkor nagy eséllyel nem tudott kitalálni szerencsétlen semmi kézzelfoghatót a filenévből. Ilyenkor forduljunk az IMDB-hez bizalommal: keressük ki a film / sorozat IMDB oldalát és adjuk meg az iDentifynek az IMDB által használt azonosítót.

3. lépés: iTunes etetés

A drága megalomán média alkalmazásunk minden valószínűség szerint a ~/Music/iTunes mappában tárolja a cuccait. Ebben a folderben keressük meg az iTunes Media/Automatically Add to iTunes könyvtárat és dobáljuk bele vadul az előbb legyártott, majd gondosan feltaggelt m4v állományainkat.
Az iTunes észreveszi az új jövevényeket, belenéz a metaadatokba és szépen a helyére pakolja a cuccost. Innentől kezdve pedig már csak egy iTunes Home Sharing bekapcsolás és egy Apple TV dobozka kell ahhoz, hogy a nappaliban molesztáljuk a csodaszép videós médiatárunkat.

Workflow: iOS Webapp startup/icon image generator

A probléma

Designer véna híján kitaláljuk, hogy csinálunk egy darab szép nagy image-et, amiből mondjuk középre rendezve n féle méretet kellene legyártani, hogy a webalkalmazásunk mindenféle iOS eszközt kiszolgáljon ikonnal, illetve startup screen grafikával.

A megoldás

Először is előkotrunk a neten egy HOWTO-t, ami elmagyarázza, hogy mi is kell mindehhez webalkalmazásunk HTML head szekciójába:



























Ha ez megvan, csak elő kell állítani a sokféle méretű képet – ehhez vadásszunk le egy ImageMagick-et innen.
Az ImageMagick felmegy MacPortsból is, de felpakolhatjuk kézzel is – ez utóbbi korrektül le van írva az előbb említett linken, de gyors kiteszem ide is:

Csomagoljuk ki és csináljunk egy symlinket az általa létrehozott folderre:

mkdir ~/bin
cd ~/bin
tar xzvf ~/Downloads/ImageMagick-x86_64-apple-darwin11.3.0.tar.gz
ln -s ~/bin/ImageMagick-6.7.5 ~/bin/ImageMagick

Tegyük bele ezeket a ~/.bash_profile scriptünkbe:

# 
export MAGICK_HOME="$HOME/ImageMagick"
export PATH="$MAGICK_HOME/bin:$PATH"
export DYLD_LIBRARY_PATH="$MAGICK_HOME/lib/"
# 

Élesítsük is mindjárt:

source ~/.bash_profile

Majd írjuk meg a kép konvertálásához szükséges ImageMagickot molesztáló scriptünket (jól bekommenteztem, hátha valaha jól jön még mintának, ha Bash-ban kívánnál tömbökkel szívni):

#!/bin/sh
# createiOSWebappImages.sh by fns@fns.hu
# created 2012.06.03
# lmdate 2012.06.03

function createImages() {

	ext=".png" # default source & target extension
	args=( "$@" ) # all the paameters in an array
	ac=${#args[@]} # parameter array length

	p=${args[0]} # basePath: 1st parameter
	bf=$p/${args[1]}$ext # baseFile: 2nd parameter
	f=${args[2]} # iconFile: 3rd parameter

	for (( i=3; i<$ac; i++ )) # first 3 parameters were not the member of our resizer array so start from 3rd one
	do
		str=${args[$i]} #get array element
		len=${#str} #get length of string
		xpos=`echo "$str" | sed -n "s/[x].*//p" | wc -c` # get "x" pos within string
		w=${str:0:(xpos-1)} #substr
		h=${str:(xpos):(len-xpos)} #substr
		f2="$p/$f$str".png

		echo "Resizing image; source = $bf new_size = $str target = $f2"
		convert $bf -resize $str -gravity center -extent $str $f2
	done

} # createImages()

basePath="." # location of source & target files
baseFile="ios-webapp-baseimage" # source file

iconFile="apple-touch-icon" # target file prefix
iconSizes=( 57x57 72x72 114x114 144x144 ) # target file sizes in an array

startupFile="apple-touch-startup-image" # target file prefix
startupSizes=( 320x460 640x920 768x1004 768x1024 1536x2008 1496x2048 ) # target file sizes in an array

createImages $basePath $baseFile $iconFile "${iconSizes[@]}"
createImages $basePath $baseFile $startupFile "${startupSizes[@]}"

Végül futtassuk le és a generált képeket fogyasszuk egészséggel!

Mac workflow: memory dump, avagy mentsük ami menthető

Még kómásan ugyan, de felkeltem már 6 körül dolgozni, tudván, hogy a munkanapnak nálam ma délben vége szakad, feladat pedig van bőven. Első körben egy viszonylag hosszabb elemzés megírását akartam befejezni, amit egy zárt phpBB forumba kell postolnom.

Az első hibát ott követtem el, hogy a pár mondatnál hosszabb anyagot nem egy text editorban kezdtem el legyártani, hanem a fórummotor saját comment textboxában.
Kész lett a bejegyzés, nyomtam egy Preview-t ami legenerálta a bejegyzést végleges formájában, átolvastam, majd miután találtam benne pár apró elírást, egy rutinmozdulattal rányomtam a browser tab close gombjára, hogy folytathassam a szerkesztést. Igen ám, csak a WordPress-hez szokott agyam gondolkodott így a korai órán, dacára a fél liter tejeskávénak: a phpBB ugyanis a WordPress-szel ellentétben a Preview-t ugyanabba a tab-ba generálta le, plusz nem készített róla Draft mentést, így én egy elegáns mozdulattal becsuktam bő fél órányi munkámat.

Mivel ez nem egy post commentje volt, hanem effektív munka, amelyre több kollégám számít, muszáj volt újraírni, de legalábbis előtúrni valahogy. Ilyenkor jön a képbe a lusta coder egyetlen fegyvere, az agya.

Nagy eséllyel az épp bezárt ablak tartalma ott lapul valahol a RAM-ban, így már csak egy memdumpot végző alkalmazás és egy keresni tudó jóféle hex editor kell ahhoz, hogy kikotorjam a postot, ahelyett, hogy újragépelem.

A memdump elvégzéséhez a Mac Memory Reader nevű binárist használtam – egyértelmű kis célszerszám, sokat nem kérdez, csak dumpol és sanyi.
A szöveget fds cimborám által is nagyra tartott Hex Fiend segített előkeresni.

Ettől tovább nem is kell ragozni a történetet. Ha esett meg már veled hasonló baj, szedd most le a Mac Memory Readert, telepítsd fel, hogy amikor legközelebb ér ilyen baleset, minél kevésbé koszold be a dumpolandó memóriát.