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 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
2012 tavasz, MI, GI, PTI (első és második évfolyam BSc)
Elkezdődött a verseny kíírása (jelen pillanatban a "versenyszabályzatot" finomítjuk), figyeld a fejleményeket a verseny http://robocup.inf.unideb.hu/ szájtján!
"...ez a módszer az egyik legrégibb és legismertebb. Hacsak a kulcs nem nagyon hosszú, a CIA vagy az NSA várhatóan egy napon belül megfejti file-unkat."
A második labor "izometrikus-szöszmötölős" példája a Page Rank algoritmus megvalósítása volt, íme a harmadiké: törjünk fel saját C progival egy exoros titkos szöveget!
Aki nem ismeri, a fenti könyvben a részletes leírás, vagy itt a Java változathoz egy kis Móricka rajzot is készítettem anno: http://www.tankonyvtar.hu/informatika/javat-tanitok-1-1-1-080904-1 kb. a lap közepén a "1.12. példa - Titkosítás kizáró vaggyal" pont alatt.
S íme a C implementáció:
Ahogyan használd:
nbatfai@hallg:~/c$ more tiszta.szoveg Nem tudok kimerítő leírást adni arról, hogy hogyan tudsz megtanulni programozni -- nagyon összetett tudásról van szó. Egyet azonban elárulhatok: a könyvek és tanfolyamok nem érnek túl sokat (sok, valószínűleg a legtöbb hacker autodidakta). Aminek van értelme: (a) kódot olvasni és kódot írni.
Hogyan lesz az emberből Hacker http://esr.fsf.hu/hacker-howto.html
Kódolásnbatfai@hallg:~/c$ gcc e.c -o e -std=c99 nbatfai@hallg:~/c$ ./e kercerece <tiszta.szoveg >titkos.szoveg nbatfai@hallg:~/c$ more titkos.szoveg KRIKSZKRAKSZ bináris szemétDekódolás:
nbatfai@hallg:~/c$ ./e kercerece <titkos.szoveg Nem tudok kimerítő leírást adni arról, hogy hogyan tudsz megtanulni programozni -- nagyon összetett tudásról van szó. Egyet azonban elárulhatok: a könyvek és tanfolyamok nem érnek túl sokat (sok, valószínűleg a legtöbb hacker autodidakta). Aminek van értelme: (a) kódot olvasni és kódot írni.
Hogyan lesz az emberből Hacker http://esr.fsf.hu/hacker-howto.html
3 kisbajnokság
Ennyit kap, aki egy nap alatt (természetesen a saját maga írta C progijával) feltöri a következő titkos szöveget: www.inf.unideb.hu/~nbatfai/titkos.szoveg Határidő: feb. 29. 08 óra 00, perc, egy kommentben kérem a titkos kulcsot és a tiszta szöveget. Sokat segítek: 8 betű a titkos kulcs és minden betű számjegy (kvázi dupla PIN kód :)
[norbert@matrica ~]$ svn co svn://hallg.inf.unideb.hu:2005 elso A elso/bevezetes A elso/bevezetes/elsoOpenMP A elso/bevezetes/elsoOpenMP/pmandel A elso/bevezetes/elsoOpenMP/pmandel/mandelpngt.c++ A elso/bevezetes/elsoOpenMP/pmandel/pmandelpngt.c++ A elso/bevezetes/elsoOpenMP/pmandel/ompmandelpngt.c++ A elso/bevezetes/C[norbert@matrica ~]$ cd elso/bevezetes/elsoC [norbert@matrica elsoC]$ ls -l total 12 -rw-rw-r--. 1 norbert norbert 194 Feb 15 11:31 atlag.c -rw-rw-r--. 1 norbert norbert 223 Feb 15 11:31 rszamok.c -rw-rw-r--. 1 norbert norbert 214 Feb 15 11:31 szohossz.c [norbert@matrica elsoC]$ gcc szohossz.c -o szohossz [norbert@matrica elsoC]$ ./szohosszKi celebrálja a szóhossz.c-t?
Trófeák
Az előadáson megjelentektől fogadom csak el az alábbiakat:
tetsz./1 trófea: Levénez-féle idővonal (lásd. a megfelelő "robbanó" fóliát)
3/1 trófea: lex-es szó, szám, sor, betű számláló (ugyancsak lásd. a megfelelő "robbanó" fóliát)
Labortrófeák
laboron 3/1 Írj C-ben két végtelen ciklust: az egyik alig használja a procit, a másik pörgesse, ahogy belefér (1. alkalom, feb. 13-i hét)
laboron 3/1 A lenti "Karakterhegyezés" pont két ellenőrző kérdése (2. alkalom, feb. 20-i hét)
Egyéb trófeák
3/1 trófea: egy Qt-s példa felélesztése, kipróbálása a Qt SDK-ból
3/1 trófea: egy Qt-s példa felélesztése, kipróbálása parancssorból
tetsz./1 trófea: a kommentben szereplő videó otthoni saját elkészítése, jó hanggal :) (ezt lehet halmozni, azaz amennyit elkészítesz, annyiszor 1 trófea, YouTube-ra kérem)
2/5 trófea: nehéz feladat, hogy kicsit nyújtsuk a mezőnyt :) De ne ess pánikba: megoldása jóval megelőzi a kurzus normál haladási sebességét, a main stream-ben, azaz a "tömegnek" majd a 6. előadásban jön: a szálakat is használó Qt-s példák valamelyikében az osztályok kommunikációját írd át a "callback" helyett a Qt slot-signal mechanizmusára. Ez a feladat teljesen önálló OO tervezést feltételez! Ha kezdő vagy Qt-ben: itt a slot-signal (157. o.) pl. vagy megtalálod a könyvtárban.
10/2.5 trófea: legyen egy kisebb ugrás is: a 3. előadás 03-15glibc-s "printf meghekkelése", ez remek móka és tanulságos, ezért 10-et fogadok el, s +1 pont, ha van YouTube-os bemutató videó
A megoldásokat a blogon kommentként kérem megmutatni, screenshot+forrás formában tipikusan. Ha külön nem mondjuk, mindig az első hármat fogadjuk el. A saját trófeák nyilvántartását minden kapcsolódó hallgató önmaga végzi. Ha saját (mikor, mire, mennyit) kimutatása nem egyezik a blogon lévő (csakis összpontszámával), akkor két hetes ablakon belül a saját kimutatása elküldésével jelzi ezt nekem.
Blogoljunk!
Szórakoztatásodra a tavalyi posztokból összevágok egy kis montázst. Íme, élvezzük:
Az első kisbajnokság
Futtassuk a PP 27. oldalának for(;;); végtelen ciklusát "vegtelen" néven és ennek
for(;;) sleep(1);módosítását "vegtelen2" néven. Majd egy ps axu|grep vegt parancs 3. (CPU) oszlopát hasonlítsuk össze és világítsuk meg a helyzetet a man 3 sleep alapján!
Mi történik, ha a saját függvényt a valódi könyvtári #include <string.h> / strncpy-al helyettesíted? A válaszod ellenőrzéséhez a forrás elejére illeszd be a #include <string.h> sort, illetve a string_masolo_man_pl_alapjan függvény két hívásánál ezt a nevet egyszerűen írd át strncpy-ra, az aktuális paraméterlistához nem is nyúlva.
Mi történik, ha a string_masolo_man_pl_alapjan saját függvényed implementációjában az első ciklusban felcseréled a dest[i] = src[i]; sort a src[i] = dest[i]; új sorral? Tehát, ha ez van a forrásodban: for (i = 0; i < n && src[i] != '\0'; i++) //dest[i] = src[i]; src[i] = dest[iA konklúzió: mivel a string_masolo_man_pl_alapjan függvényünk első ciklusából mindkét hívásunk alkalmával az i < n feltétel meghiúsulása miatt lépünk ki, így a \0 karakter sztring után írása (azaz a karekterlánc lezárása) egyik esetben sem következik be. Ez tudjuk jól elkapni a 2. hívásnál, mert amikor a printf írja ki az eredményt, akkor ő egy \0 karakterig ír és az előző hívásból ott "maradt" a betűt is kiírja.
Módosítgassuk az első előadásban felvillantott, az strncpy könyvtári függvény manuáljabeli példa alapján megírt implementációnkat, hogy a forrásban kezdjen úgy kinézni néhány sor, mint amilyenek a C programok szoktak lenni!
Például az Androidos telefonok Linux kernelében előfordul ilyesmi: *src++? Lássuk, hozzuk le a forrást:
[norbi@sgu Android]$ git clone git://android.git.kernel.org/kernel/common.gits keressük benne az említett mintát:
[norbi@sgu Android]$ find . -name '*'|xargs grep "*src++"|wc 174 804 10699 nem vitás, a profik is írnak ilyeneket, esetleg pillantsunk is bele a common/include/linux/fb.h forrásába, 1026. sor.
Második kisbajnokság
Nyeri, aki a fenti string_masolo_man_pl_alapjan függvényt rövidebben megírja egy kommentben, február 26-ig. A hossz a függvény testének nyitózárójelétől a bezáróig, őket nem beleértve a felhasznált nem szóköz betűk száma. Így az enyém most 75:
A szappanoperák nyelve nem a C. Mert bár Javában már lehet olyan programokat írni/olvasni a kislámpánál, amik felérnek egy korlátozott szókincsű regény olvasgatásával, ez azért C-ben nem megy. Ám egy-két sort megpróbálhatunk szépen olvasni. Erre mutat egy példát az a laborkártya, ami az alábbi két utasítás összehasonlítását írja elő.
Forráskódok celebrálása
I.) if(signal(SIGINT, utolso_tennivalo) == SIG_IGN) signal(SIGINT, SIG_IGNII.) if(signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, utolso_tennivalo); Ez a laborkártya nem könnyű annak, aki most ismerkedik a programozással. Leginkább őket segíti a jelen poszt, mely alábbi „webcast”-ja a PP egy olyan példájának a kipróbálását mutatja, amiben szerepel az egyik kérdéses kódcsipet. (Ne hagyjuk magunkat azzal megrémiszteni, hogy a signal() egy rendszerhívás, a mi szintünkön rendszerhívás vagy könyvtári függvény, akár saját programbeli hello() függvény: egyelőre egyre megy. De a haladóknak sincs okuk az aggodalomra, a 4. előadásban írunk saját rendszerhívást és saját glibc könyvári függvényt is.)
A videó feldolgozása után annyi a hallgató feladata, hogy értelmezi a II. kódcsipetet.
Harmadik kisbajnokság
Itt az első három kommentben érkezett helyes választ adó viszi el a kisbajnokságot.
A következő kis progi (hátterét lásd majd a 2. előadásban) kapcsán kell helyesen megválaszolni ezt a két kérdést:
ki a szülő folyamat szülője
mi lesz a gyermek folyamat
ha futtatod ezt a programot?
Lásd PP 36! Ez a téma már elővetíti a 2. előadást, amelybe szerintem bele tudunk majd kezdeni szerdán.