Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą java. Pokaż wszystkie posty

wtorek, 8 lutego 2011

Jaki jest Twój ulubiony numer?

Ostatnio wśród wielbicieli i zagorzałych przeciwników Javy modne stało się pytanie o ulubioną liczbę.
Skąd takie pytanie?
Otóż jest pewien wartość sprawiająca Javie kłopoty.

Jaki jest Twoim zdaniem efekt uruchomienia programu:

package pl.matt.fne;

public class Main {
public static void main(String[] args) {
double d = Double.valueOf("22.250738585072012e-309");
System.out.println(d);
}
}

No więc niestety. Program uruchamia się bez końca. Po prostu się zapętla. Także ulubionym numerem prawdziwego hakera jest ostatnio:
22.250738585072012e-309.

Próbę wytłumaczenia tego fenomenu można znaleźć pod tym adresem. Ja niestety wymiękłem podczas analizy klasy FloatingDecimal.

22.250738585072012e-309 to bardzo przebiegła liczba.
Spróbujmy skompilować program:

package pl.matt.fne;

public class Main {
public static void main(String[] args) {
double d = 22.250738585072012e-309;
System.out.println(d == 12);
}
}

Znowu niespodzianka.
javac też się zawiesza.

Czy ta ciekawostka może być groźna.
Ano może.
Wyobraźmy sobie aplikację, która przyjmuje podaną użytkownika liczbę niecałkowitą i konwertuje ją do zmiennej typu double.
Odpowiednio spreparowane żądanie do takiej aplikacji może na zawsze zająć jej wątek. Atak DoS jak się patrzy.
Spróbuję w przyszłym tygodniu przygotować przykład ilustrujący ten scenariusz.

Tymczasem Oracle wypuścił patcha mającego wyeliminować powyższe niedogodności.
Działa u was?
Ja jeszcze nie instalowałem.

sobota, 15 sierpnia 2009

Słabe referencje... z czym to się je?

Dzisiaj święto Wojska Polskiego. Parady wojskowej nie będzie z powodu kryzysu, ale sklepy (z zupełnie zresztą innego powodu) pozamykane. A jeść trzeba...

Może skuszę się na słabą referencję... ale z czym to się je?

Referencja jak referencja, spotkał się z nią każdy:

String string = new String("123");

Słaba referencja wygląda trochę inaczej

Reference<String> refString = new WeakReference<String>(new String("123"));

a dostęp do obiektu, na który referencja wskazuje uzyskujemy za pomocą wywołania metody get()

refString,get();

Nie o wygląd jednak tutaj chodzi.

Dopóki obiekt w naszym programie wskazywany jest przez zwykłą referencję, nie zostanie on usunięty z pamięci przez jakże uwielbiany przez wszystkich Garbage Collector.

Natomiast obiekt wskazywany przez słabą referencję, może być usunięty przez GC jeżeli zacznie brakować pamięci, mimo, że referencja do niego cały czas jest obecna w programie. Metoda get() zwróci wtedy wartość null.

Nie wierzysz?

Oto krótki program obrazujący działanie słabych (i mocnych) referencji:

package pl.matt;

import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;


public class WeakReferenceTest {

int[] tab = new int[1024];

public static void main(String[] args) {
// zwykła referencja
String string = new String("123");

// słaba referencja
Reference<String> refString = new WeakReference<String>(new String("456"));

System.out.println(string);
System.out.println(refString.get());

java.util.List<WeakReferenceTest> list = new ArrayList<WeakReferenceTest>();

for (int i = 0; i < 1000000; i++) {
WeakReferenceTest test = new WeakReferenceTest();
list.add(test);
if (refString.get() == null) {
System.out.println(string);
System.out.println(i + " " + refString.get());
break;
}
}
}

}

Program w pętli przydziela pamięć tworząc nowe obiekty klasy WeakReferenceTest(). W pewnym momencie zaczyna się uruchamiać Garbage Collector i usuwa z pamięci obiekt który wskazywała słaba referencja.

Oprócz słabych referencji, w javie mamy jeszcze "średnio mocne" referencje SoftReference. Zasada ich działania jest podobna, z tym, że obiekty przez nie wskazywane żyją dłużej.

Obiekt wskazywany przez miękką referencję zostanie usunięty z pamięci tuż przed rzuceniem wyjątku java.lang.OutOfMemoryError.

Doskonałe narzędzia, to implementacji mechanizmów pamięci podręcznej.

Żeby dopełnić obrazu całości... są jeszcze referencje fantomowe PhantomReference. Obiekty wskazywane przez te referencje są usuwane przy każdym uruchomieniu GC, o ile nie wskazuje na nie żadna inna referencja. Można je stosować, aby mieć informację o tym, kiedy dany obiekt został usunięty z pamięci.

Aż się głodny zrobiłem, czas chyba zjeść coś bardziej konkretnego.

PS. Czego używacie do przeglądania RSSów? Ja jak dotąd Thunderbirda, ale ciągle szukam czegoś lepszego.

czwartek, 3 lipca 2008

oferty-pracy-java grupa dla szukających pracy lub pracowników

Witam.

Kilka dni temu powstała dedykowana dla jawowców i ludzi którzy ich poszukują grupa:
oferty-pracy-java.

Grupa w swym założeniu ma łączyć osoby poszukujące pracy związanej z Javą z osobami poszukującymi pracowników. Można tam zamieścić ogłoszenie lub własne CV. O zamieszczonych CV i ogłoszeniach można również na grupie dyskutować.
Grupa jest moderowana i publicznie dostępna, ale tylko osoby do niej zapisane mogą zamieszczać ogłoszenia oraz inne wiadomości. Zarejestrowani użytkownicy mogą również otrzymywać powiadomienia pocztą elektroniczną o nowych ogłoszeniach.

Zastanawiacie się po czym się poznaje mężczyznę? Mężczyznę poznaje się podobno po tym, jak kończy, więc na koniec dodam, że grupa zawiera tylko i wyłącznie ogłoszenia z podanym wynagrodzeniem. Nawiasem pisząc ja poznaję mężczyzn zupełnie inaczej.

Zapraszam więc zarówno do zapisania się do grupy, jak i rozpropagowaniu informacji o niej (również w działach i firmach HR), co niniejszym czynię.

Pozdro666!

niedziela, 15 czerwca 2008

dekompilacja kodu Java w locie i w Eclipsie

Dzisiaj kontynuuję moje przygody z najnowszym Eclipse Ganymede. Zainstaluję do niego wtyczkę (w końcu to Eclipse) która mam nadzieję rozwiąże przynajmniej część moich problemów z brakującymi źródłami zewnętrznych bibliotek. O ile źródła wielu z nich, jak np. Spring są łatwe do znalezienia, o tyle żeby znaleźć źródła JavaMail musiałem się kiedyś nieźle na pocić. Czasami nie mam na to czasu ani ochoty, a jakieś źródła fajnie zobaczyć.
Stąd mój zwrot w kierunku dekompilacji kodu i programu Jad - the fast JAva Decompiler do którego istnieje wtyczka JadClipse przeznaczona dla środowiska Eclipse. Kod po dekompilacji zawsze będzie gorszy niż pierwotny kod źródłowy. Nie będzie komentarzy ani adnotacji ale lepszy rydz niż nic.
Zatem do dzieła.
Pobieram Jad 1.5.8e for Linux on Intel platform
rozpakowuję do katalogu /opt/jad i nadaję prawa do wykonania pliku jad
mateusz@mateusz-laptop:~$ chmod +x /opt/jad/jad

krótki sprawdzian, czy działa:

mateusz@mateusz-laptop:~$ /opt/jad/jad
/opt/jad/jad: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory

i tu klops, nie działa... Niespełnione zależności, czyli coś co w Linuksie lubię najbardziej.
Wkładam gogle, martwa cisza. W Ubuntu 8.04 nikt się nie chwali, że to rozwiązał. Ja się pochwalę. Pobieram i instaluję paczkę libstdc++2.10-glibc2.2 dla Ubuntu 7.10. O dziwo zainstalowała się bez przeszkód. Sprawdzam czy działa Jad:
mateusz@mateusz-laptop:~$ /opt/jad/jad
Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov (kpdus@yahoo.com).
Usage: jad [option(s)] <filename(s)>
Options: -a - generate JVM instructions as comments (annotate)
-af - output fully qualified names when annotating
-b - generate redundant braces (braces)
-clear - clear all prefixes, including the default ones
-d <dir> - directory for output files
-dead - try to decompile dead parts of code (if there are any)
-dis - disassembler only (disassembler)
-f - generate fully qualified names (fullnames)
-ff - output fields before methods (fieldsfirst)
-i - print default initializers for fields (definits)
-l<num> - split strings into pieces of max <num> chars (splitstr)
-lnc - output original line numbers as comments (lnc)
-lradix<num>- display long integers using the specified radix
-nl - split strings on newline characters (splitstr)
-noconv - don't convert Java identifiers into valid ones (noconv)
-nocast - don't generate auxiliary casts
-noclass - don't convert .class operators
-nocode - don't generate the source code for methods
-noctor - suppress the empty constructors
-nodos - turn off check for class files written in DOS mode
-nofd - don't disambiguate fields with the same names (nofldis)
-noinner - turn off the support of inner classes
-nolvt - ignore Local Variable Table entries (nolvt)
-nonlb - don't insert a newline before opening brace (nonlb)
-o - overwrite output files without confirmation
-p - send all output to STDOUT (for piping)
-pa <pfx>- prefix for all packages in generated source files
-pc <pfx>- prefix for classes with numerical names (default: _cls)
-pe <pfx>- prefix for unused exception names (default: _ex)
-pf <pfx>- prefix for fields with numerical names (default: _fld)
-pi<num> - pack imports into one line using .* (packimports)
-pl <pfx>- prefix for locals with numerical names (default: _lcl)
-pm <pfx>- prefix for methods with numerical names (default: _mth)
-pp <pfx>- prefix for method parms with numerical names (default:_prm)
-pv<num> - pack fields with the same types into one line (packfields)
-r - restore package directory structure
-radix<num>- display integers using the specified radix (8, 10, or 16)
-s <ext> - output file extension (default: .jad)
-safe - generate additional casts to disambiguate methods/fields
-space - output space between keyword (if, while, etc) and expression
-stat - show the total number of processed classes/methods/fields
-t<num> - use <num> spaces for indentation (default: 4)
-t - use tabs instead of spaces for indentation
-v - show method names while decompiling

Teraz lepiej.
Otwieram Eclipse a w nim ostatnio stworzony projekt aquarium.
Przechodzę do klasy InfoController. Klikam myszką na nazwę interfejsu Controller i naciskam klawisz F3



Source not found czyli źródła niepodpięte.
Czas zainstalować wtyczkę JadClipse. Pobieram jadclipse3.3 i kopiuję do katalogu plugins Eclipse Ganymede. Restart IDE.
W menu Window/Preferences... pojawiła się pozycja Java/JadClipse czyli wtyczka wydaje się, że działa. Wskazuję położenie pliku wykonywalnego jad na /opt/jad/jad


Ponownie naciskam F3 kiedy mam zaznaczoną nazwę interfejsu InfoController.


Widzę kod, czyli działa. Przechodzę dalej do klasy ModelAndView


No, pełen sukces.