Jakub Florczyk - Blog o programowaniu .NET

Programista praktyczny

Tag: .NET

ID aplikacji Windows Phone

Jakiś czas temu znalazłem ciekawy trick na uzyskanie ID aplikacji Windows Phone.

Całość sprowadza się do odczytania pliku WMAppManifest.xml:

using System;
using System.Xml.Linq;

namespace PhoneApp.ApplicationId
{
    public static class ApplicationProperties
    {
        public static Guid GetId()
        {
            Guid applicationId = Guid.Empty;

            var productId = XDocument.Load("WMAppManifest.xml").Root.Element("App").Attribute("ProductID");

            if (productId != null && !string.IsNullOrEmpty(productId.Value))
                Guid.TryParse(productId.Value, out applicationId);

            return applicationId;
        }
    }
}

Po czym, wystarczy odpalić metodę GetId aby uzyskać ID aplikacji w dowolnym miejscu kodu:

using System;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;

namespace PhoneApp.ApplicationId
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void ButtonShowId_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(ApplicationProperties.GetId().ToString(), "My id is:", MessageBoxButton.OK);
        }

        private void ButtonShare_Click(object sender, RoutedEventArgs e)
        {
            ShareLinkTask shareLinkTask = new ShareLinkTask();
            shareLinkTask.Title = "Check this app!";
            shareLinkTask.LinkUri = new Uri(string.Format("http://www.windowsphone.com/s?appid={0}", ApplicationProperties.GetId()), UriKind.Absolute);
            shareLinkTask.Show();
        }
    }
}

Przydatny kawałek kodu, który uchroni nas przed hard kodowaniem ID i podwójną publikacją aby uzyskać ten numer a potem aby finalnie opublikować aplikację.

Na warsztatach Nokia dla developerów Windows Phone najlepsza była… kawa

Dzisiaj pofatygowałem swoje szanowne cztery litery na warsztaty Nokia dla developerów Windows Phone. Trochę z chęci do otarcia się o świat wielkich idei a trochę z powodu znajomego, który mnie podpuszczał, że pewnie mam za duże ego aby się na takie warsztaty wybrać.

Miejsce warsztatów, to nowoczesny budynek Auditorium Maximum Uniwersytetu Jagielońskiego. Jak wszedłem do budynku to moje IQ wzrosło o 10 punktów i osiągnęło nigdy wcześniej nie osiągnięty pułap 20 punktów. Trochę wcześniej kluczyłem uliczkami próbując zaparkować swoją furmankę w jakby na to nie patrzeć centrum Krakowa. A każdy kto próbował tego dokonać w poniedziałkowy poranek wie, że bardziej prawdopodobne jest spotkanie Małopolanin, który wychodzi “na dwór”.

Zapowiadało się nieźle, przemiła hostessa z Allegro, która próbowała mnie namówić na staż w dziale developerskim Windows Phone. Na co pewnie bym się zgodził jakby spalili dotychczasową aplikację na WP (wraz z jej autorem).
Przestronna sala z kontaktami! Z oszołomienia musiałem się uszczypnąć, bo na MTS gniazdka dostępne są dla najszybszych lemingów a tu był ich nadmiar i to przy stolikach!

Ale po tym wstępie było tylko gorzej. Nie dość, że Nokia jakoś nie bardzo miała zamiar uzupełnić mój uszczuplony zasób długopisów i notatników z własnym logiem; to nie dawali nawet bajeranckich smyczy ani koszulek! Oburzony i zły usiadłem na losowo wybranym miejscu i rozpocząłem przysłuchiwanie się co mają do zaprezentowania prowadzący. Mniemałem, że skoro nie ma gadżetów to może poziom mnie oszołomi. Ale tak się nie stało…

Nie mam pretensji do prowadzących. Bo jednak w dwójkę trudno jest ogarnąć taką ilość materiału i przedstawić ją w kilka godzin. Ale merytorycznie są to warsztaty dla początkujących. Jeśli nie wiesz nic; to idź – wypijesz dobrą kawę i zjesz dobre ciastko. Ale jeśli już coś wiesz to umrzesz z nudów.

Nokia powinna uczyć się od Microsoft:

  • ilość hostess powinna być równa lub większa niż przekątną statystycznego notebooka na sali. My rzadko obcujemy z kobietami (pomijając te w jpg) i takie, które na nasz widok nie uciekają są dla przeciętnego developera ciekawym obiektem przemyśleń i analiz prowadzonych podczas nudnego wykładu.
  • orężem każdego inżyniera jest długopis i notatnik. Na każdej konferencji trzeba ich rozdawać aż nadto a my potem się nimi pieczołowicie opiekujemy nie oddając ich nawet dzieciom do malowania świeżo pomalowanych ścian.
  • smycze przyjmujemy w każdej ilości. Wieszając na nich klucz od naszych komórek w suterenach i od składzików na węgiel.
  • foldery, płyty CD, kolorowe katalogi. I tak je później wywalimy do kosza. Ale Pełna reklamówka PR’u wskazuje na udaną konferencję. A nasza żona nie podejrzewa nas o wypad do sąsiadki ;-)
  • więcej prowadzących z naciskiem na praktyków, którzy zjedli na temacie zęby. To podstawa udanego wykładu, bo nawet jak nie potrafią prowadzić takich wykładów, to można się od nich czegoś nauczyć od strony praktycznej a nie marketingowego paplania.

Nie ukrywam, że po cichu liczyłem na dar z nieba w postaci jakieś ładnej nowej Lumii; albo chociaż jakiś kupon zniżkowy! Przecież to nokia! Rzucają tymi słuchawkami na prawo i lewo w każdym konkursie, nie zbiednieliby gdyby developerzy dostali kilka setek nowiutkich słuchaweczek. Co ciekawe, ludzi z telefonami WP było stosunkowo mało. Więcej androidów a nawet kilku agentów z Cupertino posiadających o zgrozo iPhone’y.

Podsumowując było miło, ale spodziewałem się czegoś więcej. Tak się chyba nie zdobywa developerów. A ja na miejscu programisty, który dopiero bada rynek, nie przekonałbym się do platformy. Pomijam już fakt, że nie było ani słowa o narzędziach do promocji aplikacji pod brandingiem Nokii. A sama monetyzacja była potraktowana po macoszemu; a to przecież pieniądze mogą przekonać dopiero rozpoczynających przygodę do spróbowania swoich sił.

PS: Lunch także był niezły :)

Syncfusion Metro Studio

Jednym z problemów tworzenia interfejsów użytkownika od początku istnienia platformy Windows Phone było odszukanie (ewentualnie narysowanie) odpowiednich ikon zgodnych z zaleceniami Mango.

Choć wielu grafików już przygotowało własne zestawy ikon, to często dostarczany przez nich format albo rozmiar wymuszał edycję w Gimpie albo innym programie graficzny.

Wydaje się jednak iż koniec problemów dzięki oprogramowaniu od Syncfusion. Program nazywa się Syncfusion Metro Studio i zawiera nieprzebrane ilości ikon, które można wykorzystywać w aplikacjach. Każdą ikonę można wygenerować w kilku formatach, rozmiarach i dowolnej kolorystyce. Polecam bo to jedno z bardziej przydatnych narzędzi jakie ostatnio znalazłem w sieci.

Windows Phone Design Mistakes and How to Avoid them

David Crawford, User Experience Consultant w Microsoft opowiada o błędach popełnianych przy projektowaniu aplikacji dla Windows Phone. Polecam, bo to jeden z niewielu filmów o projektowaniu, przy którym nie zaśniecie; rzeczowy i na temat, bez zbędnego lania wody.

Telerik pokazał środkowy palec Red Gate Software

Chyba każdy developer .NET używał starego dobrego Reflector-a. Ale w momencie kiedy oprogramowanie zostało wykupione przez Red Gate w sieci podniosło się wielkie larum. Sam byłem zdenerwowany sytuacją w której darmowy produkt, którego używam często nagle staje się płatny.

Co zabawne jakiś rok temu próbowałem go kupić. Ale o dziwo Red Gate nie chciał zaakceptować mojej karty z Inteligo, którą do tej pory płaciłem w sieci wszędzie i za wszystko bez jakichkolwiek problemów. Oczywiście email na pomoc techniczną pozostał bez odpowiedzi, co jeszcze podniosło moją niechęć do Red Gate.

Niestety przez długi czas nie mieliśmy żadnej alternatywy aż do czasu gdy Telerik pokazał Red Gate środkowy palec i udostępnił JustDecompile:

JustDecompile will be free forever, and there’s no time bomb anywhere in the product.

I jak tu nie poczuć sympatii do poczucia humoru ludzi z Telerika!?

Użyteczne rozszerzenia 4/n!

Konwersja koloru “z” oraz “do” Int32 oraz konwersja z zapisu szesnastkowego.

Dwa pierwsze rozszerzenia są przydatne przy konwersji kolorów z WriteableBitmap.

// metody
public static Color ToColor(this int value)
{
    return new Color()
    {
        A = (byte)(value >> 24),
        R = (byte)(value >> 16),
        G = (byte)(value >> 8),
        B = (byte)(value)
    };
}

public static int ToInt32(this Color c)
{
    return (int)(c.A << 24) + (int)(c.R << 16) + (int)(c.G <<8) + (int)c.B;
}

public static Color ToColor(this uint argb)
{
    return Color.FromArgb(
        (byte)((argb & 0xff000000) >> 24),
        (byte)((argb & 0xff0000) >> 16),
        (byte)((argb & 0xff00) >> 8),
        (byte)(argb & 0xff));
}

// sposoby użycia
Colors.Black.ToInt32();
255.ToColor();
0xFF339933.ToColor();

Użyteczne rozszerzenia 3/n!

Uzupełnienie rozszerzenia z części pierwszej dotyczącego nawigacji w Windows Phone.

Nawigowanie do typów w Windows Phone z parametrami:

// metoda
public static bool Navigate<T>(this NavigationService navigationService, string query) where T : PhoneApplicationPage
{
    return navigationService.Navigate(new Uri(String.Format("/{0}.xaml{1}", typeof(T).Name, query), UriKind.Relative));
}

// sposób użycia
NavigationService.Navigate<CommentAddPage>("?Id=" + comment.Id + "&Author=" + HttpUtility.UrlEncode(comment.Author));

Użyteczne rozszerzenia 2/n!

W dzisiejszej części proste przełączanie widoczności UIElement w Silverlight:

// metoda
public static void ToggleVisibility(this UIElement uie)
{
    uie.Visibility = (uie.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible);
}

// sposób użycia
Button.ToggleVisibility();

WP7 Emulator Skin Switcher

Na blogu Geert van der Cruijsen pojawiło się ciekawe narzędzie do zmieniania skórek emulatora Windows Phone 7. Polecam każdemu komu znudził się wygląd standardowego emulatora albo potrzebuje ładniejsze zrzuty z aplikacji dla klienta.

Użyteczne rozszerzenia 1/n!

Od kiedy Microsoft wprowadził rozszerzenia (ang. extensions) do platformy .NET jestem ich wielkim fanem. Dlatego raz po raz wrzucę jakiś użyteczne rozszerzenie, które może się okazać przydatne.

W dzisiejszej części rozwiązanie bolączki nawigowania do stron w Windows Phone:

NavigationService.Navigate(new Uri("/ProductPage.xaml", UriKind.Relative));

Zawsze mnie to kuło w oczy ze względu na string w kodzie, których nie lubię. Oczywiście można definiować stałe i tym podobne cuda wianki. Albo użyć poniższego rozszerzenia:

// metoda
public static bool Navigate<T>(this NavigationService navigationService) where T : PhoneApplicationPage
{
    return navigationService.Navigate(new Uri(String.Format("/{0}.xaml", typeof(T).Name), UriKind.Relative));
}  

// sposób użycia
NavigationService.Navigate<ProductPage>();