I got looped during ServiceMix start
2010-11-23 14:49:32 org.apache.felix.karaf.main.SimpleFileLock lock
INFO: locking
2010-11-23 14:49:33 org.apache.felix.karaf.main.SimpleFileLock lock
INFO: locking
2010-11-23 14:49:34 org.apache.felix.karaf.main.SimpleFileLock lock
INFO: locking
2010-11-23 14:49:35 org.apache.felix.karaf.main.SimpleFileLock lock
...
SerivceMix tries to lock certain files to mark it's instance run. If you have an error shown above search for SeriviceMix process in memory and kill it.
Tuesday, November 23, 2010
Friday, November 19, 2010
Servicemix: Could not parse settings maven_path/settings.xml under Windows XP
Today I encountered problem with servicemix
Could not parse settings [file:/C:/Documents and Settings/Bartek/.m2/settings.xml]
A quick look at karaf.log revealed the problem
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 4-byte UTF-8 sequence.
So the problem is with BOM (byte order mark) in settings.xml file. Many Windows editors add it at start of an utf encoded files. You should save settings.xml as ordinary utf8 file without BOM.
Problem solved.
Could not parse settings [file:/C:/Documents and Settings/Bartek/.m2/settings.xml]
A quick look at karaf.log revealed the problem
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 4-byte UTF-8 sequence.
So the problem is with BOM (byte order mark) in settings.xml file. Many Windows editors add it at start of an utf encoded files. You should save settings.xml as ordinary utf8 file without BOM.
Problem solved.
Labels:
english,
servicemix,
touk
Tuesday, November 16, 2010
Oracle SQL Developer dla MSSQL
Ostatnio poznałem ciekawe narzędzie do manipulacji schematami bazy danych. Oracle SQL Developer się nazywa i nie służy tylko do baz Oracle. Ponieważ pracuję obecnie przy projekcie opartym o MS SQL, to potrzebowałem możliwości połączenia z MS SQL.
Aby to osiągnąć należy do $SQL_DEVELOPER_HOME/jdbc/lib wrzucić driver JDBC. Na pewno działa z jTDS, opensource'owym driverem. Próbowałem też z jarem microsoftowym i mi nie zadziałało.
Po uruchomieniu SQL Developera należy wybrać
Tools->preferences->database->third party JDBC drivers i wskazać wkopiowanego JARa.
Co piękne - od razu pojawia się nowa zakładka przy okienku nowego połączenia z DB. Nie trzeba restartować.
Na razie poznaję feature'y SQL Developera, ale już na pierwszy rzut oka widać, że oprócz manipulacji schemą i listowania danych ma bardzo dużo możliwości. Pytanie tylko czy wszystkie działają również z MS SQLem czy tylko z bazami Oracle.
Linki:
http://www.oracle.com/technetwork/developer-tools/sql-developer/
http://sourceforge.net/projects/jtds/
http://www.microsoft.com/sqlserver/
Aby to osiągnąć należy do $SQL_DEVELOPER_HOME/jdbc/lib wrzucić driver JDBC. Na pewno działa z jTDS, opensource'owym driverem. Próbowałem też z jarem microsoftowym i mi nie zadziałało.
Po uruchomieniu SQL Developera należy wybrać
Tools->preferences->database->third party JDBC drivers i wskazać wkopiowanego JARa.
Co piękne - od razu pojawia się nowa zakładka przy okienku nowego połączenia z DB. Nie trzeba restartować.
Na razie poznaję feature'y SQL Developera, ale już na pierwszy rzut oka widać, że oprócz manipulacji schemą i listowania danych ma bardzo dużo możliwości. Pytanie tylko czy wszystkie działają również z MS SQLem czy tylko z bazami Oracle.
Linki:
http://www.oracle.com/technetwork/developer-tools/sql-developer/
http://sourceforge.net/projects/jtds/
http://www.microsoft.com/sqlserver/
Sunday, October 31, 2010
Pożegnanie z AutoGuard S.A.
Zakończyłem współpracę z firmą AutoGuard S.A. Pracowałem tam 4.5 roku, ostatnio w roli głównego programisty. Cały czas przy projekcie-produkcie AutoControl wersja 2. Nauczyłem się tam bardzo dużo i poznałem bardzo fajnych ludzi.
Ale czas już w drogę, bo tkwienie w jednym projekcie zbyt długo jest złe zarówno dla programisty jak i dla samego projektu. Pojawiają się złe nawyki, przenoszone potem do kodu. A z drugiej strony, ciągłe robienie "tego samego" nie jest rozwijające.
Można też powiedzieć, że "blokowanie" stanowiska pracy przez jedną osobę zbyt długo też jest niedobre dla projektu, bo wolny wakat to nowa osoba, z zewnątrz, z nowymi pomysłami na stare problemy, z nowymi doświadczeniami i znajomością innych technologii.
W każdym z przypadków, zmiana projektu (pracy) jest zdrowa dla wszystkich.
Bardzo dziękuję wszystkim osobom, z którymi współpracowałem w AutoGuardzie. Bardzo Was polubiłem i mam nadzieję, że pozostaniemy w kontakcie.
Siemano. Patrz szwagier, jaka franca! Ale urwał! Synek, bo jak ci... Dobranoc, koniec imprezy!
No nie do końca ;)
Ale czas już w drogę, bo tkwienie w jednym projekcie zbyt długo jest złe zarówno dla programisty jak i dla samego projektu. Pojawiają się złe nawyki, przenoszone potem do kodu. A z drugiej strony, ciągłe robienie "tego samego" nie jest rozwijające.
Można też powiedzieć, że "blokowanie" stanowiska pracy przez jedną osobę zbyt długo też jest niedobre dla projektu, bo wolny wakat to nowa osoba, z zewnątrz, z nowymi pomysłami na stare problemy, z nowymi doświadczeniami i znajomością innych technologii.
W każdym z przypadków, zmiana projektu (pracy) jest zdrowa dla wszystkich.
Bardzo dziękuję wszystkim osobom, z którymi współpracowałem w AutoGuardzie. Bardzo Was polubiłem i mam nadzieję, że pozostaniemy w kontakcie.
Siemano. Patrz szwagier, jaka franca! Ale urwał! Synek, bo jak ci... Dobranoc, koniec imprezy!
No nie do końca ;)
Saturday, October 30, 2010
Import artykułów z Wordpress do Bloggera
Dzisiaj się przeniosłem z Wordpressa do Bloggera, bo mam dosyć utrzymywania samemu softu Wordpressa.
Polecam super narzędzie do konwersji exportu Wordpressa na format importu Bloggera :) http://wordpress2blogger.appspot.com/
Polecam super narzędzie do konwersji exportu Wordpressa na format importu Bloggera :) http://wordpress2blogger.appspot.com/
Labels:
blog
Sunday, October 24, 2010
Warsjawa 2010 - 200 osób, 6sciu sponsorów, 50+ pizz :D
23 X 2010, odbyła się Warsjawa 2010, czyli społecznościowa konferencja z warsztatami i spotkaniami kuluarowymi. W roli prelegentów wystąpili Wojtek Erbetowski, Paweł Lipiński (w miejsce chorego Sławka Sobótki), Dariusz Łuksza, Marcin Rzewucki, Jan Rychter, Adam Michalik. Natomiast warsztaty z pisania wtyczek Eclipse prowadząne były przez Krzystofa Daniela.
Bardzo kolegom dziękuję za poświęcony czas i poprowadzenie prezentacji i szkolenia.
Dzięki sponsorom mieliśmy czym napoić i nakarmić uczestników oraz czym "zabawić", bo był konkurs z PS3 do wygrania. Szanownymi sponsorami byli Altkom, SoftwareMill, Pragmatists, CoCoNet, Accenture i ej-technologies oraz MIMUW w roli naszego stałego patrona użyczającego sale.
To była moja pierwsza Warsjawa i było bardzo fajnie. Zajęło nam 3tyg przygotowanie i jestem bardzo zadowolony z efektu oraz stosunku czasu przygotowywania do rozmachu imprezy.
Osobami, które organizowały byli (alfabetycznie) Jacek Laskowski, Łukasz Lenart, Marcin Zajączkowski i ja :)
Najbliższa duża impreza za 8 miesięcy - Javarsovia* 2011 i już zaczynamy przygotowywać się do organizowania.
* nazwa może ulec zmianie...
Bardzo kolegom dziękuję za poświęcony czas i poprowadzenie prezentacji i szkolenia.
Dzięki sponsorom mieliśmy czym napoić i nakarmić uczestników oraz czym "zabawić", bo był konkurs z PS3 do wygrania. Szanownymi sponsorami byli Altkom, SoftwareMill, Pragmatists, CoCoNet, Accenture i ej-technologies oraz MIMUW w roli naszego stałego patrona użyczającego sale.
To była moja pierwsza Warsjawa i było bardzo fajnie. Zajęło nam 3tyg przygotowanie i jestem bardzo zadowolony z efektu oraz stosunku czasu przygotowywania do rozmachu imprezy.
Osobami, które organizowały byli (alfabetycznie) Jacek Laskowski, Łukasz Lenart, Marcin Zajączkowski i ja :)
Najbliższa duża impreza za 8 miesięcy - Javarsovia* 2011 i już zaczynamy przygotowywać się do organizowania.
* nazwa może ulec zmianie...
Saturday, July 17, 2010
Many problems with betterbeansbinding - one solution :)
If your binding expressions contain errors or data sources are not available you can get several warnings from EL resolver. But no one of BBB developers thought about good debbuging feedback in such situations. All you get are some of these
[sourcecode type="java"]
2010-07-17 14:10:24 org.jdesktop.beansbinding.util.logging.Logger log
WARNING: isReadable(): expression is unresolvable
2010-07-17 14:10:24 org.jdesktop.beansbinding.util.logging.Logger log
WARNING: updateCache(): expression is unresolvable
2010-07-17 14:10:26 org.jdesktop.beansbinding.util.logging.Logger log
WARNING: isWriteable(): expression is unresolvable
[/sourcecode]
But where? In which class? What binding expression? Damn it! How could I work with this tool?!
I've made very simple changes in CLProperty class of BBB src code. One of them
[sourcecode type="java"]
logger.warning("updateCache(): expression is unresolvable: " +
expression + " for source " + source);
[/sourcecode]
Simple, huh? Now I get
[sourcecode type="java"]
2010-07-17 14:27:10 org.jdesktop.beansbinding.util.logging.Logger log
WARNING: updateCache(): expression is unresolvable: ValueExpression[${rootModel.currentRouteTemplate.inRoutePointTemplates}] for source pl.autoguard.ac21.ptir.mvc.view.TransportRouteView[,0,0,856x612,invalid...
[/sourcecode]
Now I can clearly see that ${rootModel.currentRouteTemplate.inRoutePointTemplates} expression failed for visual element in pl.autoguard.ac21.ptir.mvc.view.TransportRouteView class.
Downloads
Altered ELProperty class.
Altered betterbeansbinding-core-1.3.0b1.jar and betterbeansbinding-core-1.3.0b1.pom (note version 1.3.0b1). This jar should be used instead 1.3.0 version. Update your dependencies today! :)
[sourcecode type="java"]
2010-07-17 14:10:24 org.jdesktop.beansbinding.util.logging.Logger log
WARNING: isReadable(): expression is unresolvable
2010-07-17 14:10:24 org.jdesktop.beansbinding.util.logging.Logger log
WARNING: updateCache(): expression is unresolvable
2010-07-17 14:10:26 org.jdesktop.beansbinding.util.logging.Logger log
WARNING: isWriteable(): expression is unresolvable
[/sourcecode]
But where? In which class? What binding expression? Damn it! How could I work with this tool?!
I've made very simple changes in CLProperty class of BBB src code. One of them
[sourcecode type="java"]
logger.warning("updateCache(): expression is unresolvable: " +
expression + " for source " + source);
[/sourcecode]
Simple, huh? Now I get
[sourcecode type="java"]
2010-07-17 14:27:10 org.jdesktop.beansbinding.util.logging.Logger log
WARNING: updateCache(): expression is unresolvable: ValueExpression[${rootModel.currentRouteTemplate.inRoutePointTemplates}] for source pl.autoguard.ac21.ptir.mvc.view.TransportRouteView[,0,0,856x612,invalid...
[/sourcecode]
Now I can clearly see that ${rootModel.currentRouteTemplate.inRoutePointTemplates} expression failed for visual element in pl.autoguard.ac21.ptir.mvc.view.TransportRouteView class.
Downloads
Altered ELProperty class.
Altered betterbeansbinding-core-1.3.0b1.jar and betterbeansbinding-core-1.3.0b1.pom (note version 1.3.0b1). This jar should be used instead 1.3.0 version. Update your dependencies today! :)
Labels:
beansbinding,
betterbeansbinding,
develop,
java
Thursday, July 1, 2010
NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder
I get error while running code with Hibernate 3.5.x
java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:223)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:120)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:269)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:255)
at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:165)
at org.hibernate.ejb.Ejb3Configuration.<clinit>(Ejb3Configuration.java:127)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
at pl.bartekzdanowski.MyTest.setUp(MyTest.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
... 43 more
The solution is described on SLF4j page. Simply you have to add slf4j-api with wersion greater than 1.5.6. In maven pom.xml you can declare slf4j explicitly:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:223)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:120)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:269)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:255)
at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:165)
at org.hibernate.ejb.Ejb3Configuration.<clinit>(Ejb3Configuration.java:127)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
at pl.bartekzdanowski.MyTest.setUp(MyTest.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
... 43 more
The solution is described on SLF4j page. Simply you have to add slf4j-api with wersion greater than 1.5.6. In maven pom.xml you can declare slf4j explicitly:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
Wednesday, June 30, 2010
I po Javarsovii...
Powiem Wam, że myślami ciągle krążę wokół sobotniej konferencji. Rozmach z jakim udało nam się zrobić Javarsovię 2010 przerósł moje oczekiwania. Miało być 500 osób - taką informację przedstawialiśmy sponsorom. A tymczasem przybyło ponad 650. Powstrzymam się od podsumowań szczegółowych. Uczynili to już moi kompani z Kapituły, m.in. Łukasz. Chciałbym jednak podziękować uczestnikom - za ilość przybyłych osób i wspaniałą atmosferę. W piątek wieczorem było cicho i monotonnie, kiedy szykowaliśmy stanowiska, stoły oraz 600 toreb z materiałami :) . Ale w sobotę sale tętniły życiem i świetnym humorem odwiedzających.
Drugie podziękowania idą do sponsorów. Inaczej byśmy się nie spotkali. Przytoczę tu ich wszystkich
Bardzo Wam dziękujemy i do zobaczenia na Warsjavie na jesieni oraz na Javarsovia 2011, za rok :-)
Drugie podziękowania idą do sponsorów. Inaczej byśmy się nie spotkali. Przytoczę tu ich wszystkich
- Sponsorzy platynowi: Javart, IBM
- Sponsorzy złoci: Google, Microsoft, Azul Systems, Oracle
- Sponsorzy srebrni: Adobe, TouK, ITKontrakt, e-point, tieto
- Sponsorzy: Sages, Javatech
- Partnerzy: iStream, SoftwareMill, Helion, OVH.pl, Sun Learning Services Polska
- Patroni medialni: DobreProgramy.pl, Radio Kampus
Bardzo Wam dziękujemy i do zobaczenia na Warsjavie na jesieni oraz na Javarsovia 2011, za rok :-)
Labels:
develop
Saturday, June 26, 2010
Javarsovia 2010 za kilka godzin
Niedawno wróciłem z Centrum Konferencyjnego, gdzie przygotowywaliśmy materiały i sale na konferencję. Mamy 12 dzielnych wolontariuszy, którzy prawie wszyscy do końca ciężko pracowali, aby przytować imprezę.
Przygotowania trwały pół roku, więc jest to owoc ciężkiej pracy wszystkich członków Kapituły. Już się nie mogę doczekać :) więc jeszcze tylko wydrukuję ostateczne listy potwierdzonych i idę spać :)
Przygotowania trwały pół roku, więc jest to owoc ciężkiej pracy wszystkich członków Kapituły. Już się nie mogę doczekać :) więc jeszcze tylko wydrukuję ostateczne listy potwierdzonych i idę spać :)
Labels:
develop
Friday, June 11, 2010
650 na Javarsovię, a rejestracja trwa!
Właśnie sprawdziłem statystyki i mamy 653 zapisanych, w tym 33 damy :D
To jakiś madness! Moim zdaniem, nawet jak część nie przyjdzie, to i tak przekroczymy PÓŁ TYSIĄCA! :D
To jakiś madness! Moim zdaniem, nawet jak część nie przyjdzie, to i tak przekroczymy PÓŁ TYSIĄCA! :D
Labels:
java,
javarsovia
Thursday, June 3, 2010
Rejestracja na Javarsovia 2010 otwarta!
Rejestracja na Javarsovię 2010 jest już otwarta od dwóch dni. Mamy już przeszło 250 zapisanych!
A czy Wy już jesteście zapisani? Bo ja zdaje się widziałem Waszego sąsiada, tego grubszego spod 5tki, że on już zarejestrowany!
Uczestnictwo, dzięki sponsorom, jest bezpłatne, ale wymaga rejestracji.
Możecie sobie poczytać o zgłoszonych prezentacjach, a podczas rejestracji można wybrać 6 preferowanych. Na podstawie wyborów ułożymy 4 ścieżki.
Jeśli już się zarejestrowaliście, ale nie określiliście preferencji rozkładu, to proszę zróbcie to - będzie to dla nas cenną wskazówką.
Wszystko jest mailu potwierdzającym.
Pomóżcie nam promować Javarsovię. Miejcie swój wkład w najwiekszą bezpłatną konferencję Javową w Polsce. Piszcie na blogach, dzwońcie do rodziny, ustawcie statusy na GG itp., wysyłajcie smsy, zaznaczcie swoją obecność na konferencji na LinkedIn i na Facebooku, niech Wasze kontakty wiedzą co się szykuje.
Do dzieła! :D
A czy Wy już jesteście zapisani? Bo ja zdaje się widziałem Waszego sąsiada, tego grubszego spod 5tki, że on już zarejestrowany!
Uczestnictwo, dzięki sponsorom, jest bezpłatne, ale wymaga rejestracji.
Możecie sobie poczytać o zgłoszonych prezentacjach, a podczas rejestracji można wybrać 6 preferowanych. Na podstawie wyborów ułożymy 4 ścieżki.
Jeśli już się zarejestrowaliście, ale nie określiliście preferencji rozkładu, to proszę zróbcie to - będzie to dla nas cenną wskazówką.
Wszystko jest mailu potwierdzającym.
Pomóżcie nam promować Javarsovię. Miejcie swój wkład w najwiekszą bezpłatną konferencję Javową w Polsce. Piszcie na blogach, dzwońcie do rodziny, ustawcie statusy na GG itp., wysyłajcie smsy, zaznaczcie swoją obecność na konferencji na LinkedIn i na Facebooku, niech Wasze kontakty wiedzą co się szykuje.
Do dzieła! :D
Labels:
java,
javarsovia
Tuesday, April 27, 2010
InetAddress.isReachable() jest do bani
Napisałem mały program testujący czy klient "widzi" prawidłowo adres i porty naszego serwera aplikacyjnego. Zdarza się, że Firewalle klientów skutecznie blokują łączność.
Zależało mi, aby w pierwszym kroku "spingować" hosta. Niestety wczoraj odkryliśmy buga, bo polegałem na metodzie InetAddress.isReachable(). Tymczasem sposób jest do chrzanu, bo implementacja nie pinguje a odpytuje usługę echo, która stoi na porcie 7. Wielu adminów blokuje tego typu usługi, starając się maksymalnie uszczelnić serwery. U nas w firmie też i dlatego nasi klienci dostawali informację, że istnieje brak łączności z jednym z serwerów.
Nie dostarczę dzisiaj rozwiązania, z braku czasu, ale wrócę do tematu kiedyś.
Poniżej wadliwy kod:
[sourcecode type="java"]
final String host = "zdanek.ostrejezyki.pl";
final int timeOut = 3000;
final boolean status = InetAddress.getByName(host).isReachable(timeOut);
if (status == false) {
throw new IOException("Brak lacznosci z " + host);
}
[/sourcecode]
Zależało mi, aby w pierwszym kroku "spingować" hosta. Niestety wczoraj odkryliśmy buga, bo polegałem na metodzie InetAddress.isReachable(). Tymczasem sposób jest do chrzanu, bo implementacja nie pinguje a odpytuje usługę echo, która stoi na porcie 7. Wielu adminów blokuje tego typu usługi, starając się maksymalnie uszczelnić serwery. U nas w firmie też i dlatego nasi klienci dostawali informację, że istnieje brak łączności z jednym z serwerów.
Nie dostarczę dzisiaj rozwiązania, z braku czasu, ale wrócę do tematu kiedyś.
Poniżej wadliwy kod:
[sourcecode type="java"]
final String host = "zdanek.ostrejezyki.pl";
final int timeOut = 3000;
final boolean status = InetAddress.getByName(host).isReachable(timeOut);
if (status == false) {
throw new IOException("Brak lacznosci z " + host);
}
[/sourcecode]
Monday, April 26, 2010
Zero Cobertura coverage
Recently I had zero code coverage during tests. I had a maven2 project (under maven 1.0.9), with default cobertura version, which was 1.9.
All reports were generated normally except all code coverage was zero (0).
The reason was somehow buggy cobertura version 1.9.
After I put cobertura-maven-plugin configuration into my pom.xml specifying cobertura version 2.4
[sourcecode language="xml"]
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.4</version>
</plugin>
[/sourcecode]
all went well and finally I had my non-zero coverage :D
(Edit: I've added some pretty screenshots :])
All reports were generated normally except all code coverage was zero (0).
The reason was somehow buggy cobertura version 1.9.
After I put cobertura-maven-plugin configuration into my pom.xml specifying cobertura version 2.4
[sourcecode language="xml"]
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.4</version>
</plugin>
[/sourcecode]
all went well and finally I had my non-zero coverage :D
(Edit: I've added some pretty screenshots :])
Friday, April 16, 2010
W końcu logować z IF (isDebugEnabled()) czy nie?!
Ostatnio staram się pisać małe metody, w imię czytelności kodu. W związku z tym każda dodatkowa linijka zwiększa objętość metody. W malutkich metodach jedna linia to nawet kilkadziesiąt procent objętości :) A co z logowaniem informacji debugujących? Zgodnie z zaleceniami autora Log4j (bo tego loggera zazwyczaj używam), przed zalogowaniem debug() powinno się sprawdzić czy ten poziom jest włączony, aby niepotrzebnie nie tracić czasu procesora na inicjalizowanie stringa do zalogowania. Ceki Gülcü, autor Log4j, w 2002 przekonywał, że sprawdzanie IFem poziomu na PII 233MHz zajmuje nanosekundy, co stanowi mały narzut. Rzeczywiście. A co, gdyby w imię czytelności kodu zrezygnować z tego sprawdzania? Co się wówczas stanie? Ile czasu stracimy? I czy mimo wyłączonego logowania niepotrzebnie wiadomość będzie przetwarzana wewnątrz loggera?
Otóż, oba popularne loggery Log4j i java.utils.Logging sprawdzają czy dany poziom jest włączony i oczywiście nie logują komunikatu, jeśli nie pasuje do poziomu. W takim razie jedynym istotnym problemem jest czas konstruowania wiadomości do zalogowania. Zazwyczaj jest to operacja sklejania kilku stringów, bo chcemy zalogować jakąś operacje np. z jej parametrami. Warto przy tym zauważyć, że czasy kiedy "jakiś string" + "inny" powodowało kilka wywołań konstruktora String(). Od javy 1.5 (lub wcześniej, bo nie wiem) , sklejanie stringów zawsze jest zastępowane StringBuilderem, a więc jest bardzo efektywne. W związku z tym, każdorazowo należy rozważyć czy dany string, który chcemy zalogować jest złożony czy nie. Jeśli nie, to moim zdaniem nie warto stosować IFów, tylko bezwzględnie pchać go loggera.
A teraz konkretne miary, jako, że jestem inżynierem. Test wykonany na procku dual core 2.66GHz, czyli rząd wielkości szybszy od twórcy Log4j. Dzisiaj uważany za przeciętnie dobry sprzęt.
Napisałem program, który 100 000 razy loguje wiadomość, przy wyłączonym debugowaniu. Przy czym w pierwszym teście odbija się od sprawdzenia IFem czy włączone jest debugowanie, a w drugim wchodzi do środka metody logującej. Logowany string to
Mamy tu 3 operacjie StringBuilder.add(), przy czym dla int i jest najbardziej kosztowna, bo i jest od razu zamieniane na string. Wynik:
0 ms oznacza rzeczywiście submilisekundowe czasy sprawdzania czy poziom to DEBUG. 93 ms w rozłożeniu na 100 tyś. wywołań daje nam 93 ns (nano sekund!) na sklejanie. Dodam na koniec, że zaskoczony wynikiem podejrzewałem mocną optymalizację ze strony JVM, czego nie da się wykluczyć, ale drugi test z wielokrotnym powtórzeniem logowanej wiadomości (czyli rezygnacja z pętli) dało również submilisekundowe wyniki. Wkleiłem setkę razy
Konkluzja: moim zdaniem przy prostej treści logowanej wiadomości, można zrezygnować ze sprawdzania poziomu logowania na rzecz uproszczenia (wizualnego) kodu.
Źródełko:
[sourcecode language="java"]
package pl.ostrejezyki.zdanek;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class LoggingEffectivenessTests {
private static Logger logger = Logger.getLogger(LoggingEffectivenessTests.class);
public static void main(String[] args) {
initLog4j();
testCheckingIfDebugIsEnabled();
testWithoutCheckingIfDebugIsEnabled();
}
private static void testWithoutCheckingIfDebugIsEnabled() {
long start;
long stop;
System.out.println("Test logow bez wlaczonego debuga, bez sprawdzania IF");
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
logger.debug("Wiadomosc testowa, index " + i + " i jeszcze string");
}
stop = System.currentTimeMillis();
System.out.println("Czas " + (stop - start) + "ms");
}
private static void testCheckingIfDebugIsEnabled() {
System.out.println("Test logow bez wlaczonego debuga, ze sprawdzaniem IF");
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
if (logger.isDebugEnabled()) {
throw new IllegalStateException("Debug wlaczony, a powinien byc wylaczony");
}
}
long stop = System.currentTimeMillis();
System.out.println("Czas " + (stop - start) + "ms");
}
private static void initLog4j() {
Logger l = Logger.getRootLogger();
ConsoleAppender ca = new ConsoleAppender();
l.addAppender(ca);
l.setLevel(Level.ERROR);
}
}
[/sourcecode]
Otóż, oba popularne loggery Log4j i java.utils.Logging sprawdzają czy dany poziom jest włączony i oczywiście nie logują komunikatu, jeśli nie pasuje do poziomu. W takim razie jedynym istotnym problemem jest czas konstruowania wiadomości do zalogowania. Zazwyczaj jest to operacja sklejania kilku stringów, bo chcemy zalogować jakąś operacje np. z jej parametrami. Warto przy tym zauważyć, że czasy kiedy "jakiś string" + "inny" powodowało kilka wywołań konstruktora String(). Od javy 1.5 (lub wcześniej, bo nie wiem) , sklejanie stringów zawsze jest zastępowane StringBuilderem, a więc jest bardzo efektywne. W związku z tym, każdorazowo należy rozważyć czy dany string, który chcemy zalogować jest złożony czy nie. Jeśli nie, to moim zdaniem nie warto stosować IFów, tylko bezwzględnie pchać go loggera.
A teraz konkretne miary, jako, że jestem inżynierem. Test wykonany na procku dual core 2.66GHz, czyli rząd wielkości szybszy od twórcy Log4j. Dzisiaj uważany za przeciętnie dobry sprzęt.
Napisałem program, który 100 000 razy loguje wiadomość, przy wyłączonym debugowaniu. Przy czym w pierwszym teście odbija się od sprawdzenia IFem czy włączone jest debugowanie, a w drugim wchodzi do środka metody logującej. Logowany string to
"Wiadomosc testowa, index " + i + " i jeszcze string"
Mamy tu 3 operacjie StringBuilder.add(), przy czym dla int i jest najbardziej kosztowna, bo i jest od razu zamieniane na string. Wynik:
Test logow bez wlaczonego debuga, ze sprawdzaniem IF
Czas 0ms
Test logow bez wlaczonego debuga, bez sprawdzania IF
Czas 93ms
0 ms oznacza rzeczywiście submilisekundowe czasy sprawdzania czy poziom to DEBUG. 93 ms w rozłożeniu na 100 tyś. wywołań daje nam 93 ns (nano sekund!) na sklejanie. Dodam na koniec, że zaskoczony wynikiem podejrzewałem mocną optymalizację ze strony JVM, czego nie da się wykluczyć, ale drugi test z wielokrotnym powtórzeniem logowanej wiadomości (czyli rezygnacja z pętli) dało również submilisekundowe wyniki. Wkleiłem setkę razy
logger.debug("Wiadomosc testowa, index " + (i++) + " i jeszcze string");
Konkluzja: moim zdaniem przy prostej treści logowanej wiadomości, można zrezygnować ze sprawdzania poziomu logowania na rzecz uproszczenia (wizualnego) kodu.
Źródełko:
[sourcecode language="java"]
package pl.ostrejezyki.zdanek;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class LoggingEffectivenessTests {
private static Logger logger = Logger.getLogger(LoggingEffectivenessTests.class);
public static void main(String[] args) {
initLog4j();
testCheckingIfDebugIsEnabled();
testWithoutCheckingIfDebugIsEnabled();
}
private static void testWithoutCheckingIfDebugIsEnabled() {
long start;
long stop;
System.out.println("Test logow bez wlaczonego debuga, bez sprawdzania IF");
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
logger.debug("Wiadomosc testowa, index " + i + " i jeszcze string");
}
stop = System.currentTimeMillis();
System.out.println("Czas " + (stop - start) + "ms");
}
private static void testCheckingIfDebugIsEnabled() {
System.out.println("Test logow bez wlaczonego debuga, ze sprawdzaniem IF");
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
if (logger.isDebugEnabled()) {
throw new IllegalStateException("Debug wlaczony, a powinien byc wylaczony");
}
}
long stop = System.currentTimeMillis();
System.out.println("Czas " + (stop - start) + "ms");
}
private static void initLog4j() {
Logger l = Logger.getRootLogger();
ConsoleAppender ca = new ConsoleAppender();
l.addAppender(ca);
l.setLevel(Level.ERROR);
}
}
[/sourcecode]
Labels:
develop,
java,
performance,
rzemiosło
Wednesday, April 7, 2010
Consumer Driven Contracts - prezentacja Adama Lidera na WJUG
Wczoraj na WJUGu wystąpił Adam Lider z demonstracją Consumer Driven Contracts. Opisywał duży, rozproszony system i problemy związane z jego wdrożeniem i utrzymaniem. Była to bardzo ciekawa prezentacja, ponieważ oprócz tego, że Adam był bardzo dobrze przygotowany i naturalny, to opowiadał o własnych doświadczeniach, bo przy projekcie pracował kilka lat.
Była również dodatkowa atrakcja, bo z powodu Świąt było zamknięte "akwarium" i nie mieliśmy rzutnika multimedialnego (Michale!) i dlatego musieliśmy się ścisnąć wokół laptopa Adama. To było integrujące! :)
[caption id="attachment_114" align="aligncenter" width="480" caption="Adam Lider prezentuje CDC, bez projektora"][/caption]
Była również dodatkowa atrakcja, bo z powodu Świąt było zamknięte "akwarium" i nie mieliśmy rzutnika multimedialnego (Michale!) i dlatego musieliśmy się ścisnąć wokół laptopa Adama. To było integrujące! :)
[caption id="attachment_114" align="aligncenter" width="480" caption="Adam Lider prezentuje CDC, bez projektora"][/caption]
Labels:
wjug
Subscribe to:
Posts (Atom)