Author Archives: Robert Haken

avatar Neznámé

About Robert Haken

Software Architect, Founder at HAVIT, Microsoft MVP - ASP.NET/IIS

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

LastPass Enterprise – první dojmy po týdnu v trial (výběr týmového password manageru)

Pro začátek jsem si vybral jako nejslibnější LastPass Enterprise, otevřel jsem v něm trial a začal naplno testovat. Hned na úvod musím říct, že zatím v podstatě sám, resp. pár kolegů se přidalo, ale týmové interakce jsme si moc neužili (na závadu to ale myslím není).

První dojmy bych shrnul asi takto – Přes naději, že to bude snadný výběr na první dobrou, se ukázalo, že LastPass Enterprise je sice obstojným produktem, který si umím jako náš týmový password manager představit, nicméně naděje ve snadné vítězství se nepotvrdila a mám nutkání zkusit i něco dalšího.

Nalezená pozitiva

  1. Enterprise feature-rich. Kromě mnoha nastavení v Admin Console to má třeba i podporu SAML a REST API.
  2. Cena. Ve srovnání s ostatními zvažovanými je $2/user/month jedna z nejnižších.
  3. Podpora prakticky všech platforem. Extensions prakticky pro všechny browsery, aplikace pro všechny mobilní platformy. Za mě třeba iOS dobrý – podporuje fingerprint ověřování i doplňování hesel do Safari.
  4. Možnost asociace soukromého účtu. Je myslím výhoda, že lze LastPass bez obav používat rovnou i jako osobní password manager s tím, že soukromá hesla si člověk ukládá do asociovaného osobního účtu a nemusí se obávat, že by se na ně někdo z firmy dostal, nebo že by o ně přišel při odchodu z firmy.
  5. Umí víceméně vše, co potřebujeme. Sdílená hesla, vlastní hesla a při troše fantazie lze vyřešit i emergency (break glass) access.
  6. Dospělý produkt. Mají zjevně hodně uživatelů, včetně Enterprise edice. Přežili ve zdraví už i nějaký ten breach. Nějakou dobu už existují a vypadá to, že existovat budou.

Nalezená negativa

  1. Logika “nejrestriktivnějšího oprávnění” na sdílených složkách. Asi nejhorší věc, na kterou jsem zatím narazil, je pravidlo „most restrictive rule applies“ při nastavování oprávnění na sdílené složky. Prakticky to znamená, že pokud máte skupinu Team-A a z jejích členů ještě vyberete skupinu Team-A-Power-Users, tak pokud na sdílené složce dáte právo read skupině Team-A a k tomu právo write skupině Team-A-Power-Users, tak všichni členové Team-A-Power-Users, kteří jsou i členy Team-A ztrácí právo write a uplatní se jim restriktivnější read. Toto chování mi potvrdil i support a zatím se marně snažím dobrat nějakého schématu skupin, jak se vyhnout maintenance hell (Team-A-Except-Power-Users). Zapomeňte na skupinu Everyone, že by se jí dalo dát právo read.
  2. Horší UX v některých situacích. Např. navigace ve složkách, kopírování hesla přes schránku, atp. Částečně to trpí i tím, že desktopová aplikace je „jen“ extension v browseru. I po týdnu používání docela dost často hledám běžné funkce.
  3. Není přímá podpora break-glass emergency přístupu. Edice Enteprise má dokonce vypnutou i Emergency Access feature, která je u osobních účtů pro případ úmrtí uživatele. Není to sice klasický break-glass, ale s nulovou čekací dobou by se to využít dalo. Je to v podstatě i cesta, jak to celé obejít a uspořádat – vytvořit dedikovaný „osobní“ (non-Enterprise) účet, do kterého se uloží příslušný break-glass přístup a v podstatě úplně mimo Enterprise se nastaví Emergency Access s nulovou nebo minimální čekací dobou.

Neutrální aspekty

  1. Reagující support. Za ten týden jsem přes support řešil dva dotazy a reportoval jeden bug. Chybu akceptovali hned a předali do vývoje, dotazy odpovídají zpravidla do 24 hodin a je to takový klasický helpdesk – templatované odpovědi, žádná hluboká snaha o metodickou pomoc (např. s tím pravidlem o restriktivnějších oprávněních, nebo jak uspořádat break-glass).
  2. Data lze zálohovat. Není to sice žádný zázrak, ale celý účet lze exportovat do šifrovaného souboru, který lze pak i offline otevřít v jejich portable klientovi. Lze tak tedy vytvořit offline zálohu, byť zřejmě jen pro jednotlivý účet, nikoliv celou firmu.

Jako další zkusím asi 1Password Team. Mají do 15/OCT akci, že všichni Team zákazníci dostávající life-time edici Pro za cenu Standard, tak abych to případně stihnul využít.

Mimochodem: Tenhle blogpost jsem nakonec psal ve webovém editoru WordPressu, přestože jsem ho rozepsal v Open Live Writeru. Poslední dobou fakt už nějak nemám trpělivost s tím jeho různým przněním flow a formátování při přechodech mezi odstavci, nadpisy, atp.

T-SQL: Smazání všech tabulek a dalších běžných objektů z DB

Zdroj: http://stackoverflow.com/questions/536350/drop-all-the-tables-stored-procedures-triggers-constraints-and-all-the-depend

/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all views */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped View: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all functions */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

T-SQL: Seznam tabulek bez IDENTITY

SELECT  [schema] = s.name,
        [table] = t.name
	FROM    sys.schemas AS s
			INNER JOIN sys.tables AS t ON s.[schema_id] = t.[schema_id]
	WHERE   NOT EXISTS (SELECT 1
						 FROM   sys.identity_columns
						 WHERE  [object_id] = t.[object_id])
	ORDER BY t.name

Vybírám týmový password manager – poznámky z průzkumu

V tomto postu si chci postupně zaznamenávat poznámky z hledání. Průběžně ho budu doplňovat, dokud nedojdeme k závěru.

Požadavky

Pro náš vývojářský tým hledám password manager, který by nám umožnil sdílet hesla (přístupy k zákazníkům, přístupy k zásobovacím službám, atp.).

  • důvěryhodná služba
  • cloudová služba (nechci nic instalovat ani udržovat), webové UI
  • nastavování přístupových práv podle skupin
  • emergency hesla (auditovaný jednorázový přístup k běžně nesdílenému administrátoskému heslu v případě krize) možnost využití i jako osobního password manageru (nice to have)
  • mobilní aplikace (nice to have)
  • browser extension (nice to have)
  • rozumná cena (limit dejme tomu do $100/měsíc za 25-členný tým)

Prvotní průzkum – hodné dalšího zkoumání

http://www.howtogeek.com/240255/password-managers-compared-lastpass-vs-keepass-vs-dashlane-vs-1password/

Dashlane for Business

  • https://www.dashlane.com/business
  • Windows, Mac, iOS (vč. fingerprint) and Android + Internet Explorer, Chrome, Firefox and Safari browsers
  • soukromá i týmová hesla (samostatné zóny), form-filling
  • emergency contact (i na jednotlivá hesla/kategorii, i bez waiting period, nebo pak od 1 dne výš)
  • nemá webové rozhraní, pouze lokální klienty, do kterých musí být hesla stažena (nutná instalace), i když koukám ne-teamové Premium to má, tak těžko říct
  • dvoufaktorová authentizace (i pro “authorize new device”) 
  • Business Intro – https://www.youtube.com/watch?v=OzYEOlfVu68
      • Business Deep-Dive (20min) – https://www.youtube.com/watch?v=aD9rawpTJgs
      • sdílení je pouze po záznamech nebo celých kategoriích, záznamy bude asi obtížné v tom množství nějak organizovat bez složek; úroveň sdílení je pouze login/full
      • neumím si představit nějakou centrální správu, asi je to uchoditelné v malém týmu
  • $2 / user / month (30-day trial)

1Password Team

  • aplikace Mac (původ), iOS, Android (Windows jen beta, Windows Phone není)
  • extensions pro Chrome, FF, Operu, Safari, ale ne IE a EDGE
  • webové rozhraní
  • “mature” platforma
  • Emergency Access lze jen přes jakési “sám se zařadím do týmu”
  • oddělené trezory pro soukromá, týmová a další hesla
  • skupiny uživatelů a logování přístupů jen drahá Pro verze !!
  • Doporučuje Igor Kulman, byť nevyužívá týmově
  • $4 / user / month – Standard, $12 Pro – do 15/OCT life-time cena za standard (30-day trial)

LastPass Enterprise

RoboForm Enterprise (RoboForm Everywhere for Business)

Vyřazené

Nějaké tipy?

Lenovo X1 Carbon 4 vs. T440s – první dojmy po 10 dnech

I přes původní odhodlání setrvat se svým Lenovo ThinkPad T440s jsem nakonec podlehl příležitosti a upgradoval na Lenoxo X1 Carbon 4 (konkrétně model 20FC0038MC, tedy i7 6600U, 2560×1440 IPS, RAM 16 GB, SSD 512 GB, 4G LTE).

  • Nižší zdvih klávesnice (nicméně identické rozložení). Nepozoruji rozdíl v pohodlí/přesnosti psaní.
  • Fingerprint reader, na který stačí prst přiložit (ála iPhone) = rychlejší přihlášení.
  • Vyšší rozlišení 2560×1440 (scale 150%) zatím vypadá, že bude příjemnější než FullHD (scale 125%). Při scale 150% se toho na obrazovku vejde o malinko více, a pro “sedím za stolem” je to přesně akorát. Pro “na klíně” je to na hraně, nejspíš bude potřeba přepínat na 175%.
  • microSD card reader je víceméně symbolický, spíše pro verze s menším diskem jako cesta k získání další kapacity, než pro častější stahování dat z foťáku/GPS/… Slot je totiž poměrně obtížně přístupný (zezadu, notebook je potřeba prakticky zavřít)
  • Menší touchpad (díky HW tlačítkům). Tlačítka sice nepoužívám, takže se mi zmenšuje využitelná plocha, nicméně jinak touchpad působí příjemněji – při “prokliku” nedělá takový nepříjemný hlučný cvak, jako T440s, spíš je to mělké kliknutí ála Macbook.
  • Šasi působí stejně bytelně jako T440s, i když zde bude nejspíš ušlechtilejší materiál (carbon). Na první pohled není zřetelný rozdíl.
  • Absence VGA D-SUB portu je vynahrazena plným HDMI (miniDP zůstává). Objednal jsem si jako nutnost HDMI-to-VGA redukci, nicméně jenom praxe ukáže, jak často bude potřeba.
  • Absence RJ-45 je suplována přiloženým OneLink+ adaptérem. V praxi RJ-45 využívám řídce a problém to snad nebude.
  • Hmotnost kolem 1,2kg je hodně příjemná. Denně vozím notebook do práce a z práce v batohu na kole, takže každé deko dolů se hodí.
  • Windowsí indikátor baterie hlásí při plném nabití výdrž něco přes 7hod, u nové T440s to bylo tuším něco přes 6 hodin. Pro výměnu baterie je potřeba demontáž šasi.
  • Notebook (zejm. Visual Studio coding) je subjektivně svižnější, částečně to samozřejmě může být způsobeno čistou instalací. Procesor je papírově rychlejší o cca 15%.
  • SSD se identifikuje jako SanDisk SD7SN6S512G1001X, v Samsung Magicianu točí cca 440 MB/s read a 340 MB/s write. V T440s byl nějaký Samsung, který točí 510 MB/s read a tuším 200 MB/s write.
  • Hlučnost (při zátěži) je subjektivně stejná, X1 nemá výdechy do boku, ale jen dolů, takže bude asi více topit do stehen a položený na stole bude asi horší odvod tepla. Zajímavé je, že “područky”, resp. místa vedle touchpadu, kde se dotýkají zápěstí, jsou minimálně na první dojem subjektivně zřetelně chladnější, než T440s. Přesněji řečeno jsou z počátku vyloženě studená, což by mohlo být důsledkem různého materiálu s jinou tepelnou vodivostí.
  • Mobile broadband vypadá velmi slibně. Na LTE mi tu na horách točí 34/30 Mbps, což na T440s s “pouhým” 3G nehrozilo.
  • WiFi se zdá mít lepší příjem než T440s. Pokud pracuji na zahradě, WiFi konektivita je použitelná, zatímco s T440s jsem na stejném místě byl už na hraně funkčnosti.
  • Napájecí adaptér má X1 o maličko větší (65W) oproti T440s (tuším 45W). Na rozdíl od T440s je u něj měkčí a trochu subtilnější napájecí kabel. Naštěstí ho sebou nosím spíše výjimečně.
  • Reproduktorky jsou více než symbolické. T440s dokázala poměrně nečekaně dobře zvučit, X1 je chrastítko pro smích. Používám naprosto minimálně a netrápí mě to, ale je to zřetelné na první přehrání.
  • Dock OneLink+ je příjemný, na stole tolik nepřekáží a manipuluje se s ním snadno. Oproti klasickému pokládacímu docku je to takový hub připojený kabelem (integruje i napájení). Řeším jen dilema, jestli nechávat notebook v připojení na dock zavřený, ale chybí mi pak pohodlí čtečky otisků prstů, která zůstane nepřístupná.

Po 10 dnech tedy zatím nelituji, i když zásadní rozdíl oproti T440s to není.

MSDeploy Error: Unexpected end of file occured. The following elements are not closed: results.

Stává se mi to při nasazování webových aplikací s MSDeploy opakovaně a vždy mi chvíli trvá, než mi dojde, čím to je:

clip_image002

na vině je jinak bezvadný Fiddler. Pokud ho vypnu, vše začne fungovat.

Azure 4-mins Idle Connection Timeout a jak se s ním vypořádat

Jedna z našich aplikacích migrovaných do Azure začala slavit neúspěchy při volání externí SOAP webové služby – System.Net.WebException: The operation has timed out at… Konkrétně se jednalo o WebJob pro synchronizaci master-dat s ERP systémem zákazníka a pozoruhodné na tom bylo, že z mnoha volaných služeb ERP padala jedna jediná.

Záhy se navíc ukázalo, že volání služby padá pouze z prostředí Azure, volání stejné služby z vývojářského i našeho původního on-premise produkčního prostředí fungovalo. Potvrdilo se to nejenom úspěšným voláním stejné služby z non-Azure prostředí, ale i neúspěšným voláním stejné služby z virtual machine založené pro účely testu v Azure (pro toto se výborně hodí Azure kredit, který je součástí každého MSDN předplatného).

Po chvilce zamyšlení a další chvilce Googlení, se potvrdila hypotéza, že Azure uplatňuje na síťovou komunikaci určité restrikce, zde konkrétně 4-min connection idle timeout a volané webové službě trvalo 5 minut, než nám data z ERP naservírovala. Limit se projevuje a nejenom u příchozích spojení, ale i u spojení odchozích a je potřeba se s ním vypořádat.

Zatímco u příchozích spojení se dá limit konfigurovat na Load Balanceru, u odchozích spojení se předpokládá, že se s ním vypořádáte sami. Principiálně jde totiž o to, že je potřebovat udržovat nějakou aktivitu spojení.

Řešení se nabízí pro různé situace mnoho (např. připravené WCF Azure Net.TCP Keep Alive – net.tcp služba, která periodicky posílá keep-alive signál), v zásadě však většinou není potřeba sahat k ničemu komplikovanému a stačí využít vestavěný keep-alive TCP, který lze v .NET konfigurovat přes ServicePoint.SetTcpKeepAlive(..), resp. ServicePointManager.

Buď můžeme keep-alive konfigurovat globálně pro všechna TCP spojení:

ServicePointManager.SetTcpKeepAlive(true, 5000, 5000);

Nebo nastavení omezit na konkrétní protistranu:

var servicePoint = System.Net.ServicePointManager.FindServicePoint(new Uri(targetWebServiceUrl));
servicePoint.SetTcpKeepAlive(true, 30000, 30000);

Python (update 09/2018)

Pokud máte projekt v Python, pak meducína vypadá takto (Credits datasentics.com):

import socket
from requests.packages.urllib3.connection import HTTPConnection
HTTPConnection.default_socket_options.append((socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1))

 

Instalace SQL Server 2016 (Express) LocalDB

SQL Server 2016 RTM, na rozdíl třeba od své RC0, již ve svém hlavním instalátoru nenabízí check-box na instalaci LocalDB, přesněji řečeno “někdy nabízí, někdy nenabízí”. Zřejmě podle toho, jestli už na stroji něco nachází, nebo ne. Každopádně doinstalaci provedete samostatným instalátorem, který je na SQL Server DVD:

<dvd>:\1033_ENU_LP\x64\Setup\x64\SqlLocalDB.msi

PS: Při instalaci SQL Serveru 2016 Express by měl být checkbox LocalDB ve fázi Feature Selection, ale ani na Expressu se mi nenabízel.