Sunday, October 12, 2008

MTS 2008

Wróciłem z dwudniowej konferencji Microsoft Technology Summit 2008. Zgodnie z oczekiwaniami konferencja była inspirująca. Momentami treść prelekcji odbiegała od tematu, albo od poziomu na jakim powinna być (była za prosta), ale ogólne wrażenie bardzo pozytywne i na pewno polecam uczestnictwo w takich eventach. Daje to doskonały pogląd gdzie należy położyć akcenty w rozwoju naszych aplikacji, jakie nowe mechanizmy mogą nam w tym pomóc. Czego i jak używać. Równocześnie nie jest prowadzeniem „za rączkę” jak na szkoleniu, więc zgłębienie tematów, które nas zainteresowały pozostaje w gestii słuchacza.

Teraz po kolei…

Refleksja ogólna

Większość prelekcji nie dotyczyła rzeczy nowych, albo takich, które nadal można nazywać nowymi, szczególnie w kontekście architektury tworzonych aplikacji w technologii .NET. Było natomiast dużo o istniejących mechanizmach, o tym jak ich dobrze używać, jak ich nie używać, jakie są Best Practices.

Z tego wprost płynie wniosek, że należy poważnie zabrać się za używanie technologii M$ (i nie tylko) w sposób częsty i skuteczny. Bo skoro ciągle w kółko mówi się np. o tym, co to jest AOP jakie jest dobre i dlaczego… Ciągle powtarza się jak używać WCFa, do czego to służy, jakie niesie konsekwencje… Nadal pokazuje się jak przyspieszać działanie aplikacji Webowych, jakie najczęściej są popełniane błędy i jakie niesie to za sobą konsekwencje… Stale mówi się o refactoringu, kontenerach DependencyInjection, Separation of Concerns i couplingu w bibliotekach, to znaczy, że ciągle:

  • powtarzamy te same mechanizmy/fragmenty kodu… Tworzymy kod, a nie sens (J).
  • używamy dostępnych technik nie do końca tak, jak należy.
  • nasze aplikacje webowe są ciężkie i wolne
  • nasz kod jest nieczytelny, niezgodny z zasadą SoC i mocno zależny od innych fragmentów, szczególnie od implementacji innych fragmentów!!!
Wydajne aplikacje ASP.NET w świecie Web 2.0 – Tymoteusz Chmielewski
  • W końcu prosta definicja Web 2.0 – treść od użytkowników, zarządzanie przez społeczności itp.
  • REST – wyrażanie treści logicznej przez URLe
  • ASP.NET a Web 2.0:
    • AJAX
    • LINQ
    • WCF
    • WWF

Ogólnie w rozwiązaniach Web 2.0 – nie odkrywać po raz setny koła – korzystać z gotowych szablonów/rozwiązań do tworzenia for, wiki, cms, blogów – np. Community Server – takich mechanizmów nie należy pisać od zera, bo to zwyczajna strata czasu.

  • Wydajność w Web 2.0
    • Baza danych zawsze będzie wąskim gardłem – czasem przy dużym obciążeniu warto zastanowić się nad de normalizacją struktury w celu zwiększenia wydajności
    • Logiczne partycjonowanie danych – można lokalizować dane/serwery np. zgodnie z regionami (np. zgodnie z województwami)
    • Pageowanie - Różnica w wydajności jest ogromna w zależności od zastosowanych mechanizmów:
      • Od strony dostępu do danych – LINQ2SQL – działa dokładnie tak jak byśmy to napisali sami na DataReader
      • Od strony WWW to zależy:
        • AJAX + JSON – opad szczeny jak to może być wydajne, ale na razie po stronie kodu JavaScriptowego – masakra
        • AJAX (Ajax Control Toolkit) – dużo lepiej niż było to dawniej, a bardzo wygodnie z kodu

 

Praktyczne aspekty budowania rozwiazań klasy Enterprise z wykorzystaniem produktów Microsoft Patterns and Practices - Marcin Sieradzki

No tu się Pan niestety nie wykazał. Pogadał trochę o Enterprise Library i o samej idei M$ P&P, ale ogólnie poziom sesji bardzo niski.

.NET bez wizardów – sposoby tworzenia i dynamicznego aktywowania komponentów w aplikacjach - Bartosz Pampuch

Bartek jak zwykle wymiatał…

  • Nie wiedziałem, że jest coś takiego jak otwarte typy generyczne (np. ICollection<>)
  • Porównanie kontenerów do DependencyInecjtion – pokazanie co jest w którym jak realizowane, ze wskazaniem na kontener Autofac.
  • Onion Architecture – o tym już czytałem akurat – polecam http://jeffreypalermo.com/blog/the-onion-architecture-part-1/
  • Hawkeye – aplikacja musthave dla developera
  • AOP
    • Najpierw pokazał jak można różne rzeczy zrobić przy pomocy ContextBoundObject, ale to działa wolno
    • Post# - Make Sense Not Code – z tym się powinniśmy jak najszybciej zaznajomić i używać.
  • Jak należy korzystać z WCFa – tutaj mamy gotowy mechanizm napisany przez Szymona Pobiegę – z tego co mówił Szymon prawie dokładnie tak, jak sugerował Bartek
  • Stock Trader – przykładowa aplikacja/platforma do konfiguracji, skalowania i zarządzania aplikacjami WCFowymi – tę architekturę można wykorzystać – jest udostępniona – ogólnie jest na co popatrzeć
Wybrane koncepcje architektoniczne - jak organizować rozbudowane systemy Informatyczne (oraz jak ich NIE organizować) - Tomasz Kopacz

Dużo o SOA. Ogólnie Tomek miał ostatnią sesję pierwszego dnia, ostro jechał z tematem, trochę było powtórzeń w kontekście Web 2.0 i przyspieszeń.

Nowe typy danych w SQL 2008 - Krzysztof Kozielczyk
  • Typy datowe – teraz precyzja i skala tych typów ma znaczenie – uważać przy indeks seekability – przy użyciu w klauzuli np. WHERE daty o precyzji 7 niekoniecznie QO może skorzystać z indeksu zbudowanego dla kolumny datowej o precyzji 3.
  • DateTimeOffset – działa na UTC, przechowuje informacje również o strefie czasowej:
    • Indeksy, agregacje, sortowanie – na czasie UTC
    • Cast/Convert – na wartości lokalnej
  • Do nowych typów datowych (np. DATETIME2) nie można już dodawać wartości integer
  • Uwaga: Proces .NET Framework, który będzie działał w trakcie zmiany czasu z letniego na zimowy nie dokonuje automatycznej zmiany czasu lokalnego
  • (SQL) TIME mapuje się na Timespan (.NET), ale jeszcze nie ma pełnego wsparcia - .NETowcy nad tym pracują
  • Typ tablicowy
    • doskonale może się nadawać przy operacjach „batchowych",
    • jest wspierany przez .NET Framework (SqlDbType.Structured)
  • HierarchyId - Typ hierarchiczny - drzewko
    • Indeks wgłąb
    • Indeks wszerz
    • Zdecydowanie szybsze do operacji CTE i rekursywnych w relacji parent/children
  • Filestream
    • Atrybut na varbinary(max)
    • Przechowywanie w systemie plików
    • Dostęp transakcyjny
Organizacja dostępu do danych w aplikacjach WWW - Tomasz Kopacz
  • HyperV – doskonałe do testowania zachowania aplikacji w różnych konfiguracjach środowiskowych – łatwe modyfikacje ilości pamięci, liczby rdzeni, procesorów itp.
  • Asynchroniczne ASP.NET i ADO.NET oraz jak tego używać.
  • Visual Studio Web Test – naprawdę nieźle działa
  • Strumieniowanie RSS po WCF jako dostęp do danych – ciekawe zastosowanie
  • Konflikt zapisu do bazy przez różnych użytkowników – możliwe rozwiązania
    • Np. Encja EntityDataModel do ViewState’a – mamy to wtedy zapewnione od razu (łącząc z Windingiem)
    • Kolejka – zapis à ServiceBroker à można uniknąć „Peeków” zapisowych
  • Długie transakcje – możliwe rozwiązania
    • ViewState między stronami
    • Cookie + GUID
    • WWF + WebClientSoftwareFactory
  • MARS
  • Enterprise Library
    • Konfiguracja – zapisywanie zmian między środowiskami TEST/PRODUKCJA itp. w kontekście danej maszyny – łatwe do użycia i zastosowania
    • CachingApplicationBlock
      • Do tego dodajemy mechanizm SqlDependency i mamy dobry mechanizm do cacheowania z uwzględnianiem przedawniania
      • Problem – działa lokalnie – kłopot gdy farma serwerów – rozwiązaniem będzie rozwijany teraz projekt Velocity – na razie nie jest jeszcze w fazie CTP. Planowy RTM na połowę 2009 chyba
  • Stoswanie var przy korzystaniu z EDM – przy przekazywaniu danych dostajemy dzięki temu „automatyczną” konwersję pomiędzy ciężkimi i lekkimi obiektami w zależności  od potrzeb.
  • DataServices (aka Astoria) – .NET 3.5 sp1 – wsparcie RESTowe - kolejny sposób dostępu do danych warty rozważenia
Programowanie .NET na platformie SQL Server - Krzysztof Kozielczyk

Szkoda, że nie nazywało się SQL CLR, bo o tym właściwie było.

Z ciekawszych rzeczy o których mówił

  • UserDefinedAggregate – można definiować własne agregaty – co ciekawe zawsze trzeba zaimplementować możliwość łączenia wyników pośrednich, aby SQL serwer mógł wykorzystać zrównoleglenie i chyba nie da się tego wyłączyć :/
  • TableValuedFunction – można teraz takie tworzyć, obsługa IEnumerable wiersz po wierszu, ale:
    • Jeżeli funkcja czyta dane, to nie można wejść w tryb „przeplatanej” egzekucji „field return” – BUG – może kiedyś zostanie poprawiony, komunikat z SQLa jest bardzo nieadekwatny
  • HierarchyId, SpatialData, PolicyBasedManagement – to są rzeczy nowe w SQL2008 w całości zrealizowane w SQLCLR więc na pewno M$ będzie dbał o rozwijanie i optymalizowanie tej technologii.
  • W trybie External Access można wołać usługi WCFowe
SQL Server 2008 dla developerów - Cezary Nolewajka

Tu dużo się powtórzyło, było dużo uwag jak należy zamykać, zwalniać połączenia, readery itp., oraz trochę drobnych uwag.

  • DataReader
    • CommandBehavior.CloseConnection – powoduje, że przy zamykaniu Readera, zostanie również zamknięte/zwolnione połączenie – przydatne przy przekazywaniu Readera w parametrach
    • Odwołania do readera – lepiej sobie zapisać gdzieś ordinal danej kolumny i odwoływać się przez indeks, a nie przez nazwę – podobno szybsze.
  • Można wyłączyć w SO operację zmiany daty modyfikacji plików bazodanowych – może trochę przyspieszyć – baza danych i tak ciągle pisze po tych plikach.
  • ServiceBroker jako
    • Mechanizm kolejkowy
    • Mechanizm wymiany komunikatów

Thursday, September 11, 2008

http://leszczu-dev.blogspot.com/ – reaktywacja

Jak w temacie. Tym razem postanowiłem nie silić się na j. angielski – może w ten sposób dłużej pociągnę…

P.S.
A kontrola języka polskiego w WLWriter dalej mi nie działa :/



EDIT: Już działa - tak to jest jak się nie czyta do końca

ZineDay2008 – krótka relacja

Byłem. Czytuję blogi na zine.net, więc postanowiłem pojechać. Ogólne wrażenie z wydarzenia bardzo pozytywne. I przez to, że nie budżet był skromny, to obeszło się bez całej masy niepotrzebnego marketingowego bełkotu.

Gael Fraiteur - "Addressing non-functional requirements with aspects"

Mała retrospekcja – na CodeCamp w Krakowie sesja Gaela całkowicie mnie zanudziła, więc to była druga szansa dla tego Pana i choćby z tego powodu warto było pojechać. Gael przeszedł samego siebie. Pokazał dokładnie o co chodzi w programowaniu aspektowym, porównał jak działają różne dostępne frameworki, na jakim etapie dokonywane jest tkanie aspektów i jakie to ma konsekwencje, oraz omówił krótko możliwości frameworków. Wszystko klarownie i z humorem. 10/10

Andras Belokosztolszki - "Managing change in the database world"

Jako, że dziedzina związana z SqlServerem i SQLem ogólnie, które są mi coraz bliższe, to bardzo się cieszyłem na tę sesję i przyznam, że trochę się zawiodłem. Tzn. poziom prezentacji i wartość merytoryczna jak najbardziej w porządku. Andreas pokazał jakie wyzwania są przed ludźmi chcącymi nadzorować zmiany wprowadzane w schematach baz danych, jakie są problemy, jak niektóre mechanizmy zostały niedopracowane przez M$. Czego nie używać i dlaczego. Wszystko fajnie, tylko brakowało mi jakiejś konkretnej myśli przewodniej – niby jasne, ale co dalej? Dobrze wiedzieć, że nie należy używać sp_rename do textual objects w SqlServer, ale odpowiedź czego używać w zamian już nie padła. 8/10

Gael Fraiteur & Jakub Binkowski - "More complex aspects using PostSharp

Druga sesja Gaela tym razem w parze z Kubą poprowadzona w konwencji początkujący developer + expert, który wszystkie Twoje problemy rozwiąże przy pomocy aspektów.

Poza tym, że miałem wrażenie, iż Kuba trochę przesadza z tą “głupkowatością”, to również bardzo udane wystąpienie. Dalej konkretnie i z humorem, tym razem już nurkując w kod i pokazując jak niektóre rzeczy łatwo zrobić używając Post#. Motyw z INotifyPropertyChange – opad szczeny. Chciałoby się rzec – no nareszcie to zaczyna być proste.

Konkurs na projekt Open Source

Szymon startował. Niestety nie wygrał upragnionego VSTS. Szkoda. Wydarzenie udane. Chłopak z Biesko-Białej, z II klasy LO prezentujący aplikację webową, w połączeniu z servicem zbierającym dane administracyjne o komputerach w sieci i parametrach przydatnych dla administratora – opad szczeny.

Konkluzja

Było warto. Więcej takich imprez poproszę.

Tuesday, May 22, 2007

My private daily WTF

As I look to see how far am I In writing my dev-blog the only sentence that comes to my mind is Didn't I tell you?

The truth is I don't really have time for anything, and so, for writing blog either.


 

There are only two things to which I'm sure they have no borders: God's Mercifulness and human stupidity (I can't remember where I've read this sentence).

It's really funny what "programmers" are able to produce. Unfortunately I'm one of them and I also make mistakes, so I'll try to be self-criticised and when I find some stupid code I've written I'll put it here also.

The most irritating part of code I'm often reading is written like this:

if (a == b)

{

    return true;

}

else

{

    return false;

}


 

Grrrrrrrrrr.

Why can't a programmer write it like:

return a == b;

1 line instead of 8.


 

Please, all of you – programmers, remember:

Think twice before you start coding. Otherwise you'll have to write twice – before and after thinking.

Sunday, April 22, 2007

Logger

I've tried programming in many languages and using different technologies. And for doing all that development stuff I realised one thing. There is no programmer, that makes no mistakes. And there is no tester or Q/A worker, that finds all mistakes. The only way to know what and when goes wrong with your application is to log almost everything. You can always use sth like log level, not to log every method call, but you should have ability to do it.
The first thing we usually do (in the company I'm now working for) if something goes wrong, is asking client for logs from the application.

If you can't use loggers like log4j you can quite easily write your owns. I'll not give you the exact code example (as far as I remember I've seen something similar on http://www.codeproject.com), but I'll try to show you the main concept:


enum LogLevel {
INFO,
WARNING,
ERROR,
DEBUG,
CRITICAL,
DEFAULT
}

interface ILogger {
void Log(string message);
void Log(string message, LogLevel level);
}

class EmptyLogger impl ILogger{
EmptyLogger() {}
void Log(string message) {}
void Log(string message, LogLevel level) {}
}

class CompositeLogger implILogger {
CompositeLogger() {}
ArrayList Loggers = new ArrayList();

void AddLogger(ILogger logger) {
Loggers.add(logger);
}

void RemoveLogger(ILogger logger) {
Loggers.remove(logger);
}

void Log(string message) {
Log(message, LogLevel.DEFAULT;
}

void Log(string message, LogLevel level) {
foreach (ILogger logger : Loggers) {
logger.Log(message, level)
}
}
}


When using this simple Composite pattern logger implementation in your application remember to mix it with Singleton pattern. We don't want to have separate logger for each method, but one per application.

Monday, April 16, 2007

Eclipse - vanished plugin

I'm developing a project based on Eclipse GEF. I'm using de.unikassel.imageexport plugin. I postponed working on this project for some time. One day I decided to write something new. I've updated my local version with the svn version. My project wasn't compiling... There was a problem with MANIFEST.MF file, and plugin.xml file - extension point to de.unikassel.imageexport was invalid.
I tried to:
  • refresh the project - it didn't work...
  • clean the workspace - it didn't work...
  • delete all stuff connected with the project and download it again - it didn't work...
The solution was:
Eclipse -> Help -> Software Updates -> Manage Configuration
Select the button Show Disabled Features, to be clicked.
Disable the plugin Image Export.
Enable the plugin Image Export.
It worked!!!

Hello

I've decided, to create my own developer's blog... I'll try to present my solutions to some annoying problems with developer tools, some tips & tricks I've learned etc...