Laden...
Avatar #avatar-3206.png
Benutzerbeschreibung
„Morgen ist noch nicht gekommen, und gestern ist vorbei. Wir leben heute.”

Forenbeiträge von malignate Ingesamt 742 Beiträge

06.12.2013 - 09:12 Uhr

Ohne Details zu kennen, kann man glaube ich kaum eine perfekte Antwort geben, aber hier ein paar Ideen, vll. passt ja eine davon.

  1. Hinterfragen, warum du gleichzeitig 100.000 Einträge brauchst
  2. Die Transformation in der Anwendung machen.
  3. Alle dynamischen Attribute als serialisiertes XML, JSON, BSON, Binär etc. in eine Spalte kodieren und Transformation in der Anwendung durchführen.
  4. Eien Datenbank verwenden, die dynamischere Strutkuren zulässt, z.B. MongoDB
04.12.2013 - 09:15 Uhr

Du kannst doch auch einfach eine interne Queue verwenden und alle Requests zu dieser Komponente Single-Threaded abarbeiten:

Beispielweise mit der TPL und einem eigenen Scheduler: http://msdn.microsoft.com/en-us/library/ee789351%28v=vs.110%29.aspx

Falls du für jeden Request auf die Komponente zugreift hast du aber ein Problem, das skaliert dann praktisch gar nicht, aber wenn du wenig Benutzer hast oder die Komponente selten brauchst, sollte das schon passen.

04.12.2013 - 09:08 Uhr

Du hast im prinzip 3 DLLs:

  1. Shared/Common - wie auch immer du das nennen willst.
    Hier liegen nur Interfaces von Komponenten, die das Plugin verwenden darf. Dazu Typen für die Plugin-Entwiclung und Datenbank-Objekte.

public interface IProductRepository
{
   List<Product> QueryAll();
}

public class Product {}

public interface IPlugin
{
   void Setup(IPluginContext context);
}

public interface IPluginContext
{
    T GetService<T>();
}

  1. Die Hauptanwendung:
    In der Hauptanwendung wird das Product-Interface implementiert, das kann natürlich auch in eine extra Assembly ausgelagert werden. Außerdem gibt es hier eine Implementierung des IPluginContext-Interfaces. das alle implementierten Komponenten/Repositories zurückliefern kann auf die das Plugin mit dem jeweiligen Interface zugreifen kann.

  2. Das Plugin
    Kennt nur die Interfaces und holt sich über GetService eine Komponente, z.B. das Repository und kann hier ganze normale Methoden ausführen. Events etc. sind im Prinzip gar nicht nötig.

Zu Repositories: Repositories sind super, wenn du alle Tabellen kennst. Soll ein Plugin neue Tabellen selbstständig hinzufügen können (was wohl in 95% der CMS-Lösungen z.B. so ist) musst du dir eben eine andere Komponente überlegen, das kann aber auch kombiniert werden indem z.B. teilweise Repositories bereitgestellt werden oder auch ein IDbConnectionManager für flexibleren Zugriff auf die Datenbank.

12.11.2013 - 11:51 Uhr

Ich werde noch eine dritte Alternative in den Raum: ServiceStack ServiceStack vs ASP.Net Web API

WCF ist relativ schwergewichtig und der "Wechsel" von SOAP auf Http-APIs funktioniert nur bedingt. Dazu gibts aber massig Artikel im Internet, z.B:

WCF or ASP.NET Web APIs? My two cents on the subject

12.11.2013 - 00:14 Uhr

Du könnstest einfach selbst nach Assemblies suchen und diese laden, das sieht dann ungefähr so aus:


interface IUnityRegistrator
{
  void Register(IUnityContainer container); 
}

foreach (string file in Directory.GetFiles("plugins"))
{
   Assembly assembly = Assembly.LoadFile(file);

   Type registratorType = assembly.GetType().Where(x => x.GetInterfaces().Contains(typeof(IUnityRegistrator)).SingleOrDefault();

   if (registratorType != null) 
   {
      IUnityRegistrator reg = (IUnityRegistrator)Activator.CreateInstance(registratorType);

    req.Register(unityContainer);
   }
}

Ich hoffe, das ist selbsterklärend

11.11.2013 - 07:56 Uhr

Dein String sieht mir jetzt nicht unbedingt nach einem Byte aus, das wäre alles zwischen "0" und "7", was du wahrscheinlich suchst ist die Konvertierung eines Strings in ein Byte-Array:


byte[] bytes = Encoding.Default.GetString(myString);

Die Encoding-Klasse liegt glaube ich im Namespace System.Text

10.11.2013 - 16:26 Uhr

Wüsste ich auch gerne. Meines Wissens nach sind Generics eher schneller, weil auf Boxing/Unboxing verzichtet werden kann. In vielen Fällen kann man aber natürlich für ein spezielles Problem immer eine performantere Lösung finden, aber man sollte sich nicht dazu verleiten lassen, Kleinkram zu optimieren. Das lohnt sich meistens nicht, verursacht mehr Code und potentielle Fehler und machen oft auch den Code schwerer zu warten.

Btw: Wo wir gerade bei Performance sind: In machen Fällen kann man anstatt Reflection sich auch zur Initialisierungszeit schnelle Zugriffsklassen automatisch generieren lassen und laden. Das wird beispielweise vom XmlSerializer und auch von ORM-Mappern gemacht. Das ist wirklich sehr schnell und relativ elegant, wie ich finde.

10.11.2013 - 15:19 Uhr

Das ist jetzt bald Offtopic, aber das stimmt so nicht. Dictionaries verwenden EqualityComparer und die bauen auf Equals auf.

http://msdn.microsoft.com/en-us/library/ms224763%28v=vs.110%29.aspx

Ist Equals NICHT überschrieben, wird ein Referenzvergleich dürchgeführt. Das ist aber bei Tuple nicht der Fall und bei einer UserId auch nicht. Das ist mehr oder weniger auch die gleiche Implementierung wie HashSet.

Mehr oder wengier ist Dictionary<User, User> in der Größenordnung gleich performant wie HashSet<User>() (mit dem gleichen Equality-Comparer).


Dictionary<Tuple<string, int>, int> dictionary = new Dictionary<Tuple<string, int>, int>();

dictionary.Add(new Tuple<string,int>("Test", 1), 2);

Console.WriteLine(dictionary.ContainsKey(new Tuple<string, int>("Test", 1)));
Console.WriteLine(dictionary.ContainsKey(new Tuple<string, int>("Test", 1)));

10.11.2013 - 14:48 Uhr

Das du überhaupt keinen eindeutigen Key bilden kannst ist wohl die absolute Ausnahme. IN 99,9% der Fälle gibt es eine eindeutige ID oder eine Kombination, die sich nicht ändert.

Bei einem Feld ist die Verwendung eines Dictionaries trivial, man kann in diesem Fall einfach die Id direkt als Key verwenden


Dictionary<Guid, User> usersCache = new Dictionary<Guid, User>();

Falls es mehrere Ids gibt, kann man zusammengesetze Ids verwenden, z.B. Tuple


Dictionary<Tuple<string, int>, User> usersCache = new Dictionary<Tuple<string, int>();

Oder man schreibt einen eigenen Key und implementiert Equals und GetHashCode;


Dictionar<UserId, User> usersCache = new Dictionar<UserId, User>();

Im Fall von normalen Cache-Implementierungen, die üblicherweise Strings verwenden, ist der Ansatz analog, man muss halt den String selber zusammensetzen. Aus Erfahrung würde ich jetzt die These aufstellen, dass Dictionaries und normale Caches nahezu immer funktionieren. Die Ausnahmen müssen dann konkret diskutiert werden. Reflection kommt hier gar nicht zum Einsatz.

10.11.2013 - 10:52 Uhr

Eine Liste ist keine besonders clevere Idee. Wenn du viele Einträge im Cache hast, killt das deine Performance. Damit meine ich nicht, dass es ein bisschen langsamer wird, sondern dass evtl. 30% der Zeit damit draufgeht nur deine Liste zu durchsuchen.

Ich würde die folgende Alternativen in absteigender Reihenfolge empfehlen:

  1. Schaue, ob es für dein ORM Mapper (falls du einen verwendest) eine Level 2-Cache Implementierung gibt. Gibt es afaik für NHibernate und EF, für andere weiß ich es nicht.

  2. Benutze die Caching Klassen aus der Enterprise Library.

  3. Verwende Reflector und kopiere dir ConcurrentDictionary aus .NET 4.0 Assemblies raus.

  4. Erstelle einen eigenene Cache. Verwende mehrere Dictionaries und teile die Daten auf die Dictionaries auf, z.B. int dictionaryIndex = key.GetHashCode() % 10. Die Folge: Weniger Warten durch Locks.

  5. Verwende Dictionaries mit Locking.

10.10.2013 - 17:04 Uhr

Am schnellsten dürfte sowas sein:



public string Replace(string in) 
{
    var sb = new StringBuilder();

   foreach (char c in in)
   {
       if (c == 'SpecialChar') {
          sb.Append('A');
       } else if (c == ) {
       } else {
          sb.Append(c);
       }
   }

   return sb.ToString();
}

10.10.2013 - 09:46 Uhr

Für die Worker zahlt man die begonnenen Stunden. Das ist im Prinzip die kleinste Kosteneinheit. Wenn man sagen wir mal 10 Web-Worker hat, muss man natürlich noch Arbeit investieren um davon 9 Nachts abzuschalten, bzw. man braucht ausgefeilte Regeln, welche die Worker hoch und runterfahren. Leider hat man da auch eine gewisse Latenz, so dass das ganze nicht so besonders dynamisch ist.

Wenn also eure Seite plötzlich ohne Voranmeldung in der Tagesschau erwähnt werden würde, kann man eigentlich nur noch zuschauen, wie sie unbenutzbar wird.

Die Kostenreduktion kommt dann zustande, wenn du wirklich viel Power brauchst und da macht es schon enorm was aus, z.B. Nachts dreiviertel herunterfahren zu können.

Ich finde das Konzept super, die Kosten für die Instanzen sind aber unverschämt. Ein "Root"-Server mit 6 vCores kostet bei Host-Europe 80 €, im Vergleich dazu komme ich bei Azure auf

2x67 $ = 124 (brauche die Server die ganze Zeit)
4x40 $ = 160 (brauche 2/3 nur zur Hochzeiten)

= 284 $, dann kommt da noch Traffic dabei (15$), bisschen Storage(15$) und ServiceBus (da ich SignalR verwende) (50$) und ann sind wird schon bei

364$ = 270 €, das steht in keinem Verhältnis

09.10.2013 - 15:29 Uhr

@Diräkt: Wenn du mehrere SQL-DBs hast, wirst du wohl keine Probleme bekommen. SQL-Azure ist aber nicht besonders schnell, damit musst du rechnen. Ich weiß aber nicht genau wieviel da an Netzwerk-Latenz drin ist.

Würde mich mal interessieren, wie jemand mit vielen Root-Servern kalkuliert hat, wie z.B. Administration in die Kosten eingeflossen ist. Im Vergleich dazu sind Root-Server ja billig.

08.10.2013 - 11:01 Uhr

Ich habe als Bizspark-Nutzer mal Azure für eine Webseite mit 2 Instanzen verwendet und hatte dabei dann folgende Probleme:

  1. Als 2 Instanzen nicht mehr ausreichten, hätte ich dann zahlen müssen und da hätte die dritte Instanz fast genausoviel gekostet wie ein Root-Server, der mehr als 3 Instanzen kann.

  2. Skalierung: Mann kann SQL-Server leider nicht hochskalieren. Oft waren bei hoher Last die DB ein Problem. Mann hätte vll. die DB zum Lesen duplizieren können, aber damit habe ich keine Erfahrung. Es war erschreckend wie schnell man SQL-Azure an die Grenzen bringt.

  3. Bei der Anwendung geht es um Busliniensuche.de, ca. 500k Besuche pro Monat. Der Root-Server für 70€ dümpelt meistens bei 30% rum. Bei Azure müsste ich um auch ein bisschen Puffer zu haben gut 200€ zahlen ohne Bizspark. Peaks sind leider nicht vorhersehbar (z.B. irgendein Bericht im Fernsehen - gabs schon ein paar Mal) und schnell wieder vorbei. So schnell kann man gar keine Instanzen hochfahren.

  4. Mit SignalR muss man Azure Service Bus verwenden. Das ist eine echt teure Sache.

Ich würde nur wieder zu Azure gehen, wenn ich hohe Einnahmen pro User habe (z.B. 10€/Monat für SaaS) dann kann man glaube ich relativ schnell skalieren.

28.08.2013 - 23:20 Uhr

Erstelle eine neue Internet-Anwendung mit MVC4, darin Forms Authentication inkl. Facebook und Twitter Login enthalten.

28.08.2013 - 17:42 Uhr

Das sollte auch manuell relativ einfach gehen, z.B. mit diesem Projekt: http://htmlagilitypack.codeplex.com/.

Einfach alle script und images und style-tags durchgehen und links verfolgen, runterladen und vor dem abspeichern ändern. Dann für alle css dateien nach resourcen url(..) schauen und das gleiche spiel nochmal.

28.08.2013 - 16:32 Uhr

Einfach richtige Culture setzen: http://msdn.microsoft.com/en-us/library/bz9tc508.ASPX.

Wenn eh nur Deutsch, dann halt de-DE, sonst musst du die Culture pro Request manuell setzen.

21.08.2013 - 18:19 Uhr

Luftlinie oder Weglinie? Bei Luftlinie kannst du alternativ ein Quadtree oder so aufbauen, falls es sehr viele Knoten sind.

Bei der Weglinie wirst du wohl eine Tiefensuche machen müssen. Wichtig dabei, dass du Zyklen ignoriert.

20.08.2013 - 20:47 Uhr

Du kannst auch ImageResizer http://imageresizing.net/ verwenden. Das ist im Prinzip ein Http-Handler für IIS, der Bilder vor dem Ausliefern in die angefragt Größe skaliert und bei Bedarf cached (das ist dann kostenpflichtig).

Anstatt der direkten URL hängst du in deiner App einfach noch die passende Größe per Query-String and die URL http://imageresizing.net/docs/basics

13.08.2013 - 16:50 Uhr

Hi Nurci,

Ich darf leider kein MVVM benutzen, was ich sehr gern getan hätte

Das mußt du mal näher erklären! Wer sollte denn soetwas verbieten und warum? Wie sollte man sonst vernünftige Anwendungen mit WPF entwickeln?

Christian

Die Naivität der glücklichen, die nur in normalen Firmen gearbeitet haben. 😉

12.08.2013 - 22:13 Uhr

Danke für die Tipps, habe mich auch mal drangemacht und mit T4 geht das echt sehr gut und einfach. Im Prinzip geht die V0.1 schon.

@Notation: Stimmt, habe auch schon mehrere "Sprachen" geschrieben, allerdings mit Grammatica. Müsste mir da mal was einfaches überlegen. Das tolle an XML ist halt, dass man mit der XSD zumindest schon mal intellisense usw. hat.

@Kopplung: Natürlich ist die Datenstruktur und Use-Cases prinzipiell getrennt. Aber im Prinzip sind die DTOs von den Datenstruktur abhängig in dem Sinne, dass Sie oft geändert werden, wenn auch die Datenstruktur geändert werden. Deshalb habe ich das in eine Definition gepackt, um eine einfache Konsistenz zu haben.

Ich hätte auch noch gerne custom types, also so Art Templates für Felder, z.B.

E-Mail:
Name: Mail, Regex: ... usw., MinLength ...

Telefonnummer:
Name: PhoneNumber, Regex: ...,

Da kann man noch viel machen und ich denke letztendlich sparrt man sich wirklich eine Menge arbeit, insbesondere weil man wirklich sehr schnell Ergebnisse mit T4 realisieren kann.

12.08.2013 - 18:36 Uhr

Hallo zusammen,

ich bin in letzter Zeit viele mit Web-Projekten oder Services beschäftigt und habe dort eigentlich immer die Situation, dass ich zum Teil Unmengen an Entitäten auf Seiten der Data-Mapper (z.B. Entity-Framework oder Mongo) erstellen muss und dazu außerdem noch Unmengen an DTOs für die Services.

Nehmen wir Beispielsweise Benutzer (User), dann habe ich meistens noch folgende DTOs:

UserReadShortDTO (Zusammenfassung für Listen, z.B. Service /users
UserReadDetailDTO (Detailinformationen, z.B. Service /users/123)
UserCreateDTO (Erstellen eines Benutzers)
UserEditDTO (Aktualisieren eines Benutzer)

Das ist viel langweilige Arbeit, besonders, wenn Änderungen vorhanden sind und wenn das ganze noch mit Attributen annotiert werden soll oder dokumentiert wird.

Deshalb die Idee, hier Code Generierung zu verwenden, z.B. über eine XML-Definition


<Entity Name="User">
   <Schema>
       <Field Name="Id" type="Int" Description="Die ID" />
       <Field Name="Username" type="string" required="true" />
       <Field Name="Password" type="string" required="true" />
       <Field Name="Mail" type="string" required="true" />
    </Schema>
    <Models>
       <Model Name="UserReadShortDTO"> <!-- Zeige nur Mail in der Übersicht -->
           <UseField Name="Mail" />
           <UseField Name="Id" />
       </Model>
       <Model Name="UserReadDetailDTO">
           <UseField Name="Username" />
           <UseField Name="Mail" />
       </Model>
       <Model Name="UserCreateDto">
           <UseField Name="Username" />
           <UseField Name="Mail" />
           <UseField Name="Password" Mapper="PasswordEncryptor" />
           <AdditionalField Name="PasswordRepeat" CompareWith="Password" />
       </Model>
       <Model Name="UserEditDTO"> <!-- Mail und Username nicht änderbar -->
           <UseField Name="Password" Mapper="PasswordEncryptor" />
           <AdditionalField Name="PasswordRepeat" CompareWith="Password" />
       </Model>
    </Models>
</Entity>

Daraus könnte man dann Entities, DTO's und Mapper (evtl. einfach mit AutoMapper) generieren lassen. Property Definitions werden dabei über UseField von der Entität übernommen.

Evtl. auch mit mehr Möglichkeiten, z.B. abweichende Entitäten für UseField usw. anzugeben.

Hat jemand schon Erfahrung mit Code-Generierung gemacht? Welche Frameworks und Tools kennt ihr? was haltet Ihr von der Idee? Wo seht ihr Probleme?

Würde mich über eine Diskussion zu dem Thema freuen.

26.07.2013 - 10:45 Uhr

Das kommt auf deine Architektur an. Anfangen würde ich damit, den Zugriff auf die Daten (Files, SQL, etc.) über Repository Patterns zu wrappen The Repository Pattern Example in C#

Dann hast du die Möglichkeit in den Plugins relativ einfach Daten zu lesen und zu schreiben, ohne dass du dich um die Details kümmern musst.

Natürlich musst du den Plugins die Repositories übergeben, dafür bietet sich Dependency Injection an Dependency Injection: A Beginner’s Guide

Im Prinzip bietet deine Anwendung dann Dienste an, wie zum Beispiel die Repsositories oder irgendwelche "Manager", die dann von den Plugins angefordert und verwendet werden.

Wenn deine Plugins sehr eigentständig sind, wie zum Beispiel in einem Weblog, dann sollten sie natürlich auf komplett selbst für die Datenverwaltung inklusive Anlegung von Tabellen etc. verantwortlich sein. Bzw. es ist auch möglich beides zu kombinieren.

24.07.2013 - 16:31 Uhr

Ich glaube das Problem liegt an dem PartialView, afaik gehen geschachtelte Klassen schon.

Der ModelBinder erwartet für die geschachtelten Klassen bei Binding über den Body z.B. den Key "Address.Street". Wenn du dein View ohne PartialView erstellst, z.B.


@Html.TextBoxFor(x => x.Address.Street)

bekommt das input-Element den Namen "Address.Street" und alles passt. Wegen dem PartialView entfällt aber der Prefix.

Das gleiche problem ist auch hier geschildert: http://thatextramile.be/blog/2011/01/prefixing-input-elements-of-partial-views-with-asp-net-mvc/

Lösungen:
ENTWEDER
a) Keine Partial Views verwenden
ODER
b) Eigener Helper bei dem explizit Prefix (hier "Address") angegeben werden kann.

TIPP: Wenn du auch keine Lust auf Mapping-Code (z.b. Konvertierung Model->DB-Entity) dann schau dir AutoMapper an (https://github.com/AutoMapper/AutoMapper)

24.07.2013 - 08:55 Uhr

Im übrigen kann ich mir auch gut vorstellen, dass es aufgrund der Fragementierung des Speichers gar nicht möglich ist, ein so großes Array am Stück zu allokieren.

Mal dahingestellt, dass du es wirklich brauchst, würde ich dir schon dafür zu vielen kleinen Arrays raten. Also 10MB Blöcke oder so. Wenn du das geschickt machst, kannst du auch was schreiben, um das auf die Platte zu bringen und mit weniger Speicher auskommen.

sowas wie:



byte[] Get(long position)
{
    long pageNumber = position / pageSize;

    var page = lruCache[pageNumber ];
    if (page == null)
    {
        page = ReadFromFS(pageNumber );
    
        var replaced = lruCache.Set(pageNumber, page);
        
        if (replaced != null && replaced.PageNumber != pageNumber && replaced.HasChanged)
        {
             WriteToFS(replaced);
        }
    }

    return page.Get(position - page * pageNumber );
}

17.07.2013 - 23:38 Uhr

Die If-Abfrage kostet doch nix, zumindest im Vergleich zu dem lock. Deshalb solltest du zweimal checken:


if (!IsEnabled)
{
   lock (lockObject)
   {
      if (!IsEnabled)
      {
         // Do something

         IsEnabled = true;
      }
   }
}

BTW: Die Namensbezeichnung und Überprüfung auf false ist eigenartig, würde das doch eher bennenen:

  • canDoX
  • isXAllowed
  • isYAvailable

o.ä.

04.07.2013 - 09:13 Uhr

Das ist einfach die Klasse, in der die Extension Methode ist. Freut mich, dass es funktioniert 😃

03.07.2013 - 09:41 Uhr

Hallo Kaffeebohne,

hier ist mein ganzer Code, ich hoffe, das erklärt es:


        private static string currentAssemblyVersion;

        public static string StaticContent(this UrlHelper urlHelper, string file)
        {
                StringBuilder pathBuilder = new StringBuilder();
#if RELEASE
                pathBuilder.Append("//[YOUR_PATH_TO_CDN]/");
#else       
                pathBuilder.Append(VirtualPathUtility.ToAbsolute("~/"));
#endif

#if RELEASE
                if (file.EndsWith(".css", StringComparison.OrdinalIgnoreCase) && !file.EndsWith(".min.css", StringComparison.OrdinalIgnoreCase))
                {
                    file = file.Replace(".css", ".min.css");
                }

                if (file.EndsWith(".js", StringComparison.OrdinalIgnoreCase) && !file.EndsWith(".min.js", StringComparison.OrdinalIgnoreCase))
                {
                    file = file.Replace(".js", ".min.js");
                }
#endif
                pathBuilder.Append(file.TrimStart('/'));

                if (file.EndsWith(".css", StringComparison.OrdinalIgnoreCase) || file.EndsWith(".js", StringComparison.OrdinalIgnoreCase))
                {
                    pathBuilder.Append("?v=");
                    pathBuilder.Append(urlHelper.Version());
                }

                return pathBuilder.ToString();
        }

public static string Version(this UrlHelper urlHelper)
        {
            if (currentAssemblyVersion == null)
            {
                currentAssemblyVersion = Assembly.GetAssembly(typeof(DomainUrlExtensions)).GetName().Version.ToString();
                currentAssemblyVersion = currentAssemblyVersion.Replace(".", string.Empty);
            }

            return currentAssemblyVersion;
        }

Die Verwendung ist trivial:


<link href="@Url.StaticContent("Styles/styles.css")" rel="stylesheet" />

Raus kommt im Debug Modus:

<link href="/myApp/styles/styles.css?v=1001" rel="stylesheet" />

und im Release halt

<link href="//[YOUR_PATH_TO_CDN]v=1001" rel="stylesheet" />

02.07.2013 - 08:53 Uhr

Lade dir Fiddler runter http://fiddler2.com/ und beobachte was der Browser tut. Geht natürlich auch über den Browser direkt.

02.07.2013 - 08:52 Uhr

Ich kann dir auch nicht helfen, habes es nämlich, weil ich selber immer wieder Fehler hatte, es aufgegeben.

Mittlerweile benutze ich Web Essentials http://visualstudiogallery.msdn.microsoft.com/07d54d12-7133-4e15-becb-6f451ea3bea6 mit LESS und lass mir meine CSS zur Build-Time minimieren. Dazu lade ich beim Build die Files auf Azure hoch (habe sonst ein Root-Server).

Dazu habe ich eine eigenen view helper geschrieben, der mehr oder weniger so funktioniert:


StaticContent(string path)
{
#if DEBUG
base = Resolve("~/");
#else
base = "http://myazure...";
#endif

#if !DEBUG
path = path.Replace(".css, ".min.css");
#endif

return base + path;
}

Funktioniert sehr gut.

21.05.2013 - 17:01 Uhr

Hallo Zusammen,

ich bin selbst Freelancer und würde gerne von denijenigen hier im Forum wissen...

  1. Wie ihr üblicherweise arbeitet? Seid ihr direkt beim Kunden oder per Remote in ein Team eingebettet oder realisiert ihr eigenständige Projekte, evtl. mit anderen Freelancern?

1.1. Habt Ihr schon mehrere Varianten ausprobiert und wenn ja, welche hat euch am meisten zugesagt und warum?

  1. Wo sucht ihr nach Aufträgen, bzw. wo sind die Chancen, gute Aufträge zu finden am besten.

Zu meinem Hintergrund: Ich war bis vor 2 Jahren Freelancer und habe damals besonders über unser Produkt Silverdiagram Aufträge bekommen. Richtig Werbung musste ich nicht machen. Jetzt suche ich wieder nach interessanten Projekten (ASP.NET MVC-Stack oder XAML-Stack) habe aber noch keinen richtigen Plan, wie ich an die Auftraggeber komme.

12.05.2013 - 10:33 Uhr

@M@TUK: Wieso sollte das nicht gehen? Bei Linq muss der Expression Tree komplett analysiert werden und EF könnte ohne Probleme erkennen, dass es sich hier um eine Fremdschlüsselbeziehung handelt und das Query entsprechend bauen.

ALLERDINGS wäre das nur eine Zusatzoption. Es ist keine wirkliche Option z.B. bei iener Webseite, bei der die ID des Users per Url/Session/Cookie übergeben wird, erst den User abzufragen, nur weil man die Nachrichten des Users abfragen möchte.

04.05.2013 - 20:40 Uhr

Verwende die TPL doch einfach direkt, ohne eine separate Job-Queue. Wenn du möchtest, dass deine Anzahl an Threads begrenzt wird, kannst du auch einen eigenen Scheduler schreiben, in der MSDN steht wie:

How to: Create a Task Scheduler That Limits Concurrency

Auch das Erstellen von Tasks innerhalb von anderen Tasks ist kein Problem. Das wird ja auch zum Beispiel bei vielen paralellel Algorithmen verwendet.

30.04.2013 - 12:02 Uhr

Ich wiederhole es nochmal:

Verwende den oben geposteten Task-Scheduler. Dann kannst du sicherstellen, dass alle I/O Sachen in einem einzigen Hintergrund-Thread laufen und du kannst ja trotzdem noch async-await verwenden um bequem deine UI zu aktualisieren.

30.04.2013 - 08:28 Uhr

Verwende tasks mit einem scheduler, der nur ein thread verwendet.

How to: Create a Task Scheduler That Limits Concurrency

23.04.2013 - 15:46 Uhr

Ich habe nochmal einen Bild angehängt.

Szenario ist ungefähr folgendes: Ich habe eine sehr große Fläche mit Objekten und möchte den Benutzer zu einer Seite des Objektes leiten. Deshalb habe ich einen bisher sehr suboptimalen Graphen zwischen den Objekten auf den ich A* anwende. Da sich der Benutzer den Weg aber merken muss, muss der Pfad einfach sein. Einfacher ist ein Pfad, wenn sich bei gleicher Länge weniger Richtungwechsel ergeben im Bezug zu einem alternativen Pfad (bereits implementiert). Jetzt ist aber die Frage wie ich den Graphen möglichst automatisch berechne.

Es ist möglich eine manuelle Anpassung bei Details durchzuführen.

Die Rotation von Objekten kann das Problem nochmal verkomplizieren.

23.04.2013 - 11:46 Uhr

Hallo zusammen,

ich suche ein Algorithmus für folgendes Problem:

Ich habe auf einer begrenzten Fläche eine Liste von rotierten Recheckten unterschiedlicher Größe. Ich suche einen Graph mit Kanten zwischen diesen Rechecken. Die Kanten sollten den maximalen Abstand zu den Kanten der Rechtecke halten und der Algortihmus sollte die Anzahl der Kanten und Knoten minimal halten.

Die Lösung wird für ein Pathfinding Problem in einer Art Lager gesucht, bei der möglischt schöne Pfade dargestellt werden sollen. Bevor ich mich an eine eigene Lösung versuche, die aufgrund vieler Randprobleme recht komplex ausfallen könnte, möchte ich alle Möglichkeiten, eine vorhandene Lösung zu finden ausgeschöpft haben.

VG,
Sebastian

08.04.2013 - 09:27 Uhr

Ich bezweifel noch ein bisschen, dass du in einem Online-Shop zeitkritisch 200 Artikel inklusive Details anzeigen musst. Wie sieht denn dein Szenario genau aus?

07.04.2013 - 16:32 Uhr

Ein paar Ideen:

  1. Kann es schneller sein, wenn du z.B. die IDs aller Artikel eermittelst und dann jeden Artikel noch mal einzeln abfrägst.

  2. Ich würde mich genau fragen wieso du alle Informationen für 100Artikel gleichzeitig brauchst.

  3. Wenn alles nix hilft musst du Denormalisieren oder eine für Lesezugriffe optimierte Tabelle aufbauen. Das muss ja nicht Mongo-DB sein.

06.03.2013 - 08:34 Uhr

Es ist im Code eine Vererbung. Da es das aber für Tabellen nicht gibt, muss man mappen. Dazu gibt es drei Ansätze (die ich gerade auflisten wollte),aber auch alle hier stehen:

Objektrelationale Abbildung

03.03.2013 - 12:45 Uhr

Ich würde die Mandanten-Nummer in die Url packen und dann über einen Filter den Parameter auslesen und das Mandanten Objekt zur Verfügung stellen.

02.03.2013 - 14:32 Uhr

Die Konsolen werden zu geschätzt 99% nicht über WinAPI realisiert, sondern sind normalerweise direkte Steuerelemente der jeweiligen Game-Engine bzw. selbstentwickelt. Deshalb wirst du da auch keine Möglichkeit finden, das auszulesen, falls es keine Schnittstelle gibt.

12.02.2013 - 13:27 Uhr

Es kommt auf viele Details an. Ich glaube z.B. mit Azure würde ich die Variante mit mehreren Datenbanken bevorzugen, weil das sehr gut skalieren sollte. Außerdem kannst du mit EF Code First und Mitgration viel Chaos vermeiden.

31.01.2013 - 17:08 Uhr

Was ist mit der SqlBulkCopy Klasse? Kann auch aus DataTable importieren, eigener IDataReader geht auch.

02.11.2012 - 09:44 Uhr

Geht noch kürzer:


FieldInfo fieldInfo = tmpFieldInfo.SingleOrDefault(i => i.Name == "primaryKeyProperty")

29.10.2012 - 17:48 Uhr

Ich würde es in Expression Design zeichnen. Siehe Anhang.

27.10.2012 - 12:07 Uhr

Hallo,

ich bin auf der Suche nach einem Generator um aus XSD eine Klassenhierarchie zu erzeugen. Dazu habe ich mir schon xsd.exe und xsd2code angeschaut. Allerdings erfüllt keiner der beiden alle Anforderungen:

  1. Lazy Loading für komplexe Properties (unterstützt von xsd2code)
  2. Generische Listen (unterstützt von xsd2code)
  3. Nullables für optionale Elemente und Attribute.
  4. Namensangleichung, z.B. test_element => TestElement (inkl. Attribut)

Kennt jemand eine gute Lösung?

24.09.2012 - 15:37 Uhr

Also so langsam wirds ein bisschen frech. Du musst dich schon selber informieren und evtl. experimentieren. Keiner wird dir hier eine Lösung vorkaufen.

24.09.2012 - 15:12 Uhr

Für mich sieht es so aus, als wäre es zweimal die gleiche xsd. Warum es nicht geht kann ich dir nicht sagen, ich würde mal googeln.

24.09.2012 - 15:01 Uhr

Ich würde das xsd als input verwenden, xml geht zwar auch, aber das Ergebnis könnte verschieden sein.