piątek, 19 września 2014

Wstawienie własnego parametru do ścieżki Paperclip'a

W którymś ze swoich projektów potrzebowałem aby obrazki gromadzone przez użytkowników aplikacji gromadzone były w katalogach firm, do których należą owi użytkownicy. Oczywiście w parametrze "path" Paperclip'a nie występuje nic podobnego do "firm_id".

Innymi słowy chciałem zapisać coś takiego:
has_attached_file :scan_picture, :styles => {:thumb => '50x50>'},
                  :default_url => '/images/:style/missing.png',
                  :url => "/system/scan_pictures/:firm_id/:id/:style/:basename.:extension",
                  :path => ":rails_root/public/system/scan_pictures/:firm_id/:id/:style/:basename.:extension"


Jest to jednak możliwe :-)
Zrobiłem tak:
w katalogu /config/initializers stworzyłem plik paperclip_interpolations.rb
w tym pliku umieściłem zapis:
Paperclip.interpolates('firm_id') do |attachment, style|
  attachment.instance.move_out.customer.firm_id.to_s.parameterize
end
Tłumaczyć to można tak:
Weź egzemplarz klasy, która wywołuje dołączanie pliku (attachment.instance), pobierz z niego obiekt wyjazd (move_out), a z niego klienta i firmę, do której klient należy. Przekształć firm_id na string i użyj metody prametrize.
No i aby powyższe lepiej zrozumieć można przytoczyć jeszcze specyfikację MoveOut (wyjazd):
class MoveOut < ActiveRecord::Base
  belongs_to :customer
end

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