Laden...
Avatar #avatar-4122.png
LaTino myCSharp.de - Experte
Softwareentwickler Thüringen Dabei seit 03.04.2006 3.003 Beiträge
Benutzerbeschreibung

Forenbeiträge von LaTino Ingesamt 3.003 Beiträge

29.01.2019 - 07:22 Uhr

Was eine Empfehlung für dich so schwierig macht: du hast (scheinbar) nur sehr schwammige Vorstellungen davon, wie eine "web app" funktioniert. Die Antworten wären deshalb immer nur die halbe Wahrheit und auch immer in Gefahr, von dir falsch verstanden zu werden.

Möglicherweise - ich bin mir da selbst nicht sicher - hilft dir die Beschäftigung mit node erst einmal, die einzelnen Komponenten und ihr Zusammenspiel für eine "web app" zu verstehen. Der Vorteil ist, dass man in node den gesamten Stack abdecken kann und sich nicht noch mit Technologieauswahl beschäftigen muss. Eine kleine Anwendung reicht - serverseitig eine API mit wenigen Schnittstellen (ohne I/O, also keine Datenbank und dergleichen), clientseitig ein bisschen HTML mit einem script, das die Schnittstellen anspricht. Mögliche Schnittstellen wären ein echo oder ein Rechner oder etwas in der Art.

Wenn du das verinnerlicht hast, kannst du dir die Technologie aussuchen, die du benutzen möchtest. Das kann node sein, das kann Django sein, das kann ASP.NET Core sein (ASP.NET bitte nicht mehr verwenden), das kann auch eins der anderen drölftausend existierenden Webframeworks sein.

Deine bisherigen Programmiererfahrungen wirst du nur sehr begrenzt anwenden können: deshalb mach erst neue, bevor du etwas implementierst.

LaTino

25.01.2019 - 08:40 Uhr

@Abt, die Middleware ist in 99% der Fälle keine Option. Das ist der Job des reverse proxy, und dabei sollte man es auch belassen.

When to use Response Compression Middleware
Use server-based response compression technologies in IIS, Apache, or Nginx. The performance of the middleware probably won't match that of the server modules. HTTP.sys server server and Kestrel server don't currently offer built-in compression support.

Die einzigen Anwendungsfälle sind, wenn man

  • auf reverse proxy verzichtet und Kestrel oder WebLIstener "nackt" laufen lässt (fettet no-no, wie Abt zu Recht geschrieben hat)
  • wenn der benutzte reverse proxy aus irgendwelchen Gründen keine Kompression anstellen kann (absoluter Ausnahmefall)

Also: schalte die Kompression in deinem Nginx/Apache/IIS an, und dein Problem ist erledigt.

LaTino

25.01.2019 - 08:27 Uhr

Das liegt an der Art und Weise, wie Computer gebrochene Zahlen speichern.

http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm

Versuch's mal mit decimal stattdessen. Hat zwar das selbe grundlegende Problem, aber mehr Platz zum Speichern und ist daher genauer.

LaTino

EDIT: war hier im Forum auch schon oft Thema: [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler

24.01.2019 - 16:30 Uhr

HTTP Compression. Die Komprimierung auf Anwendungsebene zu implementieren, ist keine so richtig dolle Idee.

LaTino

23.01.2019 - 10:41 Uhr

Bei solchen Szenarien besteht hin und wieder auch die Notwendigkeit für ein Basisinterface, damit man beliebige Implementierungen (also auch für beliebige generische Parameter) in eine gemeinsame Collection packen kann.

Also das hier:


interface IDataElement
{
    int Id { get; }
}

interface IGenericDataElement<T> : IDataElement where T: GenericBaseType
{
  T Element { get; }
}

//aufrufender Kontext
ICollection<IDataElement> list = new List<IDataElement>();
list.Add(new TableXObject());
list.Add(new TableYObject());
...

Fraglich ist dann auch, ob man das generische Interface überhaupt benötigt, wenn es eh nur eine direkte Implementierung (nämlich die abstrakte Basisklasse) gibt. Wenn nicht - weg damit, aber das kann man sicher auch anders sehen und ist eh nur Kosmetik.

LaTino

17.01.2019 - 11:53 Uhr

Was p!lle sagt. Wir reden hier von Azubis. Normalerweise ist die Motivation da das wichtigste, wenn nicht einzige, Kriterium. Und besser als mit Code kann man nicht demonstrieren, dass man von sich aus bereits Zeit in das Thema invesiert hat.

(selbst bei Entwicklern. Ich nehme eher den, der ein paar akzeptierte PR in github-Projekten oder einige private Projekte auf github oder Azure Repositories hat, als den, der von seinen Projekten nur erzählen kann. Egal, wie der Code aussieht. Nein, wirklich.)

LaTino

16.01.2019 - 07:58 Uhr

Eigene Projekte habe ich bisher leider noch nicht selbst gemacht, höchstens bestehende angepasst. Ich mache über Udemy einen Kurs da geht's um 2D Spieleprogrammierung mit Unity.

Erwähn' das im Gespräch, und sei vorbereitet, bei Nachfragen den Link zum GitHub-Projekt mit deinen Ergebnissen parat zu haben. Den Personaler, bei dem das kein Mega-Pluspunkt wäre, gibt's nicht.

LaTino

21.12.2018 - 11:34 Uhr

Brunel sei noch genannt. Wir haben insgesamt aber bessere Erfahrungen mit kleinen, lokalen Vermittlern als mit den großen gemacht.

LaTino

20.12.2018 - 15:47 Uhr

Der vollständige Name ist "ODP.NET, Managed Driver". Das ist dasselbe und kann ohne lokale Installation per nuget eingebunden werden, wie Abt gesagt hat.

4.9 MB https://www.nuget.org/packages/Oracle.ManagedDataAccess

Alternativ die .net standard-Variante:

4.5MB https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core

Und ja, das Handling von verschiedenen Client-Versionen ist seitens Oracle einfach unterirdisch schlecht. Mit nuget spart man sich einige graue Haare.

LaTino

13.12.2018 - 15:57 Uhr

Ich bezog mich auf die Reports von synergy. Laut denen ist aws mit großem Abstand Marktführer, und zwar a) weltweit und b) besonders bei PaaS. Dort haben sie etwa den vierfachen Marktanteil von MS, die allerdings schneller wachsen. Dass Azure deutlich größer als AWS und GDP zusammen sei, ist jedenfalls das Gegenteil von dem, was alle mir zugänglichen Quellen sagen. Aber was weiß ich schon, bin ja nur Stammtisch-Brabbler.

LaTino

13.12.2018 - 09:22 Uhr

Ja, eben. Und IAAS ist noch das Segment, das für die Mitbewerber gut aussieht.

Aber ich wollte eigentlich nicht derailen, Entschuldigung.

LaTino

13.12.2018 - 08:11 Uhr

Davon abgesehen, dass Azure deutlich größer ist als AWS und GDP zusammen

Äh, was? AWS ist mit großem Abstand Marktführer.

LaTino

05.12.2018 - 08:56 Uhr

ServiceHealthBehavior is a new service behavior (IServiceBehavior) for WCF services that exposes a “?health” endpoint. This new behavior allows one to monitor the internal state of their WCF service and obtain specific HTTP response codes during those times that listeners become faulted, throttle capacities are reached, etc. One can extend this behavior to further scope the health of their WCF services to match their own custom business rules and needs. [620852, System.Servicemodel.dll, Feature, Build:3694]

Woohoo.

LaTino

05.12.2018 - 08:44 Uhr

Wir benutzen das, um beim Umsetzen einer bestimmten Industrie-Spezifikation einige vorgeschriebene vertikale Prozesse zu integrieren. Das wäre auch ohne AOP (wir machen das mit PostSharp) gegangen, aber so ist es tatsächlich übersichtlicher. Ich sehe das jetzt aber nicht als Wald- und Wiesen-Technologie, man kann sehr gut ein Leben lang Software entwickeln, ohne damit in Berührung zu kommen.

LaTino

05.12.2018 - 07:50 Uhr

StuxNet hat ja gut gezeigt, was mit genügend Geld und Hirnschmalz möglich ist. Das schlimme ist eigentlich nur, dass es nur wenige Institutionen gibt, die soviel Geld und Kapazitäten haben.* Genau genommen werden also nicht Hacker die Macht übernehmen, sondern die. (Oje, "die" klingt jetzt schon sehr nach Aluhut. Die Institutionen, die's sich leisten können halt. Eine Handvoll Geheimdienste, im Wesentlichen.)

LaTino

  • Könnte das jeder, wäre das kein wesentlich angenehmeres Szenario.
03.12.2018 - 14:19 Uhr

Was der service da antwortet, ist die challenge für basic authentication. Aus seiner Sicht ist also soweit alles in Ordnung und er erwartet in der Antwort des clients dann die Credentials, die du eingetragen hast.

Nimm mal ein Netzwerk-Traffic-Mitschneide-Tool deiner Wahl (wireshark, fiddler) und guck dir damit an, was dein Client so übers Netz versendet.

(Sollte so aussehen: https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)

LaTino

29.11.2018 - 10:35 Uhr

Wie Th69 schrieb: da läuft nichts nebenläufig. Wenn das Event abonniert wurde, laufen alle EventHandler durch und dann geht's erst weiter.

Sieh die Eventhandler als eine Art ausgelagerte Methode. Nur, dass man nicht weiß, wieviele es sind, und was die genau machen.

LaTino

29.11.2018 - 10:25 Uhr

Es ist schon klar, daß man Unicode-Texte mittels
>
lesen sollte.

Dir, ja 😉. Im Thread steht aber sinngemäß "man kann ein Zeichen per (char)ReadByte() auslesen." (Was in diesem Fall geht, ja.)
Deshalb der Hinweis, dass man da ganz schnell in Teufels Küche kommen kann.

29.11.2018 - 08:39 Uhr

Hinweis: ReadByte auf char zu casten funktioniert nur für 255 Zeichen von etwas über eine Million in Unicode darstellbaren. Zugegeben, für die mit Abstand häufigsten, dennoch ist diese Vorgehensweise beim Arbeiten mit Text etwas, was einem potenziell das Genick bricht.

LaTino

28.11.2018 - 11:53 Uhr

Darauf wollte ich hinaus, weil ich im Ggs zu Abt die von Paypal verwendete TLS-Version nicht wusste. Nebenbei: ja, dem Zertifikat von Telerik kann man wohl vertrauen 😃.

27.11.2018 - 16:08 Uhr

Uh. Die Frage ist nachvollziehbar, wenn man versucht, einmal alles zu vergessen, was man über Klassen weiß. Ich versuch es so einfach wie möglich zu erklären, aber nichtsdestotrotz solltest du dir dringend die Grundlagen der OOP vertraut machen, dann stellen sich solche Fragen gar nicht 😃. Die Erklärung ist nicht 100% exakt, aber dafür hoffentlich verständlicher.

Erstens:
Deine Arrays erfüllen unterschiedliche Funktionen. In einer Methode sind sie lokale Variablen, in der Klasse sind sie Felder (interne "Mitglieder" der Klasse). Nur, weil sie jeweils den gleichen Typ haben, sind sie nicht dasselbe.

Zweitens:
C# gibt dir die Möglichkeit, ein Feld zu deklarieren und sofort zu initialisieren.


class Example 
{
    private string[] _myField = new string[3];
}

Normalerweise würde man ein Feld im Konstruktor der Klasse initialisieren. C# erlaubt eben auch diese Initialisierung. Was C# aber nicht erlaubt, ist eine Referenzierung (Bezugnahme) auf das Feld _myField außerhalb eines Methodenkontexts. Das Feld wird erst angelegt, wenn die Klasse Example mit new Example() instanziiert wird. Es wird also vorher recht schwierig, auf etwas Bezug zu nehmen, was noch nicht existiert. Davon abgesehen: wenn so etwas ginge, wann sollte es ausgeführt werden? Bei der Erzeugung des Objekts? Vorher? Vor dem Konstruktor? Nachher?

Drittens:
C# erlaubt bei Arrays die Direktinitialisierung mit Werten. Das ist die Notation mit den geschweiften Klammern und funktioniert auch bei statischer Initialisierung (Punkt 2). Wenn du ein Feld hast, das du nicht direkt initialisieren möchtest, dann initialisier es bitte im Konstruktor. Dafür ist er da.

Viertens:
Wenn du das Feld statisch initialisieren möchtest, aber keine Direktinitialisierung verwenden kannst (das ist bei alten C#-Versionen der Fall), dann nimm einen statischen Konstruktor. Das wird bei dir aber kaum der Fall sein.

LaTino

27.11.2018 - 13:24 Uhr

Schau dir den TLS Handshake im Fiddler an.

LaTino

14.11.2018 - 11:51 Uhr

Ja. Deine DLL arbeitet gegen eine .NET-Framework-Version. Wird sie von Gupta gewrappt, arbeitet sie gegen die Frameworkversion, die Gupta eben vorgibt / kennt / unterstützt (ich habe hier selbst nur eine ungefähre Vorstellung davon, wie Gupta arbeitet, weil ich mit pre-.NET-Versionen von Centura arbeite, was noch größere Schmerzen sind). In deinem Fall Framework 4.0. Und die Aushandlung der Transportsicherheit findet durch das Framework statt, nicht durch deinen Code. Dein Code benutzt nur die Infrastruktur, die das Framework bietet. Benutzt du die DLL durch .NET selbst, arbeitest du mit Framework 4.5, die kennt die TLS-Version (ich nehme an, 1.2). Benutzt Gupta die DLL, arbeitest du mit Framework 4.0, und die kennt kein TLS 1.2 und wirft eine Exception.

Zumindest ist das der Reim, den ich mir darauf mache.

LaTino

14.11.2018 - 07:59 Uhr

Ich würde eher darauf tippen, dass der Wrapper, der von Gupta benutzt wird, um die .NET-dll aufzurufen, so alt ist, dass er TLS nicht in der Version kennt, die das Gegenüber benutzen möchte. Ich würde meinne Installation von Team Developer 2000 (!) darauf verwetten.

LaTino
(Edit: die schlechte Nachricht - mir fällt nix ein, was man dagegen machen könnte.)
(Edit2: ja. TD 6.2 unterstützt laut http://www.md-consulting.de/wp-content/uploads/2016/10/OpenText_Gupta_Team_Developer_Compatibility_Matrix.pdf nur .NET 4.0 und damit keine neuere TLS-Version. Ihr solltet upgraden.)

12.11.2018 - 14:28 Uhr

Entschuldige bitte, wenn ich das so offen sage, aber du hast ganz offenbar weder Iteratoren noch das Prinzip von Linq ansatzweise verstanden.

LaTino

12.11.2018 - 08:11 Uhr

Es gibt Fälle wo man mit einer einfachen Schleife und somit nur einem einmaligem Durchlauf über die Liste eine bessere Lösung bekommt als mit n-Linq Operationen, da hier durch die einzelnen Zwischenergebnisse durchlaufen werden muss, was dann eben deutlich länger dauert.

Es ist mitnichten so, dass pro Linq-"Operation" einmal die Liste und alle Zwischenergebnisse durchlaufen wird, wo hast du denn den Unsinn her?

LaTino

29.10.2018 - 12:05 Uhr

Nunja - mir fällt auf die Schnelle nur ein Grund ein, eine JSON-Serialisierung selbst zu machen: zum Lernen. Dafür fallen mir aber sofort etwa ein Dutzend falsche Gründe ein, es selbst zu machen. Daher meine Skepsis, ob es sich bei deiner Frage nicht um ein Problem handelt, dass tiefer liegt als die ursprüngliche Frage.

Und wie gesagt, du kannst Serialisierung-Metainformationen mit Hilfe von Attributen an die Klasse hängen, so wie das bei jeder Serialisierung möglich ist. Das erspart dir die Mühe eines eigenen Converteres und nebenbei sorgt es auch dafür, dass du (i.e. der Serialisierer) die Properties "kennen" muss.

Tatsächlich rührt mein Misstrauen gegenüber deinem Code aber hiervon:


public BaseClass(DerivedClass derivedClass)
        {
            foreach (PropertyInfo sourcePropertyInfo in derivedClass.GetType().GetProperties())
            {
                var destPropertyInfo = GetType().GetProperty(sourcePropertyInfo.Name);
                if (destPropertyInfo != null && destPropertyInfo.CanWrite)
                    destPropertyInfo.SetValue(
                        this,
                        sourcePropertyInfo.GetValue(derivedClass, null),
                        null);

            }
        }

Das ist das Gruseligste, was ich seit einiger Zeit gesehen habe. Zum einen erbt BaseClass sowieso von DerivedClass (btw: Base wäre eigentlich die Basis, und Derived die geerbte, also alles genau umgedreht wie bei dir), d.h. du kannst dir den ganzen Zauber sparen, weil die Properties sowieso vorhanden sind und du an der Stelle die konkrete Klasse gerade in der Hand hältst. Das sieht für mich nach einem Konstrukt aus, das Wissenslücken in der OOP kompensieren soll. Kann man machen, dann muss man sich aber auch Kritik gefallen lassen.

LaTino

29.10.2018 - 08:24 Uhr

wenn du nur die Reihenfolge der Properties beeinflussen musst, warum erstellst du dir da nicht einen eigenen Converter für JSON.NET ?

Nicht einmal so weit müsste er gehen. JSON.NET kennt natürlich Reihenfolgen. Und wenn er JSON.NET nicht benutzen will, müsste er halt ein eigenes Attribut verewenden und dann bei dem Reflection-Zirkus benutzen, um die reflektierten Eigenschaften zu sortieren.

Das macht das Beharren darauf, eine etablierte (und performante), komplette JSON-Serialisierung unbedingt ignorieren zu wollen, nicht unbedingt nachvollziehbarer.

LaTino

22.10.2018 - 14:02 Uhr

Stimmt, ich war davon ausgegangen, dass er prüfen will, ob des sich um einen korrekten math. Term handelt...wollte er ja gar nicht. Also wenn 2 + 2 + 2 ungültig ist, dann mit $ und ^arbeiten. Räum aber mal die überflüssigen Zeichen aus der Regex 😉 .

22.10.2018 - 13:51 Uhr

Deine Regex haut nicht hin.

Form so um:


Ziffer, beliebig oft; Gruppe aus: (
    mindestens ein Leerzeichen; eines von [/*+-];mindestens ein Leerzeichen; Ziffer, beliebig oft
), mindestens einmal

Edit: als BNF:


Term := Zahl, Subterm
Zahl := Ziffer, [Zahl]
Subterm := Operator, Zahl, [Subterm]
Operator := / | * | + | -

LaTino

19.10.2018 - 13:50 Uhr

Weil die Liste eine Liste von Textbox sein soll, und Textbox nunmal ein Objekt ist, und kein string.


txtbx[r] = myErgebnis; //meeep
MessageBox.Show((string)txtbx[r]); //doppel-meeep

Um den Text abzufragen, der in einer Textbox gehalten wird, benutzt man die Property Text.

Außerdem ist deine Anwendung von Random falsch.

Zudem ist das hier völliger Humbug:


int a = rnd.Next(1, 10);
int b = rnd.Next(1, 10);
int Ergebnis = a * b;

Das liefert dir einfach eine Zufallszahl zwischen 1 und 100. Das kann man auch einfacher haben.

LaTino

15.10.2018 - 15:30 Uhr

Entfernen von Knoten ist ziemlich trivial. Da kann man eigentlich nur die Lösung posten:


using (var inStream = File.Open("source.xml", FileMode.Open))
using (var outStream = File.Open("destination", FileMode.Create))
{
    var xDoc = XDocument.Load(inStream);
    xDoc.Root.Descendants("Section").SelectMany(p => p.Elements()).ToList().ForEach(p => p.Remove());
    xDoc.Save(outStream);
}

(Nebenbei bemerkt, ist die Benutzung von XmlDocument völlig unberührt von der Größe der XML-Datei.)

LaTino
EDIT: @ErfinderDesRades, MrSparkle: klar habt ihr recht. Aber wenn es darum geht, optionale Knoten hinzuzufügen oder zu entfernen, muss man sich schon ziemlich gut auskennen, um den XmlSerializer das tun zu lassen, was man möchte. Wenn man sich gut auskennt, ist das sicher der bessere Weg. Ich habe aber den Eindruck, dass hier das XML das Ziel ist, und nicht das deserialisierte Objekt.

12.10.2018 - 07:51 Uhr

@Abt
Aktuell würde es bei mir aber am Router scheitern.
Seit dem Update auf FritzOS 7 bei meiner Cable Box habe ich bei vielen Verbindungen via TCP eine instabile Box.
Hier werde ich wohl auf lange Sicht mit meinem Kabelanschluss samt Fritte nicht glücklich.

Selbes Spiel hier mit Fritz OS 7. Instabilitäten und Verbindungsabbrüche, ganz ohne Kabelanschluss. Also auf den würde ich es nicht schieben 😉.

Ansonsten: ich bin gerade vor 5 Minuten im Aufenthaltsraum unserer Fa. über eine Zeitschrift gestolpert, die sinngemäß titelte "gerüstet für die Zukunft mit Highspeed Internet durch Super-Vectoring". Gute Nacht, Deutschland - so wird das nichts. Deine Schätzung mit 5-10 Jahren dürfte deutlich zu optimistisch sein.

LaTino

10.10.2018 - 12:10 Uhr

Mal etwas von den hochgeschätzten Webfrickelkollegen:

Bin gerade über ein react-Projekt gestolpert, das im Ordner für die statischen Inhalte einen Unterordner für die Icons und dort in -zig Unterordnern für verschiedene Bildgrößen (Schema "8x8", "16x24", "16x16" usw.) ausschließlich .svg-Icons gesammelt haben. Hm - wofür stand das s in svg gleich wieder?

X(

LaTino

09.10.2018 - 14:00 Uhr

9001 zertifiziert das QM, nicht die Qualität der Produkte.
Wenn euer Qualitätmanagement Prozesse beschreibt, die Komponententests beinhalten, dann müsst ihr sie auch einsetzen. Wenn euer QM keine Prozesse beschreibt, die Komponententests beinhalten, dann braucht ihr sie nicht. 9001 zertifiziert nur, dass ihr überhaupt euch mal Gedanken darüber gemacht habt

  • welche Qualität ihr liefern wollt
  • wie ihr diese sicherstellen wollt
  • wie ihr überprüft, ob alle Prozesse so ablaufen, wie ihr sie vorgeschrieben habt

Im Umkehrschluss heisst das: wenn jemand festgelegt hat, dass sein Ziel Bananensoftware (reift beim Kunden) ist, und er darauf aufbauend Prozesse festgelegt hat, die verhindern, dass man viele Bugs findet, bevor der Kunde das Produkt erhält, und wenn er in diesen Prozessen vorschreibt, keine Komponententests zu verwenden: dann wird er nach ISO 9001 zertifiziert, wenn er nachweisen kann, dass er das so festgelegt hat und wenn er nachweisen kann, dass er keine Komponententests verwendet.

Mit der Qualität der Produkte hat ISO 9001 rein gar nichts zu tun.

Eine Anmerkung noch: wenn ihr nur diskutiert, ob Komponententests sinnvoll sind, weil es euch um die Zertifizierung geht...in so einer Softwarebude würde ich nicht arbeiten wollen.

LaTino
EDIT: was du suchst, ist IEC 25000.

09.10.2018 - 07:58 Uhr

Tangiert auch die Entwicklerszene:

Project xCloud: Gaming with you at the center

LaTino

09.10.2018 - 07:47 Uhr

Naja, er schrieb "darin eine globale Variable erstellen", womit er wahrscheinlich ein Feld der Klasse meint. Aber ja, wording ist wichtig 😉.

LaTino

05.10.2018 - 15:44 Uhr

Kanonen und Spatzen. Setz einfach den SerializationBinder hier:


//Startup
services.AddMvc().AddJsonOptions(opt => opt.SerializerSettings.SerializationBinder = new SafeTypeNameHandlingSerializationBinder());

Fertig, einen extra Formatter braucht man wirklich selten.

LaTino
EDIT: Oh, und eine explizte Liste erlaubter Typen fände ich wesentlich toller: Newtonsoft.Json Doku

05.10.2018 - 14:07 Uhr

Wie gesagt, in dem Szenario wäre mir als Anwender die Angabe "auf die Natur der Trades können leider keine Rückschlüsse gezogen werden" lieber als etwas anzuzeigen, das im Zweifel falsch ist und den Anwender in die Irre führt. Ich würde da nur ein Ergebnis bringen, wenn es eindeutig ist. Aus einfachen Ergebnissen kann man nicht die Schritte deduzieren, die zu ihnen geführt haben. (Das ist etwas, das Wirtschaftswissenschaftler und Kreationisten nie kapieren 😉.

LaTino

05.10.2018 - 13:55 Uhr

Nein, was ich sagte war, dass die Aussage stärker wird, wenn man weiß, wieviele Lösungen es gab.

Wird dir nur eine Lösung gesagt, kannst du sie genauso gut wegwerfen.
Wird dir eine Lösung gesagt UND, dass es 2 Lösungen gab, weißt du, dass es eine 50:50-Chance gibt, dass sie auch stimmt.

Zweiteres ist eine stärkere Aussage als erstes.

Der eigentliche Algorithmus ist sehr einfach. Sei S1 die Differenz des Wertes zwischen T2 und T1. Sei S2 die Summe der Elemente der Menge der absoluten Messwerte M zwischen T1 und T2.

S2 < S1 => unmöglich
S2 - S1 %2 ==1 => keine Lösung
Lösungen:
finde alle Kombinationen aus M, deren Summe (S1-S2)/2 ist. (Stack Overflow hilft). Sei K1..Kn jede Kombination, die das erfüllt, dann ist die Lösung:

Kx -> -Kx { p => -p } + M\Kx

LaTino
EDIT: ist auch bloss brute force. Man kann intelligenter suchen, aber es bleibt ausprobieren.

05.10.2018 - 13:40 Uhr

Nun sind die möglichen Lösungen für das Problem nicht eindeutig. Wie willst du damit umgehen?


1 + 5 + 2 - 6 - 3 = -1 + 5 - 2 - 6 + 3

Will sagen: die Aussagekraft der möglichen Lösung ist sehr schwach. Zusammen mit der Anzahl der möglichen Lösungen wird sie etwas stärker (man weiß, wie sehr man ihr trauen kann), aber in deinem Szenario glaube ich nicht, dass ein "könnte so gewesen sein, aber auch so" irgendeinen Mehrwert für dich hat.

LaTino

02.10.2018 - 14:59 Uhr

Ha. Wenn ich einen Lötkolben in die Hand nehme, brennt die Bude schon, bevor ich den überhaupt eingesteckt habe...

01.10.2018 - 13:26 Uhr

Hallo nytrec,

https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

Diese Grundlagen lernen sich meistens am besten durch einfach Üben und Ausprobieren, begleitet von einem Buch. In einem Forum besteht immer auch die Gefahr, dass man falsche oder missverständliche Antworten (wie die von Glowhollow) bekommt, da bist du mit einem Nachschlagewerk wie der MSDN oder einem Buch besser aufgehoben 😃.

LaTino
EDIT: nanu, MrSparkle's Beitrag ist mir völlig entgangen...naja, doppelter Link hält besser.

21.09.2018 - 08:17 Uhr

Nunja, ganz unrecht hat er nicht. Das erste Ergebnis der Google-Suche "convert plt to svg" zeigt auf ein kommerzielles Produkt, das genau das macht.

Damit wäre Frage 1 schon erledigt: ja, das geht.

Nun ist plt nur ein Containerformat, dh deine Frage ist eigentlich nicht ganz richtig. Richtiger wäre zu erfahren, ob man svg in eins der Formate konvertieren kann, die .plt beinhalten kann. Das sind:

HPGL ist eine eigene deklarative Sprache. Um die in SVG umzuwandeln, bräuchtest du einen Interpreter, und den müsstest du selbst schreiben. Nicht unmöglich, aber knifflig.
PS ist ähnlich, aber (etwas) leichter. Das erklärt auch die Masse an existierenden Konvertern.

In jedem Fall müsstest du dich mit dem Ausgangsformat näher beschäftigen, ebenso mit dem Zielformat SVG. Und ganz simpel wird es nicht.

LaTino
(und wenn es ums Programmieren geht: "geht das?" hat immer die Antwort "ja". Die richtige Frage ist "wie geht das".)
EDIT: gilt nsatürlich für beide Richtungen 😃

18.09.2018 - 11:45 Uhr

Wenn du eine Kopie erstellen und damit weiterarbeiten möchtest, solltest du das auch tun. Du dagegen arbeitest mit zwei Containern, die dieselben Objekte enthalten.

Lesestoff:

IClonable: https://docs.microsoft.com/de-de/dotnet/api/system.icloneable
Referenztypen und Werttypen in .NET: https://de.wikibooks.org/wiki/Arbeiten_mit_.NET:_Grundlagen:_Datentypen/_Wertetypen_und_Verweistypen

Mit anderen Worten musst du für deine Objekte eine Methode zur Verfügung stellen, die ein Objekt kopieren (klonen) kann, und diese Methode dann benutzen.

LaTino
EDIT: typo

13.09.2018 - 13:21 Uhr

Nunja, "das eigentliche Problem" hast du insofern näher umrissen, dass du string.Split() vorschlägst. Das drumherum ist völlig nebensächlich - ob man jetzt direkt auf der Zeichenkette arbeitet oder im vorauseilenden Gehorsam auf zukünftige weitere Anforderungen die Zeile in ein Objekt parst...ich hab letzteres gewählt, weil ersteres potenziell Spaghetti wird. Gemein ist den Lösungen, dass RevangeXX sie getrost ignorieren kann, weil sie nicht das eigentliche Problem ansprechen (CSV-Zeile -> auswerten). (Und wieso so spitz? Der Code ist nicht wirkich komplex.

@RevangeXX:

  • regex (sicherlich zu bevorzugen)
  • string.split (schön einfach)
  • substring (wenn die Felder immer geich lang sind oder man gern frickelt)
  • parsen (wenn du Informatikstudent bist)
    ...

Für das Drumherum - Datei lesen, CSV-Zeilen lesen, Datei schreiben - gibt's wieder zig Möglichkeiten. Frag zwei Programmierer, und du kriegst drei Möglichkeiten.

LaTino

13.09.2018 - 12:07 Uhr

using (var reader = new StreamReader(File.OpenRead("input.csv")))
using (var writer = new StreamWriter(File.OpenWrite("output.csv")))
{
    string currentLine;
    while ((currentLine = reader.ReadLine()) != null)
    {
        if (CsvModel.FromLine(currentLine).IsValid(185000))
        {
            writer.WriteLine(currentLine);
        }
    }
}

public class CsvModel
{
    private readonly int _valueOfInterest;

    private CsvModel(int valueOfInterest)
    {
        _valueOfInterest = valueOfInterest;
    }

    public bool IsValid(int check) => check >= _valueOfInterest;

    public static CsvModel FromLine(string line)
    {
        int valueOfInterest = ??? //...denk dir was aus, du bist der Programmierer
        return new CsvModel(valueOfInterest);
    }
}

Mal eingedampft auf dein eigentliches Problem. Um den Wert aus einer einzelnen Zeile zu extrahieren, hast du ungefähr drölf Fantastilliarden Möglichkeiten. Such dir eine aus.

Viel Spaß,

LaTino

13.09.2018 - 09:10 Uhr

Ich habe diesen XHTML Code als string.
[..]
und möchte den folgenden Code haben.

Es gibt ein Werkzeug, das genau für diesen Zweck spezifiziert wurde: um ein (XML-)Dokument in ein anderes zu überführen. Das wäre dann eine XML-Transformation.

Das geht ohne Fremdbibliothek mit Hilfe der Klasse XslCompiledTransform. Voraussetzung sind 10 Minuten Beschäftigung mit XML und 10 Minuten Beschäftigung mit XSL.

LaTino

11.09.2018 - 14:59 Uhr

Serialisierung ist ein Thema, das sehr einfach ist und sehr komplex werden kann. Dein XML mit mehreren verwendeten Namespaces ist so auf halbem Wege dahin, wo es dann wirklich abartig wird 😉.

Dein Startpunkt könnte so aussehen: erstell ein neues Consolen-Projekt.


public class Program
{
    public static void Main()
    {
        var myModel = new SimpleModel {Name = "Hello, world"};
        var serializer = new XmlSerializer(typeof(SimpleModel));

        using(var file = File.Create(@"c:\temp\simplemodel.xml"))
            serializer.Serialize(file, myModel);
    }

    public class SimpleModel
    {
        public string Name { get; set; }
    }
}

Einmal laufen lassen (sicherstellen, dass es ein Verzeichnis c:\temp gibt). Nach der erzeugten Datei (c:\temp\simplemodel.xml) suchen und dir anschauen, dabei "aha" murmeln.

Jetzt das Model ändern in:


public class SimpleModel
{
    [XmlElement("myFancyName")]
    public string Name { get; set; }
}

Noch einmal laufen lassen. Ergebnis anschauen.

Jetzt zu https://docs.microsoft.com/de-de/dotnet/standard/serialization/examples-of-xml-serialization wechseln und in Ruhe durchlesen. Dabei immer wieder die Klasse ändern und schauen, wie das Ergebnis aussieht.
Zum Schluss die oben geposteten Klassen noch einmal genauer anschauen. Du wirst feststellen: da ist eigentlich so gut wie nix dran.

LaTino

11.09.2018 - 14:48 Uhr

Building Microservices with .NET Core 2.0 - Second Edition: Transitioning monolithic architectures using microservices with .NET Core 2.0 using C# 7.0

Google mal nach dem Buch. Kann ich sehr empfehlen. Ich habe jetzt mehrmals geholfen, einen Monolithen zu ersetzen, und meiner Erfahrung nach deckt das Buch große Bereiche der zu beachtenden Problemfelder ab.

Die Schulung...hm, erst einmal interessant. Was aufffällt, ist der fehlende .net core-Bezug. Das sieht alles sehr nach ASP.NET MVC 4/5 aus. Ich finde auch, es riecht fischig, wenn überall nur "AngularJs" referenziert ist, das ja nun seit fast drei Jahren obsolet ist. Vielleicht bin ich überkritisch.

LaTino