Witaj na blogu prowadzonym przez Sebana. Spisuję tutaj swoje uwagi na różny temat. Przeważają tematy związane z Internetem, popieranymi przeze mnie rozwiązaniami dotyczącymi wykorzystania komputerów, oraz kilka innych. Przeczytasz tu również recenzje książek IT.
UJS, atrytuby data-* w Rails 3
20 września 2010 | Klucze:
it,
programowanie,
rails,
Techblog
8 komentarzy. trackback
Ostatnio sporo radności i satysfakcji daje mi zabawa z nowymi Railsami. Pisząc nowymi mam na myśli nowinki jakie pojawiły się w Rails 3. Ponieważ mam podejście do "jeśli piszę coś w domu i nikt mnie nie ogranicza to użyję coś czego nie mam okazji używać nacodzień". W końcu trzeba się czegoś nowego czasem nauczyć ;). I tak ostatnio trochę bawiłem się jQuery w Rails 3.
Każdy kto śledził nowości w Rails 3 wie, że teraz na topie jest "unobtrusive JavaScript" i korzystanie z niestandardowych atrybutów data-*. I tak to co w wcześniejszych wersjach wypluwał helper:
wstawiało jakieś wstrętne i rozwlekłe kody JS, a teraz wygląda tak:
link_to 'Delete', object_path(object), :confirm => "Are you sure?", :method => :delete
<a href="/object/1024" data-method="delete" data-confirm="Are you sure?">Delete</a>Przez to kod wypluwany przez metody pomocnicze nie ma bezpośrednio do czynienia z kodem JavaScript i nie ma znaczenia czy jest używany Prototype, jQuery czy coś jeszcze innego. Obsługa tego typu helperów umieszczona jest standardowo w pliku public/javascripts/rails.js. Poniżej zademonstruję jak zaimplementować obsługę własnych atrybutow data-*.
Przykładowe zadanie: wyświetlać ilość wpisanych w textarea znaków.
W widoku będzie coś takiego:
= form_for(:message, :url => messages_path, :html => { :class => "form", :id => "new_message_form" }) do |f| = f.text_area :body, "data-counter" => "span#message-counter" # bla bla blaW rezultacie zostanie wypluty HTML:
<form action="/messages"> <textarea name="message_body" data-counter="span#message-counter" /> </form>Aby licznik automatycznie się odświeżał należy dopisać jego obsługę w JS, ja użyłem jQuery i zrobiłem to tak:
$(document).ready(function() { $(document).find('*[data-counter]').each(function(element) { var counter = $($(this).attr('data-counter')); $(this).keyup(function(event) { counter.html($(this).val().length) }) }) })Trzeba tylko pamiętać by plik JS ładować w szablonie za pomocą javascript_include_tag.
Ciekawe linki na podobny temat:
- Dynamically removing some website content in Rails 3 Way (Prototype, UJS) Robert Pankowecki opisał coś takiego przede mną, nie ukrywam, że wzorowałem się na nim i jego wpis trochę otworzył mi oczy. Dzięki Robert!
- jQuery with Rails 3 - opis jak zastąpić standardowy rails.js tym, który korzysta z jQuery
Rails 3 + Ruby 1.9.2 + Megiteam
04 września 2010 | Klucze:
programowanie,
rails,
ruby,
Techblog
2 komentarze. trackback
Jak powszechnie wiadomo Rails 3 zostało wydane. Niektórzy niecierpliwi (w tym ja) już wcześniej bawili się wersjami beta i release candidate. Kilka osób już chwaliło się udanymi przejściami z wersji 2.3 na 3.0. Dla mnie Rails 3 to przede wszsytkim okazja na przejście z Ruby 1.8 do 1.9. Dziś opiszę w jaki sposób uruchomiłem tandem Rails 3.0 - Ruby 1.9.2 na hostingu współdzielonym Megiteam.
Ruby 1.9.2
Moja ulubiona firma hostingowa - Megiteam już od dłuższego czasu dawała możliwość korzystania z Ruby 1.9.1-p0. Jak zrobić to krok bo kroku w pomocy Megiteam. Bułka z masłem. Napisałem maila do Pani Magdy i po godzinie wersja była podbita do 1.9.2. Jedyną rzeczą jaką musiałem zrobić, a której nie ma w ww. artykule to dopisanie katalogu z plikami wykonywalnymi gemów do PATH: /home/seban/www/.ruby/gems/1.9/bin/. Pierwszy sukces! Tak, pewnie można zrobić to za pomocą rvm, jednak ja nie próbowałem.
Bundler
Jeśli nie wiesz co to jest Bundler zachęcam do przeczytania artykułu w serwisie rubysfera.pl.
Instalacja bundlera: gem install bundler. Nie powinno być najmniejszych problemów. Drugi sukces!
Thin
Megiteam daje trzy możliwości uruchamiana aplikacji Rails:
- Mongrel, Ruby 1.8
- Thin, Ruby 1.8
- Thin,Ruby 1.9
Deploy
Deploy za pomoca Capistrano nie różni się specjalnie od standardowego. Musimy jedynie zmienić dwie rzeczy:
- deploy musi uwzględniać użycie bundlera
- restart aplikacji musi się odbyć za pomocą meigteamowego skryptu 'restart-app'
Restart aplikacji już kiedyś opisywałem. Cały Capfile dostępny jest w formie gista.
Wykonuj swoje testy szybciej - devver.net
18 sierpnia 2009 | Klucze:
Ogólne,
rails,
ruby,
Techblog
5 komentarzy. trackback
Trzy dni temu otrzymałem od a
devver.net jest serwisem, który pozwala uruchamiać testy
aplikacji napisanych w Ruby na swoich własnych serwerach.
Dzięki temu testy wykonują się szybciej. Jak bardzo szybciej? Mi osobiście ciężko powiedzieć bo
jeszcze nie korzystałem (nie posiadam też projektu, który by miał na tyle długie testy). Jednak na
stronie http://devver.net/documentation/performance
można zobaczyć małe porównanie. Osobiście uważam, że sens używania takiego rozwiązania pojawia
się dopiero przy projektach do których testy wykonują się kilka minut. W firmie
mamy dwa projekty, których testy wykonują się 9 i 12 minut.
W tej chwili nie ma żadnych informacji o cenie, ale wiadomo, że opłaty na devver.net będą.
Wprowadzenie tego w swoim projekcie również jest proste. Po założeniu konta trzeba zainstalować gema, przypisać do projektu swoj API key, ściągnąć devver.rake i można testować. Jedyną różnicą (poza tym, że testy wykonują się na innej maszynie) jest zadanie rake, które trzeba uruchomić: davver:test lub davver:spec.
Ruby on Rails asset packager
02 lipca 2009 | Klucze:
Ogólne,
programowanie,
rails,
ruby,
Techblog
3 komentarze. trackback
Kazdy serwis internetowy, który zdobył popularność w sieci w końcu staje przed problemem wydajności. Problem często daje się dość prosto rozwiązać, stosując proste zasady opisane chociażby w książce Steve Soundersa High Performance Web Sites. Głównym przesłaniem jest: zmniejsz ilość żądań wysyłanych do twojego serwera. Przeglądarka wysyła żądanie za każdym razem, gdy musi coś pobrać z serwera. Plik html, css, js, jpg, ... Dla każdego obrazka, arkusza stylu, skryptu JavaScript wyśle żądanie. Im mniej będzie żądań tym szybciej klient zobaczy stronę. Logiczną wydaje się potrzeba minimalizacji ilości plików JS lub CSS. Chcę pokazać plugin do Ruby on Rails asset_packager, który potrafi spakować dla nas pliki CSS i JS w jeden duży.
Plugin ma w zasadzie prostą ideę: złącz pliki w jeden i usuń to co nie jest w nich potrzebne (komentarze etc.). Jednak nie jest to taki zwykły prosty skrypcik do łączenia plików. Plugin ma możliwość tworzenia wielu paczek z plików, które zostaną mu wskazane. Takie ustawienia pluginu zapisane w pliku config/asset_packager.yml sprawią, że zostaną utworzone dwie paczki dla JavaScriptu i stylów. Pierwsza paczka JS "base" składa się z pięciu plików, druga "secondary" z dwóch. Pojedyńczy plik CSS/JS może znajdować się w wielu paczkach. Możemy serwować różne paczki dla zalogowanych użytkowników i inne dla niezalogowanego użytkwonika odwiedzającego stronę. Taką polityke stosuje serwis pomagający zarzadzać finansami - benefi.pl. Złączone paczki nie są generowane w locie kiedy trzeba, należy je utworzyć ręczkie poprzez odpowiednie zadanie rake: rake assets:build_all. W layoutcie należy użyć helpera javascript_include_merged i stylesheet_link_merged.
Wrzucanie takich połączonych paczek do repozytorium i przebodowywanie ich za każdym razem gdy zmienimy cokolwiek w CSS lub JS to jakieś nieporozumienie i aż prosi się o sytuację "zapomniałem przebudować pliki". Zamiast tego proponuję dodać małe zadanie do Capfile: Zadanie będzie wykonywało się automatycznie zawsze gdy zrobimy deploy aplikacji na zdalny serwer. Proste i przyjemne.
Vim on Rails
01 lutego 2009 | Klucze:
Ogólne,
rails,
ruby,
Techblog
7 komentarzy. trackback
Za polską Wikipedią
Vim według oficjalnej interpretacji oznacza vi improved. Jest to najpopularniejszy, najbardziej rozbudowany, wieloplatformowy klon edytora tekstu vi, napisany przez Brama Moolenaara, holenderskiego programistę. Vim należy do grupy wolnego oprogramowania o otwartym kodzie źródłowym. Pierwsza wersja została wydana w 1991 roku.Chyba każdy zna. W pracy, w domu, w szkole używam NetBeans i jestem zadowolony. Jednak ostatnio zewsząd atakuje mnie vimowa propaganda!
Najpierw Jamis Buck powrócił do Vima. Potem , że prawie wszyscy tam używają Vima właśnie. Przy okazji podali kilka wskazówek jak go używają, wszystkie te palcołamańce itp. Na początku roku Fabio Akita zademonstrował jak ładnie i wygodnie można pisać w Rubym i Railsach korzystając w Vima. Ale już największym vimopropagatorem stał się Zibi w pracy. Zbyszek argumentuje to przedewszystkim ogólnym dostępem do Vima (,,jest wszędzie''), oraz tym, że czasem jak trzeba się zalogować z domu to w konsoli NetBeansa się nie odpali (a to ci odkrycie) i trzeba sobie radzić w innym edytorze. W najliższym wolnym czasie :) też dam szansę Vimowi. W sieci jest sporo zasobów: rails-vim, git-vim i inne ....
Shoulda
20 października 2008 | Klucze:
Ogólne,
programowanie,
rails,
ruby,
Techblog
Dodaj komentarz. trackback
Gdy ostatnio zacząłem pisać kolejny projekcik ,,do szuflady'' postanowiłem, że nauczę się przy nim czegoś noweog. Chciałem nauczyć się czegoś nowego o testowaniu, a w tym czasie sporo czytałem o Shoulda. Shoulda ma wprowadzić trochę BDD do standardowych testów z biblioteki Test::Unit. O Shoulda było już pisane dużo wcześniej, między innymi Dave Thomas, oraz po polsku Jarosław Zabiełło. Pewnie nie tylko oni, ale o tych dwóch tylko pamiętałem. Dużym plusem według mnie są makra testów. Są makra dla ActiveRecord oraz makra dla kontrolera. Jest też dodatkowy zestaw asercji np. assert_sent_email. Po krótkim oswojeniu testy pisze się wygodnie i szybko.
Shoulda można zainstalować jako plugin do Railsów jak i jako gem.
Osobiście nie pracowałem z innym ORM niż ActiveRecord, ale ciekaw jestem czy i jakie jest zapotrzebowanie na takie metody-makra testów dla innych ORM np. dla Data Mapper.
Utility belt
22 września 2008 | Klucze:
rails,
ruby,
Techblog
1 komentarz. trackback
Chyba każdy z piszących w Ruby używa czasem irb. Niedawno odkryłem całkiem fajne dopalacze dla tej przyjemnej konsolki. Od dawna używałem Wirble, ale teraz poużywałem trochę Utility belt. Standardowe dopełnianie nazw metod, czy nazw zmiennych to nic szczególnego. Z poziomu Utility-belt można odrazu uruchomić edytor, czy wysłać jakiś kawałek kodu do Pastie. Ten gem szczególnie powinien zainteresować posiadaczy systemu spod znaku jabłuszka bo wiele jego funkcji działa tylko z Mac OS X. Ale co ja będę pisał, najlepiej zobaczyć filmik (lektor po portugalsku - chyba).
Ruby IRB + Utility Belt from Fabio Akita on Vimeo.
Stack Overflow
15 września 2008 | Klucze:
it,
Ogólne,
programowanie,
rails,
Techblog
7 komentarzy. trackback
Czy szukaliście kiedyś rozwiązania jakiegoś problemu programistycznego, potrafiliście go dokladnie opisać, ale nie mogliście znaleźć odpowiedzi w przepastnych zasobach internetu? Z jeśli już znajdowaliście jakieś rozwiązanie to dostęp do niego był płatny? Co za ból ... Albo rozwiązanie problemu dotyczyło jakiś prehistorycznych wersji bibliotek lub czegokolwiek innego i oczywiście w waszym przypadku nie działało? Frustrujące. Dziś na Joel on Software przeczytałem o stackoverflow.com.
Stack Overflow jest serwisem przeznaczonym dla programistów wszelkiej maści. Idea jest prosta: zadajesz konkretne pytania, ludzie piszą odpowiedzi. Odpowiedzi można oceniać, edytować. Oczywiście wszystko ładnie podane na tagowej chmurce. Sami autorzy określają to jako ,,wikipedia dla programistów''. Jeśli aktualnie nie masz problemów żadnych (szczęściarz z Ciebie!) to możesz sprawdzić swoją wiedzę i odpowiedzieć na pytania zadane przez innych. Czyż to nie proste? Keep It Simple, Stupid!
Warto chyba wiedzieć o tym serwisie i dodać do zakładek. Kto wie, może w przyszłości będzie to pokaźny zbiór wiedzy.
Wyniki ankiety
07 września 2008 | Klucze:
programowanie,
rails,
ruby
2 komentarze. trackback
Tydzień temu opublikowałem ankietę z której chciałem się dowiedzieć czegoś więcej o polskim światku wokół języka Ruby. Dziś prezentuję jej wyniki.
Ogólnie
Tutaj nie ma co się łudzić na inne wyniki, prawie sami faceci (82) i tylko 2 kobiety.
Więszość odpowiadających się z wieku ,,studenckim'' między 19, a 24 rokiem życia.
Większość odpowiadających mieszka w dużym mieście. Osobiście spowiedziałem się więcej osób z Warszawy. Zaskoczeniem dla mnie jest duża ilość (13) osób z małych miasteczek poniżej 20 tysięcy mieszkańców.
Wśród odpowiadających zdecydowanie dominuje wykształcenie wyższe (32) i można to tłumaczyć wiekiem biorących udział w ankiecie. Wyniki się pokrywają.
Programowanie
Jak długo programujesz?
Czym dla Ciebie jest programowanie?
Zaznacz języki programowania, które znasz
Pytania dotyczące Rubiego
Rubiego ...
Jak długo znasz Ruby?
Jakiego edytora/IDE używasz?
W Twojej pracy Ruby jest?
Czy wiążesz swoją przyszłość zawodową z Ruby?
Skąd czerpiesz swoją wiedzę na temat Ruby?
Z których narzędzi korzystasz?
Raczej nie czuję się zaskoczony przez ogólne wyniki tej ankiety. Chociaż pewne rzeczy mnie dziwią. Spodziewałem się, że jednak Java będzie popularniejsza od C/C++. Na plus mogę zaliczyć to, iż wiedza jest poszukiwana w wielu miejscach i rozkłada się to w miarę równo. Nadal wielu ludzi nie piszde testów z tego co widzę. Narzędzia, które nie są mainstremowe (RoR 2.X, Mongrel) są raczej niepopularne.
Dokładniejsze wyniki opublikowane w Google Docs
Programista-sadysta
04 sierpnia 2008 | Klucze:
programowanie,
rails,
ruby,
Techblog
3 komentarze. trackback
Dziś pokażę kilka metod używanych przez sadystycznych programistów to znęcania się nad swoim kodem źródłowym ... i sobą czasem też.
Flog
Flog to zabaweczka przygotowana przez ruby.sadi.st, a jej zadaniem jest ,,punktowanie'' kodu źródłowego.
% flog model.rb
Total score = 14.1985433422944
Finance#none: (11.8)
2.2: named_scope
2.2: belongs_to
1.6: month
1.4: ago
1.3: branch
1.3: lambda
1.1: assignment
1.1: validates_numericality_of
1.1: validates_length_of
0.8: lit_fixnum
,,Najciężyszym'' kodem według Floga jest Because that's what I decided felt right based on experience.
Heckle
Heckle to kolejna zabawka od ruby.sadi.st. Zadaniem Heckla jest mutować napisany przez nas kod tak by
rcov
O tak! rcov jest tym co lubię i tym czego często używam. Rcov służy do sprawdzenia pokrycia kodu przez testy. W uproszczeniu jest to uruchomienie testu i sprawdzanie, które linie kodu źródłowego zostały uruchomione. Wyniki mogą być prezentowane bezpośrednio na wyjściu lub generowania plików HTML pokazujących pokrycie. 
Kolejną zabawką jest Saikuro - analizator złożoności kodu. Sprawdza on długość metod (ilość linii) oraz złożoność tychże. Przykładowe rezultaty Saikuro. Czym większy współczynnik złożoności tym gorzej. Taka metoda jest ciężka do zrozumienia i przetestowania np. by ją w pełni przetestować trzeba uwzględnić 20 przypadków testowych.
Narzędziem, które integruje to wszystko w jedno jest Metric_fu plugin do Railsów. Bardzo fajne efekty można osiągnąć łącząc go z narzędziami do ciągłej integracji.
Może mały konkurs kto ma najwięcej punktów we Flogu i największy wynik w saikuro? Kto się odważy? ;)
Walidacja numeru VAT w Active Record
15 lipca 2008 | Klucze:
Ogólne,
programowanie,
rails,
ruby,
Techblog
Dodaj komentarz. trackback
W jednnym z projektów wykonywanych w pracy musiałem zadbać o poprawność wprowadzanego Europejskiego numeru VAT. Numer jak numer, kilka liter, kilka cyfr, łatwo sprawdzić za pomocą validates_format_of. Jednak sam numer to coś więcej. Musiałem weryfikować jego poprawność z centralnym zbiorze tych europejskich numerów. Na szczęście jest coś takiego jak VIES, który udostepnia nie tylko formularz na stronie, ale także webservice.
Do tego celu napisałem własny walidator - validates_as_vat_number. Całość leży sobie na Githubie i można spokojnie używać. Przykład:
class TestRecord < ActiveRecord::Base def self.columns; []; end attr_accessor :vat_number, :country_code validates_as_vat_number :vat_number, :scope => :country_code endBy poprawnie zwalidować number potrzebny jest samo numer i kraj dla którego będziemy ten numer sprawdzać, dlatego niezbędny jest
W wolnej chwili chcę jeszcze dopisać możliwość ustawiania
Deploy na Megiteam 2
16 czerwca 2008 | Klucze:
programowanie,
rails,
Techblog
3 komentarze. trackback
Deployment na Megiteam już kiedyś opisywałem. Wtedy Magda Zarych obiecywała specjalny skrypt do restartowania aplikacji by ich brutalnie nie ubijać. Na początku czerwca obiecany skrypt został udostępniony. Trzeba było zmienić trochę zadania Capistrano.
Ponownie wszystko sprowadziło się do nadpisania deploy:restart
namespace :deploy do desc "Restart aplikacji przy pomocy skryptu Megiteam" task :restart, :role => :app do run "restart-app #{ application }" end end
By mieć spokój z hasłami i nie klepać ich kilka razy pod rząd dodałem klucze RSA do ~/.ssh/authorized_keys na serwerze Megiteam
Whiny nils w Rails
09 kwietnia 2008 | Klucze:
Ogólne,
programowanie,
rails,
ruby,
Techblog
3 komentarze. trackback
Czy zdarzyło wam się szukać błędu bardzo, bardzo długo, a na końcu krzyknąć ,,Eureka!''? Mi się w tym tygodniu zdarzyło. Dwa dni szukałem błędu w aplikacji, którą piszę w pracy. Sytuacja była o tyle dziwna, że testy wcale nie powodowały powstania tego błędu ...
Błąd pojawiał się w takiej linii:
item.unit_id = Unit.find_by_name(some_name).id rescue Unit.create!(:name => some_name)Abstrahując już od innych rzeczy w tym kodzie, szczególną uwagę należy zwrócić na rescue. W środowiskach development i test ten kod działał poprawnie. Po uruchomieniu aplikacji na środowisku ,,wstępnie produkcyjnym'' przestawał działać, pięknie rzucając wyjątkiem z poziomu MySQL o błędnym indeksie. Dopisałem sporo testów, ale to ciągle działa. Przejrzałem logi z maszyny produkcyjnej. Napisałem test w identycznymi parametrami jak request wyzwalający błąd, a to mi działa. Porównałem dla pewności jeszcze wersje gemów, nawet MySQL (tak wiem chore, ale tonący brzytwy się chwyta). Dziś rano okazało się, że wszystkiemu winne są whiny nils no i ja po części również. Poniżej przykład działania tej opcji konfigurującej środowisko.
# config.whiny_nils = true >> Unit.find_by_name("bad name") => nil >> Unit.find_by_name("bad name").id RuntimeError: Called id for nil, which would mistakenly be 4 >> Unit.find_by_name("bad name").id rescue "tworzę nowy" => "tworzę nowy"
# config.whiny_nils = false >> Unit.find_by_name("bad name") => nil >> Unit.find_by_name("bad name").id (irb):2: warning: Object#id will be deprecated; use Object#object_id => 4 >> Unit.find_by_name("bad name").id rescue "tworzę nowy?" (irb):3: warning: Object#id will be deprecated; use Object#object_idCzujecie różnicę? W drugim przypadku aplikacja nie miała nawet okazji stworzyć brakującego rekordu w tabeli Units bo nigdy nie mogło tam dojść do wyjątku, tylko ostrzeżenie (które nota bene też nie pojawiało się w logu :(). Jeśli jeszcze nie to spróbujcie kilka razy w konsoli irb nil.id lub nil.object_id. Wynik łatwy do przewidzenia ;-).
Co w tym wszystkim mnie zastanawia najbardziej? Czy domyślna konfiguracja środowisk development i test narzekająca whiny_nils na nil.id jest prawidłowa? Niby zachowanie prawidłowe bo Rails krzyczy do programisty o złym użyciu metody id, ale z drugiej strony ciekaw jestem czy wielu przechwytuje ten wyjątek i w jakiś sposób go obsługuje, nawet nieświadomie. I czemu w środowisku production ta opcja jest wyłączona? A dla Was, które ustawienie wydaje się ciekawe? Wolicie wyjątek czy ostrzeżenie?
Koniec pracy dyplomowej
01 kwietnia 2008 | Klucze:
Ogólne,
programowanie,
rails,
ruby
4 komentarze. trackback
Stało się! W minioną niedzielę oddałem moją pracę dyplomową. Oczywiście nie obyło się bez małej przygody. Panią w dziekanacie nie podobała się strona tytułowa założóna w LaTeXu. Ale poza tym, że często robią problemy z niczego, cholernie pilnują godzin zamykania dziekanatu to są bardzo miłe, pomocne i zawsze bardzo milo wspominam moje wizyty w dziekanacie. Dobra! Koniec tego primaaprilisowego pierdzenia! Co do mojej aplikacji dyplomowej.
Do napisania aplikacji potrzebowałem 53 rewizje kodu źródłowego do Subversion, w tym jedno otagowane jako FINAL, które zawiera wersję oddaną do szkoły.
Aplikacja okazała się dużo mniejsza niż przypuszczałem.
+----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Controllers | 501 | 371 | 11 | 51 | 4 | 5 | | Helpers | 38 | 33 | 0 | 2 | 0 | 14 | | Models | 597 | 255 | 16 | 32 | 2 | 5 | | Libraries | 144 | 76 | 0 | 18 | 0 | 2 | | Integration tests | 0 | 0 | 0 | 0 | 0 | 0 | | Functional tests | 1225 | 959 | 12 | 125 | 10 | 5 | | Unit tests | 632 | 473 | 12 | 64 | 5 | 5 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 3137 | 2167 | 51 | 292 | 5 | 5 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 735 Test LOC: 1432 Code to Test Ratio: 1:1.9
Pokrycie kodu przedstawia się przywoicie: 96.7 %
I to by było na tyle w kwestii mojej pracy dyplomowej. Pozostaje mi tylko obrona, na której wyznaczenie terminu czekam. Oby jeszcze w kwietniu.
Deployment na megiteam
21 marca 2008 | Klucze:
programowanie,
rails,
Techblog
Dodaj komentarz. trackback
Wdrażanie, przepychanie aplikacji napisanych w Ruby on Rails na serwer produkcyjny lub prezentacyjny bardzo często odbywa się za pomocą Capistrano. Głównym zadaniem Capistrano jest automatyzacja tego procesu. Dziś udało mi się wykonać deploy na serwery Megiteam.
Co właściwie chciałem osiągnąć automatyzując proces przepychania aplikacji na zdalny serwer? Nie szczególnie wielkiego. Pobrać świeży kod z repozytorium na zdalny serwer, zrestartować mongrela. Nic wielkiego. Jednak na Megiteam mongrel jest uruchamiany przez panel użytkownika dostępny poprzez przeglądarkę i gdyby taka instancja mongrela ,,padła'' natychmiast zostanie podniesiona
Repozytorium znajduje się na tym samym serwerze, w katalogu obok
Restart mongrela zapewnia mi inne zadanie:
Tak wiem. Brutalne, ale skuteczne. :-)
Od źródła wiem, że nie tylko ja miałem pytania związane z Capistrano. Megiteam obiecało ,,specjalny skrypt, który będzie można użyć z Capistrano''. Pozostaje tylko czekać, około miesiąca.
Nowe książki
07 lutego 2008 | Klucze:
programowanie,
rails,
ruby
5 komentarzy. trackback
Dziś do pracy dotarły książki, które już jakiś czas temu zamówiliśmy z Amazona. Książki prezentują się okazale (patrz niżej)

Nie było tylko Agile Testing with Ruby on Rails, ale będziemy to mieli jak tylko zostanie wydane. Już wcześniej dotarła do nas High Performance Web Sites.
Gdy tylko zapoznam się z jakąś z książek lepiej to postaram się ją opisać i zrecenzować.
ActiveRecord find i join
12 stycznia 2008 | Klucze:
programowanie,
rails,
ruby,
Techblog
7 komentarzy. trackback
Dziś chciałem znowu ponarzekać na ActiveRecord. Słówko 'narzekać' jest tu zastosowane na wyrost, więc proszę nie robić ze mnie zaraz wiecznego malkontenta. Problem, który dziś chcę tu opisać zauważyłem już wcześniej, ale potem zapomniałem o nim i nie czułem chęci i potrzeby opisywania go.
Wyobraź sobie drogi czytelniku, że masz takie zadanie: ,,poszukaj wszystkie projekty użytkownika o loginie 'quentin'. Modele wyglądają tak:
Można rzucić zapytaniem z JOIN
Project.find(:all, :joins => "JOIN users ON users.id = projects.user_id AND users.login LIKE 'quentin'")
i znaleźć ... Ale co właściwie znajdzie takie zapytanie? Obiekty klasy Project? Tak. Dla uproszczenia załóżmy, że powyższy Project.find zapakowałem do metody Projects.find_by_sql.
Project.find_by_login('quentin').map{ |p| p.id }
=> [1, 1]
Jeśli przez głowę przeszła Ci myśli, że to ten sam projekt znaleziony jakimś cudem dwa razy to nic mylnego. To dwa różne projekty wyciągnięte z bazy danych! Podanie :joins => w parametrach metody find tworzy hybrydę kolumn z tabel projects i users. Zapytanie SQL w wynikach zwróci dwa razy kolumnę id, a ActiveRecord zmapuje sobie wartość, którą napotka jako ostatnią czyli id użytkownika. Myśląc logicznie to AR zachowuje się dobrze SQL zwraca połączone talibce, AR je mapuje na swój użytek, robi sieczkę na kolumnach, których nazwy się powtarzają i zwraca jako obiekt szukanej klasy. Ta ostatnia część podoba mi się najmniej. Warto też zwrócić uwagę, że obiekty powstałe w wyniku takiego wyszukiwania mają ustawioną opcje readonly!
Innym rozwiązaniem jest wyszukanie użytkownika o pożądanym loginie i iterowanie po wynikach zwracając należące do niego projekty.
Bardziej jest eleganckie użycie w zapytaniu
Nie mam pretensji o takie zachowanie ActiveRecorda. Nie mam doświadczenia z innymi ORM takimi jak Sequel czy DataMaper jestem ciekaw czy one zachowują się tak samo w takich zapytaniach.
RoR tickets
09 stycznia 2008 | Klucze:
linux,
programowanie,
rails,
ruby,
Techblog
5 komentarzy. trackback
Nie dalej jak dwie godziny temu natrafiłem na problem pisząc dodawanie kontaktów w serwisie opartym o Ruby on Rails. Samo zadanie wydawało mi się raczej proste. HABTM z odwołaniem do samego siebie. Napisałem.
Nie działa. Poszukałem w ,,Rails recipes'' Chada Fowlera, tak samo. Przepisałem na wszelki wypadek. Nie działa. Nadszedł czas by popatrzeć głębiej.
W konsoli irb wpisuję
User.find(3).contacts << User.find(6)
zaglądam w log/developmeng.log i jakież wielkie było moje zdziwienie, gdy zobaczyłem
Dzięki pomocy Comboya z kanału #rubyonrails.pl trafiłem na zgłoszenie błędu
9774: HABTM inserts empty rows. Problem polegał na tym, że do nazywania kolumn używałem symboli zamiast Stringów. Po zamianie działa bez problemu.
Jednak dało mi to trochę do myślenia. Zgłoszenie nastąpiło ponad 3 miesiące temu. W Railsowym tracu priorytet zgłoszenia został zmieniony z dużego na mały. W ciągu tych 3 miesięcy, pojawiły się trzy wydania linii 1.2.x i pojawiło się wydanie 2.0.2 Railsów. A błąd nadal występuje. Nie próbowałem nigdy wczytywać się w źródła ActiveRecorda, ale to chyba nie jest jakiś błąd super trudny do usunięcia? Po premierze dwójki dało się przeczytać opionie, że RoR 2.0 to nic wielkiego. Wielu spodziewało się więcej zmian w kwestii domyślnego railsowego ORM. Chyba jednak praca nad ORM jest odłożona gdzieś na boczne tory. Mam nadzieję, że to się zmieni i ticketów będzie mniej.
Praca dyplomowa
06 stycznia 2008 | Klucze:
latex,
Ogólne,
programowanie,
rails
Dodaj komentarz. trackback
Kończę ostatni semestr informatyki właśnie teraz. Wiąże się z tym napisanie pracy dyplomowej. Temat mojej pracy brzmi ,,Internetowy system egzaminacyjny''. Pisać do ,,ma pałę'' i modlić się by źródłom aplikacji trzymanym lokalnie na dysku twardym nic się nie stało to trochę niemądre. We wrześniu udało mi się dorwać darmowy testowy okres hostingu z megiteam.pl. Okres testowy trwa 6 (słownie: sześć) miesięcy, więc jest całkiem przyjemnie. To miejsce hostingowe postanowiłem przeznaczyć na trzymanie tam repozytorium SVN kodu aplikacji i źródeł tex mojej pracy. Na serwerze dostępny Ruby, więc idealne miejsce dla takiego zastosowania.
W czwartek wieczorem wydałem polecenie: svn import . -m "Initial import" i szkielet aplikacji, zaczątek (2 strony) pracy pisanej w LaTeXu, oraz jakiś projekt UML wylądowały w repozytorium. Teraz tylko trzeba brać się do pisania.
To teraz w czego użyję:
- Rails 2.0.2 (lub nowsze), pisanie w duchu REST
- LaTeXa do pisania pracy
- bazy danych nie wybrałem jeszcze, do tej pory używałem MySQL, ale może warto spróbować Postgresa
- pisanie aplikacji wspomagać będzie NetBeans 6.0
Powtarzaj DRY
12 września 2007 | Klucze:
programowanie,
rails,
Techblog
2 komentarze. trackback
Kto zna już Rails? Kto jeszcze nie zna? Dobra, dobra. Pytanie właściwie nie ma znaczenia bo dzisiejszy wpis będzie i dla jednych i dla drugich. Jak wiele lini kodu się powtarza w źródle twoich klas? Jak wiele z nich umieściłeś w osobnej metodzie? Dziś napiszę jak chociaż trochę w prosty sposób uporządkować kontroler. To dalej bo szkoda czasu.
Nazewnictwo
Łatwo sobie wyobrazić jakis serwis z podcastami. Są ludzie dodają sobie swoje podcasty, komentują je, tagują i co tam jeszcze można robić teraz w serwisach internetowych ery 2.0. Ale zaimijmy się bardziej szczegółowo podcastem. Co użytkownik może z nim zrobić: może go dodać, może go potem edytować, by poprawić jakieś literówki, inni mogą przeglądać szczegóły podcasu: jego opis i wszystko inne co ma opisywać podcast. Każdy chce mieć wartością treść w swoim serwisie, więc przyda nam się jakiś moderator by usuwał to co jest złe. Jakieś bluzgi czy bekanie do mikrofonu. Cztery proste czynności tworzenie, usuwanie, przeglądanie, edycja. Na ilę sposóbów mogę nazwać akcję tworzącą nowy podcast? Nawet ograiczając się do angielskiego bardzo łatwo podać kilka słów oznaczających prawie to samo: new, add, create. A jeśli w takim kontrolerze są wszystkie trzy nazywy to która tak napawdę tworzy nowy podcast w serwisie? DHH mówił o tym problemie a ja chcę powtórzyć. Sięgnij po CRUD. Zatem nazywajmy zawsze te podstawowe metody tak samo: create, show, update, destroy.
Pozwoliłem sobie dodać już częściową implementację tych akcji, brakuje tylko create.
Uporządkujmy
Pół biedy jeśli to wygląda tak jak na załączonym wyżej obrazku. Dużo gorzej jeśli na początku każdej z metod jest:
Przynajmniej trzy razy piszesz to samo! Mój sposób by sobie z tym poradzić to before_filter. Piszę sobie metodę: find_podcast
Spokojnie, spokojnie, nie podpalać się i nie wpisywać tej metody na początku każdej z metod. To też bez sensu. Pamiętajcie o before_filter.
To według mnie jest DRY. Eliminacja powtarzającego się kodu, oszczędzanie palców czy jak jeszcze to nazwać. Paradoksalnie na napisanie find_podcast użyłem więcej linii niż zaoszczędziłem, ale według mnie tak jest estetyczniej, czytelniej. Ale DRY to nie tylko pisanie metod podobnych do find_podcast, to również ,,widoki częściowe'' - partiale (o których pisałem już na Jabbie), oraz metody pomocnicze.
Postanowiłem uzupełnić kod kontrolera jeszcze o metodę list, która będzie pokazywała listę wszystkich podcastów. Teraz find_podcast będzie wywoływane przed każdą metodą oprócz create.
Spostrzegawczy lub tacy, którzy już pisali w RoR powiedzą: ,,no dobra, ale teraz każdy może usunąć podcast''. Tak w tym momencie każdy może usunąć podcast. A nawet więcej! Teraz użytkownik może edytować wszystkie podcasty. Wolna amerykanka! A co jeśli nie uda się zapisać podcastu? Ale to jeśli będzie ktoś chciał przeczytać mogę napisać w sobotę.
Literatura
Na sam koniec przydatne artykuły, video czy textareazentacje:
Railscasts, wszystkie odcinki
05 września 2007 | Klucze:
rails,
ruby,
Techblog
13 komentarzy. trackback
Wszyscy, którzy interesują się Ruby on Rails pewnie dobrze znają screencasty, których autorem jest Ryan Bates. Ci którzy nie znają, muszą poznać.
Całkiem niedawno zapragnąłem mieć wszystkie odcinki (nie widziałem wszystkich) u siebie na dysku i oglądać je w wolnej chwili. Jednak przechodzenie po koleji ze strony odcinka na stronę kolejnego epizodu to nie jest ciekawe zajęcie. Ale kim byłby programista, który robiłby to ręcznie? Chwilę pomyślałem i już wiedziałem.
Co potrzebowałem: Railscasts RSS, REXML, net/http, Wget jako mały pomocnik do ściągania plików, no i Ruby oczywiście. Całość trochę zamieszałem, wrzuciłem do jednego skryptu i voila! Skrypt ściąga wszystkie wydane epizody w formacie mov (cały Railsowy światek jest raczej makowy), a na dzień dzisiejszy jest ich 69. Da dysku sporo zajmują, ale chyba warto.
Warto też odnotować istnienie serwisu peepcode.com. Udostępnia on również screencasty o tematyce Ruby/Ruby on Rails, ale z tą jedyną różnicą, że są one płatne. Jeden odcinek kosztuje 9$. Jest jednak możliwość obejrzenia ,,free samples''. Ja osobiście nie widziałem żadnego odcinka, więc nie będę się pisał nic więcej na temat tej serii.

