ich habe ein kleines aber nützliches Tool geschrieben, was erst nur zur Übung für mich gedacht war und um meinen Workflow ein wenig zu erleichtern habe ich jetzt als mein erstes NuGet package veröffentlicht und auf GitHub.
Was das Tool macht ist wirklich simpel, ich wollte das automatisch in einem Projekt nach dem Build ein NuGet package erstellt wird mit der Version, die nicht etwa in der .nuspec Datei angegeben ist, sondern mit der Version die in der "AssemblyInfo.cs" Datei angegeben ist.
Und genau das macht das Tool.
Es liegt eine Readme Datei bei, die den Umgang damit erklärt, vielleicht kann ja einer von euch noch dieses Tool gebrauchen.
ich suche einen erfahrenden Visual Studio Add In Entwickler, der in geschätzten 30 - 60 min. 50 € verdienen möchte.
Eine wichtige Voraussetzung wäre allerdings das das Add In unter Visual Studio 2012 läuft.
Und zwar geht es um folgendes.
Ich möchte im Projektmappen-Explorer mit einem rechten Mausklick auf ".cs" Dateien einen zusätzlichen Punkt im Contextmenü haben, der lautet "JS generieren", wenn ich dann darauf klicke, soll in dem Add In eine Instanz der Klasse erstellt werden die sich in dieser ".cs" Datei befindet und dann reflection Zeug gemacht werden und dann eine JavaScript Datei generiert und geschrieben werden und dem Projekt hinzugefügt werden.
Den ganzen Teil mit Reflection und Datei generieren und dem Projekt hinzufügen kann ich selbst mit Roslyn machen.
Das einzige was ich brauche ist der Eintrag im Contextmenü und wenn ich dann auf den neuen Menüpunkt klicke brauche ich den Dateipfad (Zur sicherheit vielleicht beide, relativ wie absolut, weil ich nicht weiß was Roslyn brauch) der Datei die ich geklickt habe.
Für einen erfahrenden Add In Entwickler sollte diese Aufgabe wirklich ein klax sein, denke ich.
Das letzte klingt gut, der Code soll in keinem anderen Projekt Verwendung finden!
Was dem Projekt beigesteuert wird soll auch da bleiben (Inklusive meinem Code), dann möchte ich das Projekt irgendwann veröffentlichen (Eine Webseite) und gut ist.
Lehrzwecke sind natürlich immer in Ordnung, ich will halt nur verhindern das jemand meine Idee klaut und einen Klon erstellt/verkauft.
ich habe eine Frage zu Lizenzarten.
Und zwar würde ich gerne ein Open Source Projekt auf Codeplex starten und ich bräuchte eine Lizensart die folgende Dinge abdeckt.
Wie gesagt, es soll ein Projekt auf CodePlex werden.
- Natürlich sollen Leute daran mitentwickeln können, sonst würde ein OpenSource Projekt ja keinen Sinn machen.
- Die Codeschnippsel die andere dann zu dem Projekt dazu steuern sollen dann rechtlich dem Projekt gehören.
- Und ganz wichtig natürlich soll der SourceCode NICHT für andere Projekte benutzt werden, also man nehme den Sourcecode, ändert den Namen und veröffentlicht dann quasie einen Klon des Projektes.
Leider habe ich per Google keine gute Übersicht über Lizenzen gefunden und bei CodePlex lassen sich so viele auswählen das ich völlig erschlagen bin.
Ich hoffe einer von euch kann Licht in dieses Gebiet bringen.
Nee, das ist nicht das Problem, an der Stelle will ich ja die ANZAHL aller Datensätze das ist schon OK.
Wenn ich die Zeile auskommentiert habe kriege ich ja 38.000 zurück und das sofort ohne Verzögerung, wenn ich das Where aber drin habe, dann dauert das Count 2-3 Sek. obwohl (theoretisch) nur die Zahl 117 geladen wird.
Und Count gibt ja auch nur die Anzahl zurück und dafür muss kein Datensatz geladen werden, ist ja das SQL Statement "SELECT Count(*) FROM Besuchsberichte..."
EDIT:
Zur Erklärung 38.000 Besuchsberichte insgesamt, 117 mit der KundenNr = 12345.
Ich habe ein Problem und weiß nicht so recht woran es liegt, ich konnte es zwar auf eine Zeile eingrenzen, aber ich weiß nicht genau was da schief läuft.
Erst mal die DB/Code First Rahmeninfos.
Eine Tabelle und ein CodeFirst Model "Besuchsberichte", dieses Besuchsberichtsmodel hat ein paar Eigenschaften unter anderem die KundenNr, die aussagt bei welchem Kunden der AD war wozu er den Besuchsbericht geschrieben hat.
Die Tabelle hat ca. 38.000 Datensätze.
So weit so gut, jetzt habe ich mir eine Methode geschrieben die so aussieht:
public static IQueryable<TModel> Apply<TModel>(IQueryable<TModel> queryable, IInputModel inputModel, out Int32 allRowsCount)
{
var param = Expression.Parameter(typeof(TModel), "item");
BinaryExpression finalExpression = null;
Expression<Func<TModel, Boolean>> finalLambdaExpression = null;
// Jede Property durchgehen und schauen ob sie != null ist
foreach (var loopProp in inputModel.GetType().GetProperties())
{
if (loopProp.Name != "OrderBy" && loopProp.Name != "OrderDescending" && loopProp.Name != "TopX" && loopProp.Name != "Skip" && loopProp.Name != "AllRowsCount" && loopProp.Name != "IncludeNavigationProperties")
{
Type propType = typeof(TModel).GetProperty(loopProp.Name).PropertyType;
var propValue = loopProp.GetValue(inputModel, null);
if (propValue != null)
{
var property = Expression.Property(param, loopProp.Name);
var equalExpression = Expression.Equal(property, Expression.Constant(propValue, propType));
if (finalExpression == null)
{
finalExpression = equalExpression;
}
else
{
finalExpression = Expression.AndAlso(finalExpression, equalExpression);
}
}
}
}
// Die finale LambdaExpression bilden
finalLambdaExpression = Expression.Lambda<Func<TModel, Boolean>>(finalExpression, param);
// Übeltäter
queryable = queryable.Where(finalLambdaExpression.Compile()).AsQueryable();
// Anzahl aller Datensätze laden, bevor "Skip" und "TopX" angewendet wird
allRowsCount = queryable.Count();
// Am Ende noch sortieren wenn gewünscht
if (!String.IsNullOrEmpty(inputModel.OrderBy))
{
queryable = Sort(queryable, inputModel.OrderBy, inputModel.OrderDescending);
}
// Skippen wenn gewünscht
if (inputModel.Skip.HasValue && inputModel.Skip.Value > 0)
{
queryable = queryable.Skip(inputModel.Skip.Value);
}
// Nur die gewünschten Einträge zurück geben
if (inputModel.TopX.HasValue)
{
queryable = queryable.Take(inputModel.TopX.Value);
}
return queryable;
}
Wenn man sich mit Expression Trees auskennt kein Voodoo.
Diese Methode bekommt in unserem Fall jetzt eine IQueryable<Besuchsbericht> und ein InputModel, dieses InputModel hat ein Basismodel mit Eigenschaften wie Sortierung, Skip und Top und das Model selber hat in unserem Fall jetzt eine Eigenschaft mit dem Namen KundenNr.
Was ich jetzt machen will ist, schauen ob KundenNr des InputModel != null ist, wenn das so ist, einen Where Filter auf die Queryable ausführen und das natürlich dynamisch auf unendlich viele Eigenschaften.
Jetzt kommt die Krux!
Es funktioniert einwandfrei!
ABER
Uns ist jetzt aufgefallen das das laden von 4 (Gemacht durch Skip und Take) Besuchsberichten 2-3 Sekunden dauert und wenn man das SQL auf dem Server direkt ausführt ist es sofort da!
Wir also mit dem SQL Profiler geschaut was Linq abschickt und Linq holt sich ALLE 38.000 Datensätze und wendet das Skip und Take dann erst lokal an!
Wenn ich diese auskommentiere habe ich zwar keine Where Bedingung mehr, aber das Skip und Take werden wirklich schon auf SQL Basis ausgeführt!
Und das .Count() ist sofort durch und das dauert mit der Zeile halt die 2-3 Sek.
Habt ihr eine Erklärung dafür, ich bleibe doch die ganze Zeit auf IQueryable Ebene und damit Linq to SQL Ebene, aber es scheint halt so als würde diese eine Zeile dafür sorgen das ich halt alle Datensätze lade und lokal erst die ganzen Filter anwende.
Du kannst zwar MVC sagen, dass er in weiteren Ordnern nach Views schauen soll (siehe Fehlermeldung wenn eine View nicht gefunden wird) aber er wird weiterhin in den Standardordnern suchen. Für die Performance ist also Dein Vorgehen - außer die gehst auf absolute Pfade - kontraproduktiv.
Das ist nicht korrekt, wie ich in einem Debugmarathon vor Wochen schmerzlich feststellen musste wird im Release Modus und nur da, die View/Pfad nach dem ersten finden gecached, also sollte er wirklich beim ersten mal auch einmal im Standardverzeichnis suchen, dann sollte das kein Problem sein.
Mit der web.config werde ich mal schauen was ich mache.
ich baue mir ein kleines Framework basierend auf MVC 3 und will in meinen Projekten eine andere Ordnerstruktur.
So weit kein Problem, ich weiß wie ich die Viewerstellung und das suchen nach Views in andere Ordner verschiebe, es gibt nur eine Sache bei der ich nicht bescheid weiß.
Im Views Ordner liegt ja die web.config, in der steht ja unter anderem die Basisview für die Razorviews drin, dass ist in meiner neuen Struktur die einzigste Datei im Views Ordner.
Jetzt die Frage, kann ich diese web.config irgendwie verschieben, in die Root Web.config intergrieren, oder sonst was, damit ich den Views Ordner dann löschen kann?
Ahh, ich habe noch mal gegoogelt und das Problem das diese Funktion löst ist, wenn man Verzeichnisse die Projektverzeichnis liegen löscht, dann startet die Applikation neu, also würdest du beispielsweise anders als Facebook, wenn der User sein Profil löscht, auch das Bilderverzeichnis des Users löschen, dann startet die Applikation neu!
die Frage geht an alle die schon mal ein .NET Webprojekt veröffentlicht haben.
Ich habe ein Projekt bei dem die User Profilbilder hochladen können, diese möchte natürlich gerne im Dateisystem speichern, aber ich habe das Problem, das die Webanwendung dann immer neu startet.
Gibts ein Magic Verzeichnis das dieser IIS Watcher nicht abtastet, oder muss man das irgendwie per Web.config konfigurieren?
Oder muss es oberhalb des Projektverzeichnisses sein, was aber ja blöd wäre, da a die Relation zum Projekt flöten geht und weil ich dann im inetpub/wwwroot wäre, was unschick wäre, wenn ich noch weitere Projekte darin speichere, die ggf. auch Bilder verlangen.
Ich erarbeite mir gerade anhand eines Nested Set SQL Tutorials eine DB und versuche nun das lese Statement in Linq umzuwandeln, aber das sieht nicht aus wie das handelsübliche SQL. Könnte mir jemand helfen?
SQL
SELECT n.name,
COUNT(*)-1 AS level
FROM tree AS n,
tree AS p
WHERE n.lft BETWEEN p.lft AND p.rgt
GROUP BY n.lft
ORDER BY n.lft;
Mein Ansatz:
var tree = from n in db.Categories
from p in db.Categories
where n.Lft ≥ p.Lft && n.Rgt ≤ p.Rgt
orderby n.Lft
select new
{
name = n.Name,
level = ""
};
Was mir also noch fehlt ist das "COUNT(*)-1 AS level" und das "GROUP BY n.lft" und ob der rest richtig ist, ist auch die Frage :)
ich würde gerne mein erstes SDK Projekt entwickeln, aber es scheint ein wenig speziell zu sein.
Im Netz finde ich nur Beispiele für den Editor zu erweitern mit Farben und Rechtecken und weiß der Teufel.
Aber ich habe folgende Idee, die sich zwar einfach anhört, aber ohne zumindest Beispiele die in eine Ähnliche Richtung gehen schwer zu machen für einen Einsteiger.
Und zwar geht's darum, ich habe folgende Klassen:
class Test : ITest
{
}
class ModelA : Test
{
}
class ModelB
{
public ITest TestEigenschaft { get; set; }
}
Und dann habe ich ein Programm mit einer X beliebigen Funktionen, nun tippe ich z.B. ein
var blub = new ModelB();
blub.TestEigenschaft = new
So und jetzt möchte ich gerne eine Intellisense Box anzeigen, mit allen Klassen aus dem Projekt die das ITest Interface implementieren und nicht wie es Standard ist, alle.
Per Reflection raus finden welche Typen das Interface implentieren ist kein Problem, das kriege ich hin.
Aber der Teil mit der Intellisense Erweiterung, rauszufinden was vor den " = new" steht und das auch nur auszuführen wenn das eingegeben wurde, dass ist das Problem, weil es halt nur Beispiele mit Margins usw. gibt, aber nix mit Intellisense.
ich möchte mich am Wochenende gerne damit beschäftigen auf meinem Notebook auf dem ich auch entwickel, mit Virtual Box ein Windows Server 2008 System aufzusetzen und auf diesem dann eine TFS 2010 (Vollversion, keine Demo) Installation durchzuführen und dann würde ich gerne von meinem VS 2010 auf dem normalem System auf dem Notebook, auf den TFS in der Virtual Box connecten, ist das so überhaupt möglich, bevor ich jetzt Stunden investiere.
verwendetes Datenbanksystem: EF Code First & MS SQL 2005
Hi,
ich habe ein Problem mit dem Kombinieren von zwei Where Bedingungen und ich weiß nicht warum!
Ich habe eine IQueryable die mir als Basis dient und dann möchte ich zu dieser Where Bedingungen dynamisch hinzufügen.
Das komische ist, wenn ich nur eine Bedingung hinzufüge funktioniert das prima, aber sobald die zweite dazu kommt, bekomme ich kein Ergebnis mehr zurück.
Beide Bedingungen die ich kombinieren möchte, funktionieren für sich alleine!
Hier, was ich mache:
// Alle Filter aus dem Grid anwenden
foreach (var loopFilter in gridParameter.Filter)
{
if (loopFilter.Key == "Betreff")
{
baseQuery = baseQuery.Where(a => a.Betreff.Contains(loopFilter.Value));
}
else if (loopFilter.Key == "GesendetAn")
{
baseQuery = baseQuery.Where(a => a.GesendetAnUsername.Contains(loopFilter.Value));
}
else if (loopFilter.Key == "Kundenname")
{
baseQuery = baseQuery.Where(a => a.Kunde.Name.Contains(loopFilter.Value));
}
else if (loopFilter.Key == "Status")
{
var val = Convert.ToBoolean(loopFilter.Value);
baseQuery = baseQuery.Where(a => a.IstErledigt == val);
}
}
Oh man, ich habe mal wieder ein wahnwitziges Problem!
Ich habe eine Seite, die einen ResultFilter, den ich so auf den Response anwende:
internal class ResultFilters : IResultFilter
{
public void OnResultExecuted(ResultExecutedContext filterContext)
{
var response = filterContext.HttpContext.Response;
if (response.Filter != null)
{
response.Filter = new DynamicScriptStream(response.Filter);
}
}
}
und der Stream sieht so aus:
internal class DynamicScriptStream : Stream
{
#region Abstract Stream methods
private Stream _shrink;
public DynamicScriptStream(Stream shrink)
{
_shrink = shrink;
}
public override bool CanRead { get { return true; } }
public override bool CanSeek { get { return true; } }
public override bool CanWrite { get { return true; } }
public override void Flush() { _shrink.Flush(); }
public override long Length { get { return 0; } }
public override long Position { get; set; }
public override int Read(byte[] buffer, int offset, int count)
{
return _shrink.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
return _shrink.Seek(offset, origin);
}
public override void SetLength(long value)
{
_shrink.SetLength(value);
}
public override void Close()
{
_shrink.Close();
}
#endregion
public override void Write(byte[] buffer, int offset, int count)
{
// Load the HTML Code out of the response
String html = System.Text.Encoding.UTF8.GetString(buffer, offset, count);
String scriptContent = String.Empty;
var generatedCode = ger.GetGeneratedJavaScript();
if (!String.IsNullOrEmpty(generatedCode))
{
File.AppendAllText("testdebug.txt", buffer.Length + "|" + offset + "|" + count + "\n\n\n");
var lastBody = html.LastIndexOf("</body>");
scriptContent = "<script type=\"text/javascript\">\n";
scriptContent += "$(document).ready(function () {\n";
scriptContent += generatedCode;
scriptContent += "});\n";
scriptContent += "</script>\n";
if (lastBody > -1)
{
html = html.Insert(lastBody, "\n\n" + scriptContent);
}
else
{
html += "\n\n" + scriptContent;
}
}
// Send output
buffer = System.Text.Encoding.UTF8.GetBytes(html);
_shrink.Write(buffer, 0, buffer.Length);
}
}
Funktioniert lokal (Mit VS Server) einwandfrei!
Dann habe ich das ganz auf unseren Server geschoben mit echtem IIS, laufen lassen und dann wurde die Seite nicht korrekt angezeigt.
Ich also debuggt und debuggt und nach langem hin und her habe ich es nun eingegrenzt.
Wie ihr oben seht, habe ich noch eine Debuggingzeile drin.
Und zwar lokal führt er diesen Filter einmal aus und die Bufferlänge beträgt 14476 und alles ist gut.
Auf dem Server führt er den Filter 2x aus, einmal mit einem Buffer von 13317 und einmal mit einem Buffer von 1257, WIESO?????????
Ich will den Filter natürlich nur einmal ausführen, wenn DER KOMPLETTE Response geladen ist. So gibts natürlich fehler, weil er einen unfertigen Response bearbeitet.
vorweg muss ich sagen, bisher habe ich noch keine Ahnung von VS Plugin Entwicklung und ich weiß nur was T4 Templates sind, habe sie aber noch nicht genutzt.
Jetzt möchte ich gerne etwas tun, wofür diese Dinge bestimmt gebraucht werden.
Ich würde gerne von euch wissen ob es überhaupt möglich ist was ich vorhabe und toll wäre natürlich ein Hinweis wo genau ich suchen soll, oder was ich mir genau anschauen soll.
Aber hilfreich wäre auch nur die Aussage möglich, oder nicht bevor ich mir jetzt wissen ohne Ende aneigne und dann gehts überhaupt nicht. :)
Also, ich würde gerne im Projektexplorer -> Rechter Mausklick -> "Neues Element..." Dialog einen neuen Dateityp in der Internetrubrik haben mit der Endung ".ibu", dann nenne ich Datei z.B. "Test1_xyz.ibu" und wenn ich dann "OK" klicke, soll in dem Ordner den ich mit rechts angeklickt habe eine "Test1_xyz.xml" Datei angelegt werden mit dem Inhalt.
<Main>
<Test1>
<xyz></xyz>
</Test1>
</Main>
Also, die ".ibu" Datei soll quasie nie angelegt werden, nur irgendwie muss ich irgend einen Generator bei einer ".ibu" Datei anwerfen und ihm den Dateinamen übergeben und der kann dann mit diesen Daten arbeiten (Split auf "_" usw.) und tun was ihm beliebt.
Und bitte nicht über Sinn und Unsinn diskutieren, dass ist nur ein Beispiel.
Ich suche einen freiberuflich tätigen MVC 3 Entwickler für ein aktuelles Projekt und noch einige zukünftige, die nur von mir geplant sind, sprich es gibt keinen Zeitdruck, keine Deadline.
Natürlich wichtig, für jeden, die Bezahlung, dass dachte ich mir so:
Ich bin ebenfalls freiberuflich tätig und habe bereits eine Partnerschaft mit einem Webdesigner und einen sehr sehr guten Anwendungsentwickler (Leider ohne Webkenntnisse) als Freund.
Ich bin ganz langsam, aber sicher dabei mir etwas eigenes aufzubauen, dafür brauche ich aber Hilfe, weil ich einfach zu viele Projektideen habe.
Ich suche also jemanden, der nicht auf das schnelle Geld aus ist, sondern eher zukunftsorientiert ist und vielleicht Spaß daran hat später (Im Idealfall) mit in eine Firma einzusteigen.
Also, jetzt konkret für das aktuelle Projekt heißt das, es gibt keinen Stundenlohn, sondern einen prozentualen Anteil vom Verkauf dieses Projektes.
Ich habe das Projekt bereits angefangen und es gibt schon einiges an Code, aber auch noch sehr sehr viel an nicht umgesetzten Ideen.
Ich erwarte keine bestimmte Stundenleistung, sondern einfach jamden der Spaß daran hat, kreativ ist und wenn er mal was Zeit hat, mit mir daran arbeitet, natürlich um so mehr, um so besser, aber es gibt keinen Druck, weil ich bin selbst auch noch in einem Festangestelltenverhälltnis und weiß wie stressig das Leben sein kann.
Nun zu meinem Anforderungsprofil :)
- C# Entwickler
- MVC 3 Entwickler
- .NET 4 Kenntnisse (Lamda, Generic types, usw. sollte bekannt sein)
- Gute Reflection Kenntnisse
- TortoiseHG Kenntnisse (Wäre aber auch nicht schwer zu "lernen")
- Kreativität!
Und der Jenige müsste aus der Umgebung Köln, Bonn, Brühl, Düren, Aachen kommen, damit man sich auch mal leicht persönlich treffen kann, was ich auch in der Zeit von Facebook und Google+ bei wichtigen Dingen immer noch favorisiere (Nicht für jede Kleinigkeit)
So, ich hoffe ich habe alles erwähnt und konnte verständlich machen, was oder wen ich suche.
Also, ich weiß ja nicht wie umfangreich deine Web 2.0 Projekte mit jQuery bisher so waren, aber ich habe schon zig mal im JavaScript mit C# zur Hilfe genommen, sei es um Model Werte einem jQuery.post als Parameter zu übergeben, Code je nach ViewBag Wert auszuführen, oder oder oder.
Und, eine kleine JavaScript View mit 50-100 Zeilen zu rendern, dauert wieviel Millisekunden?
Also in Zeiten, wo Bilder und Videos mit mehreren MB genutzt werden als gäbe es kein morgen, halte ich das jetzt für ein wenig übertrieben, ich will ja keinen neuen HTTP Request dafür machen, sondern lokal die View von der Platte dazu rendern.
ich habe eine Frage, ich schreibe gerade an einer eigenen MVC ViewEngine und ich würde gerne ein Feature einbauen, bei dem mir noch der richtige Ansatz fehlt und da wollte ich mal in die Runde fragen.
Was ich machen möchte ist, wenn ich z.B. Site/Index aufrufe, was ja die View "~/Views/Site/Index.cshtml" lädt, das automatisch unter dem geladenen Content der View, der Inhalt der View "~/Views/Site/Index.js.cshtml" geladen wird.
Das möchte ich machen, weil ich einfach an meinen Projekten merke, mit Ajax und dem ganzen schönen Web 2.0 Sachen, ist der JavaScript Code Anteil, enorm und ich möchte ihn gerne auslagern um meine Views ein wenig schlanker zu halten!
Mehrere Sachen würde ich dabei gerne beachten:
- Der automatisch geladenen View, soll das Model der "manuell" geladenen View übergeben werden, so sie denn eins hat.
- Es soll, tatsächlich auf View Ebene passieren, nicht auf Action Ebene.
- Ich möchte gerne weiterhin, einfach "return View()" benutzen.
Es tut mir so leid, dass ich die Hühner scheu gemacht habe! ;(
Ich hatte kurz bevor ich nach Hause gegangen bin, noch eine Sache eingebaut, die ich auch genau einmal getestet habe und ein Request funktioniert ja immer, erst beim zweiten wo er den Cache ansteuert knallts! ;(
Wie gesagt, ich habe nur die CacheDependency auf die Datei raus genommen und schon funktionierts, nehme ich sie rein, funktionierts nichts mehr und ich packe die Datei nicht an mit der ich teste.
Ich teste auf beiden Systemen mit dem VS internen Webserver!
Ich habe auf beiden Systemen die selben VS Extensions installiert.
Gut, auf der Arbeit ist es ein Windows XP zu Hause ein Windows 7, aber was ist wahrscheinlicher das Windows die Dateien irgendwie anders behandelt, oder die Festplatte, von der ich weiß das sie Dateien intern verschlüsselt und zippt und sie nur normal anzeigt!
Ich glaube einfach das die CacheDependency Klasse damit nicht klar kommt weil Microsoft SSDs die Dateien intern so krass manipulieren und dem Benutzer nur vorgaukeln sie würden normal dort liegen, statt eben für diese SSD optimiert nicht auf der Rechnung hatte, weil sie ja auch viel neuer sind als das .NET Framework!
Ich habe übrigens eine OCX Vertex 3, also wirklich das neuste vom neusten!