Am ajuns MVP in C#
Anuntul a fost facut aici . E a doua mea realizare in anul asta, dupa Dilema
Multumesc lui Aurelian , Petru, Zoli , Lore si celor multi de pe RONUA / Sql Server / ITBoard care m-au ajutat sa devin mai bun!
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:
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…)
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
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 …
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 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!
O sa vorbesc acum despre salvarea versiunilor fisierelor aplicatiei. De ce avem nevoie de asa ceva? Din cel putin doua motive:
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
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!
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)
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!
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:
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