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

25.05.2016 - 07:51 Uhr

Für die Kommunikation zwischen zwei Programmen - Browser und dein Programm zB - gibt es keinen einfachen Weg. Einfach ausgedrückt weiß im Normalfall ein Programm nichts vom anderen, also muss man sich an den wenden, der alle laufenden Programme kennt - das Betriebssystem. Die von Cat verlinkte Lösung macht genau das - trivial ist das sicher nicht.

Alternativ kannst du deinem Programm die Möglichkeit verpassen, auf externe Anforderungen zu lauschen (ein kleiner Webdienst wäre eine einfache Variante). Dafür benötigt es in aller Regel auch wieder spezielle Rechte auf dem Rechner, was nach deiner Schilderung (vermutlich) auch keine Option ist. Falls doch, findet sich hier ein altes Tutorial dazu: Basic Interprocess Communication with WCF

Ich fürchte, viel simpler als Cat's Vorschlag wird es aber nicht.

LaTino

24.05.2016 - 10:54 Uhr

Finde, der Kommentar bringt's auf den Punkt:

While it is a mildly annoying to merge project files from time to time, it is ridiculously difficult to incorporate any custom logic in the current MSBuild scripts. In fact, most of my colleagues don’t dare to comprehend the project file it might as well be a binary format.

Enttäuschend. War eine der Änderungen, die ich auf Anhieb gut fand.

LaTino

23.05.2016 - 23:12 Uhr

@LaTino mal den Ball ein bisschen flach Halten. Ich finde es nicht gut, wenn meine Kollegen herabgesetzt werden. Hast du das nötig?

Tut mir leid, wenn es so rüberkam. Ich war tatsächlich wegen meiner Erfahrungen mit meinen Kollegen, die in den Hardwareteams arbeiten und vor denen ich höchsten Respekt habe, ziemlich schockiert von der Aussage, dass sie grob die Flags kennen, nicht aber deren Integer-Wert. Vielleicht hätte man diesem WTF-Moment anders oder gar nicht Ausdruck verleihen sollen.

Ich sehe drei relativ einfache Lösungen für deine Aufgabe.

  1. T-SQL-Funktion
    Siehe Artikel. Ich denke, folgendes ist hinreichend einfach zu bedienen:

SELECT * from table where (table.bitflag & dbo.BinaryToDecimal('11101011001011010101111010000')) <> 0

Das ist m.E. schon sehr nahe an dem, was du oben als Wunschvorstellung geschrieben hast.

  1. Bitfelder
    Ist mir keine sehr sympathische Lösung, lässt sich aber auch ziemlich überzeugend argumentieren (wiederum: siehe Artikel, unten in den Kommentaren wird das erörtert). Hat den Charme, das man den Tabellenfeldern über ihre Namen bereits die Bedeutung der einzelnen Bitstellen mitgeben kann, in der Form

SELECT * FROM TABLE WHERE SecondBit <> 0

...und zusätzlich als Bonus, dass man als Anwender nicht mehr die Reihenfolge und Bedeutung der Bitstellen verinnerlichen muss. (Und dass jederzeit zusätzliche Stellen hinzukommen und v.a. obsolete Stellen entfernt werden können.)

  1. Mini-Anwendung
    Die Kollegen haben vermutlich bessere Dinge zu tun, als im SQL-Manager SQL einzuklimpern. Mit relativ wenig Aufwand könnte man ihnen auch ein Tool zur Verfügung stellen, dass die wichtigsten Fälle, für die sie die Infos brauchen, abdeckt und das Abfragen der DB in den Hintergrund rückt, so dass sie sich auf ihre eigentliche Aufgabe konzentrieren können. Der Aufwand ist sicher der größte, der Nutzen möglicherweise aber auch. Kann ich nicht beurteilen, rein instinktiv und ohne Kollegen-Bashing 😉 würde ich das bevorzugen.

Such' dir was aus. Möglicherweise gibt's auch noch weitere Alternativen.

LaTino

23.05.2016 - 21:15 Uhr

Ich glaube ich hab dein Posting schon verstanden und das ich BitOperationen auf Integer anwenden kann ist mir auch klar.

Und ja ich kann damit die SQL Abfrage ausführen und bekomme auch das richtige Ergebnis.

Ich konnte mein Problem, vielleicht einfach nicht klar darstellen.

Also die Leute die bei uns die Software für die Maschinen Entwickeln wissen grob welches Bit wo für steht. Nicht aber den Integer wert (Dezimaldarstellung).

Wow, einfach nur wow. Unsere hardware-nahen Entwickler wechseln die Zahlenbasis zwischen 2, 10 und 16 so nebenbei im Kopf, dass ich da nur mit den Ohren schlackern kann. Aber okay, ist nunmal deine Anforderung (ich nehme an, ihnen beizubringen, wie man im Googlesuchfeld "0b001011011 in decimal" eingibt oder den windows-calc benutzt, ist auch keine Option 😉 ).

Dann wird's etwas abartig, denn Datenbanken sind nunmal Datenbanken und keine User Interfaces. Schau mal, ob dich das hier weiterbringt: converting in t-sql

Vielleicht wäre es effektiver, ihnen wirklich ein kleines Tool in die Hand zu drücken, das die Arbeit für sie macht. Ich meine das nicht mal böse, aber Leuten, die nicht in der Lage sind, eine Bitmaske in Dezimaldarstellun zu übertragen, würde ich keinen sql-client in die Hand drücken. "Drop table" ist schnell getippt...

LaTino

Edit: lies mal den dritten Kommentar beim Link oben. a) kommt er (auch) gar nicht auf die Idee, dass das jemand mit der bitmask-darstellung machen wollen würde, und b)hat er ne sehr gute Anmerkung, was Indexierung angeht...

23.05.2016 - 18:14 Uhr

Ich glaube, du hast mein Posting in den falschen Hals bekommen.

Wenn du Bitoperationen benutzen möchtest (und die Frage "hat sich bit 4 geändert" ist eine einzige Bitoperation!), dann hast du das sofort und jederzeit zur Verfügung, ohne dass du ein extra Flags-Konstrukt bauen musst.

Was du versuchst, ist, deine Bitmaske zu speichern und darauf dann etwas zu programmieren, dass Bitoperationen entspricht: das ist aber unnötig, denn wie gesagt, das gibt es schon. Wenn du eine Zahl als Bitmaske ausgeben möchtest, dann tu das:


Convert.ToString(myInt,2);

//2. bit gesetzt?
bool secondBit = (myInt & 2) != 0
//14. Bit gesetzt?
bool fourteenthBit = (myInt & 16384) != 0;

Und diese Operationen hast du so auch in SQL. Ich weiß nicht, wie ich es anders rüberbringen soll...die Bitmaske (evtl noch als string) zu speichern ist nicht zielführend.

Wie gesagt, das SQL in meiner ersten Antwort enthält alles, was du benötigst.

LaTino
EDIT: um's nochmal klar zu sagen: der Datentyp, der das direkt unterstützt und den du suchst, ist int.

23.05.2016 - 17:00 Uhr

Wie sag ich es...integer IST eine bit-Darstellung, nichts anderes. Eine Darstellung mit 12 Bit ist dann eben ein 2-Byte-Integer, also INT16, allein aufgrund der Tatsache, dass es halbe Bytes nunmal nicht gibt.

Das macht ein Speichern als bitmaske nicht sinnvoller, im Gegenteil. Mit long kannst du in einer integer-Zahl mit maximal 19 Stellen (long.maxvalue ist 9,223,372,036,854,775,807) insgesamt 64 Bit speichern. Wenn du stattdessen 100100111001010 usw. speicherst, kannst du also maximal 19 Bit speichern - es sei denn natürlich, man kommt auf die glorreiche Idee und speichert die Bitmaske als string, weil das ja flexibler ist.

Eure Maschinenprogrammierer wissen das auch, da kannst du sicher sein.

LaTino
EDIT: und wie gesagt, nimm die differenz aus zwei Zeilen und finde mit Hilfe von bitweisen operationen raus, ob sich das bit geändert hat, das dich interessiert,. das geht sogar direkt in SQL.

23.05.2016 - 16:29 Uhr

Z.B bei den Einträgen 001, 011, 010 wäre der 1. und der 3 interessant.

Verstehe ich anhand deines Beispiels nicht. Kannst du das bitte noch etwas ausführlicher erläutern?


SELECT table.id, table.content FROM table JOIN bitflagTable ON CONVERT(INT, table.bitflag) & bitflagTable.bitflag <> 0

...ungetestet, im Normalfall würde ich das so oder ähnlich implementieren.

LaTino

20.05.2016 - 14:28 Uhr

Dann liegt's am drunterliegenden Stream, was auch immer der bei dir ist 😃.

LaTino
EDIT: Quatsch mit Soße. Es liegt natürlich daran, dass du keine Zeichenketten liest, sondern chars. Das sind zwei Paar Schuhe. Mit deiner Methode zwingst du ihn, die Zeichen literal zu interpretieren, und nicht als Zeichen. Das heisst wenn ein \ in der Datei steht, ist das für dich ein Backslash, immer. Und eben nicht manchmal ein Meta-Zeichen, das das folgende Zeichen escaped.

20.05.2016 - 14:25 Uhr

Du verstehst da etwas nicht ganz richtig. Dein String hat keine Backslashes. Was er hat, sind Literale für Anführungszeichen. Die werden in aller Regel "escaped" dargestellt. Deine Methode zum Versenden hat offenbar einen Fehler, der dafür sorgt, dass er die ihm übergebenen Zeichen nicht als Literale interpretiert, sondern als Backslashed (und quotes), und entsprechend die noch einmal escaped. Es liegt also an der Art und Weise, wie die Zeichenkette behandelt wird.

Ich würde mal wild ins Blaue raten. Du schreibst mit Hilfe von JSON.net und hast "writer.WriteRaw" statt "writer.writeRawValue" verwendet. Das wäre ein typischer Fall, wo genau das passiert, was du beschreibst.

LaTino

20.05.2016 - 14:15 Uhr

Sollte so nicht sein.


//Inhalt test.txt: "aaa\"bbb\"ccc"

string myString;
using (var inputFile = new StreamReader("test.txt"))
{
   myString = inputFile.ReadToEnd();
}
//Inhalt myString: "\"aaa\\\"bbb\\\"ccc\""

...dh in der ausgelesenen Zeichenkette sind alle Zeichen korrekt escaped.

LaTino
EDIT: @T-Virus, nein, wenn in der Datei &quot; steht, sollte in der Zeichenkette \&quot; stehen.

20.05.2016 - 14:10 Uhr

Liegt weniger an den Zeichenketten, sondern vermutlich an der Art und Weise, wie du die Datei schreibst.

Beide Methoden hier liefern das gewünschte Ergebnis:


var myString = "{\"KEY\":\"value\"};";

//methode 1
File.WriteAllText("test.txt", myString);

//methode 2
using (var outputFile = new StreamWriter("test2.txt"))
{
    outputFile.Write(myString);
}

LaTino

20.05.2016 - 06:34 Uhr

Um das noch etwas weiter auszuführen.

Sobald es ein bisschen komplizierter als "Hello, world" wird, solltest du dich davon verabschieden, beim Programmieren zuerst die Oberfläche im Visier zu haben. Stattdessen versucht man, die Spielabläufe unabhängig von der Oberfläche zu modellieren, und die Oberfläche später nur noch mit diesem Modell zu verbinden. Ansonsten hängt man irgendwann in einem Gewusel von Button-Events, bei denen die Logik des Spiels weit verteilt - und deshalb schwer zu pflegen und zu erweitern - ist. [Artikel] Drei-Schichten-Architektur ist hier das Thema, also eine Trennung der Schichten. Um ein Spiel wie deins zu modellieren, bietet sich, wie Abt gesagt hat, eine sogenannte State-Machine an: man definiert verschiedene Zustände, die das Spiel haben kann, und gibt jedem Zustand mit:

a) welche Eigenschaften er hat

  • Punkte und Status der Spieler zB

b) in welche anderen Zustände er wechseln kann

  • von Status "Initialrunde" in Status "Spielrunde"
  • von Status "Spielrunde" zur nächsten "Spielrunde" oder "Spielende"

c) wie er in einen anderen Zustand wechselt

  • abhängig zB von einem Würfelergebnis

Zur State Machine - weil sie eins der häufiger benutzten Muster ist - gibt es zahlreiche Tutorials und Erklärungen - Startpunkt vielleicht einfach mal Wikipedia. Ein Beispiel für eine State Machine für Tic Tac Toe findest du in diesem Thread (erster Anhang, Beitrag 16, es handelt sich ausschließlich um das "Modell" des Spiels, dh ganz ohne Oberfläche. Ist also nur geeignet, um sich anzuschauen, wie der Code organisiert ist.)

Wenn man diese Trennung sauber durchzieht, erübrigen sich Fragen wie deine von selbst 😃.

LaTino

19.05.2016 - 18:36 Uhr

Was wollt ihr eigentlich die ganze Zeit mit Soundcloud? Der Mann will nur die Videos von StreamCloud direkt speichern...ich denke nicht, dass das ein Anwendungsbereich ist, wo er hier auf Hilfe bauen sollte.

18.05.2016 - 13:58 Uhr

Ist ein bisschen seltesam - ich sehe da weder eine Textdatei, die ausgelesen wird, noch eine Grafik, die in der Konsole dargestellt werden soll (?). Mir erschließt sich auch nicht, was du da mit dem OnPaint()-Ereignis vor hast...und wieso du dort ein Console.ReadLine() machst.

Was genau möchtest du machen?

LaTino

18.05.2016 - 13:20 Uhr

Weder, noch. Sind beides ganz furchtbare Ideen 😉.

Typischer Einsatzfall für Benutzereinstellungen.

LaTino

18.05.2016 - 10:38 Uhr

(siehe auch das Bild oben - draneditiert, ich glaub das Forum hat mit nachträglich angefügten Dateien seine Probleme)
Screenshot oben übrigens mit AnyCpu / prefer 32-Bit off 🤔

18.05.2016 - 09:53 Uhr

Tail Recursion macht er hier nicht, denn der Rekursionsaufruf ist nicht die letzte Anweisung und das ist eine notwendige Bedingung für die Tail Recursion.

Uh, richtig, das macht mein Code, nicht seiner...Zeile vertauscht damit 'überhaupt ne Ausgabe kommt, und prompt vergessen 😉 Damit hat der Compiler noch weniger Chancen, zu optimieren. Hab's vorhin btw schon mal (mit tail recursion) ausprobiert auf x64 und release - keine Besserung (außer, dass mehr Rekursionen durchlaufen werden, bevor es knallt). Finde das auch nicht gut vorhersehbar oder vernünftig dokumentiert, wann da optimiert wird.

Rekursion ist eben Mist, so lange, wie Rekursion Mist ist 😉.

LaTino
EDIT: brauch Kaffee. Läuft dann durch, wenn man die Einstellungen auch korrekt setzt -.-

18.05.2016 - 07:51 Uhr

Was du da machst, ist eine sog. Tail Recursion. Der C#-Compiler optimiert solche rekursiven Aufrufe nicht (um einen stack overflow zu verhindern), und du endest dann eben genau damit.

Generell ist in der Programmierung (mit einigen Sprachen als Ausnahme) eine Rekursion unvorhersehbarer Tiefe (wie in deinem Fall) nur sehr selten eine gute Idee. Es ist langsamer, fehleranfälliger, speicherintensiver als die jeweilige iterative Variante.

EDIT: schöner Artikel zur (tail) recursion in C#.

Wen das interessiert, hier kopierbarer Vergleichscode. Achtet beim Ausführen auf den Speicherverbrauch.


public class RecursiveOverflow
{
    public event EventHandler<string> Input;
    public event EventHandler<int> Output;
    public string UserInput { get; set; }

    public int GetValidNumber(int min, string message)
    {
        int rgw;
        bool isValid;

        do
        {
            var handler = Input;
            if (handler != null) handler(this, message);

            isValid = int.TryParse(UserInput, out rgw);
        } while (!isValid || rgw == 0 || rgw < min);

        return rgw;
    }

    public void CountRecursive(int number)
    {
        if (number == 0) return;
        var handler = Output;
        if (handler != null) handler(this, number);
        CountRecursive(number - 1);
    }

    public void CountIterative(int number)
    {
        while (number > 0)
        {
            var handler = Output;
            if (handler != null) handler(this, number);

            number--;
        }
    }
}

//Program.cs
private static void Main()
{
    var test = new RecursiveOverflow();
    test.Input += (s, e) =>
    {
        Console.Write(e);
        test.UserInput = Console.ReadLine();
    };
    test.Output += (s,e) => Console.WriteLine(e);

    var rgw = test.GetValidNumber(1, "Geben Sie eine Zahl für den Counter ein: ");
    //Hier breakpoints für den Speicherbedarf - keine zu hohen Zahlen testen (eben wegen stack overflow)
    test.CountRecursive(rgw);
    test.CountIterative(rgw);
}

LaTino

17.05.2016 - 15:53 Uhr

Resharper meckert mit "Expression is always null/true/false" bei Vergleichen von Nullable<bool>, wenn der angemeckerte Wert kurz vorher initialisiert wurde, sonst nicht. (und da macht es ja auch Sinn) Ist mir noch nie aufgefallen bisher 😄

EDIT: zur ursprünglichen Frage - nein, ist nicht möglich, weil Nullable in C# ein Wrapper um den eigentlichen Wert ist, i.e. das gewrappte struct weiss gar nichts von seinem Glück.

Lad' dir mal die C#Language Specification herunter. Die ist sehr klar formuliert und beantwortet solche Fragen - nebenbei lernt man noch was darüber, wie C# funktioniert. In dem Fall hier Abschnitt 4.1.10.
/EDIT

LaTino

16.05.2016 - 17:45 Uhr

Tut mir leid, offenbar bin ich nicht in der Lage, mich so auszudrücken, dass du keine Möglichkeit findest, mich misszuverstehen. Ich schrieb ausdrücklich von "physikalischen Gütern", ich habe die Quelle rausgesucht und erklärt, welche Parallelen zur Cloud-Diskussion man ziehen könnte. Wenn du darauf bestehst, das immer noch anders zu interpretieren, kann ich dich nicht davon abhalten.

Aber einen Punkt finde ich interessant: an welcher Stelle untersagen die Verträge bei Cloudanbietern dem Anbieter, einen ähnlich gearteten Service wie sein Kunde selbst anzubieten?

Dann hat sich Netflix aber ganz schön über's Ohr hauen lassen.

LaTino

16.05.2016 - 16:41 Uhr

?? Die haben einfach von Unternehmen, die über den Amazon.Marketplace verkauft haben, die Verkaufsdaten analysiert und, wenn es sich lohnte, copycat-Produkte des Labels "AmazonBasics", einer 100%-Tochter von Amazon, günstiger angeboten. Ob du das für eine Verschwörungstheorie hältst ist eigentlich irrelevant, denn das ist ein belegbarer Fakt.

Und wieder unterstellkst du mir, dass ich daraus Schlüsse ziehen würde. Meine Aussage war aber: wenn der Kunde fragt, was Amazon hindert, dasselbe bei seinen Services zu tun, dann sollte man eine gute Antwort haben, statt "so ein Unsinn!" zu sagen.

LaTino

16.05.2016 - 15:12 Uhr

Und verstehen kann man das nur, wenn man sich mal mit ihnen unterhält und daraus mehr mitnimmt als "die haben zu 95% keine Ahnung".

Schade, dass Du mir die Worte im Mund rumdrehst.

Schade, dass es so ankam. Deine Erfahrung ist, dass 95% der "Gegner" nicht informiert sind. Das ist eine sehr typische Reaktion eines Menschen mit technischem Hintergrund, auf anderen Gebieten auch ähnlich meiner eigenen (zum Beispiel beim Thema Stromausfall im Posting von tribs, bei dem ich nicht wusste, ob ich lachen oder weinen soll - aber ich schweife ab).

Man versagt sich dabei die Chance, den Gegenüber zu überzeugen. Das war aber jetzt auch nicht unbedingt der Kernpunkt meines letzten Postings, (und ich hätte mir gewünscht, dass du die anderen 90% des Postings zur Kenntnis genommen hättest, statt direkt auf einen nicht vorhandenen persönlichen Angriff einzusteigen.

Und es braucht sehr viel Zeit und manchmal auch Nerven, solche haarsträubenden Aussagen zu korrigieren.

Das ist eben die Einstellung, die dafür sorgt, dass man hin und wieder auf Granit beisst. Man nimmt niemandem seine Bedenken, wenn man ihm einfach sagt, dass sie - salopp gesagt - Quatsch sind. Sondern man nimmt die Bedenken auf, vergleicht sie mit seiner aktuellen Situation und zeigt, welche Chancen sich eröffnen, diese Situation zu verbessern, und welche Risiken dabei bestehen. Man versetzt den Bedenkenträger in die Lage, Risiken und Nutzen abzuschätzen, aber das wird er nur mitmachen, wenn er das Gefühl hat, dass seine Bedenken eben nicht einfach in den Wind geschlagen werden.

Wenn der Kunde nun sagt, dass alle Plattformen nur Daten sammeln, dann gehört es zur Aufgabe den Kunden korrekt zu informieren und ihn nicht mit einer Falschannahme im Regen stehen zu lassen.

Richtig, aber die Herangehensweise "so ein Unsinn, das ergibt doch gar keinen Sinn, würden die niemals machen" ist nicht die richtige. Ich hätte da ein schönes Beispiel aus dem AWS-Lager, wo Amazon eben ihre Position als Cloudbetreiber gegen den Kunden eingesetzt hat[1], aber finde im Moment die Quelle nicht. Die Sache ist aber, dass man sich dagegen absichern kann, rechtlich und technisch. Und das muss man auch machen. Das heisst in diesem konkreten Fall ist die Antwort "das lässt sich verhindern" und nicht "das ist falsch".

Nochmal: im Prinzip kann man durchaus einer Meinung sein, dass die Gegenargumente aus der Luft gegriffen sind. Nur der Umgang damit ist eine Geschichte, bei der wir nicht einer Meinung sind.

LaTino

[1] wie gesagt ohne Quelle. Amazon hatte Traffic/Zugriffsdaten etc benutzt, um besonders erfolgreiche/erfolgreich gestartete Konzepte herauszufiltern, haben die dann selbst aufgesetzt und damit ihrem Kunden Konkurrenz gemacht. Ich such's noch raus. Wenn ich mich richtig erinnere, kann es auch der Marketplace gewesen sein, aber das Prinzip wäre mit Services dasselbe. Ignorier das bitte, bis ich die Quelle wiederfinde.
EDIT: ja, war Marketplace -> Quelle. Wenn die das mit der Marktmacht mit physikalischen Gütern durchziehen, wieso ist ihnen nicht zuzutrauen, das auch mit Services zu machen? Das ist eine berechtigte Frage, und die muss beantwortet werden, wenn der Kunde das wissen will.

16.05.2016 - 13:49 Uhr

da werden Datenlecks bei Clouds aufgelistet, aber leider vergessen zu sagen, dass die Daten im eigene RZ nicht viel sicherer sind...

Ist das so?

Ja ist es.

Ich vermute ein Missverständnis. stefan.haegele behauptet, ich hätte vergessen zu sagen, dass die Daten im eigenen RZ nicht viel sicherer seien. Meine Frage "Ist das so?" war ein "Ach, habe ich das nicht erwähnt?" und dann der Beweis dafür, DASS ich es erwähnt habe. Es ging also um die Erwähnung, nicht um den Fakt, dass die Daten auch im eigenen RZ nicht per sé sicher sind.

Mit anderen Worten habe ich das schon längst gesagt, eben WEIL ich mich seit Jahren mit dem Thema beschäftige. Ich weiss, wie die Sicherheitssituation in Rechenzentren gerade mittelständischer Unternehmen oft aussieht.

Insofern gehe ich davon aus, dass du verstanden hast, ich bezweifelte die Aussage, Daten seien im RZ nicht sicherer. Das war aber gerade nicht die Aussage - sondern vielmehr das, was stefan.haegele mir unterschieben wollte.

Und ja, das wäre alles auch ohne Cloud möglich gewesen

a) ist nicht alles ohne die Cloud umsetzbar. Auch das habe ich oben erwähnt.
b) macht es die Cloud i.d.R. effizienter

Dann sind wir uns ja einig, denn auch ich schrieb das in den Sätzen genau nach dem zitierten. (Ganz ehrlich, sich darüber uneins zu sein wäre echt Quatsch.)

Wenn man nicht bereit ist zuzugestehen, dass die Risiken mit Cloud da sind und u.U. schwerer zu kontrollieren sind als ohne - dann braucht man hier nicht diskutieren.

a) gibt es nicht die Cloud wie es auch nicht das RZ gibt.
b) gibt es zB. in Azure Dinge wie Customer Lockbox und Co, die genau das verhindern und sogar mehr Sicherheit bietet als gewöhntliche Zugriffskonfigurationen, bei denen ein Admin alleine am Samstag Abend Daten ziehen könnte.
Auch oben im Text erwähnt / erklärt.

Und durchaus beachtet. Hm. Wie soll ich das erklären.
Also: deine Frage/Aussage war ja, dass du das Misstrauen, dass dieser Technik oft entgegengebracht wird, nicht nachvollziehen kannst (im Grunde - ich versuche dir hier nix zu unterstellen, sondern quasi den Punkt zu erfassen, auf den ich mit der Aufzählung der Vorfälle reagiert habe). Sehr oft ist dieses Misstrauen auch nicht rational, das will ich nicht abstreiten. Mir ist in Gesprächen zum Thema immer wieder aufgefallen, dass den Verantwortlichen die möglicherweise vorhandenen Sicherheitslücken in ihrer (lokalen) IT bekannt sind, aber kein Sicherheitsmanagement vorhanden ist, dass ihnen das Gefühl gäbe, die Lage im Griff zu haben. Verstehst du? Das Gefühl der Kontrolle über die eigene Sicherheit ist so schon oft nicht da. (Und oft genug auch berechtigt nicht da, anderes Thema.) Und jetzt kommt ein Consultant daher und schlägt vor, die Daten, die man irgendwie bei sich halbwegs sicher glaubt, bei einem Cloudanbieter unterzubringen. Die Jungs vertrauen schon ihrer eigenen IT kaum, glaubst du, das wird bei Fremdanbietern besser? Noch dazu - und deshalb meine Aufzählung von Zwischenfällen - wird man tatsächlich im Wochentakt in der Presse mit Horrorszenarien (und die meisten der aufgezählten Vorfälle sind das) konfrontiert. Wo soll das Vertrauen bitte herkommen?

Du schaffst kein Vertrauen bei den Leuten, die aus der oben erläuterten Motivation heraus kritisch sind, wenn du ihnen sagst, das seien Verschwörungstheorien und Bullshit-Bingo. Sondern indem du glasklar sagst, dass es ein Risiko gibt, und dass man es nur beherrschen kann, wenn man im Rahmen eines vernünftigen Sicherheitsmanagements die zur Verfügung stehenden Werkzeuge (LockBox zB) auch einsetzt, und zwar geplant und strukturiert.

Und das selbst dann ein Restrisiko bleibt - das aber auch im eigenen RZ bleibt (und hier kann man sie meistens gut aufgabeln, indem man ihnen den Umstieg in die Cloud mit einer gleichzeitigen Einführung eines Sicherheitsmanagements schmackhaft macht - denn dass sie das sowieso brauchen, auch im eigenen RZ, ist den allermeisten bewusst, und die Tatsache, dass sie oft genug eben keines haben, ist eine Schwäche, die viele gern ausräumen würden.)

Wer mich für einen Skeptiker beim Thema Cloud hält, hat das alles nicht verstanden. Wenn man Entscheider für das Konzept "Cloud" erwärmen möchte, muss man ihre Beweggründe und Ängste verstehen, ernst nehmen und mit guten Argumenten kontern. Und verstehen kann man das nur, wenn man sich mal mit ihnen unterhält und daraus mehr mitnimmt als "die haben zu 95% keine Ahnung".

LaTino
EDIT: grammatik 😉

16.05.2016 - 13:05 Uhr

Ich habe mein eigenes Zitat extra druntergesetzt, um zu zeigen, dass deine Aussage absichtlich oder unabsichtlich unwahr war: ich hatte ausdrücklich geschrieben, dass das auch im eigenen RZ möglich gewesen wäre. Jetzt zitierst du mich erneut und lässt den Punkt wieder weg, so dass es aussieht, als hätte ich das geschrieben, was du mir unterstellst.

Also, ehrlich, ich bin raus. Falsch zitieren kommt vor. Zweimal hintereinander? Kaum.

LaTino

16.05.2016 - 12:40 Uhr

da werden Datenlecks bei Clouds aufgelistet, aber leider vergessen zu sagen, dass die Daten im eigene RZ nicht viel sicherer sind...

Ist das so?

Und ja, das wäre alles auch ohne Cloud möglich gewesen

Was soll ich sagen. Wenn man nicht bereit ist zuzugestehen, dass die Risiken mit Cloud da sind und u.U. schwerer zu kontrollieren sind als ohne - dann braucht man hier nicht diskutieren. Erst recht nicht mit diesem unehrlichen Argumentationsstil.

LaTino

15.05.2016 - 19:09 Uhr

CultureInfo.InvariantCulture ist bereits eine fertig definierte CultureInfo. Das Erzeugen der britischen Culture kannst du weglassen.

Und ja, ist besser so 😃.

LaTino

15.05.2016 - 17:13 Uhr

Im Endeffekt ist dein Fehler, dass du dir den SQL-String von Hand zusammenbastelst und bei dem ganzen Gebastel die ToString()-Methode nie mit Angabe einer Kultur aufrufst.

Also mach dich über SQL und CommandParameter schlau.

Du kannst auch hiermit herumspielen: Double.ToString-Methode, besser ist aber, so etwas wie das hier kommt in deinem Code gar nicht erst vor:


cmd.CommandText = "UPDATE Konto SET KontoStand = '" + _NeuerkontoStand + "' WHERE ID = '" + _ID +"'";

Wir sind hier nicht bei PHP! 😉

LaTino

15.05.2016 - 17:02 Uhr

77,77 ist auch kein double-Wert, sondern eine Zeichenkette, die den Zahlenwert von 7777/1000 in der deutschen Sprache repräsentiert. In der englischen Sprache wäre das "77.77", in anderen Sprachen noch anders. Es wäre also anzuraten, in der Kultur zu speichern, die die Datenbank auch verarbeitet.

In deinem Fall CultureInfo.InvariantCulture (englisch, überregional).

LaTino

15.05.2016 - 16:58 Uhr

Die Angst vor Geheimdiensten hatte jedenfalls damit nichts zu tun (die kommen sowieso an alle Daten

Das ist wahr. Diese Diskussion beobachte ich beinahe ausschließlich im privaten Bereich.

LaTino

15.05.2016 - 15:50 Uhr

Daher die Frage:
Wieso haben so viele nichts gegen externes Hosting im klassischen Sinne, aber gegen die Cloud? Woher kommt die spezifische Skepsis, die eben das Hosting so nicht spürt? Es ist de facto nichts anderes.
Ich persönlich kann es mir nur an der negativen Kommunikation des Worts Cloud sowie der fehlenden Information und Aufklärung erklären.

Okay, ein paar Gründe (auch, wenn nicht explizit angegeben, geht es immer um Daten in einer oder aus einer Cloud):

(Die Zwischenfälle sind sehr oft AWS / EC von Amazon. Das liegt daran, dass der Marktanteil von Amazon überwältigend ist, nicht daran, dass sie die einzigen mit Sicherheitsproblemen sind. Amazon hat mehr als dreimal soviel Marktanteil wie bspw. Microsoft.)){gray}

Los geht's:

Mitte 2015 wurde bei BitDefener eine unbekannte Anzahl Kundendaten gekapert, die in der Cloud (AWS) gespeichert waren. Der Hacker verlangte $15.000 Lösegeld.

Im "Anthem breach" wurden 2015 80 Millionen Kunden-Datensätze aus der cloud entwendet.

Vom britischen Telekom-Giganten TalkTalk wurden zwischen 2014 und 2015 bei mehreren Einbrüchen insgesamt 4 Millionen Kundendaten entwendet.

2014 wurden bei ein GitHub-Account innerhalb von 36 Stunden nach seiner Erstellung benutzt, um Cloud-Zugangsdaten zu entwenden und mit diesen BitCoin-Mining zu betreiben.

Mitte 2015 wurden bei der US-amerikanischen Steuerbehörde IRS 300.000 Steuerzahler-Daten über eine Lücke in der benutzten API entwendet.

Im Juni 2014 wurde bei Code Space, einem GitHub-Wettbewerber, bei einem Einbruch fast sämtliche (bei AWS) gehosteten Daten zerstört. Code Space hat das ruiniert, das Unternehmen existiert nicht mehr.

April 2010 war es möglich, durch einen Bug Usercredentials von Amazon zu klauen.

In 2009 wurden einige AWS-Systeme übernommen und damit ein Botnetz aufgebaut (Zeus botnet).

Mit Hilfe des Trojaners "Carbanak" wurden seit Mitte 2013 ca. $1.000.000.000 bei Banken entwendet. Credentials, die benutzt wurden, stammten zu einem Teil aus der Cloud.
(Nur teils relevant, hauptsächlich das gute alte phishing. Wie hoch der Anteil durch in der Cloud verfügbare Credentials war, lässt sich wohl nicht sagen, zumal die Angriffe wahrscheinlich hunderte Banken betrafen. Die Geschichte ist noch nicht analysiert und aufgearbeitet.)

Im April 2011 gab es bei Amazon EC2 einen Crash, durch den Hunderte Kundendaten verloren gingen.

Im November 2014 brachen Hacker in die sony-eigene Cloud ein und entwendeten vertrauliche Informationen.

2012 brach in der AWS die ostamerikanische Region (die einige Cloud-Zonen umfasst) komplett weg. Unter anderem gab es Ausfälle bei Netflix und anderen großen Kunden.

2013 meldete Nirvanix, ein Cloud-Anbieter, der u.a. Daten für IBM und DELL betreute, Insolvenz an und gab seinen Kunden lediglich 14 Tage Zeit, ihre Daten zu einem anderen Anbieter zu transferieren.

Im März 2013 wurden etliche gekaperte Cloud-Accounts benutzt, um einen der größten DDOS-Angriff in der Geschichte zu fahren. Die Angreifer waren in der Lage, ca. 300 GBit/s Datenaufkommen zu erzeugen, obwohl ihre "eigene" Infrastruktur nur ein Hunderstel dieses Wertes zu leisten imstande war. Der Traffic war so gewaltig, dass die Attacke auch als "The DDoS That Almost Broke the Internet" bekannt wurde.

Mitte 2014 brachen Hacker in die AWS ein und waren in der Lage, die vorhandenen Ressourcen für mindestens eine DDOS-Attacke zu kanalisieren.

Im November 2014 gingen bei Deezer, Evernote und Feedly kurzfristig durch eine DDOS-Attacke die Lichter aus, weil ihre cloud-basierten Services nicht mehr erreichbar waren.

Es wäre absolut kein Problem, noch mehr Beispiele zu finden. Und ja, das wäre alles auch ohne Cloud möglich gewesen, aber in einigen Fällen waren die Cloud-Kunden vollkommen machtlos. In anderen Fällen waren sie unvorsichtig (aber auch damit muss man immer rechnen). In diesen Dimensionen wäre es ohne Cloud absolut unmöglich gewesen.

Und da darf man sich schon seine Gedanken machen.

Quelle: Hewlett Packard Enterprise, "The Treacherous 12: CSA’s Cloud Computing Top Threats in 2016", Cloud Security Alliance, 2016
(Publikation der Cloud Security Alliance, zu der auch so gut wie alle großen Cloud-Anbieter gehören)

Und das ist nur eine einzige Quelle.

Skepsis hat noch nie geschadet.

LaTino

15.05.2016 - 13:20 Uhr

Achso. Dann haben wir aneinander vorbeigeredet. Mein Problem oben war NICHT, dass es nicht ein definiertes Antwortobjekt gab (und das ist natürlich notwendig - darüber muss man aber nicht reden, das war schon bei meinen ersten PHP-Services so, 7 Jahre vor OData. Ist einfach eine Notwendigkeit, wenn man eine effiziente Kommunikation haben will). Mein Problem war, dass es nicht korrekt strukturiert war.

Wenn ich das Antwortobjekt in EcmaScript per eval() auswerten kann, ist es strukturell in Ordnung. Wenn ich mit dem Ergebnis von eval() auch was anfangen kann, ist es inhaltlich in Ordnung. Das ist aber oben nicht der Fall.


{ "api/5/blubb" : "52.12" } //strukturell in Ordnung, inhaltlich Müll
{ "response" : { "newId" : "5", getrequestpath: "api/5", "blubb" : "52.12" } } //inhaltlich in Ordnung

Wenn ich beim Entwurf der JSON-Objekte für die Kommunikation besagte Objekte nichtmal ohne Handstand direkt in Javascript nutzen kann, dann hab' ich was falsch gemacht.

Da nutzt auch der Hinweis auf OData nichts (ich hätte auch Probleme, einen relevanten Anbieter jenseits von MS und dem SAP-Adapter zu nennen, der das überhaupt nutzt - so praktisch es ist).

Wie gesagt, mit einem mittelgroßen Handstand mittels Converter kann man daraus auch was brauchbares machen. Wenn jemand mit JSON.net eine noch griffigere Lösung hat - nehm ich gerne.

LaTino

15.05.2016 - 12:30 Uhr

Du meinst für den Fall, dass eine "Response" ankommt, die (auf dem empfangenden Client) keinen Request hat? (Kann man ja gern machen, aber als Objektnamen?

LaTino

15.05.2016 - 11:54 Uhr

...natürlich mit einem Converter...manchmal hat man ein Brett vor'm Kopf.

LaTino


//SuccessResponse verhält sich wie ein Dictionary<string, object>

public class SuccessResponseConverter : JsonConverter
{
    private string _address;

    public SuccessResponseConverter(string address)
    {
        _address = address;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(SuccessResponse);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var result = new SuccessResponse();
        while(reader.Read())
        {
            if(reader.TokenType == JsonToken.PropertyName && reader.Value.ToString().Equals("success") && reader.Read())
            {
                while(reader.TokenType != JsonToken.PropertyName) reader.Read();
                string propertyName = reader.Value.ToString().Substring(_address.Length, reader.Value.ToString().Length - _address.Length);
                reader.Read();
                result.Add(propertyName, reader.Value);
            }
        }
        return result;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

(elegantere Ansätze können gern ergänzt werden...)

15.05.2016 - 09:31 Uhr

Team Developer. Version 2005. (Mehr muss man nicht sagen, glaub ich 😉 )

LaTino

15.05.2016 - 09:27 Uhr

Ich habe eine Situation, in der mir eine API auf ein PUT-Request hin ein für meine Begriffe (inhaltlich) defektes Stück JSON zurückliefert, und zwar etwa wie folgt:


//unserialisiertes Request-Objekt
class Request
{
   [JsonProperty(PropertyName = "subprop1")] public int SubPropertyOne { get; set; }
   [JsonProperty(PropertyName = "subprop2")] public string SubPropertyTwo { get; set; }
   [JsonProperty(PropertyName = "subprop3")] public string SubPropertyThree { get; set; }
}


//request auf api/resource/id/property - serialisierung des Objekts oben klappt.
{ "subprop1" : "20", "subprop2" : "hello", "subprop3" : "world" }

//response im Erfolgsfall:
[
	{"success":{"/resource/id/property/subprop1":"20"}},
	{"success":{"/resource/id/property/subprop2":"hello"}},
	{"success":{"/resource/id/property/subprop3":"world"}}
]

Ich kann dank der Verwendung des Zugriffspfades (mMn völlig unnötig, ich WEISS, auf welchen Pfad ich mit dem request zugegriffen habe) als Objektbezeichnung diese Antwort nicht vernünftig deserialisieren, weil die Propertynamen (damit meine ich "/resource/id/property/subprop1") sich u.a. in Abhängigkeit von der ID ändern. Hat jemand eine Idee, wie ich das mit JSON.NET dennoch lösen kann?

Ich würde die Antwort ungern von Hand zerlegen...

LaTino

14.05.2016 - 15:11 Uhr

Ja, Gupta/Centura/Unify/wieder Gupta/OpenText [..] hat uns unheimlich viel Arbeit und Nerven gekostet.

Fixed that for you 😉.

LaTino, Leidensgenosse

13.05.2016 - 15:13 Uhr

Wie du an meinem Code oben siehst - XmlDocument/XmlElement muss man gar nicht verwenden. Du machst dir das Leben etwas schwerer, als nötig. 😮)

LaTino

13.05.2016 - 15:10 Uhr
  • ohne dein Wissen Daten an Dritte (staatliche) Stellen herausgegeben werden
    Dieser Punkt betrifft jeden Anbieter einer Cloud. Jeden. Hat man die Daten unter eigener Kontroller, kann das nicht passieren.
    Das ist falsch, denn das kommt auf das jeweilige Land an.

Oh, echt? In welchem Land muss der Cloudanbieter nicht auf staatliche (legale) Anweisung hin Daten rausrücken?

in Deutschland musst Du eine gerichtlich angeordnete Durchsuchung gewähren.

Anders als ein Cloudanbieter hast du allerdings die Möglichkeit, Widerspruch einzulegen und die Durchsuchung anwaltlich begleiten zu lassen, sowie die Durchsuchung nur soweit zuzulassen, wie sie durch den richterlichen Beschluss gedeckt ist. Diese Möglichkeiten entfallen, wenn du gar nicht dabei bist, weil es keine Durchsuchung gibt. Denn die Cloudanbieter erhalten lediglich eine Aufforderung der Ermittlungsbehörden, OHNE richterlichen Beschluss. So ist es jedenfalls in Deutschland. Wir können das weiter diskutieren, aber es derailt die Diskussion. Wen's weiter interessiert, da gibt es zahlreiche (seriöse) Quellen im Netz 😃.

Nein, weil die Cloud prinzipiell nicht nur Daten ist - und das ist diese unangebrachte pauschalisierung.

Auch wenn Daten im Rahmen von Services etc. verarbeitet werden, gilt das. Selbst wenn ich housing mache, fallen Daten an, die ohne mein Wissen weitergegeben werden können.
Ich würde es begrüßen, wenn du nicht so fixiert auf die Quantitäten wärst: es geht darum, dass das Prinzip "Cloud" einige Eigenschaften hat, die den Kunden zum Nachteil gereichen können. Will man sich dafür oder dagegen entscheiden, muss man das eben abwägen - ganz normaler strategischer Vorgang. Nur, was man eben nicht machen darf, ist, diese Punkte außen vor zu lassen oder herunterzuspielen. Und das ist meine Kritik an deinem wirklich guten Ausgangsbeitrag: an dieser Stelle wirkt es teilweise so, als wolltest du etwas verkaufen. Vielleicht hast du's nur unglücklich formuliert, vielleicht fehlt dir eine Perspektive mit ein bisschen mehr Abstand (du steckst ja immerhin mitten drin 😄), ich weiß es nicht.

Und es wäre auch völlig legitim, wenn du versuchen würdest, die Leser von der Cloud zu überzeugen. Da gibt es so viele ausgezeichnete Argumente dafür!
Man kann da die Nachteile völlig offen kommunizieren: ja, ihr macht damit mehr Daten als vorher zugänglich, und ja, ihr habt möglicherweise nicht mehr die vollständige Kontrolle darüber, wer diese Daten einsehen kann - aber das Risiko ist längst nicht so groß, wie man oft hört, denn [Begründung hier einfügen]. Weisst du, was ich meine? Auf die Weise hätte der Beitrag ausgewogener und objektiver gewirkt, und das hätte ihm, so denke ich, gut getan.

Wenn du das als Kritik an deiner Person siehst, liegst du falsch. Es geht darum, das Gesamtbild zu vervollständigen. Alle Punkte für und wider zusammenzutragen. Und wenn einige Leser den Eindruck haben, dass die Punkt "wider" zu kurz gekommen sind, dann werden sie versuchen, dazu beizutragen.

LaTino

13.05.2016 - 14:07 Uhr

Eigentlich genau, wie witte schrieb. Mittels HierarchicalDataTemplate sollte der View in der Lage sein, die im VM referenzierten hierarchischen Strukturen darzustellen. Zusätzlich dazu referenziert das VM das SelectedItem, ja. Dann ist das VM eine saubere Abbildung des Views, i.e. es weiß Bescheid, was dort gerade so vor sich geht.

Ob man wie witte die Modellobjekte noch rekursiv in Sub-"ViewModels" wandeln muss - hm, also, in deinem Fall vermutlich nicht, da du (vermutlich) die Modellobjekte nur für diese Anwendung erstellt hast. Da braucht man nicht noch künstlich eine Zwischenschicht mit einer abstrakteren Datenmodell-Form.

(Wenn man sie braucht, kann man sie jederzeit einziehen, bis dahin gilt: KISS (keep it simple, stupid.)

Die ganzen Patterns sollen dir als Richtlinien dienen, wie du deinen Code organisieren kannst. Du hast aber sämtliche Freiheiten bei der Implementierung. Wenn du es als MVVM bezeichnen willst (um ein Beispiel zu nennen), genügt die Trennung nach View, Model, ViewModel und die Kommunikation V-VM per DataBinding (was bei WPF schon sowieso kaum anders zu realisieren ist).

Programmieren ist sowieso ständiges refaktorieren. Man muss nur aufpassen, dass man es nicht übertreibt, nur um irgendeinem Lehrbuch zu entsprechen - sondern dass der Code zu den Anforderungen passt 😃.

LaTino

13.05.2016 - 13:49 Uhr

Entschuldige bitte, aber weder pauschalisiere ich, noch stigmatisiere (??) ich. Ich finde diesen Vorwurf einer sachlichen Diskussion auch nicht sehr förderlich. Die Quelle "Transparenzreport" stand von Anfang an drin. Sie war und ist halt nicht verlinkt, ja...nun.

Ich habe auch nirgends von US-Cloud gesprochen. Ich habe gesagt, dass

  • ohne dein Wissen Daten an Dritte (staatliche) Stellen herausgegeben werden
    Dieser Punkt betrifft jeden Anbieter einer Cloud. Jeden. Hat man die Daten unter eigener Kontroller, kann das nicht passieren.

  • ohne deine Zustimmung erfolgt
    Direkt aus Punkt 1 abgeleitet. Auch hier: irrelevant, wer der Anbieter ist. Und ja, es gibt Möglichkeiten, zB bei einer Hausdurchsuchung den Zugang zu bestimmten Daten zu verweigern. Diese Möglichkeiten hast du nicht, wenn die Durchsuchung nicht bei dir stattfindet.

  • Punkt drei ist nur gültig für Cloudanbieter, die einer anderen Jurisdiktion unterworfen sind. Logisch.

  • Punkt 4 ist wieder völlig unabhängig vom Standort. Es gibt auch in Deutschland keine Verpflichtung von Unternehmen, ihre Kunden über rechtlich sanktionierte Zugriffe des Staates auf ihre Daten zu unterrichten. Im Gegenteil. Der Grund liegt auf der Hand - im laufenden Verfahren den Verdächtigen zu informieren, ist kontraproduktiv.

Ich behaupte ja nicht einmal, dass alle staatlichen Zugriffe ungerechtfertigt sind. Das ist auch nicht der Punkt. Der Punkt ist, dass man die Kontrolle über seine Daten abgegeben hat und dadurch eben Nachteile haben kann. Allein, dass man das erwähnen muss, verwirrt mich schon etwas, ich meine - liegt doch auf der Hand, nicht?

LaTino

13.05.2016 - 13:36 Uhr

Ah, mist, gleichzeitig editiert zu deiner Antwort. Der Unterschied liegt darin, dass es

a) ohne dein Wissen erfolgt
b) ohne deine Zustimmung erfolgt
c) nicht nach rechtlichen Regeln, denen du selbst unterliegst, erfolgen muss
d) du kein Recht darauf hast zu erfahren, was genau an Daten weitergegeben wurde

All das ist ein Unterschied zum lokalen RZ. Wenn sich ein Unternehmen also, bevor es "in die Cloud geht", über diesen Aspekt grundlegende Gedanken macht und sich dann dagegen entschließt, dann ist das wohlbegründet und kann nicht so nonchalant wie in deinem Artikel vom Tisch gewischt werden.

Und wenn ich nur zeigen wollte, DASS es passiert, brauche ich auch keine Vergleiche. Da hätte EIN Fall gereicht, es geht nicht um Quantität, sondern darum, OB es vorkommt. Als Quelle hatte ich den Transparenzreport angegeben, ich war nicht davon ausgegangen, dass dir der unbekannt ist.

LaTino

13.05.2016 - 13:28 Uhr

Äh, entschuldige bitte, aber was ist das denn für ein Argument?

Weil Microsoft in seinem Transparenzreport nicht nach Services aufschlüsselt, darf man die Zahlen NICHT verwenden, um darzulegen, dass Microsoft Daten seiner Kunden ohne deren Wissen an staatliche Stellen weitergibt?

Das heisst die Tatsache, DASS sie es tun, bringt mich in die Pflicht, das für andere Anbieter auch nachzuweisen? Und so lange ich das nicht mache, tun wir so, als gäbe es diese Zahlen nicht?

Wie bitte?

LaTino
EDIT: Selbstverständlich macht nicht nur Microsoft das. Alle anderen Anbieter von Services im Netz müssen das genauso machen. Das ist ja genau ein Kritikpunkt an der Cloud, es handelt sich eben um Services, und die Anbieter sind rechtlichen Regelungen verpflichtet, die nicht unbedingt mit rechtlichen Regelungen des Herkunftslandes des Kunden übereinstimmen. Und ganz ehrlich, T-Systems als Data Trustee als Erfolg zu bezeichnen, dafür bedarf es schon einer gesunden Portion Zynismus.

13.05.2016 - 13:14 Uhr

Tja, tut mir leid, der Transparenzreport von Microsoft selbst ist leider nicht transparenter. Ich würde mir auch genauere Daten wünschen. Aber man ist davon abhängig, was der Cloud-Anbieter einem sagt, und hat auch keine rechtliche Handhabe für mehr Informationen.

Das ist genau der springende Punkt.

Achso, Quelle: Microsoft selbst

LaTino

13.05.2016 - 13:06 Uhr

zum anderen Thema kommt noch was - sobald mein PC zu Hause ein neues Netzteil hat 😦

Microsoft hat Juli-Dezember 2015 bei

  • 4.026 staatlichen Anforderungen
  • über 6.585 Benutzer
  • in 83% der Fälle die angeforderten Daten geliefert.

Ich rede dabei von Anforderungen seitens der US-Regierung und von Daten deutscher Kunden. Bei solchen Anforderungen besteht keineswegs die Pflicht, den betroffenen Kunden zu informieren, und es wird auch nicht gemacht.

Dazu kommen Anforderungen per National Security Letters, die im Transparenzreport nicht auftauchen dürfen und über deren Anzahl man nur spekulieren kann.

Verschwörungstheorie? Mitnichten.

LaTino

13.05.2016 - 12:48 Uhr

//VM hat eine Referenz auf den derzeit ausgewählten Knoten, und auf den RootNode
void ChangeParent(Node newParent)
{
    SelectedNode.Parent = newParent;
}

Wenn ein Mechanismus vorhanden ist, der dem RootNode jegliche Änderung eines seiner Subknoten meldet (letzten Endes INPC), dann kriegt der RootNode durch diese eine Zeile die Änderung mit, das VM kann reagieren, und der View wiederum reagiert auch, der ist ja ans VM gebunden.

Und wenn du verschiedene Knotentypen hast (die alle von einem Basistypen erben), kannst du jederzeit festlegen, welche newNode-Typen ChangeParent erlaubt.

Oder kapier ich das Problem falsch?

LaTino

13.05.2016 - 11:56 Uhr

Coffeebean hat natürlich Recht - konkrete Hinweise auf ein besseres Vorgehen kann man dir nur geben, wenn man weiß, wie dein bisheriges Vorgehen aussieht...

Ich vermute mal, dass du das XML von Hand auseinanderpopelst und dann entsprechend im TreeView Knoten hinzufügst und entfernst, und dass du bei Auswahl eines Knotens ihn entsprechend im Control rechts markierst (BrowserControl? Oder was ist das?)

Wenn das XML gespeichert wird, dann sowieso nur das gesamte Dokument. Ist jetzt auch nicht so riesig, dass das irgendwie von Nachteil wäre - von Nachteil ist aber, dass du nur das XML als Datengrundlage für deine Controls nimmst (vermute ich jedenfalls).

Du fährst wahrscheinlich besser, wenn du das XML in ein "echtes" Objekt deserialisierst und in deinem Form mit diesem Objekt arbeitest. xml2csharp.com kann dir helfen, das Grundgerüst der notwendigen Klassen zu erstellen. Nachbearbeitung ist noch notwendig, aber das Gröbste baut er dir schon mal.

Ich habe mal testweise dein oben gepostetes XML dort reingejagt und die entstandenen Klassen in ein Projekt importiert, außerdem eine Datei "xmlfile.xml" mit diesem XML als Inhalt angelegt und in einem Konsolenprojekt folgendes gemacht:


XYZTable myObject = null;
var serializer = new XmlSerializer(typeof(XYZTable));
using (var xmlreader = XmlReader.Create("xmlfile.xml"))
{
    myObject = (XYZTable)serializer.Deserialize(xmlreader);
}

...und erhalte direkt ein einigermaßen brauchbares Objekt, mit dem sich arbeiten lässt. Dieses Objekt kann man nach Lust und Laune bearbeiten, und dann - wieder mit Hilfe des Serializers - auch wieder als XML speichern.

Damit bist du beim Arbeiten und manipulieren der Eigenschaften in deiner Windows.Forms-Anwendung schon einmal auf sichererem Terrain und musst dich nicht mehr mit XmlDocument und Konsorten herumschlagen.

LaTino

13.05.2016 - 10:42 Uhr

Versuch

  • ein png, das exakt die Dimensionen hat, die es im DGV haben wird (könnte beim Skalieren die Transparenzinfos versemmeln)
  • ein gif
  • ein .ico

LaTino

13.05.2016 - 10:07 Uhr

Nur wenn das View die Knoten iwie besonders präsentieren muss, und dafür spezielle Unterstützung aus den Knoten heraus braucht, dann kann man die Knoten nicht mehr als dem Model zugehörig betrachten.

Auch wenn's ungelegte Eier sind - was meinst du damit? Was für eine spezielle Unterstützung? (irgendein Beispiel reicht mir schon, ich komm grad nur nicht drauf, worauf du dich beziehst)

LaTino

13.05.2016 - 09:28 Uhr

Im Prinzip ja, es muss bei jeder Aktion, die gemacht wird, was ins Protokoll geschrieben werden. Nun muss man das nicht jedesmal neu implementieren. Konkret kann man zum Beispiel:

  • Basisklassen implementieren, die das "eingebaut" haben, also zB bei jedem Klick von LogButton (abgeleitet von Button) entsprechend das Log schreiben.
  • Code per Attribut injizieren, damit meine ich so etwas:

[Loggable(File = "example.log")
public class MyForm : Form
{
    [LoggableMethod(Enter = "Entering {0}", Exit = "Exiting {0}", LogLevel=Debug)]
     void MyMethod()
    {
         DoSomething();
    }
}

Nennt sich weaving ("einweben" von Code). Mit diesem Ansatz könnte man den notwendigen Code zum Logging später einfügen (runtime (dynamic) weaving oder static weaving). Dafür gibt es fertige Frameworks - spring.AOP , PostSharp, etliche andere.

Sind nur zwei Ansätze, wie man so etwas lösen kann. Schlussendlich gibt es fertige Logging-Frameworks wie Log4Net, die einem die Arbeit erleichtern - man muss nicht jedesmal das Rad neu erfinden.

LaTino

13.05.2016 - 07:59 Uhr

Ich sehe nichts, was dich daran hindern könnte, für Schreib/Lesevorgänge das Model ein Ereignis abfeuern zu lassen, dass das ViewModel abonniert und benutzt, um entweder selber oder über einen Adapter das Model zu serialisieren und zu speichern (oder zu laden und zu deserialisiern). Wenn das bei jeder Änderung des Models stattfinden soll, kann man dafür auch INotifyPropertyChanged nutzen.

Das HierarchicalDataTemplate ist dagegen ziemlich deutlich in der Domäne des Views und dafür gedacht, hierarchisch organisierte Daten darzustellen. Du hast hierarchisch organisierte Daten, also benutzt du das auch.

Ich sehe aber bei deiner Anwendung keinen Grund, das Model abseits vom Laden/Speichern noch einmal zu wrappen. Gib dem VM eine Referenz auf den Top-Knoten, und fertig.

Wenn du die Hierarchie irgendwie serialisierst, muss ja irgendwo in den serialisierten Daten ein Verweis auf den Elternknoten sein.


<MyData>
    <Node Id="1" ParentId="0" Text="Oberknoten" />
    <Node Id="2" ParentId="1" Text="Oberknoten" />
    <Node Id="3" ParentId="1" Text="Oberknoten" />
    <Node Id="4" ParentId="3" Text="Oberknoten" />
    <Node Id="5" ParentId="4" Text="Oberknoten" />
</MyData>


//deserialisierung "von Hand", da gibt's bessere Wege
class Node 
{
     //INotifyPropertyChanged...
     public Node(int id, int parentId, string text)
     {
          Id = id;
          ParentId = parentId;
          Text = text;
     }
     
     public void SetParent(IEnumerable<Node> nodes)
     {
          Parent = nodes.FirstOrDefault(p => p.Id == ParentId);
     }

     public Node Parent { get; private set; }
     private int ParentId { get; set; }
     public int Id { get; private set; }
     public string Text { get; set; }
}
public Node Load(string path)
{
    var nodeList = XDocument.Load(path).Root.Elements("Node").Select(p => Convert.ToInt32(new Node(p.Attribute("Id").Value), Convert.ToInt32(p.Attribute("ParentId").Value, p.Attribute("Text"));
    nodeList.ForEach(p => p.SetParent(nodeList));
    return nodeList.FirstOrDefault(p => p.Parent == null);
}

Und das ViewModel kriegt eben eine Property "RootNode" und macht bei der Intialisierung ein "RootNode = Load("example.xml");

LaTino
EDIT: im Editor getippert, könnten also Fehler drin sein. Geht auch nur ums Prinzip - zum Beispiel sollten bei dieser Art der Behandlung ChildNodes statt einem Parent gesetzt sein...sonst wird man sich nicht durchhangeln können^^