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 trib
Thema: Design für Defintionsklasse eines Parsers
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Matthias,

wäre es nicht sinnvoller in dem Enum/der Liste die Funktion zu beschreiben, anstelle des Zeichens selbst?
Statt
curlyBracketOpen = "{";
Besser
commandBlockBegin = "{";

Dann könnte man auch andere Sprachen unterstützen
commandBlockBegin = "BEGIN";
commandBlockEnd = "END";

Thema: Ausgabe von Messwerte mit Arduino und realtime Graph - Textbox bleibt leer
Am im Forum: Grundlagen von C#

Hallo kingf,

Du kannst keinen Graph mit einem Serial Port verbinden.
Du kannst Daten in der seriellen Schnittstelle abfragen und das Ergebnis in einem Graph anzeigen. Das sind immer zwei Schritte.
Was für ein Graph das letztendlich ist, spielt prinzipiell keine Rolle.

Daher gibt es praktisch 3 Aufgaben, die Du zu erledigen hast:

  1. Per oben genanntem Serial Port Template die Werte aus dem Arduino beziehen
  2. Den Graph mit Dummy-Daten füllen um zu verstehen wie er funktioniert (z.B. mit Hilfe von CodeProject Beispielen)
  3. Ergebnis aus Aufgabe 1 mit Aufgabe 2 verknüpfen.

Thema: Tabelle mit klickbaren Zelle?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Die einfachste Art eine Tabelle darzustellen, geht mit der ListView.
Diese kann man auf View "Details" stellen und Eigenschaften wie FullRowSelect setzen. Eine ListView hat nicht so viel Overhead wie ein DGV und ist imho erstmal einfacher zu verwenden.

Thema: Ausgabe von Messwerte mit Arduino und realtime Graph - Textbox bleibt leer
Am im Forum: Grundlagen von C#

Der Com-Port hat ein Event, welches aufgerufen wird, sobald Daten bereitstehen.
Dann kann man auf den Timer verzichten.

Zu beachten ist auch, dass der Timer oder das Event nicht im Thread der GUI laufen und daher synchronisiert werden müssen.

Ein Beispielprojekt dazu findest Du hier:
Template SerialPort
Dort sollte eigentlich alles hervorgehen.

Thema: Verwendung einer DLL via Reflection in verschiedenen Threads - Wird die selbe Instanz verwendet?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Nach langem Bitten und Betteln konnte ich eine Test-Form auf dem Server ausführen, wo sonst die externe Anwendung läuft.

Diese hat einfach eine Liste aus meiner Setup-Klasse gemacht und durchiteriert:

        private void btnStart_Click(object sender, EventArgs e)
        {
            List<Task> tasks = new List<Task>();

            foreach (var item in _setup.Items)
            {
                tasks.Add(Task.Factory.StartNew(() => { DataWrapper wrapper = new DataWrapper();
                    wrapper.Download(item);
                }));
            }

            Task.WaitAll(tasks.ToArray());
            MessageBox.Show("Fertig!");
        }


Mehrfach ausgeführt, Reihenfolge der Einträge geändert, absichtlich die Webservices etwas verzögert, Debug/Release-Modus, aus VS gestartet/Standalone, usw.
Und siehe da! Alle Dateien sind immer unterschiedlich und mit korrektem Inhalt :)

Man kann genau dabei zusehen, wie die Dateien fast synchron in den Zielverzeichnissen abgelegt werden.

Denke damit ist klar, wer sich nun zurücklehnen und ins Wochenende verschwinden kann :D

Thema: Verwendung einer DLL via Reflection in verschiedenen Threads - Wird die selbe Instanz verwendet?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin Gü,

danke für Deine Antwort!
Genau so hatte ich das mit Activator.CreateInstance auch erwartet.

Der ReflectionBuffer ist einfach eine Klasse mit ein paar string-, Type- & MethodInfo- Properties. Weiterhin ist dort die Liste mit den Ergebnissen aus der Webserviceanfrage enthalten. Das ist notwendig, da ich die Daten nicht am Stück abhole, sondern Paketweise
Habe ich in dem Code aber wegen der Übersichtlichkeit weggelassen. Daher auch die unsaubere Zuständigkeit, die Du ansprichst. Habe nur die wichtigen Teile zusammen kopiert.

Debuggen ist leider so eine Sache. Da leider eine externe Anwendung meinen Code ausführt ist das nicht so einfach. Dort vermute ich nun auch das Problem.

Deine Aussage bestätigt zumindest meine Vermutung, dass das Problem durch die externe Anwendung bedingt wird. Das hilft mir schonmal weiter! Danke :)

Thema: Verwendung einer DLL via Reflection in verschiedenen Threads - Wird die selbe Instanz verwendet?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

ich verwende eine DLL per Reflection.
Diese stellt Datenklassen bereit und eine Funktion, diese per Webservices zu befüllen.
Nun iteriere ich durch alle Klassen, führe den Webservice aus, serialisiere das Ergebnis nach Json und speichere es ab.

Funktioniert wunderbar!

Nun soll auf Basis einer zweiten Einrichtung, selbiges mit einer anderen URL für die Webservices und einem anderen Speicherort für die Dateien passieren. Zeitgleich. Es werden also zwei Threads erstellt, die beide meine DLL verwenden und eine unterschiedliche Einrichtung übergeben.
(Leider tut dies eine weitere externe Anwendung, auf die ich nur sehr wenig Einfluss habe)

Allerdings sind jetzt manche Dateien identisch, was aufgrund der Datenbasis nicht sein kann/darf.

Bis auf den Json-Serializer ist nichts static. Die Klasse die das Ganze startet wird definitiv neu instanziiert.

Daher meine Vermutung: Per Reflection wird die selbe Instanz wiederverwendet.
Ist das möglich?

Führe ich den Code Zeitversetzt aus, funktioniert auch wieder alles wie gewünscht.

Der Code etwas komprimiert:

        public void Download(string namespaceName)
        {
            //namespaceName = "Project_Name.Data.Master"
            var a = Assembly.GetExecutingAssembly();
            foreach (var an in a.GetReferencedAssemblies())
            {                
                if (an.Name.Equals(namespaceName.Split('.').First()))
                    InspectAssemblyName(an, namespaceName);
            }
        }
        private void InspectAssemblyName(AssemblyName an, string namespaceName)
        {
            var b = Assembly.Load(an);            

            foreach (var t in b.GetExportedTypes())
            {
                if (!t.Namespace.Equals(namespaceName))
                    continue;
                
                var buffer = new ReflectorBuffer();
                buffer.MainAssembly = b;
                buffer.NamespaceName = namespaceName;
                var genericListType = typeof(ThreadedBindingList<>).MakeGenericType(t);
                buffer.BindingList = Activator.CreateInstance(genericListType);
                buffer.Name = t.ToString().Split('.').Last();
                buffer.BindingListType = t;
                buffer.FileName = System.IO.Path.Combine(_setup.FileDirectory, buffer.Name + _setup.FileEnding);
                var myObj = buffer.MainAssembly.CreateInstance(String.Format(_setup.ServiceTypeNamespace, buffer.Name, buffer.Name));
                if (myObj == null)                
                    buffer.LastException = new WebException("Webservice not found!");
                var types = myObj.GetType();
                buffer.WsServiceObject = myObj;
                buffer.WsService = types.GetMethod("GetData");
                _bufferList.Add(buffer);
            }
        }

Anschließend wird die Buffer-Liste abgearbeitet, der Webservice ausgeführt und das Ergebnis komprimiert gespeichert.

        public void InvokeMethod(ReflectorBuffer buffer)
        {
            if (buffer.WsService == null)
                return;
            
            try
            {
                var result = buffer.WsService.Invoke(buffer.WsServiceObject, new object[] {string.Empty, _setup.BufferSize });
                foreach (var item in (IEnumerable)result)
                {
                    var bindingType = Activator.CreateInstance(buffer.BindingListType, new[] { item });
                    buffer.BindingList.GetType().GetMethod("Add").Invoke(buffer.BindingList, new[] { bindingType });                    
                }
                CompressData(buffer);
            }
            catch (Exception ex)
            {
                buffer.LastException = ex;                
            }
        }

        public void CompressData(ReflectorBuffer buffer)
        {
            var jstr = Serializer.SerializeToJson(buffer.BindingList);
            if (!String.IsNullOrEmpty(Serializer.LastExceptionMessage))
            {
                buffer.LastException = Serializer.LastException;
                return;
            }
            SaveFile(buffer, jstr);

            //Clear stored Data
            buffer.BindingList.GetType().GetMethod("Clear").Invoke(buffer.BindingList, new object[] { });
        }

        public void SaveFile(ReflectorBuffer buffer, string jstr)
        {
            if (!buffer.FileName.EndsWith(_setup.FileEnding))
                buffer.FileName += _setup.FileEnding;
            try
            {
                if (!Directory.Exists(Path.GetDirectoryName(buffer.FileName)))
                    Directory.CreateDirectory(Path.GetDirectoryName(buffer.FileName));
                var fileExists = File.Exists(buffer.FileName);
                using (var fs = new FileStream(buffer.FileName, fileExists ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.Write))
                {
                    fs.Write(_setup.FileEncoding.GetBytes(jstr), 0, _setup.FileEncoding.GetByteCount(jstr));
                    fs.Close();
                }
            }
            catch (Exception ex)
            {
                buffer.LastException = ex;
            }
        }

In beiden Verzeichnissen sind am Ende alle Dateien vorhanden, nur manche (gerade wo der Webservice sehr lange benötigt, dass die Wahrscheinlichkeit der Überschneidung besonders groß ist), sind identisch.

Kann es an Reflection liegen, dass die Daten bei manchen Klassen identisch sind?

Thema: Wie in das Thema Algorithmen einarbeiten?
Am im Forum: Rund um die Programmierung

Falls Du noch mehr Algorithmen suchen solltest:
Algorithmus der Woche

Dort werden auch alle Probleme erläutert, Strategien entwickelt und Lösungsvorschläge gegeben.
Es lohnt schon das lesen, ohne jeden Algorithmus nach zu programmieren.

Thema: Wie baue ich am Besten einen Webshop?
Am im Forum: Smalltalk

Um auf die Ausgangsfrage zurück zu kommen:
In welcher Größenordnung soll der Shop denn laufen?

Du hast z.B. Magento genannt. Das ist ein riesen Ding! Die Einrichtung ist aufgrund des Funktionsumfangs schon nicht trivial.
Auch müssen die Zahlungsmethoden separat erworben werden. Es stehen nur die Schnittstellen zur Verfügung. Die Verträge mit Saferpay, PayPal und wie sie alle heißen, müssen selbst abgeschlossen werden.
Bei anderen Anbietern musst Du selbst die API anprogrammieren.

Daher die Frage nach der Größenordnung des Shops.
Wenn ich nur ein paar Adressen abspeichern will, kaufe ich ja auch kein ERP-System ;)

Es gibt auch viele Anbieter mit komplett-Paketen. Da hast Du einen Baukasten und klickst Dir den Shop zusammen. Dann kannst Du aussuchen welche Zahlungsmethoden unterstützt werden sollen und bezahlst diese entsprechend.
Die Transaktionen kannst Du dann Maschinenlesbar herunterladen.

Thema: Sehe beim Aufruf über den Browser auf den FTP nur eine "robots.txt" - Wie richtig auf FTP zugreifen?
Am im Forum: Netzwerktechnologien

Viele zeitgemäße Router bringen von Haus aus einen FTP-Server mit.
Steckt man eine Externe Festplatte an, so kann man auf diese zugreifen (Unter anderem auch per DLNA und als Netzlaufwerk).
Da Du ohne Anmeldung die Robots.txt sehen kannst (die im Übrigen Suchmaschinen Crawlern dient), denke ich, dass Du ohne Portweiterleitung auf den Router schaust und nicht auf die Festplatte.
Ggf. musst Du auch für die Port Weiterleitung einen anderen Port wählen, da dieser natürlich nicht doppelt vergeben werden darf.

Thema: Json in Datatable deserialisieren mit untertabelle/nested table
Am im Forum: Datentechnologien

Hmm, ist ein gültiges Json und sieht auch gut im Json-Viewer aus.

Auch das automatische generieren in einer Klasse funktioniert wie erwartet:

public class RootObject
{
    public int id { get; set; }
    public string titel { get; set; }
    public object menge { get; set; }
    public List<string> bezeichnungen { get; set; }
}
http://json2csharp.com/

Was passiert, wenn Du erst in eine Klasse serialisierst und dann in eine DataTable?

Thema: Hilfe für SOAP (OCPPv1.5) in verbindung mit Mikrocontrollern (Backend)
Am im Forum: Netzwerktechnologien

Hallo Dani,

prinzipiell ist SOAP recht einfach gehalten. Es werden per http oder https sog. Soap-Envelops übertragen.
Die sind vereinfacht gesagt nichts anderes als ein XML.

Dieses XML muss einem bestimmten Vertrag entsprechen, den die WSDL vorgibt.
Um das nicht manuell bauen zu müssen, kannst Du eine WSDL direkt in Visual Studio einbinden und daraus automatisch Klassen generieren lassen.
Um bei der XML-Struktur zu bleiben, kannst Du auch SoapUI verwenden. Das wird Dir vermutlich mehr beim Verständnis helfen, da Du siehst wie die Anfrage aussieht und wie das Ergebnis zurück kommt.

Die Links sind leider nicht zugreifbar...

Thema: Typ temporär zur Laufzeit erstellen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo inflames2k,

kennst Du WebServiceStudio? Das löst, genau wie SoapUI, einen Webservice in alle Methoden und Parameter auf.
Nur mit dem Unterschied zu SoapUI, dass der Quelltext von WebServiceStudio vorliegt :)

Vielleicht kannst Du Dir dort ein paar Anleihen für Deine Umsetzung holen.

Thema: Problem: Screenshoterstellung bei minimiertem Fenster
Am im Forum: Grafik und Sound

Hi,

versucht doch mal diesen Weg: Capturing Minimized Window: A Kid’s Trick

Zum einen wird dort die Animation unterbunden, was den Prozess beschleunigt, zum anderen das Fenster auf Transparent gesetzt, so dass es der Benutzer nicht zu Gesicht bekommt.

Ob dort auch gewartet oder gepollt wird ob das Fenster bereits fertig ist, sollte sich dann aus dem Code ergeben. Habe das Projekt jetzt nicht runtergeladen.

Thema: Microsoft Exchange 2010 EWS API 2.0 | Kontaktordner sync
Am im Forum: Office-Technologien

Hallo Kai,

ich finde die Methode doch sehr unübersichtlich...
Die kann man sicherlich noch etwas schöner machen und in mehrere Funktionen aufteilen.
Das wird u.a. auch eine mögliche Fehlerquelle sein.

Beim überfliegen des Codes ist mir aufgefallen, dass Du beim Erstellen des neuen Kontaktes die "DaddyId" und die eigene ID setzt.

connectorList.Add(new connector { DaddyIdAsString = aContact.Id.ToString(), id = zahl, ChildBirthDate = item.DateTimeCreated, ChildIdAsString = item.Id.ToString(), Name = aContact.DisplayName.ToString() });
Dazu holst Du Dir überflüssiger Weise wieder alle Elemente des Ordners und vergleichst das "ChildBirthDate" bis Du den vermeintlich neuen Kontakt gefunden hast.

Beide Methoden Move() und Copy() haben als Rückgabewert ein OutlookItem. Das solltest Du auch verwenden!

Damit kannst Du auf die Schleife und den Vergleich verzichten. Denke da liegt auch das Problem beim füllen Deiner Liste. Denn imho ist diese verkehrt und gar nicht unbedingt das Löschen an sich.

Thema: Authentifizierungsfehler bei WebService von belboon mit C#
Am im Forum: Web-Technologien

Hi,

versuch mal das Property UseDefaultCredentials auf false zu setzen.
Ansonsten werden Deine Benutzerinformationen ignoriert.

Thema: Sharepoint Authentifizierung im WebBrowserControl
Am im Forum: Web-Technologien

Hallo zusammen,

ich habe ein WebBrowser-Control, welches Dokumente von einem Sharepoint-Online anzeigen soll.
Die integrierte Windows-Authentifizierung funktioniert daher leider nicht.

Navigiere ich die URL an, erhalte ich ein "401 UNAUTHORIZED". Öffne ich die URL im IE und Authentifiziere mich dort mit dem O365-Account, funktioniert auch anschließend die Anzeige im Control (für diese Session).

Daher versuche ich gerade die Authentifizierung dem WebBrowser-Control mit zu geben:


webBrwsr.Navigate(url, string.Empty, null, CredentialHeader(UserName, Password));

        public static string CredentialHeader(string username, string password)
        {
            return "NTLM " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)) + Environment.NewLine;
        }
Die Seite gibt nun keine Meldung mehr aus, bleibt aber weiß.
NTLM ist auch was der Fiddler aufzeichnet, wenn ich per IE auf die URL zugreife.

Was problemlos funktioniert sind sowohl ein WebClient, als auch ein WebRequest:


var client = new WebClient { Credentials = new NetworkCredential(username, password) };
var response = client.DownloadString(url);
MessageBox.Show(response, "Response");

WebRequest request = WebRequest.Create(url);
request.Credentials = GetCredential(url, username, password);
request.PreAuthenticate = true;
var response = request.GetResponse();
MessageBox.Show(response.ResponseUri.ToString(), "ResponseUri");


        private CredentialCache GetCredential(string url, string username, string password)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
            var credentialCache = new CredentialCache();
            credentialCache.Add(new Uri(url), "NTLM", new NetworkCredential(username, password));
            return credentialCache;
        }

Im Internet lese ich immer von einem gegenteiligem Verhalten und wie man den CookieContainer vom WebBrowser an den Request weiter reichen kann.

Die Seite ist im IE als Vertrauenswürdig hinterlegt.

Im Fiddler kann ich sehen, dass es 2 Anfragen/Antworten für die Authentifizierung braucht. Quasi ein kleines PingPong. Kann das ein Problem sein?
Auch wenn ich den Header aus dem Fiddler 1:1 in den Header an das WebControl übergebe, bleibt die Seite weiß.

Hat jemand sowas in der Art bereits umgesetzt?

Thema: EWS - Freigegebener Kontakt Ordner
Am im Forum: Office-Technologien

Ups, da habe ich doch glatt vergessen des Rätsels Lösung zu posten. Schande über mein Haupt!

Es ist notwendig den Root-Folder für die Kontakte freizugeben. Also Kontakte -> Eigenschaften -> Berechtigungen -> "Ordner sichtbar".
Das ermöglicht lediglich diesen Ordner zu sehen, keinesfalls aber die darin liegenden Kontakte!
Nun kann ich das Unterverzeichnis auswählen und entsprechend mit Lese- und/oder Schreibberechtigungen ausstatten.
Der Zugriff erfolgt nun mit meiner Benutzeranmeldung aber mit dem Mailbox-Namen des auszulesenden Kontos.

Es muss nur die Berechtigung erteilt, nicht aber die Freigabe versendet werden.

@tom-essen: Leider benötigt man dann eine Liste von zu durchsuchenden Email-Konten. Eine Suche ist imho nicht möglich.

Thema: Ausrichtung von Windows 10 Mobile auf Business-Kunden fokussiert
Am im Forum: Szenenews

Hallo zusammen,

da geht es mir ähnlich. Obwohl ich mein Lumia ausschließlich als Firmentelefon verwende und privat ohnehin auf Android setze.
Auflegen ist echt ein Thema, wo Bernd mit aus der Seele spricht! Ganz schlimm, wenn es ein Skype4Business Anruf ist. Telefon entsperren zum auflegen...
Aber ein Headset schafft zumindest Abhilfe.

Die Akkulaufzeit ist in 80% aller Fälle toll. Dann gibt es Tage, da hält es knapp 10 Stunden. Dann wieder 3 Tage.
Alle paar Morgen muss ich den Pin eingeben. Keine Ahnung ob es wirklich so viele Updates sind, die automatisch installiert werden oder es wie mein 920 regelmäßig einfach neustartet.

Die Leiste zum Musik hören ist angenehm, wenn Sie nicht von Benachrichtigungen verdeckt werden würde. Oder beim Spulen flackert. Oder nur etwa für 1 Sekunde sichtbar ist. Lesen was kommt und dann weiterspulen: Unmöglich!
Oder die Lautstärke, die sich immer erst beim 2. Lied anpassen lässt :D Dafür meckert sie unvermittelt zwischendurch wie gefährlich laute Musik ist. Bei 7-8.

Es sind zahlreiche Kleinigkeiten die mich stören, obwohl ich alles andere als ein Poweruser bin. Das darf eigentlich nicht sein, wenn man bedenkt wie viel Arbeit MS investiert hat. Da war WP8 teilweise echt besser.

Dennoch halte ich WP schon für ein gutes OS und würde mich natürlich darüber freuen, wenn es mehr verbreitet wäre und man mit einer .Net App Tablets, Telefone und PC´s abdecken kann.
Aber selbst das untergräbt MS mit den PowerApps nun selbst. Die funktionieren ja auf Android, iOS und PC (Noch nicht auf WP[!!!]).

In Sachen Apps ist für mich persönlich alles dabei was ich für die Arbeit benötige. Aber wie gesagt, ich habe auch noch ein privat Telefon.

MS hat es mal wieder mit der Brechstange versucht sich zu etablieren und untergräbt sich selbst.
Versaut haben die das meiner Meinung nach bei WP7 auf 7.5 und 8. Es wurde ständig behauptet bereits auf einen einheitlichen Kern zu setzen und eine App für alles (PC & mobil) entwickeln zu können. Dem war aber nicht so, es war noch schlimmer! Bei dem Update von 7 -> 7.5 -> 8 mussten die Apps komplett überarbeitet oder gar neu entwickelt werden. Kein Wunder dass einige Entwickler sich verabschiedet haben oder neue auf ein so wechselhaftes OS garnicht erst aufsetzen.
Nun gibt es Apps von MS zuerst für iOS, Android und zuletzt WP. Alle Dienste sind überall verfügbar.
Es stellt sich heraus, dass es immer nur einen Ersten geben kann: Cloud first und Mobile first funktioniert nicht.

Thema: Ordner-Überwachung per dauerhaft laufenden Dienst/Prozess od. Task-Scheduler
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Sorry, da habe ich mich vertan!
In meinen Codes setze ich selbst die EnableRaisingEvents auf false und am Ende wieder auf aktiv.

Bzw. habe ich das glaube ich mit SQL Dependency durcheinander gebracht. Da muss man nach jedem Event-Aufruf die Anfrage neu absetzen.

Thema: Ordner-Überwachung per dauerhaft laufenden Dienst/Prozess od. Task-Scheduler
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Wenn wir schon das Thema Vollständigkeit behandeln :)

Der FileSystemWatcher muss neu initialisiert werden, wenn er einmal durchlaufen ist.
So kann einem gerne mal eine Datei durch die Lappen gehen, die während der Verarbeitung erstellt wurde.
Daher empfiehlt es sich am Ende des Events noch einmal den entsprechenden Ordner nach neuen Dateien zu durchsuchen.

Ansonsten an gfoidl´s Tipp halten und bei einer überschaubaren Menge von Dateien pollen.

Thema: Cloud Diskussion
Am im Forum: Smalltalk

Zitat von LaTino
(zum Beispiel beim Thema Stromausfall im Posting von tribs, bei dem ich nicht wusste, ob ich lachen oder weinen soll - aber ich schweife ab).
Nun muss ich lachen :D
Also kann ich getrost davon ausgehen, dass Du noch nie in einem Unternehmen mit >200 Mitarbeiter an einem Standort gesessen hast, wo der nette Baggerfahrer von Nebenan, etwas Unkraut und auch ein Stromkabel umgegraben hat.

Exchange im Hause: Kein weiterarbeiten
O365: Mobil oder im HomeOffice weiterarbeiten

Da Argumente so schwer ankommen, dachte ich, ich probiere es mal mit Farbe :)
Es ist wahrhaftig so gewesen und die GF hat sich nach 2 Tagen mehr oder weniger Totalausfall entschieden auf O365 zu migrieren.


Die Diskussion scheint ein bisschen in die Richtung iPhone vs. Android abzudriften. Verhärtete Fronten und wenig Gehör für die Argumentation des anderen.

Bin auf keinen Fall uneingeschränkt für die Cloud und halte sie nicht für "die" Lösung für alles und jeden. Aber ich bin offen dafür. Einige Kunden sind schon komplett in die Cloud gewandert. Teils wegen der finanziellen Attraktivität, teils wegen der Hochverfügbarkeit aber auch um die eigene IT zu entlasten.
Es soll sich halt jeder das herausnehmen, was er gerade benötigt. Und wenn jemand bedenken hat sein ERP/CRM auszulagern, dann soll er das eben lassen. Seine privaten Fotos werden vermutlich dennoch automatisch zur Sicherung in eine DropBox geladen :)

Thema: Ping Socket unter Windows CE
Am im Forum: Rund um die Programmierung

Hallo FrankenDerStein,
leider kenne ich keine richtig funktionierende Ping-Funktion.
Habe einige Beispiele ausprobiert und unter CE5 ging teilweise die iphlpapi.dll. Lässt mich aber in aktuellen Versionen auch im Stich.

Wenn es nur darum geht einen Server zu checken, kannst Du das ganz einfach über System.Net.Dns lösen:


         public IPAddress TargetIp
        {
            get { return _targetIp; }
            set { _targetIp = value; }
        }
        private string _host = "google.de";
        public string Host
        {
            get { return _host; }
            set
            {
                _host = value;
                if (_host != string.Empty)
                    GetHost();
            }
        }
        private void GetHost()
        {
            try
            {
                TargetIp = Dns.GetHostEntry(Host).AddressList[0];
            }
            catch (Exception ex)
            {
                //invalid host, unable to get IP
                [...]
            }
        }
Hostnamen übergeben, IP zurück bekommen :)

Thema: Cloud Diskussion
Am im Forum: Smalltalk

@bredator: Warum muss man auch alle Skeptiker überzeugen? Es sagt ja niemand dass die Cloud ein Allerheilmittel ist und jedem dient.
Wie Du schon korrekt schreibst, die Informationen und die Transparenz sind die Dinge, die man benötigt um sich selbst davon ein Bild zu machen.

@LaTino: Bisher ist der Angreifer im eigenen Haus immer noch die größte Bedrohung, das unterschreibe ich Dir sofort.
Man kann aber festlegen welche IP´s auf eine System kommen und welche nicht. Also eine Beschränkung auf "Inhouse" ist durchaus möglich.
Das "Keine Internetverbindung"-Argument ordne ich mal in die Top3 ;-)
Wenn wir im Unternehmen kein Internet haben, bringt es auch nix mehr lokal die ERP zur Verfügung zu haben. Keine Mails, keine Kundenzugriffe, kein VoIP, usw. Es kann (so gut wie) niemand mehr weiterarbeiten.
Dann holt man A) sein Handy aus der Tasche und macht einen Hotspot auf oder B) fährt in HomeOffice.
Machbar ist das schon alles!

Gegenbeispiel Stromausfall: Alle Server fahren herunter nachdem die ISV aufgibt. Dann hilft auch kein HomeOffice, Hotspot, Smartphone-Mailclient oder sonst was.

@Topic: Finde die Azure-Dienste super und nutze sie oft um, wie Abt es toll dargestellt hat, "mal eben" ein System aufzusetzen. Schnell eine SQL-Kiste ertellen, ServiceBus bauen, Daten einspielen und eine C#-Synchronisation testen. Anschließend kann ich dem Kunden eine Aussage über Aufwand, Performance und Kosten geben, ohne dass mich das selbst was gekostet hätte (im VS Abbonement) oder ich irgendwas manuell installieren musste.

Viele sind mit dem Exchange schon auf O365 umgezogen, da ist es nur noch ein logischer Schritt weitere SaaS-Angebote wahrzunehmen.

Dennoch gibt es einige Dinge, denen ich skeptisch gegenüberstehe. Es wird schlicht und ergreifend eine Abhängigkeit geschaffen. Dann kann der Anbieter künftig machen und verlangen was er möchte.
Wer weiß wie es mit Win10 weitergeht. Es kommen Features hinzu, es verschwinden welche. Darüber habe ich keine Kontrolle mehr.
Da war mit OnPremise schon eine gewisse Sicherheit da, dass ein aufgesetztes System jahrelang so weiter funktioniert. Was auch gleichzeitig oft ein Problem darstellt (Siehe Verwendung von XP in Geldautomaten, usw.) :D

Pro: Stetiger Wandel (Das Leben eines IT-lers)
Contra: Abgabe der Herrschaft über ein System.

Daher entscheide ich das je Anwendungsfall, stehe dem ganzen aber grundsätzlich positiv gegenüber. Je mehr Auswahl der Technologien, je besser für uns :)

Thema: Neben "false" auch die Exception-Message zurückgeben - Methode mit mehreren Rückgabewerten
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

In den Projekten, wo ich DLL´s in einem nicht C#-Umfeld einsetze, habe ich meist ein Property "LastException" und "LastExceptionMessage", welche man auslesen kann.
Die LastException wird in jedem Catch-Block gefüllt. Die Message wrappt einfach nur den Nachrichtentext.
Hat sich so bewährt, da nicht alle Applikationen mit ref & out klar kommen und zum teil sogar nur die basis Objekttypen unterstützen.

Thema: WindowsForms: Verschiedene Masken durchschalten
Am im Forum: GUI: Windows-Forms

Meinst Du vielleicht MDI?

Also schon verschiedene Forms, aber eingebettet in einem Programm.

CodeProject: MDI

Thema: Serielle Schnittstelle -> mehrere Befehle hintereinander
Am im Forum: Rund um die Programmierung

Zitat von justcp
woher diese ständig wachsende Abarbeitungszeit kommt
Du startest den Timer wieder neu, bevor der Code durchlaufen ist. Das bedeute, dass das Interval nach jedem Durchlauf um die Abarbeitungszeit Deiner Funktionalität kürzer wird.

Das vom Timer aufgerufene Event sollte erst ganz am Ende den Timer wieder neu Starten!
Zitat von justcp
Auf das DataReceivedEvent möchte ich ungerne zurückgreifen, da dies beim Auslesen des Geräts Probleme und Tücken mit sich bringt.
Nein, das tut es gewiss nicht. Die Tücke liegt bei der Konfiguration des COM-Ports.
Und der Verwendung von mehreren Threads (Timer + Event).

Thema: Ideale Aufbau eines XML Struktur
Am im Forum: Grundlagen von C#

Dann gebe ich auch noch schnell meine 2 Cents dazu:

LaTino´s Aussage würde ich noch weiter differenzieren.
Die Frage ist, ob man Daten mit sich selbst oder anderen austauscht.
XML ist bekannt, hat eine definierte Struktur und ist leserlich. Deshalb eignet es sich für Konfigurations-Dateien oder zum Austausch mit z.B. anderen Dienstleistern.

JSON ist kompakter und in der Web und Java Welt recht verbreitet.

Sollte aber an dieser Stelle meiner Meinung nach noch keine Rolle spielen!
Sich das Format zuerst zu überlegen, ist von hinten durch´s Auge :)

Würde mir erstmal eine saubere Klassenstruktur erstellen. Dann merkt man beim programmieren meist schon ob es passt, oder man noch Änderungen vornehmen muss.
Die Umstellung von dem XML-Serializer zu Newtonsoft JSON ist anschließend in 2 Zeilen erledigt.

Es gibt die Statistik. Darin mehrere Spieltage. Am Spieltag kann es mehrere Spiele mit X Teilnehmern geben. Ein Spiel (Match) besteht aus Sets & Legs...
Man beginnt i.d.R. am Ende der Struktur und füllt dann Schrittweise die Klassen mit weiteren Properties.

Mal ganz rudimentär und exemplarisch:

    public class Throw
    {
        public int Point { get; set; }
    }

    public class Leg
    {
        public List<Throw> Throws;
    }
    
    public class Set
    {
        public List<Leg> Legs;
    }

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

    public class Match
    {
        public DateTime Date { get; set; }
        public Player Player1 { get; set; }
        public Player Player2 { get; set; }
        public List<Set> Sets;
    }

Nun könnte man im Programm eine Liste von Matches erstellen und damit seine Spiele "verwalten". Oder jedes Match in eine eigene Datei schreiben. Denke das kommt dann von alleine, wenn man das Prinzip der Serialisierung verstanden hat.

Thema: Eingescannte Rechnungen auf Unterschrift oder Stempel überprüfen
Am im Forum: Grafik und Sound

Hallo CHRRP,

habe das Bild gerade mal durch die Azure OCR API gejagt.
Der entsprechende Bereich produziert folgende Ausgabe:

[pre]. med. C.
ön
Musterst e 5

20

spieldorf
-10090[/pre]

Also die lesbaren Stellen des Stempels, die nicht durch die Unterschrift verdeckt wurden.

Glaube das wird echt schwierig, entweder Stempel oder Unterschrift würde ich noch als "relativ" simpel einschätzen, aber beides in Kombination, inkl. Überschneidung ist schon heftig.

Thema: OCR Erkennung per Azure
Am im Forum: Smalltalk

Es sind praktisch alle Dienste "umgezogen" und stehen in Azure bereit. Nur OCR liegt vorerst noch auf der Oxford-Seite.

Die Emotion-Erkennung ist auch ganz nett. Es wird eine Bewertung über folgende Kriterien abgegeben:

  • anger
  • contempt
  • disgust
  • fear
  • happiness
  • neutral
  • sadness
  • surprise

Klappte bisher aber nur etwas mäßig. Auch kann man leider die Dienste noch nicht in die PowerApps integrieren. Da warte ich ziemlich gespannt drauf :)