08/01/2014

Czy zadajesz pytania?

Home

Czy próbowaliście kiedy rozwiązać następujące zadanie?

Napisz program, który wypisze na ekran konsoli swój własny kod. Możesz pominąć białe znaki.

(01-09-2014) Dodatkowe wymaganie:
Kod programu nie powinien być wczytany z pliku, bazy danych lub innego nośnika.

Zachęcam do sprawdzenia swoich sił. Zadanie to wysłałem również swoim kolegom z pracy. Wcześniej rozwiązałem je samemu i w gruncie rzeczy spodziewałem się podobnych do mojego rozwiązań. Zostałem jednak zaskoczony, bo okazało się, że inni podeszli do tego problemu troszkę inaczej, uzyskując ten sam wynik co ja, a nawet lepszy, bo w prostszy sposób. Sytuacja ta przypomniała mi kilka innych, w których zadanie prostego pytania:

Co o tym myślisz? Jak byś zabrał się do tego zadania?

Pomogło mi rozwiązać problem szybciej, lepiej, sprawniej... W pracy programisty niezwykle ważne jest konfrontowanie swoich pomysłów z rozwiązaniami innych. Wydaje Ci się, że wszystko zrobiłeś dobrze? A może ślęczysz nad jakimś problem już bardzo długo i cały czas nie możesz znaleźć zadowalającego rozwiązania?

Zawsze warto zapytać kolegi\koleżanki siedzącej obok o zdanie. To nie kosztuje dużo, a bardzo się opłaca. Nie ma głupich pytań chyba, że jak to powiedział mi kiedyś kumpel chcesz zapytać czy jak staniesz na torach i chwycisz się trakcji to pojedziesz jak tramwaj :)

05/01/2014

Jeszcze więcej szczegółów na temat IntelliTrace

Home

O IntelliTrace pisałem już wielokrotnie. Do tej pory nie wyjaśniłem jednak, że chociaż IntelliTrace nazywamy debugger'em historycznym to w rzeczywistości IntelliTrace jest profilerem. Dokładniej mówiąc jednym z komponentów składowych IntellITrace jest niezarządzana implementacja interfejsu ICorProfiler. Profiler ten komunikuje się z zarządzaną częścią IntelliTrace, czyli z programem IntellITrace.exe. IntellITrace.exe jest natomiast używane przez Visual Studio.

Ma to ciekawe skutki. Oznacza bowiem, że oprócz nagrywania działania aplikacji z poziomu Visual Studio albo bezpośrednio przy pomocy programu IntelliTrace.exe (jak to opisałem tutaj) dochodzi jeszcze jedna opcja. Otóż możemy skorzystać ze zmiennych środowiskowych COR_ENABLE_PROFILING oraz COR_PROFILER i monitorować przy pomocy IntelliTrace zarządzaną usługę systemową.

W tym celu znajdujemy w rejestrze klucz:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<Nazwa_Usługi>

Dodajemy do niego nową wartość Environment o typie REG_MULTI_SZ i zawartości:
COR_PROFILER={b19f184a-cc62-4137-9a6f-af0f91730165}
COR_ENABLE_PROFILING=1
VSLOGGER_CPLAN=COLLECTION_PLAN_PATH
W pierwszeh linijce wskazujemy profiller, jaki ma zostać użyty do monitorowania usługi. W tym przypadku będzie to IntelliTrace dla VS 2012. Identyfikator profiler'a IntelliTrace dla VS 2010 jest inny tj. 301EC75B-AD5A-459C-A4C4-911C878FA196. Oczywiście, jeśli nie mamy zainstalowanej danej wersji Visual Studio, to profiler nie będzie zarejestrowany w systemie.

W drugiej linijce po prostu włączamy profilowanie, a w trzeciej wskazujemy ścieżkę to pliku XML z konfiguracją IntelliTrace. O tym, skąd wziąć ten plik, pisałem we wspomnianym już artykule oraz w innych postach z serii o IntelliTrace. Tutaj zaznaczę tylko, że należy w nim ustawić nazwę pliku z logiem oraz katalog roboczy np.:
<CollectionPlan xmlns="urn:schemas-microsoft-com:visualstudio:tracelog">
  <StartupInfo>
    <LogFileName>log.itrace</LogFileName>
    <LogFileDirectory>c:\Logs</LogFileDirectory>
    <MaximumLogFileSize>-1</MaximumLogFileSize>
  </StartupInfo>
  ...
</CollectionPlan>
Na koniec po prostu uruchamiamy naszą usługę, a kiedy wykona swoje zadanie zatrzymujemy i przeglądamy nagrany log na przykład w Visual Studio.

Niestety, ale to podejście nie zadziała dla zwykłych aplikacji uruchamianych z dwukliku. Sądzę, że w takich wypadkach IntelliTrace nie obsługuje zmiennej środowiskowej VSLOGGER_CPLAN, ale tego akurat nie jestem pewny. Istnieje jednak inna możliwość. W praktyce używana jest rzadko, gdyż jest mało wygodna, ale pokazuje jak IntelliTrace działa od środka. A więc uruchamiamy wiersz polecenia i wpisujemy następujące komendy:
rem Uruchamiamy instancję IntelliTrace o nazwie 'test' ale nie wskazujemy programu do monitorowania
%INTELLI_TRACE_PATH%\IntelliTrace.exe start /n:test /f:"D:\WorkingDir\IntelliTrace\IntelliTraceWorkingDir\Test.iTrace" /cp:%COLLECTION_PLAN%

rem Włączamy profilowanie
set COR_ENABLE_PROFILING=1

rem Ustawiamy profiler, który chcemy użyć do monitorowania naszego programu tj. IntelliTrace
set COR_PROFILER={b19f184a-cc62-4137-9a6f-af0f91730165}

rem Ustawiamy nazwę instancji IntelliTrace z jakiej chcemy skorzystać
set VSLOGGERNAME=test

rem Uruchamiamy program, który chcemy monitorować przy pomocy instancji IntelliTrace o nazwie 'test'
MyProgram.exe

rem Zamykamy instancję IntelliTrace o nazwie 'test'
%INTELLI_TRACE_PATH%\IntelliTrace.exe stop /n:test /cp:%COLLECTION_PLAN%
Podejście to różni się od standardowego tym, że tutaj instancja IntelliTrace czeka na uruchomienie programu, zamiast uruchomić go samemu.

23/12/2013

Życzenia świąteczne

Home



Święta Bożego Narodzenia już za progiem i wielu z Was zapewne jest już na zasłużonym urlopie. Zanim i ja się "wyłączę", chcę Wam życzyć wszystkiego dobrego, chwili wytchnienia i wypoczynku w gronie bliskich Wam osób oraz żeby te Święta były jeszcze lepsze niż przed rokiem. Na Nowy Rok życzę natomiast suckesów, ciekawych wyzwań oraz, po części również sobie, wielu ciekawych treści na blogu.

Michał Komorowski

Problem z Resharper 7.1 i VS 2012 Update 4

Home

Od czasu sławetnej promocji JetBrains jestem szczęśliwym posiadaczem Resharper'a 7.1 Nie będę pisał, że to bardzo dobre narzędzie bo o tym chyba już każdy wie. Niestety jakiś czas temu przestała mi działać opcja Run Unit Tests w Visual Studio 2012 tj. po jej wybraniu testy nie były poprostu uruchamiane. Problem zbiegł się z instalacją Visual Studio Update 4, a więc miałem podejrzenie, że w tym tkwi problem. Ostatnio natknąłem się na ten wątek i okazało się, że miałem rację. Szczęśliwie zainstalowanie najnowszej wersji Resharper'a 7.1 rozwiązało problem.

10/12/2013

"Sztuczka" dla pracujących z danymi hierarchicznymi

Home

Pracuję przy projekcie, którego ważnym elementem jest obsługa tzw. profili inwestycyjnych np.:

Fundusz A inwestuje 10% w Fundusz B i 30% w Fundusz C, a Fundusz C 100% w Fundusz D, który...

Pisząc zapytanie wyciągające takie hierarchiczne chcę szybko podejrzeć wynik w formie graficznej. W końcu jeden obraz wart więcej niż tysiąc rekordów zwróconych przez zapytanie. Kolega (dziękuję Łukasz) polecił mi stronkę GraphViz Workspace, która na życzenie generuje grafy/drzewa na podstawie opisu zgodnego z formatem obsługiwanym oczywiście przez Graphviz.

Ok, ale jak to wykorzystać aby łatwo i szybko wizualizować wynik zapytania? Oto prosty przykład. Zacznijmy od utworzenia tabeli z danymi hierarchicznymi.
CREATE TABLE dbo.Hierarchy
(
 Parent INT,
 Child INT
);

INSERT INTO dbo.Hierarchy(Parent, Child)
VALUES (1,2), (1,3), (1,4), (2,5), (2,6), (4,5), (5,7), (7,8), (6,8);
Następnie wyciągniemy z niej dane, bazując na tym, że w formacie GraphViz węzeł rodzic i węzeł dziecko połączone są strzalką ->:
SELECT CAST(Parent AS VARCHAR) + '->' + CAST(Child AS VARCHAR)
FROM dbo.Hierarchy
Wynik zapytanie wystarczy skopiować i umieścić na stronie GraphViz Workspace:

digraph g{TUTAJ}

Aby otrzymać taki wynik:



Prosto, łatwo i przyjemnie.