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.

Reclame

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.