Laden...

Forenbeiträge von moelski Ingesamt 183 Beiträge

09.10.2012 - 10:47 Uhr

Moin !

Das ist eher ein Argument für MongoDB statt gegen

Ok, aber gibt es denn schon viele Webhoster die MongoDB anboiten?
Mein ISP hats nicht im Programm.

Ich glaube wir werden auch leicht OT ... =)

09.10.2012 - 10:21 Uhr

Hallo Abt,

ich habe schon einen Blick auf mongoDB geworfen. Aber warum ich (noch) an MySQL festhalte ist die Tatsache das man es auch bei einem Provider nutzen könnte. Und das ist - wie ich finde - schon ein Vorteil. Denn damit liessen sich auch Webauswertungen realisieren per PHP oder ASP.net.

Mein Fokus liegt schon darauf rauszufinden wie schnell man mit einer MySQL arbeiten kann. Aber wenn ich über die Listen Inserts in die Region von ~50000 Zeilen pro Sekunde komme, dann wäre das erstmal mehr als genug an Performance.
Im Normalfall werden die Anforderungen weit unter dem liegen.

Ich werde jetzt noch ein paar Tests machen mit Tabelle füllen und gleichzeitig Daten auslesen. Sollte ich dabei auf große Probleme stossen bezüglich der Performance werde ich mal Richtung NoSQL schauen.

Grüße Dominik

09.10.2012 - 08:30 Uhr

Moin !

Ich habe heute noch ein bisschen im Web gesucht wie ich die Sache noch optimieren kann. Und dabei bin ich auf diese Seite gestoßen:
http://dev.mysql.com/doc/refman/5.1/de/insert-speed.html

Dort kann man folgendes lesen:

Wenn Sie gleichzeitig viele Datensätze vom selben Client aus einfügen, verwenden Sie INSERT-Anweisungen mit mehreren VALUES-Listen, um mehrere Datensätze zur selben Zeit einzufügen. Dies ist erheblich (in manchen Fällen sogar um mehrere Größenordnungen) schneller als die Verwendung separater INSERT-Anweisungen für je einen Datensatz

Das habe ich dann mal als dritte Alternative in meine Testanwendung eingebaut.

Die Ergebnisse sind schon beeindruckend (jeweils bei 10000 einzutragenden Zeilen) :

Normaler Insert        3,084ms pro Zeile
Transaction Insert     0,2007ms pro Zeile
Listen Insert          0,019ms pro Zeile

Das ist schon erstaunlich. Das ist immerhin 162x schneller 8o

Ich habe auch Tests gemacht mit Socket, Pipe und Memory als Transport weg. Dort konnte man aber nur sehr geringe Geschwindigkeitszuwächse feststellen.

Grüße Dominik

08.10.2012 - 22:16 Uhr

Moin !

So ich habe weitere Tests gemacht.

Folgende "Optimierungen" sind eingeflossen:

  • MySqlCommand Objekt ausserhalb der Schleife angelegt
  • Statt über Prepare setze ich direkt einen comm.CommandText mit INSERT ab
  • Transaktionen (500 Inserts zusammengefasst zu einer Transaktion)

Ergebnisse (InnoDB):
10000 Zeilen eingetragen
ohne Transaktion : 3,31 ms pro Insert
mit Transaktion : 0,28 ms pro Insert

Ergebnisse (MyISAM):
10000 Zeilen eingetragen
ohne Transaktion : 0,28 ms pro Insert
mit Transaktion : 0,288 ms pro Insert
(wobei hier ja Transaktionen laut Doku nicht wirklich funktionieren)

Aber wie man es auch dreht ... Bei ca. 0,3ms pro Insert scheint dann irgendwann (auf meinem System) das Ende der Fahnenstange.

Oder kann ich neben den Transaktions noch irgend etwas beschleunigen?

Grüße Dominik

08.10.2012 - 12:55 Uhr

Nachtrag ...

Ich habe mal die Engine von InnoDB auf MyISAM geändert. Und dann habe ich 2000ms für 10000 Einträge. Also 0,2ms für einen Eintrag.

Allerdings hat MyISAM schon ein paar Nachteile gegenüber InnoDB.

Und auch hier ist weder Client noch Server richtig ausgelastet.

Vielleicht gibt es in meinem Konstrukt ja noch einen Haken 🤔 (abgesehen davon Bulk Imports zu nutzen)?

08.10.2012 - 12:45 Uhr

Moin !

Das bringt nur einen sehr kleinen Schub:
10000 27671 immer neu
10000 23907 einmal definiert

Einmal sind es 27 und einmal 23 Sekunden für 10000 Einträge.
Ok ist 4 Sekunden schneller, aber wenn man es mal auf einen Eintrag runter bricht haben wir 2,4ms zu 2,76ms für einen Eintrag ...

Und auch hier dümpeln beide Anwendungen eher vor sich hin mit 2% CPU Last beim Eintragen...

Grüße Dominik

08.10.2012 - 11:25 Uhr

verwendetes Datenbanksystem: MySQL 5.5

Moin !

Ich versuche mich gerade an einer MySQL Datenbank. Der Server läuft auch, Datenbank ist erstellt und es gibt auch eine Tabelle in der DB:

CREATE TABLE `datatest` (
	`ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`Time` DATETIME NOT NULL,
	`ms` SMALLINT(5) UNSIGNED ZEROFILL NOT NULL DEFAULT '00000',
	`us` SMALLINT(5) UNSIGNED ZEROFILL NOT NULL DEFAULT '00000',
	`ns` SMALLINT(5) UNSIGNED ZEROFILL NOT NULL DEFAULT '00000',
	`Data1` DOUBLE NULL DEFAULT NULL,
	`Data2` DOUBLE NULL DEFAULT NULL,
	`Data3` DOUBLE NULL DEFAULT NULL,
	`Data4` DOUBLE NULL DEFAULT NULL,
	`Break` INT(11) NULL DEFAULT NULL,
	`Hint` TINYTEXT NULL COMMENT 'Hint for the DataSet' COLLATE 'latin1_swedish_ci',
	PRIMARY KEY (`ID`)
)
COMMENT='A Data Table ...'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

Ich verbinde mich über den MySQL Connector mittels MySqlConnection auf die Datenbank (local). Bis hier hin alles super.

Jetzt möchte ich nur Zeilen mit Zufallsdaten in der DB eintragen um mal ein Gefühl dafür zu bekommen wie schnell das klappt.

Dazu habe ich diese Methode:

        public static void insert(MySqlConnection conn)
        {
            var cmd = new MySqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "INSERT INTO datatest(Time) VALUES(@Time)";
            cmd.Prepare();

            cmd.Parameters.AddWithValue("@Time", DateTime.Now);
            cmd.ExecuteNonQuery();
        }

Das lasse ich in einer For Schleife 1-n x ausführen und ermittele über eine Stopwatch Instanz die Zeit.

Ich habe mal zwischen 100 und 100000 Zeilen eintragen lassen und das braucht pro Zeile im Schnitt ca. 1,5-2,5 Millisekunden. Das kommt mir doch etwas langsam vor für einen lokalen Server 🤔

Man sieht auch im Taskmanager das sich beide Anwendungen (Client & Server) CPU mässig langweilen und bei weniger als 2% rumdümpeln während Daten eingetragen werden 8o. Ich hätte eigentlich erwartet das entweder Server oder Client auf Anschlag gehen ...

Mache ich hier generell irgendwas falsch? Mir ist bewusst das es sowas wie Bulk Inserts gibt. Aber ich wollte hier testen wie schnell ich mit einzelnen Inserts bin.

Grüße Dominik

22.08.2012 - 10:35 Uhr

Ahhhhhhh 8)

U made my day. Jetzt verstehe ich das langsam 🙂

Ok, damit komme ich nun weiter. Vielen Dank für den Wink 👍

22.08.2012 - 10:27 Uhr

Moin !

Tja, aber damit bekomme ich ja als Match folgendes:

Status of the disk 3F.18 
(2017000C:CA4FC40C:00000000:00000000:00000000:00000000:00000000:
00000000:00000000:00000000) has recently changed or the node (filer12)
is missing the disk.

Aber mein Ziel ist ja nur** 3F.18** als Match Ergebnis. "Status of the disk" und "is missing the disk" sollen nur vorkommen, aber nicht im Matchergebnis auftauchen.

22.08.2012 - 10:07 Uhr

Moin !

Ich muss hier gerade Log Files auswerten und versuche dazu Regex zu verwenden. Gegen sei folgender String (ist normal eine Zeile, habe es mal der Übersicht halber umgebrochen):

Wed Jul  4 21:57:52 CEST [filer11: cf.disk.inventory.mismatch:CRITICAL]: Status of the disk 3F.18 
(2017000C:CA4FC40C:00000000:00000000:00000000:00000000:00000000:
00000000:00000000:00000000) has recently changed or the node (filer12)
is missing the disk.

Was ich brauche ist 3F.18. Das kriege ich durch folgenden Regex Match hin:

([a-fA-F0-9]{2})\.([a-fA-F0-9]{2})

Allerdings würde ich gerne noch zwei Strings mit prüfen lassen. Und zwar soll auch "Status of the disk" und "is missing the disk" vorkommen.

Nun bin ich ja froh das ich den normalen Match hinbekommen habe. Aber wie ich jetzt die 2 Überprüfungen noch dazu bekomme kann ich im Moment nicht erkennen.

Geht das überhaupt mit RegEx? Oder muss ich das vorher mit Contains normal überprüfen?

24.07.2012 - 07:52 Uhr

Moins !

Es ist so wie herbivore sagt. Ich habe eine DB in der ich Regex speichern muss die automatisch ausgewertet werden. Ein "Durchforsten" der Gruppen ist in dem Fall leider nicht möglich (oder nur mit enormem Mehraufwand).

@herbivore: Ich werde das mal mit Look-Aheads versuchen. Wenn ich nicht weiterkomme würde ich mich nochmal melden.

23.07.2012 - 15:24 Uhr

Hi xxxprod,

danke für die Info.
Ist das überhaupt ohne Gruppe lösbar ?

23.07.2012 - 15:18 Uhr

Moins !

Ich versuche nun schon eine ganze Weile folgendes mit Regex zu lösen...

Gegen sei dieser String:

Node ID="CKDevice" State="Online" Status="OK"

Ich möchte folgendes Ergebnis erziehlen:

CKDevice

Mein Versuch war folgender:

ID=".*?"

Das führt aber zu dem Ergebnis:

ID="CKDevice"

Auch was ich z.b. bei stackoverflow gefunden habe löst das Problem nicht:
RegEx: Grabbing values between quotation marks
(Das trifft nicht ganz mein Problem, geht aber in die gleiche Richtung)

Kurzum, gibt es in Regex nicht die Möglichkeit das Match Ergebnis dahingehend zu beeinflussen Zeichen beim Ergebnis zu ignorieren?

Habe schon das Regex PDF hier aus dem Forum durchgeschaut, und auch die Suche bemüht. Konnte aber noch keine Lösung für mein Problem entdecken.
Und wie geschrieben ... die zahlreichen Hinweise auf stackoverflow haben mich auch nicht weiter gebracht.

Hoffe hier kann mir jemand den entscheidenden Kniff nennen 🤔

03.06.2012 - 06:00 Uhr

Moin !

Besser ist es, eine Queue<T> zu verwenden.

Da habe ich allerdings das Problem das ich die Queue nicht auslesen kann über einen Index.
Wenn sich am ListView was ändert dann kriege ich ja nur Indexe wo ich einen Wert für zurückliefern muss. Und das wird schwierig bei Queue.

Meine neue Idee ...
Ich nehme ein erweitertes Dictionary. Dieses Dictionary bekommt 3 neue Properties:
Size, Start, Count.

Über Size lege ich die max. Einträge des Dicts fest.
Count (Ulong) wird bei jedem neuen Eintrag um 1 erhöht und dient als Index innerhalb des Dicts.
Start (Ulong) ist der aktuelle Startindex des Dicts.

Damit würde das Problem von LIST<> eleminiert. Und das mir bei ulong ein Überlauf passiert sollte kaum zu schaffen sein. 👅

Also in etwa so:

    public class FixedDict<T> : ConcurrentDictionary<ulong, T>
    {
        public int Size { get; private set; }

        public ulong Start { get; set; }
        public ulong Last { get; set; }

        public FixedDict(int size)
        {
            this.Size = size;
            this.Start = 0;
            this.Last = 0;
        }

        public void Insert(T obj)
        {
            this.Last++;
            this.TryAdd(this.Last, obj);
            
            lock (this)
            {
                while (this.Count > this.Size)
                {
                    T obi;
                    this.TryRemove(this.Start, out obi);
                    this.Start++;
                }
            }
        }
01.06.2012 - 18:42 Uhr

Moin !

Unsere Anwendung hat ein sehr umfangreiches Logging was auch für die User interessant ist. Nun würde ich gerne das Logging in der Anwendung anzeigen lassen. Dabei sollen max. x Zeilen des Logs dargestellt werden. Wenn die Anzahl überschritten wird wird der älteste Logeintrag vorher aus der Liste gelöscht und dann der neue unten angehängt.

Ich habe dabei folgende Idee gehabt:
* Liste anlegen (im Moment einfach List<string>)
* ListView im Virtual Mode nutzen
* ListView VirtualListSize auf ein vernünftiges Mass setzen (1000 sollte reichen)

Bei einem Logeintrag kriege ich ein Event und fülle/bereinige dort die Liste:

            if (this.Logs.Count >= maxi)
            {
                this.Logs.Remove(this.Logs[0]);
            }

            this.Logs.Add(e.LogEntry.Title);

Mein RetrieveVirtualItem schaut dann so:

        private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            ListViewItem lvi = new ListViewItem(); 	
            if (this.Logs.Count - 1 >= e.ItemIndex) 
            {
                lvi.Text = this.Logs[e.ItemIndex];
            }
            else
            lvi.Text = e.ItemIndex.ToString(); 		
       
            e.Item = lvi; 	
        }

Bis hier ist alles soweit ganz gut ... Aber das ListView wird nicht aktualisiert wenn sich Elemente in der Liste ändern.

Bis jetzt hatte ich zwei Ideen - die mir aber nicht gefallen ..

  1. Bei jedem Logeintrag das ListView aktualisieren. und die letzte Zeile anspringen.
  2. Über einen Timer jede x te Sekunde das ListView aktualisieren und an die letzte Zeile springen.

Aber wie schon geschrieben ... Beides ist irgendwie Muff. Variante 1 ist sehr CPU lastig und bei Variante 2 flackert das ListView jedes mal bei diesem Code:

            listView1.EnsureVisible(listView1.Items.Count - 1);
            listView1.Invalidate();

ListView.Update() bewirkt an der Stelle nichts.
Und ListView.Refresh() flackert auch.

Hat jemand evtl. eine Idee wie ich ein Log besser einbauen kann? Oder einen Tip wie ich das ListView besser in den Griff bekomme?

11.05.2012 - 09:10 Uhr

Moin !

Danke die den Linq Schnipsel. Funzt super.
Ich tue mich immer noch etwas schwer mit Linq. =)

Und vielen dank für den 101 Samples Link 👍
Der ist echt hilfreich !!

11.05.2012 - 07:46 Uhr

Moin !

Gleiche einträge habe ich rausbekommen:

var liste = DataStore.Select(o => o.Name).Distinct().ToList();

Aber die Summe habe ich noch nicht rausfinden können. 🤔

11.05.2012 - 03:37 Uhr

Moin !

Angenommen ich habe folgende Tabelle:

int | string | int
ID  | Name   | Alter
--------------------
1   | Hans   | 33
2   | Hans   | 25
3   | Werner | 22
4   | Udo    | 57
5   | Hans   | 43
6   | Werner | 29

Nun würde ich gerne über das EF folgendes ermitteln:

Hans   = 3
Udo    = 1
Werner = 2

Also die Anzahl der gleichen Einträge ermitteln.

Und als weitere Suche die gleichen Einträge nur einmal gelistet:

Hans
Udo
Werner

Geht das mit einem EF Query oder einem normalen SQL Query? 🤔

Ich habe es im SQL Management Studio schon mit Queries versucht. Habe das mit sum() bzw. count() probiert, aber bisher ohne Erfolg.

09.05.2012 - 12:26 Uhr

Moin !

Um das Thema abzuschließen ...
Hier gibt es eine Info von Microsoft wie man das lösen kann:
http://msdn.microsoft.com/en-us/library/bb907626.aspx

Danke für die Hilfe 🙂

08.05.2012 - 15:28 Uhr

Ok Danke für die Hinweise.
Damit sollte ich weiter kommen.

👍

08.05.2012 - 14:40 Uhr

Moin !

Genau 👍

Hätte da noch ein zwei Fragen ...

  1. Die Buttonspalte wird links eingefügt. Wie bekomme ich die nach rechts?
  2. Wie kriegt der Button raus zu welcher ID er gehört?
    Wenn der User den Button klickt muss ich ja im Event ermitteln zu welcher Zeile das Klick event nun gehört. Angenommen ich habe feolgende Tabelle:
ID | Text | <Button>
-------------------------
3  | a    | BUTTON
4  | b    | BUTTON
5  | c    | BUTTON

Wenn der User nun auf den zweiten Button klickt ... Wie komme ich dann auf die Tabellen ID 4 ?

08.05.2012 - 14:07 Uhr

Moin !

Ich habe ein SQL Datenbank die ich über das EF nutze. Im Moment erstelle ich noch eine ASP.NET Seite dazu um bestimmte Ansichten aus der Datenbank zu generieren.

In einer Ansicht (DataGrid) würde ich gerne 2 zusätzliche Spalten einfügen wo Buttons angezeigt werden. Über diese Buttons soll einmal eine Datei zum Download angeboten werden und zum anderen ein Logfile angezeigt werden.

Wie ich ein DataGrid mit dem EF verknüpfe ist mir klar, aber kann mir vielleicht jemand einen kleinen Hinweis geben wie ich zwei zusätzliche Spalten mit Buttons erzeugen kann?

Aussehen sollte es also später so hier hier:
http://imageshack.us/f/166/capturega6.jpg
Bloss eben mit zwei spalten Buttons ... 🤔

02.05.2012 - 12:59 Uhr

Moin !

Ich sehe im Moment 2 Varianten ...

Generell werde ich die Cam streamen und zwar so:
http://www.codeproject.com/Articles/202464/How-to-use-a-WebCam-in-C-with-the-NET-Framework-4

  1. In der Webseite dann ein ActiveX verwenden -> Mdeia Player
  2. Silverlight einbinden zur Videoanzeige

Denn das Bild muss schon einigermassen live sein. Muss das heute Abend daheim mal testen.

02.05.2012 - 06:50 Uhr

Moin !

Ok hier ein paar Details was ich vor habe ...
Gestern habe ich bei Ebay einen Roboter ersteigert. Der wird über einen Rechner gesteuert der auf dem Roboter mitfährt.
Nun würde ich dort gerne ein XP laufen lassen und einen IIS. Darauf eine ASP.NET Seite die ein paar Buttons zur Steuerung bereit stellt (vor, zurück, links, rechts, ....).
Nun hat der Bot eben auch eine Webcam und das Bild würde ich gerne auf der ASP.Net Seite sehen. Deswegen ist die Cam auf am Server und nicht am Client 🙂

Und nun stellt sich mir eben die Frage wie ich ein Livebild der Webcam in eine ASP.Net Seite einbauen kann.

02.05.2012 - 04:36 Uhr

Moin !

Ist es in ASP.Net möglich eine (USB) Kamera die am Server angeschlossen ist darzustellen?
Könnte man das evtl. mit dem aforge Projekt realisieren?

24.04.2012 - 15:32 Uhr

Ich denke ich habs gefunden ...

Man darf wohl nicht bei den Abfragen eine Methoide aufrufen.
Wenn ich die Guid die ich vergleich will vorher in eine Variable hole geht es:

Guid myguid = mod.GetIdentifier();
IQueryable<Modules> modTest =
acmDb.Modules.Where(d => d.Identifier == myguid);

8)

24.04.2012 - 15:16 Uhr

verwendetes Datenbanksystem: Microsoft SQL 2005

Moin !

Ich habe hier ein eher simpeles Query:

                    IQueryable<Modules> modTest = from d in acmDb.Modules
                                                  where d.Identifier == mod.GetIdentifier()
                                                  select d;

mod.GetIdentifier() liefert eine normale Guid zurück und d.Identifier ist in der Datenbank als uniqueidentifier eingestellt.

Wenn ich das Query nun abschicke dann bekomme ich folgenden Fehler:
"LINQ to Entities does not recognize the method 'System.Guid GetIdentifier()' method, and this method cannot be translated into a store expression."

Wie kann ich denn eine Abfrage per Linq erstellen die GUIDs nutzt?

Grüße

16.04.2012 - 17:53 Uhr

Und es geht sogar noch einfach ...

        private static Dictionary<States, KeyValuePair<States, IState>> WorkList;

🙂

16.04.2012 - 17:42 Uhr

Moin !

Ein Foreach würde nicht reichen.
Ich brauche die Option auch mal springen zu können.

Aber ich habe jetzt eine mögliche Lösung:

        public class Values
        {
            public States NextState { get; set; }

            public IState StatClass { get; set; }
        } 

Ich nutze die Klasse im Dictionary.

Damit geht dann folgendes:

private static Dictionary<States, Values> WorkList;

            WorkList = new Dictionary<States, Values>
                {
                    { States.Init, new Values { NextState = States.GetData, StatClass=new StateInit() }},  
                    { States.GetData, new Values { NextState = States.Finish, StatClass=new StateGetMail() }},  
                    { States.Finish, new Values { NextState = States.End, StatClass=new StateFinish() }},  
                    { States.End , null }
                };

Damit hätte ich eine Stelle zur Konfiguration und auch alles Infos die für den normalen Ablauf nötig sind. 🙂

16.04.2012 - 17:23 Uhr

Moin !

Danke für den Hinweis.
Ich habe jetzt ein Interface erstellt das die Stati dann implementieren müssen:

    public interface IState
    {
        string StateName();

        ReturnCode DoWork();
    }

Und in meiner Anwendung erstelle ich daraus (derzeit) ein Dictionary:

            WorkList = new Dictionary<States, IState>
                {
                    { States.Init, new StateInit() },
                    { States.GetData, new StateGetMail() },
                    { States.Finish, new StateFinish() },
                    { States.End, null }
                };

Zudem habe ich noch eine Variable die den aktuellen Status beinhaltet:

public static States curState = States.Init;

Jetzt stellt sich mir bloss noch die Frage wie ich die einzelnen Stati durchgehen kann. Ich hatte gehofft das Dictionary etwas wie "GetNext" besitzt. Aber dem ist nicht so.

Ich könnte nun natürlich in jeder Klasse die IState implementiert eine Property setzen mit "NextState". Aber da würde man schnell die Übersicht verlieren.
Cool wäre eine Art Dictionary von der Art Dict<Key, Value, Value>. 🙂

Hat jemand eine Idee wie man das machen könnte ?

16.04.2012 - 12:51 Uhr

Moin,

ich bin gerade dabei eine Anwendung zu schreiben die Mails von einem Server abholt, nach bestimmten Kriterien bearbeitet und daraus ein Ergebnis bildet.

Meine erste Idee dazu war ein Enum mit einer Switch Struktur:

            while (true)
            {
                switch (_state)
                {
                    case State.Init:
                        Init();
                        break;
                    case State.GetData:
                        GetData();
                        break;
                    case State.Compute:
                        Compute();
                        break;
                }
            }

        private static void Init()
        {
            SiAuto.Main.LogVerbose("Init the stuff");
            _state = State.GetData;
        }
...}

Die einzelnen Methoden setzen den Folge Status und die While Schleife läuft solange bis irgendwann die Kette beendet ist.

Ist das ein brauchbarer Ansatz oder kann man das eleganter lösen?
Ich habe übrigens später eine ganze Menge mehr an einzelnen Stati / Aktionen (ca. 30).

09.03.2012 - 11:31 Uhr

verwendetes Datenbanksystem: <XML>

Moin !

Ich bin gerade über diese Groovy Klasse gestolpert:
http://groovy.codehaus.org/api/groovy/util/XmlParser.html

Die Art und Weise wie dort ein XML gelesen werden kann finde ich ziemlich praktisch. Nämlich das die Node- & Attributnamen auch im Code direkt verwendet werden.

 def xml = '<root><one a1="uno!"/><two>Some text!</two></root>'
 def rootNode = new XmlParser().parseText(xml)
 assert rootNode.name() == 'root'
 assert rootNode.one[0].@a1 == 'uno!'
 assert rootNode.two.text() == 'Some text!'
 rootNode.children().each { assert it.name() in ['one','two'] }

Gibt es etwas vergleichbares für C# ?

23.02.2012 - 15:15 Uhr

Moin !

http://frickelblog.de/?p=772
Ich muss gestehen das kommt meinem Vorhaben schon ziemlich nahe 👅

Aber ein einfacher Datenaustausch zwischen IIS Exp. und der Anwendung ist dann nicht mehr machbar, oder? Da müsste ich dann einen z.B. Webservice nutzen?!

23.02.2012 - 14:47 Uhr

Moin !

Wenn ich sowas lese stellt sich mir die Frage: Warum?

Es geht darum aus einer Software die Logdaten erfasst ein paar Infos zur Verfügung zu stellen.

Praktisches Beispiel:
User hat loggenden Rechner im Keller und sitzt aber im Wohnzimmer. Über den Webserver kann er sich dann Statusinfos ansehen.

Klar kann man dafür einen IIS einsetzen, aber das macht es für viele einfach zu kompliziert. Darum die Idee einen ASP.net fähigen Webserver zu verwenden den ich in meine Anwendung einbinden kann. Dann muss der User nur einen Haken setzen (an aus) und ggf. noch eine IP wählen.

23.02.2012 - 14:35 Uhr

Hallo pdelvo,

cassinidev hatte ich auch schon gefunden. Aber da sehe ich zwei Probleme:
* kein Multithreading (wobei ich das noch verschmerzen könnte)
* Entwicklung scheint seit gut einem Jahr zu stehen X(

23.02.2012 - 14:28 Uhr

Moin !

Ich würde gerne in meine Anwendung (Console / WinForms) einen eigenen Webserver einbauen der auch ASP.net (.net 4) unterstützt.

Hätte dazu mal zwei Fragen ...

  1. Hat das schon mal jemand gemacht und kann ggf. ein paar Erfahrungen dazu posten - auch im Bezug auf die verwendete Webserver Komponente?
  2. Besteht dann eigentlich die Möglichkeit von ASP.net direkt auf Daten der Anwendung zuzugreifen (oder umgekehrt)? Oder muss ich dafür auf bekannte Mechanismen wie z.B. Webservices setzen?
06.01.2012 - 11:03 Uhr

Moin !

An der Bedeutung würd ich festmachen was du zum Element speicherst

Ok so wird es wohl am ehesten klappen.

Im Moment betrachte ich die "Bedeutung" des Nodes nicht. Ich speichere den Text und (bis dato) den Image Index des Trees.

Muss dann wohl meine Speicher und Laderoutine dahingehend anpassen.

Leider ist es wohl nach dem Zuweisen eines Image aus einer Resource nicht mehr möglich, auf den Resourcenamen zu schließen, oder? Im Debugger sieht man jedenfalls nach dem laden der Resource nur noch ein "normales" Image.

06.01.2012 - 09:31 Uhr

Moin !

Ich nutze ein Treeview für unsere Projektstruktur. jedes Element des Tree hat ein zugewiesenes Image welches als Resource eingebunden ist.

Nun speichere ich den Tree in eine XML Struktur ab. Nur wie kann ich jetzt einen Verweis auf das Resource-Image speichern? Denn wenn ich den Tree wieder einlese soll er natürlich wieder so aussehen wie zuvor.

Bis jetzt hatte ich meist Imagelisten. Dort konnte man einfach den Index abspeichern und gut wars. Nun nutze ich aber Resourcen und da ist es wohl nicht so einfach.

Man könnte zwar das Image selber mit in die XML Struktur speichern, aber das kann nicht der richtige Weg sein 👅

05.01.2012 - 17:18 Uhr

Moin !

Der Fehler wird im Codeeditor angezeigt.
Ein richtiger Fehler kommt weder beim Compilieren noch zur Laufzeit.

Der bei GetObject angegebene Name muss exakt mit dem übereinstimmen, der bei der Definition der Ressource verwendet wurde

Schon klar. Nur der VS Editor kann zu der Zeit ja noch nicht wissen welche Resource ich aus dem externen Assembly laden will - denn das Assembly ist zu der Zeit noch gar nicht bekannt. 🤔

Assembly.Namespace.Resourcename

Das könnte ich natürlich mal testen. Mal sehen was ich denn angezeigt bekomme.

05.01.2012 - 11:01 Uhr

Moin !

Ich habe hier ein Stückchen Code:

 Image Bildchen = null;

Assembly assi = Assembly.LoadFrom(devAssembly);
string[] resNames = assi.GetManifestResourceNames();
string resText = "";

foreach (string resName in resNames)
{
  if (resName.EndsWith(".resources";))
  {
    resText = resName.Replace(".resources", "";);
  }
}

if (resText != string.Empty)
{
  var rm = new ResourceManager(resText, assi); 
  Bildchen = (Image)rm.GetObject("LV_Icon";);
}

Damit möchte ich aus einer Class Lib ein Image laden - was auch ohne probleme klappt.

Allerdings sagt mir VS 2010 zu dem "LV_Icon" folgendes : "Cannot resolve resource item 'LV_Icon'". 🤔

Aber warum? Ich habe doch einen eigenen ResourceManager. Und zum Entwicklungszeitpunkt kann VS doch noch gar nicht wissen ob die Resource existent ist, oder nicht.
Beim Compilieren kommt dazu auch keine Warnung oder Fehler.

Hat da evtl. jemand eine Erklärung zu?

19.12.2011 - 07:45 Uhr

Moin !

Vielen Dank für die Infos.
Habe alles gefunden. 👍

16.12.2011 - 10:09 Uhr

Moin !

Gibt es eine Möglichkeit dem User einen brauchbaren Text zu liefern wenn eine Assembly fehlt?

Wir nutzen z.B. DotNetBar und wenn die zugehörige DLL fehlt, kriegt man nur eine Windows Fehlermeldung. Die ist aber eher unbrauchbar. Im Eventlog findet sich dann zwar ein Runtime Error mit FileNotFound, aber auch da steht nicht was nun genau fehlt.

Ist es deshalb möglich das der User eine Message angezeigt bekommt nach dem Motto "ERROR : Kein zugriff auf DevComponents.DotNetBar2.dll" ?

11.12.2011 - 08:06 Uhr

Moin !

Du kannst es auf jeden Fall von Hand in die Projektdatei schreiben, z.B. hier beschrieben:

Vielen Dank!

Genau so einen Trick habe ich gesucht. Funktioniert 1A 👍

10.12.2011 - 18:07 Uhr

Projekteinstellungen der Klassenbibliothek ein Programm angeben, das zum Debuggen gestartet wird.

Und das geht auch in der express Version?
Habe noch nichts gefunden in der Richtung.

10.12.2011 - 16:20 Uhr

Moin !

Ich haben eine EXE die ich in einer Class Library als Verweis eingebunden habe. Nun würde ich gerne die Class Lib debuggen.
Kann ich in VS 2010 Express (c#) irgendwo einstellen das er die referenzierte EXE mitstartet? Denn die Class Lib alleine kann ich nicht starten.

Die Exe liegt allerdings nicht als Projekt vor.

18.11.2011 - 10:26 Uhr

Moin !

In unserer Anwendung brauchen wir eine "Flow Engine". Als sowas hier:
Screenshot: shows the data flow generated by this Wizard
(Falls der Link nicht geht : An Introduction to SQL Server 2005 Integration Services -> Figure 4)

Nun sieht man auf dem Bild gerade Visual Studio ... Insofern wäre es denkbar das es von Microsoft eine solche Komonente schon gibt?
Weiss da jemand etwas zu?

Oder kann jemand eine ähnliche Komponente empfehlen?

14.11.2011 - 11:42 Uhr

Moin !

Ich muss einen Webservice benutzen der SSL verwendet. Und dafür muss ich ServerCertificateValidationCallback implementieren um das Serverzertifikat zu validieren.

Das Zertifikat gegen das ich prüfe liegt als Resource vor.

Mein ServerCertificateValidationCallback läd das Zertifikat gegen das ich validiere aus den Resourcen und erstellt daraus eine X509Certificate2 Instanz.

Jetzt ist mir aber nicht klar wie ich die Zertifikate die vom Server kommen mit meinem Zertifikat validiere?

Reicht es evtl. die SerialNumber oder den ThumbPrint auf Gleichheit zu überprüfen?
Oder gibt es da andere Techniken wie ich das Serverzertifikat validieren kann?

Im Grunde geht es bei der Frage darum ob schon mal jemand ServerCertificateValidationCallback wirklich ausprogrammiert hat und **nicht **dieses "Default" Konstrukt nimmt ...

ServicePointManager.ServerCertificateValidationCallback +=  
    delegate(  
        object sender,  
        X509Certificate certificate,  
        X509Chain chain,  
        SslPolicyErrors sslPolicyErrors)  
        {  
            return true;  
        };  
11.11.2011 - 10:58 Uhr

Moin !

Die Frage war, ob Du das mehrfach pro Zeile machst

Oh sorry hatte deine Antwort falsch gelesen.

Testweise habe ich es je 1x durchlaufen lassen in zwei Methoden (also in Summe pro Zeile 2x). Ich weiss das kann man auch zusammenfassen aber es ging mir auch eher drum zu verstehen warum da so viel Speicher genutzt wird.

Denn im Grunde könnte der GC ja nach jedem Split den genutzten Speicher wieder frei geben. Wird ja nie wieder genutzt. 🤔

11.11.2011 - 10:51 Uhr

Moin !

Heißt das, Du machst das mehrfach?

Bleibt mir wohl nichts anderes übrig wenn ich die einzelnen Werte jeder Zeile des CSV haben möchte, oder?

var ist hier unnötig - besserer Stil und lesbarer ist, den richtigen Typ anzugeben

var wird mir von StyleCop vorgeschlagen. Normal nutze ich auch immer die richtigen Typen. Aber das ist hier OT.

Wenn Du Dir schon Gedanken über Optimierung machst, dann besser diesen: Count() bei Arrays muss 1x durchzählen - deutlich besser ist .Length zu verwenden.

Gut zu wissen. Danke.

11.11.2011 - 10:32 Uhr

Moin !

Natürlich kannst du die Erzeugung der Objekte auch vermeiden und stattdessen direkt die Anzahl Trennzeichen in dem String zählen.

Das ist klar.

Dennoch brauche ich irgendwann ein Split um an die eizelnen Elemente einer CSV Zeile zu kommen.

Da die Objekte aber alle nur temporär benötigt werden, kann der GC sie abräumen, wenn der Speicher anderweitig benötigt wird, aber normalerweise auch wirklich erst dann.

Das bedeutet auch an der "Speicherlast" von 226MB ändert sich nicht wirklich was, oder?

Ich habe jetzt der Klasse mal zwei private Variablen gegeben:

        private string[] values1;
        private string[] values2;

Die nutze ich dann innerhalb der Methode.
nutzen tut es nur nix 🤔
Bedeutet dann wohl das sich Split bei jedem Aufruf neuen Speicher krallt, oder?