Sumar Creeare Aplicatie

Rezumat aplicatie:

1 ora si 46 de minute  : Creeare 

2 ore si 10 minute : cautat implementare pe asp.net, facut password invizibil

1ora si 22 minute: about box, serializare date

4 ore si 3 minute : localizare property grid

36 minute :fisier minimal de help

40 minute : localizare ASP.NET

Total : 10 ore si 37 de minute .

Concluzii :

1. Creearea efectiva este doar 20% din munca. Restul ( adica fine tuning) ramine la 80% – respecta deci principiul lui Pareto .

2. Daca esti microISV , ai nevoie de o mare rabdare in a termina o aplicatie.

3. Release early se pare ca intr-adevar functioneaza – am primit feedback imediat.

 

Pe de alta parte cu ce nu sunt multumit este ca nu am separat interfetele de la propertygrid utils , de a trebuit in site-ul web sa fac referinta la ceva care continea windows forms. Dar pentru o prima aproximare…merge…

Gasiti aplicatia de downloadat aici http://serviciipeweb.ro/downloads/pwdgen/ si un site minimal aici http://serviciipeweb.ro/downloads/pwdgen/index.aspx

 

Se ofera cineva continue in Silverlight si/sau WPF ?

 

Pentru referinta:

Partea 1, Geneza si creearea unei aplicatii minimale

Partea 2, Adaugare site

Partea 3, serializarea setarilor pentru Windows Forms

Partea 4, Localizare aplicatie

Partea 5, Terminat aplicatia – help si localizare ASP.NET

Partea 6, Sumar Creeare Aplicatie

Terminat aplicatia – help si localizare ASP.NET

Revenit la 16 : ok , help-ul. Pentru Help vom folosi fisiere HTM si HTML Help Compiler-ul (http://www.microsoft.com/downloads/details.aspx?familyid=00535334-c8a6-452f-9aa0-d597d16580cc&displaylang=en)

Scris rapid in engleza … si acum sa il punem in aplicatie cu HelpProvider. 16:15 Pus KeyPreview la true pe forma – merge!

Ura -avem o aplicatie completa pentru ClickOnce! Sa ii facem deploy! Ii punem minor pe 1 – si vom astepta 7 zile sa isi faca update-ul

I-a pus tot versiunea 1.0 in fisierul HTML . Sa stergem default.htm si sa mai incercam 1 data. Ups – ma uitam in alta parte…pusese bine – dar deschidea pagina de pe site, nu pagina de pe loca.

OK, mi-a inclus traducerea – dar nu fisierul de help – sa il specificam sa il puna la deploy– Nu merge! La naiba, probabil fiindca e Express nu poate include alte fisiere. Sa mai citim …Oh – se pare ca daca ii pun Build Action la Content merge… Super! 16:29

Sa le publicam pe ftp si sa facem proba . Merge – sa dezinstalam si sa mai ne racorim un pic : 16:36

Ramine modificarea aspx ca fie localizat. S-ar parea ca se termina ?

8:15 No hai si cu localizarea pe aspx… as vrea sa o fac din pagina aspx, nu sa mai scriu cod… Sa vedem daca pot …

8:41 nu … asa ca o sa il scriem in pagina – OK, 8:52 Deploy site, verify : 8:55 Total 40 de minute

Uff , gata ! nu mai am rabdare sa fac si Silverlight, si WPF – si poate o comunicatie prin WCF

 

Partea 1, Geneza si creearea unei aplicatii minimale

Partea 2, Adaugare site

Partea 3, serializarea setarilor pentru Windows Forms

Partea 4, Localizare aplicatie

Partea 5, Terminat aplicatia – help si localizare ASP.NET

Partea 6, Sumar Creeare Aplicatie

Localizare aplicatie

Acum, Back to work : 7:27 . Ar trebui sa fac mai intii Localizarea si apoi fisierul de Help –din simplul fapt ca si fisierul de Help ar trebui localizat. OK, sa ii dam drumul inainte sa dam drumul la twitter sau alte prostii de Web 2.0 …

Ce ar trebui sa fac la localizare este sa fac un fisier de resurse pe care sa il foloseasca si exe-le de Windows , si asp.net-ul .

Facut un dll de resurse, adaugat fisier de resurse, pus NameSite ,scris clasa care sa intoarca din resource , pus Nunit test:

objCI = new CultureInfo("fr-FR");

Thread.CurrentThread.CurrentUICulture = objCI;

OK – merge : 7:47 . Sa facem munca de rutina si sa traducem tot(google translate )… Sa ii dam drumul !- si sa modificam internal class ResStrings in public class ResStrings

Rulat din nou clasa de testare – ups … greseala – metodele pe resurse sunt statice (7:59)… Revenim la hardcodare… si terminam la 8:04 . Acum ne trebuie customizat PropertyGrid – daca am fost puturosi si nu am pus textbox / label …

Ar trebui sa incep sa mut toate chestiile legate de property grid in assembly-ul lor … Si mi-ar place ca grid-ul sa reactioneze la tab.
Sa derivam deci gridul si PropertyAttributes

La naiba! 9:32 – o ora si jumate! Dar a durat sa integrez resursele mele cu atributele – si a trebuit sa folosesc reflection pentru creere…

Dar , cel putin, merge GlobalizedDescriptionAttribute –si am facut si testul …

Acum numele categoriilor…Si incepe sa fie stupid : CategoryAttribute : are GetLocalizedString , pe cind DescriptionAttribute NU! Alooo … chiar 2 echipe de programatori ?? Ma rog! Bine ca macar unul are ceva sa ma ajute!

OK – modificat categoria si descrierea – acum ar trebui chiar NUMELE proprietatii…Sa ne cufundam in codul PropertyInfoDescriptor … OK … reusit( era vorba de override DisplayName) !-10:42 si acum sa trecem sa modificam peste tot.

Dar inainte , un pic de pauza – desi sunt acasa in zi libera, totusi mai am ceva de testat pentru servici.

11:15 – am inceput din nou …si am terminat la 11:15 sa traduc.

Acum ar trebui sa fac kit de setup … si sa fac help – si sa traduc site-ul asp.net. Dar plec pe afara : 11:30 inca citeva ore…

Partea 1, Geneza si creearea unei aplicatii minimale

Partea 2, Adaugare site

Partea 3, serializarea setarilor pentru Windows Forms

Partea 4, Localizare aplicatie

Partea 5, Terminat aplicatia – help si localizare ASP.NET

Partea 6, Sumar Creeare Aplicatie

Creearea unei aplicatii minimale : serializarea setarilor pentru Windows Forms

Revenit la sentimente mai bune la 11:00 PM si incercat sa termin cit mai mult din proiect.

Revenind : Parola/Salt/ Afisat sau [pus ca password text in Windows Application dupa o setare ( nu cu un enum , desi ar fi mai frumos – dar am codul http://www.codeproject.com/KB/architecture/dynamicattributes.aspx)

– salvarea acestei setari, teste pe Windows Forms : 11:19.

Acum un about box s-ar cam impune… buton, forma, testat : 11:24

Lansare de pe usb – asta inseamna sa salvez eu setarile intr-un fisier de configurare aflat fie linga aplicatie, fie undeva in alta parte…

Asa ca trebuie renuntat la application settings – si serializat clasa in XML. Scris codul de salvare(XML Serializer sa traiasca ) – intrebarea este : unde scriu unde se salveaza fisierul ??? Asa ca o sa incerc in 2 moduri : mai intii sa vad daca nu am un fisier pe care sa il citesc linga aplicatie – si apoi sa citesc din folderul de date al aplicatiei.

public string FileName

{

get

{

if (File.Exists(AppDataXML))

{

FileInfo fi = new FileInfo(AppDataXML);

if (HasAccess(fi.FullName))

return AppDataXML;

}

string Data =Path.Combine( System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),AppDataXML);

return Data;

}

}

private bool HasAccess(string File)

{

try

{

FileIOPermission f = new FileIOPermission(FileIOPermissionAccess.Append | FileIOPermissionAccess.Read | FileIOPermissionAccess.Write, File);

f.Demand();

return true;

}

catch (SecurityException ex)

{

string s = ex.Message;

return false;

}

}

Pus XMLIgnore la ceea ce nu vreau sa serializeze ( uff : mai bine faceau invers –sunt mai multe chestiile pe care vreau sa le ignor : sa nu fi facut bine clasa ? Dar nu – e vorba de afisare in grid si implementare ICustomTypeDescriptor )

Terminat si asta : ora 12:17. Inceput sa scriu un test,terminat si executat : 12:22.Asta denota ca am scris bine clasa.

Revenind : ce mai am ?

Fisierul de Help

Localizare

Of… iar am obosit :Total munca : 1 ora si 22 de minute. La culcare iarasi!

Partea 1, Geneza si creearea unei aplicatii minimale

Partea 2, Adaugare site

Partea 3, serializarea setarilor pentru Windows Forms

Partea 4, Localizare aplicatie

Partea 5, Terminat aplicatia – help si localizare ASP.NET

Partea 6, Sumar Creeare Aplicatie

Continuare creere aplicatie minimala

Revenind 2:41 AM :

Inca trei cerinte:

5. Cineva si-a manifestat dorinta ca sa nu se vada salt-ul in clar, ci sub forma de *** . Ar fi usor de pus [PasswordPropertyText(true)] dar as vrea sa fie dinamic

6. Sa poti alege locatia fisierului de salvare a salt-ului si a parolei – bun pentru a lua aplicatia pe usb

7. Site web.

Pentru 5, dupa ce m-am batut cu IcustomTypeDescriptor, am vazut codul de aici:

http://www.codeproject.com/KB/architecture/dynamicattributes.aspx

No, si dupa ce am copiat si m-am batut cu el, a mers cu bool, nu a mai mers cu un enum

[Flags]

public enum FormatAsPassword

{

None = 0,

Password=1,

Salt=2,

Site=4

}

Asa ca il las balta si pun doar la password …raminind pe alta data, dupa ce mai studiez nebunia… 3:48

Sa incep cu altceva mai rewarding –sa mi se para ca am facut ceva: site-ul web:

Ar fi frumos daca ar fi un property grid pentru ASP.NET ( si free , daca se poate)…Gasesc unul care pare bun, http://www.codeproject.com/KB/custom-controls/xacc_propertygrid.aspx, dar care spune ca e broken pentru IE7.

La naiba, sa vedem!3:58

Cind zicea ca arata nasol in IE7 nu se incurca… la fel de nasol arata si in Firefox

clip_image002

OK, deci nu… de la capat. Table, textbox, label

4:41 – terminat. Acum sa pun site-ul sus.

4:52- merge- acum, la culcare! – dupa 2 ore si 10 minute – nefacut mare lucru. Daca nu ma complicam cu cele 2( property grid pe asp.net si customtypedescriptor) , acum erau gata mai multe

 

Partea 1, Geneza si creearea unei aplicatii minimale

Partea 2, Adaugare site

Partea 3, serializarea setarilor pentru Windows Forms

Partea 4, Localizare aplicatie

Partea 5, Terminat aplicatia – help si localizare ASP.NET

Partea 6, Sumar Creeare Aplicatie

Geneza si creearea unei aplicatii minimale

Asa cum am scris si pe blog-ul propriu, sunt multe site-urile la care m-am inscris – si majoritatea cu aceeasi parola(de fapt, cam 3 parole diferite). Intre ele, si ejobs-care tocmai a fost spart.Asa ca am decis sa fac o mica aplicatie care, in functie de numele site-ului, sa genereze un sufix la o parola deja existenta.Aplicatia va trebui sa fie in doua flavors : Windows Forms si Web Form (ASP.NET) .

Cit va dura ?Probabil 2 – hai 4 ore… vom vedea! Care este estimarea voastra ?

Aceasta este relatarea cum am facut proiectul -inceput la 3:32 AM.

clip_image002

Citit pe net rapid de criptografie, terminat clasa : 3:57 AM.Adaugat proiect de test cu NUnit.Pentru

public void TestEncryption()

{

clsAddSufix c = new clsAddSufix();

c.Password = "parolagenerica";

c.NameSite = "www.ejobs.ro";

c.Salt = "onenewkey";

Console.Write(c.Generate());

}

am concluzionat ca e prea greu de tinut minte o parola de tipul:

parolagenerica+WdUDoNZBW3+jlUTTj+Q2b6qil0=

asa incit am decis sa o simplific – ce ar fi daca as aduna byte rezultat ?

Super! Imi da parolagenerica2377 ! Dar ar trebui sa verific ca 2 site-uri imi dau 2 parole diferite

Jale mare- Nunit imi da cu rosu – ma uit in cod –si vad ca am pus NameSite nu il folosesc- asa ca modific codul…

Super! Totul cu verde!

Acum ar trebui sa fac GUI … 4:32 – dupa ce am incercat sa pun label+textbox in table layout, i-am dat seama ca property grid ar face treaba mai usoara… <Intrerupere pina la 5:46>

Pus sa afiseze “on the fly” parola rezultat – 6:09

Verificat – si vazut ca nu se modifica daca modific site-ul – pentru ca gridul nu isi face refresh. Modificat sa implementez INotifyPropertyChanged.Modificat frumusetea

public string NameSite { get; set; }

in

public string NameSite

{

get

{

return _NameSite;

}

set

{

_NameSite = value;

RaisePropertyChanged("NameSite");

if (Autogenerate)

{

RaisePropertyChanged("Result");

}

}

}

Testat- nu se intimpla nimic…OK, am inteles – interceptat evenimentul PropertyChanged si facut refresh pe grid :

Modificat si celelalte proprietati, 6:34

Adaugat test – verde!

Acum ar trebui avertizat utilizatorul despre ce mai trebuie adaugat – adaugat IDataErrorInfo : 7:00

Ar trebui sa salvez setarile (salt,parola) in setarile aplicatiei.

7:04.

Modificat target framework din 3.5 in 2.0- 7:10 si 109 warnings…

Facut kit de setup pentru clickonce

Deploy si verificat :7:20

Total 1 ora + 46 minute

Totusi, au mai ramas citeva lucruri:

1. Help

2. About

3. Localizare

4. Salvare pe codeplex

Despre astea, data viitoare… Inca o data – care este estimarea voastra?

Partea 1, Geneza si creearea unei aplicatii minimale

Partea 2, Adaugare site

Partea 3, serializarea setarilor pentru Windows Forms

Partea 4, Localizare aplicatie

Partea 5, Terminat aplicatia – help si localizare ASP.NET

Partea 6, Sumar Creeare Aplicatie

RONUA Bucuresti – intilnirea din Februarie

 

A fost asadar si RONUA Bucuresti  -pe 30 ianuarie 2009. A participat subsemnatul, Diana, AndreiR, dacul , Siderite si marius_i . S-au pus la bataie 4 carti (de programare, evident) + dacul care mi-a dat una de ASP.NET MVC – foarte interesanta si am inteles si eu despre ce e vorba.

Mie mi-a placut enorm sa vorbesc cu cei de fata  – si sper ca data viitoare sa fie la fel de bine

Pozele sunt acestea :

CIMG0006

CIMG0005

 

Ar trebui sa imi schimb si poza de pe RONUA – cica nu seman deloc – si chiar asa este …Acolo am figura mai de popa …

Daca vreti sa participati, urmariti RSS de la adresa

http://ronua.ro/CS/forums/144.aspx si/sau inscrieti-va pe http://ronua.ro/CS/groups/ronua-bucuresti/default.aspx

Multumesc tuturor care au venit si mi-au facut o pauza de masa exceptionala!

CREEAREA RAPIDA A SITE-ULUI SI A APLICATIEI WEB DE ADMIN

(Partile anterioare:

Instalare software

VERIFICARE INSTALARE

APLICATII MICI DE TEST

Descrierea aplicatiei

Creearea Bazei de date – si suport filestream in Sql Server 2008

)

Vrem acum sa creeam partea de administrare. Vom folosi Linq2SQL si Dynamic Data. Mai intii creeam un DLL pentru DAL . Porniti Visual Web Developer ( nu folositi Microsoft Visual C# 2008 Express Edition – nu stie sa se conecteze la SQL Servere existente – ci doar sa creeze o BD SQL SERVER sau sa se conecteze la Sql Compact sau Access – pe cind WebDeveloper stie – nu ma intrebati pe mine de ce …marketing, probabil…)

Selectati „File=>New Project”, Alegeti „Class Library” si o numim DevinDLL (solutia o numim Devin ).Stergem nemilos class1 pe care a generat-o. Selectam „Project=> Add New Item”, alegem „Linq to Sql Classes” si ne apare o pagina goala care ne imbie sa dam click pe „Database Explorer”. Asa si facem – si focusul se duce pe „Database Explorer”. Acolo dam click dreapta pe „Data Connections” , alegem in Data Source „Microsoft SQL Server (Sql Client)” ( daca nu apare , dati click pe „Change”) si introducem detaliile de conectare (Atentie : la server name punem numele Instantei – pentru o editie de Express este de obicei (local)\sqlexpress – si selectati corect baza de date de la „Select or enter a database name” ). Dupa ce ati terminat, dati „Test Connection” si ar trebui sa fie OK ( daca nu, vedeti ce scrie in mesajul de eroare – si scrieti-mi un email).

clip_image002

Acum vom trage tabelele din DB si vom compila(CTRL+SHIFT+B). Daca totul a mers bine, revenim la Solution Explorer, click dreapta pe solutie, „add=>new project”, selectam „Dynamic Data Web Application” si o numim DevinWeb. Adaugam la proiectul Webn ca referinta dll-ul (click dreapta pe „references”, tab-ul projects si selectam DevinDLL.

Acum trebuie sa ii spunem proiectului Web ca isi poate lua datele din Linq2Sql din DLL. In global.asax cautati model.RegisterContext(typeof(YourDataContextType), new ContextConfiguration() { ScaffoldAllTables = false });

Si inlocuiti cu

model.RegisterContext(typeof(DevinDLL.DevinDataContext), new ContextConfiguration() { ScaffoldAllTables = true });

Incercam sa compilam si –surprize, surprize ! –eroare:

error CS0012: The type ‘System.Data.Linq.DataContext’ is defined in an assembly that is not referenced. You must add a reference to assembly ‘System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’.

Pai – asta si facem – adaugam la references, tab-ul .NET , System.Data.Linq

Compilam din nou –si OK!

Dam F5 sa vedem site-ul( si raspundem cu Yes la „Modify the Web.config file to enable debugging)

clip_image004

)

Daca ati pus „scaffold all tables” la true, atunci deja vedeti tabelele:

clip_image006 Va puteti juca acum dind click , editind, stergind – e un site functional.

Ce as vrea sa imbunatatesc :

  1. Nu as vrea sa scrie „Dynamic Data Site”
  2. As vrea sa fie nu in radacina aplicatiei web, ci intr-un folder de admin

Pentru 1 este simplu : Ma duc in Site.master, si inlocuiesc Dynamic Data Site cu „Employees admin site”

Pentru a 2-a , e un pic mai complicat: inchidem creez un folder admin in C:\book35 si trag in el fisierele pentru Dynamic Data( folder-ul Dynamic Data + default.aspx). Deschidem web developer, click dreapta pe folder-ul din radacina „Dynamic data”, „Exclude from Project” . Acum apasam „Project=>Show all files” si includem in proiect folder-ul admin.

Acum trebuie sa ii spunem si aplicatiei ca am schimbat folder-ul unde este Dynamic Data. Intrati din nou in Global.asax si cautati routes.Add(new DynamicDataRoute ("{table}/{action}.aspx")

Vom inlocui cu

routes.Add(new DynamicDataRoute("admin/{table}/{action}.aspx")

si ii spunem model-ului unde sunt fisierele:

model.DynamicDataFolderVirtualPath="~/Admin/DynamicData";

De asemenea, mai avem de inlocuit toate paginile care folosesc Gridviewpager si Filterusercontrol (CTRL+SHIF+F, cautam gridviewpager si inlocuim

src="~/DynamicData/Content/GridViewPager.ascx"

cu

src="~/admin/DynamicData/Content/GridViewPager.ascx"

(paginile de modificat sunt List.aspx, ListDetails.aspx)

La fel in List.aspx avem de inlocuit

src="~/DynamicData/Content/Images/plus.gif"

cu

src="~/admin/DynamicData/Content/Images/plus.gif"

La fel in site.master avem de inlocuit

src="DynamicData/Content/Images/back.gif"

cu

src="~/admin/DynamicData/Content/Images/back.gif"

Click dreapta pe „default.aspx”, „set as start page”-CTRL+F5 – si ar trebui sa fie ca la inceput.

Data viitoare vom vorbi despre Linq2SQL si cum facem modificari in el.

Pentru usurinta, gasiti sursele la http://serviciipeweb.ro/iafblog/content/binary/net35/instalare/sources1/devin1.zip si backup BD la http://serviciipeweb.ro/iafblog/content/binary/net35/instalare/sources1/devinx1.zip

(apropo : daca v-ati inregistrat la MS copia de Web Developer Express si va duceti la https://connect.microsoft.com/downloads/downloads.aspx?SiteID=40 – o sa gasiti acolo alte 3 carti

Microsoft Visual C# 2005 Express Edition – Build a Program Now, Microsoft Visual Web Developer 2005 Express Edition – Build a Web Site Now, Developing Desktop Applications with SQL Server Express Edition , SQL Server Express Edition eBook si 2 colectii de imagini : Corbis Images si IconBuffet Studio Suite –si inca citeva soft-uri.)

Tema pentru acasa :

Modificati Dynamic Data web site astfel incit sa nu mai scrie « My tables » , ci « Devin Tables »

Modificati Dynamic Data astfel incit sa tabelele sa nu mai apara cu prefixul acc(NU le modificati din DB, ci din Web site/Linq)

Lecturi Recomandate:

Dynamic data customization , http://mattberseth.com/blog/dynamic_data/

Windows instalare minimala

Totdeauna un om in IT, indiferent daca e in programare/suport/retelistica/administrare, va fi rugat sa instaleze un PC de la 0 pentru cineva care nu are cunostinta in IT.

Nu fac exceptie – si aseara am instalat din nou Windows pe un laptop. Si am zis ca e bine de tinut o lista pentru prima instalare:

1.(Open) Office – pentru documente

2. winamp pentru muzica , http://www.winamp.com/

3.irfan view pentru poze, http://www.irfanview.com/

4. vlc media player pentru filme, http://www.videolan.org/vlc/

5. 7z pentru arhivatoare, http://www.7-zip.org/

6. clamwin pentru protectie virusi, http://www.clamwin.com/

Nu i-am pus nici firefox , nici firewall pentru ca trebuia sa tin tutorial pentru astea…

Voi ce instalati in astfel de cazuri ? ( free, please…)

newslinks ianuarie 2009

Uitasem de Programmer Competency Matrix , si de faptul ca voiam sa fac un test dupa el… dar Andrei Rinea mi-a reamintit…

Legat oarecum, CWE/SANS TOP 25 Most Dangerous Programming Errors, http://www.sans.org/top25errors/#s4 .

Pentru cei cu Sql Server 2008,  SQL Server 2008 System Views Map  http://www.microsoft.com/downloads/details.aspx?FamilyID=531c53e7-8a2a-4375-8f2f-5d799aa67b5c&displaylang=en

Si, in sfirsit, ce se mai cauta in IT,http://www.infoworld.com/article/09/01/29/IT_pay_up_in_three_areas_down_elsewhere_1.html