HTML

Programozó Páternoszter

Ez a Programozó Páternoszter (PP) blogja, a programozásról szól. Aktualitása, hogy a Debreceni Egyetem Informatikai Kara Magasszintű programozási nyelvek 1-2, C++ esattanulmányok, Java esettanulmányok című kurzusainak blogja is egyben.

A vadászat

A Debreceni Egyetem Programozói Évkönyve: az UDPROG projekt. A szakmai fórumunk a Facebook-en. Az új előadások a prezin.
A régi előadások:
Prog1:
1. C bevezetés
2. C tárgyalás
3. C befejezés
4. C a gyakorlatban
5. C++ bevezetés
6. C++ tárgyalás
7. C++ befejezés
8. C++ a gyakorlatban
9. Java platform bevezetés
10. Kvantuminformatikai alg. bev.
Prog2:
1. Java bevezetés
2. Java tárgyalás
3. Java befejezés
4. Java a gyakorlatban
5. Software Engineering bev.
6. Java EE bevezetés
7. AspectJ bevezetés
8. BPMN-BPEL SOA programozás
9. C++ haladó
10. Tensorflow

Kövess engem!

Friss topikok

Linkblog

Minket az Isten is egymásnak teremtett

2011.04.24. 14:00 nb

Avagy a (Hetedik Szem-es) tudatminták rendezéséről szólunk ebben a posztban. Az ilyen minták elemzését, avagy a Digitális Tudatlenyomatok Összehasonlító Könyvtárának létrehozását már beharangoztuk korábbi, Közösségi háló reloaded posztunkban.

De mik is ezek a minták, mi a Hetedik Szem? A Hetedik Szem egy a szerző doktori dolgozata kapcsán megnyitott mobil játék:

A „Hetedik Szem” egy Szabad Akarat Szonda (SZ.A.SZ) program, mely egy 2048 bites lelki (normál és erotikus) ujjlenyomatot vesz fel a játékostól. A program 10 ilyen lenyomat kezelésére: tárolására és összehasonlítására ad lehetőséget. Figyelem: ez egy játékprogram! Kizárólag szórakoztatásra szolgál, tipikus felhasználása, hogy ismerőseinktől felveszünk egy lenyomati görbét, amit aztán a sajátunkkal összehasonlíthatunk.
A játékba épített Szabad Akarat Szonda működése alatt feltesszük, hogy a játékos relaxációhoz hasonló állapotban játszik: csendes vagy halk, nyugtató jellegű zene mellett, besötétített vagy nem túl világos helyen kényelmesen elhelyezkedve, szemeket becsukva próbál ellazulni. Közben a telefon előkészítve a kézben, ujjak a megfelelő gombokon...

"Ez adja a mobil megoldás erejét és szükségszerűségét, mert egy ilyen relaxációs állapotban a PC billentyűzetének használata nem megoldható."

A Norbert Bátfai, Erika Bátfai, Ildikó Pšenáková (2010): Jávácska One: Open Source Mobile Games to Revolutionize Education of Programming, Journal of Computer Science and Control Systems, Vol. 3., No. 2., pp. 5-10, (2010) cikkből fordítva:

A játék ötletét Kornhuber és Libet (*, **) a tudatosság és az idő kapcsolatáról szóló eredményei sugallták. A program 2048 darab 100 milliszekundumos időszelettel dolgozik. Ha a játékos tűzgombot nyom az adott időszeletben, akkor 1-re, különben 0-ra állítjuk a szeletnek megfelelő bitet. Tehát esetünkben a tűzgomb nyomását feleltetjük meg egy "akaratlagos..."voluntary finger movements"-nek.

Az említett kísérletben résztvevő alanyoknak jobb mutatóujjukat kellett akaratlagosan behajlítani, a behajlítás időpontját EGM készülékkel határozták meg, miközben az fejbőrre rögzített elektródákkal mérték az agy elektromos aktivitását. Alanyonként ezer kísérletet átlagolva azt találták, hogy a behajlítást megelőzően már egy másodperccel megkezdődik az aktivitás.
    A hasonló kísérletekből ragadtuk ki az akaratlagos ujjbehajlítást. (92. o.)

 De pillantsunk a programba!

A mintákat folyamatosan animálva mutatja a jobb felső ábra, a jobb alsón az a box-plot látható, ami egyszerű értelmezhetősége miatt került a játékba: a két minta annál hasonlóbb, minél jobban fedi egymást a sárga és a kék téglalap.

 A minták bitenkénti összehasonlítása másra nem jó, hacsak nem a feladat nehézségének érzékeltetésére. (Továbbá a játékélmény emelése miatt a 0-1 lenyomatok megjelenítését némi „zajjal” színezve, a nulla szintet néhány pixel magas véletlen amplitúdóval  rajzoljuk meg.)
    Esetünkben a lenyomatok összehasonlításának alapja a Ziv-Lempel-Welch (LZW) algoritmus, mely mellett a (***) utalására építünk, miszerint – az ismeretlen adatsorokkal való első ismerkedésben – az LZW során épített fa ághosszainak szórását érdemes összevetni.

 

Digitális Tudatlenyomatok Összehasonlító Könyvtára

Arra készülve, hogy hamarosan rendelkezni fogunk olyan humán mintákkal, ahol a minta mellett rendelkezésre fog állni a mintákat szolgáltatók kapcsolati hálója is, készítsük el azokat a C++ osztályokat, amik segítségünkre lesznek majd a minták elemzésében. Először rendezzük sorba a mintákat: 

typedef std::bitset<50> TudatMinta;

struct tudatRendezes
{
    bool operator()(const TudatMinta& a, const TudatMinta& b) {
        LZWBinFa afa, bfa;
        for (int i=0; i<a.size(), i<b.size(); ++i) {
            afa << a[i];
            bfa << b[i];
        }
        return bfa.getSzoras() < afa.getSzoras();
    }
};

int
main (int argc, char *argv[])
{
    std::vector< TudatMinta > v;

    TudatMinta elso(std::string("11111111111111111111111111111111111111111111111111"));
    TudatMinta masodik(std::string("11111000001111100000111110000011111000001111100000"));
    TudatMinta harmadik(std::string("01100101100111110010011011001100001100110010110111"));
    v.push_back(elso);
    v.push_back(masodik);
    v.push_back(harmadik);

    std::copy(v.begin(), v.end(), std::ostream_iterator<TudatMinta>(std::cout, "\n"));
    std::sort(v.begin(), v.end(),  tudatRendezes());
    std::copy(v.begin(), v.end(), std::ostream_iterator<TudatMinta>(std::cout, "\n"));
}

A tudatRendezes funktor mutatja a rendezés alapját: a minta LZW fája ághosszainak szórása szerint rendezünk. Ezzel az iránnyal két legyet ütünk majd egy csapásra: a Hetedik Szemmel is fogalkozunk és a Prog1 előadással is szinkronban vagyunk: funktorok, az STL használata :)

(Vedd észre, hogy a példában használod az eddig kifejlesztgetett LZWBinFa osztályunkat.)

*: H. H. Kornhuber, L. Deecke, and P. Scheid, “Voluntary finger movement in man: Cerebral potentials and theory”, Biological Cybernetics, (23), 1976. 13
**: B. Libet, E. Wright, B. Feinstein, , and D. K. Pearl. “Subjective referral of the timing for a conscious sensory experience”, Brain, (102):193{224, 1979.
***: G. Tusnády, “Sztochasztikus számítástechnika”, KLTE, 1996.

Szólj hozzá!

Címkék: stl hetedik szem funktor jávácska one

CORBA telefonkönyv

2011.04.23. 11:22 nb

Az előadáson a királyi úton jártunk: Javaból a org.omg.CosNaming.NamingContextExt osztályt, C++-ból a CosNaming::NamingContextExt osztályokat használtuk, ami azért volt királyi, mert nem kellett az első CORBA objektumunk (referenciájához) kötött CORBA nevet fáradtságosan névkomponensek sorozataként (leképezve tömbjeként) létrehozni, hanem nagyvonalúan a to_name és a resolve_str üzeneteket küldözgethettük...

Miről is beszélek? CORBA-ban is minden objektum, a névszolgáltató is, tehát őt is IDL nyelvű interfészén keresztül látjuk, ami a CosNaming.idl fájlban van leírva:

module CosNaming {
typedef string Istring;

struct NameComponent {
Istring id;
Istring kind;
};
typedef sequence<NameComponent> Name;

tehát itt olvashatjuk (pirossal) az IDL nyelven, hogy a név az névkomponensek sorozata. Ugyanitt, a CosNaming.idl-bennézzük meg az említett öröklődést interface NamingContextExt: NamingContext {
... Name to_name(in StringName sn) raises(InvalidName);
...
Object resolve_str(in StringName sn) raises(NotFound, CannotProceed, InvalidName,);

Részletek majd a 10. előadásban, most írunk egy progit, ami felépít egy fát a névszolgáltatóban, s egy másikat, ami lekérdezi azt. Mindkettőt Javában, a harmadik "fél" progit C++-ban. 3 trófea, ha úgy febejezed, hogy ugyanazt a fát épiti, mint amit a Java-s. Onnan tudod, hogy kész vagy, hogy a C++ sajátoddal felépíted (a Javás helyett) és a Javás lekérdező ugyanazt nyomja ki, mintha a Javás felépítővel toltad volna a fa építését. Nyugalom, bonyolultabb volt leírni, mint kiprószálni:

1. névszolgáltató start (mehetne a Java IDL-é is a JDK-ból, de nyomjuk most az omniORB-ét)

[norbi@sgu ~]$ omniNames -start 2011  -logdir .

Sat Apr 23 15:05:19 2011:

Starting omniNames for the first time.
Wrote initial log file.
Read log file successfully.
Root context is IOR:010000002b00000049444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000010000000000000070000000010102000e0000003139332e362e3133352e31353400db070b0000004e616d6553657276696365000300000000000000080000000100000000545441010000001c0000000100000001000100010000000100010509010100010000000901010003545441080000008fceb24d0100500b
Checkpointing Phase 1: Prepare.
Checkpointing Phase 2: Commit.
Checkpointing completed.
2. Felépítő fordít, futtat:

$ javac NevszolgEpito.java
$ java NevszolgEpito -ORBInitRef NameService=corbaloc::sgu:2011/NameService

3. Lekérdező fordít, futtat:

javac NevszolgKiiro.java
java NevszolgKiiro -ORBInitRef NameService=corbaloc::sgu:2011/NameService

IOR:00000000000000010000000000000001000000000000001f00010000000000047367750007db00000000000b4e616d6553657276696365
---Object: (Nehogy, obj)
IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000000000010000000000000074000102000000000e3139332e362e3133352e3135340007db0000000eff00e6d0b24d0100509c0000000100000000000300000000000000080000000041545400000000010000001c000000000001000100000001050100010001010900000001000101094154540300000008e6d0b24d0100509c
---Context: (PP, mappa)
IOR:00000000000000010000000000000001000000000000001f00010000000000047367750007db00000000000b4e616d6553657276696365
------Object: (C++, obj)
IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000000000010000000000000074000102000000000e3139332e362e3133352e3135340007db0000000eff00e6d0b24d0100509c0000000200000000000300000000000000080000000041545400000000010000001c000000000001000100000001050100010001010900000001000101094154540300000008e6d0b24d0100509c
------Context: (Java, mappa)
IOR:00000000000000010000000000000001000000000000001f00010000000000047367750007db00000000000b4e616d6553657276696365
---------Object: (EE, obj)

4. Névszolgáltató lelő, restart

5. C++ "félszerzet" programoz, fordít, futtat

$ g++ -I${OMNI_HOME}/include nevszolg_epito.cpp -o nevszolg_epito -L${OMNI_HOME}/lib  -lomniORB4 -lomnithread -lomniDynamic4
$ ./nevszolg_epito -ORBInitRef NameService=corbaloc::sgu:2011/NameService

6. Lekérdező futtat:
java NevszolgKiiro -ORBInitRef NameService=corbaloc::sgu:2011/NameService

7. Ha ugyanazt a fát írja ki, mint amilyet a Javás felépített, kész vagy és 3 új trófea büszke tulajdonosa (de lásd még a "hegylakó szabályt" is)

8. goto 4.

Kattints a továbbra a hozzávalókért!

Szólj hozzá!

Címkék: corba java idl omniorb namingcontextext namingcontext nameservice omninames

süti beállítások módosítása