niedziela, 27 maja 2012

Dzielenie modulo

Dzielenie modulo zwraca resztę z dzielenia. Tzn jeżeli dzielimy liczbę całkowitą przez drugą całkowitą (bo tylko na takich liczbach operacja ta jest dozwolona) to często wynikiem jest ułamek. np wynik dzielenia 3/2 będzie 1 (jeżeli wynik ma być typu int) żeby określić jaka liczba jest po przecinku stosujemy dzielenie modulo. Wynik tego dzielenia też jest zawsze typu int. Jeżeli wynikiem dzielenia jest liczba całkowita np: 4/2=2, to wynikiem dzielenia modulo jest 0 (4%2=0). W ten sposób bada się parzystość liczby. Składnia:
liczba1 % liczba2

poniedziałek, 16 kwietnia 2012

Powershell - uruchamianie własnych skryptów

Windows jak to windows - wie wszystko lepiej. Wie lepiej od Ciebie drogi czytaczu czy Ty chcesz uruchomić własny skrypt, czy nie. Na tyle wie lepiej, że jak napisz swój skrypt w sensacyjnym powershell, to i tak go nie uruchomisz. Twój windows wie, że nie można tobie go uruchamiać. Tę wyjątkową złośliwość systemu uzasadnianą troską o Ciebie czytaczu można (na szczęście) jakoś ominąć.
Uruchom więc powershell jako administrator.
W linii komend wpisz:
Set-ExecutionPolicy RemoteSigned
teraz własne skrypty będziesz mógł uruchamiać, a te pobrane z Internetu muszą być wiarygodnie podpisane.

czwartek, 15 marca 2012

Mapy tras zgodne z architekturą REST W Rails

Twórcy Ruby on Rails dokonali dużego wysiłku aby się dostosować do architektury REST. Niektórzy określają to jako na wyrost, a inni jako na siłę. Faktem jest jednak to, że dzięki takiemu podejściu powstało wiele udogodnień. Jednym z nich jest unifikacja tras.
Tu szczegóły dla modelu Product:
w pliku routes.rb powstał zapis
map.resources :products
dzięki temu jednemu zapisowi powstała mapa tras:
Metoda Ścieżka Akcja Metoda pomocnicza
GET /products index products_url
GET/products/newnewnew_product_url
POST/productscreateproducts_url
GET/products/1/editeditedit_product_url(:id => 1)
PUT/products/1updateproducts_url(:id => 1)
GET/products/1showproduct_url(:id => 1)
DELETE/products/1destroyproduct_url(:id => 1)

piątek, 9 marca 2012

Warunkowy operator trójargumentowy lub po prostu '?'

Nigdy nie mogę zapamiętać tej składni więc raz na zawsze sobie to tutaj zapiszę.
Zapis
label = length == 1 ? " argument" : " argumenty"
Powyższe wyrażenie przypisuje do zmiennej label łańcuch tekstowy w liczbie pojedynczej lub mnogiej. Oczywiście w zależności od wartości logicznej warunku
length == 1
Jeśli warunek jest prawdziwy to liczba pojedyncza, jeśli warunek jest fałszywy, to liczba mnoga.

poniedziałek, 13 lutego 2012

Jak usunąć plik z repozytorium GIT'a nie usuwając go z dysku

Jak?
Ano tak:
git rm --cached mylogfile.log

Czasami jest jeszcze gorzej. Okazuje się, że wpisanie nazwy pliku do .gitignore niczego nie zmienia! Wcale nie jest ignorowany, a wszystkie zmiany dokonują się z pominięciem tego wpisu. Nie pytaj mnie dlaczego taki idiotyzm nadal funkcjonuje. Funkcjonuje. I tyle.

Tak to zmienić:
git rm -r --cached .
git add .
git commit -m "fixed untracked files"

Pamiętaj o kropkach na końcu.

Pojawianie się zmodyfikowanych plików zaraz po "clone" w GIT'cie

Zainicjowanie w GIT'cie nowego repozytorium to
git clone ssh://nazwa_uzytkownika.serwer.pl/ nazwa_repo
Standardowo zaraz po tej operacji wszystkie zaciągnięte pliki są gotowe do edycji, ale nie edytowane. Innymi słowy
git status
nic nie pokazuje.
Niestety czasami (oczywiście w Windows) zaraz po tej operacji git status pokazuje kupę właśnie co wyedytowanych plików. Jest to arcyirytujące i nie mija po wykonywaniu ślepych commit'ów itp. Bywa, że po dowolnym pull'u problem znów odradza się niczym fenix z popiołów.
Okazało się, że problem tkwi w windowsowych znacznikach końca linii CRLF.
Wystarczy na repozytorium wywołać:
git config core.autocrlf false
i wszystko wraca do normy.

Problem ten opisany jest szczegółowo tutaj:
http://stackoverflow.com/questions/5009096/files-showing-as-modified-directly-after-git-clone

piątek, 20 stycznia 2012

Jak wyeleminować duplikaty w tabelach złączeń

W standardowej asocjacji Rails zwanej has_and_belongs_to_many do utworzenia złączenia pomiędzy dwoma tabelami potrzebna jest trzecia tabela z parami kluczy id. Na przykład tabele firms i categories łączy tabela categories_firms. Włożenie do tej tabeli pary kluczy łączy daną firmę z kategorią. Problem w tym, że system dopuszcza wkładanie dowolnej ilości par kluczy. Pomaga w wielu wypadkach zastosowanie zapisu :uniq => true tak jak tu w modelu firm:
has_and_belongs_to_many :categories, :uniq => true
ale niestety nie zawsze.
Aby zabezpieczyć się przed umieszczaniem duplikatów najpierw robimy migrację, która przygotuje unikalny indeks zabezpieczający bazę danych przed zduplikowaniem wpisu:
.
add_index :categories_firms, [ :category_id, :firm_id ], :unique => true, :name => 'unique_by_category_and_firm'
.
Teraz co prawda nie da się zrobić duplikowanego wpisu, ale baza danych wywala błędy.
Przjdźmy więc do modelu firmy i tam dopiszmy do has_and_belongs_to_many:
.
has_and_belongs_to_many :categories, :uniq => true, :before_add => :validates_category
.
czyli zanim dokona się wpisu należałoby wykonać jakąś walidację:
def validates_category(category)
  raise ActiveRecord::Rollback if self.categories.include? category
end

Proste, łatwe i przyjemne.

Inspirację zaczerpnąłem z
http://stackoverflow.com/questions/4988630/habtm-uniqueness-constraint