Development z Zapomnianej Strony

..:: Paweł Hofman .NET Portal ::..
lis
29

SQL Day 2009

by Paweł | Tags: ,

SQLDay Logo28. listopada odbyła się konferencja SQLDay 2009. A ja na tej imprezie byłem i sam pomagałem w jej organizacji. Ci co nie przyszli niech tylko żałują!



Na 10.-tym spotkaniu grupy PLSSUG 23.lipca wydarzyła się rzecz niespotykana. Udało mi się przed grupą zapaleńców i administratorów baz danych (MS SQL 2005+) zaprezentować temat czysto .NET-owy. Odbiło się to nieco na końcowych ocenach, gdzie grupę administratorów zanudziłem na śmierć i uśpiłem na prawie 2h, a grupę programistów doprowadziłem do ekstazy i niemałych braw. Wystąpienie przedłużyło się prawie dwukrotnie, ale mimo to nikt nie zauważył nawałnicy, która tego dnia przetoczyła się przez Wrocław.

Jeśli jesteś miłośnikiem ułatwiania swojej pracy przy debugowaniu aplikacji, a w szczególności unikaniu go, zapraszam do lektury. Poruszyłem też trochę “ukryte” możliwości Visual Studio, wykorzystanie WinDBG na serwerach produkcyjnych oraz dokonałem pobieżnego przeglądu wewnętrznej architektury platformy .NET. O zaawansowanym debugowaniu wspominam przy serwerach symboli, debugowaniu po wyłączeniu aplikacji (post-mortem debugging) i idei crash-dumpów.

Materiały są oczywiście dostępne tutaj.

Następnym razem zapraszam na spotkanie.



 

Watch Window Debugowanie i podglądanie wartości zmiennych w oknie Watch, często byłoby dużo wygodniejsze, gdyby dane można rzutować na inne typy oraz poddawać je innym manipulacjom. Na szczęście prócz wymuszenia zmiany typów, okno to posiada wbudowany zestaw predefinowanych formatów, które mogą pobierać dane ze znanych typów wyliczeniowych (Windows Messages lub Code Errors) lub po prostu odczytywać napisy ANSI / UTF-16, bądź traktować dane jako tablice o zadanej wielkości, podając wartości wszystkich elementów. Wpisujemy je po przecinku na końcu wyrażenia, np.:

  • lpszFileName, su --> spowoduje wyświetlenie zawartości zmiennej jako tekstu UTF-16
  • dwMessage, wm  --> wyświetli zadaną liczbę jako kod Winows Message (WM_CREATE, …)
  • index, x  –-> wyświetli liczbę w trybie hexadecymalnym
  • (char *)lpszDeviceName, 10  --> wyświetli 10 pierwszych znaków napisu

Dla C++ ten zestaw formatów przedstawia się następująco:

Nazwa formatu Opis działania Przykładowe wyrażenie Wyświetlane
d, i signed decimal integer 0x1122FF, d  
u unsigned decimal integer 0x11, u  
o unsigned octal integer    
x, X hexadecimal integer    
l, h przedrostek long/short dla: d, i, u, o, x, X    
f signed floating point    
e signed scientific notation    
g signed floating point lub signed scientific notation w zależności od tego, który jest krótszy    
c single character    
s string    
su Unicode string 0x023571FA, su  
hr HRESULT 0x00000000L, hr S_OK
wc flagi Windows Class 0x00000040, wc WC_DEFAULTCHAR
wm numery komunikatów Windows Message 0x0001, wm WM_CREATE
! raw format, usuwa wszystkie informacje o typie    

 

Nazwa formatu Opis działania Przykładowe wyrażenie
ma 64 ASCII characters lpData, ma
m 16 bytes in hexadecimal, followed by 16 ASCII characters lpData, m
mb 16 bytes in hexadecimal, followed by 16 ASCII characters lpData, mb
mw 8 words lpData, mw
md 4 doublewords lpData, md
mq 2 quadwords lpData, mq
mu 2-byte characters (Unicode) lpData, mu

 

Tak samo i w programach w języku C# formaty przestawiają się:

Nazwa formatu Opis działania Przykładowe wyrażenie Wyświetlane
d decimal integer 0x64 100
h hexadecimal integer 11 0xB
nq string without quotes “Sample Text” Sample Text
private Wyświetla prywatne zmienne obiektu.    
raw Wyświetla dane własne obiektu. Poprawne tylko dla typów pośredniczących (proxy).    
Ac Wymusza wyliczanie wartości wyrażeń (przydatne gdy wyliczanie wartości i właściwości jest wyłączone).    

 

Jako ostatnie chciałem przestawić pseudo-zmienne, które pokazują charakterystyki uruchamianej aplikacji:

Pseudo-zmienna Opis działania
$handles Wyświetla liczbę zaalokowanych uchwytów (HANDLE) aplikacji.
$vframe Wyświetla adres aktualnej ramki stosu (stack frame).
$TID Wyświetla ID aktualnego wątku.
$ENV Wyświetla rozmiar środowiska przekazanego podczas uruchamiania aplikacji.

Próba edycji tej wartości wyświetli wszystkie zmienne środowiskowe w oknie Output, bez wykonania jakiejkolwiek zmiany.
$CMDLINE Wyświetla rozmiar linii poleceń, którą uruchomiono program.

Próba edycji wartości wyświetli wartość tekstową tej linii w oknie Output, bez jakiejkolwiek zmiany.
$registername
        or
@registername
Wyświetli zawartość rejestru o zadanej nazwie.
$clk Wyświetli aktualny czas w cyklach.
$user Wyświetli informacje o koncie użytkownika, z którego uruchomiono aplikację.
$exception (C#, VB.NET, F#) Wyświetli informacje o ostatnim wyjątku.

 

Więcej informacji można znaleźć w MSDN (o C++ tutaj, o C# tutaj).



Program KeePass Password Safe ma tę niefortunną dla języka polskiego uciążliwość, iż domyślnie przechwytuje on wszystkie naciśnięcia klawisza ‘Ctrl+Alt+A’ (kilku innych również) w całym systemie i wykorzystuje do swoich akcji. Powoduje to niemożność  napisania literki ‘ą’ w jakiejkolwiek aplikacji.

Na szczęście da się to zmienić poprzez: Narzędzia –> Opcje –> Zaawansowane –> tutaj przycisk Auto-Type na dole ekranu. Wybieramy mniej uciążliwy skrót i po sprawie!



Kolejny sposób jak zmarnować sobie kilka wieczorów – to próba konfiguracji trybu dual-boot w bootloaderze Windows Vista, tak aby uruchamiał on Vistę 64-bitową albo XP 32-bitowego (i może jakiś inny w przyszłości). Każdy z tych systemów jest zainstalowany na osobnym dysku twardym na pierwszej partycji. Jest ona zawsze aktywna i rozpoznawana jako dysk C:, gdy startuje system. Mam nadzieję, że jeśli przeczytasz mój dalszy wywód to również dojdziesz do przekonania, że szkoda marnować czas na próbę spięcia tych systemów razem. A rozwiązanie jest banalne. Przynajmniej na tej płycie głównej wystarczy podczas uruchamiania komputera, gdy Bios wyświetla dostępną ilość pamięci, procesor itp., wcisnąć klawisz F8. Wyskoczy po chwili przyjemne menu, z którego wybierzemy sobie bez wchodzenia do ustawień Biosu dysk, z którego wystartować maszynkę.

Niestety Windows XP wykorzystuje do uruchamiania ntldr oraz boot.ini, gdzie zdefiniowane są ewentualne odniesienia do innych systemów operacyjnych. Visty niestety nie potrafi uruchomić, niezależnie od tego, co wpiszemy do tego pliku.

Z drugiej strony bootloader Visty potrafi obsługiwać ładowanie bootloadera Windows XP poprzez tryb zgodności zdefiniowany dla elementu “{ntldr}”. Jednak w moim przypadku za każdym razem takie uruchamianie kończyło się czarnym ekranem oraz restartem komputera.



Moje usilne starania wreszcie zostały uwieńczone sukcesem. Pragnę tym samym szybko donieść, iż możliwa jest instalacja Windowsa XP Professional (SP3) 32-bit na komputerze opartym o płytę główną ASUS P5Q Deluxe z zamontowanymi dyskami twardymi oraz czytnikiem DVD wyłącznie na interfejsie SATA2. Nie oznacza to, że jest to proste :)

Podczas swojej walki z całym tym badziewiem napotkałem problemy następującej natury, zatem jeśli mierzysz się z nimi, to może ten wpis jest właśnie dla Ciebie:

  • Blue Screen Of Death 0x0000007B podczas instalacji Windowsa
  • Blue Screen Of Death 0x00000074, który również tyle mówił, co nic
  • oraz brak stacji dyskietek w komputerze, aby zainstalować sterowniki do RAID/AHCI.

Oczywiście dwa pierwsze błędy i wysypki instalatora tuż po załadowaniu kilku plików z płyty wskazywały, że jest to problem z dyskami (a dokładniej z obsługą ich kontrolera). Niestety Windows XP ma to niefortunne ograniczenie, że sam z siebie nie obsługuje dysków SATA/SATA2/RAID w ogóle i chwali się tym dumnie poprzez krytyczne ostrzeżenia. Należy mu odpowiednie sterowniki podać wciskając klawisz F6 na samym początku procesu instalacji. Asus na swojej stronie z pomocą dostarcza te pliki (łącznie 6, zajmujących w sumie około 360kB) jako archiwum o nazwie ICH10R_AHCIRAID_XPVista.zip. Teraz właśnie spotykamy finalny mur. Żadna tyczka już tu nie pomoże, a jedynie twarda głowa, bo oto właśnie pliki te trzeba podać na niczym innym jak tylko na zwykłej dyskietce (ciekawe czy ktoś jeszcze kupuje stacje dyskietek).

Ponieważ tak zaawansowanym sprzętem nie dysponuję, podszedłem do tego inaczej. Mianowicie należało w tym celu ‘oszukać’ Windowsa poprzez odpowiednie ustawienia Biosu (v02.61, 2005), które powodują, że zamiast SATA widzi on zwykłe dyski na IDE (PATA):

  • SATA configuration - [Enhanced]
  • Configure SATA as - [IDE]

Oba ustawienia są ważne, aby próba instalacji tym razem się powiodła. Wszystko będzie grzmieć i buczeć, ale jedna rzecz przecież nie daje spokoju. Dlaczego super dyski SATA2 mają chodzić w emulowanym trybie IDE. Zgodzę się, że to zupełnie nielogiczne…

Dlatego zaraz po ukończeniu instalacji zalecam dodanie do systemu następujących sterowników:

  1. Marvell 61xx, aby dodać obsługę dysku DriveXpert (opcjonalnie, bo może wydłużyć czas ładowania się systemu)
  2. Intel Matrix Storage Manager dla chipsetu P45 (doda obsługę gniazd SATA2 przez mostek północny naszej płyty głównej)
  3. oraz całą masę innych sterowników do karty muzycznej, graficznej i sieciowej…

Od tej pory można ponownie w Biosie przestawić dyski tak, aby pracowały w trybie SATA2.

Uwaga końcowa – Vista x64-bit nie ma żadnego z tych problemów i można realnie zaoszczędzić trzy wieczory, zamiast spędzać je na rozwiązywaniu nieistniejących problemów.

Również jeśli instalator XP w drugiej fazie ciągle wysypuje się z błędem BSOD 0x000000F4, to należy sprawdzić, czy dysk, na który instalujemy system jest typu ‘master’ i podłączony do głównego kontrolera. U mnie pomogło po prostu wyciągnięcie wszystkich zworek z dysku. Odsyłam również do:



Bardzo szybko okazuje się, że prosta operacja przygotowania e-maila w domyślnym kliencie pocztowym na platformie Windows urasta do rangi spędzenia całego wieczoru na przeglądaniu internetowych forów w poszukiwaniu pomocy… Mail ten był o tyle specyficzny, iż miał posiadać ustawione od razu wartości:

  • w polu osoby odbiorcy
  • w polu tytułu
  • treść
  • oraz być z załącznikiem.

Najprostsze rozwiązanie, jakie przychodzi na myśl to wykonać zwykłe otwarcie poniższego odnośnika:

mailto:receiver@mail.com?subject=Tytul&body=To jest specjalny email&attachment=/path/file.txt

Niestety, MS Outlook 2003 ma problem z dołączeniem załącznika. Ścieżka nie gra tu najmniejszej roli, opakowanie jej w apostrofy, zmiana slash na backslash itp. nie pomagają. Parametr ten jest po prostu ignorowany i jego błędne podanie może tylko spowodować pokazanie komunikatu błędu.

Inne dwa potencjalne rozwiązania to, uruchomienie pliku outlook.exe z odpowiednimi przełącznikami (dokumentacja), jednakże wymienione wartości nie mogą być podane razem. Dlaczego?.. ot takie zachowanie programu.

Ostateczne rozwiązanie wygląda zatem tak, że bez pomocy małego programu w C# i odwołania do VSTO (Visual Studio 2008 Tools for Office) się nie obejdzie. Jego utworzenie wygląda mniej, więcej tak:

  1. W ‘Add Reference…’ na zakładce COM wybieramy ‘Microsoft Outlook 11.0 Object Library


    Add reference... 
  2. Dodajemy referencję do przestrzeni nazw: 

    using Microsoft.Office.Interop.Outlook;

     

  3. Tworzymy odpowiedni obiekt e-mail i wypełniamy go danymi programistycznie. UWAGA! Aby uniknąć pytania z systemu zabezpieczeń Outlook o próbie przeglądania książki adresowej zalecam dodanie załącznika jako pierwszą operację w pozycji startowej wiadomości.
        
    _Application app = new Application();
    _MailItem messageItem = app.CreateItem(OlItemType.olMailItem) as _MailItem;

    if (messageItem != null)
    {
       Attachments attachments = messageItem.Attachments;
       string sourceFile = @"path-to-attachment-file";
       string displayName = "Hello.txt";
       attachments.Add(sourceFile, OlAttachmentType.olByValue, 1, displayName); 
       messageItem.Subject = "Hello World"; 
       messageItem.Body = "New email with attachment using VSTO - Visual C#";
       messageItem.To = "receiver@mail.com";
       messageItem.Display(false);
    }



mar
08

Instalacja serwera SVN

by Paweł | Tags:

Zachęcony ostatnio rozmową z kolegą z pracy, który w ramach zarządzania swoim domowym projektem zrobił z nim wreszcie porządek na dysku i przeniósł do systemu kontroli wersji, postanowiłem uczynić to samo. Oczywiście tylko w stosunku do projektów, których na razie nie mam zamiaru publikować i które aktualnie już nie znajdują się na codeplex.com czy code.google.com.

Nie będę w tym momencie wychwalał korzyści płynących z utrzymywania repozytorium i możliwości podglądnięcia dowolnych historycznych zmian, etykietowania, czy nawet  tworzenia wersji eksperymentalnych naszego projektu w stosunku do stosowanej obecnie (i powszechnie?) techniki pakownia całego katalogu z odpowiednią datą w tytule… Nie opowiem również, jak wzrasta samozadowolenie z własnej pracy, a tym bardziej o jej komforcie. Zachęcam natomiast do zaznajomienia się z 12-o punkowy Testem Joela opublikowanym w 2000 roku przez Joela Spolsky’ego, który poucza, na co jeszcze w swoim życiu programistycznym zwrócić uwagę.

Jednak muszę tutaj przyznać, że nie jestem i nie byłem zbytnio zafascynowany myślą instalacji IISa albo Tomcata, czy innego serwera WWW, tylko po to, aby na domowym komputerze mieć system kontroli wersji. Dlatego też opisana poniżej procedura opiera się na następujących założeniach:

  • minimalne zużycie pamięci i procesora
  • możliwość włączenia/wyłączenia tej zabawki w dowolnym momencie
  • brak dodatkowych kosztów, jeśli wymagane dodatkowe oprogramowanie (darmowe lub open-source)
  • możliwość współpracy i dostępu dla kilku osób w sieci lokalnej

 
Przed przystąpieniem do właściwego konfigurowania swojego środowiska wymagana jest instalacja dwóch programów:

  • SlikSvn – darmowa kompilacja serwera Subversion, która zawiera minimalny zbiór narzędzi i bibliotek, bez integracji z serwerem Tomcat oraz innych niepotrzebnym gadżetów; niestety jest to tylko zbiór plików i to dalsza procedura ma właśnie na celu zrobienie z nich użytku
  • TortoiseSvn – darmowy klient SVN, który umożliwi nam między innymi pobieranie i wkładanie plików do repozytorium z poziomu Explorera Windows; polski słownik i interfejs są również dostępne, co ładnie sprawdza błędy pisowni podczas dołączania komentarzy i opisów plików

 

Właściwa procedura wygląda tak:

 

  1. SvnService - new userTworzymy nowego użytkownika SvnService, w kontekście którego wykonywane będą wszystkie operacje na repozytorium. Pom oże to bardzo w samym zarządzani u dostępem do katalogów oraz innymi uprawnieniami w przyszłości.
     
    (Zarządzanie komputerem / Użytkownicy i grupy lokalne)










     
  2. SvnService - not a local user Poni eważ nie chcemy, aby ktoś na naszym komputerze zalogował się jako ten użytkownik oraz aby nie był on widoczny na stronie startowej Windowsa, usuwamy go z grupy użytkowników (lokalnych).











     
  3. SvnService - logon as serviceDodajemy jednak u prawnienia do logowania w trybie usługi, gdyż SVN będzie uruchamiany właśnie przez tego użytkownika jako lokalna usługa systemowa zaraz po włączeniu komputera.

    (Zasady zabezpieczeń lokalnych / Zasady lokalne / Przypisywanie praw użytkownika / Logowanie w trybie usługi)






     
  4. SvnService - open port [Opcjonalnie] Otwieramy port TCP/IP 3690 (domyślny dla tej usługi ) w używanym firewallu w systemie, aby umożliwić dostęp innym użytkownikom z sieci lokalnej dostęp do przyszłego repozytorium.








     
  5. Dodajemy nową usługę do systemu, która będzie odpowiedzialna za zarządzanie serwerem Subversion, uruchamiana oczywiście z poświadczeniami utworzonego wcześniej użytkownika. Tworzymy równocześnie repozytorium w z góry predefiniowanym miejscu. Wszystko to załatwia prosty skrypt napisany w starym dobrym shellu Windowsa:

    @echo off

    set svnpath=C:\Program Files\SlikSvn\bin
    set svnrepository=E:\Repositories\Local Projects
    set svnaccount=machine\SvnService
    set svnpassword=P@$$w0rd

    sc create svn binpath= "\"%svnpath%\svnserve.exe\" --listen-host 0.0.0.0 --service -r \"%svnrepository%\"" displayname= "Subversion Server" depend= Tcpip start= auto obj= %svnaccount% password= %svnpassword%

    net start svn

    "%svnpath%\svnadmin.exe" create "%svnrepository%"


    [Wymagane!] Zmieniamy parametry odnośnie użytkownika, hasła oraz lokalizacji według własnych wymagań.

    Omówienie parametrów svnserve.exe:

    • --service – od pewnego czasu SVN nie potrzebuje już żadnego zewnętrznego oprogramowania i sam potrafi włączyć się w trybie usługi, nie wymagając interakcji z aktualną sesją użytkownika
    • --listen-host - wymyszenie nasłuchiwania na wszystkich interfejsach IPv4 (szczególnie ważne, gdy spotkamy problemy z połączeniem na Windows Vista)
    • -r – definicja lokalizacji repozytorium, nawet jeśli nie jest ono jeszcze stworzone
    • inne parametry – jak chociażby port, tryb pracy bazy danych z kodem można ustawić według własnych potrzeb, tu pozostawiamy ich domyślne wartości

    Omówienie parametrów sc.exe:

    • create – utworzenie usługi w systemie (delete – usunięcie, ale wymagane jest wcześniejsze jej zatrzymanie poprzez “net stop svn”)
    • svn – nazwa usługi
    • binpath – lokalizacja uruchamianego pliku wraz z listą parametrów
    • displayname – nazwa wyświetlana wewnątrz narzędzi systemowych zarządzających usługami
    • depend – lista innych usług, od których zależy nasz serwer SVN
    • start – sposób uruchamiania usługi (auto = razem ze startem systemu)
    • obj – użytkownik, który uruchamia usługę
    • password – jego hasło

      [Uwaga!] To nie jest błąd, że wszystkie te parametry mają spację pomiędzy znakiem równości a wartościami. To jest właśnie składnia wywołania i przekazywania parametrów menadżera usług.
       
  6. Należy jeszcze tylko zlokalizować katalog z repozytorium i zmienić uprawnienia użytkowników:
    • usunąć prawa dostępu dla wszystkich użytkowników
    • nadać pełnię praw dla użytkownika SvnService
    • prawa te powinny być dziedziczne dla wszystkich elementów tego katalogu i potomnych
       
  7. Edytujemy plik z katalogu repozytorium /conf/svnserve.conf, w którym definiujemy, że:
    • anonimowi użytkownicy nie mają dostępu
    • zalogowani użytkownicy mogą zmieniać wszystkie pliki
    • listę użytkowników znajdziemy w pliku passwd w tym samym katalogu

      anon-access = none
      auth-access = write
      password-db = passwd
  8. Edytujemy plik passwd z tego samego katalogu definiując użytkowników i ich hasła, np.


    [users] 
    harry = harryssecret 
    sally = sallyssecret

  9. TortoiseSVN - repository browse...Testujemy  dostęp do repozytorium, włączając przeglądanie plików w TortoiseSVN ze ścieżką:

    svn://localhost/  lub
    svn://nazwa-maszyny/

    Wpisujemy nasze poświadczenia zdefiniowane w pliku passwd i gotowe! 







      

    TortoiseSVN - open repository URL






     
  10. Od tej porTortoiseSVN - server preview y możemy już cieszyć się opcją importowania danych do repozytorium, tworzenia nowych katalogów, przeglądania wersji i wszystkimi innymi dobrodziejstwami.
     

 









Dodatkowo – jeśli ktoś dobrnął aż tutaj i chciałby dalej pogłębiać swoją wiedzę na temat systemu Subversion, zachęcam do zapoznania się z darmową wersją książki o tym systemie kontroli wersji dostępną on-line w systemie O’Reilly Media tutaj lub off-line w katalogu, do którego zainstalowany został SlikSvn.



lut
26

xFire profil

by Paweł | Tags: ,

Mój profil xFire:



Projekt ten zajmuje mi już ponad rok czasu i ciągle zauważam jak wiele drobnych rzeczy może wpływać na wydajność oraz jakość pracy. To, czemu aktualnie poświęcam najwięcej uwagi – to automatyczne generowanie kodu w Visual Studio.

W aktualnym założeniu - kod ten powstaje w oparciu o relacje pomiędzy modułami w projekcie i nie wnosi żadnej funkcjonalności prócz “przepisania” typów (klas i struktur) z jednego API na inne (czytaj: C/C++ na C#/VB.NET, a kiedyś może i odwrotnie). Kod taki dla programisty jest raczej nużący i mało ciekawy, a sam proces bardzo podatny na błędy. W większości dają one o sobie znać dopiero podczas działania programu. Propozycją jest tutaj odpowiedni analizator, który załatwi w jednym kroku całą sprawę, przeglądając wejściową bibliotekę, odczyta z niej publiczne dane i udostępni generatorowi.

Przykład z życia: tworzymy moduł .NET, który zajmie się testowaniem middleware’u napisanego w C/C++. Wspieramy leciwy już projekt, a idąc z duchem czasu zauważamy, że testy dużo lepiej pisze się i utrzymuje w .NET – zwłaszcza mając pod ręką Microsoft Test Framework.

Wszystkie metody/funkcje i typy trzeba wówczas “ręcznie” przepisać z uwzględnieniem składni języka docelowego. Koszt ogromny i to tylko po to, aby móc te metody wywołać. Pomijamy na ten czas fakt, iż jeśli wspieramy jednocześnie wersję desktop .NET Framework 2.0+ i embedded CF .NET 2.0+, to zawsze pojawiają się małe, choć istotne różnice, o których trzeba pamiętać.

Wersję “beta” rozwiązania, które czyta eksportowane funkcje bezpośrednio z plików COFF (*.dll, *.exe) będzie można niedługo podziwiać w TytanNET v0.20.



Autor

Paweł Hofman [CodeTitans]

ASP.NET
C/C++, C#, Objective-C
SQL

License and Disclaimer

Moje Gry i Aplikacje

Zobacz mnie na GoldenLine

Zobacz mnie na LinkedIn
Supported by Polish SQL Server User Group (PLSSUG)

Supported by WrocNet.org

Zine.net.pl

Wpisy

Projekty

Moje projekty open-source:

Sign in