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.

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 named_scope. Może nie jest to najlepszy przykład na pokazanie jak działa Flog, ale idea myślę jest jasna. Oczywiście byłem ciekaw dlaczego coś otrzymuje 6.0 (eval), a coś innego tylko 0.8. Zapytałem autora, oto odpowiedź:
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 if zmienił się na < texttt>unless itp. Nasz kod po zmutowaniu powinien zawalić wszystkie testy. Czasem jego wywołanie może trwac bardzo długo. Przyznaję, że nie jest to moje ulubione narzędzie, praktycznie nie używam.

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
  end
 
By poprawnie zwalidować number potrzebny jest samo numer i kraj dla którego będziemy ten numer sprawdzać, dlatego niezbędny jest scope.

W wolnej chwili chcę jeszcze dopisać możliwość ustawiania scope przez jakiś Proc ponieważ najczęsciej walidowany model nie ma pola zawierającego kod kraju w standardzie ISO 3166.

Snapshot1

17 maja 2008 | Klucze: Ogólne, programowanie, ruby
2 komentarze. trackback

Z pisaniem bloga u mnie prawdziwy ,,sezon ogórkowy'', ale może teraz będę miał więcej czasu i samozaparcia by pisać coś regularnie. Według mnie sporo przeglądam rssów i czasem trafię na coś ciekawego, postaram się regularnie tworzyć listę ciekawych newsów, stron w sieci, które odwiedziłem w ostatnim tygodniu. No to do dzieła!

50 More Excellent Blog Designs
Na Smashing Magazine zacząłem zaglądać dzięki Maciowi, z którym pracuję. W linkowanym artykule jest mowa o 50 odczapowanych szablonach dla blogów. Niektóre to cacka niesamowite. Ogólnie polecam dodać Smashing Magazine do swoich czytników RSS.
Ruby Banter - Rubinowe Pogawędki
Kolejny link, które dostałem od Macia. Ruby Banter to screencasty, których przewodnim tematem jest pokazanie ciekawych sztuczek w Rubim. Odcinki są którkie, treściwie i opatrzone omawianym przez autorów kodem źródłowym. Ale uważajcie, niektóre rzeczy wymagają czegoś więcej niż tylko znajomość Rails.
Martin Fowler: Articles
Tym razem coś czego nie dostałem od Macia. Martin Fowler to jeden z twórców Agile Manifesto, twórca wielu ciekawych artykułów poświęconych programowaniu i projektowaniu. Polecam się z nimi zapoznać.
Przez 12 lat pozwoliłem gamoniom robić sobie ze mnie jaja
Coś dla czytelników interesujących się piłką nożną w naszym małym polskim wydaniu. Trener opowiada o ,,spółdzielniach'', bezstronnych sędziach. Mnie ten tekst trochę zszokował, chociaż w polskiej piłce informacje o korupcji są bardziej powszechne niż sukcesy polskiej piłki.
Design patterns czyli wzorce porjektoww
Właściwie ekipa z Webusability.pl daje kilka linków do interesujących stron z wzorcami jak powinny być skontruowane użyteczne, funkcjonalne elementy stron internetowych w podziale na konkretne zadania np. formularz sprzedaży itp.
Dynamically created method in Ruby
Ola Bini opisuje sposoby definiowania metod w Rubim. Lektura obowiązkowa dla wszystkich których interesuje meta w programowaniu. ;-). Zalety i wady def, define_method i coś o eval

To wszystko na dziś. Na następne wydanie postaram się znaleźć więcej i lepszych stron.

Pierwsze gitowanie

12 kwietnia 2008 | Klucze: Ogólne, programowanie, ruby, Techblog
Dodaj komentarz. trackback

Gituję. Dziś poraz pierwszy użyłem Gita. Nie zamierzam póki co porzucić Subversion. Założyłem konto na Githubie i nawet napisałem coś, wysłałem i jest publicznie dostępne. Co do Githuba: podoba mi się, nawet całkiem podoba. Szkoda, że obsługuje tylko Gita.

Powody, które mnie skłoniły do spróbowania Gita i Githuba

  • oficjalne otwarcie Githuba
  • przeniesienie Ruby on Rails na Gita
  • występ Ezry Zygmuntowicza na MWRC podczas, których Ezra powiedział trochę ciepłych słów o Gitcie. Polecam obejrzeć!
  • nieuniknione wydaje się zrozumienie tego jak on działa i jak się to obsługuje

Moje wrażenia po niecałym dniu zabawy bardzo pozytywne. Bardzo łatwo zacząć: git init, git add i potem już tylko git commit. Trudności przyniosło mi dopiero wysłanie projektu na Githuba, ale po małym szperaniu po serwisie i to się wyjaśniło.
Jeśli ktoś masz trochę wolnego czasu to może się pobawić Gitem, ciekawe doświadczenie. Tymbardziej dla mnie, bo Git to mój pierwszy kontakt z rozproszonym systemem kontroli wersji Bardzo efekciarski, ale też i bardzo pomagający zrozumieć ideę Gita jest ,,network project graph''. Niestety jest to Flash i w projektach dużych takich jak rails jego wyświetlenie sporo trwa.

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_id
 
Czujecie 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.

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) Książki z Implix
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 LEFT JOIN Project.find(:all, :include => :user, :conditions => ["users.login LIKE ?", 'quntin']).map{ |p| p.id } [1, 3] => Konia z rzędem temu, kto po wywołaniu czegoś takiego zerknie w logi railsowe i zaraz będzie wiedział co to zapytanie robi. W takim wywołaniu metoda find rzuca sobie dość długi SQL i zwraca obiekt Project wraz z użytkownikiem. Ale zwrócony obiekt nie jest już zbitką atrybutów z obu klas ale faktycznie czystym obiektem Project.

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.

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.