wtorek, 18 lutego 2014

Kopiowanie plików w Javie

Ze względu na kompatybilność wsteczną robię to tak:
private static void copyFileUsingFileChannels(File source, File dest)
  throws IOException {
 FileChannel inputChannel = null;
 FileChannel outputChannel = null;
 try {
  inputChannel = new FileInputStream(source).getChannel();
  outputChannel = new FileOutputStream(dest).getChannel();
  outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
 } finally {
  inputChannel.close();
  outputChannel.close();
 }
}
Rzecz zaciągnięta ze strony http://examples.javacodegeeks.com/core-java/io/file/4-ways-to-copy-file-in-java/. Polecam ją przejrzeć, gdyż są na niej inne przykłady włącznie z najprostszym wykorzystującym rozwiązania z Java 7.

czwartek, 30 stycznia 2014

Dynamiczne dodanie pola do obiektu w Ruby

Czasami takie pole na jakiś czas okazuje się potrzebne.
Więc robię to tak:
@customer = Customer.find(1)
@customer.class.module_eval { attr_accessor :age}
@customer.age = 69 #już niemłody

wtorek, 10 grudnia 2013

Usunięcie plików katalogu tmp z repozytorium GIT

Niejednokrotnie pisałem tutaj o cieniach pracy z GIT'em. Kulawość (przepraszam za kolokwializm) tego systemu zwala z nóg. Niektórzy mówią "dno" i nie jestem do końca pewien, czy by im właśnie nie przyklasnąć. Ot chociażby kwestia pliku .gitignore.
W książkach (chociażby http://progit.org/book/pl/ albo http://helion.pl/ksiazki/git-rozproszony-system-kontroli-wersji-wlodzimierz-gajda,gitroz.htm) znajdziemy informacje jakoby umieszczenie nazwy pliku bądź katalogu w .gitignore spowoduje to, że GIT przestanie je śledzić. Czytasz to? To chyba już wiesz, że tak nie jest! Opisują to różni biedacy (jak nie przymierzając ja) borykający się z tym problemem na przykład tutaj http://stackoverflow.com/questions/6317169/using-gitignore-to-ignore-but-not-delete-files. Różne rady padają.

Mi pomaga to:

Jeśli zrobiłeś już
git add .
a potem commit i właśnie katalog tmp lub log znalazł się w repozytorium GIT'a? To teraz przenieś na bok całą zawartość danego katalogu. Zrób commit. W pliku .gitignore umieść dany katalog. Wrzuć z powrotem zawartość katalogu tmp lub log. Wyślij list do Linusa aby zobaczył jak to się robi w Bazaar. Nic nie wskórasz, ale będziesz miał spokój.

piątek, 7 czerwca 2013

VIM - poprawne formatowanie kodu html w plikach PHP

Podczas edycji kodu php te części, które pisze się w czystym html nie są poprawnie formatowane w vim'ie.
Jest na to rada, a właściwie łata:
:set ft=html
i już poprawnie formatuje się html (ale niepoprawnie php)
więc można powrócić:
:set ft=php

wtorek, 23 kwietnia 2013

Operator trójargumentowy w Javie

Przypomnienie składni:
zmienna = warunek ? wartosc_jak_prawda  : wartosc_jak_falsz;
na przykład:
String message = object.getMessage().equals("") ? "brak wiadomości" : object.getMessage();

poniedziałek, 22 kwietnia 2013

Zaokrąglanie liczb w Javie przy użyciu DecimalFormat

Zawsze zapominam :-)
double kilobytes = 123.45678;
DecimalFormat df = new DecimalFormat("###.##");
System.out.println("kilobytes (DecimalFormat) : " + df.format(kilobytes));
Tylko żebyś się nie zdziwił, że w liczbie jest przecinek zamiast oczekiwanej kropki jak podałem w formacie "###.##". Otóż Java nie interpretuje tego dosłownie. Kropka jest tutaj znakiem odstępu dziesiętnego. W przypadku lokalizacji polskiej naszym naturalnym znakiem jest przecinek i stąd ta różnica.
Aby zamienić w pojedynczym miejscu przecinek na kropkę można użyć łaty:
df.format(kilobytes).replace(",", ".");
Aby zaś zastosować to na stałe użyj lokalizacji, dla której właściwym znakiem jest kropka. Na przykład amerykańskiej.
Można tymczasowo:
System.out.println(String.format(Locale.US, "%f", 3.141592));
a można na stałe:
Locale.setDefault(Locale.US);

Poprzedzanie i kończenie zerami

W którejś aplikacji potrzebowałem wiodących i kończących zer. Aplikacja współpracująca potrzebowała takiego formatu "00.000":
liczba wymagany format
1 01.000
2,03 02.030
2,45 02.450
14,035 14.035

Zastosowałem więc takie rozwiązanie:
Float x = 2.35f;
DecimalFormat df = new DecimalFormat("00.000");
System.out.println(df.format(x).replace(",", "."));
na wyjściu otrzymałem:
02.350

wtorek, 2 kwietnia 2013

Kolekcja w Javie

Krótki opis kolekcji w Javie, z których zawsze jakiegoś szczegółu nie pamiętam i muszę szukać. Chciałem, choć w telegraficznym skrócie tutaj to zebrać.
Kolekcja Opis
ArrayList Sekwencja indeksowana i zmiennych rozmiarach
LinkedList Sekwencja uporządkowana umożliwiająca efektywne wstawianie i usuwanie dowolnej pozycji
HashSet Kolekcja nieuporządkowana, która nie dopuszcza duplikatów.
TreeSet Zbiór uporządkowany. Nie dopuszcza duplikatów
EnumSet Zbiór wartości typu wyliczeniowego. Nie dopuszcza duplikatów
LinkedHashSet Zbiór zapamiętujący kolejność wstawiania elementów. Nie dopuszcza duplikatów.
PriorityQueue Kolekcja pozwalająca na efektywne usuwanie najmniejszego elementu.
HashMap Struktura danych przechowująca asocjacje klucz -> wartość.
TreeMap Mapa o kluczach uporządkowanych.
EnumMap Mapa, której klucze należą do typu wyliczeniowego.
private enum BmiComponentNames {MASS, TALL}
EnumMap<BmiComponentNames, Float> bmiComponents = new EnumMap<BmiComponentNames, Float>BmiComponentNames.class);
bmiComponents.put(BmiComponentNames.MASS, 79f);
bmiComponents.put(BmiComponentNames.TALL, 185f);
LinkedHashMap Mapa zapamiętująca porządek, w którym umieszczane były asocjacje.
WeakHashMap Mapa, której wartości mogą być odzyskiwane przez mechanizm odzyskiwania nieużytków, gdy nie są używane nigdzie indziej.
IdentityHashMap Mapa o kluczach porównywanych za pomocą operatora == a nie metody equals()

Główne różnice pomiędzy implementacjami

List Set
Dopuszcza duplikaty. Nie dopuszcza duplikatów.
Kolekcja uporządkowana. Kolekcja nieuporządkowana.
Używa metody equals() do porównywania elementów podczas wstawiania.
Najpopularniejsze implementacje: ArrayList, Vector, LinkedList
Ciekawe omówienie różnic pomiędzy ArrayList, a LinkedList.
Najpopularniejsze implementacje: HashSet, TreeSet, LinkedHashSet
Na podstawie artykułów w Internecie oraz książki Horstmana i Cornella "Core Java 2 Techniki Zaawansowane".