• This is a usual time of the year for summaries so let’s keep the tradition alive and write one. Here’s my 2017 achievements split between months. January Blogging for 18 days straight – nothing near gutek’s achievement (whole year!) but still a nice streak Microsoft MVP title (thx Konrad Kokosa for pointing this one ;)) February […]

  • “Advent of Code is a series of small programming puzzles for a variety of skill levels.” Each day was a fun an interesting coding challenge. I’ve decided to practice and code this in python to learn the skill. Some of them might not be the best python scripting as I was short on time in […]

  • Some time ago I’ve attended a .net developer days 2017 conference. I was quite busy since (traveling, teaching .net, working) that only now I got some time to share some thoughts about it. As a bonus I’m including a short interview I did during the event. I need to state here, just to be clear, […]

  • We developers don’t like documentation. We don’t like to read it, and we even more we don’t like to write it. But sometimes it is worth to read it. Like when you find out that by using datetime in SQL DB you got a milliseconds precision but only if it ends on 0,3,7 (link). That […]

  • In the previous post we’ve removed some of the technical debt that could be found in our NetDeveloperPoland Website application. In this one we will remove it even more. We can even maybe reach a B? Let’s see where we’ll end up at the end of this part.

Choć dawno już nie pisałem nic technicznego, to dziś także mało techniczny post. Zapewne już wszyscy widzieli film, który pojawił się na Channel9 dotyczący historii Visual Studio (jeśli nie to nadrób to szybko :)).
Ja umieszczam linki u siebie na blogu, abym w przyszłości nie musiał ich długo szukać.


Get Microsoft Silverlight


Get Microsoft Silverlight

Co mi się tak w nich podoba? Wszechobecna pasja. Pasja z jaką wypowiadają się bohaterowie tego filmu jest niezwykła. Z przejęciem opowiadają o tym co miało miejsce dawno temu i nadal są tym podekscytowani. Prawdziwe z nich geeki 🙂

Ja sam uważam, iż to co robię jest więcej pasją niż tylko zajęciem, które wykonuję. I mam nadzieję, że ja także po tylu latach spędzonych przy rozwijaniu oprogramowania będę nadal tak samo pasjonował się tym co robię jak to jest obecnie.

Jak ten czas szybko leci, jak dziś pamiętam MTS’08 a tu już jutro kolejna edycja.
Poprzedni MTS uważam za bardzo udany nawet z małymi wpadkami, które były. W tym roku, aż takich emocji przy wyborze sesji nie było, ale mam nadzieję, że i tak sesję będą ciekawe. Do zobaczenia na MTS…a potem na C@N

Dla ciekawskich – mój harmonogram.

Wtorek 29 września 2009

  • Silverlight – przyszłość aplikacji biznesowych
  • Zabezpieczenie i „odbezpieczanie” kodu .NET
  • .NET 4.0 Inside/Out – CLR 4.0, DLR i ich wpływ na sposób programowania
  • Co nowego w Silverlight 3?

Środa 30 września 2009

  • Windows 7 dla deweloperów
  • Czy ASP.NET MVC oznacza zmierzch “klasycznego” ASP.NET?
  • How to write application for Microsoft Surface
  • Entity Framework w aplikacjach

Dziś zaczniemy cytatem. Jak ktoś wie z czego to i kto to mówi to pogratulować dobrego gustu 🙂

Czemu nie ma prądu? Bo u nas nie ma minusów, tylko same plusy…

A czemu taki cytat? A no dlatego, że chciałem wykonać wydawałoby się banalną czynność wyświetlenia wartości double z ‘+’ z przodu.

Nic prostszego powiecie. Szybkie zerknięcie do dokumentacji formatów, przy żadnym nie widzę, aby było coś napisane, odnośnie wyświetlania ‘+’. No niech będzie zrobię swój…

Chwila kodowania i mam:

double plus = +123.5;         

var nf = new NumberFormatInfo {PositiveSign = “+”};

Console.WriteLine(plus.ToString(nf));

Jednak wynik niezadowalający…

Czyżbym jednak coś źle robił. Zobaczmy co o tej właściwości pisze MSDN.

This property is used only for parsing numeric strings, not for formatting.

Pogrubienie moje

Czyli rzeczywiście podejście złe. Zobaczmy jednak czy podobnie piszą o NegativeSign.

Szybkie wertowanie “stron” i zero komentarza. Weryfikacja w kodzie potwierdza, iż znak dla liczb ujemnych możemy zmienić. Nie ma to jak spójny framework :/.

No cóż, nadal problem jest. Jak zatem możemy uzyskać tak prostą czynność jak wyświetlenie znaku ‘+’ przed liczbą?

Musimy podjeść nieco z drugiej strony.

double plus = +123.5;         

Console.WriteLine(string.Format(“{0:+0.#####;-0.#####}”, plus));

Jeśli ktoś nie rozumie tego zapisu formatu to tylko powiem, że pierwsza maska stosuje się do wartości >=0 a druga MSDN – Custom Numeric Format Strings, rozdział The “;” Section Separator.

Miłego czytania 🙂

Kolejna “nowość” (dla mnie) w WPF. Wiadomo, że możemy tworzyć style dla wszystkich elementów naszego UI. Jednak WPF daje nam jeszcze większą możliwość dostosowania wyglądu – w tym przypadku tylko kontrolek, które są kontenerami dla innych. Jak to uzyskać? Wystarczy skorzystać z klasy StyleSelector.

Zacznijmy od stworzenia naszego Selectora.

public class MyStyleSelector : StyleSelector

{

    public override Style SelectStyle(object item, DependencyObject container)

    {

        var style = new Style(typeof (ListBoxItem));

        var setter = new Setter {Property = Control.BackgroundProperty};

        var listBox = ItemsControl.ItemsControlFromItemContainer(container);

        var index = listBox.ItemContainerGenerator.IndexFromContainer(container);

 

        setter.Value = index%2 == 0 ? Brushes.LightBlue : Brushes.Beige;           

        style.Setters.Add(setter);

        return style;

    }

}

Co się dzieje w naszej metodzie? Tworzymy obiekt Style i ustawiamy typ, którego będzie dotyczył (w naszym przypadku ListBoxItem). Następnie tworzymy Setter definiując jaka właściwość nas interesuje (Background). Następnie za pomocą helpera (ItemsControl) pobieramy kontener i badamy jego indeks. W zależności od jego pozycji ustawiamy tło.

Co nam pozostaje to użycie naszego Selectora w XAML’u.

Dodajemy namespace do naszej klasy:

<Window x:Class=”StyleSelectorDemo.Window1″

  xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”

  xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”

  xmlns:StyleSelectorDemo=”clr-namespace:StyleSelectorDemo”

  Title=”Window1″ Height=”300″ Width=”300″>

Dodajemy element do słownika zasobów:

<Window.Resources>

    <StyleSelectorDemo:MyStyleSelector x:Key=”myStyleSelector” />

Window.Resources>

No i samo użycie:

<ListBox ItemContainerStyleSelector=”{DynamicResource myStyleSelector}”>

    <ListBoxItem>1ListBoxItem>

    <ListBoxItem>2ListBoxItem>

    <ListBoxItem>3ListBoxItem>

    <ListBoxItem>4ListBoxItem>

ListBox>

Możemy użyć także StaticResource – zależy od tego czy nasz styl może się zmieniać dynamicznie i czy chcemy aby te zmiany były odwzorowane.

Efekt końcowy….(działający także w trybie Design)

Dziś mały tips, który wpadł mi w oczy przeglądając zasoby MSDN’u.

Aplikacje napisane w WPF (a zwłaszcza animacje) często są postrzegane jako powolne a fakt ten jest przypisany powolności samego silnika WPF. Oczywiście, w pewnym stopniu jest to prawda, ale czasem jest to spowodowane niezrozumieniem WPF’a.

W Windows Presentation Foundation, część obiektów dziedziczy po klasie Freezable. Można by się zastanawiać po cóż nam kolejny poziom dziedziczenia. Jeśli jednak zobaczymy jakie są to klasy, od razu na język przyjdzie nam jedno słowo – Animacje.

Obiekty dziedziczące po Freezable możemy zamrozić sprawiając, iż nie będą one podlegać animacjom, przyśpieszając te elementy, które do animacji są niezbędne.

W zasadzie do tej pory nie napisałem niczego nowego. Nowością (dla mnie) jest fakt, że można zamrozić obiekt z poziomu XAML’a. Jak to zrobić – poniżej.

<Window.Resources>

    <SolidColorBrush x:Key=”blueBrush” Color=”Blue” PresentationOptions:Freeze=”true” />

Window.Resources>

Aby to zadziałało, musimy dodać odpowiedni namespace:

xmlns:PresentationOptions=”http://schemas.microsoft.com/winfx/2006/xaml/presentation/options”

Jeśli więc macie niewydajną animację napisaną w WPF, zobaczcie czy nie da się pewnych jej elementów zamrozić a tym samym poprawić wydajność całości.

Może temat trochę na wyrost, ale już wyjaśniam o co chodzi. Czym jest że tak teoria spiskowa w .NET. Dla mnie jest to dziwne przeświadczenie dużej liczby programistów, że skoro w .NET istnieje Garbage Collector to pojęcie Memory Leaków nie istnieje. Nie chodzmi mi tu o zasoby rzadządzalne, które już znaczna część programistów wie, że należy zwalniać (wołając Dispose, bądź używając klauzuli using), ale o te zarządzalne. Jak to zatem możliwe, możesz spytać?

Garbage Collector to bardzo użyteczne “stworzenie”, ale to my jesteśmy “Twórcą” i GC może nam tylko służyć. Nie ma (jeszcze) wbudowanej sztucznej inteligencji, tak więc nie może domyślić się “co autor miał na myśli”. Rozpatrzmy sobie takie oto prosty program.

public Form1()

{

    int[] mem = new int[100000];

    for (int i = 0; i < 100000; i++)

    {

        mem[i] = new Random().Next();

    }

    InitializeComponent();

}

private Form1 childForm;

private void button1_Click(object sender, EventArgs e)

{

    childForm = new Form1();           

    childForm.ShowDialog();

    childForm = null;

}   

 

private void button2_Click(object sender, EventArgs e)

{

    GC.Collect();

}

Proste okno z dwoma przyciskami. Pierwszy z nich otwiera okno potomne. Drugi dla uwidocznienia działania wywołuje GC.Collect().

Zobaczmy jak będzie wyglądała pamięć naszego programu po 5-cio krotnym kliknięciu przycisku button1 a następnie oczyszczeniu pamięci przez GC (kliknij obrazek, aby zobaczyć powiększenie).

Widzimy dokładnie to czego się spodziewaliśmy. 5 instancji formy zostało zniszczonych. Zatem wszystko w porządku, tak? Nie do końca. Dodajmy coś co w aplikacjach .NET pojawia się nader często. Eventy.

Dodamy sobie do naszego prostego projektu klasę ustawień. Zrobimy z niej Singleton’a i dodamy możliwość podpięcia się pod zdarzenia, gdy nastąpi zmiana tych właściwości, tak aby formy mogły na nie zareagować.

public class Preferences

{

    private Preferences() {}

 

    private static Preferences instance;

    public static Preferences Instance

    {

        get

        {

            if (instance == null)

                instance = new Preferences();

            return instance;

        }

    }

 

    public void Notify()

    {

        var propertyChnaged = ProprtyChanged;

        if (propertyChnaged == null) return;

        propertyChnaged(this, EventArgs.Empty);

    }

 

    public event EventHandler ProprtyChanged;

}

A w konstruktorze formy dodajmy następującą linię:

Preferences.Instance.ProprtyChanged += Instance_ProprtyChanged;

Uruchommy naszą aplikację pod profiler’em i sprawdźmy jak się zachowa (kliknij obrazek, aby zobaczyć powiększenie).

Widzimy, że nasze formy przetrwały GC. Jak to możliwe? Dzieje się tak dlatego, że obiekt Preferences istnieje cały czas w aplikacji. I dobrze takie jego zadanie, jednak poprzez podpięcie się do niego eventem blokujemy przed GC jego usunięcie.

Rozwiązanie jest proste. Odpięcie tego eventu, gdy zamykamy formę. Proste, a często zapominane przez programistów. Na pewno widzicie pełno kodu, gdzie występuje tylko += a nie ma żadnego -=. Czasami może nam się upiec, nie zawsze występują takie warunki, że forma będzie blokowana przed GC. Jednak zawsze powinniśmy eventy odpisać. To powinien być taki nasz dobry nawyk.

Na zakończenie, zrzut z profiler’a z dodanym odpięciem zdarzenia (kliknij obrazek, aby zobaczyć powiększenie).

Wszystko znów w normie.

Znacie może jakieś inne fałszywe “prawdy” o .NET?

…spokojnie :), bo kończę jedynie o nim pisać i tyczy się to tylko tego bloga. Strona dorobiła się swojego własnego:

A po cóż taki krok?
Powód jest prosty. Mam nadzieję, że nie tylko ja będę na tamtym blogu pisał. Zapraszam do odwiedzania bloga. Drobne zmiany na maniaku się szykują tak więc niedługo coś się tam pojawi.

Oto 200. post na moim blogu. Trochę czasu zleciało (ponad 3 lata), aby go napisać ale udało się :).

Z tej racji postanowiłem przygotować mały konkurs dla czytelników. Można wygrać ciekawe nagrody (o tym poniżej). Wystarczy udzielić odpowiedzi na proste pytania.

  1. Ile razy na blogu pojawił się opis programu Deep Zoom Composer i jakie projekty były w ramach omówienia przygotowane?

  2. Jakie książki zostały zrecenzowane na blogu (+ linki)?

Odpowiedzi można słać na adres umieszczony w profilu. Wygrywają 2 pierwsze osoby. A do wygrania są: kubek dotnetomaniak (będę zamawiał, więc trochę potrwa) + koszulka Telerik (nie gwarantuje rozmiaru). I na koniec mała prośba – jeśli masz już taki kubek i koszulkę – daj szansę innym 🙂

Po skończonej lekturze książki o Silverlight 2 (Foundation Silverlight 2 Animation) zabrałem się za czytanie czegoś lżejszego. The back of the napkin omawia zagadnienie, które autor określa jako ‘visual thinking’. Polega ono na przekazywaniu wiedzy, idei oraz rozwiązywaniu problemów za pomocą obrazów (w zasadzie obrazków).

Z książki możemy dowiedzieć się na czym polega ‘visual thinking’, jaką przewagę daje nam to w stosunku do tradycyjnego opartego na tekście sposobu ‘komunikacji’ oraz w jaki sposób możemy zacząć naszą przygodę z tym.

Autor w bardzo obrazowy (a jakże :)) sposób przedstawia jak możemy jak rozpocząć używanie jego techniki. Krok po kroku omawia przykłady problemów oraz jak możemy w nich zastosować ‘visual thinking’. Podaje także 6 kroków za pomocą których, każdy problem możemy sprowadzić do reprezentacji obrazkowej :).

Podsumowując – Książka lekka i przyjemna. Fajnie się ją czyta, a jeśli ktoś jest jeszcze zainteresowany rozwojem osobistym i poszerzaniem swoich możliwości to nada się dla niego jak ulał.

http://www.thebackofthenapkin.com/

Na przeczytanie czeka już następna książka – SQL Injection Attacs And Defense