myCell.Comment.Shape.TextFrame.AutoSize = True
myCell.Comment.Shape.TextFrame.AutoSize = True
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.]]>
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 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:
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!
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.
Update: Józsi párhuzamos postja a témában erre.
]]>
//vmware-host/Shared\ Folders/plannr /plannr smbfs binary 0 0 "//vmware-host/Shared Folders/plannr" /plannr smbfs binary 0 0
//vmware-host/Shared\040Folders/plannr /plannr smbfs binary 0 0
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.
https://www.googleapis.com/language/translate/v2?parameters
https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&q=hello%20world&source=en&target=hu
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:
[video mp4="/fns.hu/video/mac-workflow-translate-service.mov" width="500" options="controls"]
Végül nézzük meg a scriptet egyben, úgy, ahogy magamnak implementáltam:
(* Translate by Gabor PENOFF (//fns.pappito.com) 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
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. ]]>
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!]]>
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()
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