Nowsze wrogiem dobrego..

28 sierpień 2010, Michał Szymański

Przeczytałem artykuł Enterprise OSGi i po raz kolejny naszła mnie pewna refleksja. Lubię Jave z też powodu używamy jej w wielu projektach w naszej firmie jednak mam wrażenie, że świat Javy ma tendencje do komplikowania spraw. Z tego co wiem OSGi wymaga trochę czasu żeby się tego nauczyć i jeśli rozwiązanie jest przełomowe ponieważ rozwiązuje problem wprowadzony przez niedopracowaną koncepcje manifestów to według mnie to jest coś nie tak (oczywiście dość mocno upraszam przełomowość OSGi ale robię to celowo). To raczej ciało standaryzacji powinno zastanowić się co z tym tematem robić i to język ‘jakoś’ powinien to rozwiązać.  Koncepcje nie można nazywać ‘przełomową’ tylko z tego powodu, że  rozwiązuje sztuczne problemy wprowadzone przez język.

Drugie wrażenie jest takie, że producenci systemów wspomagających tworzenie oprogramowania dla Javy skupiają się na pogoni za implementacją nowych standardów kosztem stabilności wytworzonych rozwiązań. W przypadku np. baz danych naprawdę ciężko znaleźć błędy w wersjach stabilnych mogę podać tu przykład Postgresa z którego korzystamy 4 lata i jak na razie znaleźliśmy może jeden mały błąd. Natomiast w przypadku produktu JBoss (to jest tylko przykład) już na etapie testów rozwiązania znajdowaliśmy różnego rodzaju ‘niedopracowania’.

Trzecie wrażenie jest takie,że Javowcy mają tendencje do przekomplikowania rozwiązań, argumentem takich rozwiązań jest to że owszem jest to skomplikowane ale później będzie łatwe w utrzymaniu z tym że za 2-3lata okazuje się, że zastosowane rozwiązania są już ‘nie trendy’ i lepiej stosować coś nowszego = przepisujemy na nowe technologie.

Może trochę przesadzam w swoich opiniach jednak według mnie środowisko Javy powinno zastanowić się nad wspomnianymi przeze mnie rzeczami,może rezultaty ‘zadumy’ w jakim kierunku zmierza świat Javy poprawiłoby zdanie o tym języku  wielu zatwardziałych przeciwników.

Jak zwiększyć efektywność pracy

19 czerwiec 2010, admin

Po wielu latach bezowocnych prób z różnymi metodykami wytwarzania oprogramowania obiecujących  zwiększenie  efektywności pracy programistów wydaje, się w końcu znalazłem coś  co wyprowadzi każdy projekt informatyczny z problemów związanych z ograniczonymi możliwościami człowieka.   Razor Venom bo o tym rewolucyjnym produkcie mowa może nie jest tani jednak reklama przekonała mnie, że naprawdę warto zainwestować paręset dolarów. Zresztą zobaczcie  sami o czym mówię - RAZOR VENOM.

Konferencja ICIT’2010

18 czerwiec 2010, Maciej Krajewski

W dniach 28-30 czerwca na Politechnice Gdańskiej odbędzie się II międzynarodowa konferencja odnośnie technologii informacyjnej ICIT’2010 wraz z VIII Krajową Konferencją Technologie Informacyjne IT’2010. W ramach konferencji, razem z kolegami z DATERY Sebastianem Zaprzalskim, Michał Pietrasiakiem oraz Krzysztofem Raszkowskim  przedstawimy trzy prezentację dotyczące tematyki VoIP:

  • BADANIE WYDAJNOŚCI ROZPROSZONEGO SYSTEMU TELEKOMUNIKACYJNEGO VoIP” - Sylwester Kaczmarek, Sebastian Zaprzalski
  • AUTORSKA IMPLEMENTACJA SYSTEMU WYMIANY NUMERACJI TELEFONICZNEJ POMIĘDZY OPERATORAMI VoIP” - Krzysztof Nowicki, Michał Pietrasiuk, Krzysztof Raszkowski
  • QUALITY MEASURE OF VOIP SERVICES IN CARRIER GRADE SYSTEMS” - Sylwester Kaczmarek, Maciej Krajewski

Prezentacja Sebastiana dotyczy testów wydajności systemu, zadanie polegało na sprawdzeniu wydajności i skalowalności rozproszonego systemu telekomunikacyjnego oraz sprawdzeniu czy zależność między ilością węzłów, a wydajnością, jest liniowa, czy też nie.
Michał z Krzysztofem przedstawią analizę dostępnych systemów wymiany numeracji E.164 pomiędzy operatorami  oraz nową koncepcję, która rozwiązuje problem wymiany numeracji w sposób różniący się od istniejących rozwiązań, ukazując inne podejście do problemu wymiany numeracji.
Moja prezentacja dotyczy pasywnego pomiaru jakości usług VoIP, opierającego się na analizie pakietów RTCP. Metoda ta pozwala na gromadzenie danych statystycznych jakości połączeń przy niskim wykorzystaniu zasobów systemu. Zgromadzone w ten sposób dane są podstawiane do modelu E, co pozwala na estymację oceny MOS każdego połączenia.

Szczegóły konferencji znajdują się na stronie http://www.it2010.gda.pl

PgCon 2010 - część 4

09 czerwiec 2010, Michał Szymański

Server Health Check - wykład  a właściwie szkolenie prowadzone przez najbardziej rozpoznawalnego konsultanta od Postgres’a - Josh Bergus’a. W ciągu trzech godzin Josh omówił kroki mające na celu zdiagnozowanie na ile instalacja Postgres’a jest ‘zdrowy’, czyli jak daleko jesteśmy od (jak to zostało nazwane) ‘ściany’. Gdzie ‘ściana’ to moment w czasie, w którym zaczną się lawinowo pojawiać problemy z wydajnością. Z ciekawych dla nas tematów została poruszona kwestia używania dysków SSD w instalacjach bazodanowych. Według autora prezentacji jeden dysk SSD może zastąpić nawet cztery tradycyjne dyski. Jednak w dalszym ciągu należy zachować ostrożność w stosowaniu tej technologii, ze względu na dość dużą awaryjność dysków SSD i duży rozrzut wydajności nawet w obrębie jednego producenta (a nawet jednego modelu).

Postgres-XC, Write-scalable, synchronous multi-master PostgreSQL cluster with shared nothing approach na tej prezentacji można było zapoznać się z pierwszymi wynikami testów Postgres’a w wersji klastrowej. Pierwsze pomiary wypadły naprawdę obiecująco. W odróżnieniu od MySQL Cluster wszystkie dane przechowywane są na dyskach. Zastosowano dwie metody rozpraszania danych na tzw. węzłach danych ang.data node (czyli serwerach gdzie przechowywane są dane), pierwsza metoda to duplikacja tabeli na kilkanaście węzłów, druga o rozpraszanie wierszy z tabeli między grupą węzłów (metoda rozpraszania wybierana jest w konfiguracji). W prezentowanym rozwiązaniu zagwarantowano pełną transakcyjność operacji bazodanowych co jest niewątpliwą zaletą w porównaniu z istniejącymi rozwiązaniami wspierającymi rozpraszanie danych dla Postgresa. Niestety PostgresXC jest na wczesnym etapie rozwoju i moim zdaniem wersja, którą można będzie wdrożyć produkcyjnie pojawi się za 1-3 lata.

Bardzo ciekawymi prezentacjami moim zdaniem były prezentacje z kategorii ’studium przypadku’. Jedną z takich prezentacji była historia udanego wdrożenia Postgresa w jednym z największych banków Brazylii Caixa Economica Federal. Postgres został zastosowany między innymi w systemie monitorowania 22tyś. bankomatów. Swoją drogą do dzisiaj nie mogę wyjść z podziwu dla otwartości instytucji państwowej w Brazylii na open-source’owe rozwiązania. W przypadku Caixa argumentem, który przeważył o zastosowaniu Postgres’a był argument finansowy - brak opłat licencyjnych za Postgresa.

Podobną prezentacje miał Jim Nasby z Enova Financial. Enovo używa Postgresa w głównym systemie obsługi klienta, aktualna wielkość ich bazy to 1.4TB, szczytowe obciążenie bazy to około 4000TPS i wielkość danych używanych w codziennej pracy to około 200GB. Jest to chyba jedna z większych (patrząc na wielkość bazy) baz Postgres’owych dla systemu OLTP. Prezentacje w formie slajdów można pobrać z TEGO miejsca.

Tematy proste ale czasami skomplikowane - transakcje

03 czerwiec 2010, Michał Szymański

Tematyką wytwarzaniem oprogramowaniem zajmuje się już ponad dziesięć lat i z moich obserwacji wynika, że są pewne tematy o których programiści/projektanci/architekci wiedzą, że są jednak ich wiedza na ten temat jest mocno wyrywkowa albo po prostu oparta na pewnych mitach. Pierwszy taki temat o którym chciałbym napisać to używanie transakcji w systemach informatycznych, tak się składa że ostatnio też  musiałem powrócić do tej tematyki w związku ze zmianami architektury naszego systemu.
Może na początek podam definicje transakcji, cytując za Wikipedią:

Transakcja - zbiór operacji na bazie danych, które stanowią w istocie pewną całość i jako takie powinny być wykonane wszystkie lub żadna z nich. Warunki jakie powinny spełniać transakcje bardziej szczegółowo opisują zasady ACID (Atomicity, Consistency, Isolation, Durability - Atomowość, Spójność, Izolacja, Trwałość).

Żeby operacja była transakcyjną musi spełniać zasady ACID i może warto ten skrót bardziej rozwinąć:

  • Atomowość transakcji - właściwość gwarantująca niepodzielność kroków w wykonywanej operacji. Czyli albo wszystkie kroki operacji zostają wykonane albo żaden z nich. Przykładem ilustrującym tą właściwość mogą być dwa kroki realizowane w trakcie transferu środków w systemie bankowym między dwoma kontami. Przy takiej operacji najpierw odejmujemy kwotę z jednego konta a później dodajemy tą kwotę do drugiego konta. Atomowość gwarantuje, że wykonana zostaną dwa kroki albo żaden z nich.
  • Spójność transakcji - gwarantuje, że po operacji system będzie spójny, inaczej mówiąc nie zostaną naruszone zasady integralności systemu. Najprostszym przykładem może być wstawienie wiersza w tabeli z obywatelami Polski gdzie kluczem unikalnym (czyli gwarantującym unikalność) jest zasada mówiąca, że każdy obywatel Polski ma unikalny PESEL (co w praktyce nie jest do końca prawdą bo zdarzały się przypadki, że ten numer nie jest unikalny co sugeruje, że w systemie pojawił się problem z transakcjami:) ).
  • Izolacyjność transakcji - gwarantuje, że dwie współbieżne operacje nie widzą efektów swojego działania do czasu zatwierdzenia transakcji (czyli operacji COMMIT). Ze względu na to, że gwarantując całkowitą izolacyjność transakcji tracimy na możliwości wykonywania równoległych operacji na danych w większości systemów możemy ustawiać tzw. poziom izolacji. O poziomie izolacji napiszę w dalszej część artykułu bo jest to jeden z tematów, który jest słabo znany przez programistów.
  • Trwałość - oznacza, że system potrafi udostępnić spójne i nienaruszone dane zapisane w ramach zatwierdzonych transakcji po awarii spowodowanej np. zanikiem napięcia.

Przy omawianiu ACID wspomniałem o czymś takim jak poziom izolacji, z moich obserwacji programiści często błędnie zakładają, że jak już wykonują operacje w transakcji nic złego nie może się zdarzyć. Niestety zwykle poziom izolacji jest tak ustawiony, że przy niektórych scenariuszach mogą się pojawić ‘ciekawe przypadki’. Wymagana jest świadomość jakie ‘złe rzeczy’ mogą się wydarzyć na określonych poziomach. Dlatego zacznę od listy ‘złych rzeczy’, które mogą się pojawić przy operacjach objętych transakcją:

  • dirty read - transakcja może przeczytać dane zapisane przez inną niezakończoną transakcje
  • nonrepeatable read - w transakcji ponownie odczytujemy dane, które wcześniej były odczytane w tej samej transakcji i okazuje się, że dane uległy modyfikacji w wyniku innej zakończonej transakcji (czyli były zmodyfikowane między kolejnymi odczytami)
  • phantom read - ponowne wykonanie zapytanie z tymi samymi warunkami wyszukiwania zwraca inny zbiór wierszy - inna zakończona transakcja dodała nowe wiersze.

Korzystając z określonego poziomu izolacji unikamy albo jesteśmy narażeni na wymienione problemy. Tabelka poniżej prezentuje na co jesteśmy narażeni w przypadku określonego poziomu izolacji:

Poziom izolacji Dirty Read Nonrepeatable Read Phantom Read
Read uncommitted Możliwe Możliwe Możliwe
Read committed Niemożliwe Możliwe Możliwe
Repeatable read Niemożliwe Niemożliwe Możliwe
Serializable Niemożliwe Niemożliwe Niemożliwe

Należy zaznaczyć, że nie wszystkie systemy wspierają wszystkie poziomy izolacji i trzeba mieć tego świadomość w trakcie pisania oprogramowania. Przykładowo Postgres wspiera tylko dwa poziomy - serializable i read committed chociaż teoretycznie dostępne są wszystkie.

Mogłoby się wydawać po dotychczasowej lekturze, że najlepiej dla tworzącego oprogramowania byłoby używać poziomu serializable, wtedy unikniemy wszystkich problemów i to jest ‘prawie’ prawdą. Prawie ponieważ problemów z transakcyjnością unikniemy ale niechybnie pojawią się problemy z wydajnością. Przy poziomie serializable wszystkie operacje wykonywane są szeregowo, w epoce gdzie producenci serwerów prześcigają się w ilości rdzeni takie ograniczenie jest nie do zaakceptowania bo większość operacji na serwerach z założenia wykonywanych jest równolegle.

Jeśli już uporządkowaliśmy wiedzę odnośnie transakcji na koniec warto wspomnieć jakie są możliwości zarządzania transakcjami w programach. Wyróżnia się trzy modele zarządzania transakcjami:

Local Transaction Model – w tym przypadku programista zarządza połączeniami do źródeł danych np. baz danych przez JDBC i wywołuje operacje zatwierdzenia (COMMIT) albo wycofania (ROLLBACK) transakcji na konkretnym połączeniu, właściwie programista zarządza połączeniami niż transakcjami. Model ten jest dobrze znany programistą którzy używają JDBC w Javie gdzie otwieramy połączenie do bazy i na tym połączeniu wywołujemy metody commit() i rollback(). Poniżej przykład stosowania transakcji przy operacjach na bazie z użyciem JDBC

……….
Connection conn = ds.getConnection();
conn.setAuoCommit(false);
try {
OPERACJA NA BAZIE
con.commit();
} catch (Exception e) {
conn.rollback();
throw e;
} finally {
stmt.close();
conn.close();
}

Programmatic Transaction Model – w tym modelu programista zarządza transakcjami a nie połączeniami. Przykładem takiego rozwiązania jest interfejs JTA w Javie. Pozwala on na wywołanie kilkunastu operacji na różnych źródłach danych w obrębie jednej transakcji. W związku z tym, że JTA to tylko interfejs w celu użycia mechanizmów zarządzania transakcjami trzeba użyć jakieś dostępnej implementacji, w przypadku Javy możemy użyć niezależnego serwera transakcji typu Atomikos albo BTM. Poniżej przykład zarządzania transakcjami z użyciem JTA, zwróćcie uwagę, że commit() wykonywany jest na obiekcie utm a nie na conn (połączeniu do bazy).

UserTransactionManager
utm=new UserTransactionManager();
utm.init();
utm.begin();
Connection conn = ds.getConnection();
OPERACJA NA BAZIE
conn.close();
utm.commit();

Declarative Transaction Model – w przypadku EJB nazywany Container Managed Transaction. W tym modelu kontener w którym jest osadzony program zarządza transakcjami, programista poprzez opis w XML albo korzystając z adnotacji opisuje, które operacje powinny rozpoczynać albo dołączać do istniejącej transakcji, może również zdecydować jaki stopień izolacji ma być ustawiony przy każdej operacji. Ten model używany jest w EJB w serwerach aplikacji zgodnych z standardem J2EE albo w frameworku Spring.

To tyle w pierwszym artykule z cyklu ‘Tematy proste ale..’, mam nadziej, że chociaż trochę wyjaśniłem tematykę użycia transakcji.

PgCon 2010 - część 3

28 maj 2010, Michał Szymański

Jeśli jesteście ciekawi jak wyglądają programiści bazy Postgres to TUTAJ parę fotek ze spotkania developerów.

PgCon 2010 - część 2

26 maj 2010, Michał Szymański

No more waiting 9.0 - trzy godzinna prezentacja nowych funkcjonalności, które pojawią się
w wersji 9.0. Według twórców nowa wersja prawdopodobnie będzie dostępna w okolicach czerwca. Według mnie najciekawsze nowe funkcjonalności które pojawią się w 9.0 to:
- Hot Standby. W dużym uproszczeniu jest to replikacja bazy danych oparta o przesyłanie wpisów do plików WAL (Write-Ahead Logging), czyli plików gdzie są zapisywane operacje, które będą później zapisywane do pliku (czyli nie każdy commit powoduje zapis do pliku). Widzę dwa podstawowe zastosowania tej metody replikacji, po pierwsze możemy mieć prawie w czasie rzeczywistym kopie bazy danych drugie to zastosowanie slava jako bazy do operacji read-only czyli po prostu dla select’ów. Trzeba pamiętać, że ta replikacja jest asynchroniczna co oznacza, że dane na slav’ie pojawiają się z opóźnieniem a dodatkowo w przypadku awarii bazy master możemy stracić ostatnie tranzakcje. Hot Standby w wersji synchronicznej prawdopodobnie pojawi się w wersji 9.1. Funkcjonalność ta została szczegółowo omówiona na odczycie Built-in replication in PostgreSQL 9.0 Heikki Linnakangas.
- Exclusion Constraints. Kolejna ciekawa funkcjonalność, pozwalająca na nakładanie ograniczeń na tabelach dla wartości związanych z przedziałami. Przykładowo jeśli jeden wiersz w tabeli definiujemy czas rezerwacji sali konferencyjnej to powinniśmy zagwarantować, że nie ma dwóch wierszy definiujących rezerwacje sali w tym samym czasie - czyli nie powinno być nakładania się przedziałów. Bardziej szczegółowo funkcjonalność została przedstawiona na odczycie Not Just UNIQUE Jeff Davis’a

Na wykładzie pojawił się akcent polski, osoba prezentująca odesłała zainteresowanych odnośnie przykładów zastosowania nowych funkcjonalności do strony www.depesz.com prowadzonej przez naszego rodaka.

PgCon 2010 - część 1

25 maj 2010, Michał Szymański

W dniach 18-21 w Ottawie odbyło się coroczne spotkanie użytkowników bazy Postgres’a PgCon 2010. Freeconet korzysta w dużym stopniu z Postgres’a tak więc nie mogło nas tam zabraknąć. W kolejnych postach opisze w skrócie najciekawsze prezentacje, jednak na początek parę zdjęć z konferencji i z samej Ottawy.

Server Health Check - Josh Berkus
Server Health Check - Josh Berkus

Built-in replication in PostgreSQL 9.0 - Heikki Linnakangas
Built-in replication in PostgreSQL 9.0 - Heikki Linnakangas

The PostgreSQL Query Planner - Robert Haas
The PostgreSQL Query Planner - Robert Haas

Developer Meeting Report PgCon 2010

Biurowa część Ottawy leżąca nad rzeką Ottawa
Ottawa - noca

Parliament Hill

Paliament Hill

Indianskie totemy w Muzeum Cywilizacji
Muzeum Cywilizacji

Fax z lini poleceń w linuksie

12 maj 2010, Andrzej Dopierała

Pojawiła się potrzeba w ramach jednego z projektów wysłania pdf-a faksem. PDF-y generowane automatycznie, do każdego z plików przypisany numer na jaki ma być wysłany. I tylko jak to zrobić?

Dzięki freeconetowi nic trudnego.

Potrzebujemy pakietu heirloom-mailx (pozwalającego wysyłać maile wraz z załącznikami po uprzedniej autoryzacji).

Tworzymy plik .mailrc z zawartością:

set from=”faxsender@t37fax.pl”
set smtp=smtp.t37fax.pl
set smtp-auth-user=LOGIN
set smtp-auth-password=HASLO
set smtp-auth=login

(gdzie LOGIN i HASLO to oczywiście login i hasło z usługi mail2fax skonfigurowanej w panelu użytkownika).

I wysyłamy fax:

echo | heirloom-mailx -v -n -s “NUMER” -a PLIK.PDF fax@t37fax.pl

gdzie NUMER to numer faksu (w skladni akceptowanej przez freeconet) a PLIK.PDF to plik który planujemy wysłać w formacie PDF.

Efekt:

+ heirloom-mailx -v -n -s XXX -a YYY.pdf fax@t37fax.pl
Resolving host smtp.t37fax.pl . . . done.
Connecting to 213.218.116.70 . . . connected.
220 postbox00.freeconet.pl ESMTP Datera Carrier-Ex
>>> EHLO machine
250-postbox00.freeconet.pl
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH NTLM LOGIN DIGEST-MD5 PLAIN CRAM-MD5
250-AUTH=NTLM LOGIN DIGEST-MD5 PLAIN CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
>>> AUTH LOGIN
334 XXX
>>> YYY
334 ZZZ
>>> AAA
235 2.7.0 Authentication successful
>>> MAIL FROM:<faxsender@t37fax.pl>
250 2.1.0 Ok
>>> RCPT TO:<fax@t37fax.pl>
250 2.1.5 Ok
>>> DATA
354 End data with <CR><LF>.<CR><LF>
>>> .
250 2.0.0 Ok: queued as EA5121BE4867
>>> QUIT
221 2.0.0 Bye

I po chwili radosne piszczenie faksu :)

Wspieramy rozwój projektu Asterisk

06 kwiecień 2010, Maciej Krajewski

Na przestrzeni ostatnich miesięcy nasz zespół rozwijający produkt Call-Ex zgłosił wiele błędów w projekcie Asterisk (jak reklamują twórcy projektu - Asterisk to oprogramowanie zamieniające zwykły komputer w serwer telekomunikacyjny). Poprawki były między innymi związane z obsługą bazy danych Postgres przez Asterisk’a.  Nasi inżynierowie dodali również kilka poprawek do branch’a 1.6.x poprawiając jego stabilność oraz niwelując memory leak’i. Planujemy dalszy udział w rozwoju Asterisk’a, promując tym samym stosowanie open sourcowych rozwiązań.