log analizáló pythonban (valójában a TDD alapjaival ismerkednék)
Van-e köztetek valaki, aki tudna segíteni abban, hogy belekezdjek az OOP + TDD témák gyakorlati kipróbálásába?
Az elképzelésem, hogy python2.7-ben összerakok egy minimalista tűzfal logot analizáló scriptet, ami az openwrt/tomato routerek logjában megjelenő üzenetekből tud kiszedni bizonyos infókat.
És itt most a log analizálása csak ürügy, hogy kicsit életszerűbb példa legyen, mint a különböző tutorialokban látható, "autó ojjektum, ennek vannak tulajdonságai, alkatrészei etc...", mert ez utóbbi alapján kicsit nehezemre esik valós problémákat megoldani.
Ugyan valaha foglalkoztam programozással, de amit csináltam, azt manapság "code monkey" néven szokás emlegetni, programtervezést nem tanultam, nem csináltam soha. Szóval érdekes lesz, na... :)
Az alap elképzelés egy paraméterezhető program, ami kiválogatja a syslogból az iptables által generált sorokat és a paraméterek alapján gyárt kimenetet.
Paraméterezhető szűrőfeltételek:
- eldobott (DROP), elfogadott (ACCEPT) csomagok
- protokoll (tcp, udp, icmp, egyéb)
- protokollon belül, ha lehetséges, port
Kimenet:
- legtöbb találat IP alapján csoportosítva
- legtöbb találat portok alapján csoportosítva (melyik portokra jött a legtöbb találat)
Ez procedurális alapokon pár óra alatt összedobható volt, csak miután kipróbáltam, megkaptam az eredményeket, egy laza mozdulattal töröltem az egészet.
Sajnos már az elején elakadtam, mert fogalmam sincs, hogy lehetne ezeket a feladatokat objektumokra szétszedni.
Szóval ha akadna valaki lelkes segítő (nem a pythonos, hanem az elméleti részben), akkor folytatom.
Illetve még az is gondot okoz, hogy egyáltalán egy ilyen téma belefér-e még a fórum kereteibe?
■ Az elképzelésem, hogy python2.7-ben összerakok egy minimalista tűzfal logot analizáló scriptet, ami az openwrt/tomato routerek logjában megjelenő üzenetekből tud kiszedni bizonyos infókat.
És itt most a log analizálása csak ürügy, hogy kicsit életszerűbb példa legyen, mint a különböző tutorialokban látható, "autó ojjektum, ennek vannak tulajdonságai, alkatrészei etc...", mert ez utóbbi alapján kicsit nehezemre esik valós problémákat megoldani.
Ugyan valaha foglalkoztam programozással, de amit csináltam, azt manapság "code monkey" néven szokás emlegetni, programtervezést nem tanultam, nem csináltam soha. Szóval érdekes lesz, na... :)
Az alap elképzelés egy paraméterezhető program, ami kiválogatja a syslogból az iptables által generált sorokat és a paraméterek alapján gyárt kimenetet.
Paraméterezhető szűrőfeltételek:
- eldobott (DROP), elfogadott (ACCEPT) csomagok
- protokoll (tcp, udp, icmp, egyéb)
- protokollon belül, ha lehetséges, port
Kimenet:
- legtöbb találat IP alapján csoportosítva
- legtöbb találat portok alapján csoportosítva (melyik portokra jött a legtöbb találat)
Ez procedurális alapokon pár óra alatt összedobható volt, csak miután kipróbáltam, megkaptam az eredményeket, egy laza mozdulattal töröltem az egészet.
Sajnos már az elején elakadtam, mert fogalmam sincs, hogy lehetne ezeket a feladatokat objektumokra szétszedni.
Szóval ha akadna valaki lelkes segítő (nem a pythonos, hanem az elméleti részben), akkor folytatom.
Illetve még az is gondot okoz, hogy egyáltalán egy ilyen téma belefér-e még a fórum kereteibe?
Először is válaszd szét a
Mit csinálna az alkalmazás?
- adatokat olvas be, amelyeket parsolni kell
- különféle módon szűrni kell az adatokat
- aggregált értékeket kell számolni
- a végeredményt ki kell írni
Ez a négy felelősség rögtön legalább négy interfészt meghatároz, valamint szükség van egy adathordozó szerepet betöltő osztályra is.
Nem tudom, mondjam-e tovább, lehet már ez is sok, de lehet, hogy csak még jobban összezavartalak. Inkább kérdezz.
Köszi, nem zavartál össze
Mára kivonom magam a forgalomból, holnap megpróbálom leírni az első pár gondolatot, ahogy nekiesnék az egésznek (Ez majd ott indul, hogy paraméter feldolgozás - amíg nincsenek paramétereim, addig úgysem tudom, mit kell feldolgozni és hogyan)
Érdekes... a fotózásban is a kompozíció volt mindig a fő problémám. Itt is valami hasonló :)
egy laza mozdulattal töröltem
- használj valamilyen verziókezelőt (pl.: git, mercurial)
- még jobb, ha nem csak a saját gépeden van a kód (pl.: github, bitbucket)
Félreértesz: szándékosan
Arra lett volna jó, hogy demonstráljam, hogy nem szabad szkriptet írni. :)
Egyébként itt az újraírás borzalmainak nyomát még megtalálod: https://github.com/haa-zee/ :)
Csak félbehagytam már az elején és most jött rám, hogy újra kellene kezdeni :)
OOP?
(Nagy mennyiségű) adat feldolgozására inkább a funkcionális paradigmát szokták ajánlani.
Nem a problémát akarom
És ez akadt a kezembe, mint számomra hasznos/érdekes, mégis egyszerű feladvány.
Arra próbáltam célozni, hogy
Gyakorlás még nagyon messze
Életszerűbb lenne, ha mondjuk
Itt alkalom nyílik egy pici OOP-re öröklődésre:
# ...
class TomoritettNaploOlvaso(NaploOlvaso):
# ...
Meg egy kis design patternre, hogy factory példányosítsa az olvasót, annak függvényében, hogy éppen milyen állományt kell feldolgozni.
Illetve a komolyabb napló feldolgozók szoktak olyant is tudni, hogy ha fél órája már feldolgoztattad a napló állományt, akkor most csak az utolsó fél órát dolgozza fel, a régebbi adatokat pedig előkapja valami gyorsítótárból.
Ahol a gyorsítótár egy újabb bemenet illetve kimenet típus, amely ugyanazokkal az adatokkal dolgozik, csak picit másképp. Tehát lehetőséget ad újabb adag öröklődés beiktatására.
Mondjuk a rotate nem annyira
Mondjuk a rotate nem annyira
Én úgy értettem, hogy rotate-en már átesett állományok feldolgozására is készítsd fel az elemző szkriptedet. Valami ilyesmi:
Nem gáz, pillanatnyilag egy
Update: ez a kód nincs ellentétben a S.O.L.I.D. L betűjével?
(A leszármazott szerintem nem használható a szülő helyett)
A leszármazott szerintem nem
Ha jól értem azt az L betűt,
Itt viszont nem ez a helyzet, mert a leszármazottnak kötelezően tömörített inputot kell biztosítani, míg a szülő kizárólag plain texttel dolgozik.
(Nekem az a meglátásom, hogy
Az alábbi kódrészletben hol szeretnéd helyettesíteni a NaploOlvaso osztályt TomoritettNaploOlvaso osztállyal? Sőt, egyáltalán honnan tudod, hogy hol melyik van használva?
Ez csak a factory pattern, ha
Én úgy emlékszem (nem kizárt, hogy rosszul vagy rosszul értelmezem), hogy az utódnak mindig azonos működést kell produkálnia a szülő helyére helyezve.
Magyarán, ahol a NaploOlvaso típusú objektum használható, ott a TomoritettNaploOlvaso is használható kellene, hogy legyen és ez itt nem teljesül, mert tömörítetlen állománnyal hibára fut a Tomoritett...
Hát az „azonos működés”
Nekem az a meglátásom, hogy
Szépek az ilyen elvek, elméletek, de szerintem ezek csak bizonyos problémáknál hatékonyak. Ráadásul soknál még az alapokban sem tudnak megegyezni a használóik, lásd OOP és unit testing stb.
Egyelőre lezárva...
(már ott megakadtam, hogy a paraméterek feldolgozását hogyan lehetne egyrészt objektum orientáltan megoldani az argparse modul segítségével, másrészt - ez lett volna a fontosabb - hogyan és milyen unit teszteket írhatnék hozzá)
a paraméterek feldolgozását
:) Azért köszi.
Azért köszi.
Apropó: jól értem, hogy nem foglalkozol pythonnal, csak doksiból szedted össze az ehhez szükséges infókat?
jól értem, hogy nem
Ugyan kissé offtopic, de a
Utóbbi, ha jól értem, arról szól, hogy egy "gyerek" objektumnak a szülő helyén épp úgy kell viselkednie, mintha a szülő osztályából létrehozott objektum lenne.
(erre szokták hozni a kör és az ellipszis példáját, ha jól emlékszem: geometriai szempontból a kör egy speciális ellipszis, OOP szempontból viszont az ellipszist kell úgy megalkotni, mint a kör osztály leszármazottját)
És ez nagyon nem tiszta: ha a szülő egy metódusát felülírom, akkor az objektum már nem fog ugyanúgy viselkedni, mintha a szülő objektum/osztály lenne...
(rémlik, hogy pár hónapja, talán éve már értetlenkedtem e témában, de nem találom azt a beszélgetést :( )
update: http://stackoverflow.com/questions/1735137/liskov-substitution-principle-no-overriding-virtual-methods - ez ugyan nem én voltam, de kb. válaszol a problémámra.
A kör-ellipszis (vagy
Elvileg ezek épp az LSP,
Emberi logikával az ember úgy állna hozzá, hogy készít egy téglalap/ellipszis osztályt és abból származtatja a négyzetet/kört. Csakhogy ezzel megsérti a LSP-t, ezért meg kell fordítani és négyzetből/körből kell származtatni a téglalapot/ellipszist.
Úgy halványan értem, miről van szó, de a gyakorlati problémáimra képtelen vagyok ráhúzni ezeket az ismereteket.
Ezért is jutottam végül oda, hogy inkább feladom egyelőre.
Egészen odáig nincs gond ezekkel, míg csak újabb metódusok/változók hozzáadásával bővítem a szülő osztályt. Viszont ha már képbe kerül a metódusok felülírása... na azt nem vagyok képes élő példával összehozni.
SRP - ez még belefér?
Voltaképp csak egy igen/nem válaszra lenne szükségem, magyarázatra csak akkor, ha már nagyon értetlenkedek. ;)
Azon töröm a fejem, hogy a SRP-be belefér-e, ha egy osztályt úgy készítek el, hogy a feladata: végigmenni egy paraméterként kapott fájl objektum sorain _és_ a sorok közül kiválogatni a szintén paraméterként kapott regexp-nek megfelelő sorokat _és_ a beolvasott text helyett egy objektumot visszaadni, ami a szintén paraméterként kapott parser objektum által áll elő.
Én úgy érzem, hogy a sok "_és_" miatt nem, ugyanakkor össze tudom foglalni egy feladatként is: parse-olni a kapott mintára illeszkedő sorokat.
Mindezt iterátorként.
Kicsit életszerűbb példával: például kernel logot kell végigolvasni, abból kiszűrni az iptables sorait és a sorokból objektumot gyártani a sima text helyett.
(update: így utólag visszaolvasva nem sikerült pontosan megfogalmaznom, hogy mi bajom, de értelmesebben egyelőre nem tudom... Talán estére sikerül összedobni egy olyan kódrészletet, amiből már látszani fog, hogy mi bajom)
Kicsit életszerűbb példával:
Na ez az egyik dolog, amin
Igen, visszaadok egy adatsort. De a visszaadott adatoknak is van formátuma. Megtehetem, hogy egy (akár injektált) objektum végez valamit a visszaadott adatsoron, megtehetem, hogy feldolgozatlan sorokat adok vissza stringként (de ebben az esetben már a szűrő feltétel használata is kérdéses, hogy belefér-e) stb.
Ezt most mobilról, hogy el ne felejtsem, majd este próbálok kicsit értelmesebben is...
upd: LogIterator.py
Talán így érthetőbb, mit akartam.