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

2011.02.19. 12:00 nb

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, a harmadik labor billenytűzős feladata lesz, de 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:

 Előrehivatkozok itt most a Labormérés otthon, avagy hogyan dolgozok fel egy pédát c. posztra, aminek Móricka rajza segít a "mélység" értelmezésében.

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..

S ugye annyit nehezítettünk, hogy idén már a C++ változatot kell védeni (de éppen e miatt ettől még elválaszt minket pár 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 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 dolgozna: z.c, illetve a humán genom 2. kromoszómája mindig kéznél van: hs_...chr2.fa.gz a posztban használt fájlnév változott, dolgozz majd ezzel: ftp://ftp.ncbi.nlm.nih.gov/genomes/H_sapiens/CHR_02/hs_alt_HuRef_chr2.fa.gz aki kiszámolja itt elsőként az LZW fa mélységét, annak 3 trófea, ha a d.c-t módosítja, hogy az az első "sort" kidobja, további 1, s az így kapott mélységre további 1.)

 

16 komment

Címkék: tömörítés gif rekurzió zip welch struct lzw ziv lempel önhivatkozó struktúrák

Felvételt hirdet a CIA

2011.02.15. 09:51 nb

"...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."

(Kernighan Brian W. és Plauger P. J. A programozás magasiskolája. Műszaki. 1982., a példa Java implementációja itt van: www.tankonyvtar.hu/informatika/javat-tanitok-1-1-1-080904-1)

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ét
Dekó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. 18. 20 ó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 :)

1 kisbajnokság

Remek: gyorsan elvitték a hármat (lásd kommentek), jön itt további help, aki ennek alapján elsőre megtöri a következőt, annak is akad itt még egy kisbajnokság (természetesen, aki a hármasat törte, ezt már ne törje.)

Tekerj a tovább linkre a helpért:

8 komment

Címkék: cia nsa kódtörés exor tiszta szöveg

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