Depreszzív, húsvéti Exceles poszt

Úgy érzem, hogy mindent tudok az Office VBA környezetről, különös tekintettel arra, amit az Excel hátába ékelt runtime interpreterrel művelni lehet. ~19 éve dolgozom különbőző feladatokon, ugyanazt az IDE-t (és ugyanazt a 6.0 VB interpretert) használva. Pár perces munkáktól a 11 hónapnyi fejlesztésig volt ebben minden - az így megírt szoftverek a mai napig több, mint 80 országban futnak szerte a világban.

Ezidáig nem találkoztam olyan problémával, aminél széttártam volna a kezem. A VBA interpreter telis-tele van hibákkal, de eleddig mindenre sikerült valamilyen workaroundot találni (nota bene: ha saccolnom kellene, nem kevés időt tenne ki a különböző fejlesztésekből az, hogy az interpreterben maradt bugokra gyógyírt találjak). Ma azonban találtam valamit, ami előtt jelenleg szét kell, hogy tárjam a kezem és azt kell, hogy mondjam a kedves ügyfélnek: sajnálom, ezt nem tudjuk implementálni. Utálok ilyet tenni, különös tekintettel arra, hogy a jelenlegi problémának egyszerűen nem szabadna léteznie.

A feladat az volt, hogy egy cirka 1 millió cella méretű tábla kb. 10%-ban relatíve bonyolult képleteket kell generálni, majd miután az Excel elvégezte a számítási műveleteket, a cellákban szereplő képleteket le kell cserélni a kiszámolt értékekre. A tábla egy kb. 7 MB méretű dokumentumban lakik, a tábla teljes struktúráját és az abban levő összes képletet függvények generálják, a felhasznált adat jó részét szintén függvények importálják külső adatforrásokból, a végfelhasználó pusztán statikus számokat gépel bele a táblázat celláiba.

A dolog egyszerűnek hangzik, mint egy faék - az is lenne, ha a mocsadék interpreterben nem bujkálna valahol egy ordas memleak.

A képlet értékre cserélését VBA-ból többféleképpen is meg lehet oldani: az egyik művelet a clipboardot használja, kb. így:

srcRange.Copy 
srcRange.Cells(1,1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

Ebben az esetben a srcRange változó által mutatott Range tartalma megy a Clipboardba, majd a következő sorral a kiszámolt értékek visszakerülnek a képletek helyére. Az Application.CutCopyMode = False hivatott arra, hogy a Clipboardot felszabadítsa.

A másik megoldás nem használ Clipboardot az adatcseréhez:

srcRange.value = srcRange.value

Mindezt elvégezzük egy ~2000 soros táblában, a sorokon egy ciklussal lépkedve, egy sorban ~500 cella tartalmát változtatva egyszerre. A gond ott jön, hogy ahogy halad a ciklus, a művelet látványosan lassul (annak ellenére, hogy a táblában levő képletek fokozatosan tűnnek el, tehát épp az ellenkezőjének kellene történnie), majd egy idő után az interpreter egyszerűen nem hajlandó az aktuális value paste műveletet végrehajtani és a kód futatása megáll, amit egy generic, semmire nem jó hibaüzenettel dokumentál a rohadék (1004 - Application defined or object defined error).
Ha ezen a ponton fejlesztő kollégaként úgy éreznéd, hogy kommentálnod kéne a dolgot, mert mondjuk nagy eséllyel nem szabadítok fel valami változót a ciklus belsejében és az nyeli a memóriát, akkor kérlek ne tedd: minden lehetséges megoldást kipróbáltam már, fejlesztői oldalról a memleak esélye jelen esetben teljesen kizárt.

Az teljesen nyilvánvaló, hogy a képletek értékre cserélése felzabál egy erősen limitáltan rendelkezésre álló RAM-ot (HEAP, STACK?), ami 2014-ben egy 2010-es szoftvert használva azért elég vicces (a kódot futtató gépben jelenleg 32 GB RAM van, mi meg egymillió darab lebegőpontos számmal dolgozunk).

Cirka 7 óra knowledge base bújás és egyéb keresés után sem tudok olyan megoldást, ami a paste value művelet elvégzése után felszabadítaná a művelet által elemésztett RAM-ot, ezért ordas memleakre gyanakszom.

Ez a poszt így ahogy van, elmegy a Microsoft Tech Supportnak, de sajna túl sok reményt nem fűzök ahhoz, hogy bármi érdemi választ kapjak (=sok rossz tapasztalatom volt korábban). Ettől függetlenül a lepényhal megy elöl, a remény hal meg utoljára, szóval ha érdemi válasz jön, azzal nyilván kiegészítem a posztot, hadd legyen még egy 100%-ig elégedett ügyfelem.

3D nyomtatás: tervezzünk FIFO elemtartót AA méretű akksiknak

A probléma

Sok újratölthető AA méretű akksit használunk a háztartásban, amikről feltöltés után nem tudjuk megmondani, melyikeket töltöttük legrégebben.

A megoldás

Gyártsunk egy akksitartót, amibe a tetején beledobáljuk az AA akkukat, az alján meg töltési sorrendben (=FIFO) szedegetjük ki őket. Ha már lúd, legyen kövér: készítsünk olyan dobozt, ami moduláris, azaz tetszőleges számú AA akksi férjen bele.

Minden további szöveg helyett itt a megoldás egy közel 20 perces, hangtalan videóban, hátha kibírod:

Designing a FIFO AA battery holder in Fusion 360 from Gabor Penoff on Vimeo.

Az elviselhetőség érdekében 2.5-szeresére gyorsítottam a screencastot, azaz a valóságban szűk egy órába tellett, mire elkészült a modell. A printer jelenleg is izmozik vele, így még nem tudok sem késztermék fotót, sem STL file-okat prezentálni - majd ha kész az első darab, összeraktam és hibátlan, akkor jön ide a poszt végére update formájában az eredmény is. Stay tuned!

Update: elkészült.

Hogyan vegyünk meg egy 1000 Ft-ba kerülő csavarhúzót 4500 Ft-ért

Ma kaptam ezt az árajánlatot:

WIHA-PicoFinish-arajanlat

1153 HUF bruttó az egy szem imbusz csavarhúzó ára, erre 2400 HUF rakódik rá, azaz több, mint kétszer annyi, mint amennyibe maga a csavarhúzó kerül. Persze vásárolhatnék 30001 HUF értékben és akkor mindkét extra költség eltűnne, na de könyörgöm: ez a tárgy egy 153x15x15 mm-es befoglaló téglatestben elfér - a DL-es boríték 220 mm hosszú. Miért kell 1500 HUF értékben GLS-t használni és további 900 HUF értékben kezelni az egy szem csavarhúzót?

Mielőtt bárki nekem esne, hogy valószínűleg a kereskedő NAGY, a tétel meg KICSI, elmesélek egy múlt heti történetet, ami Lengyelországban esett meg velem. Egy Airport Expresst alakítottam át 5V-ról üzemeltethetőnek. A kis süti méretű Apple routert 3.3V feszültség hajtja, én meg USB-ről szerettem volna etetni, így szükség volt egy 5V->3.3V stepdown konverterre. Jó darabig csak az ebay-en, vagy a kínai site-okon találtam ilyet, mígnem a keresési találatokban előbukkant egy lengyel cég, a kamami.pl. Megtaláltam náluk a keresett alkatrészt, rendeltem két darabot mintegy 11 PLN (~900 HUF) értékben. A cucc másnap megérkezett postán, egy bélelt borítékban, egy szem savanyúcukorral együtt csomagolva, amire valaki egy mosolygó arcot rajzolt. A feladó 400 km távolságból küldte a cuccot, szállítási költségként a standard lengyel postabélyegnél talán ~100 Ft-tal fizettem többet.

3D nyomtatás: mire NE költsd a pénzt

Hrvoje Čop írt egy felháborodott posztot a frissen megjelent 3D systems CubePro printerrel kapcsolatban. Itt a videó, amiben promózzák a fent említett nyomtatót:

A horvát kolléga részletesen kivesézi, mi a baja a szóban forgó printerrel, én csak elismétlem magyarul, pár screenshottal illusztrálva.

1. Igénytelenség a promo videóban

Nézd meg ezt az összemocskolt nyomtatófejet:

not-so-pro-CubePro3

Hogy a francba nem volt képes a gyártó letakarítani a hotendet, mielőtt a videót felvették? Lehet, hogy elég gyorsnak gondolták a timelapse részt ahhoz, hogy a felhasználó ne vegye észre? Miért nincs a hotend oldalán hőszigetelés (btw már ez segítene, hogy ne mocskolja ennyire össze az olvadt nyersanyag)?

2. Ronda nyomtatási hibák

Ronda, nagy eséllyel anyagáramlási problémára visszavezethető hibák a demo printen:

not-so-pro-CubePro1

Az újdonságként reklámozott több anyagos nyomtatási technológiájuk lyukat és megfolyást hagy a készterméken:

not-so-pro-CubePro2

Mindez a sub $5000 árkategóriában indul. Ezért a pénzért ebben a kategóriában versenyző printerekből nagyjából két darabot kapsz. Nehogy bedőlj nekik!

3D nyomtatás: csata az ABS-szel

Jelen esetben a címben szereplő rövidítés nem az autókban alkalmazott blokkolásgáló rendszert fedi, hanem az akrinitril-butadién-sztirolt, mely egy hőre lágyuló polimer, amelyet a nevében felsorolt három monomer alkot:

ABS resin formula

Az ABS remek műanyag, 105 ℃ körül van az üvegesedési átmenete, amit mi most nagyon szeretni fogunk. Az üvegesedési átmenet azt jelenti, hogy ezen a ponton az anyag egyfajta amorf kristályszerkezetet vesz fel - nekünk egyszerű embereknek ez az ABS esetében annyit tesz, hogy 100 fokig a műanyagunk nem lágyul meg, ellentétben a másik igen népszerű nyomtató-nyersanyaggal, a PLA-nak rövidített politejsavval, ami képes egy melegebb nyári napon elalélni az autó szélvédője mögött. E tény ismeretében ne nyomtassunk hozzám hasonlóan birka módon GoPro tartókeretet a kocsiba PLA-ból. A PLA üvegesedési átmenete 60 ℃ környékén van, de ez egy másik történet, most inkább kínozzuk magunkat az ABS-szel!

A LEGO kockák alapanyagául is szolgáló ABS-t akarunk nyersanyagnak használni. ABS-t találsz a háztartásodban szinte bármilyen műanyagban, amerre csak nézel. A LEGO kocka is, csak úgy, mint a többi nagy sorozatban gyártott műanyag alkatrész egy "injection molding" nevű eljárással készülnek. Az injection molding lényege, hogy a megolvaszott műanyagot óriási nyomással (1300-2000 bar) egy két féldarabból álló öntőformába préselik. Az injection moldinghoz használt szerszám előállítása baromi drága dolog, így prototípust tervezni nem volt túl olcsó mulatság korábban. A 3D nyomtatás pont ezen segített nagyot. Ha kicsit izgat az injection molding, akkor bővebben ez a videó segít megérteni:

Szóval nekünk pont jó lenne az ABS - elég erős, jól tűri a hőt, és működnek vele bizonyos 3D printerek, amelyeket ABS printelésre felkészítettek. A felkészítés jelen esetben egyrészt fűthető tárgyasztalt, másrészt opcionális temperált kamrát jelent. Ezekre azért van szükség, mert az ABS meglehetősen nehezen tapad oda bármihez, amit mi általánosságban tárgyasztalnak használunk.

A fűtött tárgyasztalunk felülete tükörsima kell, hogy legyen. Az általánosan elterjedt gyakorlat az, hogy vagy egy üveglapot, vagy egy marógéppel precízen vízszintes felületűre mart alumínium lapot használnak erre a célra a népek és nagyjából 100-110 ℃ hőmérsékletűre melegítik elő a tárgyasztalt. Tárgyasztal fűtőelem létezik 12, 24 és 230 V-os kivitelben - ez utóbbit nyilván élni szerető ember nem használ (mivel a tárgyasztalt szoktuk kézzel piszkálni), így marad a két gyengeáramú törpefeszültségű verzió. A fűtőelemek többsége elég nehezen éri el az ABS által szeretett 100-110 ℃ hőfokot, én azonban találtam egy meglehetősen gyorsan fűtő szilikon betétet a QU-BD-nél, ami 1-2 perc alatt felforrósodik.

Az ABS még így sem nagyon szeret tapadni, ezért aztán kétféle trükkhöz folyamodik a felhasználók többsége. Az egyik az, hogy közönséges hajlakkal fújják le a nyomtatási felületet egy vékony rétegben, a másik, hogy úgynevezett "ABS juice"-szal törlik át a tárgyasztalt (az ABS juice nem más, mint acetonban oldott ABS). Mindkét eljárás azt a célt szolgálja, hogy a legelső réteg megfelelően tapadjon. Aki az így nyert tapadással nem elégedett, az a heated bed felületére még egy Kapton-nak nevezett poliimid filmet ragaszt és arra keni/fújja a plusz kötőanyagot.

Az egész hajlakkos-dzsúzos tárgyasztal előkészítés elég nagy macera, ám kísérletező kedvű felhasználók rengeteg más anyagot is kipróbáltak fűthető platform gyanánt, mígnem ráakadtak a PEI-nek rövidített politherimidre. A PEI nagyjából 170 ℃-ig bírja a hőt és a felmelegített felületére brutálisan jól tapad mind a PLA, mind az ABS. A Reprap nyomtatóknál kvázi standard tárgyasztal méretben, 214x214 mm-ben forgalmaz is ilyen lapot a német reprapsource.com. A nem túl olcsó műanyagot különlegesen jó hőtűrő tulajdonsága miatt a repülőgépgyártásban használják előszeretettel.

Megvan a tárgyasztal, továbbá tudjuk, hogy az ABS-t 230 fokon érdemes nyomtatni, nosza nyomtassunk:

ABS-crap

A fenti fotón látható szemétmennyiség annak az eredménye, hogy elhittem, ennyi tudás elég ahhoz, hogy PLA-ról simán ABS-re váltva nyomtassak. Hát nem.

Kezdetben 90 ℃-os tárgyasztallal indultam neki. Az eredmény ordas felpöndörödés (=warping), minimális méretű test esetén is:

ABS-warping

A gonosz warping picit melegebb tárgyasztallal csökkenthető (bár ahogy említettem, sokan inkább a kaptonnal bevont, ABS juice-os üveglapra esküsznek), illetve ha "bedobozoljuk" a printerünket, azzal szinén emelhetünk a hűlő ABS rétegek hőfokán valamennyit:

Ultimaker-chamber

Aztán a 230 ℃-os hotend hőmérséklet bizonyult kevésnek. Nyilván nyersanyaga válogatja és az is simán előfordulhat, hogy hazudik a nyomtatófejbe épített termisztor vagy épp nem túl precíz a kalibrációs táblázata, de summa summarum érzésre 250 ℃-t szeretett az ugyanabból a forrásból származó piros és fekete nyersanyag is.

Jön a többi probléma, szép sorjában. ABS-szel nem nyomtatunk kapkodva - az én printerem kifejezetten utálta, ha 50 mm/s sebesség fölé kívántam menni és az alábbi típusú outputtal figyelmeztetett erre:

ABS-flow-problem

Ha a sebesség is rendben lenne, akkor ideje lenne némi hűtésről gondoskodni, hiába látod a legtöbb ABS-t nyomtató printeren azt, hogy hiányzik róla a hűtőventillátor. Ha nem teszed, akkor ronda élek figyelmeztetnek:

ABS-without-cooling1

ABS-without-cooling2

ABS-without-cooling3

Majd jön a "pillowing"-nak keresztelt típushiba:

ABS-pillowing

A ventillátorokkal azonban vigyázni kell, mivel ha rosszul pozícionálod őket, kihűtik a nyomtatófejet. Korábban próbálkoztam mindenféle légterelő megoldással, de végül a két darab, 45 fokban a tárgyasztalra fújó ventillátornál kötöttem ki úgy, hogy közben autóipari szilikonból gyártottam egy megfelelő hőszigetelést biztosító "gigabugyit" a kicsit ormótlan Ultimaker hotendnek:

Ultimaker-head-insulation-with-fans

Nagyjából ennyi. Mindez kb. ennyi print volt, mire minden turpisság kiderült:

ABS-failed-prints

Summa summarum, ami nálam ABS esetében bevált:

  • PEI print bed, 100 ℃-ra melegítve
  • 250 ℃-os hotend
  • max. 50 mm/s nyomtatási sebesség
  • nyomtatott tárgy hűtése két oldalról egyszerre, hogy ne legyen egy porcikája sem szélárnyékban a nyomtatófej miatt
  • a hűtőventillátorok 100% helyett 40-50%-on üzemeltetése
  • zárt akril kamra, ha nagyobb testet nyomtatok

A pecás és a tesója

Gondolom otthon "Elődke" már ezerrel kapargatja a vizet, hátha kijön belőle egy keserű narancssárga állat:

20121111-0843

20121111-0841

20121111-0901

Mindeközben a tesója valószínűleg legalább ugyanekkora bociszemekkel néz bele a neki már most nagyon meleg világba:

20121111-0818

Hiányoznak nagyon, szombaton agyon fogom szeretgetni őket!

Ananászlekvár

Hajnalban nekiálltam lekvárt gyártani. Találtam a frigóban jó húsos cseresznyepaprikákat és brutális mexikói chilit is, ezért kísérletképpen egy kis adagba belekevertem ezt a cukor és a szegfűszeg mellé:

chili

A rotyogó paprikás szegfűszeges ananász fantasztikus illatot árasztott - alig várom, hogy beteszteljük valami sült mellé. A bal szélen ott bujkál egy ilyen játékos:

pineapple-jam

Recept nem nagyon van, az egész csak egy kísérlet. Kb. 20% cukrot adtam neki, az ananászt csak daraboltam, nem turmixoltam le, adtam neki szegfűszeget és pár citrom levét, megrottyantottam, aztán amikor már áttetszőek voltak a darabok és a lé egy része elforrt, akkor kapott óvatosan adagolva pektint, amíg el nem kezdett rendesen ragadni a kanálhoz. Tartósítót nálam lekvár nem kap, csak betöltöm a kiforrázott üvegekbe, lezárom a felforralt fedőkkel, aztán feje tetejére állítva hagyom kihűlni a dunsztban.