Egy egykori rendszergazda játszadozása a pythonnal

Pythonkodó

Pythonkodó

wifi analizáló izé linuxra :)

2015. június 09. - pythonozok

Régen volt egy jópofa, ingyenes program windows-ra: InSSIDer. Sajnos a 3-as verziót már lebutították, a 4-est meg fizetőssé tették. Keresgélni kezdtem, de sokáig nem találtam olyan megoldást, ami nekem is megfelelt volna. Aztán egy szép napon ráakadtam a linuxos horst-ra. (horst, mint Derrick alias Horst Tappert :) )

Ahhoz képest, hogy milyen kicsi, elég sokat tud, csak picit fapados. Különösen az indítása. Az én gépemen úgy működik, hogy...
- pendrive-ról indítok egy ubuntut, amire telepítettem a programot- a network managerben lekapcsolom a wifit, majd

rfkill list
# amelyik eszközt szoftveresen tiltottnak mutat (nálam 1 és 3, a 2. a BlueTooth, arra nincs szükség)rfkill enable <sorszám>

iwconfig wlan0 mode monitor
ifconfig wlan0 up

Ha ez megvan, akkor indulhat a horst. Valahol láttam egy leírást, hogy aktív wifi kapcsolat mellett is kivitelezhető. Ehhez kell egy alias a wlan0-ra, de most lusta vagyok utánajárni.

való világ és társai közönsége

Offtopic, de nincs kedvem külön blogot indítani csak ezért. 

A hazai netet nézegetve kikerülhetetlenül az arcunkba tolják ezt a mocskot. O.K., kattintás vadászat. De... mi vihet rá humanoid lényeket arra, hogy  ezeket nézzék, mi több, naponta, akár órákon át csámcsogjanak rajta? Tényleg ennyi buta emberféleség él közöttünk? Port.hu, comment.blog.hu és még ki tudja hány hely, ahol ezek a szerencsétlen pletykagépek összegyűlnek és kibeszélik, hogy  BV Döncike hogy szopta le BV Józsikát és jujj micsoda erkölcsi fertő... 

Finito...

Nagyobb terveim voltak ezzel a bloggal. No nem nagyobb forgalomra számítottam, mert eleve magamnak kezdtem írni, hogy ne felejtsek el dolgokat, de reméltem, hogy hosszabb ideig folytatom, heti egy-két poszttal. Sajnos most eljutott a szemem romlása arra a pontra, hogy kénytelen vagyok feladni a programozgatást is...  :(

Ha valami csoda történne és mégis tudom folytatni, legfeljebb törlöm ezt a posztot.

Eclipse+pydev kódkiegészítés

Sajnos a pydev e téren... hát finoman szólva nem tökéletes. A példányváltozókkal valamiért nem boldogul. Hiába próbáltam a sok helyen javasolt ú.n. "type hinting" használatát, az értékadás után elhelyezett assert isinstance(...)-t, nem akart működni. (gyk: példányváltozó alatt a "self.x" formában megadott változókat értem)
Többnyire nincs velük gond, de a szerkesztés alatt álló forrásfájlban nincs közvetlen értékadás elhelyezve, hanem paraméterként érkezik egy objektum valahonnan kívülről, akkor nem működik a kódkiegészítés.

Példa:

import Tkinter

class A(Object):
  def __init__(self, parameter):
    '''
    @type parameter: Tkinter.Button
    '''
    self.valtozo=parameter

 

A fenti példában a következő sorba írva ezt:
    parameter.
majd a pont után ctrl-space kombinációt nyomva, kapok egy listát a Tkinter.Button osztály metódusairól, publikus attribútumairól stb., ahogy elvárható. De... ha a parameter helyett azt írom, hogy "self.valtozo." (természetesen idézőjelek nélkül) és úgy nyomom a ctrl-space-t, akkor már nem kapok listát, max. abban az esetben, ha az osztály forráskódján belül valahol már elejtettem hivatkozást a "self.valtozo" valamely elemére, mert azokat fel tudja ajánlani.
Egy elég gusztustalan "megoldást" találtam ki a probléma megkerülésére: létre kell hozni az osztályon belül egy metódust, ami sohasem fut le, abban a példányváltozónak olyan értéket adni közvetlenül, amilyen típusú az valójában lenne és voilà! :)

  def just_for_pydev_code_completion(self):
    raise Exception("Just for pydev (not to use)!")
    self.valtozo=Tkinter.Button()

Ha ennyivel kiegészítem a fenti osztálydefiníciót, akkor a pydev máris tudni fogja, hogy a self.valtozo a Tkinter.Button osztály egy példánya. Háááát... ha valaki tud jobb, kulturált(abb), működő(!!!) megoldást, nyugodtan szóljon! A stackoverflow-n talált ötleteket végigpróbáltam, a fenti variációra egyik sem működött.

Update: Rosszabb a helyzet, mint hittem... :( A forrásfájlban bárhol hivatkozom egy "self.xxx" változóra úgy, hogy látszólag egy osztály új példányát adom neki értékül, a pydev minden osztályon belül úgy fogja kezelni a self.xxx változót, mintha az adott osztály egy példánya lenne. Magyarán ha egy másik osztályban is használok self.xxx-t valami egészen más céllal, akkor is úgy fog viselkedni, mintha...

Ugyan nem python, csak nohup + strace

Korábban sohasem próbáltam strace-t futtatni úgy, hogy akár órákon, napokon át fusson a háttérben. Én kis naiv, azt képzeltem, hogy strace-t bedobom egy szkriptbe, majd a szkriptet nohup segítségével indítom, akkor az futni fog akkor is, ha kilépek:

nohup ./szkript.sh &

Jéééé, de fura... elindul, háttérben fut, de amint kilépek abból a login shellből, amiből indítottam, megszűnik a strace is, mi több, ha a szkriptből is backgroundként indítottam:

strace ... &
sleep 10000
kill $(pidof strace)echo "---- vege ----"

akkor a fölötte futó szkript is kihalt nyom nélkül. Hmmm... A megoldás: a strace rendelkezik egy -I kapcsolóval. Ha ez kap egy 4-es értéket, akkor már nyugton marad. :)

update: azért ennyire nem szép a helyzet, ugyanis a futtatásra használt szkript így is megszűnik, amint kilépek, holott ha valami semleges processzt, pl. sleep-t indítok nohup-pal, akkor megmarad. Érdekes... Persze lehet, hogy csak a routeremen futó szoftver hülyeségéről van szó, "normális" linuxon még nem próbáltam.

PyCharm

Egy viszonylag kellemes kis fejlesztői környezet (IDE) lenne, bár ritkán használom. Elsősorban egy virtuális gépen futó linuxon használom az Eclipse+PyDev duót. Azért néha, amikor épp windows-on játszadozom és az IDLE már kevésnek tűnik, akkor elő szoktam venni. De van vele egy nagy gondom: boot után iszonyatosan lassan indul el. Ha valaki erre jár és van ötlete, hogy mi okozza ezt az embertelen lassúságot, kérem, ossza meg velem!

Neten láttam hasonló panaszokat, választ nem igazán találtam. Az első indítás lassúságára jellemző: i5-2520M proci, 8G RAM, Samsung 840PRO SSD van alatta, az első klikk után, a log szerint kb. másfél perc, mire elindul. A "projekt", amit megnyit, tartalmaz kb. 50-60 darab, átlagban 20-30 soros python szkriptet. Mikor egyszer már elindult, a kilépés, újraindítás már elfogadható sebességű. Fura. Még furább, hogy ha másik userből indítom először, majd kilépek a programból és a userből is, másikkal bejelentkezem, már akkor is normál sebességgel indul. Mintha valamiféle service-ek indulnának először és ezek lassítanák az első indítást. Általam telepített plugin nincs benne. Érthetetlen.

 

update 2015-01-12: no, úgy fest, azért nem ennyire sötét a helyzet. Mégis van néhány plugin, csak ezeket a default telepítés hozza magával. Mivel minden egyes próba egy komplett windows reboottal jár, nincs kedvem kísérletezni, de a felesleges pluginek (úgymint: CVS Integration, hg4idea, IPython Notebook(!! ez különösen gyanús), Subversion Integration) letiltását követően már villámgyorsan elindul.A Notebook azért gyanús, mert az valóban egy szervert indít és könnyen el tudom képzelni, hogy annak a szervernek az elindítása tart sokáig – esetleg a tűzfalam beállításai miatt.Eddig tartott az örömöm. Az előbb letiltottam az itt felsorolt plugineket, reboot és a Pycharm villámgyorsan indult. Most kiléptem belőle és pár percre rá újra elindítottam, erre ismét másfél perc volt mire feléledt. Feladtam.

super vs Tkinter osztályok

Úgy tűnik, a Tkinter osztályai (legalábbis egy részük – pl. a Button) nem az új stílushoz tartoznak. Az új ("new style classes") őse/szülője az Object osztály kell, hogy legyen. A réginek nincs ilyen őse:

class NewStyle(Object):
    pass

class OldStyle:
    pass

 

Arra a következtetésre jutottam, miután egy a Tkinter.Button-ból származtatott osztály __init__ metódusából nem tudtam a super() segítségével meghívni az eredeti Button konstruktorát, hogy valószínűleg a Button "old style class".
A neten keresgélve találtam, hogy a kapott hibaüzenet oka, hogy a hivatkozott osztály régi stílusú, bár 100%-ig biztos nem vagyok benne.

Vajon még hányszor fogom a konstruktort "iniciátor"-ként emlegetni, keresni? :)

Sérült profil 2. rész

Azt hiszem, ezt nem fogom befejezni. A jelenlegi állapottal is le-lefagy a firefox, aminek nem tudom a tényleges okát, de gyanítom, hogy valamelyik adatbázisa lehet sérült. Így viszont, jobb ötlet híján maradok annál, hogy veszni hagyom a history-t, a könyvjelzőket a mentésből töltöm be, egyedül a user-jelszó párosok tárolásával kapcsolatos fájlokat tartom meg (key3.db, logins.json, signons.sqlite)

 

Sérült firefox profil barkácsolás 1. rész

Windows-omon kicsit megkergült a firefox, megsérült a profil, elveszett a history. Régi mentésből próbálom visszahozni a még menthető adatokat. Program itt: https://github.com/haa-zee/python-sandbox/blob/master/probak/dbteszt.py

Röviden összefoglalva: a places.sqlite-ból eltűnt a moz_historyvisits tartalma. Ennek egy része megvan egy régebbi mentésben, de kissé bizonytalan voltam, hogy a mentésben lévő id-k és a sérült adatbázisban lévők azonos url-t takarnak-e. Erre írtam a fenti programocskát. Paraméterként megkapja a két adatbázist, kiszedi belőlük az id,url párosokat, végül összehasonlítja, hogy az azonos id valóban azonos url-t jelent-e. (igen, úgy tűnik, valóban azonos mind)

Mielőtt valaki komplett hülyének nézne, hogy egy ilyen egyszerű feladat kedvéért pythonnal kezdtem töketlenkedni, megjegyezném, hogy tudtommal a sqlite kliens (sqlite3/sqlite3.exe) egyszerre csak egy adatbázissal tud dolgozni, én meg, mivel a sqlite nem tartozik az ismerős RDBMS-ek közé, nem akartam táblánkénti export/importtal szórakozni, különösen, hogy a jelek szerint az sem mindegy, milyen verziójú FF-hoz tartozott utoljára az adatbázis. (stackoverflow-n láttam valahol erre utaló jelet)

 

Python, eclipse, sqlite együtt

No, in medias res... Eclipse + pydev párosítással szórakozom egy ideje. Ma belefutottam egy ocsmány dologba. Sqlite adatbázisokat akartam használni, de az eclipse makacsul ragaszkodott hozzá, hogy az importált sqlite3 modulban nincs connect nevű függvény/metódus/osztály/etc.

Némi keresgélés után a stackoverflow-n találtam rá a megoldásra: a Window->Preferences->PyDev->Interpreters->Python Interpreters alatt fel kellett venni a "Forced Builtins" alá az sqlite3 modult.

 

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