Development z Zapomnianej Strony

..:: Paweł Hofman .NET Portal ::..

Visual Studio 2008 jako narzędzie developerskie dla programistów Windows (czytaj .NET i nie tylko) plasuje się na pierwszej pozycji. Jednak pod względem rozszerzania i dostosowywania plasuje się daleko w tyle za swoim największym konkurentem Eclipse. Prawdopodobnie dlatego też Microsoft zrezygnował z opłat licencyjnych, wymaganych przy pisaniu dodatków jeszcze przy pierwszej wersji Visual Studio 2008 SDK.

Dlatego też chciałem dzisiaj pokazać kilka przykładów, jak Visual Studio możemy dostosowywać do swoich potrzeb (z użyciem lub bez SDK):

  1. Korzystając z dostępnych w sieci narzędzi, zmieniamy aktualny motyw (theme) tak, aby nie raził i nie męczył wzroku. Milutki generator znajdziemy tutaj

    Visual Studio Generated Template

     

  2. Grzebiąc w rejestrach systemu możemy włączyć wskaźnik po prawej stronie tekstu tak, aby linie tekstu nie były zbyt długie. Wyróżniona 21-a kolumna zapewni nas, że pisząc tak krótkie linie, otworzymy pliki z kodem źródłowym nawet na najstarszej DOS-owej maszynie.

    Uaktualniamy rejestr systemowy dodając następujący wpis typu tekstowego (string):

    [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Text Editor]
    Guides = RGB(128,0,0) 20


    (dowolnie dobieramy kolor oraz po przecinku za liczbą 20 wpisujemy dodatkowe wartości, jeśli jeden przewodnik to za mało)
    Visual Studio - przewodnik
  3. Piszemy własny wizualizator danych.

    Wizualizatory to to, co tygrysy lubią bardzo. Bardziej lubią chyba tylko pakiety (VS Packages), ale o tym za chwilę. Idea wizualizatorów polega na tym, iż pisząc własne programy często tworzymy własne struktury danych, które łatwiej przestawiałyby się graficznie. Podczas debugowania Visual Studio udostępnia nam zatem kopię wskazanego obiektu, który możemy własnoręcznie przetworzyć i pokazać na ekranie. Poniżej znajduje się przykład wizualizatora obiektów System.__ComObject z wyszczególnieniem interfejsów i metod implementowanych przez tego CRW (Callable Runtime Wrapper).

    Visual Studio - wizualizator
    Oznaczone odpowiednimi atrybutami assembly wgrywamy do katalogu:

    %MyDocuments%\Visual Studio 2008\Visualizers

  4. Kolejnym ciekawym rozszerzeniem jest możliwość dodawania własnych słów kluczowych, które zostaną rozpoznane w edytorze tekstu dla VisualC++. Dotyczy się to przede wszystkim plików z rozszerzeniami .h, .c, .cpp, jednak bardzo dobrze sprawdza się również po przypisaniu edytora Microsoft Visual C++ do rozszerzeń takich jak .asm, .cu, czy tym podobnych (Tools->Options->Text Editor->File Extensions).

    W poniższym pliku umieszczamy nowe słowa kluczowe w kolejnych linijkach, a po ponownym uruchomieniu Visual Studio od razu zauważymy efekty:

    c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\usertype.dat

  5. Na sam koniec deser. Gdy wymienione powyżej przykłady nie spełniają naszych wymagań, to zwracamy się w stronę pisania własnych rozszerzeń z w pełni funkcjonalną logiką. Co chcielibyśmy tym uzyskać, ot np.: aby z poziomu Visual Studio uaktualniały się wpisy w narzędziach do zarządzania błędami (ticket'y w wybranym trackerze) lub po prostu potrzebujemy dokujące okienko narzędziowe, które ściąga nowinki ze świata, przekonując pracodawcę, że jednak dzielnie kodujemy. Piszemy wtedy własny dodatek add-in lub VS Package wykorzystując w pełni możliwości oferowane przez SDK.

    Należą do nich m. in.:
    - własne edytory (lub zmiana istniejących)
    - okna narzędziowe (tool windows)
    - pliki pomocy
    - nowe języki programowania (wraz ze schematami budowania nowych projektów)
    - nowe rodzaje projektów (bądź dodawanie funkcji do istniejących, tj.: .csproj)
    - szablony i kreatorzy (templates & wizards)
    - dostawców usług (dostawcy listy błędów, zadań)


    Więcej informacji o pisaniu dodatków do Visual Studio zamieściłem w Samouczku.
    Jako działający przykład posłużyć może autorski projekt TytanNET.

 

Wytrwałych odsyłam do bloga Sary Ford, która do niedawna jeszcze żywo publikowała nowinki w stylu Tips&Tricks o Visual Studio oraz była autorką kilku książek o podobnie brzmiącym tytule.

Jako książkę z tej tematyki polecam (czym prawdopodobnie zadziwię niektórych) Inside Visual Studio .NET 2003 (tak 2003!), gdyż ona najdokładniej omawia sposób pisania add-inów oraz interakcję z tego poziomu z edytorami, plikami projektu i kodem źródłowym.

 

Wesołego kodowania!



Magiczny system Mac OS X zawsze wie lepiej, co chce zrobić użyszkodnik. Aby jednak wiedział lepiej możemy go poinstruować takimi oto skrótami:

rozruch z płyty CD/DVD C
rozruch z dysku twardego D
pokazanie dostępnych źródeł do bootowania OPT
uruchom z określonego dysku SCSI ID=# CMD-OPT-SHIFT-DELETE-#
uruchom z serwera sieciowego N
   
bezwarunkowy restart CTRL-CMD-POWER
bezwarunkowe zamknięcie systemu CTRL-CMD-OPT-POWER
   
zamknięcie aktywnej aplikacji CMD+Q
przełączanie aplikacji CMD+TAB
przełączanie okienek w ramach aktywnej aplikacji CMD+~


 

Próżno szukać opcji w ustawieniach, aby pokazać wszystkie ukryte pliki i foldery. Niestety takowa nie istnieje. Aby ukazać to, czego zazwyczaj “standardowy” użytkownik nie chce oglądać należy w oknie terminala wpisać:

defaults write com.apple.finder AppleShowAllFiles TRUE
killall Finder

I po sprawie. Oczywiście, dla cofnięcia zmian TRUE wystarczy zamienić na FALSE.



Nigdy nie trzymam swoich dokumentów (czytaj folderu, który traktuję jako ‘Moje dokumenty’) w domyślnej lokalizacji proponowanej przez system. Dlaczego? Ano dlatego, że chciałbym aby:

  • nie zniknęły mi te dokumenty przy przeinstalowywaniu Windows’a (niezależnie od przyczyny; a im mniej trzeba pamiętać w takiej chwili, tym lepiej)
  • kilka kont z tego samego/różnych systemów zainstalowanych na komputerze korzystało z tej samej lokalizacji, bo do tego właśnie służy ten folder
  • partycja systemowa nie jest odpowiednim miejscem na wrzucanie tam dużej ilości drobnych plików, które dość często aktualizowane, prowadzą jedynie do niepotrzebnego zwiększenia fragmentacji
  • dużo gier w końcu nauczyło się wrzucać zapisy stanów (save’y) do ‘Moich dokumentów’ i to też jest miłe jak po przeinstalowaniu potrafią się odnaleźć.

Tak czy owak, w Windows XP wystarczyło kliknąć prawym przyciskiem na przycisku ‘Moje dokumenty’ z menu ‘Start’ i we właściwościach wpisać nową lokalizację.

LibraryProperties W Windows 7 mamy niespodziankę. Ponieważ po wykonaniu powyższych kroków zamiast właściwości omawianego folderu, dostajemy właściwości biblioteki. Tutaj możemy sobie dodawać, usuwać lub układać foldery, na bazie których system później będzie twierdził, że są to wszystkie nasze dokumenty. Nam jednak ciągle nie o to chodzi. Bo pomimo wszystkich naszych manipulacji, domyślna lokalizacja tego, gdzie programy widzą ‘Moje dokumenty’ pozostaje niezmieniona.

 

 NewLocationOfDocuments

 

 

To co tak na prawdę należy zrobić, to odnaleźć lokalizację:

C:\Users\<nazwa_konta>\My Documents

i wejść w jej właściwości. ‘<nazwa_konta>’ to aktualnie zalogowany użytkownik, dla którego dokonujemy zmiany.

Tutaj na zakładce ‘Lokalizacja’ wskazujemy nowy folder i sprawa załatwiona. Wszystko zaczyna działać tak, jak chcemy.



 

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).



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:



Przy tworzeniu własnej witryny niezbędnym może okazać się posiadanie odpowiednich zasobów wizualnych. Jeśli nie jesteśmy zawodowymi grafikami, czasem lepiej posiłkować się dostępnymi w sieci darmowymi (głównie rozpowszechnianymi na bazie licencji Creative Commons) zbiorami ikonek:

Inne katalogi: