Blog Archives

MSNetwork po peti put


msn5_speaker

 

Po pet put Microsoft BiH organizira najveću i najpoznatiju Microsoft Konferenciju u Bosni i Hercegovini pod nazivom MSNetwork. Sjetimo se da je prva konferencija organizirana u Banjaluci, zatim u Mostaru, a nakon toga dva puta Microsoft je organizirao konferenciju u Tesliću. Ovog puta konferencija se održava u Neumu, a i datum konferenciju je malo pomjeren prema maju mjesecu, odnosno da bi i vremenski ugođaj puo potpun.

Po peti put pripala mi je čast da održim jedno od predavanja koja će se održati na konferenciji. Ovaj put predavanje će biti o jednom od najprepoznatljiviji Azure servisa i to Microsot Azure Machine Learning. Krajem jula mjesca 2014 godine Microsoft je najavio ovaj cloud servisa, a globalnu dostupnost Azure Machine Leraning, Microsoft je objavio tokom jeseni iste godine.

Od kada je objavljen u julu mjesecu 2014. godine, Azure Machine Learning, AML postaje jedan od najprepoznatljivijih Microsoft cloud servisa. AML je jednako interesantan kako akademskoj zajednici tako i industrijskom marketingu jer na jedinstven način omogućuje mašinsko učenje (machine learning) za modeliranje i predviđanje rezultata. AML je cloud servis čiji su algoritmi razvijeni kao rezultat su desetak godina korištenih tehnologija unutar Microsoft proizvoda od Internet Explorera, SQL Servera, BING-a, te drugih Microsoft proizvoda. Ovo predavanje će dati detaljan pregled cjelokupnog AML. Kroz demo primjere biće prezentirani neki od često korištenih primjera za predviđanje, kao i primjere vlastitih rješenja rađenih tokom eksperimentalnih istraživanja na doktorskoj disertaciji, te istraživanja u području praćenja i analize kvaliteta vode rijeke Une.

Predavanje će početi u 16:15, 28. aprila u dvorani Galerija.

datum_predavanja

 

Vidmo se na konferenciji.

Šta je bilo prvo, kompjuter ili program, ko je prvi programer koji je živio na zemlji?


Blog post objavljen uz najavu MSNetwork 4 konferencije. msnetwork5

MS NetWork konferencija predstavlja najbolji i najmasovniji IT događaj u našoj zemlji, sa najvećom koncentracijom IT stručnjaka na jednom mjestu. Iz godine u godinu postaje sve bolja i bolja, a siguran sam da će se u tom pravcu nastaviti i po četvrti put. Ono po čemu ova konferencija ostaje zapamćena jeste po ljudima koje sretneš, idejama koje razmjenjuješ, i diskusijama koje vodiš. I sve to se dešava vrlo neformalno i opušteno pa diskusije nekad odu u vrlo čudnom, ali svakako zanimljivom smjeru.

Prije par dana razmišljao sam o tome šta je bilo prvo, kompjuter ili program? Vjerojatno su neki već čuli ovu priču. Kako se može napraviti program, a da kompjuter ne postoji? To je svakako jedno je od logičkih pitanja ovdje. Ali, ko je bio prvi programer?

Ovdje ćemo pokušati odgovoriti na pitanje iz naslova, a diskusija će biti vjerojatno predmet nekih kružoka na konferenciji. Činjenica da smo generacija koja živi u doba personalnih kompjutera, interneta i pametnih telefona, čini nas privilegovanom generacijom. Današnji stepen razvoja tehnologije, koja je prisutna u svakodnevnom životu, rezultat je evolucije ljudskog bića, a prije svega istrajnog rada i odricanja stotina nadarenih ljudi tokom hiljada godina ove civilizacije. Samo možemo pretpostaviti koliko je genijalnih ljudi živjelo na zemlji koji su doprinijeli današnjem naučnom stepenu, a koji su pali u historijski zaborav zbog nepostojanja zapisa o njima ili zbog činjenice da su skončali život zato što se nekom lokalnom vladaru nisu svidjela njihova promišljanja. Bilo kako bilo, danas se historija tumači na osnovu ostavštine pisanih i stvaralačkih djela koja svjedoče o permanentnoj genijalnosti ljudskog roda. Kao što je poznato, zanimanja softverskog inženjera, programera ili IT inženjera, prvenstveno se percipiraju kao muški posao, iako imamo mnogo primjera gdje su žene razvile sjajne karijere u IT industriji, no ogromnu većinu ipak čini muška populacija.

Nakon ovakvog faktičkog stanja danas, ne možemo ni pomisliti da je prvi programer bila žena, i to kakva žena. Priča o prvoj programerki dosta dugo je bila daleko od javnosti, jer to tada uopće nije bilo važno. Međutim, kada je kompjuterska nauka počela da postaje nešto oko čega se vrti veliki novac, i kada su počeli da se razvijaju programski jezici visokog nivoa, tek tada su ljudi počeli kopati po starim arhivama i tražiti ko je to bio prvi programer u historiji čovječanstva, i šta je prvo nastalo, kompjuter ili program.

Mnogo prije prvih programskih jezika, nije bilo popularno praviti razliku između hardvera i softvera, pa na primjer kad se kaže „isprogramirati“ bilo je slično kao kad se kaže „zalemiti“ ili „zavariti“ Možete zamisliti kako bi ljudi prije 100 ili više godina pomislili kad bi kazali da ste našli bug u programu. Historija kaže da je prvi uređaj koji se mogao isprogramirati konstruisao Charless Babbage, dok se za prvog programera tog istog uređaja smatra kćerka engleskog poete i lorda, Augusta Ada King Lovelance (1815-1852.). Ova mlada žena bila je privržena prirodnim naukama, prvenstveno matematici, a otac ju je iz milja zvao „Princeza paralelograma“. Danas kad bi nekoj ljepšoj polovini dao kompliment da je kao paralelogram, vjerojatno bi dobio „petaka iza ušiju“.

babbage

Babbageov dizajn mehaničkog kompjutera služio je za izračunavanje polinomskih funkcija, a mogao se instruirati da izvršava zapisani program. Program zapisan na karticama sekvencijalno bi izvršavao mehanički kompjuter. Zanimljivo da se ova mašina za računanje sastojala od mlina (eng. mill) i skladišta (eng. storage), koji po funkciji koji su obavljali odgovaraju današnjim procesorima i memoriji. Ovakva mašina trebala je posebno educirane ljude koji bi izrađivali programe, a tu dolazimo do Ade i njene uloge u svemu ovom.

babbageengine

Babbageova mašina koja se mogle programirati.

Kako navode izvori u periodu 1842-43, Ada je radila na prevodu Babbagovih predavanja oko najnovijeg mehaničkog kompjutera tzv. analitičke mašine, koju je Babbage dizajnirao poslije neuspjeha sa prvom mašinom iz 1822. godine. Kako je Ada bila upoznata s njegovim radom na prvoj mašini, napravila je posebnu sekciju u kojoj je elaborirala razlike u dizajnu. U tu svrhu napravila je primjer programa koji računa Bernulijeve brojeve. Njena implementacija računanja Bernulijevog niza racionalnih brojeva smatra se prvom implementacijom kompjuterskog programa, a Ada kao prvi programer, odnosno programerka.

Augusta Ada King Lovelance (1815-1852.)

Augusta Ada King Lovelance (1815-1852.)

Ada se 1842. godine našla u službi prevodioca Babbagovih predavanja, koje je držao na Univerzitetu u Torinu. Naime, ova predavanja posredno su bila prevedena na francuski jezik i objavljena u Ženevskoj biblioteci, kada je Ada bila zamoljena da ova predavanja prevede na engleski jezik. Tokom prevođenja Ada je davala određene komentare i pojašnjenja na prevod, a njena posebna Sekcija G sadržavala je program napisan za računanje Bernulijevih brojeva.

Slučajno ili ne, prevod Babbagovih predavanja koje je Ada prevela čekali su više od 100 godina da ponovo vide svjetlo dana i da postanu historija. Naime, 1953. godine nacrti Babbagove analitičke mašine postali su i formalno najstariji zapisi koji govore o prvom modelu kompjutera, a Adini zapisi kao prvi napisani kompjuterski program. Na žalost, Charless Babbage nikad nije završio svoj mašinski kompjuter. Mnogo godina kasnije, tačnije 2008. godine, Babbagov prvi kompjuter ipak je konstruisan i nalazi se u Computer Museum History u Kaliforniji.

Konačno, dolazimo do odgovora, šta je prvo nastalo kompjuter ili program? Vjerojatno ste se pitali kako se može napraviti program za kompjuter koji ne postoji. Ipak, tako se i desilo, Ada napravila program za kompjuter koji nikad nije bio napravljen, a prvi programer u stvari je bio žena. Krajem sedamdesetih i početkom osamdesetih godina prošlog stoljeća, u čast prvog programera nastao je programski jezik nazvan ADA. Historija se poigrala sa prvim programiranim kompjuterom i prvim programom, na način da kompjuter nije bio napravljen, a program testiran. Radujem se nastavku diskusije na konferenciji!

PS: pictures are taken from http://www.computerhistory.org/babbage/

Using TaskCompletionSource in wraping event handler


Using TaskCompletionSource you can wrap any operation in to task, so that you can do anything you can with the task object. The TaskCompletionSource class is very important and today’s post will be explain how to wrap button click event in to TaskCompletionSource. With this wrap we will see how complicated operation behind click button handler can be simplified.

The for this blog post is simple Windows Store app shown on the picture below.

screen_sample2

When the Play Slides is clicked, Image slide is started which start animation of images. XAML code behind this app is listed here:

<Page.Resources>
    <Storyboard x:Name="animImageSlideIn">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
                                        Storyboard.TargetName="img">
            <EasingDoubleKeyFrame KeyTime="0" Value="900"/>
            <EasingDoubleKeyFrame KeyTime="0:0:2" Value="0" />
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Height="250" >
        <Button x:Name="playbtn" Height="50" Margin="0,5,0,5" Content="Play Slides" HorizontalAlignment="Center" Click="playbtn_Click"></Button>

        <Image x:Name="img" HorizontalAlignment="Center">
            <Image.RenderTransform>
                <CompositeTransform TranslateY="900" />
            </Image.RenderTransform>
        </Image>
    </StackPanel>
</Grid>

First, it will be presented  the implementation without TaskCompletionSource. The Play Slides Click event is the following code:

private async void  playbtn_Click(object sender, RoutedEventArgs e)
{
    int i = 1;

    EventHandler<object> handler = null;

    handler = delegate
    {
        if (i <= 3)
        {
            playbtn.Content = string.Format("Slide Image {0}",i);

            LoadSourceImage(i);

            animImageSlideIn.Begin();

            i++;
        }
        else
        {
            playbtn.Content = "Play Slides";
            animImageSlideIn.Completed -= handler;
            LoadSourceImage(0);

        }
    };

    animImageSlideIn.Completed += handler;
    handler(null,null);
}

As we can see from the listing above the code is pretty much long and little bit confused because we subscribe to the handler and call it as much as we reach the magic number of slides. Whe the number of slides is reached we unsubscribed from the handler and exit  the method.

Now implement the same functionality with the TaskCompletionSource class. The following listing shows the implementation:

private async void playbtn_Click(object sender, RoutedEventArgs e)
{

for(int i=1; i<=3; i++)
{
playbtn.Content = string.Format("Slide Image {0}",i);
LoadSourceImage(i);
await animImageSlideIn.RunAsync();
}

playbtn.Content = "Play Slides";
}

As we can see the implementation is very simple and concise. in for loop we call LoadSourceImage then asynchrony run animation.

The source code of the demo can be found by clicking the image below:

This blog post is inspired by Stephen Toub //build/ session.

Pausing and cancelling async method in C#


Responsiveness of your app is not just fee UI thread by implementing async. It is more that that. When a long operation is under process in your app, user sometimes wants to cancel it  or  pause the operation. Imagine your app processing hundreds of files or images. Such a operation can take more that few seconds and user must have option to cancel it. Canceling and pausing are very important feature for every app that implements long operations.

This blog post will present the way of using CancelationToken built in cancel feature in .NET, as well as a PauseToken custom implementation which is very similar to CancelationToken.

Original implementation of PauseToken is from the pfxteam blog which you can find here.

We will implement simple Windows Store app with cancel and pausing the async operation. The picture below shows the sample app:

screen_sample1

 

As you can see when the Start Process button is clicked it begins process of processing image files. There is also ProgressRing control which shows the progress and percentage of completeness. From the right side you can see two buttons. The Cancel button cancels the operation, and pause button pauses operation until the Pause button is clicked again.

The implementation behind Process button is the folowing:

private async  void btnProcess_Click(object sender, RoutedEventArgs e)
{
    //creating cancel and pause token sources
    m_pauseTokeSource = new PauseTokenSource();
    m_cancelationTokenSource = new CancellationTokenSource();

    //get al picture from picture library
    var picturesFolder = KnownFolders.PicturesLibrary;
    var fileList = await picturesFolder.GetFilesAsync();

    //set ProgressRing to active
    ring2.IsActive = true;

    try
    {
        //asynchrony process files, by passing pasue and calcel tokens

        await ProcessImages(fileList, m_pauseTokeSource.Token, m_cancelationTokenSource.Token);
    }
    catch (Exception)
    {
        //do nothing when somthing went wrong not when taks is canceled
    }
    finally
    {
        //make inactive ProgressRing
        ring2.IsActive = false;
    }
}

Click event implementation of the Start Process button 

First we create Cancel and Pause Source tokens. Gent the picture content in form of list of files. Then we call asynchonious ProcessImages method by passing list of images files, cancel and pause tokens. Process images is called within try catch finally blocks, because every cancel task throws exception.

Implementation ProcessImages async method

ProcesImage method is async method which accept cancelation and pasue token nad returns Task object.

public async Task ProcessImages(IEnumerable<StorageFile> images, PauseToken pauseToken, CancellationToken cancelToken)
{
    double count=images.Count();
    double current=0;
    foreach (var file in images)
    {
        //if the paise is active the code will wait here but not block UI thread
        await pauseToken.WaitWhilePausedAsync();

        ring2Text.Text = string.Format("{0}%",(int)(100*current / count));

        await ProcessAsync(file, cancelToken);
        current++;
    }
    ring2Text.Text = string.Format("100%");
}

In foreach loop first we await pauseToken.WaitWhilePausedAsync(); which wait if IsPause property of the Token class is true, otherwize there is no awaiting here. The next await is out Delay which takes cancelation token as parameters. When the Pause button is clicked, pauseToken is awaiting until the pause button is clicked again. In case of cancelation when the Cancel button is clicked the Cancel() method of the cancelationTokenSource is called and exception is thorwn. Then processImages method is interupted and finally blick progressring is disabled.
Pause and Cancel Click implementation are shown in the following listing:

private void btnPause_Click(object sender, RoutedEventArgs e)
{
 m_pauseTokeSource.IsPaused = !m_pauseTokeSource.IsPaused;
}

private void btnCancel_Click(object sender, RoutedEventArgs e)
{
 m_cancelationTokenSource.Cancel();
}

Complete source code can be downloaded from link below.