BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Lietuvos .NET vartotojų grupės susitikimas - Windows Phone 7 programavimas

Parašė Sergejus | 2011-03-28 20:31

Šį kartą kalbėsime apie Windows Phone 7 programavimą. Kaip žinote, Windows Phone 7 išsiskiria savo novatoriška grafine sąsaja bei patogiais programavimo įrankiais skirtais .NET programuotojams. Šiam Lietuvos .NET naudotojų grupės susitikimui mes pakvietėme ko gero geriausiai Lietuvoje žinomą Windows Phone 7 specialistą, amCharts ir AdDuplex kūrėją, Alaną Mendelevičių. Susitikimo metu Alanas ne tik papasakos apie WP7 programavimo subtilybes, bet ir pasidalins savo patirtimi bei gerosiomis praktikomis. Antras susitikimo pristatymas bus skirtas žaidimų kūrimui Windows Phone 7 su XNA. Pristatymo metu Pavel ir Daniel pasidalins savo patirtimi kuriant žaidimą Solar Invaders.

P.S. Specialiai šiam susitikimui padidinome vietų skaičių, bet vis tiek prašome registruotis tik tuo atveju, jeigu planuojate atvykti į renginį.

Susitikimai vyks Kaune - balandžio 5 d. (Microsoft inovacijų centre, Technopolyje) ir Vilniuje - balandžio 6 d. (Holiday Inn Vilnius, Columbus salėje)

18:00 - 18:45 - Windows Phone 7 programavimas, I dalis (Alan Mendelevič)
19:00 - 19:45 - Windows Phone 7 programavimas, II dalis (Alan Mendelevič)
20:00 - 20:45 - Windows Phone 7 žaidimų kūrimas su XNA (Pavel Jakovlev ir Daniel Davidian)
21:00 – Boulingas

Registracija Kaune, Vilniuje.

Rodyk draugams

Artimiausi pristatymai ir renginiai

Parašė Sergejus | 2011-03-27 13:15

Pirmoji balandžio pusė nusimato įtempta pagal renginių gausą:

Balandžio 5, Kaunas – Lietuvos .NET naudotojų grupės susitikimas iš Windows Phone 7 programavimo (registracija)

Balandžio 6, Vilnius – Lietuvos .NET naudotojų grupės susitikimas iš Windows Phone 7 programavimo (registracija)

Balandžio 9, Kaunas – pristatymas „Web Scale with NoSQL“, KTU InfoShow Web konferencija

Balandžio 11-14, Las VegasMIX 11

Rodyk draugams

Kelios mintys atlikus masinį ASP.NET aplikacijų migravimą iš IIS6 į IIS7.5

Parašė Sergejus | 2011-03-20 23:13

Prieš kelias dienas teko migruoti virš 20 ASP.NET Web aplikacijų į naują serverį. Migracija buvo pakankamai rizikinga nes:

  • keitėsi operacijų sistema iš Windows Server 2003 į Windows Server 2008 R2;
  • keitėsi IIS versija iš 6.0 į 7.5;
  • keitėsi platforma iš 32-bitų į 64-bitų.

Kaip matote, pakeitimai pakankamai dideli, tad nusprendžiau pasidalinti migravimo patirtimi.

Žingsnis #1 – IIS struktūros bei nustatymų migravimas

Šito žingsnis tikslas numigruoti IIS6 metaduomenų bazę į IIS7.5. Tam pasinaudojome nemokamu įrankiu Microsoft Web Deploy 2.0, kurį sudiegėme tiek sename, tiek naujame serveriuose. Vienas pastebėtinas dalykas kurį atradome bandymų metu, pagal nutylėjimą Web Deploy eksportuoja tiek IIS struktūrą su visais nustatymais, tiek ir Web saitų turinį. Tai patogu kai dirbama su viena-dviem aplikacijomis, bet dirbant su daugiau tikimybė, kad kuris nors failas yra „in use“ ir negalės būti nukopijuotas – labai padidėja. Dėl šios priežasties Web Deploy mes naudojome tik IIS metaduomenų bazei numigruoti.

Įdomumo dėlei, pateiksiu eksportui ir importui naudotas Web Deploy komandas:

msdeploy -verb:sync -source:webserver60 -disableLink:contentExtension -dest:package="D:\Sites.zip",encryptPassword=yourpass

msdeploy -verb:sync -source:package=D:\Sites.zip,encryptpassword=yourpass -dest:webserver60

Žingsnis #2 – AppPool sutvarkymas

Kaip jau minėjau, mes ne tik migravome į naujesnę IIS versiją, bet ir į 64-bitų architektūrą. Tam kad minimizuoti galimas pasekmes, aplikacijų AppPool nurodėme:

Nustatymų korektiškumo patikrinimui pasirašiau labai paprastą aplikaciją, kuri nuskaito IIS konfigūraciją ir išveda ją į ekraną (apie ją jau rašiau).

Žingsnis #3 – Web aplikacijų turinio perkėlimas

Kadangi turinys turėjo būti perkeltas iš veikiančio serverio, kur dalis failų buvo „in use“, pasinaudojome paprasčiausiu NTBackup su Shadow Copy galimybe.

Žingsnis #4 – reikalingų teisių nustatymas

Nepaisant teorinio paprastumo, reikalingų teisių nustatymas yra pakankamai subtili užduotis, reikalaujanti gero pasiruošimo. Vertas dėmesio pagalbininkas – Powershell ir jo komanda

get-childitem d:\Site -recurse | get-acl

Žingsnis #5 – testavimas ir rastų problemų sprendimas

Kadangi migruojama buvo labai daug aplikacijų, reikėjo ir nemažai testuotojų (ačiū jiems). Rastos problemos buvo iš karto sutvarkomos ir pertestuojamos.

Kas toliau?

Kurį laiką stebėsime ar viskas gerai veikia. Tada kiekviena aplikacija bus ištestuota Integrated režimu ir 64-bitų procese, po ko galima bus pasinaudoti visais IIS7.5 teikiamais privalumais.

Tiek tos patirties, tikiuosi ši informacija jums pravers darant nuosavas migracijas. Klausimų bei pastabų laukiu komentaruose.

Rodyk draugams

Efektyvus konvejerio tipo užduočių apdorojimas .NET

Parašė Sergejus | 2011-03-15 00:06

Šiame straipsnyje norėčiau aptarti mano pamąstymus, kaip galima efektyviau apdoroti konvejerio tipo užduotis .NET platformoje.

Teorija

Pradėsime nuo to, kas yra konvejeris programavime. Konvejeris – tai nuoseklių žingsnių rinkinys, kur kiekvienas žingsnis žino tik prieš tai buvusį bei sekantį žingsnius. Dažnai dar tokia architektūra vadinama vamzdžiu (angl. pipeline). Žemiau pateiktas tokio konvejerio pavyzdys:

image

Kaip matyti, čia nuosekliai atliekami 3 žingsniai:

  • duomenų nuskaitymas;
  • nuskaitytų duomenų įrašymas;
  • įrašytų duomenų suspaudimas.

Paprasčiausias būdas įgyvendinti konvejerį – viską daryti nuosekliai ir sinchroniškai. Be abejo, tai nėra pats efektyviausias įgyvendinimo būdas, nes einamuoju laiko momentu tik vienas iš žingsnių bus vykdomas. Efektyviau būtų jeigu visi trys konvejerio žingsniai būtų vykdomi lygiagrečiai, pvz.:

  • nuskaitoma pirma duomenų porcija
  • nuskaitoma antra duomenų porcija
  • įrašoma pirma duomenų porcija
  • nuskaitoma trečia duomenų porcija
  • įrašoma antra duomenų porcija
  • suspaudžiama pirma duomenų porcija

Tokiu būdu, po tam tikro laiko momento visi trys žingsniai bus vykdomi, o tai reiškia, kad ir pats konvejeris dirbs greičiau. Komunikaciją tarp žingsnių galima įgyvendinti įvykių pagalba: jeigu pirmas žingsnis atliko savo darbą – jis signalizuoja sekančiam žingsniui, kad jam atsirado darbo. Jeigu darbo nėra – žingsnis turėtų būti „užmigdomas“ ir laukti signalo.

Komunikacija tarp žingsnių yra efektyvi, bet jeigu vienas žingsnis dėl kažkokių priežasčių užstrigo, jo lauks visi kiti žingsniai, kas praktiškai reiškia konvejeris „sustoja“. Tam, kad žingsniai kuo mažiau įtakotų vienas kitą, šalia įvykių mechanizmo atsiranda eilės, kurios atlieka buferio vaidmenį:

image

Tokia architektūra vadinama SEDA (Staged event-driven architecture). .NET platformoje tokią architektūrą įgyvendinti tapo kaip niekada paprasta BlockingCollection klasės pagalba, apie kurią jau esu rašęs.

Praktika

Pradėsime nuo dviejų paprasčiausių interfeisų:

public interface IPipe
{
    void Process();
}

public interface IStep
{
    void Execute();
}

IPipe interfeisas tai ir bus mūsų konvejeris, o IStep – atitinkamai konvejerio žingsnis. Aprašykime aukščiau išvardintus žingsnius (su minimaliu funkcionalumu):

public class ReadStep : IStep
{
    private readonly BlockingCollection<string> outputQueue;

    public ReadStep(BlockingCollection<string> outputQueue)
    {
        this.outputQueue = outputQueue;
    }

    public void Execute()
    {
        Console.WriteLine("Reading");
        Thread.Sleep(TimeSpan.FromSeconds(1));
        outputQueue.Add("some text here");
    }
}

public class WriteStep : IStep
{
    private readonly BlockingCollection<string> inputQueue;
    private readonly BlockingCollection<FileInfo> outputQueue;

    public WriteStep(BlockingCollection<string> inputQueue, BlockingCollection<FileInfo> outputQueue)
    {
        this.inputQueue = inputQueue;
        this.outputQueue = outputQueue;
    }

    public void Execute()
    {
        var text = inputQueue.Take();
        Console.WriteLine("Writing " + text);
        Thread.Sleep(TimeSpan.FromSeconds(2));
        outputQueue.Add(new FileInfo("c:\\test"));
    }
}

public class ZipStep : IStep
{
    private readonly BlockingCollection<FileInfo> inputQueue;

    public ZipStep(BlockingCollection<FileInfo> inputQueue)
    {
        this.inputQueue = inputQueue;
    }

    public void Execute()
    {
        var file = inputQueue.Take();
        Console.WriteLine("Zipping " + file);
        Thread.Sleep(TimeSpan.FromSeconds(5));
    }
}

Atkreipkite dėmesį, kad žingsnių vykdymo trukmė specialiai padaryta skirtinga. Turint visus reikalingus žingsnius, beliko aprašyti patį konvejerį:

public class Pipe : IPipe
{
    public void Process()
    {
        var taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);

        var writeQueue = new BlockingCollection<string>();
        var zipQueue = new BlockingCollection<FileInfo>();

        var readStep = new ReadStep(writeQueue);
        var writeStep = new WriteStep(writeQueue, zipQueue);
        var zipStep = new ZipStep(zipQueue);

        var steps = new List<Task>
        {
            taskFactory.StartNew(() => DoStep(readStep)),
            taskFactory.StartNew(() => DoStep(writeStep)),
            taskFactory.StartNew(() => DoStep(zipStep)),
        };

        Task.WaitAll(steps.ToArray());
    }

    private static void DoStep(IStep step)
    {
        while (true)
        {
            try
            {
                step.Execute();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

Pateiktoje konvejerio realizacijoje metodas DoStep yra gerokai supaprastintas, realybėje jis turėtų mokėti pagal poreikį nutraukti žingsnio vykdymą, stabdant visą konvejerį.

Apibendrinimas

SEDA labai gerai tinka apkrautoms sistemoms, t. y. kurios apdoroja kelis šimtus veiksmų per sekundę. Šios architektūros pagalba galima ne tik paspartinti konvejerį, bet ir pagerinti bendrą sistemos patikimumą. Ką manote?

Rodyk draugams

Įspūdžiai iš MVP Summit 2011

Parašė Sergejus | 2011-03-06 16:35

Štai ir grįžau iš MVP susitikimo Sietle. Bendras renginio vertimas – labai geras, tad nusprendžiau pasidalinti su jumis įspūdžiais. Turiu pripažinti, šiais metais renginys man patiko labiau nei praeitais metais tiek turinio, tiek renginio formato prasme. Nors šiais metais MVP Summit 2011 oficialiai truko tik tris dienas (vietoje keturių kaip anksčiau), Windows Azure komanda mums papildomai organizavimo dar vieną dieną, tad informacijos užteko per akis. Trumpai apžvelgsiu susitikimo dienotvarkę.

Pirmadienis, programuotojų diena

Pirmą susitikimo dieną visi MVP buvo padalinti į keletą didelių grupių: programuotojai, IT profesionalai, saugumo specialistai ir taip toliau. Windows Azure MVP, kaip ir galima nuspėti, buvo priskirti prie programuotojų. Programuotojų diena prasidėjo Scott Guthrie ir Jason Zander pagrindiniu pristatymu, kuriame jie apžvelgė Visual Studio vNext, ASP.NET vNext, Silverlight vNext ir daugelį kitų naujienų.

image

Po šio pristatymo galima buvo nueiti į kitus programuotojų grupei skirtus pranešimus iš Visual Studio ir ASP.NET, Entity Framework ir SQL Server Developer Tools „Juneau“, SQL Server ir SQL Azure. Iš viešai prieinamos medžiagos, labai rekomenduoju pasižiūrėti video apie „Juneau“, tai tikrai bus „wow“.

image

Antradienis, pagrindinis pristatymas

Antradienio rytas prasidėjo nuo pagrindinio Steve Ballmer pristatymo. Klausytis buvo gana įdomu, bet nieko naujo taip ir nepasakė.

image

Vienintelis pozityvus dalykas – vienoje iš skaidrių pamačiau save (centre, nuotrauka tikriausiai daryta praeitais metais)

image

Antradienis, susipažinimas su Windows Azure komanda

Po pietų išvažiavome į Redmondą, susipažinti su Windows Azure komanda ir kitais Windows Azure MVP. Dienos kulminacija tapo pristatymas Windows Azure Roadmap, po kurio pagaliau gavom atsakymus į klausimą „O kas toliau?“. Bendra Windows Azure MVP nuotrauka:

image

Trečiadienis, Windows Azure diena

Visą trečiadienį klausėmės įvairiausių pristatymų iš Windows Azure. Vieną iš pranešimų Windows Azure Internals skaitė daugeliui gerai žinomas Mark Russinovich.

image 

Trečiadienis, MVP vakarėlis

Vakare, Sietlo beisbolo stadione Safeco Field vyko MVP vakarėlis – gera proga pabendrauti su kitų sričių MVP!

image

Video nufilmuotas mano Samsung Focus

Ketvirtadienis, susitikimai su Windows Azure produktų grupe

Oficialiam MVP susitikimui pasibaigus, ketvirtadienį Windows Azure komanda organizavo mums papildomą dieną su produktų grupe. Kiekvienas Windows Azure MVP galėjo sudaryti susitikimų dienotvarkę pagal save. Asmeniškai aš spėjau pasišnekėti su vienu iš Windows Azure architektu, užmėčiau akį į Windows Azure portalo kodą bei sudalyvavau naujų VM rolės galimybių projektavime. Reikėtų atkreipti dėmesį, kad dažnai produktų grupės taip arti neįsileidžia nieko, net MVP, tad didelė pagarba Windows Azure komandai.

Offtopic

Šiais metais MVP Summit metu įsigijau porą įrenginių: Amazon Kindle bei Samsung Focus su Windows Phone 7.

image

Rodyk draugams