Visual Studio Code în Elementary OS

Visual Studio Code este editorul de cod cross-platform de la Microsoft, gratuit și destul de bunicel. Pachetul DEB cu Visual Studio Code a mers instalat ca uns:

sudo apt install code_<version.number>_amd64.deb

Însă nu merg serviciile Roslyn de in-memory compilation, ceea ce afectează code-completion. Din fericire, mesajul de eroare este unul destul de clar:

[ERROR] Could not locate an OmniSharp server that supports your Linux distribution.

OmniSharp provides a richer C# editing experience, with features like IntelliSense and Find All References.
It is recommend that you download the version of OmniSharp that runs on Mono using the following steps:
 1. If it's not already installed, download and install Mono (https://www.mono-project.com)
 2. Download and untar the latest OmniSharp Mono release from https://github.com/OmniSharp/omnisharp-roslyn/releases/
 3. In Visual Studio Code, select Preferences->User Settings to open settings.json.
 4. In settings.json, add a new setting: "omnisharp.path": "/path/to/omnisharp/OmniSharp.exe"
 5. In settings.json, add a new setting: "omnisharp.useMono": true
 6. Restart Visual Studio Code.

Așa că, tot ce-am făcut după ce-am descărcat OmniSharp, a fost să-l despachetez și să urmez apoi ceilalți pași indicați:

sudo mkdir /opt/OmniSharp-1.9-beta18/
tar -xa -C /opt/OmniSharp-1.9-beta18/ -f ~/Downloads/omnisharp-mono.tar.gz

Atât.

Client TFS în Elementary OS

Cum decretele mele regale  sunt luuungi, mi-am luat lângă tron un laptop mai vechi pe care am instalat un Linux, în ideea că oricum nu-l voi folosi decât la browsing. Am ales Elementary OS ca distribuție, pentru că este îngrijit fățuită; pleacă de la Ubuntu, e încă în beta, dar începe să-mi placă mult.

La un moment dat, am vrut să mai scriu o linie-două de cod la proiecțelele mele. Cu cele ținute în GIT repositories, treaba a mers simplu, însă aveam unele plasate și în Team Foundation Server sau Services, pe Visual Studio Online.

Hai, lasă vorba…

Există un client de TFS pus la dispoziție de Microsoft – Team Foundation Everywhere; merge pe Linux, dat are nevoie de Java ca dependință.

Ca să instalez Java, trebuia să adaug locația de unde se instalează, cu add-apt-repository, însă add-apt-repository nu este inclus implicit cu Elementary OS mai nou, din rațiuni de securitate, zic ei. Așa că:

sudo apt install software-properties-common

ca să am acces apoi la add-apt-repository. Ca paranteză prefixul sudo este pentru rularea comenzii ca administrator. Am continuat cu

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default
java -version

De-acum putem descărca Team Foundation Explorer TEE-CLC-14.0.3.zip (asta era versiunea curentă când am scris articolul). Am dezarhivat și eu ZIP-ul la

/opt/TEE-CLC-14.0.3/

Apoi am creat în directorul home un fișier .bash_aliases în care am scris două shortcut-uri

alias tf='/opt/TEE-CLC-14.0.3/tf'
alias tfl='/opt/TEE-CLC-14.0.3/tf -login:<Username.Je>,<ParolaMea> -server:https://<serverName>/tfs/<TeamProjectCollectionName>'

și-apoi, ca să funcționeze, am și dat

source .bash_aliases

Bun-bun, am instalat TFS în Linux. Cum folosesc?

Înainte de-a folosi tf get și tf checkin, trebuie să-ți configurezi un workspace pe stație și să-l mapezi la un folder local. Cum? Am pornit și eu de la comenzile TF documentate pe site-ul Microsoft MSDN.

Întâi mi-am creat un folder local unde să mapez ce se află pe serverul TFS. Ca notație, am zis:
Nume.Folder.Local = TFS_<Nume.Server.TFS>_<Nume.TeamProjectCollection>.

~/<Nume.Folder.Local>

Apoi, am creat un workspace pe stația locală, având numele de forma:
Nume.Workspace = <Nume.Server.TFS>_<Nume.TeamProjectCollection>.

tf workspace -new <Nume.Workspace> -computer:<Nume.Laptop> -comment:"Bla-bla-bla" -collection:https://server.name.ro/tfs/collection-name/ -login:<Nume.Utilizator>,<parolaMea>

De verificare, pot lista spațiile,

tf workspaces

sau le pot șterge

tf workspace -delete <Nume.Workspace> -login:<Nume.Utilizator>,<ParolaMea> -collection:https://server.name.ro/tfs/collection-name/

Și continuăm – mapez un folder de pe serverul TFS (chiar rădăcina) la un folder local:

tf workfold -map $/ ~/<Nume.Folder.Local> -collection:https://server.name.ro/tfs/collection-name/ -workspace:<Nume.Workspace> -login:<Nume.Utilizator>,<ParolaMea>

Din acest moment, pot aduce codul de pe serverul TFS în folderul local:

cd ~/<Nume.Folder.Local>tf get -login:<Nume.Utilizator>,<ParolaMea>

iar după editarea fișierelor, le urc pe server cu

tf checkin -login:<Nume.Utilizator>,<ParolaMea>

De cele mai multe ori, nu am nevoie de intervenții pentru rezolvarea conflictelor de editare, că io lucrez singur. Dar la nevoie, consult pagina de referință cu comenzile tfTeam Foundation version control commands.

Web Deploy: No executable found matching command „dotnet-bundle”

Făcui o aplicație ASP.NET Core 1.0. Dau s-o public cu Web Deploy pe un server de test, după ce-am văzut că dotnet restore, dotnet build și dotnet run merg ca unse pe stația mea.  Moment în care, ce să vezi, primesc eroarea din titlu. Scuipați, înjurături… dar până la urmă tot căutarea pe DuckDuck.go m-a salvat.

Cică să pui în fișierul project.json al aplicației, la secțiunea tools, un „BundlerMinifier.Core”: „2.0.281”:

BundlerMinifier în project.json

Web Deploy, Error: The remote certificate is invalid according to the validation procedure

Făcui o aplicație ASP.NET Core 1.0. Și-am zis s-o pun la mine pe serverul de dezvoltare unde am configurat treburile să pot publica cu Web Deploy.

Am creat profilul în Visual Studio, am dat publish via Web Deploy… moment în care, ce să vezi, primesc eroarea din titlu.

Noroc că în Solution Explorer am remarcat un nou fișier publish-module.psm1, în care să-mi bag holbanii:

solution-explorer

Și văd acolo o linie spunând Allow Untrusted Certificate = false. Știu că ar fi trebuit să mă joc cu certificatele digitale, cu cel de pe serverul IIS destinație implicat în conexiunea securizată Web Deploy… Într-un mediu de producție nu m-aș juca cu securitatea. Dar până la urmă, ce să fac?… Voiam doar să testez aplicația, în mediu de dezvoltare. Repede și murdar, am editat ca mai jos:

'AllowUntrustedCertificate' = $true

allow-untrusted-certificate

Apoi totul a mers ca uns, deh.

Lucrul pe un Windows Nano Server

Am reușit, după 3 zile, să instalez Nano Server pe o mașină fizică așa cum voiam eu, adică să nu booteze de pe un VHD, ca în demo-urile de pe Web, ci de pe discul C.

Consola mi-a arătat IP-ul mașinii fizice și numele în domeniu. Deci m-am putut duce la stația mea să mă conectez cu PowerShell Remoting la noua jucărie. Înainte de conectare, e util să declari că mașina de la distanță e de încredere:

Set-Item WSMan:\LocalHost\Client\TrustedHosts NanoServerTests
alternativ și cu mai multe mașini de încredere la care să te conectezi remote
Set-Item -Path WsMan:\LocalHost\Client\TrustedHosts -Value "NanoTest,NanoLive,NanoIIS,NanoContainers"

Comanda de mai sus se rulează din PowerShell as Administrator. Celelalte comenzi nu mai necesită drepturi elevate:

Get-Item WSMan:\LocalHost\Client\TrustedHosts    (verifici dacă te poți conecta la o anumită mașină remote)
Enter-PsSession -ComputerName NanoServerTests -Credential "NanoServerTests\Administrator"
... aici comenzi PowerShell către mașina remote ...
Exit-PsSession

Prima linie mai sus este de verificare, nu este necesară.

Cum creez un stick USB bootabil pentru instalare Windows

Cu DiskPart din Windows în linie de comandă manpulezi discuri fizice, partiții, volume sau discuri logice. DiskPart este o sculă cu potențial: poți să-ți bulești datele rapid și fără prea multe avertismente. Trebuie să știi ce faci. Dacă nu te documentezi, cu DiskPart ți-o poți trage singur pe la spate, operație care-n IT se poate întâmpla cu atât mai des cu cât devii mai geek. Eu am făcut-o de un număr de ori 🙂

Avertizarea fiind expusă… Scurt:

  1. Se ia o consolă în linie de comandă, un CMD ca Administrator
  2. Rulezi DiskPart.exe ca Administrator. Apoi în diskpart:
  3. > list disk
    (ca să vezi discurile fizice, să nu cumva să operezi pe ce nu trebuie)
  4. > select disk
    (pui focusul pe un anumit disc fizic; în cazul ăsta, selectezi stickul USB)
  5. > clean
    (adică un erase partitions, cu toate datele; dacă ai selectat vreun hard-disk la pasul anterior… ăsta e pasul în care ai pierdut toată colecția ta de poze cu gagici)
  6. > create partition primary
    (pentru că nu specifici parametrul size, partiția va ocupa tot spațiul liber de pe discul fizic; în cazul ăsta, tot stick-ul USB)
  7. > select partition
    (pui focus pe partiția abia creată)
  8. > active
    (ăsta e pasul în care o faci bootabilă; declari că de pe ea se poate descărca un sistem de operare)
  9. > format quick
    (dacă nu specifici parametrul fs, se va folosi sistemul de fișiere recomandat pentru acest disc; pentru stick-uri, va fi FAT sau FAT32 pentru alea mai mari de 4GB)
  10. > exit
    (ca să ieși din diskpart)
  11. copiere fișiere sistem de operare pe stick
    (de obicei, montez ISO-ul cu Windows – dau dublu-click pe el – apoi din discul montat copiez fișierele pe stick)

DiskPart e mult mai deștept de-atât. Documentația DiskPart pe site-ul MSDN poate lămuri.

Microsoft SQL Local DB

După ce m-am jucat un pic cu SQLite, mi-am zis să mă întorc la SQL Server cu care sunt mai obișnuit. Bă, frate, dar mi-era o mare lene să instalez ditamai SQL Server Express cu Management Console… Plus că ocupă cu totul peste 1 GB din spațiul și-așa prețios al SSD-ului.

Bifa necesară ca să instalezi SQL Server Express LocalDB odată cu Visual Studio 2015
Bifa necesară ca să instalezi SQL Server Express LocalDB odată cu Visual Studio 2015

Mi-am amintit că Visual Studio obișnuia să instaleze implicit un SQL Server Express. Ei bine, se pare că Visual Studio 2015 Community de acum nu mai instalează chiar toată ediția gratuită Express, ci un frățior mai mic al lui, SQL Server Express LocalDB – ăsta face cam aceleași lucruri, dar cred că ocupă doar vreo 250 MB cu dependințele lui. LocalDB e instalat numai dacă bifezi Microsoft SQL Server Data Tools în timpul instalării Visual Studio (eu a trebuit să dau Change pe Visual Studio din Control Panel la Programs, Programs and Features).

În fine, odată ce-am avut SQL Server LocalDB instalat pe sistem, am început să dau de niște probleme: eu eram obișnuit cu SQL Server Management Console ca să atașez/detașez bazele de date, să fac restaurare dintr-un backup etc. Dar cum lucrezi cu LocalDB?

Visual Studio se pare că dă drumul singur unei instanțe de SQL Server Local DB. Cum am dat de ea? Deschid Visual Studio, meniu, View, SQL Server Object Explorer, expandezi SQL Server. Cu click-dreapta pe instanța (localdb)\MSSQLLocalDB poți porni un New Query… ca să vorbești cu serverul.

Ca o paranteză, există și un mic instrument numit SqlLocalDB.exe cu ajutorul căruia poți manipula trebile. De exemplu, poți da drumul unei noi instanțe de SQL Server Express LocalDB. Documentația SqlLocalDB e pe MSDN. Implicit, SqlLocalDB.exe se pune pe disk:

C:\Program Files\Microsoft SQL Server\120\Tools\Binn

Captură ecran SqlLocalDB.exeBuuun… Acum că am serverul, cum manipulez bazele de date?

Se pare că SQL Server Object Explorer din Visual Studio nu este la fel de puternic ca SQL Server Management Console. Nici pe departe. Multe din operații se fac cu comenzi Transact-SQL. Sigur, crearea unei noi baze de date este simplă, dar atașarea uneia existente e mai complicată.

M-am dus pe CodePlex.com să găsesc bazele de date Northwind și AdventureWorks – ambele sunt baze de date exemplu, făcute pentru experimentări sau training. Am descărcat și am pus și eu fișierele bak la

D:\Database\Backup\

Apoi, într-o fereastră de query din Visual Studio… (ziceam mai devreme: cu click-dreapta pe instanța (localdb)\MSSQLLocalDB afișată în SQL Server Object Explorer, poți porni un New Query… ca să vorbești cu serverul):

RESTORE FILELISTONLY FROM DISK = 'D:\Database\Backup\Northwind.bak'

Aflu care sunt fișierele logice ale bazei de date și unde se așteaptă serverul să găsească fișierele fizice pentru ele. Cum însă eu nu voi pune fișierele fizice tot acolo…

RESTORE DATABASE Northwind
  FROM DISK = 'D:\Database\Backup\Northwind.bak'
    WITH
      MOVE 'Northwind' TO 'D:\Database\Northwind.mdf',
      MOVE 'Northwind_log' TO 'D:\Database\Northwind.ldf'

Baza de date Nothwind a fost făcută pentru o versiune mai veche de SQL Server, așa că se face și un upgrade al ei, nu doar restore din backup…Fereastra SQL Query cu RESTORE la Northwind

Iar dup-acum, treaba mi-e deja familiară:

USE Northwind    -- Intrăm în baza de date Northwind
go
SELECT * FROM Customers    -- Listăm dintr-o tabelă
go

Îmi lipsește acum doar un string de conectare la baza de date, pe care să-l folosesc în aplicația mea. Dacă dau click-dreapta pe baza de date și aleg Properties, găsesc și un Connection string de genul…

Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Northwind;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False

Însă uneori ăsta trebuie schimbat – trebuie să-i spui serverului să atașeze baza de date din fișierele e fizice de date și log (fișierele .mdf și .ldf) la pornirea aplicației. Aici însă, dau de niște probleme cu drepturile de acces. Poate o lămuresc într-o postare mai târziu.

SQLite, footprint minuscul pentru baze de date în aplicații

Citisem mai demult câteva rânduri despre SQLite, dar nu știam mai nimic de el. Când am primit comanda pentru o aplicație foarte simplă de afișat niște date, am zis să fac o incursiune.

Scula este foarte cool. Este mică și rea ca un șot de palincă pe burta goală. E rea, da’ bună. În 3 MB încap aplicația în linie de comandă pentru manipularea bazei de date și DLL-ul pentru accesarea bazelor de date din aplicațiile tale. Ca să te joci cu baze de date, să interoghezi și să manipulezi niște înregistrări, nu trebuie să instalezi nimic: EXE-ul merge out-of-the-box. Nu-ți trebuie licență că este „public domain” și suportă o droaie de platforme. Io m-am bucurat să văd că există o implementare și pentru .NET Core, descărcabilă cu Nuget, care merge șnur pe aplicații ASP.NET 5 / MVC 6. În fine… aproape șnur.

Însă…

SQLite nu este un server de baze de date. Este o bibliotecă, cu ceva scule, pentru manipularea unor fișiere tip bază de date, folosind SQL ca limbaj de interogare. Este foarte performantă, și ușor de înglobat într-o droaie de aplicații și platforme, având footprint foarte mic. Dar a trebuit să sacrifice unele funcționalități pentru asta.

Venind din lumea SQL Server, primele bariere de care m-am lovit au fost:

  • Nu suportă proceduri stocate. Dacă ai cod ceva mai complex, trebuie să-l pui hard-coded în aplicație. Sau să citești fișiere de pe disc cu comenzile de executat.
  • Nu suportă variabile, tocmai pentru că este o bibliotecă, nu un server. Nu poți zice un

DECALARE @variable INTEGER
SET @variable = 1234

La un moment dat trebuia să inserez o înregistrare doar dacă nu exista ceva similar deja (puneam un flag în dreptul unei persoane numai dacă nu-l avea deja). Cum nu mergea să folosesc EXISTS pentru că n-am găsit IF, am ajuns la o construcție de genul scărpinat cu mâna dreaptă-n urechea stângă:

INSERT INTO Person_Flags(Person_ID, Flag_ID)
SELECT @PersonID, @FlagID
WHERE NOT EXISTS
(SELECT * FROM Person_Flags WHERE Person_ID = @PersonID AND Flag_ID = @FlagID);

Windows Nano-Server 2016

Nano-Server este o opțiune de instalare a Windows Server, cam cum era Core-Server încă din versiuni precedente. Este însă mult mai „rău” decât Core installation. E mic și rău. E headless; adică nu doar că nu mai are interfață grafică – nu are nici măcar consolă de login. Se accesează și se administrează doar remote: de exemplu, prin PowerShell Remoting. Deci trebuie să învăț PowerShell…

Dar iată și veștile bune. O instalare curată avea cca 600-700 MB, cu rolul de Hyper-V în el și ceva drivere; am reușit să-l instalez într-o mașină virtuală pe vremea versiunii beta Windows Server 2016 Technology Preview 2. E cam de 10 ori mai mic decât o instalare de Windows Server „clasică”. Bineînțeles că necesită mult mai puține patch-uri, mult mai puțin RAM și are o suprafață de atac mult mai mică. Se pare că Azure se va baza din greu pe Nano-Server.

Nano-Server nu se instalează așa cum ne-am obișnuit. Se generează o imagine în care injectăm rolurile, driverele… și cu acea imagine dăm drumul mașinii. Neavând consolă, n-ai cum să dai next-next-next. Nu poți nici măcar să pui tastatură la mașina respectivă, așa de „cheală” instalarea. Așa că se apucă Pingu – iarăși – să construiască o imagine de Nano-Server…

The specified module 'NanoServerImageGenerator.psm1' was not loaded because no valid module file was found in any module directory

Nici n-am apucat bine să parcurg pașii din pagina TechNet cu instrucțiuni, c-am și dat de duda de mai sus la rularea comenzii…

Import-Module NanoServerImageGenerator.psm1 -Verbose

Numele fișierului cu modulul PowerShell trebuie prefixat cu calea relativă spre el:

Import-Module .\NanoServerImageGenerator.psm1 -Verbose

Nano Server ca mașină virtuală

Lucrurile au mers ușor cu generarea (și rularea) unei imagini de Nano Server în mașină virtuală. Am generat mai întâi imaginea VHDX, conform instrucțiunilor din pagina TechNet. Acolo ei zic c-ar fi nevoie de VHDX în loc de VHD pentru boot UEFI:

New-NanoServerImage -MediaPath "E:\Temp\Windows Server 2016 Beta 4\" -BasePath .\Base -TargetPath .\Virtual-Machine\NanoServer-IIS.vhdx -ComputerName Pingu-VM2 -DomainName Contoso.com -GuestDrivers –EnableRemoteManagementPort –ReverseForwarders -Packages Microsoft-NanoServer-IIS-Package

Notă: Un pic de atenție la acel EnableRemoteManagementPort. Fără el, se pare că nu te poți conecta cu PowerShell Remoting la mașina virtuală, deși consola de recovery afișează că ar fi reguli în firewall setate bine-merci și activate pentru portul de WinRM.

Odată pornită mașina virtuală direct cu VHD-ul generat ca disk C:, am putut vedea ce IP și-a tras din DHCP. Apoi m-am putut conecta cu PowerShell la ea:

Set-Item WSMan:\LocalHost\Client\TrustedHosts Pingu-VM2
Get-Item WSMan:\LocalHost\Client\TrustedHosts
Enter-PsSession -ComputerName Pingu-VM2 -Credential "Pingu-VM2\Administrator"
Exit-PsSession

Prima din comenzile de mai sus înțeleg că este opțională pentru mașini aflate în același domeniu. Dar e de reținut că se rulează ca Administrator. A doua comandă e doar de verificare. Asta pentru că setarea TrustedHosts pare să țină minte o singură stație la un moment dat; dacă treci pe sesiune PowerShell Remoting către altă mașină, trebuie să schimbi TrustedHosts.

Nano Server pe o mașină fizică

Noroc cu colegii de la IT care mi-au dat un server mai vechi, retras la pensie, pentru a testa și instalarea asta. Recunosc că mi-am prins urechile la instalarea pe mașina fizică – pentru că nu ai un program de instalare iar instrucțiunile din pagina TechNet nu sunt foarte clare. Nu ți se spune cum să „copiezi” VHD-ul generat cu Nano Server pe un disc fizic ca să bootezi de pe el. Iată.

Pasul 1: Generare VHD cu Nano Server pentru mașina fizică

Comanda conform instrucțiunilor din pagina TechNet:

New-NanoServerImage -MediaPath "E:\Temp\Windows Server 2016 Beta 4\" -BasePath .\Base -TargetPath ".\Physical-Machine\NanoServer-HyperV.vhd"  -DomainName Contoso.com -ComputerName NanoServerTests -ReuseDomainNode -OEMDrivers -Compute –EnableRemoteManagementPort

Notă: Am folosit un parametru nedocumentat pentru introducerea mașinii în domeniu ReuseDomainNode. Pentru că nu mi-a ieșit din prima să fac mașina fizică cum voiam 🙂

Pasul 2: USB stick bootabil

Știam procedura de creare a unui stick USB bootabil, dar mie-mi trebuia un mediu spartan în linie de comandă cu care să aplic Nano Server pe mașina fizică, nu tot kitul de Windows. Așa că am apelat la Windows Recovery:

Pe stația mea Windows 10, Start, Recovery din Control Panel, apoi Create a recovery drive cu stick-ul meu USB de 2 GB.

Odată făcut stick-ul bootabil, tot pe el am pus și VHD-ul cu Nano Server – fișierul NanoServer-HyperV.vhd generat la pasul 1.

Pasul 3: Înfigem imaginea de Nano Server în mașina fizică

Configurai cu chiu cu vai RAID-ul pe server. Greu. Că nu mă pricep. Noroc cu colegii de la IT. Am bălmăjit eu ceva acolo… Cert e că odată pornită mașina fizică de pe stick-ul USB, ajuns în linia de comandă, știam că am 2 discuri „fizice” (adică atât dezvăluia controllerul RAID pentru nivelele de mai sus, că „feroneria” avea mult mai multe discuri fizice „pe bune”). Și tastează Pingu vajnic:

X:\Windows\System32> WpeInit
X:\Windows\System32> DiskPart
> list disk    (să văd discurile "fizice")
> select disk 0    (sau discul fizic pe care voiam să pun discul C, de unde bootez Windows)
> clean    (șterge partițiile de pe discul selectat, cu toate datele, normal; deci mare atenție)
> create partition primary size=512    (o partiție mică de 512 MB,o va folosi Windows-ul la boot, dar va fi pitită)
> list partition    (doar de verificare, listez partițiile)
> select partition 1    (în condițiile date, asta ar fi partiția abia creată pentru boot)
> format quick fs=ntfs    (formatez partiția proaspăt creată și selectată cu NTFS)
> active    (de pe ea se va boota)
> create partition primary    (pentru că nu am specificat size, tot restul discului fizic selectat e folosit; aici voi pune discul C:)
> format quick fs=ntfs    (formatez rapid partiția ce va deveni discul meu C:)
> assign letter=C    (e clar)
> list volume    (ca să văd și io cum sunt mapate discurile fizice, ce literă are stick-ul USB)
> exit    (ies din diskpart, c-am făcut partițiile necesare)

La acest moment, știu, de exemplu, că stick-ul meu USB e pe litera D. Cu DiskPart.exe, folosind list volume, select volume și assign letter=<x> pot asigna ce litere vreau eu partițiilor create sau existente. Mă ajută să nu încurc comenzile ulterioare.

Acum copiez VHD-ul cu imaginea Nano Server pe discul C ca să-l pot monta.

X:\Windows\System32> Copy D:\NanoServer.vhd C:\
X:\Windows\System32> DiskPart
> select vdisk file=C:\NanoServer.vhd    (pun la cale disc virtual...)
> attach vdisk   (îl montez...)
> list volume    (și văd că la mine a căpătat litera E:)
> exit

Acum, ținând minte că imaginea mea cu Nano Server pentru mașina fizică e pe discul E:, cum determinai mai sus, aplic imaginea pe mașina fizică cu bcdboot:

X:\Windows\System32> E:
E:\> xcopy E:\ C:\ /h /k /o /r /e    (copiez tăt ce e în VHD-ul cu Windows pe C, cu atribute, drepturi, structura de directoare...)
E:\> C:
C:\> cd Windows\System32
C:\Windows\System32> BcdBoot C:\Windows    (recunosc că ăsta nu știu exact ce face, am doar o idee vagă c-ar seta să booteze Windows-ul de aici la startup)
C:\Windows\System32> diskpart
> select vdisk file=C:\NanoServer.vhd    (focus pe VHD-ul montat mai sus)
> detach vdisk    (nu mai am nevoie de VHD, îl de-montez)
> exit    (ies din diskpart, c-am demontat VHD-ul, scot discul E:)
C:\Windows\System32> del NanoServer.vhd    (nu mai am nevoie de el, ocupă spațiu degeaba)
C:\Windows\System32> exit

La acest moment, am ieșit iar în mediul de recovery al Windows 10. Și-am dat reboot mașinii fizice. Succes. Mi-a apărut consola Nano Server, afișând adresa IP a mașinii. Cu asta, mă pot conecta via PowerShell Remoting ca să continui

The ‘name’ model does not exist in the current context

Parcursesem toți pașii pentru upgrade-ul unui proiect de la ASP.NET MVC 4 la ASP.NET MVC 5.

Și totuși, când încărcam un View pentru editare, IntelliSense pentru directiva @model tot dădea eroarea asta: The ‘name’ model does not exist in the current context.

Dar cel mai deranjant era că auto-formatting-ul din Visual Studio îmi bulea codul Razor.

Și toate astea pentru că uitasem o chestie foarte mică:

Final Steps

Remove the MVC 4 project type GUID from the project files.

  1. In Solution Explorer, right-click the project name and then select Unload Project.
  2. Right-click the project  and select Edit ProjectName.csproj.
  3. Locate the ProjectTypeGuids element and then remove the MVC 4 project GUID, {E3E379DF-F4C6-4180-9B81-6769533ABE47}.
  4. Save and close the open project file.
  5. Right-click the project and select Reload Project.