środa, 26 lutego 2014

NancyFx - Polskie znaki

Podczas pracy nad nowym projektem, z wykorzystaniem frameworka Nancy (NancyFx) zauważyłem, że mam problem z wyświetlaniem polskich znaków w widoku (Razor). Rozwiązaniem okazało się dodanie metataga <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> do części <head>

Przykładowa część strony wygląda więc tak:

<head>
    <title>Input</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>

 Źródło, z którego wziąłem rozwiązanie.

środa, 19 lutego 2014

MS SQL - Edycja wierszy w edytorze wg. zapytania SQL

W MS SQL Managment Studio istnieje opcja, aby edytować wiersze w edytorze. Standardowo, jest to opcja na edytowanie pierwszych 200 wierszy (top 200 rows), jednak edytor udostępnia możliwość, aby edytować wiele, dowolnie wybranych wierszy.

Aby tego dokonać, należy, najpierw wybrać standardową opcję "Edit Top 200 Rows", a nast. na uzyskanym zbiorze wynikowym, prawy przycisk myszy, "Pane->SQL", a nast. edytujemy zapytanie SQL tak, aby uzyskać zakres danych, który chcemy później edytować w edytorze.

Link do pytania na stackoverflow.com/

wtorek, 11 lutego 2014

Szkolenie Comarch - Programowanie .NET 4.0 - kurs zaawansowany

W dniach od 05.02.2014 do 07.02.2014 (3 dni) miałem przyjemność wziąć udział w szkoleniu, zorganizowanym przez firmę Comarch nt. ' Programowanie .NET 4.0 - kurs zaawansowany'.

Szkolenie przeprowadził Marcin Najder (techblog), ale zanim przejdę do konkretów najpierw kilka spraw "formalnych". Szkolenie odbyło się w Warszawskiej siedzibie firmy, przy ul. Leśna 2 (przecznica ul. Puławskiej 525), czyli... na Ursynowie, przy ul. Puławskiej, drugie światła od zjazdu z południowej obwodnicy Warszawy, czyli... bardzo dobra lokalizacja dla zmotoryzowanych (w okoliczny jest gdzie zaparkować).

Co do oferty szkoleniowej, to można ją przejrzeć tutaj, natomiast szczegóły szkolenia, na którym ja byłem, można obejrzeć tutaj. Pod każdym szczegółowym opisem szkolenia jest niebieski przycisk "Terminarz i Rejestracja", więc jeżeli ktoś jest zainteresowany, to wiadomo co i jak.

Jeżeli chodzi o samo szkolenie, to nie będę ukrywał, że cena 3 dniowego szkolenia, była jak na Warszawę bardzo konkurencyjna  (w promocji, 1400zł + VAT).

A jak wyglądało samo szkolenie?
    Należy zacząć od tego, że sam prowadzący, to bardzo sympatyczny, a przy tym doświadczony programista. Prawdziwy pasjonat w swoim fachu, fan zarówno języków funkcyjnych jak i obiektowych i to m.in. próbował nam przekazać podczas szkolenia. Ponieważ w naszej 7 os. grupie, były os. o bardzo zróżnicowanym doświadczeniu programistycznym, Marcin musiał się nieco wysilić, szczególnie że był niemal przez cały czas pod porządnym gradobiciem pytań.
     Były więc os. zaraz po studiach (i kursie podstawowym), które prosiły o więcej wyjaśnień związanych z lambdami, delegatami itp., jak i doświadczony programista PHP pragnący spróbować swoich sił w .NET, jak i 2-3 bardziej doświadczonych programistów, pytających co chwila o bardziej zaawansowane tematy oraz różnego rodzaju "wątki poboczne".
     Na wszystkie te tematy, prowadzący odpowiadał spokojnie i rzeczowo. W efekcie, w trakcie kursu, przerobiliśmy też fragment "kursu podstawowego", to co było w agendzie związane z zaawansowanymi aspektami programowania w .NET (linq, lambdy, refleksja, więcej lambd, T4, wzorce projektowe, programowanie współbieżne, jeszcze więcej lambd itp. ;)), ale również tematy okołoprogramistyczne, takie jak np. rozproszone kontrole wersji (github, bitbucket), "NoSQL" (MongoDb, RavenDb), JSON, frameworki javascriptowe (Angular.JS, Node.JS). Wspomniany został nawet ServiceStack (niestety aktualnie płatny) Jeżeli doliczymy do tego ćwiczenia praktyczne z wykorzystaniem nUnit oraz Resharpera, oraz rozmowy programistyczne oraz  około programistyczne, czy w czasie kursu, czy też w czasie wspólnego posiłku to daje nam naprawdę intensywnie spędzone 3 dni..
     Wprawdzie to nie Ja płaciłem za szkolenie(firma płaciła), ale uważam, że naprawdę warto było pójść na to szkolenie. Fajnie jest przebywać w towarzystwie inteligęnych (i nierzadko mądrzejszych) ludzi od siebie i tak "na spokojnie" się czegoś nowego dowiedzieć/nauczyć. Taki miłe urozmaicenie w stosunku do samotnego przerabiania tutoriali / dokumentacji / oglądania podcastów w domu ;)

Z tego co Marcin mówił, to obok pracy na etacie, prowadzi również szkolenia ASP.MVC, programowanie reaktywne, jak i kurs podstawowy. Inna sprawa, że kurs podstawowy, czasami prowadzi też inna zupełnie inna osoba.

To tyle. Gdyby ktoś kiedyś miał okazję udać się na takie szkolenie, to szczerze polecam. Fajnie było :)

wtorek, 28 stycznia 2014

Rysowanie diagramów UML z ArgoUML

Czym jest UML wie zapewne każdy. Czy, a raczej kiedy należy go stosować zależy w dużej mierze od projektu oraz zdrowego rozsądku. Są sytuacje, gdy stworzenie kilku diagramów UML może stanowić ważny element dokumentacji projektowej, a są też sytuacje, gdy tworzenie zbyt dużej ilości może się okazać zwykłą stratą czasu.

W momencie, w którym zdecydujemy, że warto wzbogacić naszą dokumentację techniczną o diagram(y) UML warto użyć do tego odpowiedniego narzędzia, szczególnie, że niektóre z nich posiadają takie opcje, jak np. autogenerowanie części kodu źródłowego.

Przy wyborze narzędzia, ważne jest to, jakiej funkcjonalności oczekujemy od narzędzia, tj. czy chcemy rysować, modelować, eksportować wyniki do metamodeli, a może jednak najważniejsze jest generowanie fragmentów kodu z diagramu? Bardzo dobry przegląd narzędzi, ze względu na rodzaje funkcjonalności znajduje się w jednym z pytań na forum stackoverflow.com.

W moim przypadku, właśnie skończyłem pracę nad rozbudowanym architektonicznie projektem, w którym mieliśmy 4 nasze serwery, z czego 3 schowane za "firewallem" oraz 6-7 usług zewnętrznych, z którymi porozumiewały się różne serwery. Diagram wdrożeniowy pokazał istniejące zależności w sposób jasny i klarowny, pozwalając zrozumieć istniejące zależności nawet nowym osobom w projekcie.

Do narysowania diagramu użyłem darmowego programu ArgoUML dostępnego na licencji Eclipse Public License - v 1.0.

ArgoUML w porównaniu ze swoim głównym konkurentem Visio:
- jest darmowy
- jest prosty, a szata graficzna lekko spartańska
- można za jego pomocą wygenerować tylko 6 typów diagramów (klas, przypadków użycia, sekwencji, maszyny stanowej, czynności, wdrożeniowy)
- nie do końca spełnia (implementuje) wszystkie standardy języka UML
- posiada możliwość generowania kodu w językach takich jak java, c++, c#, itp.
- posiada możliwość inżynierii wstecznej plików JAR

dodatkowo, wynik naszej pracy możemy eksportować do:
- XML
- pliku graficznego

Pełny opis na http://en.wikipedia.org/wiki/ArgoUML

Mnie osobiście ArgoUML przekonało funkcjonalnością, oraz darmowością. Program, mimo iż nie jest w 100% zgodny ze standardami UML, oraz posiada nieco spartańską oprawę graficzną, to jednak, Moim zdaniem jest wystarczająco dobry do zobrazowania "clou problemu" i zwyczajnie 'robi swoją robotę'.

poniedziałek, 20 stycznia 2014

Testowanie ConfigurationManager (xUnit, FakeItEasy)

Tworząc testy jednostkowe ważne jest, aby testy działały bardzo szybko, oraz niezależnie od zewnętrznych zasobów, takich jak np. web servicedostęp do plików itp. Mówi o tym, m.in. Roy Osherove podczas swoich szkoleń, np. Understanding Test Driven Development

Jednym z takich zewnętrznych zasobów dla aplikacji internetowych, jest plik konfiguracyjny web.config. Przykładowy sposób, jak skutecznie zastosować DI oraz testy jednostkowe dla tego rozwiązania pokazuje na swoim blogu KAZI MANZUR RASHID. Niestety dla mnie, Kazi pokazuje to z wykorzystaniem "Mock", natomiast Ja, pod wpływem postów Macieja Aniserowicza jako narzędzie 'mockujące' postanowiłem wykorzystywać FakeItEasy.  Poniżej prezentuję działające rozwiązanie wykorzystujące bibliotekę FakeItEasy.

Ponieważ zmieniam tylko bibliotekę 'Mock' na "FakeItEasy' to podstawowe klasy, pozostały takie same, jak w kodzie Kazi Manur'a

    public interface IConfigurationManager
    {
        NameValueCollection AppSettings
        {
            get;
        }
        string ConnectionStrings(string name);
        T GetSection<T>(string sectionName);
    }
    public class ConfigurationManagerWrapper : IConfigurationManager
    {
        public NameValueCollection AppSettings
        {
            get
            {
                return ConfigurationManager.AppSettings;
            }
        }
        public string ConnectionStrings(string name)
        {
            return ConfigurationManager.ConnectionStrings[name].ConnectionString;
        }
        public T GetSection<T>(string sectionName)
        {
            return (T)ConfigurationManager.GetSection(sectionName);
        }
    }
Aby pokazać bardziej realistyczny przykład użycia, utworzyłem klasę BL (Business Logic), która do swojej pracy wykorzystuje dane, pobrane z web.config. Założyłem również, że plik web.config posiada wpis o nazwie customAppSetting z wartością "test".

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
public class BL
{
    private readonly IConfigurationManager configuration;
public BL()
{
        this.configuration = new ConfigurationManagerWrapper();
}
    public BL(IConfigurationManager configuration)
    {
        this.configuration = configuration;
    }
    public string GetAppSetting(string customAppSettingName)
    {
        string customAppSetting = configuration.AppSettings[customAppSettingName];
        //TODO: some business logic
        return customAppSetting;
    }
}
Praktyczne wykorzystanie klasy BL przez solucję produkcyjną:
    private void ProductionWebConfig()
    {
        BL businessLogic = new BL(new ConfigurationManagerWrapper());
        string customAppSetting = businessLogic.GetAppSetting("customAppSetting");
    }
Praktyczne wykorzystanie klasy BL przez bibliotekę testującą:
    [Fact]
    public void GetAppSetting_PositiveString_StringTest()
    {
        var customAppSetting = new NameValueCollection { { "customAppSetting", "test" } };
        IConfigurationManager fakeConfiguration = A.Fake<IConfigurationManager>();
        A.CallTo(() => fakeConfiguration.AppSettings).Returns(customAppSetting);
        BL bl = new BL(fakeConfiguration);
        string fakeString = bl.GetAppSetting("customAppSetting");
        string realString = "test";
        Assert.Equal(fakeString, realString);
    }

czwartek, 16 stycznia 2014

Data recovery from damaged HDD

Ost. czasy, całe moje dane prywatne, włączając w to zdjęcia oraz filmy, kręcone podczas różnych okazji przerzuciłem z dysku twardego na dysk zewnętrzny i... pewnego dnia przypadkowo usunąłem z tego dysku pliki startowe. Efekt? Zarówno windows, jak i ubuntu linux nie były w stanie się dobrać do tych danych :(

Ponieważ te dane były dla mnie cenne, postanowiłem spróbować je odzyskać. Po przetestowaniu kilku przeznaczonych do tego celu programów, w końcu trafiłem na cgsecurity test disk

Dzięki temu, konsolowemu programikowi, udało mi się skopiować dane z dysku zewnętrznego, na inny dysk twardy, czyli udało mi się odzyskać dane, na czym mi najbardziej zależało, a że program jest dodatkowo udostępniony za darmo na mocy Licencji GNU to polecam go dalej.

poniedziałek, 13 stycznia 2014

Simple.Data

Simple.Data, to nowy "ORM bez ORM", czyli nowy, mocno uproszczony sposób połączenia aplikacji z bazą danych. Sposób jest bardzo prosty, i pozwala na zaoszczędzenie linii kodu (im mniej tym lepiej), ale kosztem braku sprawdzania poprawności składni podczas kompilacji. Coś za coś. Dla małych, prostych aplikacji, ten ORM może być nawet sensowny, ale w dużych aplikacjach, z rozbudowanymi bazami danych, na których równocześnie pracuje wiele os. zwyczajnie się nie sprawdzi.

Dużo więcej, nt. tego ORM można przeczytać w art. na www.dobreprogramy.pl/. Tam też znajduje się mini tutorial dla tego rozwiązania (więc nie będę się powtarzał).

Rozwiązanie znajduje się na GitHub
Najłatwiej wersje "dla aplikacji" pobrać z NuGet
Dokumentacja z przykładami znajduje się: Simple.Data.Doc