VS2017 #NoResharper Challenge: Navigace z Controlleru na View

S Resharperem je v Controllerech pohodlná navigace přes Ctrl+Click, aby se člověk dostal na View.

V čistém VS2017 se dá z Controlleru používat:

  • Ctrl+M, Ctrl+G = Go To View
  • Ctrl+M, Ctrl+V = Add View

VS2017 #NoResharper Challenge: Refactorings

Další podstatnou věcí, kterou R# přináší, je mnoho drobných refactoringů. Osobně jsem v tomto příznivcem Roslynu (Compiler Services), takže jsem už při předchozích #NoResharper pokusech nějaké poznatky nabral:

  • Introduce And Initialize Local Field – Úplně na začátku, dokud nic nebylo, napsal jsem jednu vlastní extension.
  • Refactoring Essentials – pro VS2015 jsem používal Refactoring Essentials. Bohužel poslední release je půl roku starý a pro VS2017 zatím verze není.
  • Roslynator Refactorings 2017 – Letmým hledáním pro VS2017 nacházím tento doplněk od Josefa Pihrta, který vypadá celkem obstojně, co se nabízeného rozsahu refactoringů týče. Navíc jde o českou produkci, tak proč to nezkusit a nepodpořit.

Jestli mi budou nějaké refactoringy chybět, pokusím se najít další/jiné náhrady, popř. je zařadím na seznam „Co jsem musel obětovat“ a uvidíme, co na něm nakonec zbude.

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?