BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Agile Turas Vilniuje 2011

Parašė Sergejus | 2011-06-29 21:49

Jau šį rugsėjį Agile Turas vėl sugrįžta į Lietuvą ir kartu atveža net 3 pasaulio lygio pranešėjus: Mary Poppendieck, J. B. Rainsberger ir Jurgen Appelo. Atsižvelgiant į skirtingą Agile entuziastų auditoriją, planuojamos 3 sekcijos: vadovų, techninė ir naujokų! Kita šių metų Agile Turo naujiena – galimybė išsilaikyti Certified Scrum Master (CSM) ir Certified Scrum Product Owner (CSPO) sertifikatus bei sudalyvauti įvairiuose Agile mokymuose. Detalesnę informaciją rasite Agile Turui bei mokymams skirtuose puslapiuose.

Kadangi šiais metais bus ir techninė sesija, jus turite puikią progą tapti Agile Turo pranešėju! Jeigu dirbate pagal Agile ir norite pasidalinti savo žiniomis apie gerąsias praktikas, TDD ir t.t. – parašykite komentaruose ir aš susisiekiu.

Rodyk draugams

ASP.NET MVC puslapių greitaveikos stebėjimas su MiniProfiler

Parašė Sergejus | 2011-06-26 11:38

Prieš kurį laiką rašiau apie Stack Overflow komandos sukurtą Dapper .NET biblioteką. Šiandien norėčiau trumpai aptarti kitą jų biblioteką – Mini Profiler for MVC 3. Jos pagalba galima labai paprastai sekti puslapių greitaveiką ir proaktyviai reaguoti į potencialias problemas. Iš karto norisi pasakyti, kad vienas didžiausių šios bibliotekos privalumų – mokėjimas matuoti SQL užklausų / sakinių vykdymo greitį.

Norėdami prijungti Mini Profiler prie egzistuojančios ASP.NET MVC 3 aplikacijos, užtenka tik kelių paprastų žingsnių:

  • pridėti NuGet paketą MiniProfiler:
    PM> Install-Package MiniProfiler
  • prie esamų JavaScript skriptų prijungti jQuery (jeigu dar nėra prijungtas) bei MiniProfiler skriptus:
    <head>
        <meta charset="utf-8" />
        <script src="@Url.Content("~/Scripts/jquery-1.6.1.min.js")" type="text/javascript"></script>
        @MvcMiniProfiler.MiniProfiler.RenderIncludes()
    </head>

  • Global.asax puslapyje startuoti ir stabdyti profailerį su kiekviena užklausa:

    protected void Application_BeginRequest()
    {
        if (Request.IsLocal)
        {
            MiniProfiler.Start();
        }
    }
    
    protected void Application_EndRequest()
    {
        MiniProfiler.Stop();
    }

  • vietoje standartinės DbConnection klasės naudoti klasę MvcMiniProfiler.Data.ProfiledDbConnection:

    var connection = ProfiledDbConnection.Get(new SqlConnection(connectionString))

Rezultate, be jokio papildomo programavimo gausite kažką panašaus:

image

Kaip matote, puslapio viršutiniame kairiame kampe atsirado informacija apie puslapio pasikrovimo laiką. Paspaudus ant jos, atsiras detalesnė informacija kartu su galimybe peržiūrėti įvykdytus SQL sakinius:

image

Norėdami pilnai išnaudoti MiniProfiler galimybes ir tiksliai žinoti kuri kodo dalis kiek laiko vykdoma, reikia naudoti žingsnius (angl. Step):

var profiler = MiniProfiler.Current;
using (var connection = ProfiledDbConnection.Get(new SqlConnection(connectionString)))
{
    using (profiler.Step("Žingsnio pavadinimas"))
    {
        // darbas su db
    }

    return View();
}

Žingsniai palaiko hierarchijas, tad esant poreikiui, galite labai tiksliai išmatuoti tiek bendrą, tiek skirtingų puslapio dalių greitaveiką.

Tiek šiam kartui, daugiau informacijos apie Mini Profiler for MVC 3 bei išeities kodą galite rasti oficialiame puslapyje.

Rodyk draugams

Nuosavos JavaScript bibliotekos kūrimo karkasas

Parašė Sergejus | 2011-06-20 20:33

MIX11 konferencijos metu dalyvavau vienoje labai įdomioje sesijoje: Good JavaScript Habits for C# Developers. Pagrindinis dalykas kurį išsinešiau – kaip geriausiai rašyti savo JavaScript bibliotekas. Pasirodo, viskas pakankamai paprasta, tereikia pasinaudoti JavaScript kalbos gudrybėmis. Pavyzdžiui, norint realizuoti savo biblioteką SB su metodu say, užtektų panaudoti tokius griaučius:

<!doctype html>
<html>
<head>
    <title>JavaScript Scoping Demo</title>
    <script type="text/javascript">
        (function (global, undefined) {
            var sb = global.sb = {
                say: function (msg) {
                    alert(msg);
                    return false;
                }
            }
        } (this));
    </script>
</head>
<body>
    <script type="text/javascript">
        sb.say("sergejus.blogas.lt!");
    </script>
</body>
</html>

Aukščiau pateiktas karkasas užtikrina, kad niekas piktybiškai negalės pakeisti reikšmės undefined bei globaliai visada bus pasiekiama vardų sritis sb. Taip elegantiška ir paprasta!

Rodyk draugams

Skaitliukas per laiko vienetą

Parašė Sergejus | 2011-06-15 18:56

Šiandien darbe prisireikė galimybės apriboti kreipinių į serverį kiekį per laiko vienetą (pvz., per sekundę). Vaizdžiai, jeigu leidžiama daugiausiai 100 kreipinių į sekundę, o per tą pačią sekundę ateina 150 kreipinių – pirmi 100 bus aptarnauti, o likę 50 – ne. Taip gimė labai naudinga klasė Throttler:

public abstract class Throttler
{
    private readonly long _limit;
    private readonly TimeSpan _timePeriod;
    private DateTime _time;

    protected Throttler(long limit, TimeSpan timePeriod)
    {
        _limit = limit;
        _timePeriod = timePeriod;
        _time = DateTime.UtcNow;
        Lock = new ReaderWriterLockSlim();
    }

    protected ReaderWriterLockSlim Lock { private set; get; }

    public bool Throttle()
    {
        var now = DateTime.UtcNow;

        if (now >= Time.Add(_timePeriod))
        {
            Lock.EnterWriteLock();
            try
            {
                if (now >= _time.Add(_timePeriod))
                {
                    _time = now;
                    ResetCounter(context);
                }
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }

        var count = IncrementCounter(context);

        return count > _limit;
    }

    private DateTime Time
    {
        get
        {
            Lock.EnterReadLock();
            try
            {
                return _time;
            }
            finally
            {
                Lock.ExitReadLock();
            }
        }
    }

    protected abstract void ResetCounter(TContext context);

    protected abstract long IncrementCounter(TContext context);
}

Jos pagrindu aukščiau pateiktas uždavinys sprendžiamas ypač paprastai:

public class TotalCountThrottler : Throttler
{
    private long _count;

    public TotalCountThrottler(long limit, TimeSpan timePeriod)
        : base(limit, timePeriod)
    {
    }

    protected override void ResetCounter(HttpContextBase context)
    {
        Interlocked.Exchange(ref _count, 0);
    }

    protected override long IncrementCounter(HttpContextBase context)
    {
        return Interlocked.Increment(ref _count);
    }
}

Panaudojimas yra elementarus:

public class ThrottlingHandler : IHttpHandler
{
    private readonly TotalCountThrottler _throttler;

    public ThrottlingHandler()
    {
        _throttler = new TotalCountThrottler(100, TimeSpan.FromSeconds(1));
    }

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        if (_throttler.Throttle())
        {
            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            context.Response.End();
        }
    }
}

Pažymėtina, kad minėta klasė gali veikti tiek su Web aplikacijomis, tiek su bet kokiomis kitomis aplikacijomis.

Rodyk draugams

Įspūdžiai iš TechEd 2011 North America

Parašė Sergejus | 2011-06-12 22:03

Štai ir pasibaigė TechEd 2011 North America, o su juo ir mano atostogos JAV. Nusprendžiau trumpai apibendrinti įspūdžius iš konferencijos.

Šiais metais dalyvavo 10 000 dalyvių iš 84 šalių (iš Lietuvos buvo net 7!). Bendroje sumoje galima buvo rinktis iš 551 sesijų, kas sutikit, tikrai įspūdingas skaičius. Pati konferencija irgi buvo įspūdingo didžio. Nors esu dalyvavęs ne vienoje konferencijoje tiek Europoje, tiek JAV, tokio dydžio konferencijos ir parodos nesu matęs. Verta paminėti, nemaža dalis TechEd 2011 sesijų buvo įrašoma ir yra laisvai prieinamos.

Konferencija prasidėjo nuo pagrindinio pristatymo. Kaip ir galima tikėtis, pagrindinės temos apėmė debesų kompiuteriją, Windows Phone 7.1 (Mango), XBox Kinect ir pan. Kiek nuvylė, kad šiais metais TechEd metu kažkokių didesnių naujovių anonsų taip ir bebuvo (laukiame rugsėjį vyksiančios Build konferencijos).

Iš įdomesnių dalykų, verta paminėti Visual Studio vNext ir Team Foundation Server vNext demonstravimą. Pagrindiniai naujos VS akcentai – greitaveika, stabilumas bei daugiau pagalbinių funkcijų (code review, code diff, unit test runner, code clones ir pan.). Didžioji dalis parodytų TFS naujovių buvo susijusios su Agile įrankiais (užduočių valdymas, sprintai ir pan.). Dar vienas su VS ir TFS susijęs aspektas –System Center Operations Manager (SCOM) integracijos paketas, kuris palengvins informacijos apie klaidas surinkimą iš produkcinių serverių.

Kita svarbi konferencijos tema – šiais metais pasirodantis SQL Server 2011 (Denali). Iš pirmo žvilgsnio tikrai yra įdomių naujovių (tarp jų Columstore indeksai ir Always On galimybė). Kitą mėnesį turėtų pasirodyti SQL Server Denali CTP versiją, tada ir galima bus pasižaisti kiek daugiau. Kartu su šia CTP versija bus išleisti SQL Server Developer Tools „Juneau“. Juos galima įsivaizduoti kaip žymiai galingesnį Visual Studio Database Edition variantą, tik kad bus platinami kartu SQL Server.

Šį kartą pagrindinį konferencijos tikslą išsikėliau tokį: aplankyti pristatymus apie sąlyginai naujas man technologijas arba sesijas iš gerųjų praktikų, tarp jų: StreamInsight, SQL Server Denali, LINQ to HPC (dar žinomas kaip Dryad LINQ), Virtual Machine Manager, WCF, Windows Azure AppFabric Service Bus, Sysinternals įrankiai, besivystančios architektūros, lygiagretaus programavimo ateitis ir pan. Buvo labai daug sesijų ir iš Windows Azure, bet jos kiek prieštaravo mano iškeltam tikslui (naujos technologijos), tad praktiškai juose ir nebuvau. Bendram išsilavinimui, labai rekomenduoju pasižiūrėti sesiją Hack Proofing Your Microsoft ASP.NET Web Forms and MVC Applications.

Apibendrinant, konferencija tikrai patiko, labiausiai dėl galimybės rinktis į ką eiti (nors perėjimas iš vieno kambario į kitą kartais užtrukdavo 10 minučių). Jeigu turėsite galimybę kitais metais rinktis TechEd Europoje ar TechEd Amerikoje, tikrai rekomenduočiau paskutinį variantą, juolab pagal pinigus skirtumas ne toks ir didelis gaunasi.

Rodyk draugams