Monthly Archives: February 2013

3D nyomtatás – az elakadó nyersanyag története

00-target-obj ilyen materializálódás helyett: 01-Ultimaker-feet-OK inkább ilyen: 02-Ultimaker-feet-FAIL A történet ott indult, hogy egy picit meg szerettem volna emelni az Ultimakert, hogy aláférjen a heated bed áramellátásához szánt tápegység. A Thingiverse-en találtam is egy stabil lábat, amit MoonCactus pont hasonló célból tervezett saját magának. Leszedtem, beállítottam az általa ajánlott nyomtatási paramétereket, elindítottam a printet, megvártam, míg az első kritikus réteget lerajka az Ultimaker, aztán mentem a dolgomra. Szűk egy óra után visszanézve azt látom, hogy az objektum elkezd “levegősödni”: az alsó, korrekt rétegek után egyszercsak anyaghiányos layerek következnek. Az anyaghiány kezdetét a nyíl jelöli (az objektum a tárgyasztalon a fotóhoz képest természetesen X irányban -90 fokban elforgatva állt, én csak a fények miatt fordítottam rajta, hogy jobban lásd a problémás részt): 03-filament-grinding-failure-closeup Így állt a test nyomtatáskor – még itt is viszonylag jól látni a problémás részt: 04-filament-grinding-failure-closeup Az anyaghiányt két dolog magyarázhatja: vagy eldugul a nyomtatófej, vagy nem kap elég anyagot. Az Ultimaker ma aktuális extruder feje elég hibamentes, így ez szinte biztosan kizárható, úgyhogy nézzük az anyagellátó oldalt. A feeder mechanikából a fejbe egy paraformaldehidből készült csőben jut el a műanyagszál. Ez átlátszó, így szemre meg tudod mondani, ha valami szennyeződés került volna bele. Ez is látszólag tiszta, így marad maga a feeder mechanika. A mechanikát szétszedve a benne levő műanyagszál az alábbi képet mutatta: 05-grinded-filament Az 1. nyíl azt a bevésést mutatja, amit a feederben levő recés henger présel bele az alapanyagba – így talál fogást rajta és így tudja mindkét irányban mozgatni. Az 1. pontban látható minta tehát normális. A 3. nyílnál látszik a probléma oka: ez a mélyen bemart ív a “filament grinding” biztos jele. A recés továbbító henger vagy túl sokat rángatta ide-oda a nyersanyagot, vagy a húzó/toló oldalon túl nagy ellenállásba ütközött és így szép lassan kimart a műanyag szálból annyit, hogy más ne legyen képes továbbítani. Az anyagszállítás leáll, game over. Kicsit furán néztem a 2. nyilakkal jelölt felpöndörödésre – eddig még soha nem láttam ilyet, de első körben sajnos nem tulajdonítottam neki különösebb jelentősséget, csak kipucoltam a feedert, lemostam alkohollal a tárgyasztalt és a nyomtatófejet, újrakalibráltam az asztalt és nekiálltam újra a nyomtatásnak. Újabb 40 percnyi korrekt print következett, majd a jelenség elkezdett megismétlődni. Kezdtem a nyersanyag eltérő vastagságára gyanakorni, így megmértem az átmérőjét: 2.90 mm, ami teljesen rendben van, sőt, ránézésre a keresztmetszete is végig szabályos kör alak. Feszítettem egy kicsit még a feeder rugós mechanikáján, hogy a recés henger még jobban fogjon bele a nyersanyagba, majd újabb print, újabb fél óra, újabb hiba – úgy látszik, ma egész nap ezt fogjuk játszani. Cirka 6-8 óra kellett ahhoz, hogy az újra és újra átnézett Ultimakert elfogadjam hibátlannak és a nyersanyag anyagminőségére kezdjek el gyanakodni. Fogtam egy tekercs piros PLA-t, befűztem a printerbe és elindítottam a nyomtatást: ezúttal minden hiba nélkül történt.

Tanulságok

A nyersanyag nagy lutri. A ludas fekete PLA tekercset az Ultimakertől rendeltem. Van rengeteg más beszerzési forrás, de én bíztam abban, hogy a printer gyártója csak nem ad el sz@rt – itt a bizonyíték, hogy mégis. A nyersanyag a feedertől túl hosszú és túl görbe utat tesz meg a nyomtatófejig. Ha a műanyagszál mondjuk felülről érkezne és nem írna le egy félkört, mire a fejbe ér, valószínűleg a gyengébb minőségű nyersanyagot is könnyebben továbbítaná a feeder a kisebb súrlódás miatt. Summa summarum, ez a tanulságos lecke is csak azt mutatja, hogy van még mit hackelni a printeren. Neki is fogok állni más feeding megoldást keresni, de előbb heated beddel kell játszanunk. Stay tuned! ]]>

Media Center Szent Grál: tanulságos mese a megvezetett enduserről

XBMC-t tartalmazó raspbmc disztribúció. A 12-es XBMC (becenevén “Frodo“) már képes arra, hogy uPnP master-slave-et játszon. Ez annyit tesz, hogy míg az egyik média centeren futó XBMC uPnP szerverként megosztja a saját médiakönyvtárát, addig más XBMC-k uPnP kliensként láthatják ezeket a librarykat és így elég csak az egyik XBMC-nek karbantartani a metaadatokat. Nálam van két darab Raspberry Pi is, mindkettőn raspbmc, így nosza neki is álltam ezt élesíteni rajtuk. Az eredmény az alábbiakban részletezett kisebb káosz lett. A disztribúció installja ugyanúgy problémamentes, mint eddig, az uPnP beállítás sem rocket science – az egyik (server) XBMC-t megkérjük, hogy hirdesse magát uPnP-n, a másik (kliens) XBMC-nek pedig azt mondjuk, hogy a server XBMC által hirdetett uPnP megosztást vesszük fel media folder gyanánt. A dolog működik, ám egy ronda szépséghibája akad: a kliens XBMC-n az uPnP megosztás sorrendje csak név szerinti lehet, így azon nem tudunk pl. időben csökkenő sorrendet beállítani, hogy azonnal lássuk, mik a friss anyagok a megvásárolt DVD-inket mondjuk H.264 formában tároló gyűjteményünkben. A Raspberry Pi-n futó XBMC talán egyik legnagyobb előnye, hogy képes használni a kis masina HDMI kimenetén levő aktív CEC lábat, lehetővé téve ezáltal, hogy a HDMI CEC kompatibilis televíziónk távirányítója a teljes XBMC frontendet vezérelje (=egy remote mind felett rulez). Nos, a friss raspbmc disztibúcióval pont ez a funkció kezdett el akadozni. Minden egyes sleep után csak a Raspberry Pi-re kötött billentyűzet volt képes felébreszteni a mini média centert – úgy tűnt, hogy a CEC kapcsolat a sleep-pel együtt elmúlik, majd a gépet felébresztve újra létrejön. Ebből kezdett elegem lenni, így először nekiálltam fórumokat túrni, majd egy idő után más Raspberry Pi XBMC disztrókat keresgéltem. Így akadatam rá az openELEC és az XBian pakkokra. Az openELEC jött előbb – felpakoltam, bekonfirguráltam, hagytam, hogy libraryt scanneljen magának, kipróbáltam a média lejátszás funkciókat, majd vártam, hogy lemenjen sleep-be és megpróbáltam a TV távirányítójával felébreszteni: siker. Minden működött, így feltettem a másik Raspberry Pi-re is ugyanezt a csomagot, beállítottam azt is. Másnap meglepetten vettem észre, hogy az openELEC-en futó XBMC borzasztóan akadozik. Ránézek a CPU load-ra: 100%, pedig csak a főmenüben áll az XBMC. Új legális DVD másolat nincs a libraryban, ergo a scannerek sem futhatnak, hát akkor meg mi a rák ez? Szűk órányi googling előhozza, hogy két dolog lassíthatja szerencsétlent: a skinben bekapcsolt RSS feed, illetve a “Common Plugin Cache” nevű add-on, amit többek között a YouTube trailerek lejátszásához készített plugin is használ. Kikapcsolom mindkettőt, de még mindig magas a CPU load. Reboot: most már kicsit jobb – 70-85% közötti. Tanulság #1: a Raspberry Pi nem egy Cray supercomputer. Ha ezen a ponton nem járt volna tovább az agyam, az nagyon hasznos lett volna. De persze járt. Épp megszereltnek lehetne nyilvánítani a media centert, amikor eszembe jut, amit az előbbi googling közben az egyik fórumozótól olvastam. A srác a Plexet, az XBMC-ből forkolt média centert emlegette. Az ő Plex servere, ami a library managementet végzi egy Synology NAS-on futott. Ehhez már csak annyinak kellett beugrani, hogy az LG tavaly megiratta a Plex-es fiúkkal a serverük frontendjét a Smart TV-ikhez, és indultak is a fogaskerekek: csináljunk Plex backendet a NAS-ra és az LG TV-n próbáljuk ki a Plex klienssel! A NAS-ra gond nélkül feltelepült a Plex backend és némi konfugurálás után neki is látott a library építésnek. Miután elkészült, megnéztem, hogy mit mutat a TV-n. Nos, a TV egész konktétan egy Loading… becenevű homokórát mutatott úgy 3-4 percig onnantól kezdve, hogy megkértem őt a Plex backend által kínált libraryban való tallózásra. Valószínűleg valami LG store-ból kellett volna letölteni még egy Plex frontendet is a TV-be, ám ez már nem következett be, ugyanis a TV egyszercsak minden figyelmeztetés nélkül rebootolt. Néztem bután, mint ló a tüzijátékra, hogy ez meg mi volt. Első körben természetesen a gonosz új Raspberry Pi disztróra gyanakodtam, hátha ott valami watchdog űz nem túl fair játékot és küld valamit a CEC porton a készüléknek. Mire azonban oda jutottam volna, hogy input forrást váltok a TV készüléken és ránézek az XMBC-re, újabb reboot következett. Tanulság #2: a házilag gyártott media centerekkel lehet küzdeni bőven. Kezdett megindulni az adrenalin, így egy hirtelen mozdulattal lehúztam a Raspberry Pi HDMI kábelét a TV-ről és már mentem is volna XBiant installálni szerencsétlen openELEC helyére, amikor a TV ismét újraindult. Álltam, néztem egy darabig, hogy a boot után megjelenik rajta a NO SIGNAL felirat, majd megint jön egy reset. WTF? A dolog odáig fokozódott, hogy két reboot között cirka 30 másodperc már telt csak el. Lehet, hogy a TV hibás? Pár újabb rebootnyi ciklussal nagy nehezen eljutok odáig a TV menüjében, hogy megtalálom a Factory Reset opciót, aztán a következő rebootnál el is indítom. A reset lefut, a TV frissen, mindenféle beállítás nélkül jelentkezik be, majd amikor megnyugodva elkezdem újra konfigurálni, ismét újraindul. Nincs mit tenni, ez halott – én meg szerencsétlen openELEC-et hibáztattam! Becsomagolom a TV-t a hétfői szervizbe cipeléshez, majd leülök fórumokat olvasgatni, hátha más is pórul járt már folyton rebootoló LG Smart TV-vel. Mit ad az ég, egy rahedli bejegyzést találok, pontosan ugyanilyen esetekről. Sajnos mindenhol ugyanaz a válasz: vidd vissza és cseréltesd ki. Nincs sehol egy szervízmenü, vagy valami bootable USB image, amivel újra működővé lehetne varázsolni szerencsétlent. Már csukom be az utolsó ilyen fórumoldalt, amikor meglátom a legalsó bejegyzését: a jóember Plexet installált frissen és onnantól indult a reboot móka, majd leszedte a backendet és a probléma elmúlt. Nosza, TV kicsomagol, talp újra összeszerel, NAS-ról a Plex uninstallál, TV indít és minden újra a régi: az LG Smart TV reboot betegsége megszűnt. Tanulság #3: valami kóddarab van az LG Smart TV készülékekben, amit egy élő Plex backend képes annyira hanyattvágni, hogy az a televízió újraindulását eredményezi. Lehet, hogy majd egy software update ezt orvosolni fogja, de egész biztosan nem én leszek az a felhasználó, aki ezt ellenőrizni fogja. 2013 február 23-án vasárnap részemről eltemettem a Plexet örökre. ]]>

Rogaliki orzechowe mamy Ági

diokifli

  • 250 g orzech
  • 250 g cukier puder
  • 250 g mąka
  • 250 g margaryna albo smalec
  • 1 albo 2 duże jajko
  • szczypna saly
  • Wymieszac składniki
  • chłodzić w lodówce przez pół godziny
  • formować ciastka w kształcie księżyca
  • 180 ℃, około pól godziny
  • posypać cukrem wanyliowym
]]>

3D nyomtatás – a citrusfacsaró

erre a SolidWorks tutorialra, ami nagyon nem tetszett. Ez mégjobban sarkallt arra, hogy már csakazértis magam gyártok egy ilyen nyomoronc facsarót. Lássuk! Olyat szerettem volna, ami mindjárt belecsorgatja a kifacsart levet egy edénybe – ilyet mórickáztam róla: 01-citrus-juicer-idea A terv az (azon túl, hogy Sir Galahad, Sir Lancelot és én az éj leple alatt kirontunk a nyúlból), hogy csinálok egy narancsnyi gömböt, aztán meg valami szerszámot, ami a facsaró hornyokat kimarja a gömbből, majd teszek alá egy kilyuggatott hengert, amin a lé átcsoroghat és az egészet felfogom egy nagyobb gömbből készített kivájt félgömbben, aminek az aljába dugok egy PET palack kompatibilis csövet és kész is vagyunk. Úgy saccoltam, hogy egy átlag facsarandó citrus belső átmérője úgy 70 mm körül lesz. Rajzoltam egy referenciakört és mellé két ívet, ami mentén majd végigtolok egy háromszög alakot, hogy abból elkészüljön a vágószerszám: 02-cutting-tool-curves A háromszöget a két íven végigtolva elkészült az eldobós szerszám: 03-cutting-tool Ebből aztán csináltam még 11-et: 04-12-cuttin-tools Majd legyártottam a szerszám alá a “nyersanyag” gömböt: 05-sphere-and-cutting-tools Ezután csak ki kellett vágni a gömbből a hornyokat: 06-sphere-after-boolean-op Majd egy újabb boolean művelettel kidobni a felesleges alsó félgömböt: 07-model-before-hemisphere-cut 08-model-wo-bottom-hemisphere Aztán picit tojás alakúvá nyújtottam a szerszámot: 09-model-Z-scaled Legyártottam a kivájt alsó gömböt és lecsaptam erről is a felesleges felső félgömböt: 10-lower-big-sphere Csináltam egy vékony hengert szűrőtálca gyanánt és összeillesztettem a három darabot: 11-model-with-tray Gyártottam pár kis 3 mm-es hengert a szűrőtálca kilyuggatásához: 12-cutting-tools-on-tray Kilyukasztottam a szűrőtálcát: 13-filter-tray-complete Végül az alsó félgömb tetejéből még lekaptam egy kicsit és az aljába fúrt lyukba beigazgattam a kis PET palack kompatibilis léelvezető csövet: 14-lower-tube-in-place Ezzel el is készült a citrusfacsaró: 15-citrus-juicer-done Szép lett, én meg ügyes, hogy kitaláltam, hogy kell ilyet CAD-ben összeszerelni, úgyhogy kapok is egy pofa sört! Természetesen ez FFF printerrel nem nyomtatható – ha nem tudod, hogy miért, de izgat, akkor nyomás végigolvasni a 3d print kategória többi posztját! ]]>

Media Center Szent Grál: feliratozzunk!

A probléma Filmünk van, ráadásul mondjuk sok, feliratunk meg nem van, főleg nem több nyelven.

A megoldás

Subliminalt installálunk:
  • leszedjük az aktuális master branchet innen
  • hagyjuk, hogy installálja magát: sudo ./setup.py install
Ha ez kész, megírjuk az alábbi getsub scriptet:
#!/bin/sh
for F in `ls -1 *.mp4 *.avi *.mkv *.m4v *.mov`
do
	echo Processing "$F"...
	BASE=${F%.*}
	if [ -f "$BASE.hu.srt" -a -f "$BASE.en.srt" ]
		then echo "Subtitles exists - skipping download."
		else
			echo "Trying to download subtitles..."
			/usr/local/bin/subliminal -m -l hu -l en "$F"
	fi
done
Mindezek után csak annyi a dolgunk, hogy bemászunk egy folderbe, ahol a sok film lakik és ráeresztjük a getsub scriptünket. Az eredmény jó esetben a filmfile-ok mellett keletkező .hu.srt és .en.srt állományok kellemes tömege. Advancedebb olvasóink rekurzívvá tehetik a scriptet. Update: az összes advanced olvasót megelőzve íme az ajándék minimalistább, ám annál rekurzívabb script (a tegnapi verzióban lemaradtak a space tartalmú fileneveket védő idézőjelek, amire ma hajnalra fds mester hívta fel a figyelmemet):
#!/bin/sh
find . \( -name "*.mp4" -or -name "*.avi" -or -name "*.mkv" -or -name "*.m4v" -or -name "*.mov" \) -and \( ! -iname ".*" \) -print0 | while read -rd $'\0' F; do
	BASE=${F%.*}
	echo Processing "$F"...
	if [ ! -f "$BASE.hu.srt" -o ! -f "$BASE.en.srt" ]
		then /usr/local/bin/subliminal -m -l hu -l en "$F"
	fi
done
]]>

CIB e-bank

hiszti és az egyik ezzel kapcsolatos threadben @vszakats tett ki egy non-applet futtató scriptet a Pastebinre. A script a saját könyvtárába létrehoz egy AppletLocal.html file-t, egy jogosultságot definiáló cibib.policy file-t, aztán letölti curl segítségével a CIB-től a cibib.jar appletet, végül elindítja. Az applet letöltése közben a curl néma, így azt érezheted, hogy nem történik semmi, pedig megy az, csak nem látod, szóval egy kis türelem, mire lejön a 2 megás applet. Ha egyszer lent van az applet és kész a HTML és a policy file, akkor elég ez a miniscript az indításhoz:

#!/bin/sh
dir="`dirname $0`"
appletviewer $dir/AppletLocal.html -J-Djava.security.policy=$dir/cibib.policy > /dev/null &
Az egész hóbelevanchoz természetesen nem kell Java browser plugin, azokat nyugodtan kikapcsolhatod, ahogy Józsi írta. Viktornak jövök egy sörrel, ha erre jár 🙂 Update #1: eti tuningolt a scripten kicsit. Az ő változata már megnézi, hogy módosult-e a CIB serverén az applet és csak akkor szedi le, ha igen (curl -z paramétere), továbbá kicsit kevesebb jogot adott neki, így természetesen etinek is jár a serital 🙂 Update #2: közben kiderült, hogy eti scriptjébe mégiscsak kell a több jog ahhoz, hogy az applet a Clipboardot használhassa. Én nem pöcsöltem vele, visszaadtam neki mindent, így most a script így néz ki. Update #3: eti elolvasta az stderr kimenetet és mégiscsak a minimálisan szükséges jogot kapta az applet. Update #4: eti közben kiókumulált még két jogosultsági beállítást, hogy legalább a plain text output működjön – sajna a PDF output továbbra sem jó, de már ez is valami! Az outputot az $output_dir-ben beállított folderbe pakolja majd az applet. Update #5: újabb eti tweak, hogy defaultban az output foldert nyissa meg az applet export target könyvtárnak.
#!/bin/bash
# //fns.pappito.com/2013/02/20/cib-e-bank/
#dir=~/tmp/cibib
dir="`dirname $0`"
output_dir=~/Desktop
[ -f $dir/AppletLocal.html ] || cat > $dir/AppletLocal.html <<eof
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" style="overflow: hidden">
<head>
<title> CIB Internet Bank </title>
</head>
<body style="overflow: hidden;margin: 0px">
<applet name="mainApplet" code="ebank.applet.MainApplet" width="800" height="600" mayscript archive="cibib.jar">
<param name="CABBASE" value="https://cibib.cab">
<param name="default_fontsize" value="11">
<param name="PACKED" value="TRUE">
<param name="java_arguments" value="-Dsun.java2d.noddraw=true -Dsun.java2d.d3d=false">
<param name="separate_jvm" value="true">
<param name="centerimage" value="true">
<param name="boxborder" value="false">
<param name="image" value="loader_hu.gif">
<param name="MAYSCRIPT" value="true">
<param name="BASEVIEW" value="1">
<param name="LOGLEVEL" value="50">
<param name="PROTOCOL" value="https">
<param name="SERVERURL" value="https://ibank.cib.hu/IBWBGateway/IBGatewayServlet">
<param name="PRINTERURL" value="https://ibank.cib.hu/IBWBGateway/IBPrintingServlet">
<param name="LANGUAGE" value="hu">
<param name="INITWIDTH" value="800">
<param name="INITHEIGHT" value="600">
</applet>
<!-- <param name="DEMOMODE" value="TRUE"> -->
	<script>
window.onerror = myErrorHandler;
function help(pageName)
{
	help_window = window.open(pageName, "help", "toolbar=0,location=0,resizable=0,status=0,menubar=0,scrollbars=0,hotkeys=1,fullscreen=0,width=500,height=380,marginheight=0,marginwidth=0,dependent=1");
	help_window.focus();
}
function printWindow(text)
{
	msgWindow=window.open("","_blank", "toolbar=1,location=0,resizable=1,status=1,menubar=1,scrollbars=1,fullscreen=0");
	msgWindow.document.open("text/html", "replace");
	msgWindow.document.write(text);
	msgWindow.document.close();
}
function saveWindow(text)
{
	msgWindow=window.open("","_blank", "toolbar=1,location=0,resizable=1,status=1,menubar=1,scrollbars=1,fullscreen=0");
	msgWindow.document.open("text/plain", "replace");
	msgWindow.document.write(text);
	msgWindow.document.close();
}
function myErrorHandler(msg, url, linenumber)
{
	alert(msg + ' at line: ' + linenumber);
	return true;
}
	</script>
</body>
</html>
EOF
cat > $dir/cibib.policy <<eof
grant {
	permission java.net.SocketPermission "ibank.cib.hu:443", "connect,resolve";
	permission java.awt.AWTPermission "accessClipboard";
	permission java.io.FilePermission "$output_dir", "read,write";
    permission java.io.FilePermission "$output_dir/-", "read,write";
};
EOF
if [ -f $dir/cibib.jar ]; then
	modified_since="$(/bin/ls -lT $dir/cibib.jar | grep -o '[A-Z][a-z][a-z] [123 ][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9][0-9][0-9][0-9]')" && \
	curl -z "$modified_since" -o $dir/cibib.jar.new https://ibank.cib.hu/cibib.jar || exit 1
	if [ -f $dir/cibib.jar.new ]; then
		mv -v $dir/cibib.jar{,.old} || exit 1
		mv -v $dir/cibib.jar{.new,} || exit 1
	fi
else
	echo "Downloading latest CIB applet..."
	curl -o $dir/cibib.jar https://ibank.cib.hu/cibib.jar || exit 1
fi
appletviewer $dir/AppletLocal.html -J-Djava.security.policy=$dir/cibib.policy -J-Duser.dir=$output_dir > /dev/null &
]]>