Bräuchte einen Programmierer für ein kleines Programm.

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Beagle
User
Beiträge: 13
Registriert: Mittwoch 11. Juli 2012, 19:35

Hallo leute,
ich bin gerade dabei ein kleinses Programm für meine Arbeit zu schreiben. Ich habe bereits angefangen mit dem Tool komme aber an gewissen Punkten nur sehr mühsam weiter. Verwendet werden (Qt4, Matplotlib und Numpy). Meiner Meinung nach ist es für einen erfahrenen Programmierer eine Arbeit von wenigen Stunden.
Bin natürlich gerne Bereit eine Aufwandsentschädigung zu zahlen.

Bei interesse einfach melden.

LG,
Beagle
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

Hallo Beagle,

mit den Worten: "Meiner Meinung nach ist es für einen erfahrenen Programmierer eine Arbeit von wenigen Stunden"
fangen die meisten großen Projekte an ;).

Vielleicht erzählst Du ja kurz etwas über Dein Projekt:
- Ziel
- Anforderungen
- Stand (was hast Du bisher getan)
- etc.

-Colin-
Beagle
User
Beiträge: 13
Registriert: Mittwoch 11. Juli 2012, 19:35

Ich zitiere mich mal selbst aus einem Thread im allgemeinen Forum.
Beagle hat geschrieben:Ich schildere mal kurz was ich grundsätzlich damit vor habe, vielleicht habe ich ja einen grundsätzlichen Denkfehler, und da wäre es mir lieber wenn er frühzeitig erkannt wird :)

Mittels einer grafischen Oberfläche (Qt4) soll ein Textfile eingelesen werden. Hierbei sind derzeit für mich nur die Spalte 2 und 3 relevant (Datum und Uhrzeit). Diese "Zeitdaten" sollen anschließend mit einem Balkendiagram (Matplotlib) visualisiert werden. Also zB im Mai gab es xxx Logeinträge, im im Juni yyy und im Juli zzz. Anschließend soll es noch möglich sein mittels Buttens den Ausschnitt sowie den Zeitbereich zu verändern. Also von der "Jahresansicht" wird mittels eines Button in die "Monatsansicht" gewechselt in denen dann zB 1. Mail xxx, 2. Mai yyy, ...... . Dies soll bis in die "Minutenansicht" gehen (also am 5. Mai 14:54 Sekunde 1 xxx, Sekunde 2 yyy,...). Zur Realisierung war mein derzeitiger Plan das Textfile mittels np.loadtxt einzulesen, anschließend in ein Datumsformat zu convertieren, dieses dann zu Verarbeiten (Denke das sollte mit schleifen möglich sein).
Die grafische Oberfläche ist zu einem großteil Fertig, hier fehlen noch ein paar Buttons.

Wenn ich ehrlich bin, will ich auch nicht unbedingt jemanden der das ganze fix und fertig programmiert, sondern sozusagen in "co-produktion" das ganze mit mir macht.

LG,
Beagle
Drache
User
Beiträge: 51
Registriert: Montag 29. November 2010, 21:51
Wohnort: Berlin
Kontaktdaten:

Poste doch mal den code auf bitbucket.org oder github.com.
Ersteren finde ich angenehmer, ist aber geschmacksache.
Gruß
Drache
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

Beagle hat geschrieben:... Wenn ich ehrlich bin, will ich auch nicht unbedingt jemanden der das ganze fix und fertig programmiert, sondern sozusagen in "co-produktion" das ganze mit mir macht. ...
... äh ja ... das ist natürlich wiederum etwas ganz anderes, als Du in Deiner ersten Anforderungsbeschreibung aufgeführt hast.

Was genau brauchst Du:
- einen Tutor (damit Du das Wissen verinnerlichst .... wenn ja: warum? Hat irgendjemand die Erwartungshaltung, dass Du das Programm weiterentwickeln/warten sollst?)
- das vollständige Programm (wobei das "wie" eine eher niederige Priorität spielt)
- Zuarbeit mit Quellcode-Schnippseln
- ... ?

Wie genau stellst Du Dir denn diese "co-production" vor?
Wie soll das genau nachher hinsichtlich der Lizenz aussehen?
Sprich auch: was soll mit dem fertigen Programm passieren?

Questions about questions

-Colin-
Beagle
User
Beiträge: 13
Registriert: Mittwoch 11. Juli 2012, 19:35

Puhh, wie du schreibst fragen über fragen

Was ich brauche hast du mit deinem 2. Punkt eigentlich sehr gut geschrieben.
- das vollständige Programm (wobei das "wie" eine eher niederige Priorität spielt)

Was ich damit machen will, ist es in meiner Arbeit zu verwenden. Ein Kunde hätte das gerne grafisch etwas aufbereitet.
Wobei meine Arbeit nicht grundlegend darauf basiert, sondern es wäre ein kleines nice2have.
Über Lizenz hab ich mir ehrlich gesagt noch keine Gedanken gemacht.

LG
Benutzeravatar
ocoal
User
Beiträge: 32
Registriert: Mittwoch 20. Juli 2011, 22:44

Gut ... dann würde ich Dir empfehlen:
1. vielleicht wirklich den bisherigen "Code-Stand" irgendwo zugänglich zu machen
2. nochmal genau die Anforderungen (oder sogar einen UseCase) zu spezifizieren

damit dann ein potentieller Interessent abschätzen kann, was das ganze an Aufwand (Zeit/Kosten) letztendlich produzieren wird.

Dann bekommst Du vielleicht eine Hausnummer genannt (quanta costa) oder wer weiss: vielleicht gibt es hier sogar jemanden, der es aus dem Sinne der "Herausforderung" heraus für Lau realisiert ;).

-Colin-
Beagle
User
Beiträge: 13
Registriert: Mittwoch 11. Juli 2012, 19:35

Hallo,
ich habe nun meinen derzeitigen Codestand https://bitbucket.org/Beagle123/logfile-analyzer hier hochgeladen. Was bisher passiert, tly.py wird gestartet, das fenster geht auf, über file analyze Checkpoint log wird das beigefügte fw.log.txt geöffnet. Und mitteld der Draw Taste wird derzeit noch ein Beispiel gezeichnet (Wie oft ist jeder Buchstabe in dem File vorhanden). Dieses Beispiel programm wird natürlich dann entfernt, ich habe es nur noch drinnen um zu überprüfen dass alles noch geht.

Nun zu den Anforderungen. Es soll ein Logfile eingelesen werden und anschließend grafisch (Balkendiagramm) gezeigt werden wie viele logeinträge vorhanden sind. Zuerst immer in der "größten" Ansicht. Sollten also unterschiedliche Jahre vorhanden sein. Sehe ich 2011 xxx Einträge und 2012 yyy Einträge. Wenn allerdings wie in diesem Beispiel alles in einem Jahr ist sehe ich zu beginn Mai xxx, Juni yyy, Juli zzz Einträge. Dies war der erste Schritt.
Anschließend soll mit den Buttons unten, der "Bildausschnitt manipuliert werden. Wenn ich also auf +++ Drücke, sollen nur die Einträge vom Juli (letztes Monat) sichtbar sein. Mit <<< und >>> Soll nun zwischen den Monaten navigiert werden. Also wenn ich im Juli bin und <<< drücke will ich den Mai angezeigt haben. Wenn ich anschließend im Mai bin und zB. +++ Drücke, bin ich im letzten Tag im Mai und sehe die Stunden. Usw. Dies soll bis zu einer Minutenansicht gehen also am 31. Mai um 20:53 waren in der 1. Sekunde xxx einträge, in der 2. Sekunde yyy ....

Hoffe das dies ausreichend erklärt ist, bei Fragen bitte einfach stellen
Zuletzt geändert von Beagle am Samstag 14. Juli 2012, 14:13, insgesamt 2-mal geändert.
BlackJack

@Beagle: Kann es sein dass Du den Code dort tatsächlich *hoch geladen* hast‽ Also kein Repository mit dem Code erstellt sondern die einzelnen Dateien hoch geladen?
Beagle
User
Beiträge: 13
Registriert: Mittwoch 11. Juli 2012, 19:35

Ups, kenn mich da noch nicht so aus, ich erstells gleich neu und schau dass ichs richtig mach

Edit: Habs jetzt editiert. Hoffe es passt so.
BlackJack

@Beagle: Jetzt gibt es dort gar kein Projekt und keine Dateien zum Download mehr. Gut das ich mir die vorher runter geladen hatte. :-)

In das Repository würde übrigens auch nicht der generierte Python-Quelltext gehören sondern die *.ui-Datei. Sachen die automatisch generiert werden braucht, und sollte man in der Regel auch nicht, unter Versionskontrolle stellen, aber natürlich die Daten aus denen sie generiert werden.

PyQt bietet ausserdem ein Modul mit dem man die *.ui-Datei zur Laufzeit laden kann. Dann spart man sich das generieren von Quelltext.

Der Quelltext ist eindeutig überkommentiert. Kommentare sollten erklären warum etwas im Quelltext so gemacht wird, wie es gemacht wird und nur in seltenen Fällen was gemacht wird. Das sollte aus dem Quelltext selbst ersichtlich werden. Kommentare sollten dem Leser einen Mehrwert bieten und nicht noch einmal genau das selbe beschreiben was auch der dazugehörige Quelltext ganz offensichtlich macht.

Du verwendest die alte, umständlichere Art Signale mit Slots zu verbinden. Das geht mittlerweile kürzer (und etwas sicherer weil nicht vorhandene Signale sofort beim Verbinden auffallen):

Code: Alles auswählen

# Aus...
        QtCore.QObject.connect(self.tlaDraw, QtCore.SIGNAL("clicked()"), self.update_graph)
# ...wird...
        self.tlaDraw.clicked.connect(self.update_graph)
Die GUI ist ein wenig komisch, ich würde irgendwo bei dem Textfeld auch eine Schaltfläche erwarten über die man eine Datei auswählen kann und nicht nur einen „versteckten” Menüpunkt dazu.

Ich weiss das das Buchstabenhistogramm nur ein Test sein sollte, aber das ist IMHO nicht besonders schön gelöst. Wenn man dort Buchstaben statt Zahlen als Schlüssel verwenden würde, könnte man sich die kryptischen Zahlen sparen und die Kommentare, die sie erklären.

``if ord(char.lower()) in range(97, 122 + 1):`` ist ein sehr ineffizienter Test. `range()` erstellt eine Liste mit den Zahlen 97 und 122 (inklusive) und sucht darin dann linear nach dem Vorhandensein von ``ord(char.lower())``. Man hätte stattdessen ``... in letters:`` schreiben können, das hätte den Test in konstanter Zeit gemacht. Aber eigentlich könnte man auch ganz auf den Test verzichten und einfach ein Histogramm über alle (in Kleinbuchstaben umgewandelte) Zeichen machen können und davon dann am Ende halt nur die 26 Buchstabenwerte anzeigen.

Der Wert für `k` wird zu umständlich ermittelt. Es ist doch bekannt welche Werte dort vorhanden sind, die Liste wird ganz am Anfang schon einmal in der richtigen Reihenfolge erstellt, also könnte man sie sich dort auch merken. Ich hätte das so gelöst (`defaultdict()` aus `collections`, `partial()` aus `functools`, und `ascii_lowercase` aus `string`):

Code: Alles auswählen

        histogram = defaultdict(int)
        with open(filename, 'rb') as log_file:
            for block in iter(partial(log_file.read, 2**16), ''):
                for character in block.lower():
                    histogram[character] += 1
        keys = ascii_lowercase
        values = [histogram[c] for c in ascii_lowercase]
Die „Methode” `parse_file()` ist semantisch keine und sie gehört auch nicht zur GUI.

Ich würde die Auswertung und alles was nicht direkt mit der GUI zu tun hat nicht mit GUI-Code vermischen.
Beagle
User
Beiträge: 13
Registriert: Mittwoch 11. Juli 2012, 19:35

Vielen Dank für die Rückmeldung,
ja ich war mit dem bitbucket irgendwie überfordert, und hab dann beim neuen Repository vergessen das "Häckchen" von private wegzumachen. Habe die GUI bereits verändert und auch das mit clicked.
Die Kommentare und eigentlich sehr vieles sind aus dem Beispielprogramm. Und auch der Rest aus dem Beispielprogramm kann eigentlich gelöscht werden.
Was meinst du mit die „Methode” `parse_file()` ist semantisch keine und sie gehört auch nicht zur GUI.

Danke und LG
BlackJack

@Beagle: `parse_file()` ist keine Methode weil es das Objekt auf dem sie definiert ist überhaupt nicht verwendet oder benötigt. Und die Funktion ist Geschäftslogik und keine GUI. Die Protokolldatei zu parsen hat nichts mit einer grafischen Oberfläche zu tun.
Drache
User
Beiträge: 51
Registriert: Montag 29. November 2010, 21:51
Wohnort: Berlin
Kontaktdaten:

@Beagle
Schau mal in dein Programmverzeichnis nach einer Datei die .hgrc heißt.
Da könnte sowas drin stehen wie John Doe, vielleicht magst du das ändern.
Sonst brauch man am Anfang nur ein paar befehle:
hg commit -m "Kommentar"
hg push
hg pull
hg update
hg addremove

Machs gut
Drache
BlackJack

Beispiel wie man die Datums- und Zeitangaben aus der Protokolldatei in ein eindimensionales `numpy`-Array mit einem Gleitkommawert pro Eintrag einlesen kann:

Code: Alles auswählen

from time import mktime, strptime
import numpy as np


__all__ = ['parse']


def convert_date(string):
    return mktime(strptime(string, '%d%b%Y'))


def convert_time(string):
    hours, minutes, seconds = map(int, string.split(':'))
    return hours * 60 * 60 + minutes * 60 + seconds


def parse(filename):
    dates, times = np.loadtxt(
        filename,
        delimiter ='" "',
        skiprows=1,
        usecols=(1, 2),
        converters={1: convert_date, 2: convert_time},
        unpack=True
    )
    return dates + times


def main():
    print parse('fw.log.txt')


if __name__ == '__main__':
    main()
Beagle
User
Beiträge: 13
Registriert: Mittwoch 11. Juli 2012, 19:35

WOW vielen Dank dafür, allerdings scheitere ich am Einfügen von

Code: Alles auswählen

def convert_date(string):
    return mktime(strptime(string, '%d%b%Y'))


def convert_time(string):
    hours, minutes, seconds = map(int, string.split(':'))
    return hours * 60 * 60 + minutes * 60 + seconds
Egal wo ich diese hinzufüge ich bekomme immer:

File "tla.py", line 63
def convert_date(string):
^
dentationError: unexpected indent

LG
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wenn es egal ist _wo_ du es einfuegst, scheinst du das falsche einzufuegen, z.B. mit fuehrenden Leerzeichen. Auch solltest du ueberpruefen, ob du nicht Tabs und Spaces mischst (wobei das afair eine andere Fehlermeldung hat).
Antworten