Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von herbivore
Thema: Daily Rate in Job Offer: Bedeutet das wirklich den Tagessatz den man Brutto bekommt?
Am im Forum: Smalltalk

Hallo dr4g0n76,

ich würde mal davon ausgehen, dass es sich nicht um ein Angestellten-, sondern ein Freiberufler-/Selbständigen-Verhältnis handelt. Dann wäre es also nicht Brutto, so wie du wohl denkst, also so, dass der Arbeitgeber die Hälfte zur Sozialversicherung und außerdem Urlaub bezahlt, sondern du musst von dem Betrag alles selber bestreiten. Als (gewerblicher) Selbständiger (also nicht freiberuflich) auch noch Gewerbesteuer. Das wäre meine Vermutung.

herbivore

Thema: Neue Themen nicht automatisch als gelesen markieren
Am im Forum: Wünsche und Kritik

Hallo zusammen,

momentan ist die Länge der Session auf eine Stunde eingestellt (3600 Sekunden). Diese Einstellung könnte man höher setzten, z.B. auf zwei Stunden. Aber zu lange sollte man die Zeit auch nicht setzen, sonst greift der grundsätzlich sinnvolle Mechanismus, dass Threads, die man (gar) nicht aufruft, irgendwann automatisch als gelesen gesetzt werden, überhaupt nicht mehr.

Denn es reicht eine beliebige Seite des Forums aufzurufen, um die aktuell laufende Session zu verlängern. Wenn man also 59 Minuten nach der bisher letzten Aktion einfach nochmal die Startseite aufruft, läuft die Session nicht ab, sondern verlängert sich um eine weitere Stunde (bzw. was immer als Sesssionlänge eingestellt ist). Dann gehen auch die ungelesen-Markierungen (noch) nicht verloren.

Ich fand eine Stunde eigentlich immer einen guten Kompromiss. Selbst wenn man zwischendurch mal gestört wird, läuft die Session nicht gleich ungewollt/versehentlich ab. Will man nicht unter Druck kommen, reicht es, nach der Störung einfach eine beliebige Seite zu laden. Wenn man aber wirklich fertig ist und eine (Stunde oder länger) Pause macht, dann ist die Session wirklich zu Ende, auch wenn man später am Tag nochmal nach neuen Beiträgen schaut. Würde man die Sessionlänge z.B. auf 24 Stunden setzen, würde bei jemanden der morgens und abends das Forum nach Beiträgen checkt, die Session nie ablaufen, was nicht im Sinne des Erfinders wäre. Aber zwei statt einer Stunde wäre wohl auch noch ok.

Damit es keine Verwirrungen gibt: Es gibt in der Forensoftware zwei verschiedene Sessionlängen. Die eine im Zusammenhang mit den ungelesenen Beiträgen, über die ich bis jetzt geschrieben habe. Dann gibt es noch eine, die sich auf die "User online"- oder "Wer ist wo Online"-Anzeige bezieht. Dabei ist die Sessionlänge auf 15 Minuten eingestellt. Man gilt also maximal 15 Minuten nach der letzten Aktion noch als Online bzw. taucht noch in den genannten Anzeigen auf.

herbivore

Thema: Buchempfehlung für Einsteiger
Am im Forum: Buchempfehlungen

Hallo excis,

was die Syntax oder die Möglichkeiten der Sprache angeht, verpasst du in einem Buch, dass den Sprachstand von 2012 beschreibt, nichts, was du dir nicht leicht im Nachhinein noch angucken kannst. In C# 6 - Übersicht der Neuigkeiten kannst du dir einen Eindruck verschaffen, was es für sprachliche Neuerungen gibt, die in dem Buch noch nicht beschrieben sind. Es ist nichts dabei, was unverzichtbar ist. Und es es ist nichts dabei, was man sich nicht leicht aneignen kann, falls man es praktisch findet.

herbivore

Thema: Suche Titel für Projektdokumentation
Am im Forum: Smalltalk

Hallo Taraxacuma,

Entwurf und Implementierung eines interaktiven SQL-Abfragegenerators

herbivore

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Hallo LaTino,

danke, dadurch wird es schon etwas klarer.

Gehe ich recht in der Annahme, dass es sich bei den Werten für den Radius des Kreises in der Praxis um relativ große Werte geht, also sagen wir > 1000 oder sogar noch wesentlich größer?

Und dass man deshalb nicht einfach für alle ganzzahligen X-Werte ausprobiert, ob auch der zugehörige Y-Wert (bzw. die zugehörigen Y-Werte) ganzzahlig ist.

Es also letztlich darum geht, einen Algorithmus zu finden, der direkt - zumindest schnell - die ganzzahligen Werte-Paare findet, ohne wild rumzuprobieren?

herbivore

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Hallo LaTino,

kann sein, dass du darauf hinaus willst, dass bei der Implementierung der gewünschten Methode der Bresenham-Algorithmus in der Variante für Kreise verwendet werden kann oder sogar soll?

Und kannst du noch motivieren, wo zu man die fertig implementierte Methode brauchen bzw. einsetzen kann? So wie ich es sehe wird für viele Parameter der Rückgabewert ein leeres IEnumerable<Point> sein.

herbivore

Thema: Einsatz von Standard-Tools oder Eigenprogrammierung?
Am im Forum: Smalltalk

Hallo tASven,

der Trend geht eindeutig zu Standard-Software, und das ist auch grundsätzlich sinnvoll. Allerdings ist das eben auch nicht ohne Probleme.

Bei einer Firma A, die ich kenne, ist die Entscheidung, ob ein Azubi ein Ticketsystem programmieren oder ein fertiges Ticketsystem eingekauft werden soll, genau andersherum ausgegangen als bei euch.

Mittlerweile wurde die Firma B, die das eingekaufte Ticketsystem (das Teil eines größeren Managementsystems ist) entwickelt hatte, von einer anderen Firma C geschluckt. Die Produktlinie der übernommenen Firma B wurde jedoch nicht weitergeführt, sondern nur Teile davon (und damit ist gerade nicht die Oberfläche gemeint) in das Produkt der Firma C integriert. Ein Update auf die neue Version hat daher bei der Firma A einen großen Umstellungs- und Anpassungsaufwand produziert und das Ergebnis war trotz dieses Aufwandes so wenig brauchbar, dass jetzt ein neues Ticketsystem beschafft werden soll.

Ich gehe davon aus, dass der (sehr gute) Azubi des Grundfunktion des Ticketsystems wohl ohne Weiteres in einem Monat hätte realisieren können. Und dann vielleicht noch ein, zwei Monate, um es so zu ergänzen, dass es alle Anforderungen (so gut wie) perfekt erfüllt. Dem gegenüber standen beim Kauf Anschaffungskosten im mittleren fünfstelligen Bereich. Selbst wenn beides in einem Totalverlust geendet hätte, wie es bei der (zweiten) Kaufsoftware tatsächlich eingetreten ist, hätte die Azubi-Lösung weit geringere Kosten verursacht - bei möglicherweise für die konkrete Firma in der Zwischenzeit besser passenden Lösung.

Sobald es jedoch um komplexere Software geht, die zudem ständigen äußeren Einflüssen (z.B. geänderte Benutzeranforderungen, Gesetzesänderungen, Änderungen von Schnittstellen wie SEPA statt Lastschrift) ausgesetzt ist, wird es wohl so sein, dass der Änderungsaufwand bei einer selbst entwickelten Software den Kaufaufwand - selbst für einen ggf. erforderlichen Neukauf - einer Standard-Software schnell übersteigen. Deshalb sollte man sich schon genau überlegen, wo eine Eigenwicklung sich auch auf die lange Sicht rechnet.

herbivore

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Hallo LaTino,

jetzt schon :-)

Oder anders gesagt: Den Fall hatte ich wirklich nicht bedacht, aber zumindest bei meinem Ansatz war es straightforward, diesen Fall noch einzubauen.

herbivore

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Hallo MarsStein, hallo zusammen,

das ist ja lustig. Ich hatte mir vor nicht mal einem Monat auch eine neue Aufgabe fürs Programmierspiel überlegt, aber leider noch nicht die Zeit gefunden, sie auszuformulieren. Insofern habe zumindest ich das Programmierspiel auch nicht vergessen.

Die einfachste und gleichzeitig am wenigsten fehleranfällige Lösung für das Problem des (möglichen) Überlaufs der Schleifenvariable, wäre long statt int dafür zu verwenden. Beim Aufruf der Action würde man diese (gefahrlos) auf int zurück-casten.

Wären die Parameter der Loop-Methode (und der Typ-Parameter des Action-Delegaten) longs, dann könnte man bei der Schleifenvariable nach dem eben beschrieben Prinzip einfach und sicher auf decimal ausweichen.

So wie deine Aufgabe formuliert ist - man also nur die Stelle mit dem Kommentar durch Code ersetzen und damit den Typ der Schleifenvariable nicht verändern darf -, muss man wohl eine zusätzliche (Schleifen-)Variable verwenden. Vermutlich ist das auch der Grund, warum du nach der Initialisierung der Schleifenvariable kein Semikolon gesetzt hat, sondern in der Lösung wohl ein Komma folgen wird.

Ich habe eine solche Lösung. Ich poste diese jedoch (noch) nicht, weil ich denke, dass die Aufgabe eine gute Übung für (etwas geübtere) Anfänger ist.

herbivore

PS (geschrieben, nachdem die Lösungen der Aufgabe gepostet wurden):
Wenn man beliebige Codeänderungen zulässt, gibt es weitere einfache und sichere Lösungen, um einen Überlauf der Schleifenvariable zu vermeiden, ohne dazu auf einen "größeren" Datentyp auszuweichen. Vorweggeschickt sei, dass durch die Abfrage am Anfang der Loop-Methode sichergestellt ist, mindestens ein Aufruf der Aktion erfolgt.

Daher kann man die for-Schleife um einen Durchlauf verkürzen (i < max statt i ≤ max) und anschließend die Aktion explizit für den Maximalwert aufrufen (bei dieser Lösung tritt ein Überlauf gar nicht erst ein):


for (int i = min; i < max; ++i) {
   action (i);
}
action (max);

Bei der folgenden Lösung kommt es zu einem Überlauf - weshalb man checked auch weglassen oder sogar in unchecked ändern muss -, welcher aber nach dieser Änderung keine negativen Auswirkungen hat:


int i = min;
do {
   action(i);
} while (i++ < max);

Thema: Snippet: Daten binär speichern und laden
Am im Forum: .NET-Komponenten und C#-Snippets

Hallo zusammen,

noch eine kleine Ergänzung. In Untersch. Behandlung der Objektdaten bzgl. Modifizierer bei Serialisierung in den versch. Formaten habe ich mich näher mit den Unterschieden zwischen binärer und XML-Serialisierung beschäftigt.

herbivore

Thema: [Lösung] Problem mit EventHandler [==> fertige Code-Snippets inkl. Erklärung]
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

weiter oben wird vorgeschlagen, Events wie folgt zu definieren:


   public event EventHandler <EventArgs> MyEvent;

   protected virtual void OnMyEvent (EventArgs e)
   {
      EventHandler <EventArgs> myEvent = MyEvent;
      if (myEvent != null) {
         myEvent (this, e);
      }
   }

Bei Events hat mich schon immer geärgert, dass man diese auf null abfragen muss, bevor man sie feuern kann. Mit dem mit C# 6.0 eingeführten Null-conditional operator (auch Null-propagation operator genannt) kann man sich diese Abfrage bzw. die im vorigen Beitrag vorgeschlagene Erweiterungsmethode sparen.

Man kann im angegebenen Code das Codestück

EventHandler <EventArgs> myEvent = MyEvent;
if (myEvent != null) {
   myEvent (this, e);
}

einfach durch - so ist es für C# 6.0 und höher empfohlen -

MyEvent?.Invoke (this, e);

ersetzen (siehe oben für weitere Informationen zum Verständnis, zur Definition und Benutzung von Events).

Die Variante mit dem Null-conditional operator ist auf die gleiche Weise threadsafe wie der bisherige Code. Die Begründung ist die gleiche, nur dass keine zusätzliche lokale Variable benötigt wird, sondern eine interne Variable des Null-conditional operator diese Aufgabe übernimmt. Der Null-conditional operator wertet also MyEvent nur einmal aus, obwohl er dies intern einmal auf null abfragt und ggf. einmal Invoke dafür aufruft.

Siehe auch Weitere Informationen zum Verständnis, zur Definition und Benutzung von Events in diesem Thread weiter oben.

herbivore


PS: Invoke ist eine Methode, die jeder Delegat besitzt, um ihn aufzurufen. Zwar kann man einen Delegaten auch über seinen Namen aufrufen,

MyEvent (this, e);

aber den Null-conditional operator darf man bei dieser Aufrufsyntax nicht verwenden. Man darf also nicht schreiben

MyEvent? (this, e);

Da man aber jeden Delegaten auch über Invoke aufrufen kann,

MyEvent.Invoke (this, e);

verwendet man eben diese Aufrufvariante, um sie mit dem Null-conditional operator zu kombinieren. So erklärt sich, wie man zur oben verwendeten Syntax kommt:

MyEvent?.Invoke (this, e);

Thema: Nur ein Vorkommnis mit Regex.Replace ersetzen
Am im Forum: Rund um die Programmierung

Hallo LaTino,

du bist leider nicht darauf eingegangen, dass String-Replace mangels passender Überladung nicht dafür taugt, wie in diesem Thread gefragt, nur das erste Vorkommen zu ersetzen. Da führt deine Regel string>stringbuilder>regex m.E. trotzdem zu Regex. Meine Regel sieht ohnehin anders aus, nämlich regex>string>stringbuilder, und zwar aus dem Grund, dass für mich Lesbarkeit des Codes und Flexibilität desselben wichtiger sind, solange die Performance keine Probleme macht (*). Ich finde es unpassend, für die konkrete Aufgabe mit String.Replace oder String.Split und zusätzlichem Code rumzubasteln, um es irgendwie hinzubekommen, wenn es bei Regex.Replace reicht, einen zusätzlichen Parameter (count) anzugeben, um das Ziel zu erreichen.(**)

Nun kann man vielleicht noch einwenden, dass Regex eine Sprache ist, die nicht besonders gut lesbar ist und daher meiner eigenen Regel widerspricht. In der Tat ist es einfacher einen Regex-Pattern zu schreiben als ihn zu lesen. Man muss sich allerdings die Alternative vor Augen halten. So komplexe Regex-Pattern, die man nicht mehr einfach erfassen kann, würden mit String- oder StringBuilder-Operationen ausprogrammiert typischerweise solche eine Code-Menge und -Komplexität erfordern, dass dieser Code eben auch nicht mehr gut lesbarer wäre, meistens schlechter. Und weniger flexibel ist der entstehende Code auf jeden Fall.

Genau diesen Vergleich, nämlich Regex-Pattern vs. ausprogrammierter Code, habe ich mit dN!3Ls Hilfe als anfänglichen Verfechters des Ausprogrammierens exemplarisch für einen praktischen Fall im Programmierspiel durchgespielt. Siehe Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch für die Aufgabe und die folgenden Beiträge für den Lösungsweg/Vergleich.

Daraus erklärt ich, warum in meiner Regel regex>string>stringbuilder Regex ganz vorne steht. Natürlich gibt es auch Fälle, in denen ich mich für String oder StringBuilder entscheide, nämlich wenn mich die Performance zwingt (meist lande ich dann bei StringBuilder) oder es im jeweiligen Fall lesbareren Code ergibt, einfache String-Operationen zu verwenden.

Ich denke, wir haben - wenn ich nichts übersehe - jetzt die wesentlichen Argumente getauscht. Letztlich muss es sowieso jeder für sich entscheiden.

herbivore

(*) Wobei ich natürlich trotzdem von Anfang an darauf achte, bekannten potenziellen Performance-Problemen aus dem Weg zu gehen. Diese liegen allerdings eher selten darin, eine Methode zu wählen, die um einen konstanten Faktor schneller ist oder einen konstanten Overhead weniger benötigt, sondern darin, sich nicht durch die Codestruktur bzw. durch einen unpassenden Algorithmus eine unnötig höhere Aufwandsklasse einzuhandeln, siehe dazu Mergesort langsamer als Bubblesort? [==> Nein, Messfehler / Aufwandsklasse vs. Mikrooptimierungen].

(**) Unter Berücksichtigung des schon oben beschriebenen ggf. notwendigen Escapens.

Thema: Ausschließen eines Zeichens
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo allgaeu73,

dein Pattern enthält einige Merkwürdigkeiten und du meinst vermutlich eher:

"part \"[a-zA-Z0-9]+\"[^,]"

Das Problem damit ist, dass du damit erzwingst, dass hinter dem letzten Anführungszeichen ein Zeichen folgt (also folgen muss), welches kein Komma ist. Bei den gültigen Zeilen folgt aber gar kein Zeichen.

Wenn du ausdrücken willst, dass kein Komma folgen soll, egal was stattdessen oder ob überhaupt etwas folgt, dann bräuchtest du einen negativen look ahead, also (?!,) statt [^,]

Insgesamt also

part \"[a-zA-Z0-9]+\"(?!,)

Oder wenn bei den gültigen Zeilen tatsächlich nie etwas folgt, dann reicht es auch, genau das auszudrücken:

part \"[a-zA-Z0-9]+\"$

herbivore

Thema: Nur ein Vorkommnis mit Regex.Replace ersetzen
Am im Forum: Rund um die Programmierung

Hallo LaTino,

in dem Link wird - wenn ich das richtige verstanden habe - "\n" durch "" ersetzt. Also ein einzelnes Zeichen durch nichts. Da kann die von mir beschriebene Optimierung natürlich nicht greifen. Außerdem wird der Pattern als String und nicht als Regex-Objekt übergeben, so dass der (wenn auch kurze) Pattern jedes Mal neu geparst bzw. aus dem Pattern-Cache gesucht werden muss. Und es wird wohl nicht RegexOptions.Compiled verwendet. Alles Faktoren, die je nach konkreter Ersetzungsaufgabe relevant sein könnten.

Und String.Replace scheidet hier wie gesagt sowieso aus, weil man es nicht auf das Ersetzen des ersten Vorkommens beschränken kann.

Selbst wenn der String nur einmal vorkommen würde und damit String.Replace und Regex.Replace dasselbe Ergebnis liefern würden, wäre bei sehr, sehr langen Texten ein Regex.Replace mit count=1, das somit Abbrechen würde, sobald der String gefunden (und ersetzt ist) möglicherweise um Faktoren schneller als ein vielleicht im Normalfall schnelleres String.Replace. Je nachdem wie lang der Text tatsächlich ist und wie früh der String darin vorkommt. [EDIT] Ok, bei Replace muss der String als nonmutable Objekt natürlich immer bis zum Ende kopiert werden, was dieses Argument für diesen Fall vermutlich ad absurdum führt. [/EDIT]

Ich will gar nicht sagen, dass Regex.Replace immer die beste Lösung ist. Ich will nur sagen, es kommt immer darauf an. Und es kommt natürlich darauf an, welche Kriterien man für "besser" hat, also auf welche Aspekte man abhebt.

Hinzukommt, dass es bei einer einmaligen Ersetzung in einem einzelnen überschaubar langen Text sowieso fast immer völlig egal ist, ob der Aufruf ein paar Mikro- oder vielleicht auch Millisekunden mehr oder weniger dauert. :-)

herbivore

Thema: Nur ein Vorkommnis mit Regex.Replace ersetzen
Am im Forum: Rund um die Programmierung

Hallo BhaaL,

möglicherweise sind es sehr effiziente Kanonen. :-)

Soweit ich weiß ist Regex.Replace sehr effizient implementiert, wenn der Pattern aus einem statischen String (mit mindestens fünf Zeichen) besteht (oder mit einem solchen statischen String beginnt). Dann wird - wenn mich recht erinnere - der String nicht Zeichen für Zeichen durchsucht, sondern es können bestimmte Stellen übersprungen werden, von denen man aufgrund der trickreichen Implementierung weiß, dass dort der Pattern nicht passen kann.

Nehmen wir an, der statische String ist 10 Zeichen lang. Dann vergleicht man zuerst das 10 Zeichen des Textes mit dem 10 Zeichen des Strings. Wenn das nicht passt, dann kann der String nicht am Anfang des Textes passen. Wenn dieses Zeichen nun aber an keiner anderen Stelle im String vorkommt (was man mit etwas Vorarbeit natürlich effizienter prüfen kann, als den statischen String nach diesem Zeichen zu durchsuchen), dann kann der Pattern aber auch an keiner anderen der ersten 10 Stellen im Text passen. Man kann also gleich 10 Zeichen weiter springen und das Spiel von neuem beginnen. So muss man (oder eben Regex.Replace) im Idealfall nur alle 10 Zeichen prüfen. Je länger der statische String, desto größer die (möglichen) Sprünge.

Wie gesagt, ich gehe davon aus, dass Regex.Replace so oder so ähnlich implementiert ist.

Mag natürlich sein, dass String.Replace ebenso trickreich vorgeht. Aber das ist ungewiss (mit dem Reflector sieht man nur, dass eine interne Methode aufgerufen wird) und so ist es nicht per se gesagt, dass Regex.Replace schlechter oder langsamer ist, als String.Replace, möglicherweise sogar deutlich schneller. (Was aber sowieso erst bei sehr, sehr langen Strings einen spürbaren Unterschied machen wird oder machen kann.)

Bei Regex.Replace muss man natürlich aufpassen, dass der String keine Zeichen enthält, die eine Sonderbedeutung haben, also nicht für sich selbst stehen. Oder falls solche Zeichen vorkommen, muss man Regex.Escape verwenden oder selber passend escapen.

herbivore

Thema: Nur ein Vorkommnis mit Regex.Replace ersetzen
Am im Forum: Rund um die Programmierung

Hallo alimurat12,

ein Blick in die Doku hätte dir gezeigt, dass es auch Überladungen von Regex.Replace mit dem Parameter count gibt, der bestimmt, wie viele Ersetzungen durchgeführt werden sollen. In deinem Fall würdest du für count 1 übergeben.


Hallo BhaaL,

... solche Überladungen gibt es für String.Replace wohl nicht. Ich habe jedenfalls in der Doku keine gefunden. Weshalb String.Replace für den konkreten Anwendungsfall wohl nicht hilft.

herbivore

Thema: Wie designe ich die Datenbank für ein Quiz mit drei verschiedenen Fragearten?
Am im Forum: Datentechnologien

Hallo ErfinderDesRades,

ich habe ein paar Anregungen zur Verbesserung deines Datenmodell, welches du in dem verlinkten Thread vorgestellt hast. Jeweils begonnen mit einer in den jeweiligen Aspekt einleitenden und anregend gemeinten Frage.

Warum gibt es keine Fragen mit Bild und Multiple-Choice-Antwort? Nach dem Motto, wer ist auf dem Bild zu sehen: A, B, C?

Warum unterscheidest du eine Bildfrage von einer Text-Frage? Es sind doch auch Fragen denkbar, die Bild *und* Text erfordern. Oder mehr als ein Bild. Nach dem Motto, auf welchem der Bilder ist Person X zu sehen: 1, 2 3? Mach doch so, dass man als statt Text besser HTML oder sicherer BBCode verwenden und so beliebige Bilder (und andere Objekte z.B. Videos ) einbinden kann.

Warum unterscheidest du Spell- und MC-Antworten? Mach es doch so, dass zu jeder Frage beliebig viele Antworten möglich sind. Und wenn es zu einer Frage nur eine Antwort gibt, dann wird diese nicht als MC-Radiobutton angezeigt, sondern als Spell-Eingabefeld.

Im Ergebnis hast du ein wesentlich einfacheres Datenmodell mit nur einer Art von Fragen und nur einer Art von Antworten, sparst dir redundante IDs-Felder, die im momentanen Modell zudem noch semantischen Einschränkungen unterliegen (immer nur eine gesetzt) und erreichst trotzdem alles, was du willst und bist sogar noch deutlich flexibler.

Selbst wenn du dich dafür entscheidest, die Trennung zwischen Text und Bildfragen aufrecht zu erhalten, solltest du die explizit Trennung zwischen Spell- und MC-Antworten aufgeben. Mindestens sollte die unterschiedliche Art von Fragen und die unterschiedliche Art von Antworten entkoppelt sein, so dass man beliebig kombinieren kann. Empfehlen würde ich persönlich natürlich die Umsetzung aller Vorschläge.

Bei Multiple-Choice (also wenn es mehr als eine Antwort gibt (egal, ob 2 z.B. Ja/Nein, 3, 4 oder mehr) wäre es schön, wenn man bei der Frage noch angeben kann, ob die Antworten in der vorgegebenen Reihenfolge angezeigt werden oder in einer zufälligen.

herbivore

Thema: Verständnisproblem mit Regex
Am im Forum: Grundlagen von C#

Hallo zusammen,

der Tipp mit dem Fragezeichen, um das gierige Verhalten abzuschalten, kann bei bestimmten Pattern auch nach hinten losgehen. Statt .*? ist [^%>]* besser, sofern die Zeichen auch einzeln nicht erlaubt sind. Sie sie nur zusammen als %> nicht erlaubt, dann ((?!%>).)*

In RegEx kürzester Match [und die Gefahren von .*?] habe ich das Prinzip genauer beschrieben.

herbivore

Thema: Ist eine Loganalyse für eine Bachelorarbeit geeignet?
Am im Forum: Smalltalk

Hallo af243r2,

jede Software-Entwicklung setzt eine mehr oder weniger eingehende Analyse des Problems voraus. Bei komplexen, noch nicht (vollständig) verstandenen Problemen (z.B. natürlichsprachliches Verstehen, Bilderkennung u.a.), kann schon die Analyse(-phase) mehrere Monate (oder sogar Jahre und im Extremfall Jahrzehnte) beanspruchen, ohne dass in dieser Zeit auch nur eine einzige Zeile Code geschrieben wird. Software-Entwicklung auf die Produktion von Code oder eines fertigen Programms zu beschränken, würde mir zu kurz greifen. Selbst wenn die Lösung des Problems später in der Konfiguration oder dem Einsatz von existierenden Tools besteht, bleibt doch die dafür nötige Analyse vergleichbar einer Analyse wie sie für die Entwicklung eines eigenen Tools nötig ist.

Daher sehe ich keine prinzipiellen Gründe, aus denen das Thema ungeeignet wäre. Klar besteht, wie es weismat gesagt hat, bei einer reinen Analyse viel eher das Problem, dass man auf (unüberwindliche) Hindernisse stößt, als wenn man sich ein so überschaubares Projekt sucht, dass man in den drei Monaten sicher analysieren, designen, implementieren und testen kann. Aber das musst du wissen, ob das Risiko (und die darin liegenden Chancen) es dir Wert sind. Wäre ja langweilige, wenn alle immer nur die gleichen schon abgegrasten Felder behandeln würden.

Ich würde das Problem zudem von zwei Seiten angehen. Zum einen, welche Schlüsse über Zusammenhänge kann man aus vorhandenen Logs mit ausreichender Zuverlässigkeit erschließen. Zum anderen, wie müssten Log-Einträge idealerweise aussehen und welche Informationen müssten sie enthalten, damit die Zusammenhänge explizit ermittelbar sind. Zum Beispiel könnte beim Auftreten des initialen Fehlers eine GUID generiert werden, die bei dieser Meldung und bei allen darauf aufbauenden ausgegeben wird. Dann wäre der Zusammenhang der Meldungen eindeutig. Am Ende kann man dann quantitativ ermitteln, wie viel schon ohne solche Maßnahmen erkennbar/erschließbar ist und hätte somit einen schönen wissenschaftlichen Vergleich, egal wie schlecht die Erfolge beim Erkennen von Zusammenhängen in bestehenden Logfiles sind.

herbivore

Thema: Alle Wörter beginnend mit einem @ aus String extrahieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Rioma,

zur eigentlichen Frage: verwende Regex.Matches statt Regex.Match.

Im konkreten Fall mag nativer Code lesbarer sein als Regex, aber auch das nur für Leute, die kein Regex können. Im allgemeinen halte ich es für eine schlechte Idee, Regex-Pattern als nativen Code auszuprogrammieren. Einen konkreten Vergleich gibt es in Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch und den folgenden Beiträgen.

Auch in dem Beispiel hier bekommt man ja schon einen Eindruck, wie viel länger der native Code als der Pattern wird. Bei komplexeren Pattern, die zugegeben auch nicht einfach zu lesen sind, erschlägt einen dann schon die reine Menge des ausprogrammierten Codes.

Änderungen oder Feintuning an einem Pattern sind üblicherweise viel leichter vorzunehmen als im ausprogrammieren Code. Zu diesem Ergebnis kommt jedenfalls dN!3L, der die Aufgabe im Programmierspiel gelöst hat. Ausprogrammierten Code muss man möglicherweise sogar komplett umschmeißen, wo man in Regex mit einer kleinen Änderung auskommt.

herbivore

Thema: Ideen für neues Online Handbuch
Am im Forum: Smalltalk

Hallo BerndFfm,

warum benutzt du für die Steuerbefehle nicht irgendwas Bestehendes? HTML, XML oder BBCode oder von mir aus sogar SGML oder vielleicht noch einen passenderen Standard, den ich gerade übersehe, evtl. erweitert um eigene Tags.

Ich verstehe schon, dass du für Formatierungen wie Kursiv, Fett per WYSIWYG und nicht per Tag vornehmen können willst. Und das ist auch ok. Trotzdem könntest du dich ja bei den Tags, die nicht WYSIWYG gehen, eine bestehenden Auszeichnungssprache verwenden.

Andersherum ist die Frage, warum man z.B. für Überschriften u.ä. Tags verwenden muss. Wenn man für die Überschriften in Word die entsprechenden Formate verwendet (z.B. Überschrift1), dann wären die Überschriften ja auch eindeutig markiert/ausgezeichnet.

Genauso könnte man ein Format für Stichworte definieren. Dann muss man das Stichwort in Word nur markieren, das Format vergeben und fertig.

Versteh mich nicht falsch. Ich bin ein Fan von Auszeichnungssprachen. Und ich liebe es, wenn die Textformatierungen als Tags explizit sichtbar sind. Auf der anderen Seite gibt es Leute, die stehen voll auf WYSIWYG. Für die wäre es praktisch, wenn sie gar keine Tags verwenden müssten.

So wie du es jetzt hast, ist es - wenn ich es richtig verstanden habe - ein Mix zwischen Tags und WYSIWYG.

Gerade in Bezug auf die Frage, ob man sowas verkaufen könnte, sollte das Konzept durchgängig, schlüssig und praktikabel sein. Und sich an bestehendem orientieren.

Das alles natürlich nur als Anregung. Du entscheidest.

herbivore

Thema: Ideen für neues Online Handbuch
Am im Forum: Smalltalk

Hallo BerndFfm,

grundsätzlich finde ich sowas cool. Ich persönlich würde jedoch nur ein weit verbreitetes Produkt einsetzen (oder was, was ich selber geschrieben hätte. :-) Sonst wäre mir zu unsicher, dass man aufs falsche Pferd gesetzt hat und alles (mühsam) auf ein anderes Produkt umstellen muss, wenn deins nicht mehr gefegt oder weiterentwickelt wird.

Drei Überschriftenebenen halte ich für zu wenig. Wenn man es überhaupt beschränken muss, dann auf sechs, wie bei HTML. Das bedeutet nicht, dass man das ausschöpfen sollte. Nur sollte man die Beschränkung so hoch wählen, dass man nie dran stößt. Und vier oder vielleicht auch fünf Ebenen können in komplexen Dokumenten schon vorkommen.

Wie kommen denn die Steuerbefehle in den Text? Also wie sagte ich z.B., dass etwas eine Überschrift oder ein Link oder ein Stichwort ist?

Wie hast du die Anzeige realisiert? Per WebBrowser-Control?

BTW: Ich bin ein Freund von Offline-Handbüchern und mag Online-Handbücher nicht. Wenn man eine Software einsetzt, dann gehört in meinen Augen das Handbuch genau für die jeweilige Version dazu. Bei einem Online-Handbuch halte ich die Gefahr zu groß, dass es seiner Zeit voraus ist, also sich auf die aktuelle Version bezieht, statt auf die eingesetzte. Oder der Hersteller bzw. Betreiber die Handbücher alter Versionen gar nicht mehr bereithält. Wenn man die Software aktualisiert, dann kann ja auch das Offline-Handbuch aktualisiert werden. Und wenn nicht, dann nicht. So oder so passt das Offline-Handbuch immer garantiert zur eingesetzten Version und ist immer verfügbar.

herbivore

Thema: RegEx Problem mit xxx(?!yy)zzz
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Cornflake,

Zitat
Habe es jetzt hinbekommen.
wenn du eine eigene Lösung gefunden hast, kommt es immer gut, sie auch für die Nachwelt zu schreiben. :-)
Zitat
der Assert (look behind, look ahead) mit (?...) nicht zwischen zwei Begriffen stehen kann
Nein, ein look behind/ahead kann überall stehen. Er zählt nur eben immer als 0 Zeichen breit, egal wie viele Zeichen er umfasst. Dein Pattern "frisst" also das 54 bzw. die beiden anderen Ziffern, die stattdessen dort stehen, nicht weg. Falsch wäre also ^.{4}(?!54).{5}\r\n, denn von der Stelle, wo dein look ahead passt (bzw. nicht passt) sind es noch zwei Ziffern und fünf x bis zum Zeilenende. Richtig wäre also

^.{4}(?!54).{7}\r\n oder
^.{4}(?!54)...{5}\r\n oder vielleicht noch klarer
^.{4}(?!54)\d\d.{5}\r\n oder noch einfacher
^.{4}(?!54), denn was für Ziffern außer der 54 kommen und was am Ende der Zeile kommt, ist dir ja eh egal.

Dein Pattern ist also auch richtig. Wenn er nicht passt, dann wohl eher wegen des \r\n (besser $, bei fortlaufendem Text statt einzelnen Zeilen noch mit RegexOptions.Multiline) oder wegen einer falsch gesetzten Singlline Option.

herbivore

Thema: screenshot von fremden fenstern im hintergrund
Am im Forum: Grafik und Sound

Hallo james~,

wenn du jeweils (bereits fertigen, getesteten und verlässlichen) Code hast, der auf einen bestimmten Betriebssystem funktioniert, dann musst du nur noch die Version des Betriebssystems ermitteln und den jeweils passenden Code ausführen.

Klar, schöner wäre, wenn ein Code auf allen Systemen laufen würden, aber das scheint ja gerade nicht der Fall zu sein.

herbivore

Thema: Umfrage zu "Smart-Cities"
Am im Forum: Smalltalk

Hallo zusammen,

ich finde, ihr solltet die Kritik nicht übertreiben. Vermutlich ist es seine erste Umfrage und am Ende lernt man ja auch aus Fehlern. Und bei Fragen wie "Wasser aus dem Wasserhahn" kann es sich um Kontrollfragen handeln, mit der man zufällig und böswillig ausgefüllte Fragebögen ausfiltern kann, eben gerade weil vermutlich jeder, der den Fragebogen ernsthaft ausfüllt, mit "sehr wichtig" antworten wird.

Es gibt ja auch einige andere Fragen, die teilweise redundant sind. Auch solche Fragen dienen dazu, herauszubekommen, ob hier konsistent und damit vermutlich ehrlich oder rein zufällig geantwortet wird. Aber natürlich macht es weniger Sinn, solche redundanten Fragen direkt hintereinander zu stellen. Wenn sie aber absichtlich nicht beieinander stehen, sieht das für den ehrlichen Ausfüller natürlich etwas durcheinander gewürfelt aus.

Außerdem ist Smart-City ein Oberbegriff, der eben tatsächlich sehr viele unterschiedliche Bereiche betrifft. Da muss man notgedrungen viele verschiedene Themenbereiche ansprechen/abfragen.

Klar, einige Fragen könnten konkreter sein. Beim City-Bike könnte es sich zum Beispiel um einen Fahrradtyp handeln (hier: Alltagsrad für die Stadtgebrauch im Gegensatz zum Mountain-Bike) oder um ein Fahrrad-(Kurzzeit-)Mietsystem.

Trotzdem habe ich den Fragebogen nach besten Gewissen und Gewissen ausgefüllt. Wenn man sich nicht in Detailüberlegungen verliert, dann klappt das schon halbwegs vernünftig.

herbivore

Thema: Zwei Zahlenlisten abgleichen, fehlende Einträge finden und ausgeben
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Santana,

in zwei geschachtelten Schleifen alle Objekte mit allen vergleichen bedeutet quadratischen Aufwand. Zu den negativen Auswirkungen von quadratischem Aufwand bei größeren oder wachsenden Listen siehe Warum haben WinForms, DataGridView & LINQ eine gute Performance? [==> lineare Aufwandsklasse] ff und Mergesort langsamer als Bubblesort? [==> Nein, Messfehler / Aufwandsklasse vs. Mikrooptimierungen].

Man sollte entweder Dictionary/HashSet/Hashtable verwenden, um den Aufwand auf linear zu drücken (siehe [Artikel] Dictionary/HashSet/Hashtable: Grundlegende Informationen, Abschnitt "Hashtables zur schnellen Prüfung auf Enthaltensein") oder eine Linq-Variante verwenden, die intern die genannten Datenstrukturen verwendet.

Tut man das nicht bekommt man - möglicherweise plötzliche - Performance-Probleme, wenn die Liste im Laufe der Zeit wächst oder man es irgendwann zufällig mal mit einer viel größeren Liste zu tun hat.

BTW: Um die Objekte als Strings vergleichen zu können, reicht es nicht, wenn nirgends Leerzeichen vorkommen, sondern die Darstellung muss grundsätzlich normalisiert sein, also bei den gleichen Zahlenwerten muss sich immer der exakt gleiche String ergeben. Optionale führenden oder folgende Nullen oder unterschiedliche Repräsentationen des Wertes 0 (z.B. als 0, -0 oder <leer>) oder optionale Tausender- oder unterschiedliche Dezimaltrenner usw. darf es also alles nicht geben.

herbivore

Thema: Eigener SQL Server einrichten incl. Hardware
Am im Forum: Smalltalk

Hallo Taladan,

ich sehe den Engpass auch in der Bandbreite, mit der von Zuhause Daten ins Internet fließen können. Insbesondere wenn mehrere User gleichzeitig zugreifen oder gar Downloads machen. Und - wie [email protected] ebenfalls sagt - in möglichen Einschränkungen aus dem Vertrag mit dem Provider.

Was die feste IP-Adresse angeht hat mir ein hochrangiger Telekom-Techniker gesagt, dass die Zwangstrennung nach 24 Stunden von Seiten der Telekom weggefallen ist. Allerdings sind viele Router so konfiguriert, dass sie der Zwangstrennung mit einer selbst ausgelösten Trennung zuvorkommen. Außerdem würde sich die IP-Adresse ändern, wenn die Verbindung wegen eines Synchronisationsfehlers oder einer sonstigen Störung mal abbricht.

Insgesamt denke ich nicht, dass man durch einen häuslichen Internet-Server Vorteile hat, die die Nachteile überwiegen.

herbivore

Thema: WinForms - In Textbox Sonderzeichen (bspw. grüner Haken, Rufzeichen) darstellen
Am im Forum: GUI: Windows-Forms

Hallo Martin877,

aus meiner Sicht, ist das eine ganz andere Frage, ob man ein Zeichen/Symbol im Windows Explorer (in einem anderen Prozess) oder in einer TextBox (im eigenen Programm) darstellen will. Es wäre besser gewesen, wenn du die Frage in einem neuen Thread gestellt hättest.

In einer Textbox solltest du - wenn du einen Font eingestellt hast, der die gewünschten Zeichen enthält - beliebige Unicode-Zeichen darstellen können. Allerdings erstmal nur in der Farbe, in der der restliche Text dargestellt wird.

In einer RichTextBox kannst du aber bestimmte Textteile auch formatiert darstellen, z.B. in Fettschrift und wenn ich mich richtig erinnere auch farbig. Das wird wohl der einfachste Weg sein.

Zur Formatierung von Text in Rich-TextBoxen findest du allen nötige Informationen im Netz.

herbivore

Thema: Projekt: FileRenamer
Am im Forum: Projekte

Hallo Abt,

ohne eine explizite Angabe einer Lizenz gelten für auf myCSharp.de veröffentlichte Projekte automatisch die Festlegungen in Lizenzbedingungen für die Projekte / Spezielle Regeln für Projekte-Threads. Trotzdem ist es natürlich besser, immer explizit eine Lizenz anzugeben.


Hallo mfe,

Zitat
beliebigen Text vor Dateinamen hinzufügen
beliebigen Text nach dem Dateinamen hinzufügen
ich schlage vor, Regex zum Suchen und Ersetzen zu verwenden (Regex.Match bzw. Regex.Replace). Dann kann man beliebige Ersetzungen vornehmen, auch Einfügungen mitten im Dateinamen sowie Auslassungen und Umstellungen. Siehe dazu auch [Artikel] Regex-Tutorial On-the-fly Regex-Tester: Regex-Lab.

herbivore

Thema: Event handling mit eigenen events und 1:n Beziehungen
Am im Forum: Grundlagen von C#

Hallo pisacou,

der FAQ-Beitrag ist aktuell!

Dass er im Kern schon sehr alt ist, spielt keine Rolle, weil zum einen Events ein so grundlegender und integraler Teil von C# und .NET sind, dass sich da nichts wesentliches getan hat und weil zum anderen der Thread auf die wenigen existierenden Unterschiede bezüglich der Events zwischen .NET 1.x und .NET 2.0 sowie die Änderungen ab .NET 3.0 eingeht.

Entwicklungen und Varianten auf dem Gebiet des Observer-Pattern (ohne die Verwendung von .NET-Events) spielen keine Rolle für das Thema .NET-Events. Unter .NET sollte man keine der Varianten des Observer-Pattern (ohne .NET-Events) einsetzen, sondern immer .NET-Events verwenden.

.NET-Events sind wie gesagt so elementar und essentiell, dass man sie unter C# und .NET auf jeden Fall so wie vorgesehen verwenden sollte - unter Einhaltung aller(!) Programmier- und Namenskonventionen, die es von Microsoft dazu gibt und die auch alle in dem FAQ-Thread genannt werden. Dazu rate ich ganz dringend.

Mir sind in all den Jahren kleine Gründe bekannt geworden, die einen zwingen würden, von den Konventionen abzuweichen. Alles, was im Zusammenhang mit Events realisieren möchte, kann man ohne unnötigen Aufwand und ohne erst recht ohne echten Verlust unter Einhaltung der Programmier- und Namenskonventionen tun.

Ich schließe mich FZelle an, dass es wichtig ist, sich auf die im FAQ-Thread empfohlene Vorgehensweise gedanklich und tatsächlich voll einzulassen. Die Frage darf also nicht sein, welche Empfehlungen muss ich weglassen, um mein Ziel zu erreichen, sondern wie erreiche ich mein Ziel unter Einhaltung alle Empfehlungen. Wenn man erstmal die gedanklichen Hürden, die dadurch entstehen, wie man es bisher gemacht hat oder wie man es unter Java machen würde, überwunden hat, dann steht einem mit .NET-Events ein guter, praktischer und praktikabler Weg offen.

herbivore