BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

ITishnikai #12 – dizaino ir UX svarba

Parašė Sergejus | 2012-02-22 22:05

Naujame ITishnikai epizode mes kalbame apie dizainą ir UX (User eXperience) svarbą su UX dizaineriu Edvinu Aržatskiu. Kaip visada laida prieinama mūsų Facebook puslapyje bei parsiuntimui. Labai laukiam jūsų atsiliepimų bei komentarų!

Rodyk draugams

ZeroMQ – Įvadas (1 dalis)

Parašė Sergejus | 2012-02-19 18:46

Šiandien pradedu straipsnių ciklą apie neįtikėtiną biblioteką ZeroMQ (ØMQ), kuri leidžia ženkliai supaprastinti paskirstytų programų kūrimą. Pradėsiu nuo to, kas nėra ZeroMQ. Nepaisant MQ santrumpos pavadinime, tai nėra eilių (angl. Message Queue) sprendimas kaip RabbitMQ, ActiveMQ ar MSMQ. Taipogi, tai nėra WCF ar Thrift RPC atitikmuo. Aš apibrėžčiau ZeroMQ kaip ypatingai greitą ir labai paprastą panaudojime buferizuotą soketų komunikavimo biblioteką.

Kam teko programuoti soketus (nesvarbu kokia programavimo kalba), tikriausiai pritars, kad tai nėra labai paprastas užsiėmimas reikalaujantis pakankamai gilių tinklo žinių. Reikia galvoti apie prisijungimus, atsijungimus, ryšio palaikymą, buferizavimą, tinklo problemų aptikimą, siuntimo pakartojimą ir dar daug kitų dalykų. ZeroMQ – tai labai patogi abstrakcija virš soketų. Ši biblioteka leidžia pamiršti apie visas su žinučių perdavimu susijusias problemas išlaikant soketų greitaveiką.

ZeroMQ galimybių apžvalga

ZeroMQ leidžia nesukti galvos dėl prisijungimo eiliškumo – klientai ir serveriai gali būti paleidžiami bet kokia eilės tvarka. Jeigu klientas pasileis pirmas ir reikalingo serverio nebus – visos žinutės bus kaupiamos kliento pusėje ir išsiųstos kai tik serveris taps prieinamas.

Dėl bibliotekos paprastumo (leidžiama siųsti ir priimti tik baitų masyvus), nereikia prisirišti prie konkretaus komunikavimo protokolo ir galima naudoti bet kurį duomenų formatą: JSON, BSON, Protocol Buffers (ProtoBuf) ir t.t.

Kadangi ZeroMQ yra žemo lygio abstrakcija virš soketų parašyta su C ir viduje veikia pilnai asinchroniškai, ji pasižymi ypatinga greitaveika. Lokaliame kompiuteryje man pavyko pasiekti 30 tūkstančių žinučių per sekundę perdavimo greitį, įskaitant duomenų serializavimą į ir iš ProtoBuf.

Kita nuostabi bibliotekos savybė – ji palaiko visus pagrindinius komunikavimo šablonus:

Papildomai, ZeroMQ palaiko tokius transporto protokolus kaip in-process, IPC, multicast ir TCP. Norimas protokolas nurodomas tiesiai prisijungimo eilutėje, tad jo keitimas yra trivialus konfigūracijos atnaujinimas.

Ir pabaigai, kas labiausiai mane sužavėjo – ZeroMQ automatiškai palaiko žinučių balansavimą (round-robin principu) bei turi lokalius buferius (eiles). Visos įeinamos ir išeinamos žinutės pirma dedamos į eiles, iš kurių žinutė po žinutės yra išimamos ir apdorojamos.

ZeroMQ apribojimai

Apart visų aukščiau išvardintų privalumų, manau būtina žinoti ir tam tikrus bibliotekos apribojimus. Skirtingai negu pilnaverčiai eilių sprendimai, ZeroMQ neturi centrinio brokerio, kas gali būti tiek privalumas, tiek ir trūkumas:

  • Brokerio nebuvimas leidžia pasiekti žymiai geresnių greitaveikos rezultatų negu bet koks kitas eilių sprendimas.
  • Brokeris eilių sprendimuose yra labai svarbus ir jam nulūžus – visos eilės sustoja. ZeroMQ tokios problemos neturi, nes centrinio komunikavimo taško nėra.
  • Architektūriškai, ZeroMQ negarantuoja žinučių eiliškumo išlaikymo, tad vėliau siųsta žinutė gali būti apdorota pirmiau už anksčiau siųstą.
  • Kadangi žinučių eilės saugomos atmintyje, nulūžus programai pradings ir visos neapdorotos / neišsiųstos žinutės.

Kitoje dalyje

Tiek šiam kartui, tikiuosi pavyko jus sudominti ZeroMQ galimybėmis. Kitoje dalyje sukursime kliento-serverio programas, kurios komunikuos Request / Reply principu su automatiniu žinučių balansavimu.

Rodyk draugams

UrlBuilder – paprasta klasė skirta URL formavimui

Parašė Sergejus | 2012-02-08 23:15

Atnaujinta: Atviras kodas daro stebuklus, su Giedriaus pagalba turime atnaujintą klasės variantą!

Darbas su HTTP API dažnai iš programuotojų reikalauja URL formavimo. Keista, bet .NET Framework iki šiol neturi standartinės klasės šiai užduočiai spręsti. Egzistuoja artima pagal paskirtį UriBuilder klasė, bet ji nėra optimizuota darbui su URL. Bekuriant DotNetGroup 3.0 gimė labai paprasta URL formavimui skirta klasė UrlBuilder:

public class UrlBuilder
{
    private readonly Uri baseUrl;
    private readonly IList<string> relativeUrlParts;
    private readonly IList<string> queryStringParameters;

    public UrlBuilder(string baseUrl)
    {
        if (baseUrl == null)
        {
            throw new ArgumentNullException("baseUrl");
        }

        if (!Uri.IsWellFormedUriString(baseUrl, UriKind.Absolute))
        {
            throw new ArgumentException("Base URL format is not valid", "baseUrl");
        }

        this.baseUrl = new Uri(baseUrl);
        this.relativeUrlParts = new List<string>();
        this.queryStringParameters = new List<string>();
    }

    public void AddPart(object value)
    {
        this.relativeUrlParts.Add(value.ToString());
    }

    public void AddParameter(string name, object value)
    {
        this.queryStringParameters.Add(name + "=" + value);
    }

    public string Build()
    {
        var relativeUrl = new Uri(string.Join("/", this.relativeUrlParts), UriKind.Relative);
        var queryString = string.Join("&", this.queryStringParameters);

        var uriBuilder = new UriBuilder(new Uri(this.baseUrl, relativeUrl))
        {
            Query = queryString
        };

        return uriBuilder.Uri.AbsoluteUri;
    }
}

Kaip matote, rezultate gavosi visai patogi pagalbinė klasė URL formavimui:

[TestFixture]
public class UrlBuilderTests
{
    private const string BaseUrl = "http://api.dotnetgroup.dev";

    [Test]
    public void Given_No_Arguments_Base_Url_With_Trailing_Slash_Is_Returned()
    {
        var expectedUrl = "http://api.dotnetgroup.dev/";

        var urlBuilder = new UrlBuilder(BaseUrl);

        var url = urlBuilder.Build();

        Assert.AreEqual(expectedUrl, url);
    }

    [Test]
    public void Given_Type_Argument_Correct_Url_Is_Generated()
    {
        var expectedUrl = "http://api.dotnetgroup.dev/?type=rss";

        var urlBuilder = new UrlBuilder(BaseUrl);
        urlBuilder.AddParameter("type", "rss");

        var url = urlBuilder.Build();

        Assert.AreEqual(expectedUrl, url);
    }

    [Test]
    public void Given_Date_From_And_Limit_Correct_Url_Is_Generated()
    {
        var expectedUrl = "http://api.dotnetgroup.dev/?from=2012-01-01%2010:00:00&limit=10";

        var urlBuilder = new UrlBuilder(BaseUrl);
        urlBuilder.AddParameter("from", "2012-01-01 10:00:00");
        urlBuilder.AddParameter("limit", 10);

        var url = urlBuilder.Build();

        Assert.AreEqual(expectedUrl, url);
    }

    [Test]
    public void Given_Get_And_Id_Parts_Correct_Url_Is_Generated()
    {
        var expectedUrl = "http://api.dotnetgroup.dev/get/1";

        var urlBuilder = new UrlBuilder(BaseUrl);
        urlBuilder.AddPart("get");
        urlBuilder.AddPart(1);

        var url = urlBuilder.Build();

        Assert.AreEqual(expectedUrl, url);
    }
}

P.S. Šios klasės išeities kodas taipogi prieinamas DotNetGroup 3.0 GitHub repozitorijoje.

Rodyk draugams

ITishnikai #11 – IT darbo interviu

Parašė Sergejus | 2012-02-05 16:09

Naujame ITishnikai epizode mes kalbame apie IT darbo interviu ir CV sudarymą su personalo vadove Agne Klasavičiene. Laida prieinama mūsų Facebook puslapyje bei parsiuntimui. Labai laukiam jūsų atsiliepimų bei komentarų!

Minėtos nuorodos:

Rodyk draugams