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.

Distributed programming with Ruby

29 lipca 2010 | Klucze: programowanie, ruby, Techblog
Dodaj komentarz. trackback

Ostatnio piszę o książkach. Właściwie tylko i wyłącznie o książkach. Dziś nie będzie inaczej - kontunuję książkowy temat. Dziś kilka moich spostrzeżeń o książce Distributed Programming with Ruby Marka Batesa. Wspomniana ksiązka wydana jest przez wydawnictwo Addison-Wesley. Wcześniej opisywałem kilka książek z tego wydawnictwa Refactoring. Ruby Edition i Ruby. Wzorce Projektowe Miałem również kontakt z innymi ksiązkami tego wydawnictwa takimi jak The Ruby Way i The Rails Way, które według mnie są na wysokim poziomie. Niestety Distributed Programming with Ruby to najsłabsza książka z wyżej wymienionych. Jeśli tamte mogłem oceniać na 4.5/5 lub nawet 5/5 to ta książka może liczyć na 3/5.

Książka to fajny przekrojowy materiał przez kilka bibliotek, które można wykorzystać. Ale mam wrażenie, że gdyby wyciąć połowę z tych 250 stron to książka nic by nie straciła. Książka ogólnie bardzo pomagała mi w zaśnięciu. Szczególnie druga część, gdzie były omawiane takie biblioteki jak:

  • RingyDingy - brzmi jak imie dla pasa, ostatni commit 15.12.2006.
  • Starfish - ostatni commit 06.12.2007
  • Distribunaut - autorstwa tego samego Pana co cała książka
  • Politics - też wielkiej kariery ten gem nie zrobił
Najciekawszą częścią książki było omówienie Starlinga i AMQP.

Jeśli jesteś programistą na dorobku to odpuść sobie - nie warto kupować tej książki za (o zgrozo!) $ 39.99. Jeśli zamawiasz książki do firmowej biblioteczki to można to dorzucić, pewnie i tak będzie w rabacie z czymś lepszym.

Ruby. Wzorce projektowe - recenzja

15 kwietnia 2010 | Klucze: programowanie, ruby, Techblog
5 komentarzy. trackback

Ostatnio jakoś same książki opisuję. Dziś chciałem opisać książkę Ruby. Wzorce projektowe Russa Olsena. Inaczej niż "Refactoring, Ruby edition" książka jest wydana po polsku i można ją kupić choćby w księgarni Helionu. Ja czytałem zarówno polską jak i angielską wersję i muszę powiedzieć, że obie czyta się dobrze. Książka niestety zawiera wstęp do języka Ruby. Według mnie to lekkie przegięcie by wpychać wszędzie "szybkie wprowadzenie do Ruby". Kompletny Ruby-laik pewnie po tym krótkim kursie (50 stron) będzie rozumiał wszystkie przykłady zamieszczone w książce.

W książce mamy opisane kilka standardowych wzorców projektowych pokazanych już przez "gang of four" jak np. singleton, strategia, fasada, ... Ale jest też kilka specyficznych takich jak: metaprogramowanie, Domain Specific Language. Każdy wzorzec jest opisany, pokazany na przykładzie i dodatkowo dla fanów UMLa dołączony jest prosty diagramik.

Uważam, że książka jest dobrą pozycją dla programistów, którzy nie są nowicjuszami, ale też nie da wymiataczy. Ale pewnie wielu "wymiataczy", którzy produkują kod znajdą w książce trochę nowości dla siebie. Ja czytałem tą książkę pierwszy raz po kilkunastu miesiącach znajomości Rubiego i bardzo dużo dobrych treści w niej znalazłem. Bez powszechnego w wielu książkach wodolejstwa i robienia słodkiego "pitu-pitu" zamiast konkretnych informacji. Jak ktoś pisze w Ruby i jeszcze nie zna wzorców projektowych to musi to przecztać.

Refactoring: Ruby edition - recenzja

11 marca 2010 | Klucze: it, programowanie, ruby, Techblog
2 komentarze. trackback

Dziś chcę napisać o książce Refactoring: Ruby Edition. Stety albo niestety książka nie jest dostępna w języku polskim. Książka nie jest przeznaczona dla początkujących programistów Ruby. Nie ma w niej szybkiego kursu języka, jednak nie trzeba być "wyjadaczem" by zrozumieć treść. Już pierwszy rozdział, który jest jednym wielkim przykładem - podsumowaniem całej książki jednoznacznie pokazuje czego ta książka ma nauczyć. W pierwszym rozdziale autor pokazuje krok po kroku zmiany w gorszym kodzie, które czynią, że jest on lepszy. Każda decyzja, zmiana implementacji jest omawiana i wyjaśniana. Podobnie jest w dalszej części książki. Rozdziały podzielone są tematycznie. Jest rozdział mówiący o uproszczeniu złożonych wyrażeń, generalizacji obiektów czy przesuwaniu metod pomiędzy klasami.

Książkę właściwie można polecić wszystkim, którzy chcą skończyć z Burdel Driven Development. Którzy znają Rubiego już na tyle, że potrafią z nim napisać trochę bardziej skomplikowane programy. Po przeczytaniu tej książki programista powinien łatwiej wyczuwać tzw. "code smells" i powinien znać sposoby jak się ich pozbyć.

Warto zwrócić uwagę, że wydawnictwo Addison-Wesley posiada chyba najlepszy zestaw książek o Ruby w tej chwili. A nad cała serią piecze sprawuje Obie Fernandez. Co chyba jest dodatkową rekomendacją

Planning poker z Androidem

31 stycznia 2010 | Klucze: agile, it, programowanie
Dodaj komentarz. trackback

Wczoraj pobuszowałem trochę w Android markecie. Wyszukiwałem aplikacji pod konkretne frazy. Z ciekawości poszukałem aplikacji dla frazy agile i scrum.

Aplikacji niewiele, ale moją uwagę przykuły aplikacje do planning pokera. Osobiście nigdy nie korzystałem z tej techniki, ale wydaje się mi ona ciekawa. Aplikacja BC Planning Poker jest bardzo prosta. Jej głównym zadaniem jest pokazywanie obrazka przypominającego kartę z esytmacją. Domyślną skalę esytmacji (0, ½, 1, 2, 3, 5, 8, 13, 20, 40, 100, coffee) można dowolnie zmieniać. Według mnie może to być całkiem fajna aplikacja dla kogoś kto używa tej techniki, a nie ma wydrukowanych ładnych karteczek.

Jestem pewien, że użytkownikcy iPhone również mają taką aplikację, ktoś używał może czegoś podobnego i może pochwalić się sowimi wrażeniami?

Komentarze w wyrażeniach regularnych

13 grudnia 2009 | Klucze: it, Ogólne, programowanie, ruby, Techblog
7 komentarzy. trackback

Ostatnio pisałem o swoim punkcie widzenia na standard kodowania w Ruby. Jakoś dziwnie się to zbiegło z czasem, gdy jeden z project managerów w firmie mocno wziął sobie do serca pisanie dokumentacji. Zaowocowało to serią commitów z opisami typu: Comments, Comments fix. Jeden z impliksowych perlistów podesłał mi przykład jak to oni dokumentują swój kod. W przykładzie znalazłem coś co mi się strasznie spodobało: dokumentacje w wyrażeniu regularnym!

Ruby zapewnia wbudowaną obsługę dopasowania wyrażeń regularnych. W Ruby wyrażenia regularne są instancjami klasy Regexp. To co mnie szczególnie ostatnio zainteresowało to tryb Regexp::EXTEND, w którym to ignorowane są białe znaki i dopuszczone są komentarze. By Regexp pracował w tym trybie: regexp = Regexp.new('dopasowanie', Regexp::EXTENDED) regexp = /dopasowanie/x

Poniżej przykład zastosowania, prosty bo prosty ale ideę chyba prezentuje. Wyrażenie regularne sprawdzające poprawność adresu email (niezastanawiaj się drogi czytelniku nad skutecznością, ale nad formą wyrażenia). Kiedyś, ktoś napisał fajny "sprawdzacz" do wyrażeń regularnych w Ruby: rubular.com, ale dość słabo radzi on sobie z rozszerzonymi wyrażeniami. Na koniec polecam jeszcze zapoznać się z dokumentacją klasy MatchData

A teraz mała odskocznia, ale tylko mała. Ostantio kiedy szukaliśmy do Implix programisty Ruby napisałem o tym na blogu zamieszczając zdjęcie. Programistę znaleźliśmy, ale zdjęcie żyło własnym życiem ... Co prawda to miejsce jest już zajęte, ale tuż obok możesz siedzieć Ty. Bo właśnie szukamy programisty Ruby. Nie wymagamy doświadczenia. Chcemy tylko byś orientował się w temacie i znał trochę Ruby i Rails. Gwarantujemy, że dużo się nauczysz i napewno nie zaśniesz z nudów. Praca w Gdyni, blisko morza (300 metrów). Zapraszamy.

Standard kodowania Ruby

04 grudnia 2009 | Klucze: programowanie, ruby, Techblog
14 komentarzy. trackback

Chyba każdy kto pracował przy jakimś projekcie, w którym uczesniczy więcej niż jeden programista czuł potrzebę zapanowania w jakiś sposób nad pisanym kodem. Według mnie pierwszą rzeczą jaką trzeba stalić w takiej sytuacji jest standard kodowania. Taki standard to nic innego jak zasady, których należy się trzymać by kod był czytelny i zrozumiały dla wszystkich.

W firmie w której pracuję Implix są standardy kodowania zarówno dla PHP jak i dla Ruby. Standardu nie można ot tak sobie narzucić. Standard powinien zostać wypracowany przy współpracy wszystkich zainteresowanych. W naszym przypadku standard został zaproponowany przez najbardziej doświadocznego programistę, pozostali mogli się z nim zapoznać, zgłosić uwagi ..., aż w końcu powstała wersja zaakceptowana. Standard kodowania obejmował konwencje nazewnictwa, wcięcia, białe znaki, nawiasy, instrukcje i komentarze. Oczywiście na końcu dokumentu znajdował się przykład całej klasy napisanej zgodnie z standardem i w całości udokumentowanej.

Standard kodowania istnieje już ponad 2 lata. Każdy w zespole tworzy kod zgodnie ze standardem lub przynajmniej się stara. Kod źródłowy powstający w firmie wygląda zawsze podobnie, a nie każda klasa inaczej. Każdy nowozatrudniony pracownik dostaje taki standard do przeczytania. W każdej chwili można zajrzeć do standardu (jest spisany na firmowym wiki). Wszelkie niezgodności ze standardem kodowania są wytykane podczas inspekcji kodu.

Poniżej kilka punktów:

  • linia nie powinna mieć więcej niż 100 znaków
  • nie używam tabulacji, zamiast tego 2 znaki spacji
  • 2 puste linie przed i po modifikatorach dostępu
  • 2 puste linie oddzielają definicje metody
  • każda metoda publiczna powinna mieć dokumentację
  • jeśli metoda przyjmuje więcej niż 1 argument, powinna być wywołana z użyciem nawiasów
  • dodatkowo lubię jak metody klasy są definiowane przed metodami instancji
  • jeśli z nazwy klasy nie wynika wprost do czego służy powinna mieć opis w postaci komentarza
Ten tekst napisałem sugerując się moimi doświadczeniami wynikającymi z pracy z kodem pisanym przez wielu programistów. Czasem lepszych, czasem gorszych, czasem z szerszym, czasem z węższym monitorem ... Ale każdy z nich pisał kod inaczej. Jeden wstawiał tabulacje, inny spacje. Hardkorowcy mieszali metody publiczne z tymi ukrytymi. Programiści! Starajcie się pisać w jakiś spójny, uporządkowany sposób. Nie chcesz odziedziczyć niedbale napisanego kodu, prawda? W takim razie sam zacznij dbać o jego estetykę i nie traktuj każdego projektu na zasadzie "napisz, zgarnij kasę i zapomnij"!

Instalacja MongoDB w MegiTeam

29 września 2009 | Klucze: mongodb, programowanie, ruby, Techblog
3 komentarze. trackback

Jeśli ktoś czyta na bieżąco blog highscalability to pewnie zauważył co jakiś czas pojawiające się hasło noSQL, lansowane przez SQL hejterów. Jedną z kilku alternatyw dla relacyjnych baz danych jest MongoDB, więcej informacji na temat samej bazy danych można przeczytać na jej stronie. W naszym małym, polskim grajdołku gdzie dostęp do nieograniczonej ilości baz danych MySQL/PostreSQL w ramach hostingu współdzielonego jest rarytasem na próżno szukać wsparcia dla baz danych takich jak MongoDB lub CouchDB. Na szczęście MegiTeam pozwala zarówno na nieograniczoną ilość baz MySQL/PostresSQL jak i na instalację MongoDB.

Do zbudowania MongoDB używane jest narzędzie Scons, które wymaga Python 2.5. Domyślnie na współdzielonym hostinguMegiTeam zainstalowany jest Python 2.4, ale można łatwo to zmienić. W pliku ~/.environment należy dopisać linię: PATH=$HOME/.python/bin:/usr/local/python2.5/bin:$PATH:/var/lib/gems/1.8/bin/ A co do Scons, po ściągnięciu i rozpakowaniu źródeł powinno wystarczyć coś takiego: python setup.py install --prefix=$HOME/.python. Ja osobiście skorzystałem z przychylności admina, ktory mi zaisntalował Sconsa. Ponieważ mam współdzielony hosting możliwe, że inni użytkownicy serwera również mają dostęp do scons, radzę sprawdzić.

Po ściągnięciu źródeł MongoDB w katalogu wydajemy polecenie scons all Budowanie MongoDB trochę trwa, więc radzę zrobić sobie w tym czasie herbatę lub zając się czymś innym. Warto też upewnić się, że na hostingu współdzielonym starczy nam miejsca. Trzeba mieć przygotowane ok. 270 MB. Po zbudowaniu należy skopojować pliki do jakiegoś katalogu ujętego w PATH. cp mongo mongod mongodump mongoexport mongofiles mongoimportjson mongorestore mongos ~/bin

Zabawki

Po co to komu?

Czy aplikacja oparta na MongoDB ma szanse dobrze działać?. Osobiście ciężko mi coś na ten temat powiedzieć. Tomasz Stachewicz z Aenimy odgrażał się, że przed RuPy postara się pokazać "pierwszą w Polsce" aplikację w Railsach używającą MongoDB. Trzymam kciuki! Na RuPy 2009 mają odbyć się dwie prezentacje poświęcone MongoDB. Mike Dirolf zrobi wstęp do MongoDB, a Obie Fernandez pokaże jak połączyć Rails i MongoDB.

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.

Egzamin Ruby - Basics

17 czerwca 2009 | Klucze: programowanie, ruby
Dodaj komentarz. trackback

Na blogu Jacka Laskowskiego piszącego ostatnio sporo o groovy znalazłem informację o egzaminie Java Black Belt. Poza egzaminem z groovy jest również możliwość sprawdzenia się z Javy, SQL, XML i również istnieje egzamin z Ruby. Lista wszystkich egzaminów jest pokaźna.

Co do egzaminu z Ruby nie był on ani łatwy, ani trudny. Składa się z 34 pytań na które trzeba odpowiedzieć w ciągu 51 minut (każdy powinien spokojnie dać radę), by zdać egzamin trzeba mieć minimum 70% poprawnych odpowiedzi. Jednak nie od razu można podejść do egzaminu - trzeba uzbierać 15 punkcików by móc przystąpić do egzaminu.
Punkty można zdbowyać na kilka sposobów. Najłatwiejszy to pisanie pytań - 2 punkty za dodanie. 2 punkty za to, że pytanie wyjdzie z wersji beta (10 osób musi zagłosować na pytanie). Szczegółowy opis przyznawanych punktów powinien wszystko wyjaśnić. 15 punkcików czyli minimum 5 nowych pytań ... Mam nadzieję, że wkrótce wzrośnie liczba pytań do Ruby.

Skoro jest już egzamin do Ruby i nie jest on jakoś szczególnie nowy to może warto by zainteresować się stworzeniem zestawu pytań bardziej skierowanego na Ruby on Rails lub może Ruby - Advanced? Tak czy inaczej powodzenia na egzaminie ;-)

Szuku

29 października 2008 | Klucze: it, Ogólne, programowanie
4 komentarze. trackback

Szuku to dobrze zapowiadająca się wyszukiwarka ludzi, która dostała się do finału Seedcamp. Niedawno startup uruchomił zamkniętą bete do której mam 20 zaproszeń. Prośby o zaproszenia prosze wysyłać do mnie mailem z tematem "[SZUKU.PL]" lub przesłac adres email do mój JID.
Zapytałem Tomasza Kolinko o to jakich technologii używają do tworzenia szuku.pl.

Z tego co dowiedziałem się od Tomka Kolinko całość pracuje mocno korzystjąc z Amazon Web Services. W tej chwili serwis osbługiwany jest przez 1 - 2 serwery EC2, docelowo planowan jest praca na 10 serwerach stawianych i zdejmowanych w zależności od zapotrzebowania na zasoby. Bardzo skalowalna i elastyczna architektura. Ciekawe ile startupów z tego korzysta? Całość jest zarządzana dzięki Elastic Fox
Jako baza danych używany jest popularny mysql. Choć baza danych ,,daje rade'' w tej chwili to autorzy są świadomi, że za jakiś czas przyjdzie na zmianę.
Całość napędzana przez Javę i Groovy. Ajaksowa magia dzieje się za pomocą Dojo. Panel administracyjny zbudowany jest w oparciu o Grails.
Zbieranie informacji o ludziach to dłuższy temat, ale Tomek Kolinko zdradził mi, że przeszkują między innymi:

Opracowana jest równiez wersja beta modułu analizującego Wikipedię. Wszystkie strony są analizowane z uwzględnieniem typu (artykuł, aukcja itp.), powiązanych osób.
Serwis był rozwijany przez dwie osoby: Tomka Kolinko i Michała Kłujszo, oboje pracowali nad nim full-time. W tej chwili Michał poświęca więcej czasy na biznes. W niedalekiej przyszłości możliwe są zatrudnienia programistów.

NetBeans Day w Gdańsku

23 października 2008 | Klucze: Ogólne, programowanie, Techblog
7 komentarzy. trackback

Wszyscy programiści słyszeli chyba kiedyś o IDE NetBeans. Kiedyś strasznie go nie lubiłem, na studiach byłem prawie zmuszany do pisania właśnie z jego pomocą. Od bety wersji 6.0 nie wyobrażam sobie pisać w czymś innym. To tyle wstępu.

Projekt NetBeans obchodzi swoje 10 urodziny i z tej okazji organizowane są NetBeans day. Impreza nie ominie Gdańska (poza tym również Poznań).
Kiedy: 26 października
Gdzie: Wydział Matematyki, Fizyki i Informatyki UG
Agenda pokazuje, że głównie poruszane będą tematy okołojavowe.

Ja niestety mam zajęty weekend i pewnie się nie pojawię. A chętnie bym posłucham ludzi z NetBeans Dream Team pomimo, że codziennie używam innej technologii niż Java.

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.

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

Praktyki sprawnego programisty

05 lipca 2008 | Klucze: Ogólne, programowanie
4 komentarze. trackback

Ostatnio pisałem o nowych książkach, a dziś napiszę o pierwszej z nich jaką przeczytałem. A przeczytałem coś co można chyba uznać już za klasykę książek z półki dla ,,agile developers''. Mianowicie mam tutaj na myśli Practices of an Agile Developer autorstwa Subramaniama i Hunta, całość wydana oczywiście w Pragmatic Bookshelf. Czy oni wydają jakieś złe książki?

Dla kogo jest ta książka? Nie tylko dla programisty co mógłby sugerować tytuł. Kadra zarządzająca niższego szczebla powinna też znaleźć ciekawe informacje w tej książce. W ostatnim rozdziale książki można znaleźć wskazówki skierowane do programisty i oddzielne dla menadżera. Czym ta książka nie jest. Nie dowiesz się z niej nic o podstawach Javy, Rubiego, .Net, czy jakiegokolwiek języka. Właściwie nie dowiesz się z niej nic technicznego. Jeśli chcesz jakąś książkę, dzięki której nauczysz się pisać w którymś z ww. języków to nie kupuj Praktyk Zwinnego Programisty. Ale jeśli umiesz już klepać kod, ale jesteś świadom, że często ma błędy, często piszesz nie to czego oczekują inni lub zespół którym kierujesz nie radzi sobie z zadaniami powinieneś właśnie przeczytać tą książkę. Autorzy opisują co to znaczy ,,agile'', jakie mechanizmy wprowadzić by pracować sprawniej, a produkowane oprogramowanie było właśnie tym czego oczkują klienci. Programiści dowiedzą się czemu muszą pisać testy i nigdy nie spoczywać na laurach.

Ja książkę zdecydowanie polecam. Z tego co wiem nie jest ona wydana po polsku, ale to niczemu nie szkodzi, wręcz przeciwnie według mnie. Angielski to teraz podstawowy język na świecie, a już na pewno w branży IT, więc czytanie tej książki to okazja by się poduczyć, a nie jest napisana jakąś skomplikowaną angileszczyzną. Practices of an Agile Developer pomoże czytelnikom spojrzeć na oprogramowanie z nieco innej strony. Szczerze polecam!

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

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.

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) 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.

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:

Po co UML

29 stycznia 2007 | Klucze: it, programowanie
5 komentarzy. trackback

W kończącycm się semestrze miałem przedmiot KWPI. Przedmiot nie był jakiś szczególny, tym bardziej wykłady były raczej cholernie nudne i prowadzone w ślimaczym tempie. Zajęcia były głównie o sztuce projektowania. Mnie ten temat nawet interesuje, ale kolegów z roku chyba mniej ;-). Z tego przedmiotu odbywały się również ćwiczenia. Jako zaliczenie należało wykonać projekt, głównie oprogramowania, ale dopuszczone były projekty związane z elektroniką i AutoCADem. Ale do sedna ...

UML czyli Unified Modeling Language to język opisujący strukturę projektowanego systemu/programu. Ma on postać diagramów prezentujących różne aspekty projektowanego systemu informatycznego. Wiele programów służących do przygotowania takich diagramów posiada funkcję generowania kodu na podstawie takiego diagramu (diagramu klas). Znałem już trochę UML od roku i wiedziałem, że muszę go zastosować w przygotowywanym na zaliczenie projekcie.

Podczas semestru miałem sporo wątpliwości. Chyba większość moich kolegów nie wiedziała co to jest ujednolicony język modelowania i do czego służy (mam wrażenie, że jeszcze nie wiedzą), ale nie musieli go znać przecież. Bardziej zadziwił mnie prowadzący wykłady i ćwiczenia z tego przedmiotu Pan, który gdy usłyszał ,,chcę wykorzystać język UML'' zapytał wprost ,,a co pan chce w nim zaprogramować?''. Czyżby on też nie znał? Potem widziałem, że spacerował z książką Język UML 2.0 ... na przerwach i wymagał diagramów w dokumentacji projektu. Czyżbym to ja go naprowadził na UML? Co do wspomnianej już dokumentacji. Wielu z kolegów wolało pisać po 30 stron tekstu niż robić diagramy. Może tak lepiej, nie wiem. Może lubią pisać przydługie teksty? Ja napisałem niecałe dwie i dołączyłem diagramy, wystarczyło na 4.

Po co to piszę? By chociaż jedna dusza się nawróciła i poczytała o UML. Według mnie jest to zyskanie sporej ilości czasu w fazie projektowania, a automatyczne generowanie kodu może przyśpieszyć implementację (chociaż trochę). Na stronie prezentującej ranking technologii IT na rynku pracy UML znajduje się w okolicach dwudziestego miejsca przed takimi cudami jak Flash, czy nawet Python!

Literatura

Statystyka

16 grudnia 2006 | Klucze: programowanie
3 komentarze. trackback

Już od dłuższego czasu nosiłem się z zamiarem napisania skryptu, który by generował statystyki działającego komputera. Statystyki te to typowe zużycie CPU, ilość używanej pamięci ... Jakiś rok temu napisałem coś co podobnie działało jako skrypt powłoki bash. Teraz napisałem w Perlu. Do poprawnego działania skryptów potrzebna jest biblioteka RRDs, w Debianie ukryta jest ona w pakiecie librrds-perl

Może kiedyś to popoprawię i dopracuję. U mnie działa. Jestem świadom, że mogą być problemy z uruchomieniem tego. Gwidon Famułka nie mógł tego zrobić u siebie na maszynie hostującej dpkg.pl.

  • Pobierz
  • Przykład W przyszłości może zmienić adres na seban.dpkg.pl/stats Adres się zmienił.