CaptureMylog–treilea deadline si post mortem

Al treilea termen era lansarea efectiva.

Ca de obicei, lansarea a fost cea mai grea. Aveam logger-e( java si .net) , appender-e( log4net, log4java, nlog), http handler pentru asp.net  dar sa facem site-ul, sa ii dam o forma, sa punem site-ul sus… a fost o intreaga tevatura. Pentru ca am incercat sa il facem cu ceva ce nu stiam. Cineva dintre noi a ales Orchard ca sa faca site-ul de prezentare – si a spus ca il integreaza cu PayPal, cu site-ul original , cu …Ceilalti am luat parti mai mici ( nuget, tutoriale ). Cu 2-3 zile inainte ( si 1 aminare) cel cu Orchard a anuntat ca nu i-a iesit nimic. Asa ca a trebuit sa fac site-ul de prezentare de la 0 cu MVC. Nu a fost greu  -dar nici usor – a iesit in 4 ore.

Mai mult, integrarea tutorialelor a pus o problema: le facusem in Word dupa acelasi model. Dar cum in transpuneam in HTML fara sa stricam pagina? Caci generarea de HTML din Word adauga tot felul de css in pagina – care pot strica design-ul original. Altcineva a venit cu o idee cistigatoare : transformam in HTML si punem in iframe.

Asa ca in MVC a iesit ceva de genul
public virtual ActionResult Tutorial(string Id)
{
IframeHelper fh = new IframeHelper();
fh.FindAfterId(Id, Links.Content.wordDocs.Url());
return View(fh);
}

Iar view-ul verifica daca exista pe disk si afiseaza fie iframe, fie ca o sa vina tutorialul ASAP:

@if (Model.ExistsOnDisk)
{
<h2>Tutorial about @Model.id </h2>
<iframe src=”@Model.FileName” width=”100%” height=”2000px” style=”background-color:White”></iframe>
}
else {
<h2>Tutorial about @Model.id coming soon!</h2>
}

Si asa a iesit http://www.capturemylog.com/

Postmortem:

 Ce am facut bine:

1. tinerea de planuri si de termene – cine nu face, out

2. incercare de a fi cit mai simplu pentru utilizator instalarea

3. Intilniri regulate – un fel de SCRUM

Ce am facut prost:

1. Nu lasi pe cineva care nu are experienta cu un CMS prea mult timp. Si nu suporti aminarile pe motiv ca e complicat.

2. Nu lasi pe ultima ora interfata cu utilizatorul – se poate intoarce impotriva ta.

3. Codul – deocamdata e cam adunatura – facut la repezeala, integrat la repezeala , nedocumentat. Trebuie refacut , probabil.

Concluzie finala:

a)Multumesc lui Zoli Herczeg ca a organizat acest concurs.

b)A fost o experienta placuta . Si , inafara de faptul ca am reusit sa il facem, am reusit si sa cistigam premiul al treilea la “Afacerea ta , faima ta”  . ( inca nu s-a updatat http://www.microsoft.com/romania/afacereatafaimata/competitie.aspx )

Munca de simbata si duminica

Aproape uitasem cum e sa muncesti simbata si duminica cind ai predare luni. ( Citva timp am fost database administrator si developer individual pentru firme non-soft)

Dar nu, nu de tot – dar tot ingrozitor este sa vii duminica, la ora 21:30 si sa iti dai seama ca WE a ramas in urma – si vine inca o saptamina.

Voi cum reactionati la asa ceva?

Capture My Log

Ca urmare a unui concurs Microsoft, am reusit sa fac ( impreuna cu Bogdan Mihai si Marius Ion) o aplicatie numita http://capturemylog.com/ .

Ce face:

Se integreaza rapid cu orice aplicatie asp.net/desktop/java  existenta , astfel incit puteti vedea imediat erorile aplicatiei , indiferent ce client aveti.

Deocamdata e in private beta –ceea ce inseamna ca primii care participa vor avea Professional Plan pentru un an de zile ( exista si Free Plan  – cred eu ca e de ajuns pentru o aplicatie free).

 

Ce avantaje aveti:

1. Puteti sa vedeti imediat problemele aplicatiei

2. Puteti sa ii spuneti clientului : nu te deranja tu, eu monitorizez erorile si reactionez mai repede

3. Putem sa il integram cu aplicatia dvoastra de bug tracking.

 

Daca aveti un site sau o aplicatie desktop si va intereseaza ce v-am spus, va rog sa imi trimiteti un Send mail to the author(s) email!

Azure Log Collector–doilea deadline

Al doilea deadline a fost cel de Business Plan. Deadline-ul era pe 28 martie. Strins la fel – avind in vedere ca cel dinainte a fost pe 12 martie.

In primul rind, a trebuit sa definim clientii

In al doilea rind, a trebuit sa vedem concurenta.

In al treilea rind, sa vedem costurile : intretinere , promovare , etc.

In al patrulea rind, sa vedem preturile. Aici am definit si modelul de abonare.

Si acum am definit si operatiunile ce trebuie facute neaparat.

Observatii:

 

    1. Pentru niste programatori, promovarea este mai deficitara.
    2. A mai participat cineva – dar si-a facut treaba pe sfert- ala neesential. Nu va fie frica sa dati afara.
    3. Am pierdut timp cu arhitectura aplicatiei –desi nu cred ca sta in Business plan. Asa ca macar o sa fie o figura frumoasa aici

Asta  a fost prima varianta( facuta de mine)

image

Si asta a fost a doua (facuta de un participant)

image

Kinect

Daca va pasioneaza programarea pe Kinect, am facut de curind o aplicatie anti hot pentru ea. TotalSoft a facut un concurs intern – iar aplicatia mea s-a clasat pe locul 6 ( din 10 Winking smile  participantii stiu de ce)

Celelalte au fost oricum mai interesante – era una cu zidul si cu muzica din mission impossible care a fost aproape perfecta!

Revenind la Kinect:

Amanunte despre cum sa incepeti gasiti  la http://msprogrammer.serviciipeweb.ro/2012/03/05/kinect/ , iar aplicatia la https://kinectantitheft.codeplex.com/ .

Dar fara device nu faceti mare lucru  !

Azure Log Collector–prima relatare

Am participat la concursul de idei Azure http://zoli.herczeg.ro/2012/02/24/planul-pentru-cloud-factory/ – si m-am ales cu un telefon Nokia Lumia 800 – ceea ce nu a fost rau deloc.

Pina la 12 martie trebuia sa facem (echipa + mine ca manager) un proof of concept. Dead-line era strins – 2 saptamini.

Cum s-a desfasurat :

  1. S-au inscris 4 oameni pentru dezvoltare, eu ca project manager. Au venit cu idei in acea simbata .
  2. Important de discutat este cu ce se alege fiecare – si , deocamdata, toata lumea lucreaza pentru cele 3 termene. Cind se termina, lucram in continuare  impreuna ( ceea ce as vrea) sau nu
  3. Am pus citeva interfete pe codeplex- ca sa putem lucra impreuna.  I-am pus de asemenea sa faca un checkout – checkin rapid la un fisier ca sa vedem ca merge pe codeplex pentru toti.
  4. Am pus issue-uri tot pe codeplex si am lasat oamenii sa si le asigneze( 2 zile) . Normal ca au fost ceva probleme – s-au certat intre ei pe taskuri. Dar am spus ca principalul este sa faca ceva – nu apreciem ( deocamdata) calitatea codului sau numarul de linii.
  5. Pe 1 martie am trimis mesajul urmator:
  6. <<Ma bucur ca ati reusit cu totii sa va asignati cite un task pe proiectul Azure Log Collector de pe codeplex .
    Numesc checkin faptul de a pune sursele de la voi de pe PC pe Codeplex.
    Acum e momentul programarii.
    Primul termen, 12 martie , e destul de aproape . V-as propune sa puneti sursele pe codeplex in fiecare seara dupa ce terminati.
    Dar, pentru ca nu consider ca este fezabil, va propun sa faceti check-in la surse la urmatoarele termene:
    Duminica , 4 martie 2012, ora 23:59:59 + estimare preliminara.
    Marti , 6 martie 2012, ora 23:59:59 – oricare surse.
    Vineri, 9 martie 2012, ora 23:59:59, + estimare daca suntem on track.
    Simbata , 10 martie 2012, ora 23:59:59, + estimare daca suntem on track.

    >>

  7. Pe 4 martie dau mesajul:
  8. @all:
    Ma intereseaza progresul aplicatiei pina asta noapte la ora 23:59 conform deadline.
    Deci checkin pe codeplex la ce ati facut deja!

  9. Bineinteles ca 2 nu au facut – si doar 2 au facut. Cu toata parerea de rau, cei care nu au facut au iesit din echipa. Nu am timp sa ma tocmesc la dead-line-uri strinse.
  10. Am luat eu munca cu azure – si am facut un serviciu web, o inregistrare de user-i si tabele in o 4- 6 ore.
  11. Ceilalti doi, cind au vazut ca merge serviciul http://logcollectorazure.cloudapp.net/  au facut appender de log4net, nlog si log4java( da , am vazut un server Tomcat integrat – tare)
  12. Si celelalte dead-line-uri au fost respectate si ne-am intilnit duminica aceasta pentru a putea discuta ultimele lucruri  + punctul doi de la Zoli

Sper sa ne mearga bine!

 

     

Agregate exception class, IValidatableObject si ModelState in mvc.

Acesta este un guest post de la Pascanu Alexandru. A facut o chestie deosebita pentru http://pmkb.codeplex.com/ si a scris despre ea.

Agrregate exception class este un un tip de exceptie care da posibilitatea programatorului de a arunca o exceptie care are insa ca sursa (InnerException) o colectie de exceptii nu una ca in cazul classic al celorlalte clase ce deriveaza din exception.Mai multe aici: http://msdn.microsoft.com/en-us/library/system.aggregateexception.aspx.

Interfata IValidatableObject din namespace-ul DataAnnotation http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.ivalidatableobject.aspx

expune o singura metoda de implementat Validate de forma : IEnumerable<ValidationResult> Validate(

ValidationContext validationContext

)

Mai jos void a un exemplu cum conlucreaza intr-o aplicatia asp.net mvc cele doua de mai sus plus ModelState.

Presupn ca am clasa,undeva in model, POCO Link ce implemneteaza aceasta interfata


Class Link:IvalidatableOBject

{

Public string LinkName{get;set;}

Pulbic string LinkDescription{get;set;}

Public string LinkUrl {getset;}

//implementez metoda Validate

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)

{

var validationResults = new List<ValidationResult>();

if (string.IsNullOrEmpty(this.LinkDescription))

validationResults.Add(new ValidationResult(PMKBEntities_resource.Link_LinkDescription_Required,new string[1]{ Link_List.FieldNames.LinkDescription}));

if (string.IsNullOrEmpty(this.LinkName))

validationResults.Add(new ValidationResult(PMKBEntities_resource.Link_LinkName_Required, new string[1] { Link_List.FieldNames.LinkName}));

if (string.IsNullOrEmpty(this.LinkUrl))

validationResults.Add(new ValidationResult(PMKBEntities_resource.Link_LinkUrl_Required, new string[1] { Link_List.FieldNames.LinkUrl}));

return validationResults;

}

}

In model,in clasa Repository aferenta entitatii Link ,in metoda Save mai exact ,inaite de persistarea entitatii voi verifica daca ce intoarce metoda Validate adica Ienumerable<ValuidationResult> contine date sau nu.In functie de aceasta ,mai exact pentru fiecare ValidationResult ,crrez o clasa Exception aferenta,pe care o pun intr-o colectie Ienumerable<Exception>.

In final atribui aceasta lista proprietatii InnerExcception a unui obiect AggregatException creat in prealabil.

In final arunc obiectul AggregateException Layerului urmator ,cel care a apelat repository ,adica controllerului afaerent entitatii link.

In clasa LinkControloler in actiunea in care fac Save la entitatea link in catch voi actualiza colectia de errrori a obiectului ModelState afferent controller in cazul in care a fost prins un obiect AggregateException-astfel in View voi avea validation summry-ul cu erorile de validare aferente

Exemplu:


catch (AggregateException aggrexp)

{

foreach (var exp in aggrexp.InnerExceptions)

{

ExceptionProperty arg = exp as ExceptionProperty;

if (arg != null)

{

ModelState.AddModelError("link."+arg.Property, arg.Message);

}

else

{

ModelState.AddModelError("", exp.Message);

}

}

}

PS: Daca va pasioneaza subiectul, puteti citi si
http://msprogrammer.serviciipeweb.ro/2012/03/19/ivalidatableobject-and-idataerrorinfo/

Prezentare RONUA Backend si Kinect

Prezentarea lui Florin Matinca o gasiti aici:

http://www.slideshare.net/florinmatinca/ronua-solutii-backend

A mea a constat in:

1. Kinect SDK Sample Browser demo – Explorer si Shape Game

image

2. Gesture  Viewer – kinecttoolbox.codeplex.com/

3.Un paint – cam greoi facut:  http://paint.codeplex.com/

4. Demo code de la Kinect Explorer – cel mai bine facut.

5. Demo code de la Gesture Viewer  –  explicat logica

6. Lasat kinect pe mina celorlalti. Au incercat sa il orbeasca cu flashul de la telefon – sa il pacaleasca intrind pe usa  si altele. Oricum a fost interesanta – si berea de dupa la fel!