Metryki kodu w Visual Studio 2010

•Lipiec 5, 2010 • 2 komentarze

Bawiąc się ostatnio Visual Studio 2010 przez przypadek kliknęła mi się opcja na projekcie „Calculate Code Metrics”. Po paru chwilach pokazała mi się wypełniona tabelka z następującymi metrykami:

  • Maintainability index
  • Cyclomatic Complexity
  • Depth of Inheritance
  • Class Coupling
  • Lines of code

Powyższe metryki są bardzo przydatne podczas pisania kodu. Jeśli ktoś z Was będzie się chciał dowiedzieć czegoś więcej, co każda z powyższych metryk znaczy, to zapraszam na stronę:

http://msdn.microsoft.com/en-us/library/bb385914(lightweight).aspx

Microsoft Producer dla PowerPoint

•Maj 10, 2010 • Dodaj komentarz

Jakiś czas temu usłyszałem, że Microsoft pracuje nad tym tajemniczym narzędziem. Dziś natomiast się dowiedziałem, że jest ono już dostępne!!!

Ale po kolei. Czym jest Microsoft Producer dla PowerPoint?

Jest to nic innego jak rozszerzenie programu PowerPoint, dzięki któremu będziemy w stanie dodać do naszej prezentacji elementy takie jak narracja Audio/Video oraz wiele innych elementów multimedialnych, dzięki którym stworzymy zawartość gotową do opublikowania w naszym lokalnym korporacyjnym intranecie i dostępną za pośrednictwem przeglądarki internetowej.

Narzędzie przyda się zarówno profesjonalistom, jak i codziennym użytkownikom pakietu Office do stworzenia prezentacji o nowej jakości.

Dla tych, którzy chcą się dowiedzieć czegoś więcej na temat narzędzia, zapraszam na bolg zespołu odpowiedzialnego za rozszerzanie narzędzia Power Point.

Dostępna wersja współpracuje z następującymi wersjami programu Power Point:

  • MS Power Point 2002 (ktoś jeszcze tego używa??? :))
  • MS Office Power Point 2003
  • MS Office Power Point 2007
  • MS Office Power Point 2010

MS Office 2010 Training Kit

•Maj 10, 2010 • Dodaj komentarz

Informuję wszystkich tych, którzy lubią rozszerzać standardową zawartość pakietu MS Office, że Microsoft wypuścił właśnie zestaw tzw. quick startów dla nowej wersji pakietu Office 2010. Znajdziecie tam m. in. ćwiczenia laboratoryjne, prezentacje, kody źródłowe, oraz filmy wprowadzające, które pozwolą wam zrozumieć w jaki sposób tworzyć dodatki dla Office 2010 i SharePoint 2010.

Pakiet Training Kit możecie ściągnąć tutaj.

SQL Server 2008 R2 Express już dostępne!!!

•Maj 7, 2010 • Dodaj komentarz

Śpieszę donieść, że SQL Server 2008 R2 w wersji  jest już dostępne do pobrania(link poniżej). A co jest w nim takiego świetnego? Oprócz kilku ulepszeń BI-owych grupa pracująca nad SQL Server-em zwiększyła limit wielkości danych z 4GB do 10GB!!!! Czy to nie wspaniałe? Więc jeśli wielkość Twojej bazy jest już bliska 4GB to czym prędzej ściągnij i zainstaluj wersję 2008 R2.

Limit został zwiększony w następujących wersjach:

  1. SQL Server 2008 R2 Express
  2. SQL Server 2008 R2 Express with Advanced Services
  3. SQL Server 2008 R2 Express with Management Tools
  4. SQL Server 2008 R2 Express with Management Studio Express

Pozdrawiam 🙂

Windows Phone 7 – Tworzymy pierwszą aplikację

•Marzec 23, 2010 • Dodaj komentarz

Kilka dni temu w sieci pojawiła się informacja o tym, że Microsoft udostępnił emulator i narzędzia programistyczne dla nowej platformy telefonów Windows Phone 7. Emulator wraz z pakietem narzędzi można pobrać z Windows Phone Developer Tools CTP. Ja gdy po raz pierwszy usłyszałem o nowej platformie i o tym, że będzie można na nią tworzyć aplikacje w technologii Silverlight lub XNA, byłem bardzo zadowolony i jakiż wielki był mój uśmiech na twarzy(czyt. banan :)). Co wicej Microsoft udostępnił te narzędzia całkowicie za darmo!!! Ostatnio na konferencji MIX, która odbyła się w Las Vegas zaprezentował również nową wersję narzędzia Expressions Blend 4 w wersji beta, które zostało dostosowane do tworzenia aplikacji na platformę Windows Phone 7, które również będzie udostępnione za darmo!!! Widać konkurencyjny produkt iPhone Appla odbił się czkawką Microsoftowi.

Od czego należy zacząć, aby stworzyć pierwszą aplikację dla Windows Phone 7:

  1. Poczytać na stronie MSDN,
  2. Poczytać na stronie channel9 – tam znajdziemy instrukcję krok po kroku w jaki sposób napisać aplikację Hello World,
  3. Odwiedzić blog Scotta Guthrie, na którym ostanio opublikował aplikację typu Hello World na platformę Windows Phone 7, która wyświetla tweety z twittera 🙂

Wczoraj nawet sam usiadłem i napisałem podobną do Scotta aplikację, której screen zamieszczam poniżej stronie:

Tak teraz się zastanawiam, jak będzie wyglądała aplikacja napisana z użyciem wzorca MVVM, UnityContainer, PRISM i czy się w ogóle da go użyć 🙂 A może by jeszcze tak dodać MEF-a…

Na zakończenie zachęcam do obejrzenia gry Sudoku, która została przepisana z czystego Silverlighta na wersję Windows Phone 7 -> sudoku. Jak dla mnie bomba 🙂 BTW. został tam użyty pattern MVVM oraz engine nRoute.

WPF: MVVM Pattern

•Luty 21, 2010 • 5 komentarzy

Od jakiegoś czasu staram się posiąść tajemną sztukę tworzenia aplikacji przy użyciu WPF+MVVM+PRISM. Pewnie niektórzy z Was się spytają: „Czemu tak późno?”. Z przykrością muszę powiedzieć, że nie miałem po prostu czasu. No ale jak to się mówi, na naukę nigdy nie jest za późno, więc powiedziałem sobie „Do dzieła!!!”.

Wychowany na tworzeniu aplikacji przy użyciu CAB-a (Composite UI Application Block)  staram się wydzielić jakąś część wspólną(bazową) dla poszczególnych elementów i stworzyć coś na kształt CORE-a. Wiadomo, że na początku nidy nie przystąpimy do pisania aplikacji zaczynając od tworzenia klas abstrakcyjnych, z których później będą dziedziczyć docelowe klasy. Jednak po pierwszym czy drugim refactoringu ta sztuka może się nam udać.

Poniżej chciałem się z Wami podzielić jak w prosty sposób przygotować sobie klasy bazowe dla wzorca MVVM.

  1. Model jako podstawa
  2. Początek tworzenia bazy wzorca MVVM powinniśmy zacząć od stworzenia Modelu, który będzie tzw. fundamentem dla pozostałych elementów wzorca.

    public abstract class Model : IModel, INotifyPropertyChanged, IDisposable
        {
            protected Model()
            {
            }
    
            #region INotifyPropertyChanged
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected virtual void OnPropertyChanged(string propertyName)
            {
                this.VerifyPropertyName(propertyName);
                if (PropertyChanged != null)
                {
                    PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
                }
            }
    
            protected void RaisePropertyChanged<T>(Expression<Func<T>> property)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, property.CreateChangeEventArgs());
            }
    
            #endregion
    
            #region Debugging
    
            [Conditional("DEBUG")]
            [DebuggerStepThrough]
            public void VerifyPropertyName(string propertyName)
            {
                if (TypeDescriptor.GetProperties(this)[propertyName] == null)
                {
                    string msg = "Invalid property name: " + propertyName;
    
                    if (this.ThrowOnInvalidPropertyName)
                        throw new Exception(msg);
                    else
                        Debug.Fail(msg);
                }
            }
    
            protected virtual bool ThrowOnInvalidPropertyName { get; private set; }
    
    #if DEBUG
            ~Model()
            {
                string msg = string.Format("Model {0} ({1}) Finalized", this.GetType().Name, this.GetHashCode());
                System.Diagnostics.Debug.WriteLine(msg);
            }
    #endif
    
            #endregion
    
            #region IDisposable
    
            public void Dispose()
            {
                this.OnDispose();
            }
    
            protected virtual void OnDispose()
            {
            }
    
            #endregion
        }
    

    Jak można wyżej zauważyć, klasa Model jest abstrakcyjna oraz implementuje 2 ważne interfejsy: INotifyPropertyChanged (do powiadamiania o zmianie wartości jakiejś Property) oraz IDisposable (przydatny do zabijania obiektów, np. podczas użycia using). W sumie jest to nasza bazowa klasa, więc zawiera logikę, która przyda się we wszystkich klasach z niej dziedziczących. Interfejs IModel jest pusty i przyda się w generycznych odwołaniach do obiektów(o ile jakieś tak nisko cast-owane będą :))

  3. Widok
  4. Widok we wzorcu MVVM to nic innego jak element interfejsu użytkownika(UserControl, Window), który będzie zarządzany przez ViewModel. Najważniejszym elementem widoku w WPF jest properta DataContext, za pomocą której będzie wstrzykiwana zależność pomiędzy View i go kontrolującym ViewModel-em. Dlatego też na potrzeby wzorca wystarczy, że każdy widok będzie implementował stworzony przeze mnie interfejs IView:

    public interface IView
        {
            object DataContext { get; set; }
        }
    

    Prawda, że proste 🙂

  5. ViewModel
  6. Na koniec pozostaje nam ostatni element wzorca do przygotowania, czyli ViewModel. Inaczej niż wcześniej zastanówmy się na początku, co jest nam potrzebne w obiekcie ViewModel. Na pewno musi być powiązany z widokiem, musi dziedziczyć z klasy Model oraz fajnie jakby był generyczny w zależności od widoku. Wydaje się proste i jest proste:

    public abstract class ViewModel : Model, IViewModel
        {
            protected ViewModel(IView view)
                :this(view,false)
            {
            }
    
            protected ViewModel(IView view, bool isChild)
            {
                if (view == null)
                    throw new ArgumentException("view");
    
                this.View = view;
    
                if (!isChild)
                {
                    Dispatcher.CurrentDispatcher.BeginInvoke(new Action<IView, ViewModel>(SetDataContext), View, this);
                }
            }
    
            private static void SetDataContext(IView view, IViewModel viewModel)
            {
                view.DataContext = viewModel;
            }
    
            public IView View
            {
                get;
                private set;
            }
        }
    
        public abstract class ViewModel<TView> : ViewModel, IViewModel<TView>
            where TView : IView
    
        {
            protected ViewModel(TView view, bool isChild)
                :base(view,isChild)
            {
            }
    
            public new TView View
            {
                get
                {
                    return (TView)base.View;
                }
            }
        }
    

    Dodatkowo dodałem jeszcze lazy dispatch dla wstrzykiwania ViewModel-u do widoku.

W taki oto łatwy i przyjemny sposób można stworzyć podstawę dla wzorca MVVM. W kolejnych moich wpisach dotyczących PRISM oraz MVVM dla WPF pojawią się takie elementy jak użycie Commands, okienka modalne, Bootstraper, UnityContainer, Master-Detail i pewnie wiele innych, nad którymi aktualnie pracuję i dopieszczam.
Zapraszam 🙂

Wydłużenie życia Twojego iPAQ’a w 4 krokach

•Grudzień 7, 2009 • Dodaj komentarz

Zapewne większość z Was, którzy stali się szczęśliwymi posiadaczami telefonu HP iPAQ Data Messenger po kilku dniach jego użytkowania wielce się nim rozczarowała. A wszystko za sprawą krótkiego życia akumulatora, gdzie przy dużym jego wykorzystaniu czas pracy spadał do 7-8h. Głowa do góry!!! Jest jeszcze szansa na zmianę tego stanu rzeczy. Poniżej pokażę Wam jak w 4 krokach sprawić, aby Wasz telefon wytrzymał bez ładowania nawet do 5 dni :-).

Krok 1 – Instalacja najnowszego Bios-u

Można by przypuszczać, że skoro dopiero co przyszedł do Was telefon prosto z „fabryki” to całe na nim zawarte oprogramowanie będzie posiadało najnowszą wersję. Niestety, jak się okazuje, w naszym telefonie spoczywa wersja testowa Bios-u 1.00.05, w którym nie zawarto rozszerzonych kodów modemowych, optymalizujących wykorzystanie akumulatora :/.

Najnowszą wersję z kwietnia możemy ściągnąć za pomocą poniższego linka:

http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareDescription.jsp?lang=pl&cc=pl&prodTypeId=215348&prodSeriesId=3806501&prodNameId=3806502&swEnvOID=4036&swLang=13&mode=2&taskId=135&swItem=hh-68833-2

UWAGA!!! Pamiętajmy, aby przed instalacją zrobić backup danych w telefonie!!!

Krok 2 – Wyłączenie trybu UMTS/3G(jeśli z niego nie korzystacie)

Niby nic a wydłuża czas życia akumulatora.

  • W telefonie wchodzimy w Start->Settings->Personal->Phone->HP Band Control;
  • Z listy pod słowem „Radio” wybieramy EDGE/GSM;
  • Klikamy na OK i wychodzimy z ustawień telefonu;
  • I już :-).

Krok 3 – Prawidłowe formatowanie akumulatora(po wypakowaniu telefonu z pudełka)

Pomimo, że akumulator w Naszym iPAQ’u jest litowo-polimerowy, gdzie „teoretycznie” nie powinno być tzw. „efektu pamięciowego”, konieczne jest na samym początku, gdy przyjdzie do Nas telefon, wykonanie prawidłowego formatowania akumulatora. Ja ze swojej praktyki doszedłem do następującego rozwiązania:

  • Podłączam nowiutkiego iPAQ’a pod ładowarkę i zostawiam na ok 10-12h, aby się ładował akumulator;
  • Po naładowaniu uruchamiam telefon i uruchomiony zostawiam do pełnego rozładowania akumulatora (w tym momencie powstrzymujemy się od klikania i sprawdzania, jakie fajne opcje ma Nasz nowy telefon, na to będzie jeszcze czas ;-);
  • Gdy akumulator się całkowicie rozładuje, ponownie ładujemy go przez 6-8h;
  • Po drugim naładowaniu możemy już normalnie korzystać z telefonu.

Krok 4 – Zabijanie procesów

Jeśli przed chwilą korzystaliśmy z przeglądarki internetowej, przeglądaliśmy zdjęcia lub oglądaliśmy jakieś multimedia to pomimo, że zamknęliśmy aplikacje, ich procesy nadal żyją w telefonie i pobierają energię. Najlepiej co jakiś czas w wolnej chwili sprawdzać, czy w naszym telefonie żyją jakieś procesy, z których nie korzystamy.

  • W telefonie wchodzimy w Start->Settings->System->Task Manager;
  • Jeśli jakikolwiek proces oprócz „Task Manager” będzie znajdował się na liście to go wybieramy i naciskamy End Task.

Warto pamiętać o tym kroku, bo oprócz wydłużenia czasu pracy naszego telefonu, przyśpieszymy jego funkcjonowanie.

Mam nadzieję, że po zastosowaniu powyższych wskazówek będziecie tak samo jak ja zadowoleni z telefonu HP Data Messenger. Miłego użytkowania!!!