<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5276865747356938843</id><updated>2011-11-28T00:34:11.080+01:00</updated><category term='xml'/><category term='httpClient'/><category term='java'/><category term='jboss'/><category term='burke'/><category term='EJB3.0'/><category term='terracotta'/><category term='głupoty'/><category term='XML Beans'/><category term='JEE'/><category term='jdd'/><category term='pjug'/><category term='integracja'/><category term='X-Fi linux driver'/><category term='crap4j'/><category term='most annoying bugs'/><category term='ogólne'/><category term='suse'/><title type='text'>draken's java house</title><subtitle type='html'>Java, komputery i nie tylko</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-2707193025100378310</id><published>2008-02-26T22:12:00.004+01:00</published><updated>2008-02-26T23:36:59.219+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='X-Fi linux driver'/><category scheme='http://www.blogger.com/atom/ns#' term='suse'/><title type='text'>Sound Blaster X-Fi Linux Driver vs. Draken - zwycięstwo :)</title><content type='html'>Czas na powrót w wielkim stylu po długiej, blisko dwumiesięcznej nieobecności :)&lt;br /&gt;&lt;br /&gt;Post będzie z cyklu: "wracamy do tematu". ;)&lt;br /&gt;&lt;br /&gt;Jak zapewne pamiętacie, kilka miesięcy temu, w poście pt: &lt;a href="http://drakensjavahouse.blogspot.com/2007/11/sound-blaster-x-fi-linux-driver-vs.html"&gt;"Sound Blaster X-Fi Linux Driver vs. Draken 2:0"&lt;/a&gt; opisałem dwie nieudane próby uruchomienia ww. karty pod linuxem SUSE 10.3. Próby te dotyczyły drivera w wersji beta (tja, widziałem już bardziej "dorobione" wersje alfa, ale jak zwał tak zwał :)) autorstwa Creative. Driver ten, dla przypomnienia, został wypuszczony pod koniec września zeszłego roku i zebrał ok 99,9% negatywnych opinii od użytkowników. Od tego czasu Creative nabrał wody w usta.&lt;br /&gt;&lt;br /&gt;No ale, na całe szczęście, środowisko nie próżnowało i pierwszego lutego br. &lt;a href="http://www.opensound.com/"&gt;OSS&lt;/a&gt; wypuścił wersję 4.0 b. 1013 swoich driverów, zamieszczając tam wersję "early BETA" drivera SB X-Fi. Nawet &lt;a href="http://opensource.creative.com/"&gt;Creative Open Source&lt;/a&gt;, zamieścił o tym krótką notkę na swojej stronie.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-size:120%"&gt;Proces instalacji&lt;/span&gt;&lt;br /&gt;Jak zazwyczaj, są dwa sposoby na instalację: paczka RPM (należy pamiętać o ściągnięciu właściwej) oraz kompilacja ze źródeł. Po wykonaniu instalacji trzeba jeszcze przeprowadzić niezbędną konfigurację&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Instalacja paczki RPM&lt;/span&gt;&lt;br /&gt;Instalujemy klasycznie za pomocą komendy:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;rpm -i [nazwa_paczki].rpm&lt;/pre&gt; i tyle na ten temat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Instalacja ze źródeł&lt;/span&gt;&lt;br /&gt;Najpierw musimy ściągnąć paczkę ze źródłami, najlepiej &lt;a href="http://developer.opensound.com/sources/"&gt;stąd&lt;/a&gt;.&lt;br /&gt;Później należy postępować zgodnie z zawartymi w paczce instrukcjami, dlatego że proces instalacji różni się znacznie od klasycznego configure.sh&amp;&amp;make&amp;&amp;make install. Szczególną uwagę należy poświęcić prerekwizytom. Ponadto, trzeba jeszcze doinstalować narzędzie libtool (na liście prerekwizytów śladu po nim nie ma, natomiast bez niego instalacja się wykłada).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Konfiguracja&lt;/span&gt;&lt;br /&gt;Wszystko jedno, który sposób instalacji wybierzemy, zakończy się ona z wielkim hukiem, wyświetleniem błędu:&lt;pre class="prettyprint" style="background: white;"&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;ERROR: Module snd_intel8x0 is in use&lt;br /&gt;ERROR: Module snd_ac97_codec is in use by snd_intel8x0&lt;br /&gt;ERROR: Module snd_pcm is in use by snd_intel8x0,snd_ac97_codec&lt;br /&gt;ERROR: Module snd_timer is in use by snd_pcm&lt;br /&gt;ERROR: Module snd_page_alloc is in use by snd_intel8x0,snd_pcm&lt;br /&gt;Failed to disable conflicting sound drivers&lt;br /&gt;Reboot and try running soundon again &lt;/pre&gt;Błąd ten jest spowodowany konfliktem driverów OSS z zainstalowanymi domyślnie w OpenSUSE 10.3 driverami ALSA. Jednakże OSS zawiera skrypt, za pomocą którego możemy zdezaktywować drivery ALSA. W tym celu należy wykonać następujące kroki:&lt;br /&gt;1. Zalogować się jako root&lt;br /&gt;2. Uruchomić skrypt /usr/lib/oss/scripts/remove_drv.sh&lt;br /&gt;3. Po uruchomieniu tego skryptu należy skasować to co zostało zainstalowane (czyli rpm -e oss-linux jeżeli instalowaliśmy z paczki, lub make clean jeżeli ze źródeł)&lt;br /&gt;4. i powtórzyć instalację. Teraz nie powinno być już konfliktu sterowników. (Bardziej treściwe omówienie tematu zawiera &lt;a href="http://4front-tech.com/forum/viewtopic.php?t=2269"&gt;ten wątek forum OSS&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Na sam koniec nie zawadzi przenieść naszą kartę dźwiękową na sam wierzch stosu wykrytych przez OSS urządzeń. Aby tego dokonać:&lt;br /&gt;1. Logujemy się jako root&lt;br /&gt;2. Edytujemy plik /usr/lib/oss/etc/installed_drivers, przenosząc wpis rozpoczynający się od sbxfi do linii 1&lt;br /&gt;&lt;br /&gt;Na zakończenie restartujemy system.&lt;br /&gt;&lt;br /&gt;Po restarcie, za pomocą komendy &lt;pre class="prettyprint" style="background: white;"&gt;osstest&lt;/pre&gt; testujemy instalację sterowników.&lt;br /&gt;&lt;br /&gt;Z testów wynika, że driver pozwala karcie na działanie jedynie w trybie 2.1 (zamiast 7.1 jak pod Windows). No ale od czegoś trzeba przecież zacząć. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-2707193025100378310?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/2707193025100378310/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=2707193025100378310' title='Komentarze (5)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/2707193025100378310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/2707193025100378310'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2008/02/sound-blaster-x-fi-linux-driver-vs.html' title='Sound Blaster X-Fi Linux Driver vs. Draken - zwycięstwo :)'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-4534533783428193984</id><published>2007-12-30T02:06:00.000+01:00</published><updated>2007-12-30T02:14:55.540+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='crap4j'/><title type='text'>Czysta skatologia</title><content type='html'>Dzisiejszy odcinek poświęcony bedzie automatycznej analizie ryzyka wystapienia antywzorców utrudniających zarządzanie zmianą w kodzie napisanym w Javie. Czyli w skrócie  - Change Risk Anti-Patterns 4J. Jeszcze bardziej w skrócie - &lt;a href="http://crap4j.org"&gt;CRAP4J&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;CRAP4J jest niewielkim programem integrującym się z Eclipsem lub Antem, potrafiącym przeanalizować i ocenić kod w Javie pod kątem prawdopodobieństwa wystapienia w nim błędów powstałych podczas nanoszenia zmian (tzw. regresji). Kod oceniany jest na podstawie dwóch kryteriów. Pierwszym jest stopień skomplikowania szacowany głównie na podstawie liczby punktów decyzyjnych zawartych w każdej metodzie (punktami decyzyjnymi są klauzule "if" oraz pętle). Drugie kryterium stanowi współczynnik (podawany w %) pokrycia kodu testami jednostkowymi. Po przeanalizowaniu kodu, CRAP4J opracowuje zebrane dane w formie graficznej (p. rys.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_I2Tgpj_bdCE/R3bpCRW-wrI/AAAAAAAAAtQ/rWaSTOi2nN0/s1600-h/crap4j_output.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_I2Tgpj_bdCE/R3bpCRW-wrI/AAAAAAAAAtQ/rWaSTOi2nN0/s320/crap4j_output.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5149559449173541554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dane te zawierają porównany ze średnią światową procent metod w projekcie, które nie spełniaja kryteriów jakościowych (CRAPpy methods count) oraz szacunkową ilość pracy pozwalającej na doprowadzenie tych metod do porządku (współczynnik CRAP Load). Ponadto, na arkuszu wyników znaleźć można jeszcze histogram podający rozkład współczynnika CRAP w metodach naszego kodu.&lt;br /&gt;&lt;br /&gt;Co należy zrobić aby obniżyć współczynnik CRAP w kodzie? Zasadniczo, dwie rzeczy:&lt;br /&gt;1) można pisać mniej skomplikowane (krótsze, zawierające mniejszą liczbę punktów decyzyjnych) metody.&lt;br /&gt;2) należy zwiększyć pokrycie metod przez testy jednostkowe.&lt;br /&gt;&lt;br /&gt;Reasumując, CRAP4J to nie "silver bullet", który sprawi, że regularne przeglądy kodu staną się zbędne; narzędzie to potrafi jednak dać kilka istotnych wskazówek ułatwiających refactoring niektórych zbyt skomplikowanych metod.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-4534533783428193984?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/4534533783428193984/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=4534533783428193984' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/4534533783428193984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/4534533783428193984'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/12/czysta-skatologia.html' title='Czysta skatologia'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_I2Tgpj_bdCE/R3bpCRW-wrI/AAAAAAAAAtQ/rWaSTOi2nN0/s72-c/crap4j_output.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-5786648498792792487</id><published>2007-12-14T22:13:00.000+01:00</published><updated>2007-12-16T21:29:47.856+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='XML Beans'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>Fun with XML Beans</title><content type='html'>Po tym jak po raz dziesiąty usłyszałem pytanie "a co to są te XML beans?", o których wspomniałem w jednym z poprzednich postów, stwierdziłem że najwyższy czas żeby szanownym Czytelnikom tego bloga temat nieco przybliżyć.&lt;br /&gt;&lt;br /&gt;W telegraficznym skrócie, Apache XMLBeans to biblioteka służąca do konwersji plików XML do grafu klas Javy. Operacja odwrotna (czyli zapis grafu klas do pliku XML) również jest możliwa.&lt;br /&gt;&lt;br /&gt;Skąd XMLBeans wie w jaki sposób dany plik XML powinien zostać skonwertowany na klasę javy? Mówi mu o tym plik definiujący schemat XML (XML Schema Definition, .xsd). Możemy go wygenerować za pomocą dostarczanego z XMLBeans narzędzia inst2xsd. Narzędzie to przyjmuje Na wejście najbardziej typowy dokument XML, dla którego chcemy taki schemat stworzyć. Skorzystajmy z przykładu z poprzedniego posta:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;person&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;Jan&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;surname&amp;gt;Kowalski&amp;lt;/surname&amp;gt;&lt;br /&gt;  &amp;lt;birthday&amp;gt;19800425&amp;lt;/birthday&amp;gt;&lt;br /&gt;  &amp;lt;salutation&amp;gt;Mr&amp;lt;/salutation&amp;gt;&lt;br /&gt;&amp;lt;/person&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Podaną wyżej treść XML zapisujemy do pliku o nazwie person.xml i wydajemy polecenie:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;%XMLBEANS_HOME%\bin\inst2xsd -outPrefix person person.xml&lt;/pre&gt;&lt;br /&gt;W wyniku otrzymujemy plik person0.xsd zawierający schemat. Zawartość pliku znajduje się poniżej:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"&amp;gt;&lt;br /&gt;  &amp;lt;xs:element name="person" type="personType"/&amp;gt;&lt;br /&gt;  &amp;lt;xs:complexType name="personType"&amp;gt;&lt;br /&gt;    &amp;lt;xs:sequence&amp;gt;&lt;br /&gt;      &amp;lt;xs:element type="xs:string" name="name"/&amp;gt;&lt;br /&gt;      &amp;lt;xs:element type="xs:string" name="surname"/&amp;gt;&lt;br /&gt;      &amp;lt;xs:element type="xs:int" name="birthday"/&amp;gt;&lt;br /&gt;      &amp;lt;xs:element type="xs:string" name="salutation"/&amp;gt;&lt;br /&gt;    &amp;lt;/xs:sequence&amp;gt;&lt;br /&gt;  &amp;lt;/xs:complexType&amp;gt;&lt;br /&gt;&amp;lt;/xs:schema&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Następnie należy skompilować plik schematu. Robimy to za pomocą narzędzia scomp wydając polecenie:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;%XMLBEANS_HOME%\bin\scomp -out person.jar person0.xsd&lt;/pre&gt;&lt;br /&gt;Wynikiem będzie plik person.jar zawierajacy skompilowane klasy reprezentujące dokument XML.&lt;br /&gt;Mając taki plik możemy teraz:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1) czytać pliki XML zgodne ze schematem i posługiwać się nimi tak jak zwykłymi klasami Javy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aby wczytać przykładowy plik XML, możemy skorzystać z poniższego przykładu:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;public static void getPerson() throws Exception {&lt;br /&gt;    File personXML = new File("person.xml");&lt;br /&gt;    PersonDocument personDoc = PersonDocument.Factory.parse(personXML);&lt;br /&gt;    &lt;br /&gt;    PersonType person = personDoc.getPerson();&lt;br /&gt;    person.getName();&lt;br /&gt;    person.getSurname();&lt;br /&gt;    person.getBirthday();&lt;br /&gt;    person.getSalutation();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2) tworzyć zgodne ze schematem pliki XML, wypełniając je dowolną treścią&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aby wygenerować zgodny ze schematem plik XML, należy skorzystać z poniższego kodu. Kod ten zawiera również fragment sprawdzający poprawność generowanego dokumentu XML.&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;public static void setPerson() throws Exception {&lt;br /&gt;    PersonDocument personDoc = PersonDocument.Factory.newInstance();&lt;br /&gt;    &lt;br /&gt;    PersonType person = PersonType.Factory.newInstance();&lt;br /&gt;    person.setName("Jan");&lt;br /&gt;    person.setSurname("Kowalski");&lt;br /&gt;    person.setBirthday(19800425);&lt;br /&gt;    person.setSalutation("Mr");&lt;br /&gt;    &lt;br /&gt;    personDoc.setPerson(person);&lt;br /&gt;    &lt;br /&gt;    //Walidacja dokumentu&lt;br /&gt;    ArrayList validationErrors = new ArrayList();&lt;br /&gt;    XmlOptions validationOptions = new XmlOptions();&lt;br /&gt;    validationOptions.setErrorListener(validationErrors);&lt;br /&gt;    if(!personDoc.validate(validationOptions)) {&lt;br /&gt;      Iterator iter = validationErrors.iterator();&lt;br /&gt;      while (iter.hasNext()) {&lt;br /&gt;       System.out.println("&gt;&gt; " + iter.next() + "\n");&lt;br /&gt;      }&lt;br /&gt;      throw new Exception("Invalid data, cannot format XML file. See above for possible reasons");&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    System.out.println(personDoc.toString());&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Wynikiem będzie plik:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;&amp;lt;person&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;Jan&amp;lt;/name&amp;gt;&gt;&lt;br /&gt;  &amp;lt;surname&amp;gt;Kowalski&amp;lt;/surname&amp;gt;&lt;br /&gt;  &amp;lt;birthday&amp;gt;19800425&amp;lt;/birthday&amp;gt;&lt;br /&gt;  &amp;lt;salutation&amp;gt;Mr&amp;lt;/salutation&amp;gt;&lt;br /&gt;&amp;lt;/person&amp;gt;&lt;/pre&gt;&lt;br /&gt;Oczywiście, na tym nie kończą się możliwości biblioteki. XMLBeans pozwala nam także na przeglądanie dokumentów XML, przeszukiwanie ich za pomocą XQuery/XPath (po integracji z biblioteką &lt;a href="http://saxon.sourceforge.net/"&gt;Saxon&lt;/a&gt;), podmianę treść XMLi "w locie" i na wiele, wiele więcej. Po szczegóły odsyłam do &lt;a href="http://xmlbeans.apache.org/documentation/index.html#XMLBeans+Version+1+User+Documentation"&gt;dokumentacji&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-5786648498792792487?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/5786648498792792487/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=5786648498792792487' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/5786648498792792487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/5786648498792792487'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/12/fun-with-xml-beans.html' title='Fun with XML Beans'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-1658187704179284198</id><published>2007-12-05T22:00:00.000+01:00</published><updated>2007-12-05T22:06:12.676+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JEE'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='integracja'/><title type='text'>Oswajanie Kerberosa</title><content type='html'>Pozwolę sobie bezczelnie zalinkować tutaj opublikowany przeze mnie &lt;a href="http://j2ee.pl/2007/12/04/oswajanie-kerberosa-czyli-dwunasta-praca-heraklesa/"&gt;artykuł&lt;/a&gt; dotyczący integracji serwera BEA WebLogic z systemem Kerberos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-1658187704179284198?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/1658187704179284198/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=1658187704179284198' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/1658187704179284198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/1658187704179284198'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/12/oswajanie-kerberosa.html' title='Oswajanie Kerberosa'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-2137306006561853656</id><published>2007-11-23T20:13:00.000+01:00</published><updated>2007-11-27T14:44:43.651+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='most annoying bugs'/><title type='text'>Joy of SAX</title><content type='html'>Dzisiaj będzie parę słów o chyba najbardziej znanym parserze XML - SAX Parser. A raczej o tym, jak ustrzec się błędu, który popełniany jest bardzo często przez programistów mających styczność z tym parserem po raz pierwszy w życiu (przyznam się bez bicia,że dawno temu sam zaliczyłem bardzo podobną wpadkę). Ale do rzeczy. Załóżmy, że na wejście programu dostaliśmy następującą treść XML:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;person&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;Jan&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;surname&amp;gt;Kowalski&amp;lt;/surname&amp;gt;&lt;br /&gt;  &amp;lt;birthday&amp;gt;19800425&amp;lt;/birthday&amp;gt;&lt;br /&gt;  &amp;lt;salutation&amp;gt;Mr&amp;lt;/salutation&amp;gt;&lt;br /&gt;&amp;lt;/person&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;i mamy przekształcić ją na obiekt klasy&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;public class Person {&lt;br /&gt;  private String name;&lt;br /&gt;  private String surname;&lt;br /&gt;  private Date bithday;&lt;br /&gt;  private String salutation;&lt;br /&gt;&lt;br /&gt;  //insertery i ekstraktory pominąłem&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ok, można do tego użyć wyspecjalizowanych bibliotek, takich jak &lt;a href="http://java.sun.com/developer/technicalArticles/WebServices/jaxb/"&gt;JAXB&lt;/a&gt; lub &lt;br /&gt;&lt;a href="http://xmlbeans.apache.org/"&gt;XMLBeans&lt;/a&gt;, ale w wypadku, gdy mamy przeprowadzić jedynie tak prosty parsing, nazwałbym to przestrzeleniem problemu. W takim przypadku SAX najlepiej się sprawdza.&lt;br /&gt;&lt;br /&gt;Wróćmy do naszego początkującego programisty. W jaki sposób pisze on klasę wykonującą parsing? Zazwyczaj tak:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;public class PersonHandler extends DefaultHandler {&lt;br /&gt;&lt;br /&gt;  public static final String TAG_PERSON = "person";&lt;br /&gt;  public static final String TAG_NAME = "name";&lt;br /&gt;  public static final String TAG_SURNAME = "surname";&lt;br /&gt;  public static final String TAG_BIRTHDAY = "birthday";&lt;br /&gt;  public static final String TAG_SALUTATION = "salutation";&lt;br /&gt;&lt;br /&gt;  private String currentTagName;&lt;br /&gt;  private Person currentPerson;&lt;br /&gt;&lt;br /&gt;  public Person processPerson(InputStream xmlFileInputStream) throws IOException {&lt;br /&gt;    try {&lt;br /&gt;      SAXParserFactory factory = SAXParserFactory.newInstance();&lt;br /&gt;      SAXParser saxParser = factory.newSAXParser();&lt;br /&gt;      saxParser.parse(xmlFileInputStream, this);&lt;br /&gt;      return currentPerson;&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      throw new IOException("Error while parsing XML file, error="&lt;br /&gt;          + e.printStackTrace());&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /*&lt;br /&gt;   * Wywoływana po odczytaniu znacznika początkowego XML&lt;br /&gt;   */&lt;br /&gt;  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {&lt;br /&gt;    currentTagName = qName;&lt;br /&gt;    if (TAG_PERSON.equalsIgnoreCase(qName)) {&lt;br /&gt;      currentPerson = new Person();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;   * Metoda pobierająca zawartość tekstową znacznika&lt;br /&gt;   */&lt;br /&gt;  public void characters(char buf[], int offset, int len) throws SAXException {&lt;br /&gt;    String tagContent = new String(buf, offset, len);&lt;br /&gt;    if (tagContent != null &amp;&amp; tagContent.trim().length() &gt; 0) {&lt;br /&gt;      tagContent = tagContent.trim();&lt;br /&gt;    } else {&lt;br /&gt;      //wartość pusta, nic nie ustawiamy&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;    try {&lt;br /&gt;      if (TAG_NAME.equalsIgnoreCase(currentTagName)) {&lt;br /&gt;        currentPerson.setName(tagContent);&lt;br /&gt;      } else if (TAG_SURNAME.equalsIgnoreCase(currentTagName)) {&lt;br /&gt;        currentPerson.setSurname(tagContent);&lt;br /&gt;      } else if (TAG_BIRTHDAY.equalsIgnoreCase(currentElementName)) {&lt;br /&gt;        currentPerson.setBirthday(DateUtil.parseDate(tagContent, "yyyyMMdd"));&lt;br /&gt;      } else if (TAG_SALUTATION.equalsIgnoreCase(currentTagName)) {&lt;br /&gt;        currentPerson.setSalutation(tagContent);&lt;br /&gt;      } &lt;br /&gt;    } catch (ParseException e) {&lt;br /&gt;      log.warn("Could not obtain " + currentTagName + " tag value", e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;   * Wywoływana po odczytaniu znacznika koncowego XML&lt;br /&gt;   */&lt;br /&gt;  public void endElement(String uri, String localName, String qName) throws SAXException {&lt;br /&gt;    //zamkniecie znacznika nie wiaze sie z jakakolwiek akcja&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Awww..... Isn't that cute? But it's WRONG!!! Dlaczego? &lt;span style="font-weight:bold;"&gt;Dlatego, że metoda characters z poprzedniego listingu nie gwarantuje nam, że cała zawartość tekstowa znacznika zostanie wczytana za pojedynczym jej wywołaniem.&lt;/span&gt; (Jedyne co jest gwarantowane, to wywoływanie metody characters tak długo, dopóki zawartość znacznika nie zostanie odczytana). Dlatego może to prowadzić do sytuacji, w której program z powyższego listingu odczyta jedynie końcówki treści tekstowej znacznika (np.: imię: an, nazwisko: alski itd.), lub co gorsza, wysypie się podczas próby parsingu niekompletnej daty urodzin. Można to poprawić zapisując informacje do obiektu klasy Person() dopiero w momencie, gdy jesteśmy pewni, że dany znacznik już się zakończył - czyli podczas wykonywania metody endElement.&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;public class PersonHandler extends DefaultHandler {&lt;br /&gt;&lt;br /&gt;  public static final String TAG_PERSON = "person";&lt;br /&gt;  public static final String TAG_NAME = "name";&lt;br /&gt;  public static final String TAG_SURNAME = "surname";&lt;br /&gt;  public static final String TAG_BIRTHDAY = "birthday";&lt;br /&gt;  public static final String TAG_SALUTATION = "salutation";&lt;br /&gt;&lt;br /&gt;  private Person currentPerson;&lt;br /&gt;  private StringBuffer currentTagContent;&lt;br /&gt;&lt;br /&gt;  public Person processPerson(InputStream xmlFileInputStream) throws IOException {&lt;br /&gt;    try {&lt;br /&gt;      SAXParserFactory factory = SAXParserFactory.newInstance();&lt;br /&gt;      SAXParser saxParser = factory.newSAXParser();&lt;br /&gt;      saxParser.parse(xmlFileInputStream, this);&lt;br /&gt;      return currentPerson;&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      throw new IOException("Error while parsing XML file, error="&lt;br /&gt;          + e.printStackTrace());&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  /*&lt;br /&gt;   * Wywoływana po odczytaniu znacznika początkowego XML&lt;br /&gt;   */&lt;br /&gt;  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {&lt;br /&gt;    if (TAG_PERSON.equalsIgnoreCase(qName)) {&lt;br /&gt;      currentPerson = new Person();&lt;br /&gt;    }&lt;br /&gt;    currentTagContent = new StringBuffer();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;   * Metoda pobierająca zawartość tekstową znacznika&lt;br /&gt;   */&lt;br /&gt;  public void characters(char buf[], int offset, int len) throws SAXException {&lt;br /&gt;    String partialTagContent = new String(buf, offset, len);&lt;br /&gt;    currentTagContent.append(partialTagContent);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;   * Wywoływana po odczytaniu znacznika koncowego XML&lt;br /&gt;   */&lt;br /&gt;  public void endElement(String uri, String localName, String qName) throws SAXException {&lt;br /&gt;    String currentTagStringContent;    &lt;br /&gt;&lt;br /&gt;    if (currentTagContent.toString() != null &amp;&amp; currentTagContent.toString().trim().length() &gt; 0) {&lt;br /&gt;      currentTagStringContent = currentTagContent.toString().trim();&lt;br /&gt;    } else {&lt;br /&gt;      //wartość pusta, nic nie ustawiamy&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    if (TAG_NAME.equalsIgnoreCase(qName)) {&lt;br /&gt;      currentPerson.setName(currentTagStringContent);&lt;br /&gt;    } else if (TAG_SURNAME.equalsIgnoreCase(qName)) {&lt;br /&gt;      currentPerson.setSurname(currentTagStringContent);&lt;br /&gt;    } else if (TAG_BIRTHDAY.equalsIgnoreCase(qName)) {&lt;br /&gt;      currentPerson.setBirthday(DateUtil.parseDate(currentTagStringContent, "yyyyMMdd"));&lt;br /&gt;    } else if (TAG_SALUTATION.equalsIgnoreCase(qName)) {&lt;br /&gt;      currentPerson.setSalutation(currentTagStringContent);&lt;br /&gt;    } &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Update: dyskusję zachowania powyższego rozwiązania w środowisku wielowątkowym pozostawiam Czytelnikom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-2137306006561853656?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/2137306006561853656/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=2137306006561853656' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/2137306006561853656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/2137306006561853656'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/11/joy-of-sax.html' title='Joy of SAX'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-129012494968087359</id><published>2007-11-15T19:05:00.000+01:00</published><updated>2007-11-15T20:11:55.673+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='suse'/><title type='text'>Sound Blaster X-Fi Linux Driver vs. Draken 2:0</title><content type='html'>Pod koniec września br. firma &lt;a href="http://creative.com"&gt;Creative Labs&lt;/a&gt; wypuściła wreszcie z utęsknieniem wyczekiwaną wersję beta drivera linuksowego do karty dźwiękowej Sound Blaster X-Fi. Piszę "z utęsknieniem" ponieważ od premiery tej karty do dzisiaj upłynęły już ponad dwa lata i przez ten czas szczęśliwi jej posiadacze-linuksiarze mogli w swoim ulubionym systemie operacyjnym rozkoszować się jedynie 24-kanałową, 192 kHz-ową... ciszą.&lt;br /&gt;&lt;br /&gt;Oczywiście, gdy tylko dotarła do mnie wiadomość, że beta już jest, poszedłem na strony &lt;a href="http://opensource.creative.com"&gt;Creative Open Source&lt;/a&gt; żeby wreszcie móc posłuchać pod linuksem czegoś lepiej brzmiącego niż popiskiwania karty wbudowanej w płytę główną.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Pierwsze podejście. Status: FAILED&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ściągnąłem driver (dostępna jest tylko wersja dla 64-bitowych linuksów, właściciele 32-bitowych maszyn muszą się niestety obejść smakiem) i przeczytałem instrukcję instalacji. Tutaj od razu kubeł zimnej wody. Driver należy kompilować za pomocą gcc w wersji 3.30 (zuza ze swoim preinstalowanym 4.2.1 może się schować :P), ponadto &lt;span style="font-weight:bold;"&gt;gcc musi być w identycznej wersji jak to, którym skompilowano kernel&lt;/span&gt; (sic!). Konia z rzędem temu, kto potrafiłby mi wskazać działającego linuksa z 64-bitowym kernelem, który został skompilowany tak przedhistoryczną wersją gcc! Installation aborted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Drugie podejście. Status: FAILED&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na całe szczęście, dotarła do mnie informacja, że pewien &lt;a href="http://x-fi-old.olausson.de/wiki:howto"&gt;biegły w C++ Niemiec&lt;/a&gt; wypuścił patcha, który miał "ukompatybilnić" driver z gcc 4.2.x. Spóbowałem - rezultat (po kiku godzinach wskazywania kompilatorowi, gdzie ma szukać różnych plików nagłówkowych itp.) jest taki, że proces kompilacji wykłada się losowo w różnych miejscach. Więc, jak widać, ten patch nie usuwa wszystkich problemów na linii kod - wersja kompilatora.&lt;br /&gt;&lt;br /&gt;Jak na razie czekam na pełną wersję drivera. Thanks for nothing, Creative!&lt;br /&gt;&lt;br /&gt;Update: jakiś maniak w końcu skompilował ten driver w Suse 10.3. Niestety, podczas ładowania moduł drivera regularnie zalicza segfault. :/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-129012494968087359?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/129012494968087359/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=129012494968087359' title='Komentarze (4)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/129012494968087359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/129012494968087359'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/11/sound-blaster-x-fi-linux-driver-vs.html' title='Sound Blaster X-Fi Linux Driver vs. Draken 2:0'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-1160570438806254838</id><published>2007-11-02T22:32:00.000+01:00</published><updated>2007-11-02T23:21:09.373+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ogólne'/><title type='text'>Obyśmy nie doczekali...</title><content type='html'>W USA coraz głośniej słychać o próbie przepchnięcia przez Kongres ustawy zezwalającej ISPs na różnicowanie jakości usług dostępu do sieci według ich własnego widzimisię. Idea polega na tym, że kto więcej danemu ISP zapłaci, ten dostanie od niego gwarancję, że to właśnie jego usługi będą miały najwyższy priorytet podczas przepływu przez część sieci należącej do tego ISP. I to bez oglądania się na wolę i preferencje użytkowników korzystających z usług danego ISP. Przykładowo: masz dostęp do Internetu za pośrednictwem providera X i chcesz skorzystać z Gmaila? Zapomnij więc o przyzwoitej szybkości, ponieważ provider X podpisał właśnie umowę z Microsoftem mówiącą o tym, że największy priorytet będzie miał Hotmail.&lt;br /&gt;&lt;br /&gt;Problem zresztą jest wieloaspektowy, czasami "różnicowanie jakości" może oznaczać całkowite zablokowanie dostępu do pewnych usług. Oczywiście, o ile nie dopłacisz paru dolarów więcej swojemu ISP za udostepnienie interesujących Cię treści. (Czy ktoś jeszcze się dziwi, że ISPs już zacierają ręce, widząc te płynące z wielu stron strumienie gotówki?) Organizacje pilnujące wolności słowa w USA obawiają się, że pakiety udostępniające blogi, czy też inne formy publikacji WWW, będą należały do najdroższych. Wszystko po to aby wprowadzając pewien rodzaj cenzusu majątkowego ograniczyć głosy antykorporacyjnej krytyki w sieci.  &lt;br /&gt;&lt;br /&gt;Poniższy obrazek publikuję ku przestrodze. Jest to, na całe szczęście, fake. I miejmy nadzieję, że jeszcze długo takim pozostanie.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_I2Tgpj_bdCE/RyudN0xbLNI/AAAAAAAAAro/xqHtVZxLKpo/s1600-h/5z6vt4n-720249.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_I2Tgpj_bdCE/RyudN0xbLNI/AAAAAAAAAro/xqHtVZxLKpo/s320/5z6vt4n-720249.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5128365461521247442" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-1160570438806254838?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/1160570438806254838/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=1160570438806254838' title='Komentarze (8)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/1160570438806254838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/1160570438806254838'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/11/obymy-nie-doczekali.html' title='Obyśmy nie doczekali...'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_I2Tgpj_bdCE/RyudN0xbLNI/AAAAAAAAAro/xqHtVZxLKpo/s72-c/5z6vt4n-720249.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-1742709163923289882</id><published>2007-10-30T20:15:00.000+01:00</published><updated>2007-10-31T00:34:35.765+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='głupoty'/><category scheme='http://www.blogger.com/atom/ns#' term='suse'/><title type='text'>Zuza</title><content type='html'>Tym mianem jeden z moich kumpli ze studiów ochrzcił kiedyś swój ulubiony system operacyjny. Chodzi oczywiście o SUSE Linux tworzony pod patronatem Novella. Dzisiejszy post będzie dotyczył otwartej wersji tego systemu, mianowicie &lt;a href="http://www.opensuse.org"&gt;OpenSUSE&lt;/a&gt; 10.3&lt;br /&gt;&lt;br /&gt;Wersja ta przyszła na świat około miesiąc temu (premiera odbyła się 04.10.2007 wieczorem czasu polskiego). Od razu, gdy zauważyłem że jest, odpaliłem klienta sieci BitTorrent (&lt;a href="http://azureus.sourceforge.net/"&gt;Azureus&lt;/a&gt;, to była reklama ;)), żeby ściągnąć a następnie zapoznać się z tym cudem. ;)&lt;br /&gt;&lt;br /&gt;Instalacja przebiegła bezboleśnie, z jednym tylko zgrzytem - podczas ustawiania domyślnego systemu operacyjnego wybrałem Winblows, następnie zgodnie ze wskazaniami programu instalacyjnego ponownie uruchomiłem komputer... i moim oczom ukazał się Windows. Prawdopodobnie program instalacyjny po zrestartowaniu po prostu uruchamia domyślny system operacyjny, zamiast dokończyć instalację.&lt;br /&gt;&lt;br /&gt;Czysta podstawowa instalacja powinna wystarczyć początkującym użytkownikom. Starzy wyjadacze będą natomiast musieli rozpocząć od doinstalowania narzędzi developerskich (kompilatory, IDEs itp.).&lt;br /&gt;&lt;br /&gt;Po zainstalowaniu, system zajmuje ok 3.5 GB. Nie jest to mało, jednakże w porównaniu z Vistą i tak niezbyt dużo.&lt;br /&gt;&lt;br /&gt;Z rzeczy wartych uwagi można wymienić poprawiony mechanizm autoupdate. W poprzednich wersjach była to jedna z najbardziej kulawych i niestabilnych części systemu. Teraz pracuje bez zarzutu. Identycznie nowe menu start - na początku wydaje się idiotycznie niefunkcjonalne, jednakże po dłuższym używaniu można zauważyć kilka jego zalet (a nawet polubić; zresztą zawsze można wrócić do standardowego menu start). Ponadto w przeciwieństwie do swojego odpowiednika z poprzednich wersji systemu, w ogóle się nie wiesza.&lt;br /&gt;&lt;br /&gt;Na sam koniec zostawiłem sobie dwa rodzynki: po pierwsze funkcjonalność "one click install" - czyli możliwość zainstalowania dowolnego komponentu (wliczając nawet sięgające głęboko w system drivery) po jednokrotnym kliknięciu w opisujący go link. Po drugie (i jest to powód, dla którego zainteresowałem się linią linuxów SUSE) istnieje możliwość włączenia trójwymiarowego desktopu (np.: &lt;a href="http://www.compiz-fusion.org/"&gt;Compiz Fusion&lt;/a&gt;). Co potrafi to cudeńko możecie zobaczyć &lt;a href="http://www.youtube.com/watch?v=E4Fbk52Mk1w"&gt;tutaj&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Komu mógłbym polecić ten system? Właściwie każdemu, kto poszukuje alternatywy dla niemiłościwie panującego nam systemu z Redmond i kto nie ma czasu na długie uczenie się zasad obsługi nowego systemu. IMHO dla osób planujących zmienić system operacyjny, OpenSUSE ma najmniej stromą krzywą uczenia się z wszystkich obecnie istniejących dystrybucji Linuxa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-1742709163923289882?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/1742709163923289882/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=1742709163923289882' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/1742709163923289882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/1742709163923289882'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/10/zuza.html' title='Zuza'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-5192686271198034189</id><published>2007-10-27T10:01:00.001+02:00</published><updated>2007-10-29T13:10:31.858+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='burke'/><category scheme='http://www.blogger.com/atom/ns#' term='terracotta'/><category scheme='http://www.blogger.com/atom/ns#' term='jdd'/><category scheme='http://www.blogger.com/atom/ns#' term='pjug'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB3.0'/><title type='text'>Java Developers Day 2007</title><content type='html'>JDD'07 dla mnie zaczął się dzień wcześniej wykładem &lt;a href="http://www.jonasboner.com/"&gt;Jonasa Bonera&lt;/a&gt; (wym: [boni:r], rymuje się z &lt;span style="font-style:italic;"&gt;beer&lt;/span&gt;) dotyczącym środowiska &lt;a href="http://www.terracottatech.com/"&gt;Terracotta&lt;/a&gt; służącego do clusteringu maszyn wirtualnych Javy. Wykład ten (a właściwie blisko dwugodzinna prezentacja) wygłoszony został na forum &lt;a href="http://java.pl/"&gt;Polish Java User Group&lt;/a&gt; i wywołał tak ożywioną dyskusję, że spotkanie przeciągnęło się o blisko godzinę. Nie wiem, może w takiej sytuacji Organizatorzy powinni w oznaczonym czasie zakończenia ogłosić 10 min. przerwy, po to żeby ci, co chcą/muszą wyjść, po prostu sobie wyszli, bez przeszkadzania prelegentowi i sali.&lt;br /&gt;&lt;br /&gt;Właściwe obchody JDD w tym roku odbyły się w centrum konferencyjnym "Witek" położonym na północny zachód od centrum Krakowa. Okolica wprawdzie miła, jednakże tylko dla zmotoryzowanych (cała reszta musiała zdobyć jakiś środek transportu własnym przemysłem). Spotkanie rozpoczęło się od prezentacji Billa Burke'a (główny architekt JBossa) dotyczącej EJB3.0. Muszę przynać, że prezentacja ta zrobiła na mnie ogromne wrażenie (wcześniej EJB w wersji 3 znałem tylko w teorii, teraz zobaczyłem w praktyce i muszę przyznać, że w najbardziej typowych zastosowaniach da się w tym pisać aplikacje z szybkością światła, nie tracąc czasu na np. oprogramowanie interakcji z bazą danych). Oprócz Burke'a wysłuchałem tylko jeszcze jednej prezentacji dotyczącej ATG (środowiska e-commerce), który w ogóle mnie (i sądząc po stanie sali, nie tylko mnie) nie zainteresował.&lt;br /&gt;&lt;br /&gt;Następnie rozpoczął się mój dyżur na stoisku &lt;a href="http://www.softwaremind.pl"&gt;Software Mind&lt;/a&gt; (miałem odpowiadać na pytania związane z firmą i technologiami w których pracujemy). Cały dyżur (i jeszcze parę godzin później) spędziłem na poprawianiu prac konkursowych (konkurs polegał na znalezieniu jak największej liczby błędów w kodzie napisanym w Javie; nagrodą za pierwsze miejsce był iPod Classic). Poziom uczestników był bardzo wysoki - aż pięć osób znalazło wszystko co było do znalezienia. Z czego trzy prawdopodobnie pracowały kolektywnie (co się akurat chwali) i użyły kompilatora Javy (co z kolei było naciągnięciem zasad konkursu).&lt;br /&gt;&lt;br /&gt;Rok temu gwiazdą JDD był Bruce Eckel (oby żył wiecznie). Po jego wykładzie można było kupić książkę "Thinking in Java wyd. IV" i od razu zdobyć autograf. Niestety w tym roku organizatorzy nie przewidzieli takiej możliwości dla książki Billa Burke'a - duży minus według mnie.&lt;br /&gt;&lt;br /&gt;Członkowie PJUG dzień developrera javy zakończyli w restauracji Rooster w towarzystwie Jonasa Bonera, co przedstawia poniższe zdjęcie, wykonane przez &lt;a href="http://holewa.org/"&gt;Radka Holewę&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_I2Tgpj_bdCE/RyMLT0xbLMI/AAAAAAAAArI/EMKzCpZmdK0/s1600-h/PA260113.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_I2Tgpj_bdCE/RyMLT0xbLMI/AAAAAAAAArI/EMKzCpZmdK0/s320/PA260113.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5125953236089121986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Od prawej: NN (proszę o identyfikację ;)), &lt;a href="http://www.jakub.dzon.pl/"&gt;Jakub Dżon&lt;/a&gt;, Grzegorz Duda, Adrian Nowak, Jonas Boner, yours truly&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-5192686271198034189?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/5192686271198034189/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=5192686271198034189' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/5192686271198034189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/5192686271198034189'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/10/java-developers-day-2007.html' title='Java Developers Day 2007'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_I2Tgpj_bdCE/RyMLT0xbLMI/AAAAAAAAArI/EMKzCpZmdK0/s72-c/PA260113.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-4961242932341594996</id><published>2007-10-22T22:11:00.002+02:00</published><updated>2007-11-27T14:46:06.361+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='httpClient'/><category scheme='http://www.blogger.com/atom/ns#' term='most annoying bugs'/><title type='text'>HttpClient</title><content type='html'>Dzisiejszy odcinek będzie o tym jak bardzo łatwo można załatwić sobie wyciek zasobów przy użyciu HttpClient.&lt;br /&gt;&lt;br /&gt;Początkujący programista HttpClient pisze zazwyczaj coś takiego:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;  HttpClient httpclient = new HttpClient();&lt;br /&gt;  GetMethod httpget = new GetMethod("http://www.myhost.com/");&lt;br /&gt;  try {&lt;br /&gt;    httpclient.executeMethod(httpget);&lt;br /&gt;    Reader reader = new InputStreamReader(&lt;br /&gt;            httpget.getResponseBodyAsStream(),&lt;br /&gt;            httpget.getResponseCharSet()); &lt;br /&gt;    //obsłuż odpowiedź&lt;br /&gt;  } finally {&lt;br /&gt;    httpget.releaseConnection();&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;..i odchodzi zadowolony z dobrze spełnionego obowiązku. Ktoś zapyta, co w tym złego? Na pierwszy rzut oka - nic. Powołujemy do życia obiekt, wykonujemy funkcjonalność, a na końcu sprzątamy po sobie. Wszystko wydaje się być w zgodzie z dobrymi praktykami. Niestety - tylko na pierwszy rzut oka. Co w powyższym kodzie jest nie tak? Otóż według mnie (co najmniej) trzy rzeczy:&lt;br /&gt;&lt;br /&gt;1. według informacji od twórców HttpClient, tworzenie instancji klasy HttpClient jest kosztowne czasowo, dlatego lepiej nie tworzyć jej za każdym razem, gdy potrzebne jest nam nowe połączenie, tylko używać ponownie instancji utworzonej wcześniej. To samo dotyczy połączenia z jednym URL - domyślnym ustawieniem HttpClient jest: &lt;pre class="prettyprint" style="background: white;"&gt;Connection: keep-alive&lt;/pre&gt;, więc nie musimy się martwić, że połączenie zostanie nagle zamknięte.&lt;br /&gt;&lt;br /&gt;2. Ostatnie zdanie powyższego punktu sprowadza nas do kolejnego buga w powyższym kodzie - nigdzie tak naprawdę nie wymuszamy zamykania połączenia (metoda &lt;pre class="prettyprint" style="background: white;"&gt;releaseConnection();&lt;/pre&gt; nie zamyka połączenia, tylko zwraca je do ConnectionManagera). Wymuszenie takie wykonujemy na sam koniec komunikacji z pojedynczym URL, ustawiając pole nagłówka żądania na: &lt;pre class="prettyprint" style="background: white;"&gt;Connection: close&lt;/pre&gt; za pomocą metody &lt;pre class="prettyprint" style="background: white;"&gt;httpget.addRequestHeader("Connection", "close");&lt;/pre&gt;3. Wreszcie ostanie - najgorsze niedopatrzenie: niezamknięcie input streamu odpowiedzi. Prowadzi to do poważnego wycieku zasobów, którymi są deskryptory plików w Unixach (lub deskryptory gniazdek w Winzgrozie). Wzorcowy kod powinien wyglądac mniej więcej tak:&lt;br /&gt;&lt;pre class="prettyprint" style="background: white;"&gt;  HttpClient httpclient = new HttpClient();&lt;br /&gt;  for(Iterator requestIterator = requests.iterator();&lt;br /&gt;      requestIterator.hasNext();) {  &lt;br /&gt;    Req request = (Req) requestIterator.next();&lt;br /&gt;    Reader reader = null;&lt;br /&gt;    try {&lt;br /&gt;      GetMethod httpget = new GetMethod(request.getUri());&lt;br /&gt;      httpget.addRequestHeader("Connection", "close");     &lt;br /&gt;      httpclient.executeMethod(httpget);&lt;br /&gt;      reader = new InputStreamReader(&lt;br /&gt;              httpget.getResponseBodyAsStream(),&lt;br /&gt;              httpget.getResponseCharSet()); &lt;br /&gt;      //obsłuż odpowiedź&lt;br /&gt;    } finally {&lt;br /&gt;      reader.close();&lt;br /&gt;      httpget.releaseConnection();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-4961242932341594996?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/4961242932341594996/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=4961242932341594996' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/4961242932341594996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/4961242932341594996'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/10/dzisiejszy-odcinek-bdzie-o-tym-jak.html' title='HttpClient'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-5632205061658140046</id><published>2007-10-16T20:19:00.000+02:00</published><updated>2007-10-16T22:24:33.665+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='głupoty'/><category scheme='http://www.blogger.com/atom/ns#' term='integracja'/><title type='text'>Sposób  logowania się na serwer MA znaczenie</title><content type='html'>Kilka tygodni temu zadzwonił do mnie przedstawiciel klienta z alarmem o priorytecie 0 ("System nie działa!!!"). Sprawdziłem i rzeczywiście - system wyglądał jak nasz były prezydent po kilku głębszych (wprawdzie kontaktował, ale nic wartościowego nie dało się z niego wyciągnąć). Zrestartowałem serwer aplikacji, na którym stał cały projekt i wszystko wróciło do normy. Stwierdziliśmy zgodnie, że problem jak sam przyszedł tak i sam poszedł, więc nie ma co tracić czasu nad dociekaniem jego przyczyn i rozwiązanie odłożyliśmy &lt;span style="font-style: italic;"&gt;ad calendas Graecas&lt;/span&gt; (tzn. do chwili, gdy problem znowu da o sobie znać).&lt;br /&gt;&lt;br /&gt;Kilka dni temu scenariusz się powtórzył, więc znowu zrestartowałem serwer i jak łatwo się domyślić, wszystko zaczęło działać. Tym razem zapytałem jednak przedstawiciela klienta, czy serwer nie był w tzw. międzyczasie restartowany. Okazało się, że jak najbardziej - był. I to całkiem niedawno. Poprosiłem więc klienta o kolejny restart. Po restarcie - nie działa. Sam zrestartowałem - działa. W tym momencie przedstawiciel klienta załapał, że coś z jego restartami jest chyba nie tak i poprosił mnie o procedurę restartu, która mu wysłałem. Za chwilę nadeszła odpowiedź "Przecież robię dokładnie to co napisałeś!!!...". W tej chwili obaj pewnie zastanawialiśmy się, kto tu z kogo robi idiotę...&lt;br /&gt;&lt;br /&gt;Ciąg dalszy w następnym odcinku....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A nie, nie będę świnia, ciąg dalszy będzie od razu. Tyle że na początek muszę naszkicować architekturę sprzętową systemu. Serwerem (w sensie maszyny) jest Sun Fire z zainstalowanym Solarisem10. Na tym serwerze została stworzona tzw &lt;a href="http://en.wikipedia.org/wiki/Solaris_Containers"&gt;zona&lt;/a&gt; (czyli coś w rodzaju wirtualnego serwera). Z punktu widzenia routera sieci, zona i serwer macierzysty mają dwa różne adresy IP i działają jako dwa niezależne serwery. Serwer naszej aplikacji zainstalowany jest na zonie.&lt;br /&gt;&lt;br /&gt;Na czym polegał problem: przedstawiciel klienta logował się ssh na serwer i stamtąd robił zlogin (wynalazek solarisowy do przełączania się na zonę, inne systemy POSIXowe tej komendy nie mają, a jeżeli nawet, to służy do czego innego) a następnie restartował serwer aplikacji. Ja robiłem ssh bezpośrednio na zonę i restart. Prawdopodobne źródło problemu: zlogin nie ustawia zmiennej systemowej USER, która pewnie jest serwerowi aplikacji do czegoś potrzebna.&lt;br /&gt;&lt;br /&gt;Gdyby ktoś miał inne wytłumaczenie zaistniałej sytuacji, to chętnie poczytam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-5632205061658140046?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/5632205061658140046/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=5632205061658140046' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/5632205061658140046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/5632205061658140046'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/10/sposb-logowania-si-na-serwer-ma.html' title='Sposób  logowania się na serwer MA znaczenie'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5276865747356938843.post-1291983164398327240</id><published>2007-10-15T23:40:00.000+02:00</published><updated>2007-10-16T00:02:45.971+02:00</updated><title type='text'>Tytułem wstępu</title><content type='html'>O czym będzie ten blog... Zgodnie z tytułem, większość postów powinna dotyczyć Javy i technologii powstałych dla tego języka. Raz na jakiś czas (czytaj: bardzo często) bedę robił dygresje w stronę co ciekawszych problemów, na które natrafiłem podczas codziennych zmagań z integracją systemów i programowaniem. Ponadto, zastrzegam sobie prawo do napisania posta kompletnie ni priczom, gdy przyjdzie mi na to ochota.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5276865747356938843-1291983164398327240?l=drakensjavahouse.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://drakensjavahouse.blogspot.com/feeds/1291983164398327240/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5276865747356938843&amp;postID=1291983164398327240' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/1291983164398327240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5276865747356938843/posts/default/1291983164398327240'/><link rel='alternate' type='text/html' href='http://drakensjavahouse.blogspot.com/2007/10/tytuem-wstpu.html' title='Tytułem wstępu'/><author><name>draken</name><uri>http://www.blogger.com/profile/02245043002617399039</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
