piątek, 29 sierpnia 2008

Hug a developer!

czwartek, 28 sierpnia 2008

Basenova

W zeszłym roku będąc na Chorwacji zachwycałem się niezwykłą śródziemnomorską florą w połączeniu z pięknem otaczających gór. Nigdy czegoś takiego nie widziałem i czułem się wyśmienicie w takim krajobrazie. Nie wiem jak jest tam w zimie ale lato mógłbym tam spędzać całe. Dziwne jest to że będąc kilka razy nad Bałtykiem przyzwyczaiłem się do myśli że teren przy morzu musi być płaski. Wracając do Chorwacji, jednocześnie ciepłe i bogate morze i pejzaż gór. Pomyślałem że szkoda że w Polsce nie ma czegoś tak uroczego. I tu się trochę zdziwiłem, co prawda nie w Polsce ale 3h drogi od Krakowa, niedaleko za granicą ze Słowacją jest położony Thermal Park Besenowa. Nic więcej nie potrzeba niż leżeć w gorących wodach (26-39C) w doborowym towarzystwie i podziwiać krajobraz Tatr. Jeszcze lepsze widoki można znaleźć kilka kilometrów od Besenovej na plaży nad Liptovskim Marem-tylko temp wody już zbliżona do Bałtyku:) Poza tym baseny są otwarte cały rok i nie mogę się doczekać aby wyskoczyć tam nawet na jeden dzień w zimie na narty a później na te gorące źródła:)

TreeView i checkbox

Ostatnio implementowalem obsluge drzewa z checkboxami. Defultowo jest taka kontrolka we Frameworku 2.0 zwana TreeView w której jeden z propertiesów nazywa się CheckBox. Niby wszystko fajnie ale co w przypadku gdy chcemy mieć funkcjonalność którą często można spotkać w różnych instalatorach, chodzi mi o noda checkboxem który robi się szary jeśli jeden z jego dzieci zostanie zaznaczony ale nie wszystkie:)






















No więc okazuje się że Checkboź zaimplementowany w TreeView wcale nie jest checkBoxem jaki znamy - a dostęp do niego jest mocno ograniczony. Dokładnie jest to rysunek a nie kontrolka którą dla każdego noda przechowuje TreeView. Żeby sobie z tym poradzić należy przedziedziczyć TreeView i odpowiednio zmodyfikować: do imagelisty TreeView zapakować trzy bitmapy z zaznaczonym checkboxem, czystym i szarym zaznaczonym. Trzeba jeszcze przechwycic eventy klikniecia myszką i odpowiednio zmodyfikować eventy TreeView. Do wad tego rozwiązania należy zaliczyć że ImageListe mamy już zajętą i nie dodamy nowych icon obok nodów.

Implementacji tego podejścia jest kilka na codeprojectcie:

sobota, 16 sierpnia 2008

konkurencja

Czy interesujesz się produktem który sprzedaje Twoja firma? Czy interesujesz się rynkiem w którym Twoja firma działa? Czy z ciekawości przeglądasz i interesujesz się wynikami Twojej spółki i przyszłością rynku na którym działa? Czy wiesz dokładnie na jakim poziomie i co teraz robi konkurencja? Czy znasz produkty konkurencji?

Na te pytania warto znać odpowiedź dzisiaj - nie tylko podczas rozmowy kwalifikacyjnej do której "przygotowując się" developerzy lubią olewać takie informacje.
Firma w której obecnie pracuje oferuje rozwiązanie do wyszukiwania informacji w sieciach korporacyjnych. Brzmi to ładnie ale co za tym idzie? Jest to program (iBox), w skład którego wchodzi kilka modułów do przeszukiwania repozytoriów dokumentów np:
  • NTFS,
  • Sharepointa 2003/2007,
  • Exchange,
  • Active Directory
  • inne: Documentum, Interwoven, bazy zgodne z ODBC,
Repozytoria są przeszukiwane pod względem wyodrębnienia jak największej ilości informacji i przechowywane w specjalnej bazie danych - indexie. Sama informacja nie przedstawia w sobie żadnej wartości o ile jej nie przypiszemy. W języku iBoxa mówimy że dokument został otagowany termem. Term pochodzi z modelu który jest budowany jako szkielet przed wdrożeniem całego rozwiązania. Termem może być dowolna nazwa np. nazwa firmy, imię i nazwisko pracownika, lub nazwa kodowa jogurtu. Później klient może modyfikować model zgodnie z własnymi potrzebami, jeśli np struktura jego firmy się zmieni.

Jednym z konkurentów Interse jest Google i Microsoft (niby konkurencja ale Microsoft Gold Partner jest:). Co do ważniejszego googla to ich rozwiązanie jest zrobione z innej beczki. Do klienta dostarczają metalową puszkę(serwer della) którą klient ma wpiąć w sieć i włączyć a następnie zacząć samemu konfigurować. GSA potrafi zaindeksować do 10 milionów dokumentów i obsługuje większość repozytoriów dokumentów-większą niż iBox. To co wyróżnia GSA w stosunku do iBoxa to wsparcie dla wielojęzyczności. iBox w tym przypadku wspiera wyłącznie angielski, ale nie ma większych przeszkód technicznych żeby taki support wystąpił.

Czy takie informacje pomagają mi w codziennej pracy - oczywiście nie - ale pomagają mi lepiej wstać:)

wtorek, 12 sierpnia 2008

Interejs vs klasa abstrakcyjna

Co jest lepsze? Ostatnio kolega z pracy chce namówić całą resztę do przyjęcia "jedynego słusznego rozwiązania" ;) Nie mam zamiaru się rozwodzić nad podejściem kolegi ani jego zamiarami, argumentami że jedno rozwiązanie (interejs) nie ma kodu i jest puste a do klasy abstrakcyjnej zawsze coś można dodać i innymi argumentami za lub przeciw jednemu lub drugiemu np:
  • architektura rozwiązania obiektowego-diagramy klas,
  • ograniczenia C# - dziedziczenie jednej klasy,
  • ograniczenia biednych skrótów w Visual Studio(to też padło a jakże by inaczej:P - Go to Definition/Declaration)
  • i wiele innych mniej lub bardziej słusznych (bezsensownych)...
Sam problem zaczyna mi przypominać o to który sposób (jedyny słuszny) iterowania wybrać(while do, do while, for, foreach)? Czy warto na to tracić czas? Czy może lepiej wyłapać takie kwiatki(że można niepotrzebny kod wyciąć) podczas code rewiev? Abstrachując od tego że kolega jest dość intelignetny, skromny i stara się każdą swoją linijkę idealnie wpasować w kod.

Zastanawiałem się nad tym na własnym przykładzie i myśle że czasami jestem jak kowal który codziennie hartuje młotki, miecze, podkowy, ...etc i sposób w jaki to robi po prostu wychodzi z niego naturalnie - widzi przed sobą idealnie zrobiony miecz a nie to ile razy w niego będzie walił lub jakiego dokładnie młotka użyje (przy waleniu:P)? Będzie walił tyle razy i takimi narzędziami jakimi uzna za stosowne aby osiągnąć idealny miecz i ani raza więcej.

P.S. W poprzedniej firmie przyszedł do nas praktykant z jednej z dużych krakowskich firm, odszedł z tej firmy bo, miał dość podejścia w którym na spotkaniach poświeconych designie architektury przyszłej aplikacji przez wiele godzin strony nie mogły dojść do konsensusu czy używać klas abstrakcyjnych czy interfejsów w UMLu.

IDisposable i reszta

Ostatnio potrzebowałem zastopować wątki które świadczą "jakieś tam usługi" przy zamknięciu programu. Zastanawiałem się gdzie to najlepiej zrobić i wszelkie moje wątpliwości rozwiał artykuł: IDisposable, Finalizers, Destructors, and the Garbage Man.

piątek, 8 sierpnia 2008

bug w getfiles?

Ostatnio chcialem wydobyc pliki z folderu o określonym rozszerzeniu. W takim przypadku należy skorzystać ze statycznej metody GetFiles z klasy Directory lub DirectoryInfo. Metoda w 2 przeciążonych wywołaniach przyjmuje string oznaczony jako searchPattern. Atrybut ten niestety nie może przyjąć więcej jak jedno rozszerzenie. Co więc zrobić jeśli chcemy poszukać kilku typów plików?

Jedna z metod jest taka żeby GetFiles wykonać na każdym rozszerzeniu i dołączać kolejne wyniki czyli:

ArrayList files = new ArrayList();

foreach (string ext in m_ScanExtensionsList)
{
string[] temp = Directory.GetFiles(path, ext);
if (temp.Length > 0)
{
files.AddRange(temp);
}
}

Niby do zaakceptowania ale:
  • trzeba pamiętać żeby ext bylo w formacie "*.doc"
  • GetFiles zachowuje się dobrze do momentu jeśli poszukwane rozszerzenie ma mniej lub więcej niż 3 znaki. Jeśli będziemy szukać "*.doc" to GetFiles zwroci takze docx, doct, etc. Jeśli będziemy szukać "*.docx" to GetFiles zwróci tylko docx. Czyli w przypadku 3 literowych rozszerzen GetFiles traktuje to tak jakby występowala na koncu * (znak zastepujacy dowolna ilosc znakow). Jest to podobno związane z historycznym 8.3 z DOSa.
Co więcej dokładnie tak zachowuje się koneda systemowa:

C:\Documents and Settings\mak>dir c:\*.xls
Volume in drive C has no label.
Volume Serial Number is 6856-6816

Directory of c:\

06/06/2008 05:52 PM 82,491 20080606 Feature3.xlsx
06/05/2008 10:29 AM 34,915 20080605 Work breakdown v0.05.xlsx
05/29/2008 11:56 AM 16,523 MAK_Plan.xlsx
06/05/2008 03:57 PM 98,816 WeekPlan v0 3.xls
4 File(s) 232,745 bytes
0 Dir(s) 1,040,863,232 bytes free

C:\Documents and Settings\mak>

Druga metoda zeby wyciagnąc wiecej niż jedno rozszerzenie:

DirectoryInfo directory = new DirectoryInfo(path);

ArrayList files = new ArrayList();

foreach (FileInfo file in directory.GetFiles())
{
string ext = file.Extension.ToUpper();
if (m_ScanExtensionsList.Contains(ext))
files.Add(file.FullName);

}

Pytamy więc o wszystkie pliki a później filtrujemy wyniki.