ASP.NET Core: Duplicate ‚Content‘ items were included. The .NET SDK includes ‚Content‘ items from your project directory by default.

Pokud dostanete na ASP.NET Core projektu ve Visual Studiu hlášku o duplicitním Contentu:

Error Duplicate ‚Content‘ items were included. The .NET SDK includes ‚Content‘ items from your project directory by default. You can either remove these items from your project file, or set the ‚EnableDefaultContentItems‘ property to ‚false‘ if you want to explicitly include them in your project file. For more information, see https://aka.ms/sdkimplicititems. The duplicate items were: ‚wwwroot\Index.html‘ Web C:\Program Files\dotnet\sdk\1.1.0\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.DefaultItems.targets 188

…jedná se o nadrbaný .csproj a pomůže odebrat a přidat složky wwwroot z projektu:

  1. Solution Explorer – pravým na ~/wwwroot – Exclude From Project
  2. zapnout si viditelnost excludovaných souborů – Solution Explorer – Show All Files (jedna z ikonek nahoře)
  3. Solution Explorer – pravým na ~/wwwroot – Include in Project

TFS2017: SQL Query pro počet changesetů dle uživatele

…byl to nakonec trochu opruz dohledat správně uživatele, tak dávám do pléna

SELECT i.AccountName, COUNT(*)
	FROM tbl_ChangeSet AS cs
		LEFT JOIN tbl_IdentityMap im ON cs.OwnerId = im.localId
		LEFT JOIN Tfs_Configuration.dbo.tbl_Identity i ON im.masterId = i.Id
	GROUP BY i.AccountName WITH ROLLUP
	ORDER BY COUNT(*) DESC

.NET C# Developer wanted (vhodné i pro pumpičkáře)

Jsem srdcem vývojář a společnost HAVIT jsem založil v roce 1997, abych si naplnil svůj sen. Postavil jsem firmu, která ač byla vždy v zisku, nemá být továrnou na peníze, ale spíše prostředím pro naplňování životních potřeb všech členů týmu. Chci, aby nás to společně bavilo, aby každý nacházel ve své práci uspokojení, aby každý dostával příležitosti uplatnit svůj potenciál a abychom se vše snažili dělat lépe, než musíme. Takovou vidím cestu pro dlouhodobě udržitelný růst.

V HAVITu vyvíjíme zakázkové aplikace na technologiích Microsoft (C#, MS SQL, Azure), obvykle s webovým uživatelským rozhraním (ASP.NET). Naše práce nás baví a záleží nám na tom. Stavíme na technologické excelenci bez kompromisů a příjemných pracovních podmínkách pro sebe i zákazníky. Naši práci klienti oceňují – jsme přímými dodavateli a pracujeme na zajímavých projektech pro nadnárodní i lokální zákazníky. Několika dalším vývojářským týmům pomáháme jako mentoři.

Do našeho týmu hledáme posilu. Možná jsi to právě Ty, kdo u nás najde naplnění svých pracovních snů?

Robert Haken, zakladatel


Právě teď potřebujeme vývojáře. Uplatnění u nás najde jak zkušený senior, tak nadaný začátečník. Seniorům dokážeme nabídnout samostatné vedení projektů a podpůrný tým, začátečníkům či studentům naopak odborný růst v týmu, který jim pomůže zkušenosti získat. Zajímají nás jak univerzálové, tak specialisté na frontend, backend, mobily atp.

Důležitá je pro nás osobnost uchazeče a jeho intelektuální potenciál, resp. vývojářské vlohy. Pokud ucítíme, že jsi ten pravý/ta pravá, s kým nás to bude bavit a s kým chceme své vlastní potřeby naplňovat po mnoho dalších let, vše potřebné tě naučíme.

Co nabízíme?

  • přátelské prostředí, kde se snažíme, aby práce pro nás byla zábavou – aktuálně vyvíjíme uspořádáni ve třech týmech po cca 5 vývojářích a snažíme se o agilní pojetí, mimochodem nejsme příznivci velkých open-office, každý tým má svůj vlastní oddělený prostor,
  • svobodu v práci, čili relativně volnou pracovní dobu, kde jsou přesčasy naprostou výjimkou v případech nouze, po dohodě je možná i částečná práce na dálku,
  • individuální přístup k potřebám jednotlivých pracovníků – každému se snažíme vyjít vstříc a umožnit takové prostředí a uspořádání, aby mohl plně uplatnit svůj potenciál a cítil se užitečným článkem soukolí,
  • práci na zajímavých projektech, pro zákazníky, které si můžeme vybírat (neděláme pro státní sektor, vyhýbáme se prezentačním webům či projektům, kde nemůžeme uplatnit své konkurenční výhody – technologické pokročilosti),
  • příjemnou vývojářskou práci na vícevrstvých aplikacích, s agilním přístupem, s nejnovějším vybavením (VS2017, SQL2016, NET4.6+, SSD, 2xLCD, desktop/ntb, MSDN, Azure, …), s využitím našich knihoven a generátorů kódu, kdy se budete moci věnovat opravdu tvorbě aplikace nad vygenerovaným objektovým modelem, a nebudete trávit dny datlováním stále stejných věcí dokola (přístupů do DB, atp. atp.),
  • práci s platformou Microsoft Azure, kam primárně naše aplikace směřujeme,
  • odborný rozvoj v kolektivu MVP, MCT, MCSD, MCSE, MCP kolegů ;-)
  • každý rok společný týden na námořní plachetnici, na horách, nebo obdobná akce ;-)
  • pátý týden dovolené
  • nadstandardní lékařská péče pro všechny naše pracovníky
  • mobilní tarif s připojením na internet
  • zařízení pro pumpičkáře – cyklisty (stojany, sprcha, sušárna) i vozíčkáře (bezbariérový přístup i samostatné WC)
  • volitelné lekce angličtiny jednou nebo dvakrát týdně (na pracovišti, rodilý mluvčí)
  • zajímavé finanční ohodnocení s bonusem ze zisku společnosti (50% zisku je otevřeným modelem čtvrtletně rozdělováno pracovníkům jako ocenění jejich účasti na společném úspěchu)

Co budeš potřebovat?

  • chuť produkovat kvalitní aplikace, s respektem pro potřeby zákazníka a s osobním uspokojením nad technologickou excelencí,
  • osobnostní kvality, otevřenou mysl a schopnost učit se novým věcem,
  • využiješ znalosti C#, ASP.NET (MVC, WebAPI, nebo WebForms), HTML, CSS, webových technologií, OOP,
  • hodit se budou znalosti databázové problematiky (návrh relační DB, MSSQL, T-SQL),
  • znalost Entity Framework a IoC/DI může být výhodou, není však podmínkou (naučíme),
  • orientace ve front-end technologiích (jQuery, React, Knockout, AngularJS, atp.) je pro nás příjemným bonusem, ale nikoho do front-endu netlačíme (hledáme však i „front-end vývojáře“),
  • dovednosti vývoje mobilních aplikací vítáme, hledáme i specialisty „mobilní vývojáře“.

Preferujeme plný úvazek, resp. neradi bychom se dlouhodobě dělili s dalším pracovním nasazením. Od února sedíme v komfortních kancelářích Budějovická 3a, na metru Pankrác.

Nástup možný ihned, pokud nás však zaujmeš, budeme trpěliví (např. po výpovědní dobu dosavadního zaměstnání).

Nekuřácké pracoviště, nekuřák podmínkou.

Chceš to s námi zkusit?

Kontaktuj mě s profesními informacemi o sobě na haken@havit.cz. Pokud napíšeš, proč bys chtěl(a) pracovat zrovna u nás, určitě mě to potěší.

Navrhni nejraději rovnou dva nebo tři termíny v nejbližších dnech, kdy bychom se mohli sejít. Pošli ideálně:

  • odkaz na LinkedIn nebo životopis,
  • ukázku svého zdrojového kódu (stačí jeden/dva soubory nebo odkaz na GitHub),
  • popř. odkazy na projekty, kde jste se podíleli na vývoji.

Pokud by vás zaujala možnost přijít jako tým (2-4 lidi), budete vítáni. Práce je u nás dost a sehranou partu nemá smysl dělit.

Přijďte se ukázat, těším se na spolupráci
Robert Haken, pečovatel o tým HAVIT

Tipy a triky v .NET a C# – slides, dema a záznam [TechEd Praha 05/2017]

Slides, dema a záznam z mé přednášky pro TechEd DevCon Praha ze 17.5.2017:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • VS – Windows Layouts
  • C# – NoRefactoringsInInactiveCode
  • C# – MSTestV2TestCases
  • VS Keyboard Shortcuts
  • C# – InternalsVisibleTo
  • C# – Test – HardcodedDependenciesTestability
  • VS – [Re-]Attach to process
  • VS – BoxSelection
  • C# – NameOf – nameof()
  • C# – Initializers + InitializersArray
  • VS – MoveLineUpDown
  • C# 5.0 – Caller Info Attributes
  • VS – Extensions.md
  • VS – Personal Tweaks.md
  • C# – Using Without Variable
  • C# – DebuggerDisplay ([DebuggerBrowsable], [DebuggerStepThrough])
  • C# – AsyncLocal

Azure PaaS – Praktické zkušenosti, tipy a triky – slides a záznam [TechEd Praha 05/2017]

Slides, dema a záznam z mé přednášky pro TechEd DevCon Praha z 16.5.2017:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • IaaS vs. PaaS vs. XaaS
  • Motivace k Azure PaaS vs. Co vás může odradit
  • Klíčové služby
    • App Service
    • Azure SQL
    • Azure Storage
    • Application Insights
  • Praktické scénáře
    • Deployment (MSDeploy)
    • Práce se soubory IFileStorage
    • Práce s časem (DateTime.Now v UTC vs. ITimeService)
    • Posílání e-mailů (SendGrid)
    • Naplánované úlohy (Quartz.NET, WebJobs, WebJobs SDK, Dashboard)

Novinky ve VS2017 a C# 7.0 – slides, dema a záznam [TechEd Praha 05/2017]

Slides, dema a záznam z mé přednášky pro TechEd DevCon Praha z 15.5.2017:

Záznam z přednášky je publikován na našem HAVIT YouTube Channel.

Dotčená témata

  • VS 2017 Novinky
    • Go to All… (Naviagate to…)
    • IntelliSense
    • Find All References
    • Structure Guides
    • Live Unit Testing
    • Installer
    • Debugging – Run to Click
    • Debugging – Exception Helper (NullReferenceException)
  • MSTest v2 [DataRow]
  • Novinky C# 7.0
    • Binary Literals
    • Digit Separators
    • Expression Bodied Members – Constructors, Destructors (Finalizers), Property Accessors
    • throw expressions
    • out variables
    • Tuples
    • Local Functions
    • Pattern Matching
    • ValueTask<>
    • Ref Return, Ref Local

Označování textu v HTML aneb na počtvrté správně a po svém

Cíle

  1. Označit (resp. zvýraznit) text v prohlížeči (Chrome, Firefox, IE, Edge) a to i v mobilních verzích aplikace (Android, iOS, Windows Phone)
  2. Uložit serializovanou podobu označení do úložiště pro pozdější obnovení označení (například při návratu na stránku)
  3. Při novém načtení stránky (render stránky), označit text

Poprvé

Musím se přiznat, že k prvnímu pokusu o označení jsem pouze přišel s tím, že už to je implementované správně a funguje. Nefungovalo. V daném HTML byli vytvořené jakési „stropy“ (offsety), reprezentované prostým span HTML elementem s číselnou hodnotu v datasetu.

Tento kód zde raději ani nesdílím, neb bych nerad, aby se čtenáři udělalo nevolno.

Nebylo možné označování přes více různých elementů – původně počítalo s označením pouze v odstavcích, ale tabulky, divy nebo obrázky to ignorovalo.

Takhle to nepůjde.

Podruhé

Většinou nejprve hledám po internetu, jestli už někdo neřešil podobný problém. Měl jsem štěstí – řešil. Narazil jsem na knihovnu rangy.js. Má svou wiki, kde je krásně popsáno API, takže jsem se mohl podívat, co tato knihovna umí.

rangy.js má v sobě modul pro zvýraznění (Highlighter module), který má dvě implementace:

  • textContent
    • výhody: jednoduchý, rychlý algoritmus
    • nevýhody: změny DOMu mají za následek, označení něčeho jiného než bylo před změnou DOMu označeno, i jakýkoli bilý znak (white-space) měl za následek mutaci označení
  • TextRange
    • výhody: odolný proti zápisu více bílých znaků (white-space)
    • nevýhody: extrémně pomalý

Implmentace „textContent“ nemohla být použita, protože mobilní aplikace renderovala HTML trochu jinak a to i přesto, že bylo použito Chromium (jádro Chrome tzn. stejný render engine).

Zkusil jsem implementaci „TextRange“. Nepoužitelné. Mobilní aplikaci trvalo až 10s než vyrenderuje označené HTML.

I když bylo označení vždy přesné, tak z výkonových důvodu jsem od něj upustil.

Potřetí

Tento postup, už jsem vymýšlel já. Spoočíval v serializaci Range objektu velmi jednoduchou metodou. Range objekt má v sobě startContainer, startOffset, endContainer a endOffset. Serializace probíhá tak, že se vygeneruje validní selektor elementu startContainer a endContainer relativně ke zvolenému HTML elementu (například k body) a spočítá se startOffset a endOffset v daných start/end kontejnerech.

// Takto vypadá definice selektoru, který lze uložit do databáze jako JSON
interface IHtmlElementSelectorResult {
   selector: string;
   childNodeIndex: number;
   offset: number;
}
// Takto vypadá příklad serializované reprezentace Range objektu
{
   start: {
       selector: "div > div > p:nth-of-type(4)",
       childNodeIndex: 0,
       offset: 10
   },
   end: {
       selector: "div > div > p:nth-of-type(8) > strong",
       childNodeIndex: 0,
       offset: 5
   }
}

Z takto serializované hodnoty, lze velmi snad zrekonstruovat Range objekt a nad ním poté provést označení.

Dokud nezmutuje DOM. Pokud zmutuje, tak není možná rekonstrukce. A právě tím, že chceme označit text, tak DOM mutuje (vkládáme <span> HTML elementy, které zvýrazňují text).

Takže znova a jinak.

Počtvrté

Opět jsem se vyskytl na zelené louce.

S kolegou jsme se nad tímto problémem zamysleli z jiného pohledu. Označení nebude prováděno na základě znalosti (reprezentace) DOMu, ale na základě znalosti počtu výskytu jednotlivých slov, které jsme vybrali, že chceme označit a které se „lámali“ skrze DOM.

Pustil jsem se do implementace. Procházením DOMU a sbíráním počtu výskytu označených slov, jsem došel k cíli. Fungovalo to jak na desktopu, tak i na mobilních aplikacích, je to relativně svižné – PC maximálně malé stovky milisekund, i při označení obrovského kusu textu (DOMu), na mobilních aplikacích podobně.

Využil jsem k procházení DOMu objekt TreeWalker, který jsem si nastavil tak, aby procházel jen ten označený kus textu a spočítal si výskyty slov. Výpočet jsem si uložil do JSON, který ač je závislý na velikosti textu a počtu výskytu slov, tak funguje skvěle.

TL;DR

Pro označení, uložení pozice a opětovné označení textu v HTML (DOM) nejsou vhodné způsoby:

  • Vlastní implementace způsoby jako „počet znaků od začátku body elementu“, „počet znaků označeného textu“
  • Použití knihovny rangy.js (nad kterou se v době psaní tohoto článku stejně už 2 roky nic neděje)
  • Vlastní implementace způsobem serializace a deserializace Range objektu

Zatím jediný a funkční způsob byl vlastní implementace založená na znalosti označeného textu a počet výskytů jednotlivých slov, případně úseků slov – záleží na tom jak moc je DOM komplikovaný/velký/strukturovaný.