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

Gyönyör a tömör újratöltve

2012.03.04. 11:54 nb

Ez a poszt a ott folytatódik, ahol a feb. 29-i előadást befejeztük, őse a tavalyi Gyönyör a tömör poszt. Aktuális, hogy a "elit képzést" felvevő hallgatók soraiban immár felütötte a fejét a kétségbeesés. Olyan jelekben nyilvánul ez meg, mint például: "nem értem a könyvet". Nincs ezzel az érzéssel semmi gond, azért jelentkezik, hogy tegyél ellene: többet olvasd a könyvet, többet  programozz, beszélj kérdéseidről a binomoddal, dobd be itt a blogon stb.! Ez az érzés tk. meg fog menteni a bukástól, de azért nem akarom túlnyugtatni az olvasót. Mert az teljesen rendben van, hogy most még nem ért valamit, de az nincs rendben, hogy e mellett nem csinálja a kiadott feladatokat: sem a választhatókat, sem a sima, sem a hallgatói laborkártyákat! Szóval ne féljetek, de a félelmeteket csakis a megértés és a tudás tudja eloszlatni; élvezzétek a programozást, még akkor is, ha nehezebben jönnek a sikerélmények, magában a programozás "csinálásában" is találhatjátok meg az örömötöket és a dolgok jóra fordulnak, sőt talán még a források is lefordulnak :)

Pillanatkép a 2012. márc. 7-i előadásból:

Konkrét tanácsom pedig, hogy gyertek felkészülten a laborra, ami azt jelenti, hogy a poszt publikálása után dolgozzátok is fel azt, íme jöjjön hát akkor most jóelőre az anyag:

man compress:

DESCRIPTION
       The  compress  utility  shall attempt to reduce the size of the named files by using adaptive Lempel-Ziv coding algorithm.

       Note:  Lempel-Ziv is US Patent 4464650, issued to William Eastman, Abraham Lempel, Jacob Ziv, Martin Cohn on August 7th, 1984, and assigned to Sperry Corporation.

       Lempel-Ziv-Welch  compression  is  covered  by US Patent 4558302, issued to Terry A. Welch on December 10th, 1985, and assigned to Sperry Corporation."
de már jópár éve lejárt a szabadalmi oltalom, egyik eredmény: a gif visszaszorult, a png elterjedt. (A Lempel-Ziv-Welch algoritmust használja a gif formátuma, sok tömörítő, például a compress, gzip, zip.)
Az algoritmus remek leírását találjuk a Rónyai-Iványos-Szabó Algoritmusok könyvben. Alább egy naivabb  implementációt adunk a Tusnády: Sztochasztikus számítástechnika című könyv alapján: jön a 0-1 sorozat, betűnként olvassuk, ha olyan rész jön, ami még "nincs a zsákban", akkor "letörjük és be a zsákba":

00011101110 -> 0 00 1 11 01 110

 a tördelést egy bináris fával könnyen meg tudjuk valósítani:

                 / 
       0             1
   0      1              1
                       0

Így használd:

[norbi@sgu C]$ more b.txt
00011101110
[norbi@sgu C]$ gcc z.c -o z -std=c99
[norbi@sgu C]$ ./z < b.txt
00011101110
---------1
------------0
------1
---/
---------1
------0
---------0

 A kód  immár nem csak képpel:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

typedef struct binfa
{
  int ertek;
  struct binfa *bal_nulla;
  struct binfa *jobb_egy;

} BINFA, *BINFA_PTR;

BINFA_PTR
uj_elem ()
{
  BINFA_PTR p;

  if ((p = (BINFA_PTR) malloc (sizeof (BINFA))) == NULL)
    {
      perror ("memoria");
      exit (EXIT_FAILURE);
    }
  return p;
}

extern void kiir (BINFA_PTR elem);
extern void szabadit (BINFA_PTR elem);

int
main (int argc, char **argv)
{
  char b;

  BINFA_PTR gyoker = uj_elem ();
  gyoker->ertek = '/';
  BINFA_PTR fa = gyoker;

  while (read (0, (void *) &b, 1))
    {
      write (1, &b, 1);
      if (b == '0')
	{
	  if (fa->bal_nulla == NULL)
	    {
	      fa->bal_nulla = uj_elem ();
	      fa->bal_nulla->ertek = 0;
	      fa->bal_nulla->bal_nulla = fa->bal_nulla->jobb_egy = NULL;
	      fa = gyoker;
	    }
	  else
	    {
	      fa = fa->bal_nulla;
	    }
	}
      else
	{
	  if (fa->jobb_egy == NULL)
	    {
	      fa->jobb_egy = uj_elem ();
	      fa->jobb_egy->ertek = 1;
	      fa->jobb_egy->bal_nulla = fa->jobb_egy->jobb_egy = NULL;
	      fa = gyoker;
	    }
	  else
	    {
	      fa = fa->jobb_egy;
	    }
	}
    }

  printf ("\n");
  kiir (gyoker);
  extern int max_melyseg;
  printf ("melyseg=%d", max_melyseg);
  szabadit (gyoker);
}

static int melyseg = 0;
int max_melyseg = 0;

void
kiir (BINFA_PTR elem)
{
  if (elem != NULL)
    {
      ++melyseg;
      if (melyseg > max_melyseg)
	max_melyseg = melyseg;
      kiir (elem->jobb_egy);
      for (int i = 0; i < melyseg; ++i)
	printf ("---");
      printf ("%c(%d)\n", elem->ertek < 2 ? '0' + elem->ertek : elem->ertek,
	      melyseg);
      kiir (elem->bal_nulla);
      --melyseg;
    }
}

void
szabadit (BINFA_PTR elem)
{
  if (elem != NULL)
    {
      szabadit (elem->jobb_egy);
      szabadit (elem->bal_nulla);
      free (elem);
    }
}

3 kisbajnokság

Annak, aki először megmondja, hogy a esr.fsf.hu/hacker-howto.html lap bitenként nézve milyen mély ilyen "Ziv-Lempel" fát épít fel. Tipp: írj egy dump progit, ami 0-1 karakterekben kiköpi a bináris bemenetét és tedd ezt:

[norbi@sgu C]$ wget http://esr.fsf.hu/hacker-howto.html
[norbi@sgu C]$ cat hacker-howto.html|./d >hacker-howto.html.01
[norbi@sgu C]$ more hacker-howto.html.01
ezt már megeszi a fenti kód, csak ki kell íratnod a mélységet. (Ne feledd: a laborteljesítés feladata olyasmi lesz, hogy binárisan kell majd feldolgoznod a bemenetet, pontos specifikáció majd később.)

A program a 4. laboron kerül terítékre, de már a harmadikon szerepel majd az említett dump:

 

A laborok teljesítésének egyik szükséges feltétele

Idézet az 1. előadásból:

Labor teljesítésének további szükséges feltétele egy saját program
bemutatása a laborközösség előtt, a félév közepén. A feladat kötött:
adok egy karakterekre (0,1 betűkre) működő algoritmust, azt kell
átírni, hogy bináris bemenetre (0, 1 bitekre) működjön (lásd 3 előadás
és labor). A félév végén pedig egy saját robofocis fejlesztés
bemutatása.

Illetve idén már csak a C++ változat lesz védhető, de éppen ezért addig még van néhány előadás.

A karakterekre működő LZW fa építő most szerepelt, de binárisra úgy engedtük rá, hogy azt először az iménti dump progival karakteres 0,1 állománnyá alakítottuk. Most majd olyat kell írnod, ami kapásból binárisat dolgoz fel! Íme a specifikáció:

Állomány: BNbeadando.c (saját monogram, ékezetes betű nincs)
Parancssor:  ./BNbeadando input_fájl_neve -o kimeneti_fájl_neve (ha nem így indítják, kiírja, hogy így kellene használni és leáll)
Kimenet: tartalmazza a 0,1 bináris LZW fát, majd a fa mélységét, végül a fa ághosszainak szórását (utóbbi a negyedik laboron is téma)

(Lesz néhány teszt állomány megadva, ahol előre meg lehet nézni, hogy megfelelően működik-e a kifejlesztett progitok. Aki előre akar dolgozni, itt a poszt, illetve az SVN-ben fent van a d.c, z.c természetesen, a linkelt posztban a fájlnév változott, ezt használd: ftp://ftp.ncbi.nlm.nih.gov/genomes/H_sapiens/CHR_02/hs_alt_HuRef_chr2.fa.gz ennek mélységéért adok 3 trófeát az elsőnek, s ha a hivatkozott poszt szerint a d.c "meghekkelésével" az első sort kidobja, az így kapott mélységért még +2-t.)

Egyéb trófeák:

  • 10/2 Szigorúan titkos
  • 2/6 (+1) Alternatív tabella (+1 minden bajnoki forduló után, ha a wikire is feltöltöd, azért 2 fős, hogy ellenőrizzék egymást, a wikire csak jó számolást töltsünk fel, ellenőrizzük progijainkat a korábban kitett tabellákra)
  • 20/2 fordíts kernelt a Linuxodon (l. 3. ea. megfelelő fóliái)
  • 3/2 készíts olyan kernelmodult, amely kiírja, hány processz van (l. 3. ea. megfelelő fóliái)
  • 3/2 készíts olyan rendszerhívást, amely kiírja, hány processz van (l. 3. ea. megfelelő fóliái)
  • 3/3 készíts olyan kernelmodult, amely kiírja az összes processz néhány általad választott jellemzőjét a PCB-ből (l. 3. ea. megfelelő fóliái)
  • 3/2 készíts olyan kernelmodult, amely kiírja hogy melyik a következő szabad állományleíró (l. 3. ea. megfelelő fóliái)
  • 10/5 írd meg a Linux top parancsát (a PP 89-től alapján, akkor 5 pont, ha legalább ncurses-es)

Kis help a Linux kernel hacking megkezdéséhez itt.

 Többen jelezték, hogy belezavarodtak a hallgatói laborkártyákba, ezért tekintsük át, mit kell ennek kapcsán tudni felmutatni a 03.05 hét laborján:

  • az első 4 fejezetből a 3 kérdés
  • az első 4 fejezetből a binom 3 kérdésének megismerése, megtárgyalása
  • a referencia kézikönyv részből a 3 kérdés
  • a referencia kézikönyv részből a binom 3 kérdésének megismerése, megtárgyalása
  •  s ha már fellapoztuk a könyvet adjunk ki egy aktuális további feladatot: az 5. és 6. fejezetből is kérném a saját három kérdést (ez a "Mutatók és tömbök" és a "Struktúrák" fejezetek)

nem kell papíron, sokkal jobb, ha elektronikus, de be kell tudni mutatni kérésemre!

114 komment

Címkék: tömörítés humán genom linux kernel ziv lempel welch

A bejegyzés trackback címe:

https://progpater.blog.hu/api/trackback/id/tr494287830

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

2012.03.06. 13:59:26

Alternatív tabella - 6 trófea annak, aki ?először? megírja/átírja C-be (és az itteni adatokat produkálja):
www27.zippyshare.com/v/96830791/file.html

+ linkmátrix létrehozó program:
www25.zippyshare.com/v/21698652/file.html

nb · http://fersml.blog.hu 2012.03.06. 14:19:49

@mamenyaka: kipróbálom majd.

a jelen bajnokságra futtattad már?

2012.03.06. 14:52:59

@nb: Most már igen, bár lehet itt-ott elírtam számokat.
Ez jött ki:

Debreceni VSC 0.091006
Budapest Honved 0.087010
Kaposvari Rakoczi 0.086918
Pecsi MFC 0.085118
BFC Siofok 0.068057
Vasas 0.064750
Gyori ETO 0.063945
Paksi FC 0.063693
Kecskemιti TE 0.061117
Diosgyor 0.060506
Videoton 0.057666
Haladas 0.050067
Ferencvaros 0.046451
Ujpest 0.039503
Lombard Papa 0.039252
Zalaegerszegi TE 0.034944

2012.03.06. 15:39:17

Pontosabban, ez: (a wikis oldalon csak egy 18. forduloi meccs volt beirva, igy azt kitoroltem - tehat ez a 17 fordulo utani allas)

Debreceni VSC 0.091495
Kaposvari Rakoczi 0.087138
Pecsi MFC 0.085543
Budapest Honved 0.083838
BFC Siofok 0.068234
Vasas 0.064955
Gyori ETO 0.064049
Paksi FC 0.063558
Kecskemιti TE 0.061276
Diosgyor 0.060917
Videoton 0.058068
Haladas 0.050145
Ferencvaros 0.046585
Ujpest 0.039631
Lombard Papa 0.039267
Zalaegerszegi TE 0.035303

nb · http://fersml.blog.hu 2012.03.06. 16:12:40

@mamenyaka: szerintem most az alternatív tabella wikin a hu.wikipedia.org/wiki/2011%E2%80%932012-es_magyar_labdar%C3%BAg%C3%B3-bajnoks%C3%A1g_%28els%C5%91_oszt%C3%A1ly%29 kereszttáblázatából van generálva a "linkmátrix" a bajnokság őszi teljes fordulója alapján, most az aktuálisat, tehát az elmúlt hétvégével kiegészített kereszttáblázat alapján kéne az aktuális tabella.

2012.03.06. 16:42:50

@nb: 18. fordulo:

Debreceni VSC........ 0.089072
Pecsi MFC............ 0.083616
Kaposvari Rakoczi.... 0.082744
Budapest Honved...... 0.082610
BFC Siofok........... 0.068476
Gyori ETO............ 0.065864
Vasas................ 0.063320
Kecskemιti TE........ 0.063234
Paksi FC............. 0.061140
Videoton............. 0.058661
Haladas.............. 0.057535
Diosgyor............. 0.056805
Ferencvaros.......... 0.042962
Ujpest............... 0.041969
Lombard Papa......... 0.041868
Zalaegerszegi TE..... 0.040127

Toma89 2012.03.06. 20:27:59

Megcsináltam egy videoban a hs_alt_HuRef_chr2.fa fájl dump-olását és mélység megállapítását. A blogon feltüntetett kódot és az svn-n lévő kódot is felhasználtam. A d.c forrádkóban a blogon feltüntetett kód található a d2.c-ben pedig a belinkelt kód található, ami a megadott hs_alt_HuRef_chr2.fa fájlból összesen 10 megabájtot vág ki. Mind a fa.01 és fa2.01 fájlra lefutattam a tördelő algoritmusokat (z.c, masik.c). A "z" nevű programra a megoldás: melyseg=961, a masik nevű programra: melyseg=962. A különbség a mélység kiiratásában van. A z.c-ben (svn kód): printf("melyseg=%d\n", max_melyseg-1); a masik.c-ben printf("melyseg=%d", max_melyseg); található, ezért volt elértő megoldás a esr.fsf.hu/hacker-howto.html honlap feldolgozásánál is.
Második körben a d2 nevű programmal a fa2.01 mérete 80MB lett és a mélység a "z" nevű programnál: 331 a "masik" nevű programnál pedig: 332 lett.

Itt az említett video: www.youtube.com/watch?v=p5OLnZuCEY4

A videoban egy pillanatra felvillan a blog képe, ez csupán a véletlen műve, elnézést érte! :) Köszönöm!

nb · http://fersml.blog.hu 2012.03.06. 20:38:41

@Toma89: semmi gond, az AT csak tovább nemesíti a filmedet :)

Toma89 2012.03.07. 01:00:34

10/5 írd meg a Linux top parancsát:

www.youtube.com/watch?v=2xLDP_jIUx0

A páternoszteres változathoz képest annyit változtattam a programon, hogy a kimeneten külön sorba írattam az adatokat.
A program futása a "q" gomb megnyomásával áll le, egyébként végtelen ciklusnak köszönhetően folyamatosan fut a program.

Ha valaki esetleg elakadna, mert hibát jelez a rendszer, hogy nincs fent a curses.h vagy ncurses.h állományok egyike sem, annak előbb érdemes lefuttatnia a következő parancsot:

sudo apt-get install libncurses5

Hypno (törölt) 2012.03.07. 08:39:59

Mi a különbség az if-ek fejében a két kifejezés között (ha van)
if(b & 0x80 == 0) …
if((b & 0x80) == 0)

Van különbség a precedencia sorrend miatt.
Az elsőnél megvizsgálja hogy a 0x80 egyenlő-e nullával aztán végrehajtja a bitenkénti és-t.
A másodiknál először hajtja végre a bitenkénti és-t aztán vizsgálja meg hogy ez egyenlő-e nullával.

jakaba 2012.03.07. 10:32:05

MIt ír ki (76. dia)?
Válasz:
GY: 1 1 1 1
SZ: 0 0 0 0
GY: 1 1 1 1
SZ: 0 0 0 0

Laci27 · http://descargapeliculas.net/.dev12/scripts/nirvana-logo-i5.jpg 2012.03.07. 11:09:32

Precedencia sorrend:
-> : struktúra tagra hivatkozik
<< : eltolása balra
>= : nagyobb/egyenlő
+= : változó növelése (tömörebb)
-= : változó csökkentése (tömörebb)
. : struktúra tagra való hivatkozás
& : bitenkénti 'és'
* : szorzás
&& : logikai 'és'
*= : változó szorzása (tömörebb)

*bohóc* 2012.03.07. 11:13:21

Mit ír ki? (melyik alábbi 4 sort?)

GY: 1 1 1 1
SZ: 0 0 0 0
GY: 1 1 1 1
SZ: 0 0 0 0

Képet még nem engedte feltölteni, de próbálkozom :)

Peterzon92 2012.03.07. 11:19:27

Én is beküldtem csak még a másik posztra írtam:
GY: 1 1 1 1
Sz:0 0 0 0
GY: 1 1 1 1
SZ:0 0 0 0
kepfeltoltes.hu/view/120307/326814394N_vtelen_www.kepfeltoltes.hu_.png

Badnewz 2012.03.07. 12:59:23

Órán bemutattam az előre megadott html fájl 32es mélységét

Vörös Főnix 2012.03.07. 13:00:06

1 pont a hackermélység

Hypno (törölt) 2012.03.07. 13:09:40

mélység 32-ért 1 pont laboron

KDániel 2012.03.07. 13:22:44

0.5 pont: Megmutatni, hogy if-else szerkezetnél csak 1 lehet igaz:

kepfeltoltes.hu/120307/pontos_www.kepfeltoltes.hu_.png

D3am0n 2012.03.07. 13:23:05

+1 mélység laboron hacker
+1 kill firefox

nimuss 2012.03.07. 13:23:18

-otthon megírt, laboron bemutatott: hacker-howto.html mélységének kiírása (1p)
-társ böngészőjének lelövése (1p)

jakaba 2012.03.07. 13:35:09

gyakorlat:
-hacker howto kész volt már korábban (+1)
-forrás celebrálás (+2)

D3am0n 2012.03.07. 13:37:56

37

d.c:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>

int
main (void)
{
int i, egy_e, x = 0, y = 0;
unsigned char b;

while (read (0, (void *) &b, sizeof (unsigned char)))
{
if (b == '\n')
++y;
else if (y > 0)
{

++x;
for (i = 0; i < 8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf ("1");
else
printf ("0");
b <<= 1;
}
if (x == 10000)
break;
}
}

}

Vörös Főnix 2012.03.07. 13:38:16

melyseg: 36

d.c:

#include <stdio.h>
#include <unistd.h>

int
main (void)
{
int i, egy_e;
int szmltiz = 0;
int eleje = 0;
unsigned char b;
while (read (0, (void *) &b, sizeof (unsigned char)) && szmltiz <= 10150)
{

if (eleje > 150)
{

++szmltiz;
for (i = 0; i < 8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf ("1");
else
printf ("0");
b <<= 1;
}
}

else
++eleje;
}
}

Toma89 2012.03.07. 13:39:36

#include <stdio.h>
#include <unistd.h>
int
main (void)
{
int i, egy_e, c = 100 * 100, ci = 0;
unsigned char b;
int sz = 0;
while (read (0, (void *) &b, sizeof (unsigned char)))
{
if (b == '\n')
++sz;
if (sz >= 1)
{
for (i = 0; i < 8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf ("1");
else
printf ("0");
b <<= 1;
}
if (++ci == c)
break;
}
}
}

melyseg = 36

KDániel 2012.03.07. 13:45:54

1 pont: Megváltoztatni a printf-et, hogy kék háttérrel és piros betűvel írjon

kepfeltoltes.hu/120307/pontos2_www.kepfeltoltes.hu_.png

mamenyaka (törölt) 2012.03.07. 14:36:29

main ()
{
..int i, egy_e;
..unsigned char b;
..int szamlalo = 0;

..while (szamlalo < 10000 && read (0, (void *) &b, sizeof (unsigned char)))
....{
......if (b != '\n' && (b == 'T' || b == 'A' || b == 'C' || b == 'G'))
.........{
...........for (i = 0; i < 8; i++)
.............{
...............egy_e = b & 0x80;
...............if ((egy_e >> 7) == 1)
..................printf ("1");
...............else
..................printf ("0");
...............b <<= 1;
.............}
...........szamlalo++;
.........}
....}
}

melyseg = 36

mamenyaka (törölt) 2012.03.07. 15:00:37

Változtatok álláspontomon!
melyseg = 37

uj d.c:

main ()
{
..int i, egy_e;
..unsigned char b;
..int szamlalo = 0;
..int kapcsolo = 0;

..while (szamlalo < 10000 && read (0, (void *) &b, sizeof (unsigned char)))
....{
......if (!kapcsolo && b != '\n')
........kapcsolo = 0;
......if (!kapcsolo && b == '\n')
........kapcsolo = 1;

......if (kapcsolo && b != '\n')
........{
..........for (i = 0; i < 8; i++)
............{
.............//valtozatlan
............}
..........szamlalo++;
........}
....}
}

nb · http://fersml.blog.hu 2012.03.07. 15:07:57

Magam is belépek a licitálók közé:

/*
d2.c

[norbert@matrica 4]$ gcc d2.c -o d2
[norbert@matrica 4]$ ./d2 <hs_alt_HuRef_chr2.fa >hs_alt_HuRef_chr2.fa.d201.txt
[norbert@matrica 4]$ ls -l hs_alt_HuRef_chr2.fa.d201.txt
-rw-rw-r--. 1 norbert norbert 80000 Mar 7 15:04 hs_alt_HuRef_chr2.fa.d201.txt

... magam az SVN-es z.c-vel dolgozok:
[norbert@matrica 4]$ ./z <hs_alt_HuRef_chr2.fa.d201.txt
melyseg=35
altag=24.404326
szoras=4.051491
*/

#include <stdio.h>
#include <unistd.h>

void
karakteres_dump (unsigned char b)
{
int i, egy_e;

for (i = 0; i < 8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf ("1");
else
printf ("0");
b <<= 1;
}
}

int
main (void)
{
unsigned char b;
int szamlalo = 0;

while (read (0, (void *) &b, sizeof (unsigned char)))
{
switch (b)
{
case 'T':
case 'C':
case 'A':
case 'G':

if (szamlalo < 10000)
karakteres_dump (b);
else
return 0;

++szamlalo;

break;
}
}
}

mamenyaka (törölt) 2012.03.07. 15:28:23

@nb: Ugye ezt a sort kell kihagyni?
>gi|157696319|ref|NW_001838758.1| Homo sapiens chromosome 2 genomic contig, alternate assembly HuRef SCAF_1103279188242, whole genome shotgun sequence

Ebben van C is és A is, tehát ezeket is "beolvassa" a b2.c ?

nb · http://fersml.blog.hu 2012.03.07. 15:37:06

@mamenyaka: így van tökéletes észrevétel :) hagyni kell feladatot nekem a holnapi két laborra is.

jakaba 2012.03.07. 15:41:42

hogyan lehetséges az alábbi:
a programom használnál <ncurses.h>-t.
az ncurses telepítve van, még a libncurses5-dev is, és amikor fordítanám a programot -lcursessal, vagy -lncursessal, a következő üzenetet kapom:
/usr/bin/ld: cannot find -lncurses.h

jakaba 2012.03.07. 16:41:51

Megoldottam, a probléma bonyolult megoldása egy újraindítás volt. :)
10/5 írd meg a Linux top parancsát:
www.youtube.com/watch?v=qnr2JgL_KOQ&feature=youtu.be

Chelsea_FC (törölt) 2012.03.07. 17:20:23

laboron:
-otthon megírt 32-es mélység (+1)
-böngésző lelövése (+1)
Dobi Attila

Vörös Főnix 2012.03.07. 17:31:54

Bocsi az OFF-ért, de szerintem ez komoly:

plastik.hu/2012/03/06/jatekfejlesztes-2012-modra/

Tanárúrnak mi a vélemény, van esetleg néha helye itt ilyen videóknak?

nb · http://fersml.blog.hu 2012.03.07. 17:43:05

@Vörös Főnix: jöhet bármi, ami nem, azt majd kimoderálom :)

Schrödinger Macskája 2012.03.07. 23:49:37

mialatt készülök a holnapra, addig is egy kis filmajánló, benne lehetne akár a kötelezőkben, igaz, hogy 6.4-es rating-je van, de szerintem többet is ér.

www.imdb.com/title/tt0244244/

KDániel 2012.03.08. 09:31:28

Human genom 10000 szavának mélységét néző progi:
#include <stdio.h>
#include <unistd.h>

void
karakteres_dump (unsigned char b)
{
int i, egy_e;

for (i = 0; i < 8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf ("1");
else
printf ("0");
b <<= 1;
}
}

int
main (void)
{
unsigned char b;
int szamlalo = 0, asd = 0,asd2=0;

while (read (0, (void *) &b, sizeof (unsigned char)))
{ asd2++;
if(b=='\n') asd++;
if (asd >=1)
{
switch (b)
{
case 'T':
case 'C':
case 'A':
case 'G':

if (szamlalo < 10000)
karakteres_dump (b);
else
return 0;

++szamlalo;

break;
}
}
if(asd2==10000) break;
}
}

KDániel 2012.03.08. 09:32:47

Hacker how-to otthoni megcsinálásáért laboron kaptam +1 pontot.

cccp.flashlight 2012.03.08. 09:34:11

hacker howto-ra Laboron való megcsinálásáért +1 pont

szelepsapka 2012.03.08. 09:34:59

hacker howto laboron megcsinálva +1 pont.

KDániel 2012.03.08. 09:35:06

a mélység Human gneomnál 32 lett, ez lemaradt

Peterzon92 2012.03.08. 09:38:40

#include <stdio.h>
#include <unistd.h>

int
main (void)
{
int i, egy_e;
unsigned char b;

while (read (0, (void *) &b, sizeof (unsigned char)))
{
for (i=0; i<8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf("1");
else
printf ("0");
b<<=1;
}
}
}

mélység=32

*bohóc* 2012.03.08. 09:39:29

#include <stdio.h>
#include <unistd.h>

int
main (void)
{
int i, egy_e,d;
unsigned char b;

while (read(0,(void *) &b, sizeof (unsigned char)))
{
for (i=0; i<8; ++i)
{
egy_e=b& 0x80;
if ((egy_e >> 7)==1)
printf ("1");
else
printf ("0");
b <<=1;
}
}
}

melyseg=32 :) laboron.

Peterzon92 2012.03.08. 09:39:38

az enyém laboron volt!

devilirium 2012.03.08. 09:40:17

Labor:
Hacker +1 pont 32-es melyseg
Genom kod:
ideone.com/ZYb3p
piszkos, de gyors.
A melysege pedig 37 ezek szerint.

*bohóc* 2012.03.08. 09:40:18

+1.5 pont d.c magyarázat
+2 pont binfa magyarázat
laboron

Kassen 2012.03.08. 09:42:05

#include <stdio.h>
#include <unistd.h>

int
main (void)
{
int i, egy_e, max=10000;
unsigned char b;

while (read (0, (void *) &b, sizeof (unsigned char)) && max > 0)
{
if(b == 'C' || b == 'A' || b == 'G' || b == 'T')
{--max;
for (i = 0; i < 8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf ("1");
else
printf ("0");
b <<= 1;
}
}
}
}

mélység = 35

Kassen 2012.03.08. 13:18:27

Nekem is lemaradt... ez itt kettővel feljebb laboros humán genom feladat

KDániel 2012.03.08. 14:22:14

Human genom 10000 szavának mélységét néző progi:
#include <stdio.h>
#include <unistd.h>

void
karakteres_dump (unsigned char b)
{
int i, egy_e;

for (i = 0; i < 8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf ("1");
else
printf ("0");
b <<= 1;
}
}

int
main (void)
{
unsigned char b;
int szamlalo = 0, asd = 0,asd2=0;

while (read (0, (void *) &b, sizeof (unsigned char)))
{
if(b=='\n') asd++;
if (asd >=1)
{asd2++;
switch (b)
{
case 'T':
case 'C':
case 'A':
case 'G':

if (szamlalo < 10000)
karakteres_dump (b);
else
return 0;

++szamlalo;

break;
}
}
if(asd2==10000) break;
}
}

Ennyiben módosítanám gyorsban a laboron beküldött programomat.

zacsesz 2012.03.08. 17:34:25

Labormunka

módosított d.c:

#include <stdio.h>
#include <unistd.h>

int
main (void)
{
int i, egy_e, count = 0;
short esv=0;
unsigned char b;

while (read (0, (void *) &b, sizeof (unsigned char)))
{
if(esv==1 && b != '\n')
{
if(count >= 10000) break;

for (i = 0; i < 8; ++i)
{
egy_e = b & 0x80;
if ((egy_e >> 7) == 1)
printf ("1");
else
printf ("0");
b <<= 1;
count++;
}
}
else
{
if(b=='\n')
esv=1;
}
}
}

humán genom mélysége így: 32

thevr 2012.03.08. 17:35:16

hacker-howto otthoni megoldásáért +1 pont

sonzi 2012.03.08. 17:37:44

+1 pont hacker-howto otthoni megoldás

katonagy 2012.03.08. 18:55:53

+1 pont a hacker-howto labor megoldásért

lacy122 2012.03.08. 19:55:02

+1 pont hacker-howto otthoni megoldásáért.
+2 pont d.c program celebrálása laboron.

KDániel 2012.03.08. 20:38:42

Huh most hirtelen nem tudom, hogy a humán genomnál 10000 sort, vagy 10000 bájtot kellett nézni? Mindegy, mindkét megoldást beküldtem. Az első, amit küldtem az a sort nézi, a második meg a bájtokat.

bensz92 2012.03.08. 20:54:29

+1 pont hacker-howto otthoni megoldásért
+3 pont binfa magyarázás

jakaba 2012.03.08. 20:57:02

10/1 Változó argumentumszámú fgv-ek (előadáson elhangzott saját printf extra változat)
ideone.com/k3VCS

almatkortet 2012.03.08. 21:59:21

+1 pont hacker-howto otthoni megoldásért

Rosti21 2012.03.09. 18:31:55

a html fálj mélységét a laboron kiírattam: 1 pont.

bensz92 2012.03.10. 16:17:34

printf szinezés (nem tudom ér-e még pontot de biztos ami tuti)

kepfeltoltes.hu/120310/printf_www.kepfeltoltes.hu_.png

Rosti21 2012.03.10. 18:58:12

Sziasztok
Lenne egy problémám: Kernel fordításnál azt írja a PP hogy /usr/src/kernels/2.6.11-1.1369_FC4-x86_64/.config . fájlt kell áthúzni. Na hát mi ezt a bizonyos config fájlt nem találjuk.

jazmine 2012.03.10. 19:48:26

@Rosti21: hát az nem tegnap volt, amikor ezt írtam :)

Ha maga a könyvtár nincs meg, akkor talán a kernel források nincsenek csomagból, de az nem is kell, úgyis a kernel.org-ról rántottuk le. A /boot-ban ha szétnézel. ott is lehet esetleg, itt lehet olyan neve, hogy "config-mindenféle kiadás és verzió számok"

esetleg a /proc-ban is lehet config elejű a futó kernel kapcsán.

Kassen 2012.03.11. 12:09:12

Tényleg! A laboros humán-genom feladatra van már megerősített eredménye valakinek?

nb · http://fersml.blog.hu 2012.03.12. 11:49:26

@Hypno: igen, s nyilván az utóbbi volt a programozó szándéka, tehát először a bitenkénti, aztán az összehasonlítás, hogy valóban így is történjék, ezért kell a zárójelezés.

nb · http://fersml.blog.hu 2012.03.12. 11:55:02

@Laci27: OK., de így leírva kicsit becsapós, mert nyilván a . és a -> egy szinten van, de itt Te most két külön 5-5 darabot tettél sorba, azaz természetesen így kell érteni a listádat.

nb · http://fersml.blog.hu 2012.03.12. 11:58:38

@almatkortet: a saját "printf becsomagolása" végén az escape szekvenciákkal a videó módot visszaállítottad?

nb · http://fersml.blog.hu 2012.03.12. 12:19:37

@D3am0n:

36-ot fogadok el az SVN-es kóddal, mert az max_melyseg-1-et nyom ki és 37-et a blogossal, mert az 37-et.

A kódodban azért lehet gond a d.c-ben, mert sok \n lesz a genomban, amire mindig növel, előbb-utóbb túlcsordul, s negatív is lehet stb. problemák

nb · http://fersml.blog.hu 2012.03.12. 12:26:35

@KDániel: beszédesebb példa, ha ilyenek a feltételek:

if(5<3)...
else if(5<4)...
else if(5<5)...
else if(5<6)...
else if(5<7)...
else if(5<8)...
else....

nb · http://fersml.blog.hu 2012.03.12. 12:45:20

@Vörös Főnix: nem szerencsés ilyen mágikus számokat használni, mint a 10150, az első \n-ig kellett volna szűrni, de nem az első sor "leszámolásával"

nb · http://fersml.blog.hu 2012.03.12. 12:46:34

@Toma89: lásd korábbi túlcsordulásos megjegyzés.

nb · http://fersml.blog.hu 2012.03.12. 12:52:30

@*bohóc*: hol van itt figyelmen kívül hagyva a genom első komment sora?

nb · http://fersml.blog.hu 2012.03.12. 12:54:32

@devilirium: egyéni a megoldás, az első sor átlépését magam is így csinálnám, a karakteres dump inkább csak kreatív :)

almatkortet 2012.03.12. 14:34:44

@nb: Előadáson volt, hogy a blogon a kódban lévő binfa méretéért fél pont jár az elsőnek.

typedef struct binfa
{
int ertek;
struct binfa *bal_nulla;
struct binfa *jobb_egy;

} BINFA, *BINFA_PTR;

Ebből a BINFA mérete 12 bit

almatkortet 2012.03.12. 14:55:20

@nb: igen, visszaállítottam.

nb · http://fersml.blog.hu 2012.03.12. 14:56:21

@almatkortet: 12 bitbe már 2 bájt sem fér bele :)

almatkortet 2012.03.12. 15:03:53

@nb: Bocsánat, 12 bájtos... nem mind1 :$

KDániel 2012.03.12. 17:10:46

Látom frissítve lettek a pontok, de a kernel fordításos trófea már nem él? Mert arra ahogy látom nem kaptam pontot.
Szerintem jó lenne vezetni, hogy melyik trófeákat halászták már el.

bensz92 2012.03.12. 17:17:35

Kernelt fordítottam +2

kepfeltoltes.hu/120312/kernel1_www.kepfeltoltes.hu_.png

kepfeltoltes.hu/120312/1200449905kernel2_www.kepfeltoltes.hu_.png

kepfeltoltes.hu/120312/kernel3_www.kepfeltoltes.hu_.png

Én nekem pedig még laboron szerzett 3 pontom nem lett beírva.Mert nekem még a pont frissítés előtt 3 pontom volt, de a laboron 4et szereztem és most 4 pont van beírva 7 helyett.

nb · http://fersml.blog.hu 2012.03.12. 19:02:45

@almatkortet: meggyőzőbb :) a progidat, amivel megnézted is vágd be ide, pls.

nb · http://fersml.blog.hu 2012.03.12. 19:06:59

@KDániel: éppen ez a kommentek lényege, ezért kérek mindent így, hogy eleve rá legyünk szorítva a kommentek olvasására. Együtt kell élni a játékkal visszaolvasni és akkor egyértelmű, hogy mennyi jött be és még az én időmet sem emészti fel teljesen a nyilvántartás.

A pontszámos problémák pedig természetesen adódnak az "elosztott" nyilvántartásból. Ahol az a szinkronizáció, hogy ha a hallgató saját

"mikor mire mennyit" listája végösszesenje nem egyezik a blogossal, akkor kérem magánban a hallgató saját listáját (még melegében, hogy érdemben olvashassam a listát, azaz emlékezzek rá)

KDániel 2012.03.12. 19:57:34

@nb: Jól vannak vezetve a pontjaim, csak a kernelfordításomra nem kaptam pontot. A kérdésem is csak erre irányult, hogy az már nem élt, mikor beküldtem és ezért maradt le a +2 pont?

almatkortet 2012.03.12. 21:45:10

@nb: #include <stdio.h>

typedef struct binfa
{
int ertek;
struct binfa *bal_nulla;
struct binfa *jobb_egy;

} BINFA, *BINFA_PTR;

int
main (void)
{
printf("\nbinfamerete: %d\n\n",sizeof(BINFA));
return 0;
}

nimuss 2012.03.14. 13:45:19

hallgato@deik-admin-desktop:~/hg_prog$ ./genom <NC_003280.fna
Stop: 267838
Phe: 463183
Leu: 494987
Ile: 365167
Met: 78173
Val: 243485
Ser: 447363
Pro: 194184
Thr: 243451
Ala: 175955
Tyr: 151660
His: 131102
Gln: 183783
Asn: 281030
Lys: 415900
Asp: 123341
Glu: 201059
Cys: 140234
Trp: 68346
Arg: 304556
Gly: 191070

#include <stdio.h>
#include <unistd.h>

// Egyszerűen felsorolom, pl. az alábbi alapján:
// en.wikipedia.org/wiki/DNA_codon_table
char *amino_sav[] = {
"Stop",
"Phe",
"Leu",
"Ile",
"Met",
"Val",
"Ser", // 6.
"Pro",
"Thr",
"Ala",
"Tyr", // 10.
"His",
"Gln",
"Asn",
"Lys",
"Asp",
"Glu",
"Cys",
"Trp", // 18.
"Arg", // 19.
"Gly" // 20.
};

// a 3 betű melyik aminosavat kódolja?
char *
genetikai_kod (int triplet)
{
int index = 0;

switch (triplet)
{
case 0: // Phe
case 1:
index = 1;
break;
case 2: // Leu
case 3:
case 16:
case 17:
case 18:
case 19:
index = 2;
break;
case 32: // Ile
case 33:
case 34:
index = 3;
break;
case 35: // Met
index = 4;
break;
// hogy jön ez? az 5 indexű a "Val"
// GTT-től GTG-ig van ez, jegyekben:
// 300-tól 303-ig 4-es számrendszerben
// ez van átváltva, pl.:
// 303(4) -> 3*16+0*4+3*1 = 51(10)
case 48:
case 49:
case 50:
case 51:
index = 5;
break;
case 4:
case 5:
case 6:
case 7:
index = 6;
break;
case 20:
case 21:
case 22:
case 23:
index = 7;
break;
case 36:
case 37:
case 38:
case 39:
index = 8;
break;
case 52:
case 53:
case 54:
case 55:
index = 9;
break;
case 8:
case 9:
index = 10;
break;
case 10: // Stop
case 11:
index = 0;
break;
case 24:
case 25:
index = 11;
break;
case 26:
case 27:
index = 12;
break;
case 40:
case 41:
index = 13;
break;
case 42:
case 43:
index = 14;
break;
case 56:
case 57:
index = 15;
break;
case 58:
case 59:
index = 16;
break;
case 12: // Cys
case 13:
index = 17;
break;
case 14: // Stop
index = 0;
break;
case 15: // Trp
index = 18;
break;
case 28: // Arg
case 29:
case 30:
case 31:
index = 19;
break;
case 44: // Ser
case 45:
index = 6;
break;
case 46: // Arg
case 47:
index = 19;
break;
case 60: // Gly
case 61:
case 62:
case 63:
index = 20;
break;

default:
// csak tesztelesre a printf
printf ("Zavar az eroben %d-nel", triplet);
index = 0;
break;
}

return amino_sav[index];
}

// a betűket 3-asával "olvasom": nem kell cifrázni! egy ciklus
// elvégzi, amiben megjegyzem, hogy melyik hányadik betű volt
// aki ciklusban ciklusolgat, az már bénázik :)
int
main (void)
{
int x, mennyi[21], y = 0;

for (x = 0; x < 21; x++)
{
mennyi[x] = 0;
}

// hányadik betűn állok?
int hanyadik_betu = -1;
// azon a helyen mit olvastam?
int elso = 0, masodik = 0, harmadik = 0, i = 0, jegy = 0;

while ((i = getchar ()) != EOF)
{
if (y == 0)
{
if (i == '\n')
{
y = 1;
}
}
else
{

switch (i)
{

case 'T':
jegy = 0;
break;
case 'C':
jegy = 1;
break;
case 'A':
jegy = 2;
break;
case 'G':
jegy = 3;
break;
}

hanyadik_betu = (hanyadik_betu + 1) % 3;

if (!hanyadik_betu)
elso = jegy;
else if (!(hanyadik_betu - 1))
masodik = jegy;
else
{
harmadik = jegy;
//printf ("%s\n", genetikai_kod (elso * 16 + masodik * 4 + harmadik));
for (x = 0; x < 21; x++)
{
if (genetikai_kod (elso * 16 + masodik * 4 + harmadik) ==
amino_sav[x])
mennyi[x]++;
}
}
}
}
for (x = 0; x < 21; x++)
{
printf ("%s: %d\n", amino_sav[x], mennyi[x]);
}
}
süti beállítások módosítása