(-: Fibergeek's Blog :-)
Inhoud blog
  • Python 2 of 3
  • IDA-python: GetStructureIdAt
  • Geslaagd in Microsoft's 70-680 examen
  • minibio: kort vervolg
  • miniboa: een voorbeeld
    Zoeken in blog

    Categorieën
  • Code: C/C++ (2)
  • Code: Powershell (1)
  • Code: Python (8)
  • Code: WPF (2)
  • Programmeren (5)
  • 30-11-2013
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.Python 2 of 3
    Ik ben nu al een tijdje aan een project aan het werken, een website geschreven in Python en het Django-framework. Alles loopt goed, maar nu moest ik uitbreidingen doen. Ik maak Excel(XLS)-bestanden) aan via de xlwt-module. Dit werkt goed onder zowel Python 2 als 3. Leuk.

    Nu wil ik echter ook rapporten aanmaken vanuit men webapplicatie. Ik gaf de voorkeur aan PDF-bestanden, maar dat is niet zo makkelijk blijkt echter. Onder Python 2 zijn er opties genoeg, maar de meeste modules werken nog niet onder Python 3. wkhtmltopdf had niet echt mijn voorkeur omdat het via een externe applicatie werkt, maar ik ben er toch voor gegaan. Die applicatie is zowel beschikbaar onder Windows (mijn ontwikkelingomgeving) als Linux (de hostomgeving). Het voordeel van wkhtmltopdf is dat je de Django-template-engine kan gebruiken.

    Maar, ontwerpen van bijvoorbeeld layouts voor facturen, vind ik niet makkelijk in een HTML-editor, dus wkhtmltopdf is een beetje nutteloos in dat geval. Er bestaat ook een Python-oplossing waar bij ODF-bestanden (OpenOffice, LibreOffice) gebruikt worden, de bijhorende Python-module noemt appy. Echter, deze module werkt totaal niet onder Python 3 (getest met Python 3.3). Dus zit ik vast aan de oudere Python 2-serie.

    Tijdens mijn onderzoek naar bruikbare modules voor mijn project ben ik zoveel modules tegengekomen die niet werken onder Python 3, dat ik het eigenlijk beu ben geworden. Aangezien de Linux-host waar men project draait nog met Python 2.6 werkt, ga ik geen verdere tijd steken in het compatibel houden van mijn project met Python 3. Ik vind dat verre van leuk maar het is een keuze die ik moet maken.

    30-11-2013, 19:07 Geschreven door Fibergeek  


    Categorie:Programmeren
    Tags:Python
    09-11-2012
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.IDA-python: GetStructureIdAt

    De onderstaande snippet is de omgedraaide versie van MakeStruct:

    def GetStructureIdAt(ea):
     flags = idaapi.getFlags(ea)
     if isStruct(flags):
      ti = idaapi.opinfo_t()
      idaapi.get_opinfo(ea, 0, flags, ti), "get_opinfo() failed"
      return ti.tid
     return BADADDR

    tid = GetStructureIdAt(ScreenEA())
    print GetStrucName(tid)
    NOTA: de onderstaande versie is compatibel met oudere versies van IDA-python:
    def GetStructureIdAt(ea):
      flags = idaapi.getFlags(ea)
      if isStruct(flags):
        try:
          ti = idaapi.typeinfo_t()
          assert idaapi.get_typeinfo(ea, 0, flags, ti), "get_typeinfo() failed"
        except AttributeError:
          ti = idaapi.opinfo_t()
          assert idaapi.get_opinfo(ea, 0, flags, ti), "get_opinfo() failed"
        return ti.tid
      return BADADDR

    09-11-2012, 00:00 Geschreven door Fibergeek  


    Categorie:Code: Python
    Tags:IDAPython
    11-05-2012
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.Geslaagd in Microsoft's 70-680 examen
    Ik ben geslaagd in het examen over het installeren en configureren van Windows 7.

    Microsoft past zijn links voortdurend aan, maar dit is het huidige link naar het examen : http://www.microsoft.com/learning/en/us/exam.aspx?id=70-680

    Ik vind Microsoft-examens best wel moeilijk. Je kennis moet breed zijn en je moet toch ervaring hebben met hun producten, anders kun je het schudden. Bij het bedrijf waar ik werk, installeer en herstel ik al 7 jaar lang Windows-installaties. Maar wij doen geen Enterprise-beheer. Dus al de zaken die over Windows 7 Enterprise gingen, waren mij nieuw. Ik heb maar één maand gestudeerd voor het examen... Ik heb zelf nooit gewerkt met DirectAccess & BrancheCache. Maar de technologie lijkt met toch knap, hopelijk krijg ik ooit de kans om ze effectief te configureren.

    5 en een half jaar geleden, had ik al eens een Microsoft-examen gedaan (met succes): 70-290, http://www.microsoft.com/learning/en/us/exam.aspx?id=70-290 Voor dat examen had het bedrijf mij op cursus gestuurd. En dat heeft toen zeker geholpen.

    De voorbereiding voor het Windows 7-examen heb ik door middel van zelfstudie gedaan, plus (uiteraard) een test-setup op m'n werk bestaande uit één 1 Windows 2008 R2 Enterprise Server en 2 Windows 7 Enterprise-clients.

    11-05-2012, 00:00 Geschreven door Fibergeek  


    Tags:70-680,Windows 7
    07-03-2012
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.minibio: kort vervolg

    Ok, een korte vervolgblog. Als je de "on_connect" en "on_disconnect" niet override van "miniboa", dan houdt hij zelf de clients bij in een dictionary "clients" en via een functie "client_list". Ik heb mijn servertje dus aangepast om deze lijsten zelf aan te beheren. Ik vind deze versie van de code beter.

    from miniboa import TelnetServer

    class Server(TelnetServer):
     def __init__(self):
      TelnetServer.__init__(self)
     
     def shutdown(self):
      self.server_socket.close()
     
     def run(self):
      while True:
       self.poll()
     
     def poll(self):
      TelnetServer.poll(self)
      for client in self.client_list():
       if client.active and client.cmd_ready:
        self.on_command(client)
     
     def broadcast(self, msg):
      for client in self.client_list():
       client.send(msg + "n")
     
     def register_client(self, client):
      self.client_list().append(client)
     
     def unregister_client(self, client):
      self.client_list().remove(client)

    def RunServer():
     server = CreateServer()
     try:
      server.run()
     except KeyboardInterrupt:
      pass
     finally:
      server.shutdown()

    def CreateServer():
     server = Server()
     server.on_connect    = lambda client: my_on_connect   (server, client)
     server.on_disconnect = lambda client: my_on_disconnect(server, client)
     server.on_command    = lambda client: my_on_command   (server, client)
     return server

    def my_on_connect(server, client):
     server.register_client(client)

    def my_on_disconnect(server, client):
     server.unregister_client(client)

    def my_on_command(server, client):
     cmd = client.get_command()
     server.broadcast(msg=cmd)

    RunServer()

    07-03-2012, 00:00 Geschreven door Fibergeek  


    Categorie:Programmeren
    Tags:Python,miniboa,telnet
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.miniboa: een voorbeeld

    Het onderstaande programma is mijn testprogramma gebasseerd op de voorbeeldprogramma's die met het "miniboa" framework worden meegeleverd. Ik ben niet helemaal tevreden maar dat ligt meer aan het "miniboa" framework zelf. Het liefst van al zou ik de CLIENTS-variable in de Server-class willen hangen, zodat één pythonprogramma meerdere servers zou kunnen draaien.

    from miniboa import TelnetServer

    CLIENTS = []

    class Server(TelnetServer):
     def __init__(self):
      TelnetServer.__init__(self)
     
     def shutdown(self):
      self.server_socket.close()
     
     def run(self):
      while True:
       self.poll()
     
     def poll(self):
      TelnetServer.poll(self)
      for client in CLIENTS:
       if client.active and client.cmd_ready:
        self.on_command(client)

    def RunServer():
     server = CreateServer()
     try:
      server.run()
     except KeyboardInterrupt:
      pass
     finally:
      server.shutdown()

    def CreateServer():
     server = Server()
     server.on_connect    = my_on_connect
     server.on_disconnect = my_on_disconnect
     server.on_command    = my_on_command
     return server

    def my_on_connect(client):
     CLIENTS.append(client)

    def my_on_disconnect(client):
     CLIENTS.remove(client)

    def my_on_command(client):
     cmd = client.get_command()
     broadcast_message(msg=cmd)

    def broadcast_message(msg):
     for client in CLIENTS:
      client.send(msg + "n")

    RunServer()

    07-03-2012, 00:00 Geschreven door Fibergeek  


    Categorie:Code: Python
    Tags:Python,miniboa,telnet
    23-02-2012
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.IDA-python: OpStrsize

    Wederom code die voor zichzelf spreekt, een kleine functie om "imul X, size Y" te creëeren met IDA python:

    struc = "struct_Test"

    def ToStrucId(struc):
            if type(struc) == str:
                    struc = GetStrucIdByName(struc)
            assert struc != BADADDR
            return struc

    def OpStrsize(ea, struc):
      struc = ToStrucId(struc)
      assert GetMnem(ea) == "imul"
      assert GetOpType(ea, 2) == 5
      assert GetOperandValue(ea, 2) == GetStrucSize(struc)
      OpStroff(ea, 2, struc)
     
    OpStrsize(ScreenEA(), struc)

    23-02-2012, 10:28 Geschreven door Fibergeek  


    Categorie:Code: Python
    Tags:IDAPython
    18-02-2012
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.een paar IDA-python snippets

    De volgende code zou voor zich moeten spreken, het is handig als je veel structures hebt gemaakt in een IDA-project, je kan dan de structures die je nodig hebt bovenaan plaatsen (volgorde aanpassen):...

    struc1 = "class_A"
    struc2 = "class_B"

    def ToStrucId(struc):
            if type(struc) == str:
                    struc = GetStrucIdByName(struc)
            assert struc != BADADDR
            return struc

    def MoveStrucToTop(struc):
      SetStrucIdx(ToStrucId(struc1), 0)
     
    def MoveStrucAfter(struc_to_move, struc_after):
      SetStrucIdx(ToStrucId(struc_to_move), GetStrucIdx(ToStrucId(struc_after)) + 1)

    def MoveStrucBefore(struc_to_move, struc_after):
      SetStrucIdx(ToStrucId(struc_to_move), GetStrucIdx(ToStrucId(struc_after)))

    MoveStrucToTop(struc1)
    MoveStrucAfter(struc2, struc1)

    18-02-2012, 00:00 Geschreven door Fibergeek  


    Categorie:Code: Python
    Tags:IDAPython,python
    30-01-2012
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.getallen uit een lijst kiezen om een gegeven totaal te bekomen

    Dit weekend had ik voor mezelf een klein vraagstuk gemaakt.

    Na aankopen te doen bij de lokale Carrefour waren we (mijn vrouw en ik) 111,37€ armer, en hebben we daarbij 4 maaltijdcheques gebruikt van 7 euro. Nu vroeg ik me dus af; van al die bedragen op het kasticket, welke bedragen moet ik optellen om tot exact 28 euro (4 maal 7) te komen en hierbij enkel rekening houdend met voedingswaren.

    Aangezien mijn liefde voor Python, begon ik in die taal te programmeren en schreef ik het volgende programma:

    from copy import copy
    class NietGevonden(Exception):
      pass
    def probeer_te_vinden(totaal, lijst):
     if totaal == 0:
       return []
     if totaal < 0:
       raise NietGevonden
     for getal in lijst:
      try:
        mijn_lijst = copy(lijst)
       mijn_lijst.remove(getal)
       antwoord = probeer_te_vinden(totaal - getal, mijn_lijst)
       antwoord.append(getal)
       return antwoord
      except NietGevonden:
       pass
     raise NietGevonden

    Het programma werkte maar is verre van snel. Maar snel was die avond geen vereiste. De oplossing van het probleem was dat wel en daaraan voldoed dit programma.

    Dat het programma niet snel is, wist ik al tijdens de ontwikkeling ervan. Gebruik van een Exception als deel van de oplossing en de copy-operatie per recursie en per lus.

    De volgende reeks is traag:

    lijst = [2.79,5.38,11.99,3.79,2.69,0.89,1.49,3.99,1.03,1.29,0.88,1.69,2.49,2.69,
    2.79,3.25,1.49,1.65,1.49,3.64,3.28,4.24,1.99]
    probeer_te_vinden(20.50, lijst)


    Maar vandaag is een andere dag, en wil ik op zoek naar een snellere oplossing. Ik kan uiteraard proberen mijn algoritme te verbeteren maar nog beter is een bestaand algoritme opzoeken en analyseren. kwestie van het wiel niet opnieuw te moeten uitvinden.

    Via google en de zoekstring: <<<python try different numbers best combination>>> kwam ik op de volgende site: http://stackoverflow.com/questions/4632322/finding-all-possible-combinations-of-numbers-to-reach-a-given-sum

    Daar staat een Python-oplossing anders dan de mijne, maar het was niet die oplossing die mijn aandacht trok.

    def subset_sum_recursive(numbers,target,partial):
        s = sum(partial)
        #check if the partial sum is equals to target
        if s == target:
            print "sum(%s)=%s"%(partial,target)
        if s >= target:
            return # if we reach the number why bother to continue
        for i in range(len(numbers)):
            n = numbers[i]
            remaining = numbers[i+1:]
            subset_sum_recursive(remaining,target,partial + [n])

    def subset_sum(numbers,target):
        #we need an intermediate function to start the recursion.
        #the recursion start with an empty list as partial solution.
        subset_sum_recursive(numbers,target,list())

    Er staat ook een Haskell-oplossing die maar 1 regel bedraagd:

    filter ((==) 12345 . sum) $ subsequences [1,5,22,15,0,..]

    En dan de versie waarmee ik verder heb zitten spelen:

    filter ((==) 27 . sum) $ subsequences [1,5,22,16,11]

    Ik ken Haskell totaal niet (!), maar ik kwam al snel op de volgende site uit: http://tryhaskell.org/
    Daar kon ik die code even snel uitproberen zonder Haskell te moeten installeren.
    En inderdaad, het werkte:

    => [[5,22],[16,11]

    Ik weet graag hoe zaken werken, dus typte ik gewoon <<<subsequences [1,5,22,16,11]>>> in.
    Met als resultaat:

    => [[],[1],[5],[22],[16],[11],[1,5],[1,22],[1,16],[1,11],[5,22],[5,16],[5,11],[22,16],[22,11],[16,11],[1,5,22],[1,5,16],[1,5,11],[1,22,16],[1,22,11],[1,16,11],[5,22,16],[5,22,11],[5,16,11],[22,16,11],[1,5,22,16],[1,5,22,11],[1,5,16,11],[1,22,16,11],[5,22,16,11],[1,5,22,16,11]]


    Waarom heeft Python zoiets niet? Na ongeveer een half uur googlen en lezen in de Python docs, kwam ik de "powerset"-functie tegen.

    from itertools import chain, combinations
    def powerset(iterable):
        "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
        s = list(iterable)
        return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

    Die powerset-snippet doet dus hetzelfde als Haskell's subsequences-functie:

    >>>list(powerset([1,5,22,16,11]))
    [(), (1,), (5,), (22,), (16,), (11,), (1, 5), (1, 22), (1, 16), (1, 11), (5, 22), (5, 16), (5, 11), ...]

    NOTA: de powerset-functie vereist wel Python 2.6, want "chain.from_iterable" is pas dan toegevoegd:
    http://docs.python.org/whatsnew/2.6.html

    Op rosettacode (http://rosettacode.org/wiki/Power_set) staat nog een andere Python powerset-versie, welke compatibel is met oudere Python-versies:

    def powerset(s):     r = [[]]     for e in s:         r += [x+[e] for x in r]     return r

    NOTA: deze powerset-functie (powersetlist) geeft een iets andere volgorde van de list-elementen

    Nu we dit weten en nadat we powerset gedefinieerd hebben, kunnen we de Haskell-oneliner converteren naar zijn Python-versie:

    filter(lambda x: sum(x) == 27, powerset([1,5,22,16,11]))

    Dus in plaats van mijn eerste Python-versie, zie bovenaan, was de bovenstaande one-liner genoeg geweest! Er is wel een belangrijk verschil, mijn versie geeft maar één resultaat, het eerste dat hij tegenkomt. De powerset-variant levert alle mogelijke resultaten (en is sneller). Woops!


    NOTA: om de getallen wat leesbaarder te maken: map(lambda getal: format(getal, ".2f"), getallen)

    30-01-2012, 00:00 Geschreven door Fibergeek  


    Categorie:Code: Python
    Tags:Python
    12-12-2011
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.Hoofdpagina SBS 2003 dynamisch maken met ASP

    Voor een van de klanten van het bedrijf waarvoor ik werk was het nodig om de startpagina van de Microsoft Small Business Server 2003 er een beetje anders te laten uitzien afhankelijk van het feit of de site al dan niet intern of extern werd geopend.

    In dit geval voldeed het om enkel een paar URL's naar een andere te site te laten verwijzen.

    De te nemen stappen, er vanuit gaande van een standaardinstallatie van SBS, zijn eenvoudig:

    1) Hernoem "default.htm" naar "default.asp", dit zorgt ervoor dat de pagina ASP-code kan bevatten.

    2) Voeg volgende code bovenaan de file toe.

    <%
    If Left(Request.ServerVariables("REMOTE_ADDR"), 10) = "192.168.1." Then
      URLx = "http://webstation/default.htm"
    Else
      URLx = "https://www.mijnwebsite.be/""
    End If
    %>
    3) Vervang de URL's door de volgende code:
    <% Response.Write URLx  %>
    4) Opslaan en testen. Klaar is kees!

    5) Als je server publiek op het internet staat, hou hem up-to-date!

     

    12-12-2011, 11:14 Geschreven door Fibergeek  


    Categorie:Programmeren
    11-12-2011
    Klik hier om een link te hebben waarmee u dit artikel later terug kunt lezen.Text op het Windows Clipboard zetten in Python
    # Deze code is getest met Python 2.6 en Python 3.1

    import ctypes
    from sys import version_info
    strcpy           = ctypes.cdll.msvcrt.strcpy
    wcscpy           = ctypes.cdll.msvcrt.wcscpy
    OpenClipboard    = ctypes.windll.user32.OpenClipboard
    EmptyClipboard   = ctypes.windll.user32.EmptyClipboard
    GetClipboardData = ctypes.windll.user32.GetClipboardData
    SetClipboardData = ctypes.windll.user32.SetClipboardData
    CloseClipboard   = ctypes.windll.user32.CloseClipboard
    GlobalAlloc      = ctypes.windll.kernel32.GlobalAlloc
    GlobalLock       = ctypes.windll.kernel32.GlobalLock
    GlobalUnlock     = ctypes.windll.kernel32.GlobalUnlock
    CF_TEXT          = 1
    CF_UNICODETEXT   = 13
    GMEM_DDESHARE    = 0x2000
    is_python3 = version_info[0] >= 3
    if is_python3:
     default_type = CF_UNICODETEXT
    else:
     default_type = CF_TEXT
    def get_globaldata_as_ansistring(hCd):
     GlobalLock.restype = ctypes.c_char_p
     
     ptr = GlobalLock(hCd)
     GlobalUnlock(hCd)
     
     return ptr
    def get_globaldata_as_unicodestring(hCd):
     GlobalLock.restype = ctypes.c_wchar_p
     
     ptr = GlobalLock(hCd)
     GlobalUnlock(hCd)
     
     return ptr
    def get_ansistring_as_globaldata(string):
     GlobalLock.restype = ctypes.c_long
     
     hCd = GlobalAlloc(GMEM_DDESHARE, len(string) + 1)
     ptr = GlobalLock(hCd)
     strcpy(ctypes.c_char_p(ptr), string)
     GlobalUnlock(hCd)
     
     return hCd
    def get_unicodestring_as_globaldata(string):
     GlobalLock.restype = ctypes.c_long
     
     hCd = GlobalAlloc(GMEM_DDESHARE, len(string) * 2 + 2)
     ptr = GlobalLock(hCd)
     wcscpy(ctypes.c_wchar_p(ptr), string)
     GlobalUnlock(hCd)
     
     return hCd
    def SetText(data):
     if type(data) != str:
      raise TypeError("Data must be a string!")
     OpenClipboard(None)
     try:
      EmptyClipboard()
      if is_python3:
       data = get_unicodestring_as_globaldata(data)
      else:
       data = get_ansistring_as_globaldata(data)
      SetClipboardData(default_type, data)
     except:
      pass
     finally:
      CloseClipboard()
    def GetText():
     data = None
     OpenClipboard(None)
     try:
      data = GetClipboardData(default_type)
      if data:
       if is_python3:
        data = get_globaldata_as_unicodestring(data)
       else:
        data = get_globaldata_as_ansistring(data)
     except:
      pass
     finally:
      CloseClipboard()
     return data

    11-12-2011, 13:45 Geschreven door Fibergeek  


    Categorie:Code: Python
    Tags:Python,Clipboard
    Archief per week
  • 25/11-01/12 2013
  • 05/11-11/11 2012
  • 07/05-13/05 2012
  • 05/03-11/03 2012
  • 20/02-26/02 2012
  • 13/02-19/02 2012
  • 30/01-05/02 2012
  • 12/12-18/12 2011
  • 05/12-11/12 2011
  • 19/09-25/09 2011
  • 15/08-21/08 2011
  • 01/08-07/08 2011
  • 04/07-10/07 2011
  • 06/06-12/06 2011

    E-mail mij

    Druk op onderstaande knop om mij te e-mailen.


    Gastenboek

    Druk op onderstaande knop om een berichtje achter te laten in mijn gastenboek


    Blog als favoriet !


    Blog tegen de wet? Klik hier.
    Gratis blog op https://www.bloggen.be - Meer blogs