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 o 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".

sobota, 23 lutego 2013

Króciutko o wysyłaniu emaili w Rails

Tworzę sobie model. Roboczo nazwijmy go UserMailer. Dziedziczy on po ActionMailer::Base. W modelu tym ustawiam metody, z których każda jest wzorem wysyłanego emaila.

Na przykład dla newslettera tworzę:
def newsletter(newsletter, email)
  recipients email
  from "#{Options::Program_name} - newsletter :: <#{Options::Email}>"
  subject newsletter.subject
  sent_on Time.now
  body({
               :body => newsletter.body
       })
end
Przekazane parametry to:
  • newsletter - obiekt zawierający dane dla newslettera takie jak choćby temat;
  • email emaile (emaile) do wysyłki
Zmienna generowana przez metodę newsletter, a nazywająca się :body wystąpi w widoku.
Więcej na temat konstrukcji metod dla ActionMailer można znaleźć na stronie rails http://apohllo.pl/guides/action_mailer_basics.html

Jeśli już mam metodę, to przygotowuję dla niej widok. Dla takiej konfiguracji, jaką opisuję widoki winny być umieszczone w folderze /views/user_mailer czyli w nazwie zgodnej z nazwą modelu.

Widok powinien być standardowym plikiem html.erb z dopiskiem .text. W naszym przypadku dla metody newsletter widok powinien się zwać nomen omen newsletter.text.html.erb albo newsletter.text.erb. W widokach należy unikać stosowania zewnętrznych styli i w ogóle ograniczyć zabawę ze stylami, gdyż w klientach mailowych źle się to wyświetla. Należy raczej pozostać przy dawnym formatowaniu przy pomocy tabel.

Przykładowy plik widoku (powinien być poprzedzony inwokacją doctype, meta, head i innymi, których nie wpisuję, gdyż blogger się burzy):
Tu jest jakiś nagłówek ...................................
<%= @body %>
A tu jest jakaś stopka ...................................
W tym widoku najważniejsza jest zmienna @body, którą definiowaliśmy w metodzie jako :body.
Pozostało już tylko jakoś wywołać tego newslettera. Robię to tak:
UserMailer.deliver_newsletter(newsletter_data, "jan.testowy@test.pl")
W metodzie deliver_newsletter() po podkreślniku występuje nazwa metody, którą klasa UserMailer ma wywołać. Obiekt newsletter_data zawiera w swych polach dane do wysyłki newslettera. Na przykład newsletter_data.subject zawiera temat newslettera.

piątek, 9 listopada 2012

Instalacja Ant'a w systemie Windows 7 oraz przystosowanie go do przesyłania danych po ftp

Jak zwykle jakieś schody. Ant jako oprogramowanie Open Source nie ma jakiegoś specjalizowanego instalatora. Wszystko trzeba zrobić "rękami". Kilka stopni prowadzących do zadziałania Ant'a zwindowsami:
  • Ściągnij Ant'a z ant.apache.org i rozpakuj do dowolnego katalogu. Dla skupienia uwagi przyjmijmy, że to będzie D:\Ant
  • Teraz trzeba ustawić zmienne systemowe, a dokładnie ANT_HOME. W naszym przypadku ANT_HOME=D:\Ant. Uwaga! W zmiennych systemowych JAVA_HOME i ANT_HOME nie może wystąpić na końcu znak cudzysłowu (") ani slash/backslash (/) lub (\). Nie pytajcie mnie dlaczego!
  • System musi posiadać zmienną Path do katalogu Ant'a bin, czyli do zmiennej systemowej Path po średniku dodajemy D:\Ant\bin. Po tej operacji wejdźmy do konsoli systemowej i zawołajmy ant. Powinien nas poinformować, że plik build.xml nie istnieje. To jest normalne zachowanie. Wszelkie inne komunikaty sugerują błędy.
  • Mimo, że Ant działa, to nadal niestety nie będzie można przesyłać nim plików po ftp ani korzystać z możliwości sieciowych. Potrzebne nam będą jeszcze dwie biblioteki: http://commons.apache.org i jackarta-oro. Pobieramy je, rozpakowujemy i wyciągamy jedynie pliki jar. Pliki te hurtem skopiujmy do katalogu lib Ant'a, czyli w naszym przypadku D:\Ant\lib. Powinno działać. Ale nie działa! Dlaczego? Nasz ukochany Windows...
  • Odpalmy konsolę w trybie administracyjnym i wpiszmy w niej:
    netsh advfirewall set global StatefulFTP disable
    
    teraz powinno zadziałać.

czwartek, 8 listopada 2012

Różnica pomiędzy delete a destroy w Rails

Najkrócej rzecz ujmując operacja delete wykonuje SQL DELETE z pominięciem wszelkich callbacków w Rails. Jest to więc rozwiązanie szybkie i wydajne.

Jeśli natomiast chcemy aby Rails panowało nad wszystkim zastosujmy destroy. Wolniej ale w zgodzie z wszelkimi regułami pisanej przez nas aplikacji.

Używanie w Rails tekstu typu String zamiast nazwy pola, metody, alboasocjacji

Czasami występuje potrzeba aby w Rails wywołać jakąś asocjację w kodzie ale zamiast standardowego kodu niech nazwy asocjacji będą stringami.

Czyli zamiast pisać tak:
customer=Customer.find(params[:id])
customer.orders.each do |order|
  # ... tu jakieś operacje z użyciem order ....
end

możemy napisać tak:
customer=Customer.find(params[:id])
customer.send("orders").each do |order|
  # ... tu jakieś operacje z użyciem order ....
end

wtorek, 30 października 2012

Jak przenieść emaile i profil Thunderbirda z komputera na komputer

Oczywiście standardowe zachowania Thunderbirda nie przewidują takiej skomplikowanej operacji. Trzeba więc radzić sobie jakoś samemu.

Oto przepis:

Na nowym komputerze instalujemy świeżą wersję Thunderbirda.
Ze starego komputera kopiujemy pocztę do nowego, dokładnie w takim samym katalogu, w jakim była na starym. Dla skupienia uwagi przyjmijmy, że na starym komputerze cała poczta była w katalogu D:\mail, to i na nowym powinna znaleźć się na D:\mail. Maile przeniesione. Ale co z tego, skoro Thunderbird nic o tym jeszcze nie wie? Potrzebny nam będzie profil Thunderbirda ze starego komputera. Jak go znaleźć? Ano tak:
type %AppData%\Thunderbird\profiles.ini
Nas zainteresuje linijka zaczynająca się od słowa "Path". Podaje ona gdzie dokładnie znajduje się katalog z profilem. Przyjmijmy, że profil jest w katalogu "D:\Users\admin\profile". Kopiujemy więc cały ten katalog ze starego komputera na nowy. Tu już nie jest ważne w jakim katalogu profil się ten znajdzie. Załóżmy, że przekopiujemy na nowym komputerze go do folderu D:\profile.
Prawie gotowe. Wystarczy tylko na nowym komputerze wyedytować plik %AppData%\Thunderbird\profiles.ini i w linijce "Path" wpisać położenie profilu. W naszym przykładzie będzie to D:\profile. Warto jeszcze sprawdzić wpis "IsRelative=0". Jeśli używamy ścieżki z nazwą dysku jak w tym przykładzie, to musi tu być koniecznie 0 (zero).
Teraz odpalamy Thunderbirda i cieszymy się nową (starą) instalacją.

piątek, 21 września 2012

Jak przesłać więcej niż jedną zawartość pola Ajaxem

W Ruby on Rails jest bardzo wygodna pseudokontrolka observe_field. Jednak w swojej podstawowej postaci można przesłać zawartość tylko tego pola, które jest obserwowane. Aby przesłać za jednym razem zawartość większej ilości pól trzeba się trochę pogimnastykować:
<%= f.text_field :first_name %>
<%= f.text_field :last_name %>
<%= observe_field "employee_last_name",
            :url => {:action => :nazwa_metody_w_kontrolerze},
            :update => "div_to_update",
            :frequency => 1,
            :with => "Form.serializeElements($('employee_last_name', 'employee_first_name'))" %>
No i jest. Teraz w metodzie nazwa_metody_w_kontrolerze zmienna parameters dostarcza nam imię i nazwisko pracownika w postaci:
params[:employee][:first_name]
params[:employee][:last_name]