Kamil Kliczbor @ asptip.net

30Mar/110

Codingtv – wideoblog

Niniejszy wpis dedykuję twórcom strony, a raczej wideo-bloga codingtv.pl. Jest to całkiem innowacyjna i nowatorska forma promocji tworzenia oprogramowania w technologiach .NET-opodobnych.  Twórcami strony są dwaj programiści - Łukasz Gąsior, który posiada blog techniczny pod adresem http://gasior.net.pl oraz Andrzej Kowal. Obydwa osobniki pracują w jednej firmie - PGS Software, która udostępnia im salę do nagrywania kolejnych wideo-castów. W sumie jeszcze nie spotkałem do tej pory takiej formy nauczania na polskich stronach - wyjątek stanowi oczywiście kurs C#, który jest umieszczany regularnie na stronach virtualstudy.pl.

Koledzy w swoich wideo-castach opisują proces tworzenia bloga w C#. Technologie, których używają są "najświeższe". Wśród nich można wymienić m.in. ASP.NET MVC w wersji 3 czy Entity Framework. W kolejnych wydaniach wideocastów rzetelnie i skrupulatnie opisują dlaczego i jakie kroki podejmują, aby z pustego projektu utworzyć platformę do zarządzania blogiem. Zadowalające jest to, że nie leją wody, ale walą prosto z mostu i moim skromnym zdaniem umieszczają najważniejsze informacje. Esencja prosto w gały. Myślę, że może to być  całkiem ciekawe doświadczenie dla młodych programistów "szukających swojej drogi".

Kolejnym pocieszającym faktem jest to, że koledzy chcą prowadzić dialog. Tak jak jest to w muzyce, zgodnie z zasadą "call and response" potrafią słuchać swoich słuchaczy, a raczej można by rzecz "ogladaczy" i potrafią przy tym prowadzić konwersację. Dzięki temu powstaje swoisty dialog, dzięki któremu również siła internetowej społeczności ma wpływ na treści publikowane w następnych odcinkach. Nie wiem na ile naszym kolegom starczy sił, ale to co robią jest moim zdaniem dobre. Przyczyniają się do powstawania dobrych nawyków tworzenia oprogramowania w oparciu o najnowsze technologie, wzorce oraz metodologie. Swoją drogą, gdybym miał dostęp do takiej łatwo przyswajalnej wiedzy, to nie musiał bym w swoim developerskim życiu błądzić w jakichś bliżej nieznanych okolicach.

Polecam i gratuluje twórcom codingtv.pl - oby tak dalej!

Tagged as: , , No Comments
31Jan/110

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Dzielenie danych

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie dzielenie danych, tj otrzymywanie części wyników zapytania w określonych porcjach. W MS-SQLu można te zagadnienia zrealizować odpowiednio przy użyciu instrukcji

  • TOP - pobiera określoną liczbę pierwszych wyników zapytania
  • TOP wraz z ROW_NUMBER OVER (ORDER BY ...) - umożliwia pobranie "strony" wyników

Spis zapytań

30Jan/111

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Złączenia

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje łączenie tabel przy użyciu klauzuli JOIN.

Spis zapytań

24Jan/111

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Projekcje

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie projekcji w zapytaniach. Jeżeli piszesz instrukcję SELECT i chcesz określić jakie kolumny lub jakie przekształcenia na kolumnach chcesz wykonać, możesz użyć składni SQL-a w następujący sposób:

SELECT NazwaKolumny, funkcja_przekształcająca(NazwaKolumny) FROM NazwaTabeli

Ponieważ dane uzyskiwane w wyniku wykonania zapytania prawie zawsze różnią się od danych mapowanych do encji, stosuje się klasy transformujące wyniki na obiekty DTO. W przypadku HQl-a, Criteria API stosuje się konstrukcję SetResultTransformer(Transformers.AliasToBean(typeof(NazwaKlasyDto))), w przypadku QueryOver - TransformUsing().

Spis zapytań

6Jan/112

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Sortowanie

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie sortowania danych w zapytaniach. Jeżeli piszesz instrukcję SELECT zachodzi czasem konieczność uporządkowania danych, które są zwracane w wyniku zapytania. Ogólnie rzecz biorąc stosujemy w SQL słowo ORDER BY wraz z opcjonalnym ASC|DESC oznaczającym kierunek sortowania. Koncepcję użycia przedstawiam poniżej:

SELECT Co FROM NazwaObiektu ORDER BY NazwaColumny [ASC|DESC], NazwaInnejKolumny [ASC|DESC]

Spis zapytań

31Dec/100

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Restrykcje

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie restrykcji w zapytaniach. Jeżeli piszesz instrukcję SELECT i chcesz określić w niej warunek, musisz użyć słowa kluczowego WHERE w podstawowej formule w następujący sposób:

SELECT NazwyKolumn FROM NazwaTabeli WHERE Warunek

Wyrażenia używane w warunku są budowane przy użyciu operatorów algebraicznych, logicznych i ciągów znakowych. W tym wpisie zostały przedstawione przykłady użycia klauzuli WHERE.

Spis zapytań

27Dec/102

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq.

Wprowadzenie

Postanowiłem stworzyć ten artykuł ponieważ nie mogłem odnaleźć w necie całościowego kompendium wiedzy w temacie odpytywania bazy danych przez NHibernate. Ponieważ NHibernate udostępnia wiele sposobów zadawania pytań, moim celem jest umieszczenie ich w jednym miejscu. Wśród nich wyróżnić można HQL, criteria query API wraz z rozszerzeniem Lambda Extensions, QueryOver oraz Linq for NHibernate (NHLQ). Jednym z moich założeń jest stworzenie zbioru zapytań na coś w rodzaju 101 Linq Samples. Nie wydaje mi się, żebym był w stanie odwzorować jeden do jednego to, co znajduje się na MSDNie, ale przynajmniej będę miał materiał referencyjny do którego będę mógł się odnieść.

Zapytania będę dodawać sukcesywnie oraz uaktualniać do nich odnośniki.

Wymagania

Aby móc wykonywać w miarę sensowne zapytania postanowiłem zamapować ulepszoną wersję Northwinda, którą opisałem i umieściłem w poprzednim poście. Oczywiście jeżeli chodzi o wymagane oprogramowanie jest to co najmniej Visual Studio 2008 oraz MS-SQL 2005.

Podział zapytań

  1. Restrykcje (klauzula WHERE)
    • Prosty przykład
    • Wyrażenia <, <=, ==, !=, >, >=
    • Wyrażenie Between
    • Wyrażenie In
    • Wyrażenie Like
    • Wyrażenie Like bez uwzględniania wielkości liter
    • Wyrażenie Is Null
    • Wyrażenie Not
    • Wyrażenie Exists / IsNotEmpty
    • Wyrażenie Not Exists / IsEmpty
    • Łączenie wyrażeń (koniunkcja i alternatywa - AND i OR)
    • Wyrażenia z aliasem
  2. Projekcje
    • Prosty przykład
    • Funkcje agregujące (MAX, AVG)
    • Wywołanie funkcji MS-SQL ROUND
    • Funkcja COUNT(*)
    • Funkcja COUNT(NazwaKolumny)
    • Funkcja COUNT DISTINCT
  3. Sortowanie (klauzula ORDER BY)
    • Prosty przykład
    • Sortowanie po długości wartości
    • Sortowanie po kilku kolumnach
    • Sortowanie po kilku kolumnach przez alias (różne tabele)
  4. Złączenia (klauzula JOIN)

    • Złączenie przez CreateCriteria()
    • Złączenie przez alias
    • Definiowanie typu złączenia
  5. Dzielenie danych
    • Pobranie pierwszych wyników - instrukcja TOP
    • Pobranie określonej "strony" - instrukcja TOP i ROW_NUMBER OVER
  6. Podzapytania
  7. Grupowanie

Projekt

Do pobrania już wkrótce!

Bibliografia

27Dec/100

NHibernate 3.x i FluentNHibernate: Płynne mapowanie – Północny wiatr (Northwind)

Wprowadzenie

Celem niniejszego wpisu jest wykonanie mapowania bazy danych Northwind przy użyciu ORM-a jakim jest NHibernate w wersji 3.x. Dodatkowo, zamiast pisać xml-e konfiguracyjne posłużymy się FluentNHibernate. Model domenowy będzie stanowić całkiem niezłe podwaliny pod serię artykułów na temat pisania dedykowanych zapytań, które chcę popełnić w niedalekiej przyszłości. Za zgodą Davy Briona zmieniłem mapowania lekko zmodyfikowanej, myślę że również oklepanej bazy danych Northwind. Oryginalny projekt wraz z objaśnieniami można znaleźć pod adresem http://davybrion.com/blog/2007/07/nhibernate-mapping-examples/.

W międzyczasie chciałem iść troszeczkę na łatwiznę i zabawić się z generatorem MyGeneration. Niestety do Fluenta jeszcze nie ma szablonu :( . Wprawdzie do mapowań w xmlu dobry jest szablon o nazwie L-99, jednakże przerobienie go na wersję generującą płynne mapowania byłoby czasochłonne, więc odłożę tą pracę  na później :)

Wymagania

Do przebrnięcia przez artykuł potrzebne będzie Visual Studio co najmniej 2008 oraz co najmniej Ms Sql Server Express 2005.

Mapujemy!

W poniższych kilku krokach postaram się w miarę zwięźle przedstawić procedurę przenoszenia modelu relacyjnego z bazy danych na encje w postaci mapowań do NHibernate. Ponieważ projekt Davy'ego był dla starszej wersji NHibernate (1.2), wypadałoby uaktualnić ją do nowszej - 3.x

  1. Źródła do NHibernate wraz z towarzyszącymi bibliotekami log4neta oraz  proxy znajdują się w repozytorium na sourceforgu: http://sourceforge.net/projects/nhibernate/files/NHibernate/3.0.0.GA/.
  2. FluentNHibernate dostarcza już pierwsze binarki dla wersji 3.x, które dostępne są na stronie projektu: http://fluentnhibernate.org/downloads.
  3. Łączymy się z bazą danych i wykonujemy skrypt tworzący schemat bazy danych wraz ze stowarzyszonymi elementami (skrypt northwind_create_script.sql).
  4. Otwieramy projekt Davy'ego i modyfikujemy go:
    • Usuwamy wszystkie pliki mapowań (z rozszerzeniem *.hbm.xml), albo ustawiamy we wszystkich "Build Action" na "None"
    • Konfigurujemy ustawienia połączenia z bazą danych
    • W projekcie Domain dodajemy katalog Mappings oraz tworzymy odpowiednie mapowania.
  5. W temacie mapowań nie będę się rozpisywał. Zachęcam do przeglądnięcia dokumentacji Fluenta. W celu weryfikacji możemy ewentualnie porównać pliki hbm-ów wygenerowanych przez Fluenta  z tymi Davy'a.
  6. Uruchamiamy testy.

Warto wspomnieć również o przyjętych konwencjach Fluenta. Można zdefiniować, aby domyślnie każdy identyfikator encji miał jeden spójny sposób mapowania. Realizuje się to poprzez implementację interfejsu IIdConvention , a następnie wskazanie na tą konwencję podczas konfiguracji. Oczywiście nic nie stoi na przeszkodzie, aby konwencję nadpisać w mapowaniu konkretnej encji.

public class IdentityConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Access.ReadOnlyPropertyThroughLowerCaseField(LowerCasePrefix.Underscore);
        instance.UnsavedValue("-1");
        instance.GeneratedBy.Native();
    }
}

Gotowy projekt jest do pobrania tutaj.

IIdConvention
26Nov/102

Odświeżamy certifikat: upgrade certifikatu MCDP Web Developer z .NET 2.0 do .NET 4

Możliwe ścieżki migracji

Jak to mówią - Przyszła kryska na Matyska. Stary zaśniedziały i zardzewiały certyfikat MCPD Web Developer we Frameworku 2.0 wypadałoby uaktualnić do najnowszej wersji. Migracja nie jest wygodna, ponieważ możliwe ścieżki zakładają zdanie co najmniej dwóch egzaminów (link z pytaniem o migrację znajduje się tutaj).

Pierwsza ścieżka, która polega na zdaniu dwóch egzaminów wymaga podejścia do następujących sprawdzianów wiedzy:

  1. Exam 70-567: UPGRADE: Transition your MCPD Web Developer Skills to MCPD ASP.NET Developer 3.5
  2. Exam 70-523: Upgrade: Transition your MCPD .NET Framework 3.5 Web Developer Skills to MCPD .NET Framework 4 Web Developer

Z tym, że ostatni egzamin został udostępniony stosunkowo niedawno, tj. 22 października 2010.

Druga opcja polega po prostu na podjęciu standardowej ścieżki dla .NET Frameworka w wersji 4. Obejmuje on przystąpienie do serii następujących egzaminów:

  1. Exam 70-515: TS: Web Applications Development with Microsoft .NET Framework 4
  2. Exam 70-513: TS: Windows Communication Foundation Development with Microsoft .NET Framework 4
  3. Exam 70-516: TS: Accessing Data with Microsoft .NET Framework 4
  4. Exam 70-519: Pro: Designing and Developing Web Applications Using Microsoft .NET Framework 4

Jak widać różnica polega na ilości zdawanych egzaminów, co bezpośrednio przekłada się na koszta z tym związane oraz czas spędzony w centrum certyfikacyjnym. Ponieważ w tym momencie potrzebny mi jest MCPD z aplikacji webowych, będę dążyć do uzyskania upgradu korzystając z pierwszej ścieżki. Dodatkowo przemawiającym do mnie argumentem jest to, że nie ma wystarczającej ilości materiałów przygotowujących do egzaminów w postaci Self Paced Training Kitów w .NET Framework 4 na ten moment.

Książkowe materiały dydaktyczne

No i tutaj zaczynają się schody. Generalnie w przypadku migracji z .NET 2.0 na 3.5 oraz 3.5 do 4 nie istnieją Preparation Kity przygotowujące do egzaminu 70-567 i 70-523. Jedynym sensownym rozwiązaniem jest skorzystanie z materiałów przygotowanych bezpośrednio pod egzaminy MCTS-owe i MCPD-kowe z 3.5, czyli:

W przypadku MCPD-ka na 3.5 wydawnictwo Microsoft Press pokusiło się o wydanie książki przygotowującej do egzaminu, jednakże nie jest ona już w sprzedaży (? informacje z jakiegoś forum msdn) (na amazonie jest jeszcze dostępna). Być może z powodu złej opinii o książce została ona wycofana z druku.

Inna alternatywa polega na korzystaniu z książek z wydawnictw WROX-a, APRESS-a czy innych. Jednakże nie przygotowują one wprost do egzaminu. A wiadomo, że lepiej jest przeczytać książke pod egzamin niż zawierającą ogólną wiedzę.

Gdzie szukać materiałów w sieci?

Nie pozostaje nic innego jak przeszukać sieć pod kątem dostępnych informacji. Najwięcej materiałów znaleźć można oczywiście na MSDN-ie, jednakże przedstawiam poniżej kilka przydatnych linków, które raczej mogą bardziej pomóc niż zaszkodzić.

Nowe funkcjonalności w relacji 2.0 - 3.5:

Nowe funkcjonalności w relacji .NET 3.5 - 4.

Podsumowanie

Dużo, dużo jest do ogarnięcia. W szczególności, że w zakres MCPD-ka dla .NET 4 dochodzi WCF, ADO.NET i ASP.NET MVC. Dla programisty, który obraca się wokół tych tematów, zakres materiału nie będzie  trudny do zrozumienia. Trudności pojawią się raczej w zapamiętaniu i utrwaleniu tych informacji w ilości wystarczającej do podejścia i zdania egzaminu. W szczególności, że ASP.NET MVC to zcela nové.

A teraz już tylko: Do pracy rodacy!

20Nov/100

Krótka historia: jquery.validate + WebForms + zewnętrzy plik js

Jak do tego doszło ?

Post ten powstał z inicjatywy kolegi zadającego pytanie zadane na forum http://codeguru.pl/frmThread.aspx?tid=100619. Odpowiadając mu wydawało mi się, że rozwiązanie jest na tyle oczywiste, ze nie wymaga mojej "interwencji" w jego kod. Wszakże kod to rzecz święta :) . Jednak późniejsze boje wykazały, że nie wszystko jest takie oczywiste jak się wydawać mogło na pierwszy rzut oka. Temat oczywiście dotyczy utworzenia standardowej stronki w WebForms-ach, która ma być walidowana przez plugin do jquery - jquery.validate.

Przypadek trywialny: skrypt inline na stronie

W necie przykładów do takiego podejścia można znaleźć na prawdę wiele. Po krótkiej chwili w mojej przeglądarce wylądowało ponad 10 różnych stronek, gdzie podawane przykłady aż biły prostotą. Poniżej umieszczam te linki jeżeli ktoś ma może ochotę sobie popatrzeć jakie istnieją rozwiązania do tego zagadnienia:

  • http://www.dotnetcurry.com/ShowArticle.aspx?ID=310&AspxAutoDetectCookieSupport=1
  • http://jquery.bassistance.de/validate/demo/milk/
  • http://www.webreference.com/programming/javascript/jquery/form_validation/
  • http://stackoverflow.com/questions/1232641/jquery-validate-js-and-asp-net-master-pages
  • http://codeclimber.net.nz/archive/2008/05/14/how-to-manage-asp.net-validation-from-javascript-with-jquery.aspx
  • http://www.theaspnetguy.com/theaspnetguy_root/post/2009/05/25/JQuery-Validate-plugin-to-validate-a-ASPNET-Form.aspx

Przypadek rozszerzony : skrypt w pliku zewnętrznym

No i sprawa zaczęła się komplikować, kiedy trzeba było w elegancki sposób przesunąć skrypt javascript'owy do pliku zewnętrznego. Po kilku chwilach walki, z pomocą następujących wskazówek rozwiązałem problem:

  • http://stackoverflow.com/questions/1232465/
  • http://stackoverflow.com/questions/619816/jquery-validation-plugin-in-asp-net-web-forms
  • http://www.west-wind.com/WebLog/posts/252178.aspx
  • http://docs.jquery.com/Plugins/Validation/rules#.22add.22rules

Główny problem tego zadania polegał w gruncie rzeczy na tym, żeby w jakiś sensowny sposób przekazać identyfikatory inputów do skryptu walidującego. O ile samo wydobycie nazwy kontrolki po stronie klienta np. TextBoxa nie było trudne - <%=tbUserName.ClientId %>, o tyle przypięcie tych idków do jquery.validate wymagało większej gimnastyki.

Rozwiązanie

Zewnętrzny plik JavaScript:

var RegisterForm = {
    _controlsNames: new Array(),
    _registerForm: '',

    set_controlsNames: function (value) {
        RegisterForm._controlsNames = value;
    },

    set_registerForm: function (value) {
        RegisterForm._registerForm = value;
    },

    init: function () {

        $("#" + RegisterForm._registerForm).validate();

        $('#' + RegisterForm._controlsNames.user).rules('add', {
            required: true,
            minlength: 2,
            messages: {
                required: "* Required Field *",
                minlength: "* Please enter at least 2 characters *"
            }
        });

        $('#' + RegisterForm._controlsNames.email).rules('add', {
            required: true,
            email: true,
            messages: {
                required: "* Required Field *"
            }
        });
    }
}

Plik formularza:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="JQueryValidation._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        Formularz i walidacja z jquery.validate
    </h2>
    <asp:Label AssociatedControlID="RegisterUser" Text="Użytkownik:" runat="server"/>
    <asp:TextBox ID="RegisterUser" runat="server" /><br />
    <asp:Label AssociatedControlID="RegisterEmail" Text="Email:" runat="server"/><asp:TextBox ID="RegisterEmail"
        runat="server" />
    <br />
    <asp:Button ID="RegisterButton" runat="server" Text="Rejestruj" CausesValidation="False" />
    <script src="Scripts/jquery.validate.js" type="text/javascript"></script>
    <script src="Scripts/register.js" type="text/javascript"></script>
    <script type="text/javascript">
    //<![CDATA[
        $(function () {
            var controlsToValidate = {
                user: "<%= RegisterUser.ClientID %>",
                email: "<%= RegisterEmail.ClientID %>"
            };

            RegisterForm.set_controlsNames(controlsToValidate);
            RegisterForm.set_registerForm("<%= this.Master.Page.Form.ClientID %>");
            RegisterForm.init();
        });
    //]]>
    </script>
</asp:Content>

Dla bardziej dociekliwych umieszczam również spakowany projekt.

site tracking with Asynchronous Google Analytics plugin for Multisite by WordPress Expert at Web Design Jakarta.