VS2017 #NoResharper Challenge: Duplicate Line (Ctrl+D)

Jako téměř s každou novou verzí Visual Studia, nechávám se pravidelně unést představou, že by to šlo bez Resharperu, střelím se do nohy, vypnu Resharper a zkouším to bez něj (s pomocí samotného VS a minimalistickými extensions).

Dnes jsem se tedy opět vydal na tento pokus a budu vás v jednotlivých postech seznamovat s tipy, jak funkce R# nahradit. Jestli to nakonec celé uzavřu zapnutím R#, nebo vydržím bez něj, to jsem sám zvědav (naposledy jsem opustil R# s upgradem z VS2003 na VS2005 a vydržel jsem to bez R# až do VS2012, kdy mi začaly některé funkce výrazně chybět.)

První drobnost, kterou mi R# usnadňoval život, byla klávesová zkratka Ctrl+D na duplikaci řádku. Dá se bez toho určitě žít. Kdo by to potřeboval, je na to minimalistický doplněk:

https://marketplace.visualstudio.com/items?itemName=ctlajoie.DuplicateSelection

Quartz.NET a úplné vymazání plánu

Quartz.NET je plánovač spouštění úloh v rámci procesu aplikace. Úlohy se plánují tak, že se vytvoří Job (spouštěná úloha) a k němu triggery (kdy se spouští). Quartz.NET umí navíc plány perzistovat do databáze, což může být šikovné k tomu, aby se úloha plánu spustila i tehdy, pokud aplikace v okamžiku, kdy měla být úloha spuštěna, z jakéhokoliv důvodu neběžela – misfire. Obdobně umožní spustit job, který z nějakého důvodu nedoběhl (pád, vypnutí stroje) – recovering.

Tím, že je plán perzistentní, není vhodné jej vytvářet se při každém startu aplikace, protože tím by úplně přišlo o výhody perzistence. Plán vytváříme pouze při aktualizaci aplikace.

Existující plán se smaže Clear na Scheduleru – scheduler.Clear(). Problémem však je, že toto nesmaže plán recovering jobů. Nikdy. Pokud tedy takto smažeme plán a vytvoříme nový, plán recovering jobů zůstává zachován. Po nastartování plánovače jsou recovering joby okamžitě spuštěny.

Řešením může být rozšíření metody ClearData třídy SqlServerDelegate (pokud je perzistováno do SqlServeru touto třídou). Tato metoda je volána pod pokličkou v rámci volání scheduler.Clear(). Rozšíříme ji o volání metody DeleteFiredTriggers.


public class MySqlServerDelegate : SqlServerDelegate

{

    public override void ClearData(ConnectionAndTransactionHolder conn)

    {

        base.ClearData(conn);

        DeleteFiredTriggers(conn);

    }

}

Dále musí být scheduleru řečeno, že má tuto třídu používat. Při použití rozšíření Quartz.NET o intergraci s Windsor Castle pomocí NuGet balíčku Quartz.Windsor se název typu s assembly uvádí v konfiguraci pod klíč


<item key="quartz.jobStore.driverDelegateType">...</item>

Working Effectively with Legacy Code – záznam, ZIP a slides [MS Fest Praha 11/2016]

Slides z mé přednášky pro MS Fest Praha z 26.11.2016:

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

Dotčená témata

  • „definice“ Legacy Code
  • Refactoring Mindset
  • Roslyn Code Analyzers – C#, StyleCop, SonarLint, Global Suppressions
  • Testability – extract dependencies do virtuálních metod + override v testu
  • Mocking – Moq

Visual Studio: Když nefunguje klávesová zkratka Ctrl+Shift+F12 – Next Error

Ve VisualStudiu mi přestala fungovat klávesová zkratka Ctrl+Shift+F12, přestože při ověření v Options je korektně namapovaná.

Obvyklou příčinou bývá požírání klávesové zkratky jinou aplikací. Vylučovací metodou se ukázalo, že pachatelem je Microsoft Teams, které když běží, klávesová zkratka ve VS nefunguje (přestože samotná aplikace Teams mezi svými Keyboard shortcuts zkratku nemá uvedenou).

Zavření aplikace Teams pomůže, Ctrl+Shift+F12 začne fungovat.

…pokud byste chtěli hlasovat pro feedback na UserVoice:
https://microsoftteams.uservoice.com/forums/555103-public-preview/suggestions/17156756-application-hides-the-ctrl-shift-f12-keyboard-sh

WebForms: Když nefunguje asynchronní AutoPostBack na RadioButtonech

Pokud bojujete s nefunkčním AutoPostBack na asp:RadioButton v ASP.NET WebForms při asynchronním postbacku, pak je to způsobeno tím, že ASP.NET nerenderuje k RadioButtonu označenému jako Checked klientskou obsluhu události onclick. Zřejmě je to by-design ochrana proti vícenásobné obsluze změn, tedy aby se událost vykonala pouze na jednom z radiobuttonů ve skupině, ne na tom označovaném i odznačovaném.

Možnosti řešení jsou tedy dvě:

  1. Zahrnout i RadioButtons do UpdatePanelu, aby se přerenderovaly a obsluhy událostí správně přenastavily.
  2. Obskurní work-around, který vyrenderuje obsluhu na všech RB taky může být
CisloSmlouvyNoveRB.InputAttributes["checked"] = "true";

ASP.NET Core – Dependency Injection & Unit-testing – záznam, slides a dema [WUG Days Brno 10/2016]

5lides a dema z mé přednášky pro WUG Days Brno ze 8.10.2016:

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

 

Working Effectively with Legacy Code – záznam a slides [WUG Days Brno 10/2016]

Slides z mé přednášky pro WUG Days Brno ze 9.10.2016:

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

Dotčená témata

  • „definice“ Legacy Code
  • Refactoring Mindset
  • Roslyn Code Analyzers – C#, StyleCop, SonarLint, Global Suppressions
  • Testability – extract dependencies do virtuálních metod + override v testu
  • Mocking – Moq
  • Dependency Injection

1Password for Teams – první dojmy z trial (výběr týmového password manageru)

Po necelém týdnu vzdávám další pokusy s 1Password for Teams. Má sice výrazně přehlednější UI a celkově je UX propracovanější, nicméně pro platformu Windows je to zatím příliš nestabilní a nehotové, než abych to risknul a ještě za to platil minimálně dvojnásobek než za (uživatelsky nepřívětivější) LastPass.

Nalezená pozitiva

  • existuje beta-verze samostatné Windows aplikace (nejenom browser extension)
  • první dojem z UI je velmi příjemný, vypadá to ovladatelně (UX pochází z Mac, hodně podobné SplashID)

Nalezená negativa

  • menší počet podporovaných platforem (Windows je jen beta, WP není, iOS a Android jsou), z browserů má Chroma, Safari, Firefox, Opera
  • zřejmě nemá podporu fingerprint auth na Windows, jen na iOS
  • cena $4/user/měsíc (a to ještě jen při využití akce do 14/OCT, jinak Pro verze za $12, i když asi i verze Standard by šla použít)
  • celkově vypadá, že je Mac-based a Windows platforma je ještě v plenkách
  • zakládat a práva nastavovat lze jen na trezory, nikoliv na složky (to by ještě odpovídalo shared folders v LastPass), nejde vytvářet podsložky/hierarchičtější strukturu
  • nemá auto-fill na formulářové údaje
  • lze vytvářet jen záznamy některého z definovaných typů (šablon), nelze přidávat vlastní šablony, i když záznamu dle šablony lze změnit/odebrat (nikoliv přidat) jednotlivá pole
  • nemá import hesel z Chrome, pro import se nabízí jen .csv (= více práce, ale kvalitnější výsledek)
  • nemá zřejmě vzdálenou/hromadnou změnu hesla
  • nemá zřejme „security challenge“ (duplicitní hesla, stará hesla, atp.)
  • Dotaz na uložení nového hesla v browser extension je poměrně agresivní, samotný Chrome nebo LastPass se ptají decentněji. 1P se navíc ptá úplně vždycky a nenašel jsem cestu, jak mu říct „pro tuto site nechci heslo ukládat, nikdy“.
  • browser extension pro Chrome je tak nějak závislá na samostatné Windows aplikaci (beta). Integrace na browser je sice technologicky asi sofistikovanější, ale celkově se to nechová moc spolehlivě. Na zapamatování hesla se to neptá buď vůbec, nebo naopak pořád do zblbnutí, i když ho zapamatovat nechci, občas padá, atp.

Neutrální poznatky

  • „Personal“ trezor je víceméně stále součástí firemního účtu, v tomto je přidružení odděleného osobního účtu, jak to má LastPass asi pro pracovníky přijatelnější. 1P má nicméně možnost do jednotlivých aplikací připojit libovolný počet účtů, což je vlastně víceméně to samé a navíc by to asi umožnilo připojit i případné break-glass účto-trezory.

Co zkusím dalšího? Dashlane nebo Roboform?

Visual Studio: Spouštění webových projektů do nového maximalizovaného okna browseru

Otravuje mě, že výchozí podoba spuštění webového projektu (otevření webové stránky) z Visual Studia způsobí použití již otevřeného okna browseru a přidání nového tabu (nebo více). Pokud sleduji třeba screencast na druhém monitoru, je otrava, že mi ho překreje nový tab.

Naštěstí se to dá ve Visual Studiu poměrně snadno ochočit. Stačí otevřít menu Browse with… (ať už pravým tlačítkem v Solution Exploreru, nebo v rozbalovacím menu startování aplikace) a v příslušném dialogu založit „nový browser“ s příslušnými parametry příkazového řádku.

Pro Chrome, to vypadá takto:

2016-10-06_10-51-12.png

Pro Edge (Chromium) třeba takto:

2020-01-31_10-50-24.png

…teď už stačí jen zvolit příslušný „browser“ jako Default a je to. Příští spuštění již budou do nového maximalizovaného okna.

Pro další browsery to bude obdobné. Přepínačů samozřejmě existují tuny a dají se tak navolit i další věci (incognito, window size/position, disable plugins, …).

Update-Database – Invalid JSON file

Pokud vás cmdlet Update-Database obšťastní hláškou Invalid JSON file2016-10-05_23-27-39.png
…pak je to nejspíš tím, že máte v project.json komentáře (nejsou součástí JSON specifikace a je jen „zásluha“ Visual Studia, že je zahazuje).

Related: https://github.com/aspnet/EntityFramework/issues/5704