Strona główna Blog Strona 13

Dlaczego nie lubię WinCC 7.2

0

Stare porzekadło, które mówi że „lepsze jest wrogiem dobrego” ma coś w sobie.

Jakiś czas temu wykonywaliśmy upgrade WinCC ze starych wersji (6.0, 5.0) do wersji 7.2. Wcześniej taki upgrade robiłem wielokrotnie z jeszcze niższych wersji (4.2) do wersji 7.0 i był on bezproblemowy – automatyczne konwertery w kolejnych wersjach bez problemu radziły sobie ze wszystkim łącznie ze zmigrowaniem archiwów.

Niestety w wersji 7.2 nie jest już tak różowo:
1. Za każdym razem po migracji do wersji pośrednich (jeśli są wymagane) należy projekt otworzyć w runtime i pozwolić zebrać przynajmniej jeden zestaw próbek (jakkolwiek durne by nie były) w przeciwnym wypadku baza się dobrze nie skonwertuje i w wersji docelowej może nie dzialać. O tyle o ile wersja 7.0 „żre” praktycznie wszystkie kompatybilne bazy od razu o tyle 7.2 nie. Niestety zapomniano o tym wspomnieć w manualach.

2. Konwersja polskich fontów w pewnych miejscach się udaje a w pewnych nie i trzeba je „rzeźbić na piechotę”

3. Jeżeli projekt jest chociaż odrobinę nietypowy, zawiera customowe obiekty, podpięte jakieś dll-ki itp. należy zapomnieć o tym, że dobrze się skonwertuje i trzeba będzie poświęcić X godzin na rozgryzienie co jest źle.

4. Kontrolki wykresów migrują się dziwnie. Podczas odświeżania wykresu i jego skalowania czasami pojawiają się dziwne zaburzenia nie mające odzwierciedlenia w danych archiwalnych.

W wersji 7.0 aż do SP3 żaden z powyższych problemów nie występował a rozwiązanie ich zajęło wymierną ilość czasu na obiekcie zwiększając koszty realizacji zadania.

Zakładam, że projekt wykonany od zera w wersji 7.2 nie będzie cierpiał na żadne z tych bolączek a wprowadzone usprawnienia ułatwią pracę – czemu jednak nikt nie przyłożył się do tego aby narzędzie do migracji przynajmniej porządnie przetestować ?

Może jak zwykle rozwiązanie pojawi się w kolejnym service packu …

Równoczesny dostęp do pliku

0

Przygotowywałem ostatnio dla klienta soft, którego zadaniem było pobieranie i wyświetlanie (z opcjami filtrowania) plików CSV generowanych przez aplikacje pilnujące produkcji.

Zadanie dość banalne, nie mniej jednak pojawił się drobny problem – nowy plik CSV tworzony jest jedynie po zmianie asortymentu na maszynie co nie zdarza się mimo wszystko tak bardzo często, a użytkownik chce mieć dostęp do wszystkich zarejestrowanych danych. Istnieje w związku z tym spore niebezpieczeństwo, że pojawi się klasyczny problem potrzeby jednoczesnego dostępu do pliku zarówno przez soft zapisujący jak i odczytujący.

Z pomocą przychodzi tutaj wykorzystanie klasy FileStream – koniecznie zarówno w aplikacji odczytującej jak i zapisującej. Możemy tutaj zdefiniować parametry blokowania otwartego przez nas pliku dla innych aplikacji próbujących tego samego.

Przykład jest w VB.net. Co prawda na codzień używam bardziej C# ale w tym projekcie są akurat takie wymagania klienta.

Dim iStream = New FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)

Strumień z przykładu sparametryzowany jest do odczytu ale zezwalając na odczyt i zapis innym. Taki strumień możemy potem np. użyć jako parametr dla StreamReader-a

Dim sr As StreamReader = New StreamReader(iStream, System.Text.Encoding.UTF8)

 

Szczegóły dostępnych opcji inicjalizacji obiektu klasy FileStream są oczywiście na MSDN
http://msdn.microsoft.com/pl-pl/library/system.io.filestream(v=vs.110).aspx

Errare humanum est …

0

Dzisiaj uruchamialiśmy u klienta aktualizację systemu, do którego aplikację pisałem jeszcze w 2008 roku. Sześć lat to jednak szmat czasu i poza dość starą technologią, której już dzisiaj w zasadzie nie używam (Delphi 2005) sam kod pozostawia niestety też wiele do życzenia, a z praktyki wiem, że refaktoryzacja bez możliwości dobrego zasymulowania warunków produkcyjnych zwykle przynosi więcej problemów na obiekcie niż zysku. Generalnie chyba nie jest źle – ponoć jak programista widzi swój kod napisany chwilę temu i nie ma do niego żadnych zastrzeżeń to oznacza, że się nie rozwija …

Jednak nie o tym chciałem. Jak się okazuje – nawet mając całkiem spore mniemanie o własnych umiejętnościach łatwo wpaść w pułapkę. Z pozoru prosta funkcja, która wyświetla odczytane z pliku dane przepisane tam wcześniej z bazy (MS SQLServer) przez inną funkcję – powodowała najpierw zerwanie połączenia  z bazą w innej funkcji (pomimo tego, że opisywana funkcja nie korzysta z tej komunikacji) a potem raportowany przez kompilator Access Violation Error z nic nie mówiącą wartością adresu w pamięci.

Ponad dwie godziny zajęło mi zdiagnozowanie problemu, którym okazało się zapisywanie tablicy poza zadeklarowany wymiar. Prawdopodobnie podczas nawykowego używania skrótów klawiszowych przełączył mi się tryb klawiatury po czym musiałem niechcący skasować kawałek kodu i zamiast zrobić Undo – poprawiłem tak jak mi się wydawało że było wcześniej, nie sprawdzając uprzednio deklaracji tablicy.

Szkolny błąd – należało by się po tym najpierw ubiczować a potem oddać fartucha, ale jak mówią „Errare humanum est” i niestety w stresowych warunkach na instalacji u klienta takie rzeczy czasem potrafią umknąć – ot proza programistycznego życia.

Mapowanie XML i bolączki VS

0

Dzisiaj pół dnia spędziłem walcząc z ustawieniem validacji dla kontrolek w wpf. Zdefiniowałem mapowanie do klasy, wskazałem na właściwą klasę i g..no – wynikiem builda za każdym razem był Error i komunikat o nie możliwości znalezienia mojego validationrule w mapowanej klasie.

W pewnym momencie z głupia skasowałem całą linijkę i wpisałem jeszcze raz, pozwalając tym razem na uzupełnienie jej z intellisense – i nagle cudownie zadziałało ! przy czym „podopowiedziany” tekst w niczym nie różnił się od wprowadzonego wcześniej ręcznie (jeszcze zanim zdefiniowałem regułę).

Damn you Visual Studio !

Captain’s Log – Hardware update :)

Zrobiłem ostatnią niewielką aktualizację „parku maszyn”. Mój HP nx7300 poza tym, że jest już nieco wysłużony i posiada fatalną kartę graficzną (zaniża mi indeks wydajności w systemie do 2,1 sic! ) posiada także jedną rewelacyjną cechę – niezwykle wygodną klawiaturę, co dla programisty nie jest bez znaczenia.

Hardware upgrade w przypadku nx-a polegał na wymianie dysku z fabrycznego Hitachi na Seagate Momentusa XT 500Gb.
Momentus XT to taka hybryda dysku SD i klasycznego – musze przyznać, że dość udana bo przyrost prędkości pracy sprzętu
jest wprost zdumiewający (no chyba, że dotychczas używany Hitachi to był totalny shit – co jest możliwe).

Nie obyło się bez problemów. Po zamontowaniu dysku i pierwszej instalacji systemu wszystko było ok aż do restartu, po restarcie
okazało się że pliki systemowe są uszkodzone. Próbowałem przywracania systemu, kolejnej instalacji, innego systemu – za każdym razem ten sam efekt.
Poziom wkur…a z każdą chwilą wzrastał a kolejne próby opanowania problemu zajęły mi praktycznie cały weekend.
Miałem się do tej pory za całkiem niezłego znawcę problemów sprzętowo-systemowych – udało mi się wiele razy rozwiązywać bardzo abstrakcyjne sytuacje ale tym razem
totalnie poległem. Objaw był tak abstrakcyjny, że aż śmieszny. Dodam jeszcze, że podczas skanowania i kontroli dysku np. SeaTools wszystko było ok.
Z pomocą przyszedł sprzedawca dysku, który wprost wskazał miejsce, w którym nie szukałem. W moim nx7300 był nieaktualny bios. Po aktualizacji wszystko śmiga rewelacyjnie.

„Stajnia” powięszkyła się także o mój pierwszy produkt z nadgryzionym jabłkiem a mianowicie MacBook-a 13”, którego kupiłem głównie po to aby móc wygodnie korzystać
z dobrodziejstw GarageBand i iMovie. Póki co jestem z niego bardzo zadowolony. Filozofia systemu jest nieco inna, niż w przypadku produktów MS, ale muszę przyznać że póki co jestem pod dużym wrażeniem szybkości jego działania i ogólnej intuicyjności. Bardzo mi się też podoba patent rozpoznawania jednego lub dwóch palców na gładziku i odpowiedniej tego interpetacji konfigurowalnej w systemie.
Póki co – zdecydowany kciuk w górę dla Apple.