Wednesday, July 1, 2009

"Cannot allocate memory" while compiling project with maven

While compiling my project with Maven I got sometimes on my Linux (Gentoo actually) box the following error
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error reading assembly descriptors: Error reading descriptor at: /var/www/app_src/src/main/assembly/package.xml: Cannot run program "env": java.io.IOException: error=12, Cannot allocate memory

This was caused by not enough amount of swap memory on linux. After increasing to double size of physical memory all problems are gone.

I was inspired by this entry of Hudson Wiki.

Tuesday, June 30, 2009

Netbeans 6.7 released!

Finally Netbeans 6.7 has been released a few days after Eclipse Galileo. You can see a quick review of new cool features at release information page.
Changes I'm interested most are better Maven integration, Hudson services integration, Platform enhancements (unpublished Platform 6.7 features page) and better performance.

NetBeans 6.7 splash screen

Wednesday, June 24, 2009

Eclipse Galileo wylądowało...

Już jest! Do pobrania. Właśnie oglądam i chodzi podejrzanie wolno ;) ale widzę że ma kupę fajnych ficzerów. Pewnie nie zrobię relacji, bo będzie ich milion więc po co się dublować. Liczę, że Łukasz Splatch Dywicki zrobić jakieś ciekawe review.

To co od razu znalazłem, to w narzędziach zdalnych, jest połączenie z shellem linucha i można wszystko pięknie monitorować procesy, jest dostęp do plików, no i zwykły terminal. Strasznie mi się to podoba, bo mamy w pracy mnóstwo maszyn na linuxach i sporo się tam dzieje. Hmm, można np. logi podglądać :D

To je dobre! Jakby jaki Pepiczek powiedział.

Monday, June 22, 2009

The Definitive Guide to NetBeans Platform - next NP related book in my library

A few days ago I've won another Netbeans Platform book. It's The Definitive Guide to NetBeans Platform 6.5 by Heiko Böck.
It's the prize for best answers in NetBeans Platform related quiz by Geerjan Wielenga.
The quiz was organized for NetBeans Platform training students on their mailing list.

It took me over hour to discover all answers. I've learned a lot because I've found many precious resources on NetBeans Platform. I suppose that was the main idea of making this quiz by Geertjan.

[caption id="attachment_84" align="aligncenter" width="255" caption="My new NetBeans Platform book"]My new NetBeans Platform book[/caption]

Tuesday, June 16, 2009

Wciąganie dumpów PostgreSQL z COPY zamiast INSERT

Dzisiaj czas jakiś walczyłem z dumpami Postgresowymi (wytworzonymi przez pg_dump), w których dane były umieszczone w postaci COPY.
Niestety cholerny pg_restore nie umie wciągnąć takich plików. Wykonywanie ich z linii komend (psql -f nazwa_pliku) lub z PgAdmina też nic nie dało.

Dla uściślenia fragment takiego dumpa wygląda tak:
COPY "acAclUserModules" ("AclId", "TargetId", "UserId", "AclUserModuleVersionTs",   "TransactionId", "LastChangeOwner", "AclUserModuleDeleted") FROM stdin;
809    23    1    2009-04-28 13:03:22.661+00    \N    2    2008-12-05 02:15:38.214436+00
810    56    1    2009-04-28 13:03:22.661+00    \N    2    2008-12-05 02:15:38.214436+00
811    29    1    2009-04-28 13:03:22.661+00    \N    2    2008-12-05 02:15:38.214436+00
\.

Oprócz komendy COPY zamiast INSERT, charakterystyczne jest źródło danych - stdin. Czyli wejście standardowe klawiatura lub plik, jeśli go przekierować. I właśnie takie jest rozwiązanie problemu
psql -d baza_danych -U user < plik_z_dumpem.sql

Do interpretera PostgreSQL jest przekierowywana zawartość pliku, tj. na jego wejście standardowe. I w ten sposób wciągamy dumpy z COPY zamiast INSERT.

Nadmienię tylko, że oczywiście tworząc dumpa mamy możliwość wyboru formatu wstawiania danych, czy COPY czy INSERT. Odsyłam do dokumentacji pg_dump. Musicie tylko zdawać sobie sprawę, że wersja z COPY jest dużo szybsza, ale za to nie można jej załadować z wygodnego w użyciu PgAdmina.

Polecam artykuł źródłowy.

Monday, June 15, 2009

Przyśpiedzanie ładowania testowego Netbeans Platform

Dużym problemem podczas tworzenia pluginów Netbeans jest bardzo długi czas ładowania testowej platformy. Przyczyną są wszystkie dodatkowe moduły, które są zainstalowane. Można zmniejszyć liczbę ładowanych modułów o te, które nie są nam potrzebne do testowania naszego pluginu. W zależności od tego czy tworzone moduły uruchamiamy oddzielnie, czy może razem spięte w Module Suite, proponuję dwa rozwiązania.

Dla pojedynczych modułów, po uruchomieniu Netbeans z naszym pluginem, otwieramy listę pluginów i wyłączamy jak leci wszystko po kolei, co tylko nie jest nam potrzebne. Po następnym uruchomieniu Nb będzie ładował się błyskawicznie. Ale, uwaga, zrobienie clean na projekcie kasuje nam wszystkie ustawienia...

Druga metoda jest trwalsza, ale tylko dla Module Suite. Klikamy prawym na naszym Suite i z properties wybieramy libraries. Tam odznaczamy wszystko prócz wymaganych zależności, w tym na pewno zostawiamy klastry platform9 i nb6.5 (obie wersje zależą od wersji Nb).

Ponieważ pozostawione moduły mają zależności do wyłączonych, podczas odpalania Nb zapłacze, że czegoś mu brakuje, ale wystarczy wcisnąć magiczny przycisk i popsute moduły zostaną wyłączone. Czas ładowania takiego Netbeansa to ok 3-4sek. Można jeszcze powyłączać poszczególne pluginy wewnątrz klastrów.

Zwróćcie uwagę, że wszystko co zaznaczycie/odznaczycie zostanie zapisane w pliku platform.properies sekcji Important files.

Saturday, June 6, 2009

Sonar nareszcie pod PostgreSQL

Sonar to bardzo złożone oprogramowanie do śledzenia jakości kodu w projekcie. Do tej pory nie można go było postawić używając Postgresa jako bazy przechowującej dane.
Dopiero programista niezwiązany z teamem Sonara postanowił dopisać brakujące wsparcie oraz rozwiązać kilka problemów kompatybilności typów bazodanowych. Z niecierpliwością śledziłem kolejne uaktualnienia bug reporta zgłoszonego przez tego programistę, aż ostanio pojawiło się fixed. I o to jest! Nowa wersja Sonara 1.9 zawiera poprawki, które pozwalają na zainstalowanie oprogramowania z bazą w Postgresie. W końcu.

Tuesday, May 19, 2009

How to attach an external jar without wrapping it

Netbeans Platform creators recommend wrapping all external JARs into dedicated module. I don't want to. I just want to include it in my module. The way to do it (described here) is to put all needed jars in release/modules/ext folder and adding some extra XML to project.xml
<class-path-extension>
<runtime-relative-path>ext/hexedit.jar</runtime-relative-path>
<binary-origin>release/modules/ext/hexedit.jar</binary-origin>
</class-path-extension>

Repeat this section for every jar put in ...ext folder.
Immediately you should see them in Libraries folder of you Project's view.

New Netbeans Plugin on the way

I'm during exploring Netbeans Platform architecture. I like it very much. As I already have a Netbeans Platform Certified Associate certificate, I plan to gain higher level Netbeans Certified Engineer.

To achieve that I have to write a Netbeans Platform plugin. It will be a IM client with various awesome features ;) My plans were commented by Geertjan Wielenga (Netbeans Documentation and Tutorials master writer) whom I met personally. Geertjan said that my plugin would qualified me as a Certified Engineer. Awesome! :D

So I'm developing it right now, at 1:20am as this is the only time when I don't have to look after my children :)

I plan to put some early screenshots as soon as there will be something good to show.

Tuesday, March 31, 2009

Zdobyłem certyfikat "Netbeans Platform Certified Associate" :

W miniony weekend (28-29 III 2009) przeszedłem szkolenie z podstaw Netbean Platform. Szkolenie zorganizowane z ramienia Warszawa JUG, prowadziło dwóch miłych panów z Suna (Geertjan Wielenga i Karol Harezlak), którzy na codzień zajmują się rozwijaniem Netbeansów.

Na koniec szkolenia wszyscy uczestnicy otrzymali certyfikat, który jest pierwszym stopniem wtajemniczenia. W sumie oznacza "liźnięcie" tematu. Dalsza możliwość to Certified Engineer, o który mam zamiar się starać.

[caption id="attachment_46" align="aligncenter" width="300" caption="Netbeans Platform Certified Associate"]Netbeans Platform Certified Associate[/caption]

Podczas szkolenia zdobyłem też najnowszą książkę Geertjana et al. za najciekawsze pytanie, o czym Geertjan wspomniał na swoim blogu :D

Rich Client Programming: Plugging into the NetBeans Platform



Ciekawostką jest, że Karol jest Polakiem, który od kilku lat pracuje w Pradze dla Suna, przy rozwoju modułu Mobility Netbeansów.

[caption id="" align="aligncenter" width="576" caption="Ekipa szkolenia (ja robiłem zdjęcie)"][/caption]

[caption id="" align="aligncenter" width="576" caption="Ekipa szkolenia (ze mną po środku, bo Łukasz robił zdjęcie ;)"]Ekipa szkolenia (ze mną po środku, bo Łukasz robił zdjęcie ;)[/caption]

Tuesday, February 10, 2009

Crystal Reports java viewer JNDI problem

I hate Crystal Reports. We use CR XI and it really sucks. Crystal Reports java library has some awful bugs.

When report viewer is loading there's some output to stdout:
Crystal Report Viewer 11.8.4.1197
java.vendor = Sun Microsystems Inc.
java.version = 1.6.0_10
os.name = Windows XP
os.version = 5.1
os.arch = x86

Why? Because inside CR classes there's a direct output to std out and it sucks. But it's a minor problem.

The worst bug is inside database connection layer, somewhere very deep inside CR java lib. Under an unknown condition sometimes it throws some exceptions with "error finding JNDI name" message. It happens while "switching database". If you don't know what's this, try to dig the net.

The problem is that the reason cannot be defined. The same report sometimes causes this error to appear while another invocation causes nothing bad to happen and the report displays properly.

Workaround

Did I mentioned that Crystal Reports sucks? Oh, yes. As I wrote repeating invocation of a report causes it to display properly. So after two days of debugging and digging throught the Internet with no solution I came to stupid but successful idea.  Repeat tables switching until no error appears. The process doesn't take too long. It always took only two loops to successful switch. SWITCH_TABLE_RETRIES is limit of tries (mine is set to 3 and it works well).
boolean successSwitch = false;
//Update old table in the report with the new table.
for (int j = 0; j < SWITCH_TABLE_RETRIES; j++) {
if (successSwitch) {
if (j > 1 && Logger.getLogger(AbstractReport.class).isDebugEnabled()) {
Logger.getLogger(AbstractReport.class).debug("Switch tables after tries: " + j);
}
break ;
}

try {
databaseController.setTableLocation(t, tables.getTable(i));
successSwitch = true;
} catch (final Throwable th) {
//if it's the last try as we failed
if (j + 1 == SWITCH_TABLE_RETRIES) {
Logger.getLogger(AbstractReport.class).error("Switch tables error " + th.getMessage());
}
}
}

There's another bug discovered by some guy and another weird solution.

CR sux :) The end.

And some polish phrases to be indexed by google and help my colleagues to solve the problem.

Błąd podczas znajdowania nazwy JNDI
Problem z Crystal Reports XI
Przeglądarka
Błąd wyświetlania raportu, raportów