• 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.

Dawno już nie pisałem na blogu. Nie chcę tłumaczyć się, że zarobiony jestem i nie mam na nic czasu (choć tak jest :)) wiec postanowiłem zamiast tego wyznaczyć sobie temat, o którym będę pisał i starać się pisać przynajmniej raz w tygodniu. Dzięki temu stworzę kurs jak w przypadku WPF oraz będę dość regularnie pojawiały się nowe wpisy na blogu.

O czym więc będzie kurs?

Task Parallel Library (TPL) – bo o tym chcę rozpocząć nowy cykl postów to nowe podejście do programowania równoległego, które pojawiło się (jak na razie beta) wraz z .NET Framework 4.0. Zmienia się API, pojawiają się nowe rzeczy, które my programiści możemy wykorzystać ale także pojawiają się pułapki i zagrożenia, z których czasem możemy nie zdawać sobie sprawy.

Dziś zatem tylko notka informacyjna. Zachęcam do odwiedzania. Już wkrótce postaram się opublikować pierwszy wpis.

Jakiś czas temu nagrałem kilka filmów omawiających tematy poruszane przeze mnie w kursie o WPF. Postanowiłem, że kilka z nich umieszczę na blogu jako, że w chwili obecnej nie mam dla nich lepszego zastosowania a mam mało czasu na pisanie nowych postów :).

Miłego oglądania. Uwagi, jak zawsze, mile widziane.

Jeśli binding w WPFie czasem Wam nie wystarcza polecam przyjrzeć się “projektowi”, który pojawił się na The Joy of Code. Jeśli kiedykolwiek próbowaliście wykonać jakieś operacje na wartości bindowanej teraz już możecie. Można napisać np. tak:

<TextBlock Text=”{Binding Value, ElementName=Slider,

                        Converter={binding:ExpressionConverter Math.Cos(x)},

                        StringFormat=’x/2: {0}’}” />

<TextBlock Text=”{Binding Value, ElementName=Slider}” />

<TextBlock Text=”{Binding Value, ElementName=Slider,

                        Converter={binding:ExpressionConverter x*2},

                        StringFormat=’x*2: {0}’}” />

Parametr Expression można wpisać dowolne wyrażenie, które zostanie skompilowane i wykonane (np. Math.Cos(x)/x). Oczywiście zadziała to tylko przy bindowaniu jednostronnym. Sprytne rozwiązanie, gdyż nie trzeba tworzyć oddzielnych konwerterów.

Warto również zobaczyć jak wygląda w kodzie. Można zobaczyć jak należy używać klas Expression.

Cały artykuł na – The Joy of Code – The Binding you wanted from day one in WPF.

Rok 2009 już za nami więc warto podsumować co się udało, co się nie powiodło.

Udało się:

  • dotnetomaniak.pl – uruchomienie portalu dla programistów .NET co po części przyczyniło się do powstawia ogólnego portalu – http://develway.pl.

  • dwa konkursy na dotnetomaniaku – przyciągnęły nowych użytkowników na stronę a mnie dały doświadczenie w takich sprawach.

  • ilość postów na blogu (a w szczególności kurs o WPF)

  • pomoc przy konferencjach – Communities2Communities, Codecamp’09

  • założenie własnej działalności gospodarczej – choć na razie, krótko działam to doświadczenie w przy tym zdobyte jest nieocenione

Nie udało się:

  • zdanie 70-502 – cóż nawet nie podszedłem do niego. Być może spowodowane było to natłokiem spraw w końcowych miesiącach tego roku – tak czy inaczej tu minus

  • przeczytanie 6 książek. Stanęło bodaj na 5.

  • TechEd’a też ominąłem

2010?

Postanowień na 2010 rok robić nie będę z racji tego, iż gdy plany się zmienią to wciąż trzeba spełnić postanowienia noworoczne. Dlatego nic jawnie nie zadeklaruje a po prostu napiszę, iż chcę aby 2010 był jeszcze lepszy niż 2009. Czy mi się uda? Zobaczymy.

Najlepsze życzenia noworoczne dla wszystkich.

Uwielbiam WPF’a. Uważam, że w tej technologii brzmi wielki potencjał, który z czasem ujawni się i skłoni więcej firm to zainteresowania się tą technologią. Im więcej jednak w niej siedzę tym więcej pojawia się rzeczy które sprawiają, że zatrzymuję się na chwilę i próbuję dociec czemu tak ktoś daną rzecz zrobił. Ostatnio miałem takie przejście z Bindingiem.

Prosty przykład

Chciałem sobie zbindować przycisk, ale tak aby wartość była otoczona dodatkowym tekstem. Oczywiście WPF pozwala nam na to za pomocą StringFormat. Napisałem więc taki kawałek kodu:

<Button Content=”{Binding Text, StringFormat=Wartość: {0}, Mode=OneWay}” />

Oczywiście DataContext odpowiednio został ustawiony. Uruchamiam no i nie działa. To znaczy wartość się pojawia, ale już tekst “Wartość: “ – nie. Co jest pomyślałem. Szybka weryfikacja z MSDN’em i wygląda na to, że poprawnie wszystko jest napisane. Spróbowałem jeszcze z inną kontrolką:

<TextBlock Text=”{Binding Text, StringFormat=Wartość: {0}, Mode=OneWay}” />

Zmieniłem Button na TextBlock oraz właściwość Content na Text. Uruchamiam no i działa. Magia? Nie. Okazuje się, że StringFormat nie działa dla pola Content. Najciekawsze, że MSDN nic o tym nie wspomina przy opisie tej właściwości bindingu. Co należy zrobić aby mieć taką samą możliwość formatowania dla właściwości Content? Należy posłużyć się właściwością ContentStringFormat na danym obiekcie a nie w Bindingu. Nie bardzo rozumiem czemu zostało to tak rozróżnione przez to muszę się zastanawiać czy zmieniając pole Bindowania nie muszę zmienić także miejsca gdzie ustawiam format. Nie wiem może są za tym jakieś większe przesłanki ale jak dla mnie wygląda to jak niedogadanie się co do części funkcjonalności WPF’a.

Cóż trzeba z tym żyć. Może w wersji 4 zostało to naprawione? Nie miałem okazji sprawdzić – może ktoś wie?

Silverlight 4 zbliża się wielkimi krokami. Jeśli wierzyć zapowiedziom ujrzymy go już na wiosnę 2010.

Nie czekam na możliwości drukowania. Choć to na pewno przydatna funkcjonalność w poważnych aplikacjach biznesowych. Nie czekam też na wsparcie kamery i mikrofonu. Przydatne będą i na pewno te możliwości poprawią możliwości zastosowania Silverlighta w segmencie rozrywkowym.
Nie czekam na tryb podwyższonych uprawnień choć ten na pewno po części ułatwi programowanie niektórych aplikacji biznesowych w SL.
RIA services również mną nie wstrząsną choć na pewno złagodzą ból pojawiający się przy okazji łączenia Silvelrighta z usługami na serwerze za pomocą WCFa.

Na nic mi będzie możliwość wyświetlania HTML’a w aplikacjach. Choć czasem osadzenia filmu flashowego może się przydać.
Możliwość oprogramowania prawego przycisku także nie zrobi na mnie większego wrażenia. Wsparcie dla Multi touch w wersji Out-Of-Browser to pikuś. Pan Pikuś.

Na co więc czekam?

Można by się zastanowić zatem na co czekam? A no czekam na jedną malutką rzecz. Tak malutką, że często pomijaną we wszelkich informacjach o nowościach w SL4. Co to takiego?

Werble…

Jest to możliwość używania tego samego kodu w aplikacji SL i w pełnym frameworku. Do tej pory muszę tworzyć do tego celu dwa projekty. Oczywiście da się nie powielać kodu poprzez linkowanie plików w projektach jednak nadal jest to trochę uciążliwe. Dzięki tej funkcjonalności moje życie będzie prostsze :).

Podsumowanie

Oczywiście wszystkie wymienione wyżej funkcjonalności będą przeze mnie mile powitane wraz z nadejściem SL4 :). Tak na prawdę ten post jest krótką notką na temat tego co się pojawi w SL4. Jednak, żeby nie było – z możliwości użycia tego samego kodu naprawdę się cieszę.

Bawię się ostatnio coraz częciej .NET 4 (po dośc długiej przerwie spowodowanej to chorobą to innymi sprawami) i co raz odkrywam nowości, które zostały dodane w tej wersji frameworka. Dziś kilka z nich:

  • string.IsNullOrWhiteSpace – dodana metoda sprawdzająca czy dany łańcuch znaków jest Null’em bądź zawiera tylko i wyłącznie białe znaki (także pusty)

  • Environment.Is64BitOperatingSystem – zwraca prawdę w przypadku uruchamiania pod 64-bitowym systemem operacyjnym

  • Environment.Is64BitProcess – zwraca prawdę w przypadku, gdy process jest 64bitowy.

  • Path.Combine – mogący przyjmować jako parametr nieograniczoną liczbę scieżek (params string[]) – nareszcie!!!

Na dziś tyle. Jest tego więcej (kilku rzeczom przyjrzę się jeszcze), ale te nowości leżą w najniższych warstwach frameworka. Warto je znać, aby nie tworzyć jakichś własnych rozwiązań – jak chociażby dotychczas z łączeniem trzech scieżek za pomocą Path.Combine.

Dziś znalazłem fajną rzecz dostępną w R#. Być może jest to coś oczywistego, o czym wszyscy (korzystający z tego dodatku) wiedzieli, a może nie. Piszę, bo już wielokrotnie w przeszłości okazywało się, iż rzeczy najprostsze są najmniej oczywiste.

rsharp

Po zaznaczeniu tej opcji w ustawieniach, na dole w status barze VS pojawia nam się znacznik ile pamięci nasze VS nasz R# zużywa.

rsharpindPowie ktoś – nic takiego. Racja. Jednak najlepsze pojawia się, gdy klikniemy na tą wartość prawym przyciskiem myszy i wybierzemy Collect Garbage.

rsharpcollect 
Zostanie wtedy zwolniona pamięć nieużywana przez VS R#. Dla mnie bomba. Szczególnie przydatne w dużych projektach, gdzie komunikat przy buildzie EndOfMemoryException nie jest aż tak niespodziewany.

R#, VS

Z racji pojawienia się nowego VS 2010 postanowiłem pobawić się nim i zobaczyć zobaczyć co oferuje nam stare, dobre ASP.NET w wersji 4.0.

Wywalmy tabelki

ASP.NET ma wiele dobrych i użytecznych kontrolek, które znacząco przyśpieszają proces tworzenia nowych serwisów opartych na tej technologii. Mankamentem ich, w poprzednich wersjach było to, że nawet jeśli dawały możliwość wstawienia swojego, ładnego kodu HTML w środku to opakowywały to wszystko na zewnątrz piękną tabelką

.

W nowej wersji ASP.NET możemy kontrolować to czy tabelka zostanie renderowana czy też nie. Pojawiła się nowa właściwość RenderOutputTable, która to kontroluje. Dzięki takiemu podejściu (a nie np. wywaleniu ich bez możliwości kontroli), możemy stopniowo używać to w naszym kodzie, tak aby wyeliminować tabelki zachowując nadal poprawne renderowanie się w innych miejscach.

Automatyczna zamiana tokenów HTML

Kolejną zmianą jaka została wprowadzona to, możliwość automatycznego zamieniania tagów HTML a ich bezpieczne odpowiedniki. Jeśli czasem używasz <%= %> do wyprowadzania informacji na stronie musisz pamiętać, iż stwarza to potencjalne niebezpieczeństwo, iż wyprowadzisz coś co może zostać zinterpretowane jako poprawny kod HTML. Aby tego uniknąć, użyj notacji <%: %> ( dwukropek zamiast znaku równości) a wszelki tekst zostanie odpowiednio zamieniony przed wyprowadzeniem na ekran.

Te nieszczęsne i długie IDki

Długie i czasem trudno przewidywalne ID elementów to był problem w poprzednich wersjach ASP.NET. Powodowało to utrudnienia w pisaniu kodu JS, który by do tych elementów mógł się odwołać.
W ASP.NET 4 wprowadzono mechanizm kontrolki tego jak ID są generowane. Mamy dostępne 4 tryby: Inherit, AutoID, Predictable oraz Static. Więcej do poczytania na MSDN – ClientIDMode Enumeration.

 

Podsumowanie

Fajnie, że ASP.NET ewoluuje. Na pewno jest więcej zmian w nim, niż tylko te powyższe. Widać jednak po tych wyżej opisanych, iż idą w stronę tego, aby aplikacji napisane w ASP.NET nadal były pisane szybko i aby kod HTML, który uzyskujemy był satysfakcjonujący. Nie zawsze potrzeba mieć 100% kontrolkę nad tym jaki kod jest generowany.

Już jakiś czas temu pisałem o możliwości użycia configu podzielonego na wiele plików. Dziś pokaże jeden z przypadków użycia tej funkcjonalności.

Często zdarza się tak, że podczas rozwoju aplikacji używamy naszej lokalnej bazy danych. Czasem jednak chcemy aby inne osoby zobaczyły postęp prac. Aplikacja wrzucona na serwer zapewne będzie miała inny connection string niż ten lokalny. Oczywiście możemy mieć oba connection stringi w pliku web.config i je komentować odpowiednio, ale ponieważ trzeba o tym pamiętać staje się to trochę niewygodne.

Tak więc staremu rozwiązaniu mówimy nie.

Jak to można zrobić ładniej? Możemy wykorzystać fakt, iż web.config umożliwia nam wydzielenie pewnych fragmentów do osobnych plików.
W głównym web.configu, umieśćmy tylko sekcję connectionStrings i dodajmy odwołanie do pliku zewnętrznego.

<connectionStrings configSource=connectionStrings.config>

No i oczywiście utworzyć go. W środku dodajemy nasz lokalny connectionStrings.config.

xml version=1.0?>

<connectionStrings>

  <add name=ApplicationServices

      connectionString=Server=.\SQLExpress;Database=;Trusted_Connection=True;

      providerName=System.Data.SqlClient/> 

connectionStrings>

Pozostaje nam jeszcze wyłącczyć ten plik z projektu, aby nie był kopiowany na serwer przy Deploy’u. Oczywiście na serwerze tworzymy taki sam plik z connection stringiem wskazującym na bazę danych na serwerze. I działa.

W ASP.NET 4.0 zmieni podejście do tego wprowadzając transformacje, które będziemy mogli wykonywać na web.configu. Do tego czasu pozostaje nam powyższa metoda lub … no właśnie. Być może jest jakiś inny, lepszy sposób na osiągnięcie tego samego o którym nie wiem? Zapewne jest. Jeśli go znasz napisz w komentarzu…