Archive for the 'Tech' Category

Page 3 of 6

Synology NAS scp HOWTO

A Synology NAS-ok firmware-ében sajna a mai napig nincs jó kis scp - segítsünk ezen az alábbi, nem túl ravasz módon:

mkdir /volume1/tmp/scp_patch
cd /volume1/tmp/scp_patch
ipkg download openssh
tar -xvzf openssh*.ipk
tar -xvzf data.tar.gz
cp opt/bin/openssh-scp /bin/scp
cd /
rm -rf /volume1/tmp/scp_patch

A művelethez az ipkg csomagkezelőnek már fent kell lennie - ipkg HOWTO-t már írtak tőlem okosabbak ide.

Mac workflow: a supporter fegyvere az embeddelő userek ellen

A probléma

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

user-embeddelt-hibauzenete

A megoldás

Azért jó ideje már nem szökik. Egyfelől van nekem szép \screenshot fedőnevű TextExpander shortcutom, ami ilyet csinál azonnal a válaszmailbe:

Képernyőfotók küldése Windows alatt a legegyszerűbb módon
 
1. Tegyük aktívvá a fotózandó ablakot (egyszerűen rá kell csak kattintani).
2. Nyomjuk meg az Alt+Print Screen billentyűkombinációt — a fotó az aktív ablakról a vágólapra kerül.
3. Indítsuk el a levelező programunkat, kezdjünk el egy új levelet.
4. Kattintsunk a levél törzsébe, és oda illesszük be a vágólap tartalmát a Control+V billentyűkombinációval.
5. Címezzük meg a levelet és küldjük el!

Másrészt nem lennék címzetes shareware junkie lovag, ha ne tartanék erre fent egy appot. Az app neve File Juicer. A kis 13 EUR-ba kerülő shareware alkalmazás az univerzális kicsomagoló - rengetegszer behozta már az árát nekem. Számos formátumot képes atomjaira szedni, továbbá nagy segítség tud lenni, ha memóriakártyáról kell visszahozni törölt adatot.

A File Juicer kis ronda ikonnal rendelkezik, valamint az UI sem egy díjnyertes csődör:

file-juicer-UI

Az ablak bal oldalán található drop target boxba, vagy az alkalmazás dokkon levő ikonjára kell dobnod a gonosz felhasználó által küldött dokumentumot, amit az app szétszed, ahogy illik:

file-juicer-result

A File Juicer természetesen AppleScriptelhető, így semeddig nem tart egy Service-t gyártani hozzá, ami jobb clickre indítja a konverziót. Minden embeddelő userellenséggel találkozó Mac OS X usernek kötelező fegyver ez a kis gyöngyszem.

Update: Józsi párhuzamos postja a témában erre.

Space a /etc/fstab-ban

Fél órája szívok egy mount definícióval. Próbáltam az alábbi két módszert, hiába:

//vmware-host/Shared\ Folders/plannr /plannr smbfs binary 0 0
"//vmware-host/Shared Folders/plannr" /plannr smbfs binary 0 0

A kézivezérlésű mount simán mountol bármelyikkel. Kis RTFM után megjött a megoldás, gyorsan rögzítem is ide, okulásul, mert *nix alatt így megy a móka (incl. OS X ugye):

//vmware-host/Shared\040Folders/plannr /plannr smbfs binary 0 0

FYI: a \040 a Space (32-es ASCII kód) oktálisan, az kell a drága szentemnek.

Mac workflow: fordító service

Preface: a workflow Google API-t használ, így feltételezem, hogy rendelkezel a használatához szükséges Google accounttal, továbbá Growl felhasználó vagy. Ha nincs Google accountod és nem is akarsz gyártani magadnak, illetve a Growl-tól is kiver a víz, akkor ez a leírás számodra nem nyújt explicit megoldást.

Update: fds Mester hatására kigyomláltam a gusztustalan urlencode függvényt és az amúgyis nagyon okos curl binárisra róttam ezt a terhet.

A probléma

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

A megoldás

Van a Google-nek jóféle online translation API-ja, amit megkérhetünk szépen, hogy fordítson nekünk. Az OS X nagy varázslata a rendszer szintű AppleScript támogatás és az Automator fedőnevű makrózó csoda - őket szólítjuk most csatába.

Első körben ellátogatunk a Google Translate API oldalára és végigolvassuk a doksit. A dokumentáció szépen elmagyarázza, hogy Google-ék egy ilyen GET requestre adnak értelmes választ:

https://www.googleapis.com/language/translate/v2?parameters

A HTTPS request felparaméterezve így néz ki:

https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&q=hello%20world&source=en&target=hu

Miután ezt megtudtuk, a doksiban leírtak szerint látogassunk el a Google APIs Console oldalra, készítsünk egy új Translate projectet és már meg is szereztük a Translate API híváshoz szükséges kulcsot.

Megvan a kulcs, csinálhatunk jó kis Service-et!
Elindítod az Automator alkalmazást, majd kiválasztod a Service típusú template-et:

A megjelenő editorban a Library/Utilities szekcióból kikeresed a Run AppleScript actiont és behúzod a munkaterületre:

Ezután már csak bepakolod a script helyére azt, amint én hajnalban már kiszenvedtem, beteszed a set myKey to "PUT_YOUR_GOOGLE_API_KEY_HERE" sorba a te saját Google Translate API kulcsod és lemented a file-t Translate néven.

Ha mindent jól csináltál, akkor megjelent egy Translate nevű service a gépeden, ami úgy működik, hogy egy tetszőleges alkalmazásban kijelölt szövegen jobb clicket nyomva, majd a Services menü Translate opcióját kiválasztva a script megküldi a Google Translate APInak a kijelölt szöveget és a visszakapott fordítást megjeleníti neked egy Growl notification buborékban, valahogy így:

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.
*)
 
on run {input, parameters}
 
	set srcText to input as text
 
	set srcLang to "en" -- source language
	set tgtLang to "hu" -- target language
	set myKey to "AIzaSyCI-2oapEkMpRFfd6Ltv4HkZhf1Zq-VU9o"
	set myScriptID to "Translate" -- ID for Growl display
 
	set myTranslation to do shell script "/usr/bin/curl -G --data-urlencode q=" & quoted form of srcText & " --data-urlencode key=" & quoted form of myKey & " --data-urlencode source=" & quoted form of srcLang & " --data-urlencode target=" & quoted form of tgtLang & space & quoted form of "https://www.googleapis.com/language/translate/v2"
 
	if myTranslation = "" then
		tell me to notifyWithGrowl(myScriptID, "ERROR")
		return
	end if
 
	-- get rid of JSON (ugly but works)
	set myPrefix to "translatedText\": \""
	set myPostfix to "\""
	set myStartPos to (offset of myPrefix in myTranslation) + (length of myPrefix)
	set myText to text myStartPos thru -1 of myTranslation
	set myEndPos to (offset of myPostfix in myText)
	set myText to text 1 thru (myEndPos - 1) of myText
 
	tell me to notifyWithGrowl(myScriptID, myText)
 
	return "" -- myText
end run
 
-- GrowlCheck:
on growlInstalled()
	try
		do shell script "ls /Library/PreferencePanes/Growl.prefPane/"
		return true
	on error
		return false
	end try
end growlInstalled
 
-- Growl notifier:
on notifyWithGrowl(myApp, myText)
	set myIconApp to "Safari"
	set notificationID to myApp & ".default"
 
	if growlInstalled() then
		tell application "GrowlHelperApp"
			-- list of notification types
			set the ANL to {notificationID}
			-- list of enabled notifications
			set the DNL to {notificationID}
 
			-- register script
			register as application myApp all notifications ANL default notifications DNL icon of application myIconApp
			-- send notification
			notify with name notificationID title myApp description myText application name myApp
		end tell
	else
		-- skip alert if no Growl installed
		--display alert "Growl is not installed"
	end if
end notifyWithGrowl

Türelmetleneknek / elfoglaltaknak / lustáknak az egész service szedhető innen - persze még ebben is be kell pakolnod a saját magad Google API kulcsát, hogy működjön.

1984s

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.

Augmented Reality: Layar [restored post]

Alig írtam meg az előző postot a Wikitude-ról, máris itt a Layar (pontosabban Layar Reality Browser), az Android platformon nagy lelkesedést kiváltó AR alkalmazás iPhone-ra:

A Layar iPhone 3GS-t kíván, valamint legalább 3.1-es firmware-t. Ha mindez megvan, indulhat a mandula. Stílusosan kipróbáltam itt helyben Baján: a “hentes” keresőszóra 5 km-es körzetben azonnal ledobálta körém az összes bajai hentest!

Alapban a Layar local search fedőnevű Google search engine hozza nekünk a találatokat, de csillió más adatbázisból választhatunk: Panoramio, Twitter, Wikipedia, Flickr, Qype, Yelp, et cetera.

Egy próbát mindenképp megér!

Week() [restored post]

A feladat: számoljuk ki egy dátumból, hogy hanyadik hétre esik.

A megoldás: szenvedtem vele egy darabig, mire meglett, de végre kész, átlátható, működik – ha szükséged van rá, használd egészséggel! Nézzük a macit:

A hét számának kitalálásához két paramétert kell figyelembe venni:

a hét melyik nappal kezdődik
melyik hét számít az év első hetének
Az első paraméter természetesen 7-féle lehet, míg a második, az év első hetének számítási algoritmusánál háromféle eset lehetséges:

az év első hete a január 1-jét tartalmazó hét:
az év első hete az első, legalább 4 nap hosszú hét
az év első hete az első teljes, 7 nap hosszú hét
Nem 7 napos hetektől és minden egyéb hisztitől most eltekintünk. Ha ezek megvannak, akkor ki tudjuk számolni a kérdéses hét számát a következőképpen:

kiszámoljuk, hogy a kérdéses dátum az év hanyadik napja
kiszámoljuk, hogy január 1-jéhez képest milyen irányban hány napnyira van az év első hetének első napja
a két fenti értékből egy egyszerű osztással megkapjuk a keresett hét számát
A feladatot most C-ben kellett megoldani, ahol a time.h include ajándékba adja nekünk a mktime függvényt, ami a dátumból kiszámolja jól, hogy az az év hanyadik napjára esik, így erre nem írunk extra algoritmust.
Az első hét első napjának január 1-hez viszonyított offsetét azonban a hétszámolási algoritmusnak megfelelően háromféleképpen kell számolni. Nézzük meg a három esetet randa táblázatokban! A három mátrix azt mutatja, hogy az év első hetének első napja és január elseje hány nap távolságnyira vannak egymástól – a sorokban az első fizikai héten belüli nap, az oszlopokban a január elsejei heti nap szerepel.

Az első hét a január 1-jét tartalmazó hét:

Su Mo Tu We Th Fr Sa
Su 0 -1 -2 -3 -4 -5 -6
Mo -6 0 -1 -2 -3 -4 -5
Tu -5 -6 0 -1 -2 -3 -4
We -4 -5 -6 0 -1 -2 -3
Th -3 -4 -5 -6 0 -1 -2
Fr -2 -3 -4 -5 -6 0 -1
Sa -1 -2 -3 -4 -5 -6 0

Az első hét az első, legalább 4 nap hosszú hét:

Su Mo Tu We Th Fr Sa
Su 0 -1 -2 -3 3 2 1
Tu 1 0 -1 -2 -3 3 2
We 2 1 0 -1 -2 -3 3
Th 3 2 1 0 -1 -2 -3
Fr -3 3 2 1 0 -1 -2
Sa -1 -2 -3 3 2 1 0

Az első hét az első teljes, 7 nap hosszú hét:

Su Mo Tu We Th Fr Sa
Su 0 6 5 4 3 2 1
Mo 1 0 6 5 4 3 2
Tu 2 1 0 6 5 4 3
We 3 2 1 0 6 5 4
Th 4 3 2 1 0 6 5
Fr 5 4 3 2 1 0 6
Sa 6 5 4 3 2 1 0

A három táblától megzakkanva nézzük meg az algoritmust:

/* a datetime struktúra így néz ki:
typedef struct s_datetime {
	int year;
	int month;
	int day;
	int dow;
	int doy;
	int woy;
	int hour;
	int minute;
	int second;
} datetime;
*/
 
int getDoy(int y, int m, int d) {
 
	struct tm t;
 
	// get dow from date
	t.tm_year  = y - 1900;
	t.tm_mon   = m - 1;
	t.tm_mday  = d;
 
	t.tm_hour  = 0;
	t.tm_min   = 0;
	t.tm_sec   = 0;
 
	mktime(&t);
 
	return(t.tm_yday);
 
}	// getDoy()
 
void calcDateTime(datetime* pillanat, int week1Rule, int weekStartsOn) {
 
	int week1offset, jan1dow, dayCount;
 
	// get dow from date
	pillanat->doy = getDoy(pillanat->year, pillanat->month, pillanat->day);
	pillanat->dow = getDow(pillanat->year, pillanat->month, pillanat->day);
 
	// get dow for jan1
	jan1dow = getDow(pillanat->year, 1, 1);
 
	// get offset for first day of first week comparing to 1st of january
	switch (week1Rule) {
	case 1: // first week includes jan1
		week1offset = (weekStartsOn - jan1dow) <= 0 ? weekStartsOn - jan1dow : weekStartsOn - jan1dow - 7; 
		break;
	case 4: // first week is min. 4 days long
		week1offset = (weekStartsOn - jan1dow) < 4 ? weekStartsOn - jan1dow : weekStartsOn - jan1dow - 7; 
		break;
	case 7: // first week is the first full (7 day long) week
		week1offset = (weekStartsOn - jan1dow) >= 0 ? weekStartsOn - jan1dow : weekStartsOn - jan1dow + 7; 
		break;
	}
 
	// calculate number of days between dates
	dayCount = pillanat->doy - week1offset;
 
	pillanat->woy = ((6 + dayCount) / 7);
} //calcDateTime()

Így utólag végignézve a kódot, baromi rövid lett ahhoz képest, amennyit izmoztam vele :)

Excel bug workaround: Cannot shift objects off sheet [restored post]

A Microsoft által dokumentált bugba futottam bele ma reggel: az Exceled az outline-os táblák csikicsukizása (=show or hide) közben hajlamos aljas módon elpakolászni a commentet tartalmazó cellák comment boxait a helyükről. Ez odáig fajulhat, hogy a tábla fizikai sor/oszlopszélességén túlra pakolja őket és ekkor jön a baj: nem korrigálja, amit elbarmolt, hanem helyette rád mordul egy kétértelmű hibaüzenettel a következő sor/oszlop csikicsukinál.
Ezt a problémát oldja fel az alábbi kis függvény, ami minden commentboxodat a forrás cella jobb felső sarka fölé pozícionál 10-10 pixellel. Használd egészséggel:

Sub resetCommentPositions()
    Dim S As Worksheet, C As Comment
 
    For Each S In ThisWorkbook.Worksheets
        For Each C In S.Comments
            C.Shape.Left = C.Parent.Offset(0, 1).Left + 10
            C.Shape.Top = C.Parent.Offset(0, 1).Top - 10
        Next C
    Next S
End Sub

Van új a nap alatt: GNU make [restored post]

Ern0 találta – még most is csak pislogok a döbbenettől:

mpb-efi:~/ihome/prototype/server/src fns$ make clean; time make
...
real	0m9.264s
user	0m7.150s
sys	0m1.781s
mpb-efi:~/ihome/prototype/server/src fns$ make clean; time make -j
...
real	0m5.440s
user	0m7.501s
sys	0m1.991s

Multithread compiler rulez!

Persze mindjárt jönnek az előbbi postra RTFM mantrával kontrázó feketeöves coderek, hogyaszonnya:

mpb-efi:~/ihome/prototype/server/src fns$ man make
...
       -j [jobs], --jobs[=jobs]
            Specifies  the  number of jobs (commands) to run simultaneously.  If there is more than
            one -j option, the last one is effective.  If the -j option is given without  an  argu-
            ment, make will not limit the number of jobs that can run simultaneously.

Mai Excel agyatlanság [restored post]

Noooormális?

Sub testStrangeOverflowBug()
    Dim a As Double
 
    a = 1 / 86400 ' ezt simán eszi a rohadék
    a = 1 * (1 / (24 * 60 * 60)) ' ez tök ugyanaz, de egy Overflow Error a jutalmad
End Sub