Category Archives: C#

Analitička geometrija i C# programiranje dio 6/n


Problem 6: Ugao između prave i ravni.

Pretpostavimo da imamo pravu p na kojoj poznajemo koordinate tačaka A i B. Također pretpostavimo da imamo ravan Π koja je definisana tačkom na ravni R i vektorom normale V. Potrebno je izračunati ugao alpha  kojeg obrazuje prava i ravan.

angprogr_slproblem6

Rješenje: Rješenje zadatka svodi se na izračunavanje ugla između vekktora prave p i njene projektcije na ravan Π p'. Kako već imamo vektor prave p, još je samo potrebno da se odredi vektor prave p’ koja predstavlja projekciju prave na ravan. S druge strane znamo da je vektor normale okomut na vektor smijera projektovane prave, pa je traženi ugao komplement ugla koji zatvara parava i vektor normale. Na osnovu ovog imamo:

cos (90- \alpha) = \frac {|p \cdot V|}{\left | p \right |\left | V \right |}

Implementacija u C# izgleda kao na sljedećem listingu:

static void Main(string[] args)
{
    //Zadatak 1: data je ravan 2x-y+z-6=0 i prava (x)/-1 = (y-1)/-1 ) (z-6)/1
    //ulazni podaci za zadatak 1.
    Point B  = new Point(2f,  4f,  0f);      //tacka na pravoj
    Point A  = new Point(0f,  1f, -1f);   //tačka na pravoj
    Point R  = new Point(0f,  0f,  6f);     //tacka na ravni
    Point Vn = new Point(2f, -1f,  1f);   //vektor normalne ravni

    //izracunavanje ugla
    //Vektor pravca kojeg obrazuju tacke A i B
    Point zraka = Point.Vector(A,B);
    //
    var vec = Point.CrossProduct(zraka, Vn);
    float scos_alpha = (float)(Point.Modul(vec) / (Point.Modul(Vn) * Point.Modul(zraka)));
    Console.WriteLine("Cosinus ugla alpha iznosi={0}", scos_alpha);
    Console.Read();
}

Klasa Point je implementirana u prethodnom postu.

Analitička geometrija i C# programiranje dio 5/n


Problem 6: Presjek prave i ravni.

Pretpostavimo da imamo pravu p na kojoj poznajemo koordinate tačaka A i B. Također pretpostavimo da imamo ravan Π koja je definisana tačkom na ravni R i vektorom normale V. Potrebno je izračunati koordinate tačke A’ odnosno probodišta.

angprogr_slproblem5

Rješenje:

Za rješenje ovog problem potrebno je da znamo parametarski oblik jednačine prave, odnosno jednačinu ravi. Pored toga potrebno je da znamo vektorski odnosno skalarni proizvod dva vektora.

Ukoliko imamo dvije tačke A i B, jednačina prave kroz dvije tačke data je kao:

\frac{x-X_A}{X_B-X_A}=\frac{y-Y_A}{Y_B-Y_A}=\frac{z-Z_A}{Z_B-Z_A},

gdje je (X_A,Y_A,Z_A) koordinate tačke A, a (X_B,Y_B,Z_B) koordinate tačke B.

Opći oblik jednačine ravni koja je definisana jednom tačkom i vektorom normale data je u obliku:

A(x-X_R)+B(y-Y_R)+C(z-Z_R)=0 ,

gdje je (A,B,C) predstavlja koordinate vektora normale, a R(X_R,Y_R, Z_R) koordinate tačke R koja pripada toj ravni.

Postupak rješavanje probojne tačke je slijedeći:

 

1. Formirajmo parametarski oblike jednačine prave p, gdje t predstavlja parametar.

p(t)=A+t(B-A), ………(1)

2. Uvrštavajući gornju jednačinu prave u jednačinu ravni imamo:

V x (A'-V)=0. ………(2).

Zamjenom 1 u 2 možemo izračunati parametar t:

t= V x (V-A)/(N x (B-A)) .

Kada imamo vrijednost parametra t, sada je moguće izračunati koordinate tražene tačke A’.

C#  implementacija problema 6 izgleda na slijedeći način.

Implementacije klase Point koja implementira tačku u 3D prostoru preko koordinata x,z,y, te skupa metoda za skalarni, vektorski proizvod, kao i modul vektora.

class Point
{
    public float x;
    public float y;
    public float z;
    public Point() { }
    public Point(float xx, float yy, float zz)
    {
        x = xx;
        y = yy;
        z = zz;
    }

    /// <summary>
    /// Izracunavanje vektorskog proizvoda dva vektora
    /// </summary>
    /// <param name="vectorA"></param>
    /// <param name="vectorB"></param>
    /// <returns>vektorski proizvod</returns>
    public static Point CrossProduct(Point vectorA, Point vectorB)
    {
//                | i  j  k  |
//                | x1 y1 z1 |=i*(y1*z2-z1*y2)-j*(x1*z2-z1*x2)+k*(x1*y2-y1*x2)
//                | x2 y2 z2 |

        return new Point()
        {
            x = vectorA.y * vectorB.z - vectorA.z * vectorB.y,
            y = -vectorA.x * vectorB.z + vectorA.z * vectorB.x,
            z = vectorA.x * vectorB.y - vectorA.y * vectorB.x
        };
    }

    /// <summary>
    /// Izracunavanje skalarnog proizvoda dva vektora
    /// </summary>
    /// <param name="vectorA"></param>
    /// <param name="vectorB"></param>
    /// <returns></returns>
    public static float ScalarProduct(Point vectorA, Point vectorB)
    {
//      proizvod=x1*x2+y1*y2+z1*z2
        float retVal = vectorA.x * vectorB.x + vectorA.y * vectorB.y + vectorA.z * vectorB.z;
        return retVal;
    }
    /// <summary>
    /// Odredjivanje vektora kroz dvije tacke
    /// </summary>
    /// <param name="A"></param>
    /// <param name="B"></param>
    /// <returns></returns>
    public static Point Vector(Point A, Point B)
    {
        //referentni vektor ili pravac kroz referentne tačke na pravoj
        Point vektor = new Point();
        vektor.x = B.x - A.x;
        vektor.y = B.y - A.y;
        vektor.z = B.z - A.z;

        return vektor;
    }

    /// <summary>
    /// Odredjivanje modula vektora
    /// </summary>
    /// <param name="A"></param>
    /// <returns></returns>
    public static float Modul(Point A)
    {
        return (float)Math.Sqrt(A.x*A.x+A.y*A.y);
    }
}

Kada imamo ovako implementiranu klasu onda je određivanje probojne tačke prave i ravni dato kao:

static void Main(string[] args)
{
    //Zadatak 1: data je ravan 2x-y+z-6=0 i prava (x)/-1 = (y-1)/-1 ) (z-6)/1
    //ulazni podaci za zadatak 1.
    Point B  = new Point(2f,  4f,  0f);      //tacka na pravoj
    Point A  = new Point(0f,  1f, -1f);   //tačka na pravoj
    Point R  = new Point(0f,  0f,  6f);     //tacka na ravni
    Point Vn = new Point(2f, -1f,  1f);   //vektor normalne ravni

    //Zadatak 2: data je ravan 2x-y+z-6=0 i prava (x-1)/-1 = (y+1)/-1 ) = (z-4)/1
    //ulazni podaci za zadatak 2.
    //Point B = new Point(0f, -2f, 5f);      //tacka na pravoj
    //Point A = new Point(1f, -1f, 4f);   //tačka na pravoj
    //Point R = new Point(0f, 0f, 6f);     //tacka na ravni
    //Point Vn = new Point(2f, -1f, 1f);   //vektor normalne ravni
           
    //Probojna tačka koju treba odrediti
    Point proboj = new Point();
          
    //Vektor pravca kojeg obrazuju tacke A i B
    Point zraka = Point.Vector(A,B);

    //ako je skalarni proizvod vektora prave i normale jednak nuli
    // tada prava ne sijece ravan
    float scalVal = Point.ScalarProduct(Vn,zraka);
    if(scalVal==0)
    {
        Console.WriteLine("Prava ne sijece ravan");
        Console.Read();
        return;
    }

    //skalarni proizvod tačke na ravni sa
    float D = Point.ScalarProduct(Vn,R);
    float AR = Point.ScalarProduct(A,Vn);
    float zrakaR = Point.ScalarProduct(zraka,Vn);
    //
    float t = (D - AR) / (zrakaR);

    //tacka probodistva
    proboj.x = A.x + zraka.x * t;
    proboj.y = A.y + zraka.y * t;
    proboj.z = A.z + zraka.z * t;

    Console.WriteLine("Tacka probodista je A'({0},{1},{2})",proboj.x,proboj.y,proboj.z);
    Console.Read();
}

Windows Azure Notification Hubs


Članak objavlje prošlog mjeseca na http://www.info.ba portalu.
Edin Mulić, Principal Developer
Damir Dobrić, Lead Architect
Bahrudin Hrnjica, Senior Developer
http://www.daenet.com

Familija produkata koji pripadaju grupi servisa za Windows Azure ( Windows Azure Platform Services) proširena je sa nekoliko novih rješenja. Krajem augusta ove godine Microsoft je objavio tzv. General Availability (GA) za Windows Azure Bus Notification Hubs. Sa početkom nove fiskalne godine, u julu 2013. Microsoft je stavio fokus na temu Devices & Services. U ovom članku vam predstavljamo jedan od važnijih Cloud servisa nove Microsofove strategije.

Razmjena poruka neovisna o platformi

Kao što je već poznato, broj pametnih uređaja iz dana u dan neprestano raste. U pametne uređaje ubrajamo sve one koji posjeduju određenu inteligenciju dovoljnu za pristup web-u ili sličnim okruženjima (npr. Intranet, Extranet itd.). Posebno interesantne vrste pametnih uređaja su tablet računari i pametni telefoni. Svi ti uređaji, neovisno o platformi na kojoj rade (iOS, Android, Windows itd.), nude poseban način prikaza obavijesti, poznat kao „Notijnnbfications“. Slika 1 prikazuje jednu takvu obavijest na iPhone uređaju.

Slika 1: iPhone PNS

Logično, za svaku platformu definisan posebam sistem slanja i primanja obavijesti.
Trenutno su prisutni sljedeći servisi za slanje obavijesti (Notification Messaging Services):

  1. Windows Push Notification Services (WNS) za Windows 8.
  2. Microsoft Push Notification Service (MPNS) za Windows Phone.
  3. Apple Push Notification Service (APNs)
  4. Google Cloud Messaging (GCM)

Microsoft nudi čak dva takva servisa. Jedan za Windows i jedan za Windows Phone.
Za dodatno usložnjavanje pobrinuo se XAMARIN, koji odskora nudi jedan daljnji Notification Hub Service.

Jedan od izazova pri razvoju softvera je implementacija servisa, koji podržavaju sve te platforme. Nažalost, svi aktuelno postojeći servisi za slanje obavijesti su međusobno vrlo različiti. Svi nude različite API i protokole.

Na slici 2 možemo vidjeti pojednostavljenu arhitekturu od Windows 8 Push Notification Service.

Slika 2: Arhitektura Win 8 PNS servisa

Slika 3 prikazuje Apple Notification Service.

Slika 3: Apple Notification Service

Arhitektura svih postojećih servisa za obavijesti, možemo reći da nisu trivijalne. Kod svih platformi potrebno je nekoliko koraka za izvršavanje dviju, ustvari, vrlo jednostavnih operacija:

  1. Da se App registruje kod servisa za slanje obavijest (Notification Service)
  2. Da se obavijest (Notification) pošalje

Ako je pri tome potrebno implementirati servis koji će biti u stanju opsluživati sve Notification servise, možemo konstatovati da složenost raste eksponencijalno.

Kao argument toj tvrdnji, zamislimo sljedeći primjer: Potrebno je implementirati konzolnu aplikaciju koja može slati obavijesti svim Android, iPhone, Windows Phone i drugim uređajima. Takav zadatak sigurno nije nerješiv, ali je neuporedivo teži za implementaciju od npr. programiranja prosječnog App-a.

Ako pođemo od činjenice da su obavijesti (Notifications) u većini slučajeva samo jedna od mnogih svojstava jednog App-a, vrlo brzo ćemo primjetiti da realizacija jednog takvog servisa u konvencionalnim projektima nema smisla,barem ne sa finansijskog aspekta.

Šta je Windows Azure Bus Notification Hub

Ako smo u stanju shvatiti kako obavijesti funkcioniraju na različitim platformama, onda nam neće biti teško shvatiti šta je ideja iza Windows Azure Notification Hubs.
Microsoft je izgradio jednostavan Cloud servis koji je u stanju da podrži sve trenutno postojeće platforme. Osim toga, jedan Hub mora biti u stanju u najkraćem vremenu doseći milione uređaja.

Windows Azure Notification Hub platforma rješava nekoliko problema, od kojih jedan prosječan programer često nije ni svjestan. U narednom tekstu pobrojimo nekoliko osobina:

Neovisnost o platformi
Svaki moderni servis je prije svega neovisan o platformi. Slanje neke poruke (Notification) implementirano je manje-više sa nekoliko linija koda, te kao takva može biti primljena od Android, iOS ili Windows (Windows 8 ili Windows Phone) uređaja.

Aktualiziranje token-a
PNS (Push Notification Services) servisi pretpostavljaju da jedan App redovno aktualizira PNS token-e. Kod mnogih registriranih uređaja to dovodi do enormnog opterećenja mreže.
Ako uz to uzmemo u obzir i povećanu potrošnju energije, možemo tvrditi da PNS servisi nisu baš idealno koncipirani. Service Bus Notification Hub preuzima taj zadatak od vašeg App-a.

Broadcasting
Većina PNS servisa ne podržava Boradcasting, tako da je upitno da li je uopće moguće dostići veliki broj uređaja. Prije svega, programski kôd u servisu mora biti koncipiran za sve moguće platforme (GCM, APNS itd.) te dodatno biti u stanju da upravlja jednim enormno velikim brojem registriranih uređaja. Naivno je mišljenje da je proces slanja miliona poruka jednostavno kao izheklati (programirati ) jednu foreach petlju za milion ili više registriranih uređaja. Proces slanja nije jednostavan, jer se u tom slučju moraju koristiti posebne implementacije poput primjera korištenja Topics od Windows Azure Service Bus.

Tagging
Windows Azure Notification Hubs nudi jednu vrlo jednostavnu mogućnost za kontroliranje trasiranja (Routing) obavijesti. Na primjer, pri registraciji je moguće definisati tzv. „Tags“ (oznake). Prilikom slanja obavijesti je moguće ciljano adresirati na jednu grupu uređaja koji su se registrirali za određene oznake (Tags).

Prvi koraci sa Hubs

Da bi radili sa Windows Azure Notification Hubs potrebna vam je Windows Azure pretplata. Ako je ne posjedujete, možete dobiti besplatnu test licencu (vidi pod [1]).

Prijavite se na Windows Azure Management portalu (vidi Sliku 4), izaberite Service Bus, pa onda željeni Service Bus Namespace i na kraju Notification Hubs. Bijeli kvadratići na slici 4 predstavljaju imena definisanih Hub-ova.

Slika 4: Hub Management Portal

Čitaoci, koji su već imali nekog dodira sa Service Bus tehnologijom znaju da Notification Hubs predstavlja samo jedan daljnji Service Bus entitet, kao što su npr. Queue, Topic ili Relay. Dobra vijest za one koji nemaju Service Bus predznanja je da ih i ne moraju imati. Notification Hubs su, iz perspektive jednog programera, potpuno autonomni.

U sljedećem koraku napravite jedan novi Hub, kao što je prikazano na slici 5. Pored unosa uobičajenih podatka kao što su Subscription i Datacenter, morate izabrati i jedno ime za Hub. Neposredno nakon toga, vaš će Hub biti aktiviran.
Slika 5: Pravljenje Hub-a

Za izradu jednog potpunog App-a sa Notification Hub neophodna su sljedeća četiri koraka:
1. Registracija App-a u Store-u
2. Konfiguracija Hub Portal-a
3. Registracija Channel-a u App-u
4. Implementiranje servisa za slanje obavijesti

U sljedećem poglavlju ćemo svaki od tih koraka detaljnije objasniti.

Registracija App-u u Store-u

Pod [2] ćete naći link preko kojeg je moguće registrirati jedan novi App (vidi sliku 6.)
Slika 6: Registracija App-a u Store-u

App u našem primjeru se zove dotnetpro.

Kao sljedeće, moramo registrirati Push Notification Service (vidi sliku 7).
Slika 7: Registracija imena

Na stranici „Push Notifications and Live Connect Site“, koju možemo pozvati preko linka koji se može naći u crvenom pravougaoniku na slici 8.
Slika 8: Registracija Push obavijesti

Preko linka označenog na slici 8 može se pristupiti na PNS i Live Services Site (vidi sliku 9).
Slika 9: PNS & Live Services

Kada se stranica otvori može se vidjeti Package Security Identifier (SID) (vidi sliku 10) i Client Secret, koji će biti potreban kasnije. Podatke ni u kojem slučaju se ne smiju dati na uvid neovlaštenim licima!
Slika 10: Package SID i Client Secret

Konfiguracija Hub Portal-a

U sljedećem koraku potrebno je izabrati Namespace u Windows Azure Service Bus Management portal-u (vidi sliku 4) i dalje na Notification Hub. Kliknite na dotnetpro (ime našeg Hub-a) i dalje na Configuration kao što je prikazano na slici 11.

Kopirajte u za to predviđena polja Package SID i Client Secret (vidi sliku 10). Time smo uspostavili vezu između PNS-a i Service Bus Notification Hub-a.
Slika 11: Hub konfiguracija

U koliko se klizač pomjeri na dolje (vidi sliku 12), možemo vidjeti sljedeće ključeve:

• DefaultListenSharedaccessSignature
• DefaultFullSharedAccessSignature

Slika 12: Shared Access Keys

Prvi ključ mora zajedno sa App-om biti podijeljen na uređaje koji će moći primati obavijesti. Bez tog ključa App-u neće moći primati obavijesti.

Drugi ključ će biti korišten od strane servisa za slanje obavijesti. Ako se prvi ključ (vidi sliku 12) malo detaljnije pogleda, može se primijetiti da on ima samo jednu Listen-Permission. I to je dobro da je tako, jer ako nekome pođe za rukom da „skine“ ključ sa uređaja, to neće predstavljati nikakav dodatni rizik ili sigurnosnu rupu.

Drugi ključ ima neuporedivo više prava. Ali to, također, ne predstavlja sigurnosni problem, jer se taj ključ neće nalaziti na svakom uređaju na kojem je App instaliran, nego samo na serveru na kojem je instaliran servis koji šalje obavijesti.

Registracija Channel-a u App-u

Konačno je došlo vrijeme i da napišemo prve linije koda. U Visual studiju potrebno je formirati novi projekt tipa Windows Store App. Pošto Notifikation Hub tehnologija nudi poseban API, neophodno je referencirati assembly u kojem se taj API nalazi. Do te biblioteke se dolazi korištenjem NuGet-a i zove se WindowsAzure.Messaging.Managed.

Dodajte ga u projekt kao Nuget Package uz pomoć akcije Add Reference.

Ako radije koristite Package Console, morate izvršiti sljedeću komandu:
Install-Package WindowsAzure.Messaging.Managed

Nakon instalacije API je registriran u projektu sa sljedećim Namespace-ovima:
Windows.Networking.PushNotifications
Microsoft.WindowsAzure.Messaging

Dodajte novu klasu u projekt sa imenom DotNetProHub te dodajte programski kôd iz listinga 1. U konstruktoru klase NotificationHub morate kao prvi argument dodati ime Hub-a. U našem primjeru je to „dotnetpro“.

Kao drugi argument unesite DefaultListenSharedAccessSignature. Taj argument dobijate iz portala kao što je prikazano na slici 14.

Sada morate još, na početku metode OnLaunched, pozvati metodu InitNotificationsAsync:

protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
DotNetProHub.InitNotificationsAsync();
        . . .
}

Slika 14: Hub Connection Strings

Time je implementacija Client App-a za početak završena. Sada se App mora povezati sa Store Appom koji je formiran na početku (vidu slike 6 i 7). Izaberite u Visual studiju Project Property „Store“, a onda „Associate“. Ovdje se mora provsti autentikacija sa vašim Microsoft ID-jem. Na kraju se izabere App koji je ranije napravljen u Store-u (vidi sliku 15).
Slika 15: App pridružiti u Store

U ovom koraku je Visual Studio iz Publisher Certificate u manifestu (vidi package.appmanifest) pročitao informacije Package Identifier i Common Name (CN) te ih upload-ovao u Store. Ako bi se ovi podaci nekada promijenili, potrebno je ovaj korak ponoviti ili manualno promjeniti u manifestu.

Sada se može startovati App. Ako je sve ispravno urađeno, jedan Message dijalog će potvrditi registraciju (vidi Listing 1).

U ovom članku ćemo se kasnije posvetiti detaljima.

Implementiranje servisa za slanje obavijesti

Za slanje obavijesti implementirat ćemo jednu jednostavnu Konzolnu aplikaciju. Radi jednostavnosti, u ovoj demonstraciji ona će preuzeti ulogu servisa. Naravno, u jednom produktivnom rješenju na ovom mjestu bi se koristio servis, Web servis, Web aplikacija, Web Role ili čak jedna Office aplikacija.

Ne zaboravite da u Project Properties kao Target Framework postavite 4.5 prije nego krenete dalje.

U sljedećem koraku moramo referencirati Desktop verziju od Messaging Assembly, koja se također može dobiti kao NuGet paket.

Neophodne Hub funkcije se mogu naći u assemby-ju WindowsAzure.ServiceBus.
Čak ako do sada i niste imali kontakta sa Service Bus i Messaging funkcijama, nemate razloga za brigu. Nije neophodno imati ta predznanja. Hub-API „prekriva“ sve funkcije od Service Bus-a.

Listing 2 prikazuje kompletan programski kôd koji šalje Toast obavijest (Toast Notification) svim registriranim Windows 8 uređajima.

Možemo primjetiti da tri linije koda u listingu 2 predstavljaju bitno pojednostavljenje u usporedbi sa uobičajenim Notification Hub PNS modelom.

Da rezimiramo:
Prvo smo registrirali jedan App u Store-u. Onda smo unijeli SID i Client Secret u Hub konfiguraciju u Service Bus Management portalu.

U Windows App-u smo implementirali programski kôd za registraciju na obavijesti te smo implementirali i jednu Console aplikaciju kao servis za slanje obavijesti.

Kada startujemo Console aplikaciju, pojavi se obavijest kao što je prikazano na slici 16.
Slika 16: Primjer nativne Windows 8 obavijesti

Sve funkcionira skoro kao što smo i kazali.

Naš primjer može odlično skalirati te može neovisno aktualizirati Channels-e. Ali u trenutnoj verziji podržava samo Windows 8 uređaje. Pa da vidimo kako ćemo to promijeniti.

Rad sa template-ima

Da bi mogli podržavati sve tipove uređaja, programski kôd servisa bi morao na neki način koristiti različite template (šablone). To se u praksi pokazalo kao neizvodljivo tako da je razvojni tim donio fundamentalnu odluku, da App sam odlučuje koji template će biti korišten.

Dodajte u App programski kôd (kao što se vidi u listingu 3. Varijabla “toastTemplate” sadrži template jedne Toast-obavijesti za Windows 8 operativni sistem). Pod [3] pogledajte listu svih aktuelno podržanih template-a.

Od posebnog interesa su markirana mjesta sa placeholder-om ‚$‘. Na ovim mjestima Hub zamjenjuje placeholder-e sa vrijednostima koje su za to predviđene. Primjer template-a u listingu 3 predviđa korištenje jedne Toast obavijesti sa informacijama Title, Text (Subjekt) te jednom slikom. Sve tri informacije se u ovom primjeru definišu od strane servisa.

Za slanje jedne takve obavijesti koristimo programski kôd iz listinga 4. Rezultat se može vidjeti na slici 17.
Slika 17: Primjer jedne Windows 8 Toast obavijesti sa template-om

Za slanje jedne „Tile“ obavijesti jednostavno bi morali izabrati odgovarajući „Tile“-Template (vidi [4]).

Da bi to demonstrirali potrebno je uraditi minimalnu prepravku koda iz listinga 3. U principu, sve ostaje kao što je i bilo osim registracije Template-a.

Izaberite odgovarajući Template pod [4] te ga registrirajte kao što je prikazano u listingu 5.

U primjeru listing 5 korišten je „Tile“-Template, koji je skoro identičan sa „Toast“ template-om korištenim u listingu 3. Iz tog razloga se programski kôd koji je korišten za slanje obavijesti ne mora mijenjati.

await hub.SendTemplateNotificationAsync(new Dictionary<string, string>
                    {
                        {"pic",  "http://daenet.de/www/img/articles/apps-article.jpg"},
                        {"msgTitle", "Notification Title"},
                        {"msgSubject", "Notification Subject"},                 

                    });

Pošto smo utvrdili da je jedina razlika između „Toast“ i „Tile“ obavijesti u registraciji različitih template-a, možemo se pitati kako bi izgledalo slanje jedne „Badge“ obavijesti.

Odgovor je: „Tako što se registrira „Badge“-Template“. U tom slučaju trebali bi baciti pogled u Badge-katalog [5] i izabrati odgovarajući template.

Slika 18 prikazuje sve Badge-Template koji stoje na raspolaganju. Kako se može vidjeti radi se o jednom Template-u sa različitim vrijednostima za atribut „Value“.

</pre>
string badgeTemplate = @""; await hub.RegisterTemplateAsync(channel.Uri, badgeTemplate2, "BadgeTemplate", new List() { "badge" });

Da bi aktivirali taj Badge i unutar njega prikazali jedan broj, morali bi izvršiti sljedeću liniju koda na serveru:

</pre>
await hub.SendTemplateNotificationAsync(new Dictionary { {"msgTitle", "7"}, });

Ako pri tome treba da se prikaže Mail simbol, jednostavno moramo promijeniti vrijednost „Value“ atributa:

   await hub.SendTemplateNotificationAsync(new Dictionary<string, string>
                    {
                        {"msgTitle", "newMessage"},
                    });

U slučaju da Badge treba da bude isključen, moramo u Template-u koristiti vrijednost „none“:

   await hub.SendTemplateNotificationAsync(new Dictionary<string, string>
                    {
                        {"msgTitle", "none"},
                    });

Tagging (Routing)

Jedna od najvažnijih osobina Notification Hubs-a je Tagging ili Routing. Naime, prilikom registracije template-a je moguće specificirati listu oznaka (Tags):

await hub.RegisterTemplateAsync(channel.Uri, tileWideManagerTemplate, "NameDerVorlage", new List<string>() { "managers” });

await hub.RegisterTemplateAsync(channel.Uri, tileWideUserTemplate, "NameDerVorlage", new List<string>() { "users” });

Server koristi tu listu da bi definisao rutu za obavijest. Na osnovu šablona server određuje gdje će obavijest poslati. Npr., sljedeći programski kôd šalje obavijesti na sve „managers“-e.

await hub.SendTemplateNotificationAsync(new Dictionary<string, string>
                    {
                        {"pic",  "http://daenet.de/www/img/articles/apps-article.jpg"},
                        {"msgTitle", "Hallo Managers"},
                        {"msgSubject", "Es gibt keine Prämie "},                 

                    },
                "managers");

Oznake „Tagss¨ predstavljaju jedan zaista moćan, a istovremeno jednostavan feature. Uz pomoć oznaka kategoriziranje template-a postaje vrlo jednostavno. Na primjer, sa „smartphonedevice“, „managers“ i „tablett“, „managers“ mogli bismo napraviti razgraničenje između Managers app-ova na pametnom telefonu i na tablet-u. Na taj način će server biti u stanju da obavijest pošalje samo na pametne telefone.

Koliko to sve košta?

U ponudi su trenutno tri pretplatne opcije: Free, Basic i Standard.
Kod besplatne pretplate (Free) moguće je slanje obavijesti do maksimalno 500 uređaja. Osim toga, maksimalni broj servis operacija je ograničen na 100.000. Pod operacijom se podrazumijeva slanje ili primanje jedne obavijesti. Npr. jedan poziv metode SendTemplateNotificationAsync se računa kao jedna operacija. Osim toga se i primanje jedne obavijesti računa kao jedna izvršena operacija. Tako da ako npr. imate 500 uređaja, jedna obavijest poslata na sve uređaje implicira 501 izvršenu operaciju. Namjena Free ponude je prije svega testiranje aplikacija ali mogući su scenariji gdje se Free ponudom čak može i pokriti jedan određen broj korisnika.

Cijena Basic pretplate je 75$ mjesečno u dnevnom taktu. Moguć je i upgrade sa Free na Basic pretplatu, za vremenski period od sedam dana. Poslije isteka tog vremenskog perioda, moguć je ponovni povratak na Free pretplatu. Cijena za takav sedmodnevni upgrade iznosi jednu četvrtinu mjesečne cijene Basic pretplate od 75$. Basic pretplata je limitirana na 100.000 uređaja i 1.000.000 operacija.

Standard pretplata predviđa kupovinu takozvane jedinice „Unit“. Jedinica se može uporediti sa jednim čvorom (Node) u cluster server rješenjima. Jedna jedinica (199$ mjesečno) je u stanju da pokrije 5.000.000 obavijesti za 100.000 uređaja. I ovaj način pretplate predviđa obračun u dnevnom taktu.

Zaključak

Kako se čini, Microsoft proširuje svoju ponudu u oblasti Cloud, Integration & Messaging Plattform u sedmičnom taktu. Već par sedmica poslije predstavljanja novog Service Bus 2.0 servisa, Microsoft predstavlja i Notification Hubs servis.

Većina programera taj razvojni tempo kojim Microsoft uvodi nove produkte u svojoj Azure liniji vjerovatno doživljava kao prebrz. Ali bitno je razumjeti, da u svojoj novoj strategiji pod imenom „Devices & Services“, Microsoft vidi Service Bus kao centralnu integracionu komponentu. Windows Azure Notification Hubs je tipičan primjer novih Microsoft-ovih tehnologija, koje su pored karakteristika kao što je ekstremna skalabilnost, maksimalno reduciranje zavisnosti o drugim tehnologijama i platformama, toliko jednostavne za korištenje, da je cilj moguće ostvariti sa samo nekoliko linija koda.

[ 1] Windows Azure besplatno testirati http://www.windowsazure.com/en-us/pricing/free-trial/
[ 2] App registrirati u Store-u https://appdev.microsoft.com/StorePortals/en-US/Developer/Catalog/ReleaseAnchor?wa=wsignin1.0
[ 3] Katalog za Toast template http://msdn.microsoft.com/en-us/library/windows/apps/hh761494.aspx
[ 4] Katalog za Tile template http://msdn.microsoft.com/en-us/library/windows/apps/hh761491.aspx
[ 5] Katalog za Badge template http://msdn.microsoft.com/en-us/library/windows/apps/hh779719.aspx
[ 6] Getting started -Windows 8 https://go.microsoft.com/fwLink/?LinkID=317580&clcid=0x409
[ 7] Getting started – Windows Phone 8 http://www.windowsazure.com/en-us/manage/services/notification-hubs/get-started-notification-hubs-wp8/
[ 8] Getting started – iOS https://go.microsoft.com/fwLink/?LinkID=317579&clcid=0x409
[ 9] Getting started – Android https://go.microsoft.com/fwLink/?LinkID=310147&clcid=0x409
[10] Windows Azure Notification Hubs pregled http://msdn.microsoft.com/library/jj927170.aspx

Listing 1: Hub incijalizacija u Windows 8 App-u

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Windows.Networking.PushNotifications;
using Microsoft.WindowsAzure.Messaging;
using Windows.UI.Popups;

namespace DotnetproHubApp
{

    ///
    /// Provides the code for hub initialization
    ///

    internal class DotNetProHub
    {
        public static async void InitNotificationsAsync()
        {
            var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

            // Andere Moeglichkeit Channel zu initialiseren.
            // var channel = ServiceBusConnectionStringBuilder.CreateUsingSharedAccessKey(new Uri("sb://****.servicebus.windows.net"),
            //NotificationHubDescription.DefaultFullSasRuleName, "********888");

            var hub = new NotificationHub("dotnetpro", "****=");
            var result = await hub.RegisterNativeAsync(channel.Uri);

            // Displays the registration ID so you know it was successful
            if (result.RegistrationId != null)
            {
            var dialog = new MessageDialog("Uspjesno registriran: " + result.RegistrationId);
            dialog.Commands.Add(new UICommand("OK"));
            await dialog.ShowAsync();
            }
        }
    }
}

Listing 2: Push Notification Service primjer

using Microsoft.ServiceBus.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DotNetProHubService
{
    class Program
    {
        static void Main(string[] args)
        {
        SendNotificationAsync();
        Console.ReadLine();
        }

        private static async void SendNotificationAsync()
        {
            NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("Endpoint=sb://******.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=*****Q=", "dotnetpro");
            string toast1 = @"Hello Notification Hubs!";

            await hub.SendWindowsNativeNotificationAsync(toast1);
        }
    }
}

Listing 3: Registracija template-a za Toast obavijesti

public static async void InitNotificationsAsync()
{
    var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

    var hub = new NotificationHub("dotnetpro", "****=");
    var result = await hub.RegisterNativeAsync(channel.Uri);

    string toastTemplate = @"$(msgTitle)$(msgSubject)";

    await hub.RegisterTemplateAsync(channel.Uri, toastTemplate, "ToastImageAndText02");

    if (result.RegistrationId != null)
    {
        var dialog = new MessageDialog("Template registration successful: " + result.RegistrationId);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
}

Listing 4: Slanje jedne Toast obavijesti sa definiranim template-om

private static async void SendToastTemplateNotification()
{
    NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("Endpoint=sb://****.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=**=","dotnetpro");

    await hub.SendTemplateNotificationAsync(new Dictionary
            {
            {"pic", "http://daenet.de/www/img/articles/apps-article.jpg"},
            {"msgTitle", "Notification Title"},
            {"msgSubject", "Notification Subject"},

    });
}

Listing 5: Registracija jedne Tile obavijesti sa definiranim template-om

public static async void InitNotificationsAsync()
{
    var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

    var hub = new NotificationHub("dotnetpro", "****=");
    var result = await hub.RegisterNativeAsync(channel.Uri);

    // Register Tile Notifification Template
    string tileTemplate = @"$(msgTitle)$(msgSubject)";
    await hub.RegisterTemplateAsync(channel.Uri, tileTemplate, "TileSquarePeekImageAndText02”);

    if (result.RegistrationId != null)
    {
        var dialog = new MessageDialog("Template registration successful: " + result.RegistrationId);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
}

Analitička geometrija i C# programiranje dio 4/n


Problem 5: Potrebno je pronaći najkraću udaljenost između tačke i prave.

shortestpointLine

Iz analitičke geometrije znamo da je najkraća udaljenost između prave i tačke ona udaljenost koja se poklapa sa pravom koja prolazi tačkom A i normalna je na pravu p.  U tom smislu pretpostavimo da normala povučena iz tačke A siječe pravu p u tački A’ . Posmatrajmo vektore \vec{P_{1}A} i \vec{P_{1}P_{2}'} .

Izračunavanjem vektorskog proizvoda ova dva vektora dobićemo površinu paralelograma razapetog na tim vektorima. Kako znamo da je površina paralelograma u našem slučaju: P=AA’ x P1P2, to lahko možemo izračunati dužinu stranice AA’. U stvari ona predstavlja visinu paralelograma.

Sada možemo pisati:

AA' = \frac{P1A x P1P2}{|P1A|}. Ovim smo izračunali najkraću udaljenost između tačke i prave. Implementacija u C# programskom jeziku moze izgledati na sljedeći način:

static float shortestDistance(Point A, Point P1, Point P2)
{
    //referentni vektor ili pravac kroz referentne tačke na pravoj
    Point vektor = new Point();
    vektor.x = P2.x - P1.x;
    vektor.y = P2.y - P1.y;

    //Pravimo vektor od referentne tacke 1 i date tacke a
    Point vektor2 = new Point();
    vektor2.x = P1.x - A.x;
    vektor2.y = P1.y - A.y;

    //Izračunavamo vektorski proizvod dva verktora
    float vecProd = vektor.y * vektor2.x - vektor.x * vektor2.y;
    //Izračunavamo modul vektora P1P2
    float mod1=(float)Math.Sqrt(vektor.x * vektor.x + vektor.y * vektor.y);

    //udaljenost d== vektorski proizvod/dizina vektora P1P2
    float dist = vecProd / mod1;

    return dist;
}
Follow

Get every new post delivered to your Inbox.

Join 535 other followers