Minden ami „geekség”

Fordított világ

Azon gondolkotunk valamelyik ebéd után, hogy milyen érdekes lenne egy olyan bolygón élni, ahol a funkcionális programozási paradigma került előtérbe, nem az imperatív vonal. Az egész természetesen ott indul, hogy a számítógépekben levő processzorok gráfredukciós algoritmusokkal működnének. Minden kisiskolás valami lebutított Haskellt próbálgatna Logo helyett (típusok nélkül). A mainstream munkahelyeken is funkcionális programozók ülnének, a nagyobb cégekben a túl sok enterprise pirulát beszedett arhitectektek pedig mindent kategóriákkal és én nem tudom milyen bifunktorokal absztrahálnának szarrá.

Az imperatív világgal gyakorlatilag csak az egyetemeken találkozna az ember. Hosszú cikkek sorai porosodnának a könyvtárakban és a levlistákon arról, hogy hogy lehet funkcionális nyelveken imperatív programokat írni. Ne adj Isten: objektum orientált programokat. És Cactus azzal kínozná a munkatársait, hogy jó, jó itt vannak ezek a monádok meg unique típusok, de most egy pillanatra képzeljük azt, hogy ezek tulajdonképpen egy állapotgép utasításai. Hosszú hétvégéken cikket olvasna a Neumann elvű számítógépekről. Aztán kicsit tovább menne és azt kezdené boncolgatni, hogy az imperatív nyelvekbe hogyan lehet funkcionális nyelvi elemeket beletenni, gondolok itt a függvényekre mint first class citizenekre, az anonymous methodokra (akár rekurzió Y kombinátorral), lusta kiértékelésre és így tovább. A párhuzamos folyamatok érdekességeit, boncolgatná, amivel már mindenkit az őrületbe kergetne.

Csak néhány nagy bank engedhetne meg magának imperatív gondolkozású programozókat, az ilyenek a világ végén dolgoznának szemérmetlenül nagy fizetésért.  Miért? Hát nyilván itt nem érvelhetünk azzal, hogy az imperatív programok milyen tiszták, rövidek, jól párhuzamosíthatók és a helyességük könnyen igazolható. Viszont még mindig kijátszhatjuk a teljesítmény kártyát. Az imperatív programozó közel engedhet magához egy nagyon egyszerű gépet, amit akár assemblyben is programozhat, hogy még jobban kioptimalizáljon egy-egy sebességkritikus folyamatot.  Szép lassan aztán megjelenne a hardveres támogatás is. Előbb csak egy egyetemi projekt keretében alkotnák meg a CPU-t, de aztán a letnI felkarolná a dolgot, és kihozna egy iszonyatosan drága gépet imperatív processzorral szerelve.

Kihagytam valamit? Bizonyára. De fura világ lenne az biztos…

Practical Common Lisp

A héten befejeztem Peter Seibel Practical Common Lisp című könyvét, és továbbra is vegyes érzéseim vannak a nyelvvel kapcsolatban. A könyv egyébként nagyon jó, csak ajánlani tudom mindazoknak, akiket érdekel a Lisp és egy viszonylag széles merítést akarnak kapni belőle az alapoktól indulva, egészen egy egyszerű kis webes alkalmazás elkészítéséig, ami egyúttal shoutcast szerver, binárisból parsolja az ID3 tageket stb. Nagyon jól összerakott könyv 10/10, bár én tudnék ilyet írni valamikor… akármiről.

Domain specifikus nyelvek

De vissza a vegyes érzelmekhez. Tulajdonképpen az egész nyelvben csak a makrók fogtak meg, ami nem is csoda laza 8 év domain specifikus nyelvek (DSL) terén szerzett tapasztalatomból kifolyólag. Na jó, ez így túlzás, de ha meg azt írom, hogy DSL alapú eszközök (domain workbenchek) fejlesztésére szolgáló eszköz fejlesztésében, az még durvábban hangzik, pedig hát ez az igazság, akárhogy nézzük is. A makrók nagy királyság, és már emiatt megérné a nyelvet nap mint nap használni, ugyanakkor én láttam ennél sokkal ígéretesebb megoldásokat ezen a téren.

Olyan eszközöket, amikben a DSL olvasható. Igen, olvasható, mert mondjon nekem akárki akármit, a Lisp programok kurva nehezen olvashatók. Jó, a könyvben nincs syntax highlight, viszont van szöveges magyarázat. De még ezzel együtt is elgondolkozik az ember, hogy akkor ez itt most egy változó neve akar lenni, vagy talán inkább valami függvény, netán kulcsszó. És eleve mindent beleerőltetni ezekbe a zárójelekbe, kész gyötrelem. És tökéletesen tisztában vagyok vele, hogy John McCarthy az elején még tervezte a szintaxis kialakítását (amíg közbe nem jött a Beatles*), és így, hogy nem kell parsolni, sokkal könnyebb a kódot adatként kezelni, de ez nekem még így is kevés. Köpjenek le, kérem, köpjenek le, és bizonyítsák be hogy nincs igazam.

Én olyan eszközöket szeretnék, ahol definiálom a DSL-t valami egyszerű kis nyelven, ami mondjuk olyasmi lehet, mint ahogy az ember egy xml sémát definiál. Aztán adok hozzá valami projekciót (akár többet is), ami meg az xml analógiát folytatva, egy xsl transzformáció a DSL-ről valami layout nyelvre. Írok hozzá pár sorban egy generátort DSL → C# vagy akármi, ami szemantikát ad az egészhez. És ennyi, megkapom az editort. Nem írtam parsert, de jól néz ki a képernyőn a DSL-ben írt “program”. Világos, hogy mi kulcsszó és mi nem. Rendesen van tördelve, az általam használt, ismert és szertett jelölésrendszert látom magam előtt. Úgy általában pont úgy néz ki az egész, ahogy papíron a legkényelmesebben le tudnám írni. Nem is biztos hogy szöveg alapú… lehet, hogy egy táblázat jobban megfelel, vagy valami gráf, ahol összehuzigálom a dolgokat. Ki tudja…

És igen, akarok hozzá code completiont kapni, és refactoring toolokat is, meg “find references”-t, és az összes kis feature-t, amit egy IDE-ben megszoktam programozási nyelvek kapcsán. Ja, hogy a DSL-em nem programozási nyelvekről szól, hanem adószabályokról, pénzügyi döntésekről, logisztikáról, akármiről… annál inkább.

Hiányoznak ezek az eszközök mint egy falat kenyér, és sajnos a Lisp nem adja meg a kívánt szabadságot, bár kétség kívül nagyon erős a maga kis világában.

Dinamikus nyelvek

A másik dolog ami miatt nem kedvelem a Lispet az a típusok hiánya. Van most egy vicc a cégben, hogy hidd el nekem, hogy te már nagyon öreg programozó vagy, mert még mindig a szigorú statikus típusosságban hiszel, és nem ismered el a manapság divatos dinamókus nyelvek létjogosultságát. (Természetesen ilyenkor átsiklunk afölött, hogy a Lisp egyike az ős nyelveknek.) Az utóbbi évtizedben egyre-másra jönnek fel a dinamikus nyelvek, és én és a barátaim közül sokan nagyon nem értjük ezeket az újhullámos kis nyikhajokat a rapid prototyping-al meg a test driven developing-al, valahogy úgy tűnik, hogy nagyon hiányzik valami, ha pl. az IDE nem tudja nekem megmondani, hogy egy adott változóval mit lehet csinálni. Sokakat ez egyáltalán nem zavar, és ilyenkor tényleg úgy érzem, hogy én már egy vén fasz vagyok és nem értek semmit. De amikor a Lisp könyv végén arról olvasok, hogy jó ez a nyelv, na de hol van teljesítményben egy C-hez képest, és aztán elkezdi declare-ekkel teleszórni a kódot, hogy futás idejű ellenőrzéseket kapcsoljon ki annak érdekében, hogy mondjuk egy összeadás csak int-ekre működjön, és túl tudjon csordulni (ahogy C-ben), akkor azért csak nagyon nehezen tudom elnyomni a kis félmosolyt, hogy lám-lám a nagy öreg hogy küzd a típus kalkulus hiánya miatt. De megint megkérem Önöket, hogy rakjanak helyre, ha tudnak.

Összességében. A könyv nagy kaland volt, tetszett, rengeteg ideig tartott napi húsz oldal sebességgel a buszon elolvasni, de megérte, mert sokat tanultam belőle. Még akkor is, ha nem tervezem, hogy Lisp programozóként folytassam karrieremet.

Napelem készítése házilag


Villamosipari anyagismeretből azt a feladatot kaptuk, hogy válasszunk ki bármilyen az anyagismeret témájába vágó anyagot, és írjunk róla valamit. Elsőéves villamismérnök halgatóként a legmesszebbmenőkig elítélem ezt a feladatkiosztást, hiszen honnan a …. kéne nekem bármit tudni az anyagtudományról, meg arról, hogy mi vág a témájába. Meg is mondtam a tanárnak, hogy tőlem ne várjon érdekességeket, a napelemekről tudok írni, mert az viszonylag jól dokumentált mindenfelé a neten. De azért, hogy ne legyen túl száraz a dolog, és főleg, hogy én is élvezzem egy kicsit, megpróbálkozom itthon napelem készítésével.

Természetesen nem olyan napelemről van szó, ami használható is. Bőven megelégednék valamivel, amivel ki lehet mutatni a fotoelektromos jelenséget. A neten több helyen is utalnak a végül elvégzett kísérletre.

A jelenség

Azt szeretnénk kimutatni, hogy egy réz-I-oxid (Cu2O) lemez, fény hatására előszeretettel dobálja el az elektronjait. Ezek az elektronok egy elektrolitos oldatban (sós víz) átúsznak egy másik, sima rézlemezre. A két lemez között feszültség és természetesen némi áram mérhető.

Anyag- és eszközbeszerzés

Rezet a munkahelyemhez legközelebbi bádogosnál vettem, ott elég hülyén néztek, amikor elmondtam, hogy nekem csak egy ilyen kis darabka réz kellene, és tényleg nem akarok belőle esőcsatornát építeni, csak egy házi feladat miatt kell. Végül nagy nehezen, és duzzogva levágtak egy arasznyi széles csíkot a 40 méteres rézgurigából. Még mondta is a bácsi, hogy a szélét levágja géppel egyenesre, de megegyeztünk, hogy erre semmi szükség, hiszen ezt én még úgyis tovább fogom darabolni egészen kis darabokra. Nagyot néztek amikor elmondtam, hogy napelemet fogok csinálni belőle.

A réz-I-oxid készítéséhez egy rezsóra van szükségünk, legalábbis a kísérlet leírása szerint, amitől nem akartam eltérni hacsak nem volt muszáj. Szereztem hát egy 1500W-os rezsót a neten. Nekem ne mondja senki, hogy nem készülök fel alaposan…

Jobb kint csinálni az ilyeneket, ki tudja milyen büdös lesz miatta. (Nem lett az.) Kivittem a rezsót, beállítottam max fokozatra, és jó fél órán keresztül hevítettem rajta a rezet, amin sötét réz-II-oxid réteg keletkezett. Ezt lassú hűtés után ütögetéssel, illetve simán az ujjam végighúzásával el lehetett távolítani, hogy alatta előtűnjön a vékony réz-I-oxid bevonat.

A kísérlet

Nem fűztem a dologhoz komoly reményeket, már azzal is ki lettem volna elégítve, ha bármilyen mérhető eredményre jutok. A kísérletet többször is meg kellett ismételni, mert legnagyobb sajnálatomra már a műszer tiszta vízbe mártott csatlakozói között is tudtam némi feszültséget mérni. (Ugyanez reprodukálható volt közönséges rézlemezek vízbemerítésével is.) Próbáltam desztillált vizet is szerezni, de több benzinkúton is csak ioncserélt vizet árultak. Végül egy olyan desztillált vízzel egyenértékűnek nevezett, kémiailag teljesen sómentesített víz mellett döntöttem, aminek a vezetése 20μS-nél kisebb volt. (Bár azt nem adták meg, hogy ezt pontosan hogyan lehetne kimutatni, én ennél jóval nagyobbat mértem.) Sajnos ez a víz is produkálta a mérhető feszültséget már akkor is, amikor tiszta pohárba öntöttem és a feszültségmérőt közvetlenül a víz két pontjára helyeztem. Ez kissé elgondolkodtatott, mert ugyan hogyan tudna már az a szerencsétlen tök homogén víz két pontja között bármilyen feszültséget produkálni, de mondjuk tudjuk ezt be a benne mikro szinten kavarogó ionoknak.

Összességében négy különböző alkalommal, és több elrendezésben is sikerült reprodukálni a jelenséget, és minden alkalommal nagyon szépen látszott, ahogy a berendezést letakarva csökken a feszültség ill az áramerősség.

Két réz-oxid lemezt, és 3 rézlemezt használtam el közben. Egyszer történt egy furcsaság, hogy vödörrel letakarva a rendszert, a feszültség elkezdett nőni (pedig csökkennie kellett volna…). Gyanítom azért, mert az egyik rézlemez időközben beszennyeződött, talán nem tett neki jót, hogy egy hétig a sós-vizes fürdő után hagytam száradni.

Ettől eltekintve a jelenség minden alkalommal szépen látszott, és végül mindent nulláról újrakezdve most már számokkal is alá tudom támasztani.

1) Két 7.5×15 cm-es rézlemez, 3 kanálnyi sósvizes oldatba merítve:

A köztük mérhető feszültség: <10 mV, időben lassan ingadozik (lemegy 0 alá, majd át a negatív tartományba, és vissza).

Áramerősség: kb -0.017 mA (ez is változik).

Megj: Az áramerősséget és a feszültséget nem tudtam azonos időpillanatban mérni. Az áramerősség méréséhez még sorba kötöttem a műszert egy 1Ω ellenállással is a biztonság kedvéért.

2) A két lemez közül az egyiken réz-I-oxid réteget képezve, és visszahelyezve az oldatba.

Napra helyezve:

feszültség: kb 40.6 mV,

áramerőség: kb 0.22 mA

Sötétben (egy vödörrel letakarva):

feszültség: kb 0.86mV

áramerősség: kb 0.035mA

A számokból is látszik, hogy valóban nagy a változás a napra helyezett és a sötétben történt mérés között, valamint a napon jobb értékeket mérünk mint a két rézlemezes elrendezésben. Mindezek alátámasztják a jelenség létezését.

Mindössze 40.6*0.22*10^-6 W teljesítményt tudtam kisajtolni a dologból, ami nem nevezhető soknak. Egy izzólámpát sem lehet vele felvillantani.

Tényleg érdekes kísérlet, és nagyon látványos is, ha valaki szeret otthon kísérletezgetni, és megvannak az eszközei, csak ajánlani tudom. (Köszönet Mayának a multiméterért.)