From fadebdfacf1449163f199d905448c2b88f97bdb8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?B=C3=A1lint=20R=C3=A9thelyi?= <rethelyibalint@gmail.com>
Date: Mon, 7 Mar 2022 12:27:11 +0100
Subject: [PATCH] elso feladat

---
 README.md              | 115 +++++++++++++++++++++++++++++++++++++++++
 dns_tool.py            |  19 +++++++
 dns_tool2.py           |  34 ++++++++++++
 main.py                |  16 ------
 solutions/1_feladat.md |  75 +++++++++++++++++++++++++++
 5 files changed, 243 insertions(+), 16 deletions(-)
 create mode 100644 README.md
 create mode 100644 dns_tool.py
 create mode 100755 dns_tool2.py
 delete mode 100644 main.py
 create mode 100644 solutions/1_feladat.md

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f56cf23
--- /dev/null
+++ b/README.md
@@ -0,0 +1,115 @@
+# Python mĂŠrĂŠs
+
+## 1. Feladat - Bemelegítő gyakorlatok
+
+A következő részfeladatok célja bemutatni a Python alapvető szintaktikai elemeit és a nyelv használhatóságát, 
+lehetőségeit. 
+
+A Python nyelvvel való ismerkedéshez célszerű először egy elszeparált környezetet kialakítani, amiben kedvünkre 
+telepíthetünk különböző verziójú csomagokat anélkül, hogy azok összeakadnának a globális Python csomagokkal. Ezáltal 
+rendezetten és elszeparáltan tarthatóak a globális rendszercsomagok és egy könnyen menedzselhető, virtuális környezetet 
+kapunk. Ehhez telepítenünk kell a `virtualenv` Python csomagot a `pip3` csomagmenedzselő segítségével. Ha a `pip3` nincs 
+telepítve, először adjuk ki a `$ sudo apt-get install python3-pip` parancsot a pip3, majd a 
+`$ sudo pip3 install virtualenv` parancsot a `virtualenv` telepĂ­tĂŠsĂŠhez.
+
+A virtuĂĄlis mĂŠrĂŠsi kĂśrnyezet lĂŠtrehozĂĄsĂĄhoz adjuk ki a `$ virtualenv py-meres` parancsot. Ekkor lĂŠtrejĂśn egy mappa benne 
+a szükséges futtatható Python állományokkal és a `pip3` csomagmenedzselő függőségeivel. Alapértelmezetten a globálisan 
+telepített külső csomagok nem kerülnek linkelésre, így minden a Python standard könyvtárában nem szereplő függőség külön 
+telepítendő, ha szükséges.
+
+Dolgozzunk a lĂŠtrejĂśtt `py-meres` mappĂĄban. Minden rĂŠszfeladatot, ahol egy szkript fĂĄjlt kell kĂŠszĂ­teni, egy kĂźlĂśnĂĄllĂł 
+`.py` kiterjesztĂŠsĹą fĂĄjlban oldjuk meg!
+
+A virtuális környezet aktiválásához adjuk ki a mappában a `$ source bin/activate` parancsot. Ekkor a prompt elé bekerülő 
+nĂŠv jelzi, hogy melyik kĂśrnyezetben dolgozunk.
+
+KĂśrnyezet deaktivĂĄlĂĄsa: `$ deactivate`
+
+Ellenőrizzük, hogy elérhető-e a megfelelő Python verzió (>= 3.5.x): `$ python3 --version`.
+Ha a használt Python verzió nem **3.x**, akkor állítsuk be: `$ virtualenv –p /usr/bin/python3 py-meres`
+
+```bash
+czentye@ThinkPad-L470:~$ virtualenv py-meres
+created virtual environment CPython3.8.5.final.0-64 in 471ms
+  creator CPython3Posix(dest=/home/czentye/py-meres, clear=False, no_vcs_ignore=False, global=False)
+  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/czentye/.local/share/virtualenv)
+    added seed packages: pip==21.0.1, setuptools==52.0.0, wheel==0.36.2
+  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
+czentye@ThinkPad-L470:~$ cd py-meres/
+czentye@ThinkPad-L470:~/py-meres$ source bin/activate
+(py-meres) czentye@ThinkPad-L470:~/py-meres$ python3 -V
+Python 3.8.5
+(py-meres) czentye@ThinkPad-L470:~/py-meres$ 
+```
+
+FONTOS! Importálási hibák elkerülésére figyeljünk a következőkre:
+
+- VirtuĂĄlis kĂśrnyezetben tevĂŠkenykedĂŠshez ne felejtsĂźk el aktivĂĄlni a kĂśrnyezetet!
+- Külső Python csomag virtuális környezetbe telepítésénél ne használjunk rendszeradmin jogosultságot, mert a csomag 
+abban az esetben a globális Python csomagok közé telepítődik, amelyek alapértelmezetten nem linkelődnek a virtuális 
+kĂśrnyezetĂźnkbe! TehĂĄt `$` ~~sudo~~ `pip3 install ...`
+- Python szkriptet (amit virtuĂĄlis kĂśrnyezetben futtatunk) ne a szokvĂĄnyos `#!/usr/bin/python3` shebang sorral kezdjĂźk, 
+hanem a rugalmasabb és esetünkben fontos `#!/usr/bin/env python3` sorral. Ez előbbi esetben ugyanis közvetlenül a 
+globĂĄlis Python interpretert jelĂśljĂźk ki, ami nem lĂĄthatja a virtuĂĄlis kĂśrnyezetbe telepĂ­tett csomagjainkat. Az utĂłbbi 
+sorral az env programot hĂ­vjuk meg, ami jelen esetĂźnkben mĂĄr a virtuĂĄis kĂśrnyezetbe linkelt Python interpretert fogja 
+meghívni. Erről magunk is megbizonyosodhatunk, ha meghívjuk a `$ which python3` parancsot, ami a virtuális környezeten 
+kĂ­vĂźl a `/usr/bin/python3` Ăştvonalat, mĂ­g aktivĂĄlĂĄs utĂĄn a `/home/user/py-meres/bin/python3` Ăştvonalat adja vissza.
+
+## 1.a Feladat - InteraktĂ­v mĂłd 
+
+IndĂ­tsuk el az interpretert a `$ python3` paranccsal. Az interpreter ĂŠrvĂŠnyes Python kifejezĂŠseket vĂĄr, amelyeket 
+megadĂĄs utĂĄn azonnal feldolgoz ĂŠs az eredmĂŠnyt (minden Python kifejezĂŠsnek van eredmĂŠnye!) kiĂ­rja a konzolra.
+Interpreterből kilépéshez használható az `exit()` függvényhívást, vagy a kényelmesebb **CTRL + D** billenytűkombinációt 
+(EOT - end-of-transmission karakter).
+
+**Feladat:** A Python nyelv gyakran használt tudományos és matematika algoritmusok implementálására. Írassuk ki 
+mĂŠrfĂśldben 3 tizedes jegy pontossĂĄggal egy fĂŠlmaraton hosszĂĄt az interpreter segĂ­tsĂŠgĂŠvel!
+
+- Az arĂĄnyossĂĄgi adatokat tĂĄroljuk vĂĄltozĂłkban: fĂŠlmaratoni tĂĄv - 21097,5 m; 1 mĂŠrfĂśld - 1,6093 km
+- Lebegőpontos típusnál tizedes pontot használjunk (`3.14` és nem `3,14`)!
+- KĂŠplet: (tĂĄv(m) / 1000 ) / arĂĄny (km/mil)
+- KiĂ­ratĂĄsra hasznĂĄljuk a print() fĂźggvĂŠnyt ĂŠs sztring formĂĄzĂĄshoz a `format()` fĂźggvĂŠnyt (float tĂ­pus `-f` karakter, 
+formĂĄtum (link) a segĂŠdletben) 
+
+**Érdekesség:** Figyeljük meg a lebegő pontos értékek kerekítési tulajdonságát az eredeti és a 3 tizedes pontosságal 
+kiĂ­rt eredmĂŠnyen! 
+([Floating Point Arithmetic: Issues and Limitations](https://docs.python.org/3.5/tutorial/floatingpoint.html))
+
+## 1.b Feladat - Külső modul használata 
+
+**Feladat:** Írassuk ki a *google.com* (nem kell a *www* elé!) tartománynévhez rendelt levelező szervereket (MX rekord)! 
+
+A DNS rekordok kezelĂŠsĂŠhez hasznĂĄljuk a `dnspython` csomagot. A csomagot a `$ pip3 install dnspython` paranccsal tudjuk 
+telepĂ­teni. A DNS rekord lekĂŠrĂŠsĂŠhez hasznĂĄljuk a `dns.resolver` csomag `query()` fĂźggvĂŠnyĂŠt.
+
+- Használat előtt ne felejtsük el importálni a szükséges csomagot!
+- DokumentĂĄciĂł megtekintĂŠsĂŠhez hasznĂĄljuk a `help()` beĂŠpĂ­tett fĂźggvĂŠnyt. NĂŠzzĂźk meg mind a csomag, mind a fĂźggvĂŠny 
+dokumentĂĄciĂłjĂĄt!
+- A lekĂŠrĂŠsnĂŠl rekord tĂ­pusnak adjuk meg az `'MX'` stringet!
+- A `query()` visszatĂŠrĂŠsi ĂŠrtĂŠke a `dnspython` csomag egy speciĂĄlis objektuma (ami a `dns.resolver.Answer` osztĂĄly egy 
+példánya), ami egyben iterálható is. A bejegyzések kiíratásához járjuk be az objektumot a megfelelő nyelvi elemmel! Ne 
+felejtsĂźk el a behĂşzĂĄst a kĂłdblokk esetĂŠn!
+
+## 1.c Feladat - SajĂĄt DNS modul 
+
+**Feladat:** Hosszabb kódok esetén az interaktív interpreter használata körülményes. Írjunk Python modult `dns_tool.py` 
+néven az előző feladatban megvalósított funkcióhoz!
+
+- [dns_tool1.py.txt](https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/dns_tool1.py.txt): Skeleton szkript az 
+1. feladathoz - NevezzĂźk ĂĄt a fĂĄjlt! 
+
+- A rekordok lekĂŠrĂŠsĂŠt egy kĂźlĂśn fĂźggvĂŠnyben (`get_mx()`) definiĂĄljuk, amely a DNS nevet egy paramĂŠterkĂŠnt kapja meg ĂŠs 
+az eredmĂŠnyeket egy nagy listĂĄba csomagolva adja vissza.
+- Adjunk minimĂĄlis dokumentĂĄciĂłt a fĂźggvĂŠnyĂźnkhĂśz!
+- A rekordtípus opcionálisan legyen megadható a függvénynek (pl. későbbi továbbfejlesztéshez), ami alapértelmezetten az 
+`'MX'` ĂŠrtĂŠket vegye fel!
+- A rekordokat egyenkĂŠnt tuple-ben adjuk vissza: (preferencia, nĂŠv) sorrendben. Az elemekhez az egy darab rekordot 
+reprezentĂĄlĂł objektum `preference` ĂŠs `exchange` attribĂştumĂĄn keresztĂźl fĂŠrhetĂźnk hozzĂĄ. A visszaadott struktĂşra tehĂĄt a 
+következő formátumú: `[(pref1, exch1), (pref2, exch2), ...]`
+- A rekord attribĂştumokat mindenkĂŠppen konvertĂĄljuk string tĂ­pusĂşvĂĄ!
+- Hiányzó válasz vagy nem létező rekord esetén a `query()` függvény kivételt dob, amelyek a `dns.exception.DNSException` 
+leszĂĄrmazottai. KezeljĂźk valamilyen mĂłdon a kivĂŠtelt (akĂĄr minden kivĂŠtel elkapĂĄsĂĄval) ĂŠs ekkor egyszerĹąen tĂŠrjĂźnk 
+vissza egy Ăźres tuple-lal!
+- TeszteljĂźk a most megĂ­rt modulunkat interaktĂ­v mĂłdon (indĂ­tsunk egy Python interpretert, importĂĄljuk be ĂŠs hĂ­vjuk meg 
+a fĂźggvĂŠnyt) ĂŠs nĂŠzzĂźk meg a modul/fĂźggvĂŠny dokumentĂĄciĂłkat is a `help()` fĂźggvĂŠnnyel!
+
diff --git a/dns_tool.py b/dns_tool.py
new file mode 100644
index 0000000..e7e7984
--- /dev/null
+++ b/dns_tool.py
@@ -0,0 +1,19 @@
+from dns.resolver import query
+from dns.exception import DNSException
+
+
+# input: dns name and optional the type of the record and return all the answered data in a list or in case of exception
+# an empty list
+def get_mx(dns_name, type="MX"):
+    try:
+        answers = query(dns_name, type)
+    except DNSException:
+        return []
+    ret = []
+    for a in answers:
+        element = (str(a.preference), str(a.exchange))
+        ret.append(element)
+
+    return ret
+
+
diff --git a/dns_tool2.py b/dns_tool2.py
new file mode 100755
index 0000000..814f738
--- /dev/null
+++ b/dns_tool2.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+from dns.resolver import query
+from dns.exception import DNSException
+
+
+# input: dns name and optional the type of the record and return all the answered data in a list or in case of exception
+# an empty list
+def get_mx(dns_name, type="MX"):
+    try:
+        answers = query(dns_name, type)
+    except DNSException:
+        return []
+    ret = []
+    for a in answers:
+        element = (str(a.preference), str(a.exchange))
+        ret.append(element)
+
+    return ret
+
+
+if __name__ == "__main__":
+    inp = input("Add meg a lekérdezendő domain-t, valamint ha szeretnéd specifikálni, a rekord típusát is szóközzel "
+                "elvĂĄlasztva (az alapĂŠrtelmezett rekord tĂ­pus az MX): ")
+    inp = inp.split(" ")
+    if len(inp) >= 2:
+        list = get_mx(inp[0], inp[1])
+        for e in list:
+            print(e)
+    else:
+        list = get_mx(inp[0])
+        for e in list:
+            print(e)
+
diff --git a/main.py b/main.py
deleted file mode 100644
index 5596b44..0000000
--- a/main.py
+++ /dev/null
@@ -1,16 +0,0 @@
-# This is a sample Python script.
-
-# Press Shift+F10 to execute it or replace it with your code.
-# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
-
-
-def print_hi(name):
-    # Use a breakpoint in the code line below to debug your script.
-    print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.
-
-
-# Press the green button in the gutter to run the script.
-if __name__ == '__main__':
-    print_hi('PyCharm')
-
-# See PyCharm help at https://www.jetbrains.com/help/pycharm/
diff --git a/solutions/1_feladat.md b/solutions/1_feladat.md
new file mode 100644
index 0000000..3b4e8ab
--- /dev/null
+++ b/solutions/1_feladat.md
@@ -0,0 +1,75 @@
+# 1. feladat
+
+## 1.a interaktĂ­v mĂłd
+
+A Python nyelv gyakran használt tudományos és matematika algoritmusok implementálására. Írassuk ki mérföldben 3 tizedes jegy pontossággal egy félmaraton hosszát az interpreter segítségével!
+
+MegoldĂĄs:
+
+```bash
+$ python3
+>>> dist = 21097.5
+>>> dist
+21097.5
+>>> mile = 1.6093
+>>> mile
+1.6093
+>>> dist_in_miles = (dist / 1000) / mile
+>>> dist_in_miles
+13.109737152799354
+>>> print("Distance of a half maraton in miles is: {:.3f}".format(dist_in_miles))
+Distance of a half maraton in miles is: 13.110
+```
+
+## 1.b Feladat - Külső modul használata 
+
+**Feladat:** Írassuk ki a *google.com* (nem kell a *www* elé!) tartománynévhez rendelt levelező szervereket (MX rekord)! 
+
+MegoldĂĄs:
+
+```bash
+$ python3
+>>> import dns.resolver
+>>> answers = dns.resolver.query('google.com', 'MX')
+<stdin>:1: DeprecationWarning: please use dns.resolver.resolve() instead
+>>> for rdata in answers:
+...   print('Host', rdata.exchange, 'has preference', rdata.preference
+...
+Host aspmx.l.google.com. has preference 10
+Host alt3.aspmx.l.google.com. has preference 40
+Host alt4.aspmx.l.google.com. has preference 50
+Host alt1.aspmx.l.google.com. has preference 20
+Host alt2.aspmx.l.google.com. has preference 30
+```
+
+## 1.c Feladat - SajĂĄt DNS modul 
+
+**Feladat:** Hosszabb kódok esetén az interaktív interpreter használata körülményes. Írjunk Python modult `dns_tool.py` 
+néven az előző feladatban megvalósított funkcióhoz!
+
+```bash
+$ python3
+>>> import dns_tool
+>>> help()
+help> dns_tool.get_mx
+Help on function get_mx in dns_tool:
+
+dns_tool.get_mx = get_mx(dns_name, type='MX')
+    # input: dns name and optional the type of the record and return all the answered data in a list or in case of exception
+    # an empty list
+>>> list = dns_tool.get_mx('google.com')
+>>> for e in list:
+...     print(e)
+...
+('40', 'alt3.aspmx.l.google.com.')
+('20', 'alt1.aspmx.l.google.com.')
+('50', 'alt4.aspmx.l.google.com.')
+('10', 'aspmx.l.google.com.')
+('30', 'alt2.aspmx.l.google.com.')
+>>>
+>>> list = dns_tool.get_mx('nemletezik.asd')
+>>> for e in list:
+...     print(e)
+... 
+>>>
+```
\ No newline at end of file
-- 
GitLab