Primul live Meeting

A fost primul live meeting al meu – am vorbit despre ASP.NET MVC. A fost destul de ciudat sa vorbesc la pereti si sa nu aud pe nimeni … dar sper ca a fost ok dupa citeva aaa-uri. Prezentarea a durat 50 de minute si am vorbit despre:

  1. De ce e bine sa faci un site cu MVC
  2. Probleme cind pui un nou design
  3. Cum faci debug la rute
  4. Cum interceptezi erorile
  5. De ce nu e bine sa ai ViewData

Multumesc lui Petru pentru oportunitate si sprijin tehnic/material/anunt

Inregistrarea  o gasiti  la http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032408740&EventCategory=5&culture=ro-RO&CountryCode=RO iar prezentarea o gasiti aici http://serviciipeweb.ro/iafblog/content/binary/ASPNETMVC.pdf.zip

Va astept probleme / sugestii / reclamatii / comentarii  …

(Oh – si asta e un motiv pentru care tutorialul de .NET 3.5 nu a mai continuat … dar promit sa continui  – dupa ce imi trag rasuflarea…)

Portarea unei aplicatii de la ASP.NET 1.1 la ASP.NET MVC

Dupa cum a scris Petru aici si aici , o sa tin o prezentare  LiveMeeting ( trebuie sa il instalati!) despre marota mea – www.infovalutar.ro portat la ASP.NET MVC

O sa aiba tips and tricks si problemele uzuale de care m-am lovit.

Va astept aici http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032408739&EventCategory=4&culture=ro-RO&CountryCode=RO

Schimb de date cu VHD

In Virtual PC e extraordinar de simplu – instalezi VM additions – si gata!

In Hyper-V Manager e mult mai complicat – si mai abscons . Stiu ca scrie in toate site-urile, dar sa mai scriu si eu odata, pentru ca e o schimbare(in minus!) fata de Virtual PC.

Ca sa te conectezi la un disk local , trebuie sa il treci offline ( naspa !) sau sa folosesti metoda 2:

Inchizi masina virtuala –

rulezi acest vbs din command prompt cu DREPTURI DE ADMINISTRATOR! (click dreapta, run as administrator )

Option Explicit

Dim WMIService
Dim VHDService
Dim VHD

VHD = "<cale catre VHD>”

‘Get instance of ‘virtualization’ WMI service on the local computer
Set WMIService = GetObject("winmgmts:\\.\root\virtualization")

‘Get the MSVM_ImageManagementService
Set VHDService = WMIService.ExecQuery("SELECT * FROM Msvm_ImageManagementService").ItemIndex(0)

‘Mount the VHD
msgbox VHDService.Mount(VHD)

‘unmount => VHDService.UnMount(VHD)

 

Apoi pe diskul local copiezi datele …

Probleme cu Virtualizare

Am virtualizat online o masina  cu Microsoft System Center Virtual Machine Manager 2008 . A fost OK, cu exceptia faptului ca isi instaleaza un programel pe masina ca sa faca virtualizarea pe care il dezinstaleaza dupa aceea. Normal ca am facut-o la 19:00 , ca sa nu mai fie nimeni in firma si sa pot virtualiza cu succes.

Perfect, virtualizarea a mers, VHD-urile s-au creeat (cite una pentru fiecare hard disk – foarte cool!)  Am verificat o aplicatie(sa ii zicem ERP) care era acolo – cu  ERP client si ERP administrator de pe masina mea… si a mers OK.

A doua zi de dimineata nu mergea facturarea … Eu eram in metrou – vorbesc cu sefa ( care era acasa, ziua ei libera )si imi spune ca nu poate intra in ERP client si nici ERP administrator. Luam hotarirea sa restartam masina – si tot nu merge.

Ajung intre timp la birou – si ma uit in Event Viewer. In application nimic, dar in System droaie de iconite rosii, printre care 99% cu textul :

Event Type:    Error
Event Source:    SideBySide

Description:
Resolve Partial Assembly failed for Microsoft.VC80.ATL. Reference error message: The referenced assembly is not installed on your system.
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

Durere …

S-a rezolvat cu instalarea a VC++ 2005 redistributable http://download.microsoft.com/download/e/1/c/e1c773de-73ba-494a-a5ba-f24906ecf088/vcredist_x86.exe

Morala : Cind se instaleaza si se dezinstaleaza un program, verifica aplicatiile critice de pe masina respectiva DUPA UN RESTART!

Infovalutar si erori cursuri

Infovalutar a plecat de la idee – pe vremuri nu exista posibilitatea sa preiei programatic cursurile BNR ( acum exista – si mai multe…). L-am facut ca sa preia cursurile de pagina HTML (multumesc , Ionut! Pe unde mai esti?)

Intre timp site-ul s-a modificat – si pusesem intre timp sa poata fi preluat cursul prin mai multe metode (WebService, url de forma http://infovalutar.ro/2009/3/10/EUR.bnr , Google si multe altele) , precum si sa preia si cursurile Bancii Centrale Europeene

Problema a aparut cind BNR si- a schimbat site-ul – si, desi pusesem sa preia si de la

http://www.bnro.ro/nbrfxrates.xml , totusi a avut o eroare  – nu stiu de ce. Am facut modificarile in aceeasi seara – si l-am pus sa ia si de la  http://www.bnro.ro/nbrfxrates.xml  si de la http://www.bnro.ro/files/xml/curs10.3.2009.xml .

De aici a pornit problema : cursul a venit inmultit cu 10.000 ! Am modificat rapid in BD … dar raul fusese facut, emailurile pornisera, oamenii vazusera cursurile …

Investigind, am vazut de unde era problema : la http://www.bnro.ro/nbrfxrates.xml  valorile sunt separate prin PUNCT, la http://www.bnro.ro/files/xml/curs10.3.2009.xml  sunt separate prin VIRGULA!

Eu zic ca am reparat greseala (System.Globalization.CultureInfo.CreateSpecificCulture(en-US sau ro-RO).NumberFormat pus la double.convert …) … dar vedem ziua urmatoare,2009-03-11

Imi cer scuze pentru greseala – si sper sa nu se repete miine!

Salvarea versiunilor fisierelor aplicatiei

O sa vorbesc acum despre salvarea versiunilor fisierelor aplicatiei. De ce avem nevoie de asa ceva? Din cel putin doua motive:

  1. Daca suntem programatori intr-o echipa , atunci fiecare are nevoie sa aiba acces la toate fisierele aplicatiei si sa le puna intr-un loc central(repository), de unde sa poata sa le ia si ceilalti pe PC-ul propriu ( check-out) , sa le modifice si sa le puna inapoi (check-in). Daca nu le pune inapoi si ramine la versiunea anterioara, atunci operatiunea se cheama „undo check-out”.
  2. Daca vrem sa vedem ce modificari au fost facute intre 2 versiuni ale fisierelor – asemanari, deosebiri …

Exista mai multe solutii pentru asta.Doua dintre ele sunt Microsoft Source Safe si Visual Studio Team System . Noi o sa folosim ceva gratuit, si anume subversion. O sa mergem pe calea usoara, si anume svn1clicksetup , http://svn1clicksetup.tigris.org/ . Eu am instalat vers 1.3.3 . Nu va ingrijorati de detalii … apasati doar next si retineti folder-ele unde se instaleaza, inclusiv username si parola pe care v-o cere.

Acum sa creeam repository – acesta il putem face in c:\svnrepos\book35. Creeam aceasta cale, click dreapta pe c:\svnrepos\book35 si alegem TortoiseSVN =>Create repository here. Acum trebuie sa aducem fisierele aplicatiei: Dam click dreapta pe c:\book35, TortoiseSVN =>import, si la url punem file:///C:/svnrepos/book35 . Ok, acum, daca ne ducem pe TortoiseSVN =>RepoBrowser , si dam file:///C:/svnrepos/book35 , o sa vedem toate fisierele aplicatiei.

Bun, deci repository este file:///C:/svnrepos/book35 . Ar trebui sa luam fisierele de acolo – folosim TortoiseSVN =>SVN Checkout in ce folder dorim. Sa zicem , pentru a da un exemplu, ca modificam app.config si mai adaugam un spatiu in el. Dupa ce salvam , dam click si o sa apara „SVN Commit”. Apasam pe el si la mesaj dam „test”. Daca mergem acum pe file:///C:/svnrepos/book35 , TortoiseSVN=> RepoBrowser, si mergem pe app.config, click dreapta, show log vedem ca are 2 versiuni. Mai mult, le putem compara vizual!

Cam asta a fost despre salvarea versiunilor fisierelor

Tema pentru acasa :

Instalati ce versiune de Source Control vreti, modificati un fisier de 3 ori si salvati pe hard versiunea nr 2. Cum ati face daca ati avea mai multe fisiere si ati vrea pentru toate versiunea nr 2?

Lecturi recomandate:

Un tutorial mai lung de SVN aici, http://www.shokhirev.com/nikolai/programs/SVN/svn.html

Continuous integration – de ex., http://martinfowler.com/articles/continuousIntegration.html

Introduction to Team Build and Continuous Integration.

2 rezolvari si 1 sfat

Aseara am inceput sa trec infovalutar pe Asp.NET MVC.Si aveam 2 probleme :

1. degeaba ii dadeam Home/Index/3 ca in controller-ul

    public class HomeController : Controller

    {

        public ActionResult Index(string Banca)

        {

            ViewData.Model = new CurrencyList();

            ViewData["Bank"] = Banca;

            return View("Index");

        }

Nu vroia sa imi ia id-ul(parametrul Banca era null) si gata, indiferent cum ii dadeam eu Home/Index/BNR sau Home sau orice altceva –desi trecea prin procedura.

M-am gindit sa dau vina pe Asp.NET MVC, dar , fiind un framework folosit de atitia, nu ma  gindeam ca tocmai eu am un caz deosebit …Si citisem ca pe IIS integrated NU trebuie sa ii faci modificari …

2. Cind incerca sa se conecteze la Sql Server, imi dadea “login failed for user …”

Am incercat sa refac login-ul , sa schimb parola, ce nu am incercat …

Asa ca m-am dus la culcare si am revenit cu sentimente mai bune de dimineata.

Rezolvari :

1.  M-am dus sa ma uit cum e inregistrat routing-ul in global.asax.Cum sa fie , obisnuit:

routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "BNR" }  // Parameter defaults
            );

Si mi-a cazut fisa : parametrul de la functia index nu se cheama cum vrea el, ci cum vrea MVC – adica id

public ActionResult Index(string id) fata de public ActionResult Index(string Banca)
        Naspa! Mi-aduce aminte de Java, cind numele clasei = numele fisierului !

2. Am incercat , in disperare , sa ma conectez si de pe Sql Server Management Console – acelasi mesaj : “Login Failed” . In disperare, ma conectez cu credentialele de Windows si ma uit in log-urile de la SQL Server – Management/Sql Server Logs  – si acolo mi-a zis ca nu se poate ca nu este configurat in mixed mode …

Ce sa mai zic  ? Schimb, dau restart la Sql, merge!

Sfat catre mine : Daca nu iti iese , du-te si te culca sau apuca-te de altceva. Revii cu mintea odihnita dupa aceea!

Multiple site-uri cu IIS 7 pe vista

Dintotdeauna mi-am dorit asa ceva – multiple site-uri, nu surogatul de Virtual Directory . Si iata ca se poate usor pe vista cu iis 7.

Cum ? simplu

Start=> Control Panel, Clasic View, Administrative Tools=> Internet Information Services (IIS) Manager . Expandati, ajungeti la site, puneti sitename si nu uitati Host Name( sa zicem test)

125355_Add Web Site_active

Acum porniti Notepad cu drepturi de administrator, ajungeti in %SystemRoot%\system32\drivers\etc , editati fisierul host si mai adaugati o inregistrare:

127.0.0.1    test

 

Si acum va merge http://test …In sfirsit!

NDepend

E buna si criza asta la ceva … precum si blog-ul meu pentru mine. Am primit de la Patrick Smacchia o licenta de NDepend . Si ce ar fi mai bun decit sa analizez aplicatia deja facuta?

Nu pot sa spun decit ca raportul lui, gata facut , este super impresionant (se pot defini rapoarte custom, dar ideea este ca astepti sa iasa ceva din prima)

Iata, de exemplu, imaginea cu dependentele:

image

Se vede dintr-o data ce nu e bine: SuffixDLL are legatura la PropertyGridUtils – cind ar trebui sa aiba doar SuffixWnd ( daca nu e clar, sa explic : Dll-ul de business nu ar trebui sa aiba de a face cu interfata grafica …)

Mai mult decit FxCop , are si multe detalii referitoare la calitatea codului in sine, de ex:

WARNING: The following CQL constraint is not satisfied. 1 types on 21 tested match the condition. –> Group {Unused Code / Dead Code}

// <Name>Potentially unused types</Name>
WARN IF Count > 0 IN SELECT TOP 10 TYPES WHERE
TypeCa == 0 AND     // Ca=0 -> No Afferent Coupling -> The type is not used in the context of this application.
!IsPublic AND       // Public types might be used by client applications of your assemblies.
!NameIs "Program"   // Generally, types named Program contain a Main() entry-point method and this condition avoid to consider such type as unused code.

types

Afferent coupling at type level (TypeCa)

Full Name

Settings

0

SuffixWnd.Properties.Settings

 

Intr-adevar, pusesem settings la un moment dat  – si apoi nu il folosisem.

Un tool de avut pentru orice team leader de .NET!

Site http://www.ndepend.com/, recomandare de la Scott Hanselman si un podcast , precum si demo-uri