Doch, hatta
<add name="monitoringEntities" connectionString="metadata=res://*/DashboardModel.csdl|res://*/DashboardModel.ssdl|res://*/DashboardModel.msl;provider=System.Data.SqlClient;provider connection string="data source=LAGDBTEDMS;initial catalog=monitoring;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Nein, mit dem LivePlayer eben nicht während der Entwicklungsphase.
Microsoft believes its Live Player system is entirely compatible with Apple's rules and regulations for App Store apps. Behind the scenes, the Live Player includes an interpreter for .NET code. This means that running an app through Live Player is slower than it would be if natively built on a Mac, but that's not such a big deal for many aspects of user interface development.
Erst wenn die App veröffentlicht werden soll, dann ja.
Arbeitgeber: "Wie lange brauchst du für die und die Anforderung?"
Entwickler: "4 Stunden für die Implementierung und UnitTests."
Arbeitgeber: "Und nur für die Implementierung?"
5-6 Stunden
Also ich habe vor einiger Zeit eine Berechnung implementiert, deren Formeln (einige) auf 5 DIN-A4 Seiten standen (handschriftlich), die auch noch in sich verkrümmt und verkräuselt waren.
Ohne Unit-Tests hätte ich hierfür definitiv länger gebraucht.
Hmmm, ich mache mir eigentlich vor der Implementierung und vor den UnitTests darüber Gedanken, wie sich die Methode verhalten soll.
Diese Gedanken manifestiere ich dann in der XML-Dokumentation zu der Methode.
Dann schreibe ich die UnitTests, die sicherstellen, dass die Implementierung auch der Dokumentation folgen wird.
Dann implementiere ich die Methode.
Natürlich kommt es auch vor, dass ich erst mal drauf los implementiere, aber vor dem Unit-Test kommt bei mir immer die Dokumentation
Ich meine die haben den Zeitraum auf eine Woche verkürzt. Danach muss man das erneuern und die App wieder aufspielen.
Macht aber soweit nix, ist ja eh nur zum Entwickeln gedacht.
Ich glaube da hat man mich missverstanden.
UnitTests schreibe ich mindestens für das, was ich per XML-Dokumentation an die Methode geschrieben habe.
Und die Get-Methode soll null
zurückliefern, wenn etwas nicht gefunden wird.
Der entsprechende Test dazu stellt sicher, dass das auch so ist.
Und wenn das Argument id
null
ist oder gar keine Id darstellen kann, dann gibt es eine ArgumentNullException
bzw. ArgumentException
. Auch das dokumentiert man (logisch) im <exception>
Abschnitt und schreibt dazu auch UnitTests.
Die Dokumentation im Code-Abschnitt einer Methode selber ist in meinen Augen nicht relevant für den UnitTest.
Nein. Quellcode-Dokumentation ist wichtig, aber man sollte es nicht übertreiben.
Wenn man sich an ordentliche Namen hält "GetUserById" dann muss ich nicht kommentieren "hole User anhand der ID".
Das sehe ich genauso, für die grundsätzliche Beschreibung ist der Methodenname ausreichend.
class UserService
{
public User GetUserById( string id )
{ ... }
}
Hier sollte jeder wissen, was er erwarten kann, wenn ein gültiger Wert für id
übergeben wird.
Und wenn der Wert ungültig ist? Z.B. null
oder es gibt zu der id
keinen User? Was passiert dann? Gibt es eine Exception oder wird null
zurückgeliefert?
Das kann ich nicht aus dem Methodennamen ableiten und genau das gehört in die Beschreibung und genau dafür schreibt man dann UnitTests.
Mal eine ganz doofe Frage?
IMHO sieht man den grundsätzlichen Sinn und Mehrwert hinter dem ganzen DevOps nur dann, wenn man auch (zumindest) UnitTests hat, bzw. hat man UnitTests, dann wächst auch die Begehrlichkeit gegen diese beim Einchecken automatisch prüfen zu lassen. Ich brauche also ein Build-System. Wenn ich das dann habe, dann kann man ja auch noch Nightly-Builds mit weitergehenden Tests laufen lassen. Und dann ...
Es ist also ein sich selbst befruchtendes System, was aber an der Basis anfängt.
Wenn der Source aber nicht dokumentiert ist, kann man mMn eigentlich keine UnitTests schreiben, bzw. sieht nur das Offensichtliche und denkt sich, wieso soll ich dafür jetzt einen UnitTest schreiben, hab ich doch so programmiert.
Ich sehe die UnitTests als Bestätigung/Prüfung an, dass z.B. die Methode sich genau so verhält, wie ich in der Dokumentation derselbigen beschrieben habe. Wenn ich das aber nicht beschreibe, was und worauf soll ich dann testen?
Ist das der eigentliche Grund für die Ablehnung?
... und darüberhinaus:
Ein Code der kompiliert ist nur von der Syntax her richtig.
Wenn die UnitTests durchlaufen, dann ist der auch logisch richtig (wenigstens das, auf was man dort getestet hat).
Wenn die IntegrationTests/UITests durchlaufen, dann hat man wohl auch alles richtig verdrahtet (wenigstens das, auf was man dort getestet hat).
lässt sich leider nicht mehr editieren.
Halte ich für ein Gerücht. Einfach mal auf editieren
über deinem Beitrag klicken, dann tut das schon
Ja, editieren geht ganz vorzüglich
Erschwerend gibt es in unterschiedlichen Orten mit der gleichen PLZ auch noch gleichlautende Strassennamen nebst Hausnummern.
Um bei der Beispiel PLZ zu bleiben:
Hochwaldstrasse 5, 54497
Diese Adresse gibt es sowohl in Morbach als auch in Horath.
Fakt ist der Server über das das Webportal läuft und der fileServer haben keinerlei Netzwerkverbindung mehr zueinander.
Ähm, in dem Fall wird es unmöglich sein, dass diese beiden sich jemals unterhalten können.
Das widerspricht allerdings deiner Aussage im ersten Beitrag, wonach die beiden durch eine Firewall getrennt sind. Was bedeutet, dass es durchaus eine Netzwerkverbindung gibt, allerdings durch eine Firewall.
Die Datenbank (Typ, Struktur) ist eigentlich einer der letzten Schritte in der Entwicklung.
Deklariere Datenservices als Interface und entsprechende Model-Klassen. Baue darum deine Anwendung. Wenn dann alles steht, dann entscheide dich für eine Datenbank und lege die Struktur fest.
Woher soll denn der DataContext wissen, dass er diese Instanz in ziel
überwachen soll, wenn du diese Instanz selber erstellst ziel = new VDDArtikeldaten();
?
Riechen kann der noch nicht
Versuche es also mal mit einem dataContext.VDDArtikeldaten.InsertOnSubmit( ziel );
wenn du ein neues Ziel erzeugen musst und dann sollte sich beim ChangeSet auch etwas bei der Inserts Collection tun.
Weil ich mit dem Verfahren rund 2 Milliarden Dateien erzeuge die im Schnitt nicht größer als 4096 Bytes sind und somit (idR) einen Cluster auf der Festplatte belegt.
Bei 10 Milliarden Einträgen befinden sich im Schnitt 5 Einträge in jeder Datei.
Beim Lesen einer Url über die Id wird eine Datei gelesen und daraus eine Zeile zurückgeliefert.
Auch das Eintragen geht dadurch sehr schnell.
Natürlich kostet hashen Zeit, das Suchen nach einem Eintrag kostet aber auch Zeit.
Also das mit dem Datei-System ist auf jeden Fall sehr schnell.
Für die Bildung des Index würde ich einen Hash nehmen (auch wenn alle sagen, das ist langsam, die dürfen mir dann gerne eine wirklich schnellere Variante zeigen).
Also wir nehmen uns einen 32Bit Hashwert von der URL.
Aus der Hexdarstellung desselbigen bekommen wir den Pfad zu der Datei
05AAF367 => ./05/AA/F3/05AAF367.urls
Dadurch liegen in jedem Verzeichnis maximal 256 Einträge (Ordner bzw. Dateien)-
Datei öffnen und die Url mit den Einträgen in der Datei vergleichen.
Wenn vorhanden, dann den Zeilenindex merken, ansonsten anhängen, speichern und ebenfalls den Zeilenindex merken.
Die Id für die Url setzt sich nun aus dem Hashwert (32Bit) und dem Zeilenindex in der Datei (32Bit) zusammen und ergibt somit einen 64Bit Integer Wert.
Beim Lesen der Url über die Id trennt man diese wieder auf in Hashwert und Index, öffnet die Datei und liefert die Zeile am Index zurück.
Geht höllenschnell (trotz Hash) und ist im Prinzip von der Funktionsweise wie ein HashSet oder Dictionary, wo auch mit Buckets gearbeitet wird.
Beim Parallelisieren bekommt man nichts geschenkt, sondern muss auch mit einem höheren Verwaltungsaufwand (z.B. durch den TaskScheduler) zurechtkommen.
Als Verdeutlichung hier mal dein Code (lauffähig), wo ich die Zeiten in den parallelen Teilen messe.
Stopwatch total_time = new Stopwatch();
Stopwatch[] part_times = { new Stopwatch(), new Stopwatch(), new Stopwatch(), new Stopwatch(), };
double[] pi = { 0, 0, 0, 0 };
double n = Math.Pow( 10, 9 );
double res = 0;
total_time.Start();
System.Threading.Tasks.Parallel.For( 0, (int) n, new ParallelOptions { MaxDegreeOfParallelism = 4 }, ( i ) =>
{
int part_index = i % 4;
part_times[part_index].Start();
pi[part_index] += ( 4 / ( 1 + Math.Pow( ( i + 0.5 ) / n, 2 ) ) );
part_times[part_index].Stop();
} );
res = ( pi[0] + pi[1] + pi[2] + pi[3] ) / n;
total_time.Stop();
Console.WriteLine( "Pi = {0}. Die Berechnung hat {1}ms gedauert", res, total_time.ElapsedMilliseconds );
Console.WriteLine( "Dabei gingen {0}ms für den Verwaltungsaufwand drauf", total_time.ElapsedMilliseconds - part_times.Max( e => e.ElapsedMilliseconds ) );
Hier wird ein grosser Teil der Zeit mit Verwaltungsarbeit verplempert, weil die einzelnen Aufgabe zu klein ist.
(Auf meinem Rechner ca. 60.000ms gesamt und 45.000ms Verwaltung)
Zum Vergleich mal eine etwas abgewandelte Variante
Stopwatch total_time = new Stopwatch();
Stopwatch[] part_times = { new Stopwatch(), new Stopwatch(), new Stopwatch(), new Stopwatch(), };
double[] pi = { 0, 0, 0, 0 };
double n = Math.Pow( 10, 9 );
double res = 0;
total_time.Start();
System.Threading.Tasks.Parallel.For( 0, (int) 3, new ParallelOptions { MaxDegreeOfParallelism = 4 }, ( i ) =>
{
int part_index = i;
part_times[part_index].Start();
for ( int j = i; j < n; j+=4 )
{
pi[part_index] += ( 4 / ( 1 + Math.Pow( ( j + 0.5 ) / n, 2 ) ) );
}
part_times[part_index].Stop();
} );
res = ( pi[0] + pi[1] + pi[2] + pi[3] ) / n;
total_time.Stop();
Console.WriteLine( "Pi = {0}. Die Berechnung hat {1}ms gedauert", res, total_time.ElapsedMilliseconds );
Console.WriteLine( "Dabei gingen {0}ms für den Verwaltungsaufwand drauf", total_time.ElapsedMilliseconds - part_times.Max( e => e.ElapsedMilliseconds ) );
Hier komme ich auf eine Gesamtlaufzeit von ca. 18.500ms und einem Verwaltungsaufwand von 10ms
Das hier pi[Task.CurrentId.Value-1]
ist tödlich.
Welcher Task, und somit welche Id der Task hat, ist nicht vorhersehbar und wird (wie Abt schon angedeutet hat) vom TaskScheduler geregelt. Die Aufgabe könnte auch von einem Task mit der Id 42 oder 666 abgearbeitet werden.
Nur mal so ganz doof gefragt:
Sprechen wir hier über WinForms oder WPF?
Ist mir nicht ganz klar ...
Hast du die Dokumentation zu den Methoden gelesen?
Wenn ja, dann wäre deine Frage schon beantwortet
Warum möchte man an den ConnectionStrings auch was dranbasteln?
Ich würde in der Gruppe definieren, welche Verbindungen dazugehören (und eben nicht, welche Verbindung zu welcher Gruppe gehört)
BTW
Die Leute müssten sich also an dem Format richten, welches vorgegeben wird?
Ähm, ja ... immer ... egal welches Format ... wie soll man sonst die Bedeutung erkennen?
PS
Config-Dateien können liegen, wo sie wollen - nur muss man die dann explizit von der entsprechenden Stelle laden.
Als erstes würde ich es immer mit einer .config
Datei (XML) versuchen, denn da gibt es entsprechende Klassen um das zu lesen und vor allem kennt sich das schon mit diesen ConnectionStrings aus und kann auch bei Bedarf diese Bereiche verschlüsseln.
Ich wäre auf jeden Fall viel zu faul, mir da was eigenes auszudenken - nur wenn es sehr gut Gründe gibt (und das entsprechende Schmerzensgeld)
Ansonsten nimmst du eben irgendwas anderes wofür du einen Deserialsierer bekommen kannst: XML, JSON, etc.
Das Format dieser Config-Datei ist recht seltsam. Sieht aus wie ein kreativ (im negativen Sinne) interpretiertes Ini-Format. Wer gibt denn so etwas vor?
Da musst du dir wohl oder übel einen eigenen Parser schreiben, der das ausliest und in eine passende Struktur schreibt.
PS: Wenn ein DAU eine Gruppe auswählen soll, dann ist es für den einfacher, wenn es für die Gruppe einen aussagekräftigen Namen gibt anstatt 1 oder 2. Mit Produktion
, Testbetrieb
, Süddeutschland
käme ich auch besser klar, obwohl ich mich nicht zu dieser Gruppe zähle.
Man kann auch einfach auf die Nachricht hören, wenn die Maus bewegt wird. Da muss man nicht zyklisch die Position abfragen.
Wenn die Nachricht kommt, dann setzt man noch einen Timer, der sich dann um die Rückstellung (es bewegt sich nicht) kümmert.
Wie lautet denn das Create-Statement für die Tabelle?
Dann kann man sich mal einen Überblick verschaffen, was denn wie und in welcher Länge gespeichert werden soll.
Aus dem Bauch heraus würde ich allerdings sagen, dass hier die Uhren anders ticken als bei einem VARCHAR(22)
, denn ich vermute mal eher wir sprechen von einem VARCHAR(2000)
für die Url.
PS Wie schätzt du das Verhältnis zwischen Insert und Query ein? Also erfolgen mehr Abfragen als Eintragungen?
@weismat
Das Beispiel funktioniert so gar nicht und wenn, dann würde es ein int
liefern.
@hervibore
So eine Umstellung halte ich nicht für gut. Eine NullReferenceException
kann man sehr leicht lokalisieren (wo ist das denn aufgetreten). Ein seltsames Ergebnis eher nicht.
Darum finde ich das bewusste Verwenden eines Null-Conditional-Operator
s richtiger.
@thunder1902
Ich hatte da so eine Ahnung und nun auch die entsprechende Stelle gefunden, was beim Bildschirmschoner anders läuft:
Before a screensaver appears, Windows creates a new virtual desktop for it. The screensaver process is created on this second desktop, which is never locked. Any other processes that the screensaver creates will inherit this virtual desktop, unless the application switches back to the default desktop. To successfully switch back to the default desktop, certain access rights must be granted. If the switch fails, the workstation is most likely locked.
(Quelle: MSDN: Screensaver Sample)
Darum ist es erst einmal so schwer "über" dem Bildschirmschoner etwas zu zeigen, denn der befindet sich in einer anderen Ebene.
Wenn musst du in der Richtung weiter suchen.
@Stefan.Haegele
Es geht sich wohl um Folgendes
Alarmierungssoftware - Funktionsweise
Und die visuelle Benachrichtigung soll auch dort erfolgen, wo der Bildschirmschoner aktiv ist.
Es ist unerheblich, ob dort einer gerade am Rechner aktiv am Arbeiten ist oder nicht. Schaltet sich der Bildschirm ein oder zeigt plötzlich ein anderes Bild, dann steigt die Wahrscheinlichkeit der Wahrnehmung, selbst wenn eine Person dieses nur im Augenwinkel mitbekommen kann.
Der einfachste und schnellste Weg ist das Erstellen einer neuen ObservableCollection.
Du kannst den Abgleich auf einer Kopie der sqlite Datenbank machen. Ist der Abgleich erfolgreich, dann das Original mit der Kopie austauschen.
Alternativ würde auch eine Transaction auf der sqlite Datenbank gehen, die vor dem Abgleich gestartet und beim Abschluss dann geschlossen wird.
Nur so am Rande bemerkt:
Kennst du schon File.ChangeExtension
?
BindingProxy
👍
Das ContextMenu
würde ich aber nicht über das ItemTemplate
definieren, sondern über den ItemContainerStyle
.
Zudem würde ich dem Command auch das aktuelle Element als Parameter übergeben, dann ist es auch eindeutig, welches Element entfert werden soll.
Sieht dann so aus
<ComboBox ItemsSource="{Binding Items}">
<ComboBox.Resources>
<c:BindingProxy x:Key="DataContext" Data="{Binding}"/>
</ComboBox.Resources>
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem
Header="Item entfernen"
Command="{Binding Source={StaticResource DataContext}, Path=Data.ItemEntfernenCommand}"
CommandParameter="{Binding}"/>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
und im ViewModel
public class MainViewModel : Utils.ObservableObject
{
public MainViewModel()
{
Items = new ObservableCollection<string>(new List<string> { "123", "456", "789" });
ItemEntfernenCommand = new Utils.RelayCommand(ItemEntfernenCommandExecute);
}
private void ItemEntfernenCommandExecute(object obj)
{
var value = (string)obj;
Items.Remove(value);
}
ObservableCollection<string> _items;
ICommand _itemEntfernenCommand;
public ObservableCollection<string> Items
{
get { return _items; }
set { Set(ref _items, value); }
}
public ICommand ItemEntfernenCommand
{
get { return _itemEntfernenCommand; }
set { Set(ref _itemEntfernenCommand, value); }
}
}
Hast du dir den Source angeschaut?
Wenn ich das Statement ohne syntaktischen Fehler ausführe, kann ich das nicht nachvollziehen
@MrSparkle
Dann probiere es doch mit einem kleinen Beispiel aus.
class VM : ViewModelBase // <= GalaSoft.MvvmLight
{
string _content;
public string Content
{
get { return _content; }
set
{
var newValue = value;
if ( newValue == "A" )
newValue = "B";
Set( ref _content, newValue );
}
}
Binde die Content
Eigenschaft in der View an ComboBox.Text
, starte die Anwendung und schreibe in die ComboBox
ein A
.
Was erwartest du, was beobachtest du?
Warum eigentlich nicht? Das ViewModel wäre meines Erachtens der richtige Ort dafür, da es sich hierbei um die Logik der GUI handelt.
Ja, wäre schön, geht aber nicht einfach so ...
Wurde in dem anderen Thread schon beschrieben mit dem "Warum ist das so?" sowie Lösungen wie es dann doch geht (Asynchron, AttachedProperty).
Dann frag dich doch mal, wie dieses PreviewText Ereignis abgebrochen wird/wurde.
Genau so geht das auch bei SelectionChanged
Wenn du irgendetwas nicht verstehst, dann solltest du auch regen Gebrauch von der Dokumentation machen.
@pinki
Das gleiche Problem wie bei MVVM (Visual Basic) - Combobox aktualisiert sich nicht?
Kann auch genauso gelöst wie dort beschrieben.
Google Maps haben da ein ähnlich gelagertes Problem und die lösen das mit Kacheln
Und warum das mit Assembly.LoadFrom
funktioniert ist sogar dokumentiert
If an assembly with the same identity is already loaded, LoadFrom returns the loaded assembly even if a different path was specified.
Was macht Assembly.Load
anders?
Note that this method overload always creates a new Assembly object with its own mapping.
Deine ComboBoxTry Klasse ist falsch.
Du musst dich am Event ComboBox.PreviewTextInput
registrieren/abmelden und zwar immer dann, wenn sich die AttachedProperty ändert.
Pseudo-Code
OldValue == null && NewValue != null => Subscribe event
OldValue != null && NewValue == null => Unsubscribe event
Du hängst dich an den Event, wenn in ComboBox.Text
ein D
steht.
Steht da also kein D
warum denkst du sollte dort etwas passieren?
Eine Suche bei Tante G nach c# to vb.net
ergibt als ersten Treffer
Ob es die nur von Adobe gibt kann ich nicht sagen. Vermuten würde ich aber eher ja 😉
Nein 😁
Was konkret bekommst du denn nicht hin?
Du hast nur das ViewModel geändert, dann hätte im Quote auch nur das ViewModel gereicht. So sieht man den Wald vor lauter Bäumen nicht.
Und wenn man etwas ändert, dann ist es auch kein Zitat (Quote) mehr.
Meinst du LCP (Lens Correction Profile)?
Das kommt meines Wissens nach von Adobe
@_Cashisclay
Also bei meinem Beispiel passiert eigentlich genau das was du mMn gewünscht hast:
Tippt man in die ComboBox A
ein dann erscheint dort ein B
.
FullQuotes sind hier nicht gern gesehen, weil sie auch keinen wirklichen Sinn ergeben
Ich bin natürlich davon ausgegangen, dass du immer noch das erreichen möchtest:
ich versuche eine Combobox Eingabe zu verändern
Und genau da setze ich an: Bei der Eingabe in der ComboBox.
Wenn dem nicht mehr so ist, dann musst du das nochmal genauer spezifizieren.
Eine mobile App sollte sich niemals direkt mit einer externen Datenbank verbinden. Darum gibt es das Problem dieser Art dort gar nicht.
Eine versionierte WebApi stellt die Funktionen auch für die alten Clients zur Verfügung.
Im Setter hatte ich es schon versucht und eben auch noch einmal .. hatte auch nicht funktioniert.
Das kommt mir seltsam vor...
Probier es einfach mal aus