2018. szeptember 3., hétfő

Kereső algoritmusok keresés tömbben

Lineáris keresés
Logaritmusos keresés

Kereső algoritmusok
Keresést rendezetlen és rendezett tömbökön egyaránt végezhetünk. Rendezetlen tömb esetén a keresés nehézkesebb, lassúbb, de az egyéb tömbkezelő műveletek (pl. új elem beszúrása) egyszerűbbek. Rendezett tömb esetén gyorsabb a keresés, viszont a kapcsolódó tömbműveletek bonyolultabbak, hiszen pl. egy új elem beszúrása után is meg kell tartani a tömb rendezettségét.
Lineáris keresés
A legegyszerűbb keresési algoritmus, amely rendezetlen tömbön dolgozik. A tömb első elemétől kezdve összehasonlítjuk a tömbelemeket a keresendő elemmel. A keresési ciklus akkor ér véget, ha valamelyik tömbelem megegyezik a keresettel, vagy, ha a tömb végére érünk. Az utóbbi esetben a keresett elem nincs a tömbben. Az algoritmus onnan kapta nevét, hogy a keresések száma, és így a futási idő, lineáris függvénye a tömb elemszámának.
Megjegyzés: A n jelöli a számsorozat elemeinek számát, az a[1..n] tömb tárolja a számsorozat elemeit, x a keresett érték. Eredményként a keresett elem tömbbeli indexét írassuk ki, amennyiben az elem megtalálható.
i := 1;
while (i ≤ n) AND (a[i] ≠ x) do
     i := i + 1;
endwhile
if i ≤ n then write i
else write "A keresett szám nem található meg a számsorozatban."
endif.
Logaritmikus (bináris) keresés
A logaritmikus vagy bináris keresési algoritmus rendezett tömbön működik, így az előző módszernél lényegesen gyorsabb keresést tesz lehetővé. A keresendő elemet először a tömb középső eleméhez hasonlítjuk. Ha a két elem egyezik, megtaláltuk a tömbelemet, ha nem, a keresést abban a tömbfélben folytatjuk, amelyet a középső és a keresett elem viszonya kijelöl. Ha a tömb növekvő sorrendbe rendezett és a keresendő elem nagyobb, mint a középső elem, akkor a második tömbrészben, egyébként pedig az elsőben folytatjuk a keresést. A keresést akkor fejezzük be, ha megtaláltuk a keresett tömbelemet, vagy a tömbrész elfogyott. Az összehasonlítások száma, s így a futási idő, az elemszám kettesalapú logaritmusával arányos, ami nagy elemszámok esetén lényegesen kisebb lehet, mint a lineáris keresés esetén.
Megjegyzés: A n jelöli a számsorozat elemeinek számát, az a[1..n] tömb tárolja a számsorozat elemeit, x a keresett érték. Eredményként a keresett elem tömbbeli indexét írassuk ki, amennyiben az elem megtalálható.
eleje := 1;
vége := n;
repeat
   közepe := (eleje + vége) / 2;
   if x < a[közepe] then vége := közepe – 1
      else if x > a[közepe] then eleje := közepe + 1
           endif
   endif
until (x = a[közepe]) OR (eleje > vége);
if x = a[közepe] then write közepe
else write "A keresett szám nem található meg a számsorozatban."
endif.
Rendező algoritmusok
Beszúrás
Van egy n elemű rendezett tömbünk. Be akarunk szúrni egy n+1-edik elemet a rendezettség megtartásával. Egyik lehetőség, hogy végigszaladunk a halmazon, és betesszük a beszúrandó elemet az elé az elem elé, ami már nem előzi meg. Átlagosan (n+1)/2, de a legrosszabb esetben n összehasonlításra van szükség. Másik lehetőség, hogy a kérdéses elemet a középső elemmel hasonlítjuk össze. Ha az új elem megelőzi a középsőt, akkor a továbbiakban a halmaz első felében keressük a helyét, stb. A lépésszám log2n, vagy az erre következő első egész szám, azaz [log2n]+1, ha n nem 2 hatványa.
Megjegyzés: A n jelöli a számsorozat elemeinek számát, az a[1..n] tömb tárolja a számsorozat elemeit, x a beszúrandó érték. A kereséséhez a logaritmikus algoritmust használjuk.
eleje := 1;
vége := n;
repeat
   közepe := (eleje + vége) / 2;
   if x < a[közepe] then vége := közepe – 1
      else if x > a[közepe] then eleje := közepe + 1
           endif
   endif
until (x = a[közepe]) OR (eleje > vége);
if x ≤ a[közepe] then helye := közepe;
else helye := közepe + 1;
endif
for i := n downto helye do
   a[i+1] := a[i];
endfor
a[helye] := x.
Beszúrásos rendezés
A rendezés során sorrendbeli hibát keresünk egy tömbben. Ennek során használhatunk lineáris, illetve bináris keresést. A kialakult sorrendtől eltérő helyen levő elemet kiemeljük, majd megkeressük a sorrendnek megfelelő helyét. Amikor a helyét megtaláltuk, akkor a közbeeső elemeket eltoljuk, majd az imént kiemelt elemet a felszabaduló helyre beszúrjuk. Ez a rendezés túl sok mozgatást igényel.
Megjegyzés: A n jelöli a számsorozat hosszát, az a[1..n] tömb tárolja a számsorozat elemeit.
for i := 2 to n do
   x := a[i];
   eleje := 1; 
   vége := i - 1;
   repeat
      közepe := (eleje + vége) / 2;
      if x < a[közepe] then vége := közepe – 1
         else if x > a[közepe] then eleje := közepe + 1
              endif
      endif
   until (x = a[közepe]) OR (eleje > vége);
   if x ≤ a[közepe] then helye := közepe;
   else helye := közepe + 1;
   endif
   for j := i-1, helye downto
      a[j+1] := a[j];
   endfor
   a[helye] := x;
endfor.
Shell rendezés
A beszúrásos módszer lépésenként finomított változata. A tömbnek csak minden d-edik elemét vizsgáljuk, azaz d lépésközzel végezzük el a beszúrásos rendezést. Ha a rendezettség nem alakul ki, akkor csökkentjük a lépésközt, és úgy végezzük el a rendezést. A folyamat addig tart, amíg a rendezettség ki nem alakul, vagy a lépésköz 1 nem lesz.
Megjegyzés: A n jelöli a számsorozat hosszát, az a[1..n] tömb tárolja a számsorozat elemeit. A belső whileciklus lineáris beszúrást alkalmaz.
d := n / 2;
while d ≥ 1 do
   for j := d + 1 to n do
      i := j – d;
      while (i ≥ 1) AND (a[i+d] < a[i]) do
         c := a[i];
         a[i] := a[i+d];
         a[i+d] := c;
         i := i – d;
      endwhile
   endfor
   d := d / 2;
endwhile.
Rendezés közvetlen kiválasztással és cserével (minimum [maximum] elven alapuló rendezés)
Egy adott résztömbben (kezdetben a teljes tömb) megkeressük a legkisebb (legnagyobb) elemet, és ezt tesszük az első helyre. A következő lépésben a második elemtől kezdve vizsgáljuk és ismét a legkisebb (legnagyobb) elemet visszük előre, és így tovább. A mindenkori legkisebb elem keresése lineáris kereséssel történik.
Megjegyzés: A n jelöli a számsorozat hosszát, az a[1..n] tömb tárolja a számsorozat elemeit.
for i := 1 to n-1 do
   min_index := i;
   for j := i+1 to n do
      if a[j] < a[min_index] then
         min_index := j;
      endif
   endfor
   c := a[i];
   a[i] := a[min_index];
   a[min_index] := c;
endfor
Buborékrendezés
Az egyik leggyakrabban használt rendező algoritmus. A rendezés a tömb elejéről és végéről is indulhat. Az a[1..n] tömböt legrosszabb esetben (n-1)-szer kell bejárni. A tömb elejéről induló esetben az első bejárásban összehasonlítjuk az a[1]-t az a[2]-vel, majd az a[2]-t az a[3]-mal, …, végül az a[n-1]-et az a[n]-nel. Általánosan az a[j]-t hasinlítjuk az a[j+1]-gyel, ahol j = 1, 2 … , n-1. Valahányszor úgy találjuk, hogy a[j] > a[j+1], felcseréljük őket. A tömb elejéről induló rendezésnél a legnagyobb elem biztosan a helyére fog kerülni. A többi elem azonban még nem feltétlenül került a végleges helyére. (A tömb végéről induló rendezésnél mindig a legkisebb elem kerül biztosan az adott rendezési ciklusban a helyére.) A következő bejárásokban hasonlóképpen járunk el, és további elemek kerülnek a helyükre, ahhoz hasonlóan, ahogy a levegőbuborékok szoktak feljönni a víz felszínére. A rendezést folytatni kell mindaddig, míg a teljes tömb rendezett nem lesz. Előfordulhat, hogy a tömb már menet közben, a rendezési ciklus vége előtt, rendezetté válik, esetleg eleve rendezett volt. Ezt onnan vehetjük észre, hogy az adott rendezési ciklusban nem történik csere. Ha megjegyezzük az utolsó csere helyét (ucs), akkor a következő bejárás csak addig megy.
u := n;
repeat
   ucs := 0;
   for j := 1 to u-1 do
      if a[j] > a[j+1] then
         c := a[j];
         a[j] := a[j+1];
         a[j+1] := c;
         ucs = j;
      endif
   endfor
   u := ucs;
until ucs=0.
Összefésülés
Van két rendezett tömbünk, a[1..n] és b[1..m]. Ezeket kell összefésülni egy c[1..n+m] tömbbe. Az i változó az a tömb, a j pedig a b tömb elemein fog lépegetni. Az a[i] és b[j] elemek közül mindig a kisebbiket tesszük a ctömbbe, majd lepünk egyet abban a tömbben, amelyből „kikerült" az az elem, amelyet a c tömbbe helyeztünk.
i := 1;
j := 1;
k := 1;
while (i ≤ n) AND (j ≤ m) do
   if a[i] ≤ b[j] then
      c[k] := a[i];
      i := i + 1;
      k := k + 1;
   else
      c[k] := b[j];
      j := j + 1;
      k := k + 1;
   endif
endwhile
while i ≤ n do
   c[k] := a[i];
   i := i + 1;
   k := k + 1;
endwhile
while j ≤ m do
   c[k] := b[j];
   j := j + 1;
   k := k + 1;
endwhile.
Összefésüléses rendezés
Az eddig ismertetett rendező algoritmusoktól eltérő, rekurzív elven működik. A c[1..n] tömb rendezése rekurzívan visszavezethető a c[1..n/2] és a c[n/2+1..n] tömbszakaszok külön-külön történő rendezésére, és az ezt követő összefésülésükre. Az általános rendez eljárást egy c[i..j] tömbszakasz rendezésére kell megírnunk. A feladat akkor triviális, ha a rendezendő tömbszakasz egyelemű (i = j).
Megjegyzés: A rendez eljárást kezdetben a teljes tömbre hívjuk meg, rendez (c[1..n]);. Az összefésül eljárás az a és b segédtömböket használja.
procedure rendez (c[i..j]);
   if i < j then
      k := (i + j) / 2;
      rendez (c[i..k]);
      rendez (c[k+1..j]);
      összefésül (c[i..j]);
   endif
endprocedure
procedure összefésül (c[i..j])
   k := (i + j) / 2;
   for p := i to k do
      a[p] := c[p];
   endfor
   for p := k+1 to j do
      b[p] := c[p];
   endfor
   a[k+1] := ∞; b[j+1] := ∞; {strázsák}
   ii := i; jj := k+1;
   for p := i to j do
      if a[ii] < b[jj] then
         c[p] := a[ii];
         ii := ii + 1;
      else
         c[p] := b[jj];
         jj = jj + 1;
      endif
   endfor
endprocedure
Szétválogatás (előrendezés)
Az a[1..n] tömb elemeit válogassuk szét „az első eleme szerint” (az első elemnél kisebb elemek előtte, a nagyobbak mögötte legyenek). Egy i, illetve egy j változót a tömb elejére, illetve végére állítunk. Kezdetben az elem, amely szerint a szétválogatás történik (továbbiakban kulcselem), nyilván az i-edik pozícióban van. Miközben i áll, jövünk előre j-vel (magunk mögött hagyva a kulcselemnél nagyobb elemeket), míg nem találunk egy a[j]-t, ami kisebb, mint az a[i]. Felcserélve egymás közt az a[i]-t és az a[j]-t, a kulcselem hátra kerül a j-edik pozícióba, a nála kisebb elem pedig előre az i-edikbe. Ekkor „váltás” történik. Miközben j áll, i-vel megyünk hátrafele (magunk mögött hagyva a kulcselemnél kisebb elemeket), míg nem találunk egy a[i]–t, ami nagyobb, mint az a[j]. Ismét felcserélve egymás közt az a[i]-t és az a[j]-t, a kulcselem visszakerül az i-edik pozícióba, a nála nagyobb elem pedig hátra a j-edikbe. Most újra j-vel jövünk előre (1. eset), majd ismét i-vel megyünk hátra (2. eset) mindaddig, amíg i és j találkozik. A kulcselem mindig az álló index irányában van, az előre lepegető j a kulcselemnél nagyobb, a hátrafele mozgó i pedig a kulcselemnél kisebb elemeket hagyja maga mögött. A kulcselem a helyét, amelyet a rendezett számsorozatban foglalna el, ott találja meg, ahol találkoznak az i es j indexek.
i := 1; j := n;
eset := 1; 
   while i < j do
      if a[i] ≤ a[j] then
         if eset = 1 then j := j – 1
         else i := i + 1
         endif
      else
         c := a[i]; a[i] := a[j]; a[j] := c;
         if eset = 1 then eset := 2
         else eset := 1
      endif
   endif 
endwhile.
Gyorsrendezés (quick-sort)
Ez az algoritmus is rekurzív elven működik. Szétválogatjuk az aktuális tömbszakasz (a[i..j]) elemeit a szakasz első eleme (az a[i] kulcselem) szerint, majd folytatjuk a rendezést a szakasz kulcselem előtti, illetve mögötti elemei rendezésével.
Megjegyzés: A rendez eljárást kezdetben a teljes tömbre hívjuk meg, a szétválogat függvény adja vissza a helyére került kulcselem pozícióját.
procedure rendez (a[i..j])
   if i < j then
      k := szétválogat (a[i..j]);
      rendez (a[i..k-1]);
      rendez (a[k+1..j]);
   endif
endprocedure

function szétválogat (a[i..j])
   ii := i;
   jj := j;
   üzemmód := 1;
   while ii < jj do
      if a[ii] ≤ a[jj] then
         if üzemmód = 1 then jj := jj – 1
         else ii := ii + 1
         endif
      else
         veder=a[ii]; a[ii]=a[jj]; a[jj]=veder;
         if üzemmód = 1 then üzemmód := 2
         else üzemmód := 1
         endif
      endif
   endwhile
   return ii;
endfunction.

A Python programozási nyelv 2.

Általános célú programozási nyelv, Guido van Rossum holland programozó dolgozott ki. Könnyű olvashatóság jellemzi. A Python többek között a funkcionális, az objektumorientált, az imperatív és a procedurális programozási paradigmákat támogatja. Dinamikus típusokat és automatikus memóriakezelést használ. A Python úgynevezett interpreteres nyelv, ami azt jelenti, hogy nincs különválasztva a forrás- és tárgykód, a megírt program máris futtatható, ha rendelkezünk a Python értelmezővel. A Python értelmezőt számos géptípusra és operációs rendszerre elkészítették, továbbá számtalan kiegészítő könyvtár készült hozzá, így rendkívül széles körben használhatóvá vált.

Egyszerű adattípusok
A Python különbséget tesz a mutálható és a mutálhatatlan típusok között. Ezek a fogalmak első közelítésben a megváltoztathatóságra utalnak, ám a pontos különbség ennél finomabb.[12][13]

A Python 3 beépített típusai
típus leírás példa
str
Unicode string
'Wikipédia'
"Wikipédia"
"""Több
soros
string"""
bytearray
Bájtok (mutálható) sorozata.
bytearray(b'Some ASCII')
bytearray(b"ASCII karakterek")
bytearray([119, 105, 107, 105])
bytes
Bájtok (mutálhatatlan) sorozata.
b'ASCII karakterek'
b"ASCII karakterek"
bytes([119, 105, 107, 105])
list
List típus, ami eltérő típusokat is tartalmazhat, azaz nem tipizált lista.
[4.0, 'string', True]
tuple
Rendezett n-es.
(4.0, 'string', True)
set
frozenset
Rendezetlen halmaz adattípusok. Duplikátumokat nem tartalmazhatnak.
Nem tipizáltak, azaz eltérő típusú elemeket is tartalmazhatnak, ha azok hasíthatóak.

{4.0, 'string', True}
frozenset([4.0, 'string', True])
dict
Hasítótábla, más néven szótár vagy asszociatív tömb adattípus.
Kulcs-érték párokat tartalmazhat. A kulcsoknak hasíthatónak kell lenniük.

{'key1': 1.0, 3: False}
int
Tetszőleges méretű egész szám adattípus.
42
float
Lebegőpontos szám, melynek pontossága az implementáló rendszertől függ.
3.1415927
complex
komplex szám adattípus valós és képzetes résszel.
3+2.7j
bool
Kétértékű logikai adattípus.
True
False
Kivételkezelés
A kivételkezelés a try kulcsszóval történik. Például így:

try:
    f()
except (NameError,TypeError):
    print('Az f függvény végrehajtása során NameError vagy TypeError lépett fel.')
except Exception:
    print('Nem várt kivétel lépett fel.')
else:
    print('Semmilyen kivétel nem lépett fel.')
finally:
    print('Ez a mondat mindenképp kiíródik.')
Ha olyan kivétel lép fel a try blokkban, ami valamely except ágban szerepel, akkor a vezérlés az illető except ágnak adódik át. Egy except ág több kivételtípust is kezelhet, az egyes kivételtípusokat vesszővel elválasztva lehet megadni.

Az except ág lefutása után a try blokk utáni részen folytatódik a program. Ha nem lép fel semmilyen kivétel, akkor a vezérlés az else ágra kerül a lefutás után, ha az létezik. Mindig csak egy except ág fut le. Ha az utolsó except ág nem ad meg kivételtípust, akkor az kezeli az összes olyan kivételt, amit a megelőző ágak nem kezeltek. Végül szerepelhet egy opcionális finally blokk, ami mindenképpen lefut.

Ha nincs megfelelő except ág, akkor továbbadódik a kivétel a tartalmazó blokknak. Az except ágakban fellépő kivételek szintén a tartalmazó blokknak adódnak át. Ha egyáltalán nincs try blokk, például egy függvényben, akkor minden kivétel a tartalmazó blokknak adódik át.

def hibas_fuggveny():
    x=1/0
try:
    hibas_fuggveny()
except ZeroDivisionError as ex:
    print('Nullával osztás.', ex)
A nyelv tartalmaz beépített kivételeket, de a lehetőség van saját kivételeket definiálására is. A kivételek paraméterezhetőek, típusuktól függően más és más paraméterük lehet. Kivétel kiváltására a raise kulcsszó alkalmazható:

raise NameError('Hello')
Osztályok, öröklődés
A Python osztálymechanizmusának tervezésénél a szempont az volt, hogy minimális szintaktikai és szemantikai újdonságokat vezessenek be. C++ és a Modula-3 osztálymechanizmusának a keveréke. Többszörös öröklődésre is lehetőséget ad, a származtatott osztály átdefiniálhatja az ősosztálya(inak) metódusait, egy metódus hívhatja az ősosztály metódusát ugyanazon a néven. Az objektumok tartalmazhatnak nem publikusnak szánt adatokat, azonban maga a nyelv semmi biztosítékot nem nyújt arra, hogy hívó fél is valóban így fogja kezelni[14]. A tagváltozó vagy tagfüggvényt kezdhetjük egy aláhúzással, ezzel jelezvén, hogy ezt nem publikusnak szánjuk (gyakorlatilag a protected, package-private vagy privát láthatóságot szánjuk az adott tagnak).

class MyObject(object):
    def __init__(self, name):
        self._name = name   # Jelezzük, hogy ez egy protected vagy package-private adat
                            # nem szeretnénk, ha direktben használná bárki
                            # kivéve a csomagot, amiben van/leszármazott osztályokat

myobj = MyObject("Ez a nevem")
print(myobj._name) # De ez csak egy jelzés, kívülről ugyanúgy elérhető, mint bármely más adat
Különbségek a C++-hoz képest, hogy az osztály- és objektumváltozók publikusak (kivéve a dupla aláhúzással kezdődőeket, amik egy speciális mechanizmusnak köszönhetően megóvhatják a kódunkat például az öröklődéskor előforduló névfelüldefiniálásoktól[14]), és minden tagfüggvény virtuális.

A Python a szokásos értelemben nem használ konstruktor és destruktor függvényeket, de a nem kötelezően definiálandó, speciális "__init__" és "__del__" tagfüggvényeket a rendszer az objektumpéldány létrehozásakor, illetve az objektum explicit törlésekor ("del" utasítás) vagy amikor a szemétgyűjtő (garbage collector) felszabadítja a tárhelyet, automatikusan meghívja. Az "__init__"-et nagyon gyakran használják az tagváltozók kezdeti értékadására:

class MyObject(object):
    def __init__(self, name):
        self.name = name

myobj = MyObject("Ez a nevem")
print(myobj.name) # Kiírja, hogy "Ez a nevem"
Az osztályok maguk is objektumok – valójában a Pythonban minden adattípus objektum. A 2.2-es verziótól kezdve a beépített típusokat is bővítheti a felhasználó. Minden operátor felüldefiniálható speciális nevű tagfüggvényekben. (Például az összeadás operátor (+) a "__add__", "__radd__", "__ladd__" segítségével, a szorzás operátor (*) a "__mul__", "__rmul__", "__lmul__" segítségével, stb.)

Ugyanarra az objektumra több néven is lehet hivatkozni, objektumok esetében értékadás alapértelmezés szerint referenciát (hivatkozást) jelent, nem új objektumpéldány létrehozását.

Osztálydefiníció:

class ClassName(object):
    <statement-1>
    ...
    <statement-N>

#Például:
class MyClass(object):
    "Egy egyszerű példa osztály"
    i = 42
    def f(self):
        return 'hello world!'
Az osztálynak mielőtt hatása lenne, a vezérlésnek rá kell futnia az osztálydefinícióra, így akár egy if-ágban is lehet osztálydefiníció. Az osztály-objektum az osztálydefiníció végén automatikusan létrejön. Példányosítani az osztály nevével, valamint a paraméterlista megadásával tudunk. Üres paraméterlistát is jeleznünk kell (nem úgy, mint C++-ban), egy üres zárójel-párral, különben az osztály referenciáját másoljuk egy változóba. (pl.: x = MyClass() ). Az objektumok tagváltozóit nem az osztálydefinícióban deklaráljuk, hanem az objektum inicializálására használt "__init__" metódusban, hiszen ezek így lokálisan, adott objektumpéldányra lesznek érvényesek, míg az osztálydefinícióban deklarált változók az egész osztályra (így bármely objektumára is) érvényesek lesznek.

Azonban azt is megtehetjük, hogy egy adat attribútumot később deklarálunk, mely az használatkor jön létre. Példa:

class MyObject(object):
    i = 42  # összes objektumpéldányra érvényes változó
            # (hasonlít a hagyományos statikus változókhoz, de nem teljesen ugyanaz a működése)
    def __init__(self):
        self.counter = 0  # objektum inicializáláskor létrehozunk egy tagváltozót

ctr = MyObject()
ctr.counter += 10  # módosítjuk a tagváltozó értékét

print(ctr.counter)  # 10
print(ctr.i)  # 42

ctr.anotherCounter = 0  # deklarálunk egy új adattagot az adott objektumba
print(ctr.anotherCounter)  # 0

MyObject.i = 100  # Az osztályban lévő i változót módosítjuk
anotherOne = MyObject()  # Létrehozunk egy másik objektumpéldányt
print(anotherOne.i)  # 100
print(ctr.i)  # 100
# print(ctr.anotherCounter)  # ebben az objektumban nincs ilyen tagváltozó
A del utasítással megszüntethetünk bármilyen változót, akár objektum-tagváltozót is.

class MyObject(object):
    def __init__(self):
        self.counter = 0

ctr = MyObject()
ctr.counter += 10
print(ctr.counter)  # 10
del ctr.counter
# print(ctr.counter) # itt már nincs ilyen tagváltozónk
Egy másik példa

def MyClass(object):
    i = 42
    def f(self):
        return 'hello world!'

x = MyClass()
x.counter = 1
while x.counter < 10:
    x.counter = x.counter * 2
print(x.counter)
del x.counter
Ez a kis példa 16-ot ír ki (nem a legegyszerűbb módon), és semmilyen nyoma nem marad az osztályban, hiszen a del utasítással töröltük a létrehozott counter nevű változót.

Ügyeljünk rá, hogy x.f nem ugyanaz, mint MyClass.f, mivel az első az hivatkozás az adott objektum egy tagfüggvényére (metódus típusú objektumra való hivatkozás), amely hivatkozás futás közben megváltozhat (tehát például más metódusra mutat), míg a MyClass.f a f függvény prototípusa, ezáltal függvény típusú objektumra való hivatkozás! x.f egy metódus objektum, nem függvényobjektum. x.f() – ki fogja írni: hello world. Ugyanis az objektum, mint első argumentum átadódik a függvénynek, azaz x.f() ekvivalens MyClass.f(x) -szel.

További megjegyzések:

az adat attribútumok felülírják az ugyanolyan nevű metódus attribútumot! Ezért célszerű valamilyen névkonvencióval kizárni az ilyen lehetőséget.
nincs lehetőség az adatelrejtésre – az adat attribútumokat éppúgy elérik a metódusok, mint az objektum kliensei.
az előbbi lehetővé teszi, hogy kliensek elrontsák az invariánst, ha meglévő adat attribútumot írnak felül. Ezt a programozónak kell megoldania, mivel a nyelv nem nyújt rá lehetőséget.
ha létezik egy __init__() metódusa az osztálynak, akkor példányosításkor az objektum létrehozása után meghívódik, átadva a példányosításkor esetleg megadott paramétereket:
class Alma(object):
    def __init__(self, szin, iz):
        self.szin = szin
        self.iz = iz

x = Alma("piros", "savanyu")
A Python lehetőséget nyújt a többszörös öröklődésre, melynek szintaxisa az alábbiak szerint néz ki:

class DerivedClassName([modulename.]Base1[,[[modulename.]Base2,…]):
    <statement-1>
    ...
    <statement-N>
Ha egy hivatkozást nem talál az aktuális osztályban, akkor Base1-ben keresi,ha Base1-ben sincs, akkor Base1 őseiben. Ezután ha még mindig nem találta, akkor Base2-ben kezdi el keresni, és így tovább.

Rekord vagy struct-szerű objektumok létrehozására is van lehetőség, a már ismertetettek szerint, például egy üres osztály deklarálásával, majd az üres osztály egy példányát feltölthetjük:

 class Dolgozo:
    pass        # ez egy üres osztálydefiníció

 John = Dolgozo()
 John.nev = 'John Cosinus'
 John.osztaly = 'Matematikai reszleg'
 John.fizetes = 42000
Azonban, ha ilyen céljaink vannak, sokkal inkább ajánlott a szótár (asszociatív tömb) használata, hogy feleslegesen ne terheljük az interpretert ilyen dummy osztályok, majd abból keletkező objektumok létrehozásával:

dolgozok = list()

John = {'nev': 'John Cosinus',
      'osztaly': 'Matematikai részleg',
      'fizetes': 42000}
dolgozok.append(John)

Jason = dict()
Jason['nev'] = 'Jason Cosinus'
Jason['osztaly'] = 'Matematikai reszleg'
Jason['fizetes'] = 42000
dolgozok.append(Jason)
A kivételek korábban lehettek egyszerű string objektumok, azonban Python 3-ban csak és kizárólag a "BaseException" osztály, vagy leszármazottjának egy példánya lehet.

Forma: raise instance. Egy except klóz kompatibilis a kivétellel, ha ugyanabban az osztályban vannak vagy a kivétel az elkapni kívánt típus leszármazottja. Példa:

class B:
    pass
class C(B):
    pass
class D(C):
    pass

for c in [B,C,D]:
    try:
        raise c()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")
Az eredmény B,C,D ebben a sorrendben. Ha azonban az except ágakat fordítva írtuk volna, akkor az eredmény B,B,B lett volna, mert a legelső illeszkedő except-ág aktivizálódik.

>>> var = [[1,1,1],[1,1,1],[1,1,1]]
>>> print var
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]

feltöltése

for i in range(3)
  for j in range(3)
    tomb[i,j] = érték

vagy

tomb = []

tomb2 = [1,2,3]
tomb3 = [4,5,6]
tomb4 = [7,8,9]
tomb.append(tomb2)
tomb.append(tomb3)
tomb.append(tomb4)
print tomb[2][1] # 8, a 2-es indexű sor 1-es indexű eleme.
print tomb # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

http://www.codeskulptor.org/

Ezen a felületen bárki gyakorolthat, nem kell környezet, nem kell letölteni semmit csak programozni phytonban.


2018. augusztus 24., péntek

Algoritmikus gondolkodás elősegítése lego robot segítségével

Az  informatikai kompetenciák közül az algoritmikus gondolkodással szeretnék foglalkozni. A LEGO MINDSTORMS egy programozható robotikai építőkészlet, amely lehetővé teszi, hogy megépítsd, programozd és irányítsd saját LEGO robotjaidat. Az új LEGO MINDSTORMS EV3 készletben mindent megtalálsz, ami ahhoz kell, hogy létrehozd a 17 robot bármelyikét, és ahhoz, hogy azok képesek legyenek járni, beszélni, mozogni és minden más parancsodat végrehajtani, amit csak el tudsz képzelni. Az EV3 Home Edition Lab View ingyenes szoftvert és ingyenes appokat kapott, amelyekkel robotokat építhetsz, programozhatsz és irányíthatsz PC-ről, Mac-ről, tabletről vagy okostelefonról. Az EV3 a harmadik verziórs utal. FIGYELEM! Ez az eszköz nem játék, avatatlan kezekben veszélyes lehet.
A tervezést az algoritmus kidolgozása előzi meg, ami alapján elkészíthető a robot. A tervezésben és a kísérletezésben a Lego Mindstorm EV3 szoftver van segítségünkre, amiben szabadom variálhatjuk a forgó mozgó alkatrészeket és az érszékelőket szenzorokat.
Nézzük az eszközkészlet;


 A vezérlőegységhez kell csatlakoztatnunk minden eszközt.


A vezérlőegység a kijelzővel ellátott küzpontiegység




















Lássuk a fizikai rögzitő eszközöket;
























Összekötő kábeleket
1 USB kábelt
LEGO Technic elemeket: 594 darab
1 EV3 Építőelem
2 Nagy interaktív szervomotor
1 Közepes méretű interaktív szervomotor
1 Érintésérzékelő
1 Színérzékelő
1 Infravörös érzékelő
1 Infravörös irányjeladó





Az eszközöket nem elég behúzni a szerkesztő felületre, csatlakoztatni kell a központi egységhez is.

A változtatás után a bal oldali zöld nyíllal ellenőrizhetjük robotunk működését.

Az EV3 Építőelem egy programozató intelligens Építőelem, amely robotod agya, irányítja a motorokat és érzékelőket, hogy mozogjanak, lépjenek és beszéljenek, valamint vezeték nélküli kommunikációt szolgáltat Wi-Fi-n és Bluetooth-on keresztül.




Ha több kereket használunk és összetettebb  vezérlést, akkor célszerű a loop vagy switch alkalmazása.

















Ha egy harcoló robotot akarunk készíteni, érdemes végteleníteni a mozgását, elég sok ciklust kell használnunk.
























Készíthetünk intelligens robotot is a mi képes akár a bűvöskocka kirakására is.
Elég sok feltételes utasítás kell a cél eléréséhez.


Egészen összetett gépet is konstruálhatunk csak a fantáziánk és a tudásunk szab határt.

Szenzorok; szín, idözités, infra fény, érintés, ultrahang giroscop,

Használtan 80000 forintért lehet venni. 
Javaslom a következő könyv letöltését.
http://www.hdidakt.hu/adat/dw_anyagok/dw_74.pdf 




2018. augusztus 20., hétfő

CISCO ASA tűzfal beállításai



Az alábbi konfigurációs parancsok alapul szolgálnak a biztonsági berendezés felállításához:

    1. lépés: Kiválasztott szintű jelszó beállítása (jelszó engedélyezése)
Alapértelmezés szerint nincs jelszó az ASA tűzfal eléréséhez, tehát az első lépés, mielőtt bármi mást tehet, egy privilegizált szintű jelszót kell beállítania, amely a készülék későbbi eléréséhez szükséges. Konfigurálási módban állítsa be ezt:

ciscoasa (config) # enable password mysecretpassword

    2. lépés: Parancssor-kezelés engedélyezése
A távfelügyeleti eszköz távolról is elérhető a Command Line Interface Management (CLI) használatával Telnet vagy SSH vagy webes grafikus felügyelet segítségével HTTPS (ASDM menedzsment) használatával. Ajánlott SSH-t használni a CLI menedzsmenthez, mivel a tűzfalon keresztüli kommunikáció titkosítva lesz, szemben a titkosítatlan Telnet használatával. Az SSH engedélyezéséhez a tűzfalon először létre kell hozni egy felhasználónevet / jelszót a hitelesítéshez, majd titkosítási kulcsokat (RSA kulcsokat) kell generálni, és meg kell adni az irányító állomás / hálózat IP-címét is.
! Hozzon létre egy "ciscoadmin" felhasználónevet a "adminpassword" jelszóval, és használja ezt a LOCAL felhasználónevet
SSH kapcsolatok hitelesítéséhez
ciscoasa (config) #username ciscoadmin jelszó adminpassword
ciscoasa (config) #aaa hitelesítés ssh console LOCAL

! Hozzon létre egy 1024 bites RSA kulcspárt a tűzfalhoz, amelyre az SSH szükséges
ciscoasa (config) # crypto kulcs generál rsa modulus 1024 A kulcspár generációs folyamat megkezdődik. Kérem várjon ... ciscoasa (config) #

! Adja meg a biztonsági eszközhöz csatlakozó gazdagépeket.
ciscoasa (config) #ssh 10.1.1.1 255.255.255.255 belül
ciscoasa (config) #ssh 200.200.200.1 255.255.255.255 kívül


    STEP3: Tűzfal gazdagépének konfigurálása
A Cisco ASA készülékek alapértelmezett gazdaneve a ciscoasa, és a Cisco PIX készülék pixfirewall. Ajánlatos egy új tűzfal egyedi hosztnevét beállítani, hogy megkülönböztethesse azt a többi hálózati tűzfalak közül.

ciscoasa (config) # hostname NewYork-FW NewYork-FW (config) #

Vegye észre, hogy a CLI-kérelem megváltozott az újonnan beállított új gépnévre vonatkozóan.



    4. lépés: Interfészparancsok konfigurálása
A Cisco ASA interfészek száma GigabitEthernet0 / 0, GigabitEthernet0 / 1, GigabitEthernet0 / 2 stb. (Cisco ASA 5510 modell esetén a csatolások számozása Etherne0 / 0, Ethernet0 / 1 stb.). Az "Interface" parancs speciális konfigurációs módot tesz lehetővé a megadott interfészhez (interfész konfigurációs mód), majd lehetővé teszi, hogy más interfész-alparancsokat állítson be az interfészmódban. A Cisco ASA 5505 esetében az interfészparancsok a "VLAN x interfész" módban vannak konfigurálva.

ciscoasa (config) # interfész GigabitEthernet0 / 1
ciscoasa (config-if) # ß Konfigurálja az interfész specifikus al-parancsokat

A Cisco ASA 5505 esetében:

ciscoasa (config) # interfész Vlan [vlan szám]
ciscoasa (config-if) # ß Konfigurálja az interfész specifikus al-parancsokat

A szükséges interfész alparancsok, amelyeket be kell állítani ahhoz, hogy az interfész áthaladjon, a következők:
nameif "interface name": Név hozzárendel egy interfészhez
ip cím "ip_address" "subnet_mask": IP cím hozzárendelése az interfészhez
biztonsági szint "0-100": Biztonsági szint hozzárendelése az interfészhez
nincs kikapcsolás: Alapértelmezés szerint minden interfész le van állítva, ezért engedélyezze őket.

Az alábbi konfigurációs pillanatkép mutatja az összes szükséges interfész-al-parancsot:
ciscoasa (config) # interfész GigabitEthernet0 / 1 ciscoasa (config-if) # nameif belül
ciscoasa (config-if) # ip cím 10.0.0.1 255.255.255.0
ciscoasa (config-if) # biztonsági szint 100 ß Alapértelmezés szerint a "belső" felület a sec-level 100 ciscoasa (config-if) # nincs leállítás

ciscoasa (config) # interfész GigabitEthernet0 / 0 ciscoasa (config-if) # nameif kívül
ciscoasa (config-if) # ip cím 10.1.1.1 255.255.255.0
ciscoasa (config-if) # biztonsági szint 0 ß Alapértelmezés szerint a "külső" felület a sec-level 0 ciscoasa (config-if) # nincs leállítás


    5. lépés: Szükség szerint állítsa be a NAT vezérlést
Egy másik fontos konfigurációs lépés a nat-control. A NAT (Network Address Translation) egy kötelező konfiguráció volt a régebbi Cisco PIX tűzfalakban (PIX 6.x verzióban), de az ASA tűzfalakkal ez nem így van. A Nat-Control (amely alapértelmezés szerint le van tiltva) meghatározza, hogy a biztonsági berendezés érvényesíteni fogja-e a címek elrejtését (vagyis a címfordítást) minden olyan forgalomból, amely egy magas biztonsági szintről alacsonyabbra halad. Ha az alapértelmezett konfigurációval (vagyis a nat-vezérlés letiltva) marad, ez lehetővé teszi, hogy a NAT-ot (cím búvóhelyét) csak a kiválasztott forgalomra használja, ahogy csak szüksége van. Ha engedélyezi a nat-vezérlést (az asa (config) # nat-control paranccsal), akkor NAT szabályt kell megadni az ALL forgalomnak, amely egy nagy biztonsági felületről egy alacsonyabb biztonsági felületen halad át. A NAT szabálynak meg kell felelnie a
megfelelő "globális" parancsot (többet később a NAT-ről).
Az útválasztás alapvető lépés a konfiguráláshoz, ellenkező esetben a tűzfal eszköz nem tudja, hogyan küldjön forgalmat a rendeltetési helyre. A fenti példában csak az alapértelmezett és a statikus útvonalat mutatjuk be, bár dinamikus útválasztási protokollok (RIP, OSPF, EIGRP) is konfigurálhatók. Javaslom az alapértelmezett vagy statikus útvonalválasztást, és elkerüljék a dinamikus protokollokat a kis hálózatokban. Ugyanakkor a dinamikus útválasztási protokollok az ASA-ban szintén hasznosak a nagyobb és összetett hálózatokban. További információ a dinamikus útválasztási protokollokról egy későbbi fejezetben.

Használja az útvonal parancsot arra, hogy egy interfészhez statikus vagy alapértelmezett útvonalat adjon meg. A parancs formátuma:
ciscoasa (config) # útvonal "interface-name" "cél-ip-cím" "netmask" "átjáró" "

Lássunk egy példa konfigurációt alább:

ciscoasa (config) # útvonalon kívül 0.0.0.0 0.0.0.0 100.1.1.1 ß Alapértelmezett útvonal
ciscoasa (config) # útvonalon belül 192.168.2.0 255.255.255.0 192.168.1.1 ß Statikus útvonal

Az alapértelmezett útvonalra (általában az internet felé) a cél-ip-címet és a netmaskot is beállítja 0.0.0.0-ra. Készítsen statikus útvonalakat is, hogy bizonyos helyi hálózatokon kívül ismert hálózatokhoz jusson, amint azt a fenti ábra mutatja.

Az útválasztási konfiguráció befejezi a "Minimális kötelező" lépéseket, amelyek a biztonsági eszköz működéséhez szükségesek. Ezután további részleteket kapunk további konfigurációs funkciókhoz, amelyek javítják a tűzfal által védett hálózatok biztonságát.
Ebben a fejezetben egy nagyon fontos biztonsági mechanizmusról beszélünk, amely az IP-címfordítással (cím elrejtésével), annak különböző típusaiban és a tűzfal eszközzel foglalkozik a fordítási mechanizmusokkal.
NETWORK ADDRESS TRANSLATION (NAT)

A nyilvános IPv4 címtartomány kimerültsége arra késztette az internetes közösséget, hogy gondolkodjon a hálózati állomások kezelésének alternatív módjairól. A NAT-ot azért hozták létre, hogy leküzdjék ezeket az internetes terjeszkedéssel kapcsolatos problémákat.

A NAT IP-hálózatok használatának egyik előnye a következő: a NAT segít globális IP-cím kimerülésének enyhítésében.
    A hálózatok belső használatra használhatják az RFC 1918 privát címtartományt.
    A NAT növeli a biztonságot a belső hálózati topológia és a címzés elrejtésével.

Az alábbi ábra egy "belső" hálózattal rendelkező alap-topológiát mutat be, amelyhez az ASA tűzfal NAT műveletet hajt végre, hogy a "belső" címet egy "külső" címre lefordítsa, így elrejtve a belső IP tartományt. Vegye figyelembe, hogy a fordítás a csomagok "forrás" IP címére vonatkozik.

A NAT-t mindig a OUTBOUND forgalomhoz használják, vagyis a belső hálózatról (nagyobb biztonsági szint) érkező forgalom külső hálózat felé (alacsonyabb biztonsági szint). A fenti ábrán a 192.168.1.1-es privát IP-című gazdagép forgalomát 100.1.1.2-es nyilvános, irányítható címre fordítjuk, hogy az internet felé irányuljon. Most a válasz csomagokat küld az internetről a belső oldalunkra

a fogadónak címzett címe lesz az IP 100.1.1.2, amelyre a tűzfal már rendelkezik egy fordítási szabálysal. A tűzfal ezután lefordítja a 100.1.1.2 nyilvános címet 192.168.1.1-re és elküldi azt a belső gazdagépnek.

A nat és globális parancsok együtt dolgoznak, hogy létrehozzák azokat a fordítási szabályokat, amelyek lehetővé teszik a belső hálózat számára, hogy bármilyen IP-címzési rendszert használjanak, és ugyanakkor el vannak rejtve a külvilágtól.

A Cisco ASA tűzfalak támogatják a címfordítások két fő típusát:

    Dinamikus NAT-fordítás: A forrásbiztonsági interfészek forráscímét egy kevésbé biztonságos felületen lévő IP-címek tartományába (vagy poolba) fordítja a kimenő kapcsolatokhoz. A nat parancs határozza meg, hogy melyik belső gazdagépet lefordítják, és a globális parancs határozza meg a címtartományt a kimenő felületen.
    Statikus NAT-fordítás: Tartalmaz egy állandó, egy-egy cím leképezést egy IP-cím között egy biztonságosabb felületen és egy IP-n egy kevésbé biztonságos felületen. A megfelelő hozzáférés-vezérlési lista (ACL) segítségével a statikus NAT lehetővé teszi a kevésbé biztonságos interfészek (pl. Internet) számára a gazdagépeket nagyobb biztonsági felületen (pl. Webszerver DMZ-n), anélkül, hogy a gazdagép biztonsági felület.

Ebben a részben a dinamikus NAT fordítást több forgatókönyvvel is leírjuk. A dinamikus NAT-ban használt nat és globális parancsok formátuma az alábbi:

ciscoasa (config) # nat (belső_felület_neve) "nat-id" "belső hálózati IP alhálózat" ciscoasa (config) # globális (külső_felület_neve) "nat-id".

ciscoasa (config) # nat (belső) 1 192.168.1.0 255.255.255.0 ßBeszámolandó belső oldal ciscoasa (config) # globális (külső) 1 100.1.1.2-100.1.1.50 netmask 255.255.255.0 ßElső
medence

A forgatókönyv felett a tűzfal dinamikus NAT-ot fog végrehajtani minden belső gépen (192.168.1.0/24). A kimenő forgalom belső és külső IP-címei le lesznek leolvasva a Külső Globális 100.1.1.2 100.1.1.50. Vegye figyelembe a nat-id értéket (1). Ez a szám a nat parancsot a globális paranccsal köti össze. Jelentősége lesz a következő forgatókönyvekben.

Vegye figyelembe a "belső" és a "külső" neveket is, amelyeket a nat és a globális parancsok használnak. Ezek a nevek a "nameif" parancs interfészkonfigurációjában vannak megadva.
ciscoasa (config) # nat (belső) 1 192.168.1.0 255.255.255.0 ß Első Belső Hálózat
ciscoasa (config) # nat (belső) 2 192.168.2.0 255.255.255.0 ßSpeciális belső hálózat
ciscoasa (config) # globális (külső) 1 100.1.1.2-100.1.1.50 netmask 255.255.255.0
ciscoasa (config) # globális (külső) 2 100.1.1.51-100.1.1.100 netmask 255.255.255.0

A forgatókönyv itt bemutatja a nat-id paraméter fontosságát és azt, hogyan használják fel ezt a nat / globális parancspárt. Az első nat parancs utasításában lévő nat-id (1) azt mondja a tűzfalnak, hogy a belső hálózati 192.168.1.0/24 címeket átmásolja a leképezett globális IP poolba, amely ugyanazt a nat-idet tartalmazza (azaz 100.1.1.2-ig 100.1-ig. 1,50). Hasonlóképpen, a nat-id (2) a második nat utasításban azt mondja a tűzfalnak, hogy a 192.168.2.0/24-ben a gazdagépek címét lefordítsák a nat-id (2) natív azonosítóval (2) (azaz a 100.1.1.51 felfelé 100.1.1.100-ig).

ciscoasa (config) # nat (belső) 1 192.168.1.0 255.255.255.0 ßBelső alhálózat
ciscoasa (config) # nat (DMZ) 1 172.16.1.0 255.255.255.0 ßDMZ Alhálózat
ciscoasa (config) # globális (külső) 1 100.1.1.1-100.1.1.254 netmask 255.255.255.0
ciscoasa (config) # globális (DMZ) 1 172.16.1.100-172.16.1.254 netmask 255.255.255.0

A fenti forgatókönyv szerint feltételezzük, hogy a "belső" interfésznek 100-as biztonsági szintje van, a "DMZ" interfész biztonsági szintje 50, a "külső" interfész 0. szintű biztonsági szintet jelent. Ez azt jelenti, hogy a "belső" (azaz mind a "DMZ", mind a "külső"). Ezen túlmenően ezek a biztonsági szintek lehetővé teszik a DMZ interfész házigazdái számára a külső interfész felé történő kapcsolódást.

Mivel mind a leképezett poolok (globális parancsok), mind a nat (belső) parancs ugyanazt a nat-idet használják, a belső hálózaton lévő gazdagépek címét (192.168.1.0/24) le lehet fordítani mind a leképezett poolba, a forgalom irányától függően. Ezért, amikor a belső interfészen lévő gazdagépek a DMZ-hez hozzáférnek, a globális (DMZ) parancs a forráscímeket lefordítja a 172.16.1.100 - 172.16.1.254 tartományba tartozó címekre. Hasonlóképpen, amikor a házigazdák beléptetik a házigazdákat külsőleg, a globális (külső) parancs a forráscímeket a 100.1.1.1-100.1.1.254 tartományba fordítja.

Ezenkívül a fenti konfiguráció lehetővé teszi, hogy a DMZ a NAT-t is használhatja, amikor külső gazdagépeket használ. A nat (DMZ) a globális (külső) parancsokkal együtt a DMZ állomások (172.16.1.0/24) forráscímét a 100.1.1.1 - 100.1.1.254 külső tartományba fordítja le.

Monitoring NAT Translations
A ciscoasa # show xlate parancs megjeleníti a NAT fordítási táblázat tartalmát. pl. Globális 100.1.1.10 Helyi 192.168.1.10
A fenti kimenet azt mutatja, hogy a 192.168.1.10 privát helyi címet a 100.1.1.10.
PORT ADDRESS TRANSLATION (PAT)

A Dynamic NAT esetében azt feltételezzük, hogy a nyilvános címek tartománya (medence) van, amelyet a belső hálózati privát címek lefordításához használunk. Valódi helyzetekben a vállalati hálózat csak korlátozott számú nyilvános címet kap az internetszolgáltatójától, míg a belső privát címek száma sokkal nagyobb. Ez azt jelenti, hogy ha dinamikus NAT-t használunk ilyen helyzetben, akkor a külső nyilvános címtartomány nagyon gyorsan lesz kimerülve, amikor sok belső gép egyidejűleg hozzáfér az internethez.

Ennek a problémának a leküzdéséhez egy "sok-egyben" címfordítást használhatunk, amelyet a Port Address Translation (PAT) is nevezünk. A PAT használatával a különböző belső gazdagépektől származó több kapcsolat multiplexelhető egyetlen globális (nyilvános) IP címre, különböző forrásportszámok használatával. Lássunk egy példát itt:

ciscoasa (config) # nat (belső) 1 192.168.1.0 255.255.255.0 ßA PNA protokoll használatához szükséges alhálózat ciscoasa (config) # globális (külső) 1 100.1.1.2 netmask 255.255.255.255 ß Egyetlen
globális IP-cím a PAT számára

A fenti példában minden belső privát cím (192.168.1.0/24) egy nyilvános IP-címet (100.1.1.2) használ különböző forrásportszámokkal. Ez azt jelenti, hogy amikor a 192.168.1.1 hoszt csatlakozik az interneten a kiszolgálón kívül, a tűzfal a forrás címét és portját 100.1.1.2-re fordítja le az 1024 forrásporttal. Hasonlóképpen a 192.168.1.2-es gazdagépet újra át kell fordítani a 100.1.1.2-re, különböző forrásport (1025). A forrásportok dinamikusan 1023-nál nagyobb egyedi számra változnak. Egyetlen PAT-cím támogathatja a 64000 belső gazdagépet.

Monitoring PAT Translations
A ciscoasa # show xlate parancs megjeleníti a PAT fordítási táblázat tartalmát. pl. PAT Global 100.1.1.2 (1024) Helyi 192.168.1.1 (4513)
A fenti kimenet azt mutatja, hogy egy kapcsolat a 192.168.1.1 privát helyi címmel a 4513 forrásporttal a 100.1.1.2 címre fordítja le az 1024 forrásporttal.
A tűzfal nyomon követi az összes NAT-munkamenetet a xlate táblája segítségével, így amikor a válaszcsomag kívülről jön vissza, a tűzfal ellenőrzi a fordítási táblázatot, hogy megtudja, melyik portszám tartozik az adott válaszcsomaghoz annak érdekében, hogy a helyes belső gazdagép.

Számos különböző forgatókönyv létezik, amelyekben a PAT használható a hálózatban. Ezeket majd leírjuk.

1. forgatókönyv: PAT külső interfész IP-cím használatával

Ahelyett, hogy egy meghatározott IP-címet beállítana a PAT-ban használt globális parancsban (a fenti példában), megadhatjuk a külső interfészt PAT-címként. Ez a forgatókönyv akkor fontos, ha tűzfalunk dinamikus nyilvános IP-címet kap az internetszolgáltatótól (ISP), ebben az esetben nem ismerjük a pontos címet a globális parancsra való konfiguráláshoz.

Az alábbi ábrán látható egy konfigurációs példa a DHCP külső címét használva a PAT számára:

ciscoasa (config) # interfész G0 / 0
ciscoasa (config-if) # ip cím dhcp setroute ßAz külső cím és átjáró az internetszolgáltatótól ciscoasa (config) # nat (belső) 1 192.168.1.0 255.255.255.0 ßInnet alhálózat a PAT használatához ciscoasa (config) # globális (külső) 1 interfész ß A PAT külső IP-címét használja

Az "IP cím dhcp setroute" interfész parancs konfigurálja a tűzfalat, hogy DHCP kliensként működjön az internetszolgáltató számára, és automatikusan kapjon nyilvános címet. A "setroute" paraméter azt mondja a Cisco Firewall számára, hogy az alapértelmezett útvonalat állítsa be a DHCP szerver alapértelmezett átjáró értékével. Ne állítson be alapértelmezett útvonalat a setroute opció használatakor.

2. forgatókönyv: Különböző belső alhálózatok leképezése különböző PAT címekre

A nat-id paraméter segítségével két vagy több nat / globális paramétert tudunk megkötni annak érdekében, hogy a különböző belső hálózati alhálózatokat a különböző PAT-címekre térképezzük fel, ahogy az az alábbi ábrán látható:

ciscoasa (config) # nat (belső) 1 192.168.1.0 255.255.255.0
ciscoasa (config) # globális (külső) 1 100.1.1.1 netmask 255.255.255.255

ciscoasa (config) # nat (belső) 2 192.168.2.0 255.255.255.0
ciscoasa (config) # globális (kívül) 2 100.1.1.2 netmask 255.255.255.255

A 192.168.1.0/24 belső alhálózaton lévő kimenő kapcsolatok valószínűleg címről származnak
és a kimeneti kapcsolatok a 192.168.2.0/24 alhálózatból a 100.1.1.2 címről származnak.

3. forgatókönyv: Dinamikus NAT és PAT Translation kombinálása

A Dinamikus NAT fordításhoz külső nyilvános IP-címekből álló csoportot használhatunk, és ezt a pool-ot egyetlen PAT-címmel kiegészíthetjük, ha a globális poolban lévő címek kimerülnek.

ciscoasa (config) # nat (belső) 1 192.168.1.0 255.255.255.0
ciscoasa (config) # globális (külső) 1 100.1.1.100-100.1.1.253 netmask 255.255.255.0
ciscoasa (config) # globális (külső) 1 100.1.1.254 netmask 255.255.255.255

A 192.168.1.0/24 belsõ hálózatból érkezõ kimenõ címeket a 100.1.1.100 és a 100.1.1.253 közötti tartományok hozzárendelik. Ha a tűzfal hozzárendel minden címet a dinamikus gyűjteményből, akkor túlcsordul a 100.1.1.254. PAT címére.


STATIKUS CÍMKÉSZÍTÉS (STATIKUS NAT)

Az előző szakaszokban (dinamikus NAT és PAT) tárgyalt két fordítási típust csak a kimenő kommunikációhoz használjuk (vagyis magasabb biztonsági szintről alacsonyabb biztonsági szintre).
Ha azonban egy külső gazdagép (úgynevezett gazda az interneten) kommunikációt indít a belső tűzfal mögé, akkor ez nem lehetséges, ha csak dinamikus NAT vagy PAT konfiguráltunk. Ez nagyon jó a biztonság szempontjából, de számos esetben engedélyeznünk kell a bejövő hozzáférést is (vagyis az alacsonyabb biztonsági szinttől a magasabb biztonsági szintig - kívülről befelé). Ennek elérése érdekében statikus NAT fordítást kell használnunk, és konfigurálnunk kell a megfelelő beléptetési listát is. A statikus NAT térképek egy állandó (globális) (külső) címhez tartósan egy gazdagép címet adnak.

A statikus NAT használatának legfontosabb okai a következők:


    Van egy belső szerverünk (például cégünk e-mailje vagy webszervere), amely mindig megjelenik egy rögzített nyilvános IP címmel a tűzfal Külső felületén.
    Engedélyeznünk kell a külső (például az interneten) házigazdák számára, hogy kezdeményezzenek kapcsolatokat egy helyi belső szerverhez (például web vagy e-mail szerverünkhöz).
    Port átirányítást szeretnénk használni (erről később).

A statikus NAT parancsformátuma a következő:

ciscoasa (config) # statikus (real_interface_name, mapped_interface_name) "mapped_IP" "real_IP" netmask "subnet_mask"

A statikus NAT konfigurálásához ismerni kell a következő paramétereket:

Között két kapcsolódási pont van a fordítást végrehajtva. A két interfész definíciója a valós_interface és a mapped_interface. Az igazi interfésznek (pl. DMZ interfésznek vagy belső interfésznek) nagyobb biztonsági szintje van, mint a leképezett interfész (pl. Külső interfész).
A gazdagép valós_IP címe (a gazdagép hálózati kártyáján ténylegesen beállított IP).
A gazdagép mapped_IP (vagy lefordított) IP címe (vagyis a cím, amelyet a fogadó ismert a Külső hálózatokon).

Egy kis "fogás", amellyel a statikus parancsnak óvatosnak kell lennie, a következő: amikor az interfész nevét a zárójelbe írja be, először a valós_interfő nevét adja meg, majd a mapped_interface nevet (lásd a fenti parancsformátumot). Ha azonban az interfész nevek után konfigurálja az IP-címeket, először a mapped_IP címet adja meg, majd a real_IP címet. Lássunk néhány példa forgatókönyvet a dolgok egyértelművé tételéhez:

A fent említett hálózati topológia sok vállalatnál klasszikus. Általában van egy Inside hálózat a tűzfalon, amely az összes belső alkalmazott számítógépét tárolja, az internethez csatlakozó külső hálózatot, valamint egy demilitarizált zónát is (DMZ), amely kiszolgálót tartalmaz, amely elérhető az internetről (példánkban , webszerver és e-mail kiszolgáló). Ebben a forgatókönyvben a DMZ kiszolgálókhoz statikus NAT-ot kell használni, hogy valódi személyes IP-címük mindig állandó nyilvános IP címre lehessen fordulni (10.0.0.1 fordítva a 100.1.1.1-re és a 10.0.0.2-be fordítva a 100.1.1.2-re).

A mi forgatókönyveinkben a következők vannak: Valódi interfész neve: DMZ
    Átkapcsolt interfész neve: Kívül
    Valódi IP-címek: 10.0.0.1 és 10.0.0.2
    Megkapcsolt IP címek: 100.1.1.1 és 100.1.1.2

Lássuk az alábbi konfigurációs pillanatképet:

ciscoasa (config) # statikus (DMZ, kívül) 100.1.1.1 10.0.0.1 netmask 255.255.255.255
ciscoasa (config) # statikus (DMZ, kívül) 100.1.1.2 10.0.0.2 netmask 255.255.255.255

A fenti megállapítások lehetővé teszik a kétirányú kommunikációt a webes és e-mail szerverek számára. Most az internetes állomások elérhetik webes és e-mail szervereinket a 100.1.1.1 és a 100.1.1.2 nyilvános címükön keresztül. Természetesen az ACL szükséges a külső felületen, hogy lehetővé tegye a kommunikációt.


2. forgatókönyv: Statikus NAT egy teljes hálózatra (Net Static)


Ahelyett, hogy állandóan lefordítanánk az egyes befogadó címeket, állandó alkönyvtárakat hozhatunk létre egy teljes alhálózathoz egyetlen paranccsal. Hivatkozva az előző diagramra, feltételezzük, hogy teljes C osztályú nyilvános címtartománya van 100.1.1.0/24. A teljes DMZ-tartományt lefordíthatjuk a 10.0.0.0/24 és a 100.1.1.0/24 között.

ciscoasa (config) # statikus (DMZ, kívül) 100.1.1.0 10.0.0.0 netmask 255.255.255.0

A DMX-ben lévő 10.0.0.0/24 alhálózaton lévő kiszolgáló címről származó csomagok a külső interfészen lévő 100.1.1.0/24 alhálózathoz tartozó gazdaszámítógépre lesznek lefordítva (pl. A 10.0.0.20 állomás lefordítódik 100.1.1.20-ra) .

Egy nagyon gyakori forgatókönyv a fenti diagramon látható. Tegyük fel, hogy csak egy nyilvános IP-címe van (100.1.1.1), de két (vagy több) szerverünk van, amelyekhez nyilvános hozzáférést kell biztosítani. Tudjuk, hogy webszerverünk a 80-as portra figyel és az e-mail szerverünk figyeli a 25. portot. A 100.1.1.1 80-as portot érintő összes bejövő forgalom átirányítható a tűzfalra a 10.0.0.1 80-as portra, és minden forgalom a 100.1.1.1 címmel a 25-ös port átkerül a 10.0.0.2 port 25-re.

A port átirányítás parancsformátuma a következő:

ciscoasa (config) # statikus (real_interface_name, mapped_interface_name) [tcp | udp] "mapped_IP" "mapped_port" "real_IP" "real_port" netmask "subnet_mask"

A fent említett példaprogramban a hálózati topológia esetében a port átirányítási parancsok a következők:

ciscoasa (config) # statikus (DMZ, külső) tcp 100.1.1.1 80 10.0.0.1 80 netmaszk
255.255.255.255

ciscoasa (config) # statikus (DMZ, külső) tcp 100.1.1.1 25 10.0.0.2 25 netmask
255.255.255.255

Most mi van, ha két webszerverünk van, amelyek mindketten hallgatják a 80-as portot? Beállíthatjuk a tűzfalat, hogy átirányíthasson egy másik, nyilvánosan leképezett portot (például 8080-at) a második webszerverünkre.

Használhatjuk a Port átirányítás funkciót egy jól ismert port lefordításához egy kevésbé ismert porthoz, vagy fordítva. Ez segít a biztonság növelésében. Például megmondhatja a webfelhasználóknak, hogy csatlakoznak egy kevésbé ismert 5265-es porthoz, majd fordítsák őket a helyes 80-as portra a helyi hálózaton.

AZONOSÍTÓ NAT (NAT 0 COMMAND)

Érdemes megemlíteni egy másik típusú NAT mechanizmust, az úgynevezett Identity NAT (vagy nat 0). Ha engedélyezte a nat-vezérlést a tűzfalon, akkor kötelező, hogy a biztonsági eszközön átnyúló összes csomagnak meg kell felelnie egy fordítási szabálynak (akár nat / globális vagy statikus nat szabályoknak). Ha néhány házigazdát (vagy egész hálózatot) akarunk átadni a tűzfalon fordítás nélkül, akkor a nat 0 parancsot kell használni. Ez átlátható leképezést hoz létre. Ha az azonosító NAT-t egy interfészen használják, akkor az ezen a felületen lévő IP-címek le vannak fordítva minden alsó biztonsági interfészre.

Ábrák;




2018. augusztus 18., szombat

Érdekességek phytonban

Alapok
Először használjuk interaktívan a Python értelmezőt és ismerkedjünk meg az adattípusokkal, egyszerű
kifejezésekkel. A >>> a Python prompt, ezután írjuk be az utasításainkat.
>>> 5 * 4
20
>>> 3**4 # hatványozás
81
>>> (2 + 8) / 3 # egész osztás
3
>>> (2 + 8) / 3.0 # lebegőpontos osztás
3.3333333333333335
>>> 56.12 // 12.34 # egész osztás
4.0
A Python a # karakter utáni szöveget a sor végéig megjegyzésnek értelmezi.
A kiszámított értékeket változókban megőrizhetjük, ilyenkor nem jelenik meg a művelet eredménye.
>>> a = 5 * 4
>>> print a # Python 3-ban print(a)
20
>>> l = True # Logikai érték True vagy False
>>> c = None # A None a definiálatlan értéket jelenti
>>> s = 'Hello world' # karakterlánc, dupla aposztróf is jó
Python-ban nincs automatikus típus konverzió a változókra, konstansokra. A type függvénnyel le tudjuk
kérdezni egy változó típusát.
>>> b = '16'
>>> a + b
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> type(a) # változó típus
<type 'int'>
>>> type(b)
<type 'str'>
>>> type(b) is str # is operátor
True
>>> a + int(b)
36
>>> a * b # Karakterlánc többszörözése!
'1616161616161616161616161616161616161616'
>>> s[0] # Karakterlánc első eleme
'H'
>>> s[-1] # Karakterlánc utolsó eleme
'd'
>>> s[0] = 'h' # Karakterlánc nem módosítható
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> s[:5] # Első 5 karakter
'Hello'
>>> s[6:] # Karakterlánc vége
'world'
>>> s[-5:]
'world'
>>> s[6:8]
'wo'
>>> len(s) # Karakterlánc hossza
11
>>> s[:5] + ' Dolly'
- 2 -
'Hello Dolly'
>>> c = 1
>>> a, c = c, a # két változó tartalom cseréje
A matematikai függvények (sin, cos, stb.) egy modulban találhatók (math).
>>> sin(1)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'sin' is not defined
>>> import math
>>> math.sin(1) # radián!
0.8414709848078965
>>> print '%6.4f' % math.sin(1) # formatizálás
0.8415
Modulokat kétféleképpen importálhatunk. Az import modul_név parancs használata esetén a modul
elemeire úgy hivatkozhatunk, hogy elé írjuk a modul nevét. A másik módszer esetén
from modul_név import elem, nem kell a modul nevét használnunk a modul elemére hivatkozásnál,
viszont ilyenkor könnyen név ütközés fordulhat elő.
>>> from math import sin
>>> sin(1)
0.8414709848078965
Ez utóbbi változat esetén vesszővel elválasztva a modul több felhasználandó elemét is megadhatjuk vagy *
karakterrel az összes elemet importálhatjuk (pl. from math import *).
Adatszerkezetek
Az egyszerű változók mellett listákat is használhatunk. A lista egy rendezett adathalmaz, elemeire 0-tól
kezdődő index-szel hivatkozhatunk.
>>> l1 = [] # Üres lista
>>> l2 = ['alma', 5, 4] # Különböző adattípusok
>>> l2[0]
'alma'
>>> l2[1:] # Rész lista
[5, 4]
>>> len(l2) # Lista elemeinek száma
3
>>> l2[0] = 3 # Lista elemek módosíthatók
>>> l2[3] # Nem létező elem
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> l2[3] = 5
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> l2.append(5) # Lista bővítése
>>> print l2
[3, 5, 4, 5]
>>> l2[0:3] = 1 # Lista részének cseréje
>>> print l2
[1, 5]
>>> del l2[0] # Lista elem törlése
>>> print l2
[5]
>>> l3 = [[1, 2], [6, 4]] # Listák listája
>>> l3[0][1]
2
- 3 -
>>> help(list)
Help on class list in module builtins:
...
Listák összefűzését a + művelettel végezhetjük el, a * operátor a karakterláncokhoz hasonlóan ismétlést
jelent. Az in művelettel megvizsgálhatjuk, hogy a lista tartalmaz-e egy elemet.
A listákkal kapcsolatban több függvényt használhatunk (például sorted, reversed, min, max) illetve
további metódusok tartoznak hozzá (pl. pop, sort, reverse).
A tuple2
 egy nem módosítható lista, a listával azonos módon használható, kivéve a módosító utasításokat (a
karakterlánchoz hasonlóan).
>>> t = (65, 6.34)
>>> t.append(1)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
>>> t[0]
65
A listákkal, tuple-el kapcsolatban gyakran nagyon tömör kódot írhatunk az elemekkel végzendő műveletre.
Ezt angolul list comprehension-nak, magyarul lista értelmezésnek vagy feldolgozásnak mondhatjuk.
>>> l = [2, 6, -3, 4]
>>> [x**2 for x in l] # minden listaelem négyzete
[4, 36, 9, 16]
>>> [x**0.5 for x in l if x > 0] # pozitív listaelemek gyöke
>>> import math
>>> map(math.sin, l) # [math.sin(x) for x in l]
[0.9092974268256817, -0.27941549819892586, -0.1411200080598672,
-0.7568024953079282]
>>> [a for a in l if a%2] # páratlan számok a listából
[-3]
A karakterláncokból, listákból tuple-okból halmazokat képezhetünk, a halmazokban ugyanaz az elem nem
ismétlődhet.
>>> a = "abcabdseacbfds"
>>> s = set(a)
>>> s
set(['a', 'c', 'b', 'e', 'd', 'f', 's'])
>>> b = (1, 3, 2, 4, 3, 2, 5, 1)
>>> t = set(b)
>>> t
set([1, 2, 3, 4, 5])
>>> c = ['alma', 'szilva', 'barack', 'alma']
>>> u = set(c)
>>> u
set(['barack', 'szilva', 'alma'])
A halmazokkal műveleteket is végezhetünk.
>>> a = set('abcdefgh')
>>> b = set('fghijklm')
>>> a – b # halmazok különbsége
set(['a', 'c', 'b', 'e', 'd'])
>>> a | b # halmazok uniója
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l'])
>>> a & b # halmazok metszete
set(['h', 'g', 'f'])
2 A tuple kifejezésre nincs elfogadott magyar fordítás, néhányan vektornak mondják, de az a listára is igaz lenne,
adatbáziskezelésben rekord értelemben használják, a matematikában használják rá a szám n-es kifejezést, de a Pythonban nem
csak számokat tárolhat, ... Én maradtam a tuple-nél (kiejtése: tapló :)
- 4 -
>>> a ^ b # halmazok szimmetrikus különbsége
set(['a', 'c', 'b', 'e', 'd', 'i', 'k', 'j', 'm', 'l'])
A szótár egy rendezetlen adathalmaz (asszociatív tömb, hash tábla). A szótár elemei lehetnek listák és
további szótárak is.
>>> szotar = {} # Üres szótár
>>> szotar['elso'] = 4 # Egyszerűen bővíthető
>>> szotar[5] = 123 # szám is lehet index
>>> szotar['elso'] = 'alma' # Módosítható
>>> print szotar
{'elso': 'alma', 5: 123}
>>> 'elso' in szotar # Létezik ez az index?
True
>>> tomb = {(1,1): 2, (1,2): 4, (2,1): -1, (2,2): 6} # tuple az index
>>> tomb[1,1]
2
Az in műveletet halmazokra, listákra és tuple-okra is használhatjuk.
A Python értelmezőbő

Változó kiíratása

>>> n
7
>>> msg
"Mi újság ?"
>>> pi
3.14159

Értékadás és feltétel
>>> a = 150
>>> if (a > 100):
Ciklus
>>> a = 0
>>> while (a < 7): # (ne felejtsük el a kett spontot !) ő
... a = a + 1 # (ne felejtsük el a behúzást !)
... print a
Végtelen ciklus
Végtelen ciklus példája (kerülendő) : >>> n = 3 >>> while n < 5: ... print "hello !"

számok négyzete
 a = 0 >>> while a < 12: ... a = a +1 ... print a , a**2

Fibonacci sorozat
>>> a, b, c = 1, 1, 1 >>> while c < 11 : ... print b, ... a, b, c = b, a+b, c+1

# Els Python script ő
# Fibonacci-sort írat ki, azaz egy olyan számsort, aminek minden tagja
# az el z két tag összege. ő ő
a, b, c = 1, 1, 1 # a & b az egymást követ tagok számolására valók ő
 # c egy számláló
print 1 # az els tag kiíratása ő
while c<15: # összesen 15 tagot íratunk ki
 a, b, c = b, a+b, c+1
 print b

Lista előállítása (tömb)
>>> nap = ['hétf ', 'kedd', 'szerda', 1800, 20.357, 'csütörtök', 'péntek'] ő
>>> print nap
['hétf ', 'kedd', 'szerda', 1800, 20.357, 'csütörtök', 'péntek']


vagy

>>> nap = ['hétf ', 'kedd', 'szerda', 1800, 20.357, 'csütörtök', 'péntek'] ő >>> print nap[2] szerda >>> print nap[4] 20.357

input adatbekérés

print 'Írjon be valamilyen egész számot : ',
nn = input()
print nn, 'négyzete', nn**2
vagy még :
keresztnev = input('Írja be a keresztnevét (idéz jelben)') ő
print 'Jó napot, ', keresztnev

Függvény importálása
from math import *

hetes szorzótábla
>>> def tabla7():
... n = 1
... while n <11 :
... print n * 7,
... n = n+1
>>> tabla7()
>>> def tabla(alap):
... n = 1
... while n <11 :
... print n * alap,
... n = n + 1
>>> tabla(10)

if a !=2:
print 'vesztett'
elif a ==3:
print 'egy kis türelmet kérek'
else :
print 'nyert'

a = 5
b = 2
if (a==5) & (b<2):
print '"&" jelentése "és"; az "and" szót is használhatjuk '
b)
a, b = 2, 4
if (a==4) or (b!=4):
print 'nyert'
elif (a==4) or (b==4):
print 'majdnem nyert'
c)
a = 1
if not a:
print ' nyert'
elif a:
print 'vesztett

>>> a = 1
>>> while a <20:
... tabla(a)
... a = a +1
gömb térfogata
def cube(n):
 return n**3
def gombTerfogat(r):
 return 4 * 3.1416 * cube(r) / 3
r = input('Írja be a sugár értékét : ')
print 'A gömb térfogata :', gombTerfogat(r)
Rajzoló modul hívása
from turtle import *
def negyzet(meret, szin):
 "meghatározott méret és szín négyzetet rajzoló függvény" ű ű
 color(szin)
 c =0
 while c <4:
 forward(meret)
 right(90)
 c = c +1
elmentés után
from teknos_rajz import *
up() # fölemeli a ceruzát
goto(-150, 50) # balra felmegy
# tíz piros, sorbarendezett négyzetet rajzol:
i = 0
while i < 10:
 down() # leteszi a ceruzát
 negyzet(25, 'red') # egy négyzetet rajzol
 up() # fölemeli a ceruzát
 forward(30) # távolabb megy
 i = i +1
a = input() # vár
Tkinter meghívása ablak és gomb előállítása
from Tkinter import *
>>> from Tkinter import *
>>> abl1 = Tk()
>>> tex1 = Label(abl1, text='Jó napot kívánok!', fg='red')
>>> tex1.pack()
>>> gomb1 = Button(abl1, text='Kilép', command = abl1.destroy)
>>> gomb1.pack()
>>> abl1.mainloop()

# Tkinter grafikus könyvtárat alkalmazó gyakorlat
from Tkinter import *
from random import randrange
# --- az eseménykezel függvények definíciója : --- ő
def drawline():
 "Vonal rajzolása a can1 canvasra (vászonra)"
 global x1, y1, x2, y2, color
 can1.create_line(x1,y1,x2,y2,width=2,fill=color)
 # a koordináták módosítása a következ egyenes számára : ő
 y2, y1 = y2+10, y1-10
def changecolor():
 "a rajz színének véletlenszer megváltoztatása" ű
 global color
 pal=['purple','cyan','maroon','green','red','blue','orange','yellow']
 c = randrange(8) # => véletlenszám generálása 0 és 7 között
 color = pal[c]
#------ F program ------- ő
# a következ változókat globális változókként használjuk : ő
x1, y1, x2, y2 = 10, 190, 190, 10 # az egyenes koordinátái
color = 'dark green' # az egyenes színe
# A f -widget létrehozása ("master") : ő
abl1 = Tk()
# a "slave" widget-ek létrehozása :
can1 = Canvas(abl1,bg='dark grey',height=200,width=200)
can1.pack(side=LEFT)
gomb1 = Button(abl1,text='Kilép',command=abl1.quit)
gomb1.pack(side=BOTTOM)
gomb2 = Button(abl1,text='Vonalat rajzol',command=drawline)
gomb2.pack()
gomb3 = Button(abl1,text='Más szín',command=changecolor)
gomb3.pack()
abl1.mainloop() # eseményfogadó indítása
abl1.destroy() # az ablak (destruction) zárása

Váltás rajzok között
from Tkinter import *
def circle(x, y, r, color ='black'):
 "r sugarú (x,y) középpontú lör rajzolása"
 can.create_oval(x-r, y-r, x+r, y+r, outline=color)

def figure_1():
 "celtablat rajzol"
 # el ször a meglév rajz törlése : ő ő
 can.delete(ALL)
 # a két egyenes rajzolása (függ. és vizsz.) :
 can.create_line(100, 0, 100, 200, fill ='blue')
 can.create_line(0, 100, 200, 100, fill ='blue')
 # több koncentrikus kör rajzolása :
 radius = 15
 while radius < 100:
 circle(100, 100, radius)
 radius += 15

def figure_2():
 "egyszer sített arc rajzolása" ű
 # el ször minden meglév rajz törlése : ő ő
 can.delete(ALL)
 # minden kör jellemz jét listák listájába ő
 # tesszük :
 cc =[[100, 100, 80, 'red'], # fej
 [70, 70, 15, 'blue'], # szem
 [130, 70, 15, 'blue'],
 [70, 70, 5, 'black'],
 [130, 70, 5, 'black'],
 [44, 115, 20, 'red'], # arc
 [156, 115, 20, 'red'],
 [100, 95, 15, 'purple'], # orr
 [100, 145, 30, 'purple']] # száj
 # az osszes kort egy ciklus segitsegevel rajzoljuk meg :
 i =0
 while i < len(cc): # a lista bejárása
 el = cc[i] # minden elem maga is lista
 circle(el[0], el[1], el[2], el[3])
 i += 1
##### F programm : ############ ő

window = Tk()
can = Canvas(window, width =200, height =200, bg ='ivory')
can.pack(side =TOP, padx =5, pady =5)
b1 = Button(window, text ='1. ábra', command =figure_1)
b1.pack(side =LEFT, padx =3, pady =3)
b2 = Button(window, text ='2. ábra', command =figure_2)
b2.pack(side =RIGHT, padx =3, pady =3)
window.mainloop()

from Tkinter import *
abl1 = Tk()
# a 'Label' és 'Entry' widgetek létrehozása:
txt1 = Label(abl1, text ='Els mez :') ő ő
txt2 = Label(abl1, text ='Második :')
txt3 = Label(abl1, text ='Harmadik :')
mezo1 = Entry(abl1)
mezo2 = Entry(abl1)
mezo3 = Entry(abl1)
# egy bitmap képet tartalmazó 'Canvas' widget létrehozása :
can1 = Canvas(abl1, width =160, height =160, bg ='white')
photo = PhotoImage(file ='Martin_p.gif')
item = can1.create_image(80, 80, image =photo)
# laptördelés a'grid' metódus segítségével :
txt1.grid(row =1, sticky =E)
txt2.grid(row =2, sticky =E)
txt3.grid(row =3, sticky =E)
mezo1.grid(row =1, column =2)
mezo2.grid(row =2, column =2)
mezo3.grid(row =3, column =2)
can1.grid(row =1, column =3, rowspan =3, padx =10, pady =5)
# indítás :
abl1.mainloop()



lottó

import random

hány_számból = 90
hány_számot = 5

random.seed() #Inicializálás
halmaz=set()
while len(halmaz)<hány_számot:
    halmaz.add (random.randint(1,hány_számból))
számlista = sorted(list(halmaz)) #Tárolás további felhasználásra
print("A heti lottószámok: ", ", ".join(str(szám) for szám in számlista))
#Ennél egyszerűbben kiírathatnánk a print (számlista) utasítással,
#csak ottmaradna a szögletes zárójel.

Másodfokú egyenlet megoldása
import math, cmath

a= input('Kérem a másodfokú egyenlet főegyütthatóját: ')
a= float(a)
while a==0:
    print('Ez nem lesz másodfokú egyenlet; nem oldom meg.')
    a= input('Kérem a másodfokú egyenlet főegyütthatóját: ')
    a= float(a)

b= input('Kérem az elsőfokú tag együtthatóját: ')
c= input('Kérem a konstans tagot: ')
b= float(b)
c= float(c)

d= b*b-4*a*c
print('A diszkrimináns értéke', d)

if d>=0:
    print('Van valós megoldás.')
    x1= (-b-math.sqrt(d))/(2*a)
    x2= (-b+math.sqrt(d))/(2*a)
    print('Az egyik megoldás', x1)
    print('A másik megoldás', x2)
else:
    print('Nincs valós megoldás.')
    x1= (-b-cmath.sqrt(d))/(2*a)
    x2= (-b+cmath.sqrt(d))/(2*a)
    print('Az egyik megoldás', x1)
    print('A másik megoldás', x2)


http://harp.pythonanywhere.com/python_doc/tutorial/index.html

http://pythontutorial.pergamen.hu/

http://pythontutorial.pergamen.hu/downloads/tut.pdf

http://mek.oszk.hu/08400/08435/08435.pdf

https://tutorial.djangogirls.org/hu/python_introduction/

http://www.agt.bme.hu/gis/python/python_oktato.pdf

Titkosítás és algoritmusok összefüggései

Szimmetrikus kulcsalgoritmusok (Private key cryptography)
Mindkét fél egy magánkulcsot oszt meg (titokban tartják egymás között).

A titkosításhoz szimmetrikus kulcsalgoritmusok használhatók, erre jó példa: a szerver és az ügyfél közötti forgalom titkosítása, valamint a lemezen lévő adatok titkosítása.

DES - Adat titkosítási szabvány - az IBM-nél tervezett
A DES szabvány. Az alkalmazott algoritmust DES vagy néha DEA (Digital Encryption Algorithm) is nevezik.
A DES-t immár bizonytalannak tartják (főként az 56 bites kis kulcsméret miatt).
A Triple DES (3DES) a DES algoritmust háromszor alkalmazza, és így jobb gyakorlati biztonságot nyújt. Három, 56 bites kulcsa van (a DES / DEA minden egyes átvitelére).
A DES-X egy másik változat.
A DES blokk-titkosítás .
IDEA - Nemzetközi adat titkosítási algoritmus
Jó és biztonságos algoritmusnak tekinthető.
Szabadalmaztatott, de szabadon nem kereskedelmi célra.
Az IDEA blokk-titkosítás .
AES - Advanced Encryption Standard - a DES utódja
Az AES a Rijndael titkáron alapul. Volt egy verseny, amely választotta a titkosítást, ami az AES lesz. A Rijndael cipher megnyerte a versenyt. Azonban vannak különbségek a Rijndael és annak megvalósítása között AES-ben.
A legtöbb CPU most tartalmaz hardveres AES támogatást, ami nagyon gyors.
A TrueCrypt, az SSH támogatja.
Az AES és az Rjindael blokkolók .
Az AES számos üzemmódban működhet.
AES-GCM (GALIS / Számláló üzemmódban működő AES) előnyben részesíti (ellenőrizze ezt a blogbejegyzést is). Gyorsan és biztonságosan működik, és hasonlóan működik az adatforgalomhoz. Magas sebességet érhet el alacsony hardvereken is. Csak a TLS 1.2 vagy újabb verziói támogatottak.
Az AES- CBC az, amit az idősebb ügyfelek általában használnak. Az AES-CBC mód érzékeny olyan támadásokra, mint a Lucky13 és a BEAST .
Lásd ezt a választ a különböző módok áttekinthető áttekintéséhez.
Blowfish - amelyet Bruce Schneier tervezett a DES alternatívájaként; eddig nincsenek problémák, de megtámadhatóak, ha a kulcs gyenge, jobb a Twofish vagy a Threefish használatát.
Szabadalom mentes. Közterületen.
Az SSH támogatja.
Sokkal gyorsabb, mint a DES és az IDEA, de nem olyan gyors, mint az RC4.
32-448 bites változó méretű kulcsokat használ. Biztosnak tekinthető. Gyors CPU-khoz tervezve, most lassabb / régi processzorok.
Blowfish egy blokk titkos .
Twofish - Bruce Schneier és mások által tervezett Blowfish utódja
Az AES verseny egyik döntőse
A legtöbb processzor most tartalmaz hardveres AES támogatást, így nagyon gyors, mint a Twofish.
Szabadalom mentes. Közterületen.
A 128, 192 vagy 256 bit méretű kulcsokat használja. Úgy tervezték, hogy sokkal rugalmasabb, mint a Blowfish (a hardverkövetelmények szempontjából).
A TrueCrypt, az SSH támogatja.
A Twofish blokk-titkosítás .
Háromszoros - Bruce Schneier és mások által tervezett
Háromszoros egy blokk titkos .
Kígyó - Ross Anderson, Eli Biham és Lars Knudsen által tervezett kígyó
Az AES verseny egyik döntőse
Szabadalom mentes. Közterületen.
A konzervatívabb megközelítés a biztonság szempontjából, mint a többi AES verseny döntősje.
A TrueCrypt támogatja.
A kígyó egy blokk titkos .
MARS - amelyet Don Coppersmith tervezett (aki részt vett a DES-ben) és mások az IBM-ben
Az AES verseny egyik döntőse
RC6 - Rivest Cipher 6 vagy Ron kódja 6 - Ron Rivest és mások által tervezett
Az AES verseny egyik döntőse
Saját algoritmus. Szabadalmaztatott RSA Security.
Az RC5 az RC6 elődje. Más testvérek közé tartozik az RC2 és az RC4.
További információ az RC5 és RC6 ezen RSA linken .
Az RC5 és az RC6 blokk-titkosítók .
RC4 - Rivest Cipher 4 vagy Ron kódja 4 - más néven ARC4 vagy ARCFOUR (állítólagos RC4).
Az RSA Data Security Inc (RSADSI) nem szabadalmaztatott kereskedelmi titka. Ezután valaki feliratkozott a forráskódra, névtelenül, és nyilvánosságra került.
Nagyon gyors, de kevésbé tanulmányozható, mint más algoritmusok.
Az RC4 jó, ha a kulcsot soha nem használják fel újra.
A gyakorlatban az RC4 nem ajánlott. A TLS 1.1 és újabb verziója megtiltja az RC4-et ( ez az RFC is ). A CloudFlare ellenzi azt (ellenőrizze ezt a blogbejegyzést is). A Microsoft ellenzi . Az aktuális ajánlások összességében a TLS 1.2-et (ami tiltja az RC4-et) és az AES-GCM használatát jelenti .

Ezek a leggyakoribbak:

MD5 - Használja az SHA512-et
SHA1 - Használja az SHA512-t (Ne feledje, ez nem igazán bizonytalan, de a korát mutatja, és az elkövetkező néhány év során foltos lesz ...)
DES / 3DES - Használja az AES-t

Az amerikai és az Izraeli hírszerzés elutasítja ezeket az algoritmusokat a NIST nagyon tapasztalt embereinek ajánlásai alapján:

SHA-1
1024 bites RSA vagy DSA
160 bites ECDSA (elliptikus görbék)
80/112-bites 2TDEA (két fő tripla DES)
Az MD5 soha nem volt elfogadható algoritmus a kormányzati használathoz, sok más régebbi algoritmussal együtt.

A 2030-as évek biztonsága érdekében legalább az SHA-224, 2048 bit az RSA vagy a DSA, a 224 bites EDCSA és az AES-128 vagy a 3-key triple-DES használatára ajánlott.

12
alulról
szavaz
A nem biztonságos, de széles körben használt kriptográfiai algoritmusok a következők:

hash függvények: MD4, MD5, (SHA-1) (az MD2 szintén bizonytalan, de nem széles körben használatos, az SHA-1 csak "gyengült", az MD4 és MD5 is széles körben használatos olyan helyzetekben, ahol nincs szükség kriptográfiai ellenállásra probléma)

szimmetrikus titkosítás: a DES (56 bites kulcs), az RC4 (nem véletlenszerűség - de az RC4 legtöbb biztonsági problémája nem az algoritmusnak köszönhető), a Zip-archiválási formátum (streamer Zip segédprogramok használják az AES-t)

aszimmetrikus titkosítás: RSA túl rövid kulcs (azaz 768 bites vagy kisebb), RSA helytelen párnázással (pl. ISO 9796-1), Diffie-Hellman modulo a túl kicsi prímszám (768 bites vagy kevesebb) (Diffie-Hellman nem valójában egy aszimmetrikus titkosítási algoritmus, de egy kulcsfontosságú megállapodás algoritmusa - de az aszimmetrikus titkosítás leggyakoribb módjai valójában álcázott kulcsfontosságú megállapodások)

digitális aláírások: RSA túl rövid kulcs (azaz 768 bit vagy kevesebb)

sok (túl sok) kézzel készített algoritmust azoktól az emberektől, akik túlszárnyalták magukat; egy elsődleges példa a CSS, a DVD titkosítása

Biztonságos alternatívák: SHA-256 a hasításhoz (SHA-512, ha ugyanolyan fetish méretű, mint az amerikai hadsereg, és / vagy ha meg akarja ölni a teljesítményt 32 bites rendszereken), AES a szimmetrikus titkosításhoz. A kulcsfontosságú megállapodás esetében vegye figyelembe az ECDH-t (Diffie-Hellman egy elliptikus görbe felett) az egyik standard NIST görbével (pl. P-224, K-233 vagy B-233 - de a P-256 szélesebb körben támogatott). Az aszimmetrikus titkosításhoz használjon RSA-t elég nagy kulccsal (1024 bites rövid távú biztonság, lehetőleg 1536 vagy 2048 bites) és PKCS # 1 párnázással (v1.5 "régi stílusú" finom, de az OAEP finomabb). Az aláírások esetében fontolja meg az ECDSA-t (ugyanazokat az görbéket, mint az ECDH-t) vagy az RSA-t, amely elég nagy ahhoz, hogy a kulcsot és a PKCS # 1 párnázatot (v1.5 vagy PSS). Soha ne alakítsd ki saját algoritmust (vagy ha igen, soha ne higgye el, hogy biztonságos).

A legtöbb biztonsági probléma azonban nem az algoritmus kiválasztásában, hanem annak használatában. A WEP az RC4-et használja, de az RC4 nem egyike a WEP számos hiányosságának. A Sony védte a PlayStation 3-ot az ECDSA-val, amely biztonságos, de elrontotta véletlen generációját, ami katasztrofális hibát eredményezett (privát kulcs expozíció .

Az RC4 valószínűleg a legjobb megoldás. A nem megfelelő használat a WEP problémáinak oka, ami azt sugallja, hogy bonyolult a szakértők számára is. A megfelelő használatához azt jelenti, hogy elég nagy (legalább 128 bites) kulcsot választunk, a kulcsot és a IV-et biztonságos módon (például a haszást a kötéshez képest) választjuk ki, és elvesznek a kulcsfolyadék kezdeti részét a gyenge szintű támadások (256 oktettek). Az EB SECURITY egyszerűen úgy definiálható, mint: ez egy sor
eljárások, gyakorlatok és technológiák a megbízható, kiszámítható működésű webszerverek, webböngészők, más programokat, amelyek kommunikálnak a webszerverekkel, és a
a környező internetes infrastruktúrát [1]. A biztonság nem szól meglepetés, valójában a biztonság ügyel arra, hogy a rendszer viselkedjen arra számítunk, hogy viselkedik. A webes biztonsági szempontból, két olyan szervezet létezik, akiknek van ilyen várakozásuk, (a) Felhasználók
és (b) szerverek. A felhasználók arra számítanak, hogy a kiszolgáló folytatja szolgáltatását
hogy a kiszolgálónak átadott információkat változatlanok maradnak, és azokat nem osztják ki azoknak akinek a felhasználók (adat-tulajdonosok) nem akarják azt elosztani. A felhasználók azt is elvárják, hogy a kiszolgáló, amelyhez csatlakoznak, nem gazember szerver. A kiszolgálók elvárják, hogy a végfelhasználó rendszere biztonságos és mentes a vírusoktól, hogy ez ne károsítsa a kiszolgálót. Azt is elvárják, hogy a felhasználó engedélyezett felhasználó legyen, és nem
valaki, aki álarcos, hogy engedélyezett legyen. felhasználók és a Server mindketten elvárják, hogy a kapcsolat közöttük nem lehet könnyen megzavarni és a kommunikációt ők mentesek a lehallgatástól.
Miért van szükség a webes biztonságra, a legjobban érthető a gondolkodás a célokról. A következőkben vannak a webes biztonsági célok arra késztetett bennünket, hogy gondoljunk a titkosításra Hitelesítés: Ez a biztonsági intézkedés, amely ellenőrzi a üzenetforrást, és igazolja, hogy az egyén az akinek állítása szerint Engedélyezés: a felhasználó által engedélyezett jogosultságokra koncentrál tennie. A felhasználó hitelesítése után a biztonságos rendszernek meg kell felelnie azt is eldönti, hogy milyen kiváltságokkal rendelkezik Nem visszautasítás: Biztos, hogy a az információ a kézbesítés igazolásával és a  címzett igazolja a feladó személyazonosságát, így később sem tagadhatja, hogy feldolgozta az információkat Titoktartás: Biztosítja, hogy az illetéktelen személyek,
folyamatok vagy eszközök nem férnek hozzá egy darabhoz információk  Integritás: A biztonsági rendszerekben az integritás biztosítja, hogy a az adatok pontossága és hogy nem tartalmaz jogosulatlan adatokat módosításokat. Elérhetőség: Az elérhetőség azt jelenti, hogy a rendszereknek meg kell felelniük a megfelelő időben hozzáférhetővé téve ezeknek a rendszereknek a rendelkezésre bocsátását érték. Nyomon követhetőség és auditálás: az egyik kulcs a helyreállításhoz
a támadásról tudni kell, hogy ki tette, mit, és mikor tették. Elrettentő irányításként is működik, mert tudta, hogy létezik az elszámoltathatósági rendszer bizonyos esetekben visszatarthat potenciális támadók Néhány passzív és aktív hálózati támadások , amelyeket meg kell oldani a felhasználással
titkosítás: Lehallgatás: A támadó hozzáférést biztosít a hálózatot, hogy "bejusson" vagy értelmezze (olvassa) a forgalmat. Ez általában a legnagyobb biztonsági probléma, amellyel egy vállalkozás. Erős titkosítási szolgáltatások nélkül a titkosítást illetően az adatok mások által olvashatók, ahogy halad
a hálózatot. Adatmódosítás: A támadó az adatokat átmásolja a hálózat a feladó vagy a vevő tudta nélkül. Identity Spoofing: A támadó speciális programokat használ olyan IP-csomagok létrehozása, amelyek úgy tűnik, hogy érvényesek címek, amikor a valóságban hamis. Denial-of-Service: a szolgáltatásmegtagadási támadás megakadályozza a a rendszer érvényes felhasználók által.
Man-in-the-Middle: Középső támadás történik amikor valaki és az a személy, akivel vagy a kommunikáció aktívan figyeli, rögzíti, és kommunikációjának átlátható ellenőrzése. Man-in-A semmi közepén a támadások olyanok, mint valaki, aki beazonosítja a személyazonosságát hogy olvassa el az üzenetet. A másik végén lévő személy lehet hisz te vagy, mert a támadó lehet aktívan válaszolva, hogy tartsa meg a csereprogramot és nyerjen többet információ.

https://pdfs.semanticscholar.org/187d/26258dc57d794ce4badb094e64cf8d3f7d88.pdf

http://www.ief.uni-rostock.de/basoti/material/basoti2013/cc/Ahrens_part3.pdf