Spotkanie 1 marca - uzupełnienie informacji
Feb 24Miejsce spotkania: Klub Pauza http://www.pauza.pl Floriańska 18 poziom piwnic.
Jest mi niezmiernie miło ogłosić, że na zapowiadanym spotkaniu 1 marca drugą prezentację na temat Rails 3 wygłosi José Valim. José jest od niedawna członkiem Core Teamu Ruby on Rails rubyonrails.org/core . Na tą zaszczytną pozycję zasłużył się będąc jadnym z najbardziej aktywnych programistów pracujących nad wersją 3.0 Railsów. Tym samym ciężko wyobrazić sobie bardziej kompetentą osobę do wygłoszenia tej prezentacji (no dobra... Yehudę zaprosimy na następne spotkanie ;)).
Podsumowując :
- Marcin powie o tym jak prosto stworzyć swój framework bazując na gotowych komponentach
- Jose opowie o najważeniejszych zmianach w Rails 3.
- będzie darmowy browar od Lunar Logic Polska
- rozdamy 2 licencje na RubyMine od firmy JetBrains
Prosimy pamiętac o rejestracji poniżej!
...więcej...
Rails 3.0 beta
Feb 24Muszę przyznać, że wydana parę tygodni temu wersja beta Ruby on Rails 3.0 wygląda bardzo obiecująco. Choć to dopiero beta, to wprowadzone razem z nią ulepszone zarządzanie gemami za pomocą Bundler'a robi dobre wrażenie. Aby ułatwić sobie eksperymentowanie z nowym RoR 3.0, najlepiej zainstalować wpierw RVM...
RVM (Ruby Version Manager)
RVM (http://rvm.beginrescueend.com/) wprowadza nową jakość do niezbyt wygodnego zarządzania wersjami Ruby’ego jakie było do tej pory stosowane. Pozwala na instalację, izolację i błyskawiczne przełączanie się między różnymi wersjami (i implementacjami!) Ruby’ego – od stabilnych po rozwojowe, od Ruby 1.8.0 po 1.9.2 preview1, JRuby, IronRuby, MacRuby (dla OS-X), MagLev czy Rubinius.
rvm list known– wyświetli listę wszystkich dostępnych instalacjirvm install 1.9.1– zainstaluje Ruby 1.9.1rmv use 1.9.1 --default– ustawi Ruby 1.9.1 jako domyślną wersję (dla nowej konsoli)rvm use system– powróci do ustawień systemowychrvm help– wyświetli dostępne komendy
$ rvm install 1.9.1 $ rvm use 1.9.1 $ which ruby /Users/adm/.rvm/rubies/ruby-1.9.1-p378/bin/ruby $ which gem /Users/adm/.rvm/rubies/ruby-1.9.1-p378/bin/gem
Instalacja i przełączenie się na najnowszego JRuby’ego:
$ rvm install jruby-head $ rvm use jruby-head $ which ruby /Users/adm/.rvm/rubies/jruby-head/bin/ruby $ which gem /Users/adm/.rvm/rubies/jruby-head/bin/gem $ ruby -v jruby 1.5.0.dev (ruby 1.8.7 patchlevel 174) (2010-02-23 944db04) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_17) [x86_64-java]
Powrót do Ruby 1.9.1:
$ rvm use 1.9.1 $ ruby -v ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.2.0]
Proste i wygodne. Nigdy więcej paskudnych nazw typu ruby1.8, ruby1.9, gem1.9 itp. Koniec też z niespójnością skryptów które mają taką samą nazwę ale różną linijkę shebang (wskazującą jaki interpreter Ruby’ego należy użyć dla odpalenie skryptu).
Zobacz też screencast Rails 3 Beta and RVM.
Uwaga: w wypadku używania RVM nie należy używać komendy sudo (dla systemów POSIX) gdyż wszystkie wersje Ruby’ego wraz ze swymi gemami są instalowane w katalogu domowym użytkownika ~/.rvm.
Rails 3 i bundler
Instalacja bety Rails 3.0 jest prosta. Zakładając że mamy wiele wersji Ruby’ego, i wiedząc że Rails 3 wymaga Ruby w wersji minimum 1.8.7, cała instalacja sprowadza się do krótkiego polecenia:
gem install rails --pre
Z tego co sprawdziłem, nie ma już potrzeby instalowania całej listy wcześniejszych gemów, jak to podawano na oficjalnym blogu Rails.
Razem z instalacja Rails 3 beta zostanie zainstalowany gem bundler. Od tego momentu, można używać skryptu bundle zamiast gem. W Rails 3 zależności między gemami dla aplikacji są ustawianie w pliku Gemfile. To jest główne miejsce gdzie są ustawiane wszystkie zależności. Jeśli nasza aplikacja potrzebuje do swej pracy jakiegoś konkretnego gemu, to tam należy to sobie dodać. Wybrane komendy:
bundle check– sprawdzi czy nie brakuje nam jakiegoś gemu niezbędnego do działania aplikacji RoR3
bundle install– instaluje wszystkie gemy niezbędne do działania aplikacji RoR3
bundle lock– “zamraża” gemy potrzebne dla aplikacji RoR3 tworząc plik Gemfile.lock. Nie jest możliwe instalowanie gemów (wcześniejsze )
bundle pack– kopiuje gemy potrzebne do aplikacji dovendor/cache
bundle show– wyświetli listę gemów używanych przez aplikację RoR3
bundle install --relock– instaluje najnowsze (jeśli trzeba) wersje gemów i ponownie zamraża listę gemów.
Wczesniejsze komendy rake rails:freeze:gems czy rake rails:unfreeze nie są zalecane. Zamiast nich należy używać bundler’a.
Zobacz też screencast Bundler.
Rails 3 – zmiany
Poza większą wydajnością i modularnością, w Rails 3 wprowadzono szereg innych zmian i ulepszeń. M.in. zlikwidowano grupę skryptów z katalogu script/ i zastąpiono go jednym – rails. ActiveRecord, dzięki nowemu gemowi http://github.com/nkallen/arel uzyskał bardziej obiektową składnię oraz opóźnione (lazy) wywoływanie połączeń z bazą. Dane są pobierane z bazy dopiero w momencie kiedy są potrzebne. To ułatwia ich buforowanie, składanie z warunków oraz testowanie. Nowy AR doczekał się, wzorowanego na Sequelu, polecenia .to_sql dzięki któremu można wyświetlić generowany kod SQL przed jakimkolwiek połączeniem z bazą. Zobacz też screencast Active Record Queries in Rails 3.
Rails 3 wspiera również tzw. nieiwazyjny JavaScript (czyni to za pomocą składni z HTML5) dzięki czemu helpery widoku nie generują już więcej wstawek JavaScriptu w kodzie HTML. Łatwiej zatem przełączyć się z (domyślnego) Prototype na inną bibliotekę, np. jQuery.
Wspomniana wcześniej modularność Rals 3 to też silna strona nowej wersji tego frameworka. Każdy wcześniejszy główny moduł składający sie na Rails został gruntownie przebudowany i odizolowany. Rails 3 nie posiada znanych z wersji 2.x zależności frameworka od Active Record. Zarówno Active Record jaki i Action Controller czy Action Mailer są niezależnymi modułami które można sobie wyłączyć lub wymienić (np. teraz jest łatwiej wymienić Active Record na inny ORM). Z perspektywy Rails 3 wszystkie te moduły są nowymi pluginami (zobacz Railtie). Rails 3 wprowadził także montowalne aplikacje. Każda aplikacja Rails 3 może być użyta jako komponent wchodzący w część kolejnej aplikacji Rails 3. W zasadzie to nie dotyczy tylko Rails 3 ale dowolnego frameworka zgodnego z webowym interfejsem Rack. Tzn. w Rails 3 można wpiąć sobie w wybrane adresy URL zarówno inna aplikację Rails 3 jak i Sinatrę, Merba, Ramaze czy inny framework zgodny z Rack (teraz praktycznie wszystkie są z tym zgodne).
Dokładniejsza lista zmian jest dostępna na
Zobacz też artykuły Yehuda Katz’a na blogu oraz na stronach firmy Engine Yard:
- Rails 3 Beta is Out — A Retrospective
- Rails and Merb Merge: The Anniversary
- Rails and Merb Merge: Performance
- Rails and Merb Merge: Plugin API
- Rails and Merb Merge: Rails Core
- Rails and Merb Merge: ORM Agnosticism
więcej...
Kolejne spotaknie - 1 marca
Feb 14Zapraszamy na kolejne spotkanie grupy KRUG. Konkretnie spotkamy się w poniedziałek 1 marca o godzinie 19:00. Miejsce spotkania zostanie podane po potwierdzeniu.
W ramach spotkania mamy póki co potwierdzoną jedną prezentację. Marcin http://sickill.net/ opowie jak łatwo zbudować własny web framework w ruby przy użyciu dostępnych middleware'ów (Rack)
Czekamy na propozycje osób które chciały by zrobić drugą prezentację. Gorącym aktualnie tematem jest Rails 3. Czy chciałby ktoś na przykład podsumować wybrane nowości z tej wersji ? Oczywiście mile widziane są również inne tematy. Zainteresowanych proszę o kontakt na priv.
Po prezentacjach, jak zwykle część nieoficjalna oraz dodatkowe atrakcje w postaci:
- 2 licencji RubyMina ufundowane przez firmę JetBrains !
- piwa dla każdego od Firmy Lunar Logic Polska !
Prosimy o rejestrację poniżej.
Maciej Książek
Ładowanie... ...więcej...
jQuery Quicksand — animuj sortowanie i filtrowanie
Feb 12Operując na kolekcjach danych, często je przeszukujemy albo sortujemy. Zwykle efekt takiego działania widoczny jest natychmiast, z przeskokiem. A gdyby tak animować przesuwanie się przesortowanych elementów? I ładnie znikać elementy odfiltrowane i fajnie wjeżdzać elementami nowymi, tak jak w niektórych aplikacjach na Mac OS X? I najlepiej w jQuery? I za pomocą jednej linii kodu? I bez dodatkowego CSS-a?
Poznaj Quicksanda. Nowy plugin jQuery.
Co tu dużo mówić, wszystko widać na filmiku:
Na stronie projektu znajdziesz demonstracje na żywo, przykłady i dokumentację. Projekt dostępny jest też na Githubie.
...więcej...
Planning poker z Androidem
Jan 31Wczoraj 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?
...więcej...
Scala i bezpieczny "duck typing"
Jan 23Duck typing (opisywany przeze mnie wcześniej na przykładzie Pythona) to dosyć użyteczna technika popularna w językach dynamicznie typowanych. W typowym języku statycznie typowanym, takim jak Java, nie da się jej stosować. Ale ograniczeniem nie jest statyczne typowanie, lecz to że Java, jako język, jest po prostu słaba. W statycznie typowanej Scali “duck typing” to żaden problem. Mało tego. Fakt, że Scala jest statycznie typowana daje jej tu dodatkową przewagę na językami dynamicznie typowanymi.
Duck typing w języku dynamicznie typowanym ma pewne wady od których Scala jest wolna. Wpierw przykład dla języka Ruby:
class Kaczka def kwacz puts "kwa kwa" end end class Slowik def kwacz puts "fiu fiu" end end class Kot def miau puts "miau miau" end end def kwacz_kaczuszko(k) k.kwacz end kwacz_kaczuszko(Kaczka.new) # => kwa kwa kwacz_kaczuszko(Slowik.new) # => fiu fiu kwacz_kaczuszko(Kot.new) # => NoMethodError: undefined method ‘kwacz’ for #<Kot:0x000001010195d8>
Błędy tego typu są trudne do wyłapania w językach dynamicznie typowanych, bo o ich wystąpieniu można się dowiedzieć dopiero w trakcie działania programu. I jeśli taki fragment kodu jest wykonywany rzadko, to trudno powiedzieć kiedy zostanie wychwycony. Jedynym sposobem aby tak błąd odpowiednio wcześniej wyłapać jest pisanie dodatkowych testów jednostkowych.
Co prawda, powyższy kod można co prawda lekko zmodyfikować (bo Ruby pozwala na ładne odpytanie obiektu, czy jest w stanie wywołać daną metodę)
def kwacz_kaczuszko(k) if k.respond_to? :kwacz k.kwacz else puts "ja nie kwaczę!" end end kwacz_kaczuszko(Kot.new) # => ja nie kwaczę!
Tylko czy to coś zmienia? Zamiast pisać dodatkową obsługę takiego błędu, nie lepiej go po prostu nie mieć?
Scala takie błędy wyłapuje już na etapie kompilacji. Tym samym gwarantuje (statycznie) że do kodu nic takiego się nie prześliznie. Można powiedzieć, że Scala obsługuje “duck typing” w sposób bezpieczny, prawidłowy. Odpada pisanie testów jednostkowych i obsługiwanie takich błędów bo w Scali one nigdy się nie pojawią!
class Kaczka { def kwacz { println("kwa kwa") }
} class Slowik { def kwacz { println("fiu fiu") } } class Kot { def miaucz { println("miau miau") }
} def kwacz_kaczuszko(k : {def kwacz}) { k.kwacz
} kwacz_kaczuszko(new Kaczka) kwacz_kaczuszko(new Slowik)
kwacz_kaczuszko(new Kot) /*
(fragment of przyklad.scala):25: error: type mismatch; found : this.Kot required: AnyRef{def kwacz: Unit}
kwacz_kaczuszko(new Kot) ^
one error found !!!
*/
... więcej...
Ruby for Startups
Jan 19I’ve found this interesting - a bunch of info from Mike Subelsky (creator of OtherInbox) how to use Ruby and Rails in challenging startup environment (each startup’s environment is challenging :)) )
więcej...
Open File Fast reached 1.0
Jan 17After almost a year of development and several beta versions Open File Fast finally became stable and mature enough to bump its version to 1.0. There’s not much new in this release except several bugfixes and improved look of search results list.
Now it looks like this:

Notice that entered characters are now displayed in bold indicating where they were found in each filename. File path is now right aligned and has lighter color. It doesn’t come into way anymore when looking at results and lets you localize the file you seek even faster.
Netbeans version of plugin was updated to work in Netbeans 6.8, JEdit’s one works now in final JEdit 4.3 version (with ProjecViewer 2.9.1+).
Netbeans NBM package: off-netbeans-1.0.nbm
JEdit jar file: off-jedit-1.0.jar
więcej...
Uwolnienie potęgi iPhona - jailbreaking
Jan 17Tak, jak pewnie większość użytkowników iPhone’a, mimo że słyszałem od dawna o możliwości zdjęcia apple’owskich blokad (proces określany jako jailbreaking), to trochę się obawiałem że taka operacja to potencjalne ryzyko zablokowania aparatu lub jakichś innych nieodwracalnych uszkodzeń. Prawda jest taka, że to wszystko to brednie i ploty. Jailbreak jest bardzo łatwy do przeprowadzenia i jest to proces w pełni odwracalny.
Jailbreak iPhone’a wytrąca z ręki krytyków tego urządzenia większość argumentów. Nie wszyscy wiedzą, ale Cydia (jedno z najpopularniejszych zasobów aplikacji na jailbreakowanego iPhone’a) istniała na długo zanim Apple wpadł na pomysł ze swoim AppStore. Aktualnie istnieje już wiele tego typów repozytoriów aplikacji, wszystkie są integrowane w jeden, szybki system za pomocą pakietu Rock (o czym niżej).
Czy są jakieś wady (lub ograniczenia) związane z jailbreakiem? Owszem, jest pewna niedogodność. Przed aktualizacją kolejnej wersji systemu operacyjnego iPhone\a (co jest dosyć rzadkim wydarzeniem) należy przywrócić z powrotem oryginalny system, zrobić aktualizację, i dopiero po tym odpalić ponownie jailbreak (choć przy większych zmianach iPhone OS można się wcześniej upewnić czy jailbreak już jest z nim kompatybilny).
Dla pewności, dobrze zrobić sobie backup iPhone (oczywiście za pomocą ITunes). Gdyby cokolwiek poszło źle można łatwo odzyskać z powrotem poprzednią zawartość iPhone’a.
Jailbreak (przy okazji usuwany jest simlock) przeprowadza się w banalny sposób. Należy podpiąć iPhone kabelkiem USB do komputera i uruchomić program blackra1n ściągnięty ze strony http://www.blackra1n.com (program jest dostępny zarówno dla Mac OS-X jak i dla sytemu Windows)
Po kliknięciu w przycisk “make it ra1n”, może pojawić się okienko ITunes z informacją że iPhone został przełączony w tryb recovery. Można je spokojnie zignorować.
Po odpaleniu blackra1n iPhone zostanie przeładowany, a na liście aplikacji pojawi się dodatkowa blackra1n. Należy ją uruchomić. Z zaproponowanych do instalacji pakietów: Cydia, Rock i sn0w. Należy wybrać Rock (zobacz: http://www.rockyourphone.com). Jest dużo szybszy od Cydii i oczywiście wszystkie aplikacje dostępne dla Cydii są też dostępne dla Rock’a. Poza tym Rock posiada automatyczny system backupu. Wystarczy zarejestrować sobie darmowe konto na serwerze (robi się to z poziomu Rock’a) i wtedy nie trzeba się przejmować aby robić backup ściągniętych aplikacji. Rock zrobi to automatycznie i automatycznie je przywróci jak trzeba. Do kontrolowania pakietów/aplikacji Rock używa APT, system podobny do używanego w Debianie/Ubuntu, lecz wszystko działa w ładnym GUI.
Jeśli po jailbreake’u masz jakieś problemy z działaniem Wifi, należy zrestartować w iPhonie ustawienia sieciowe (Ustawienia -> Ogólne -> Wyzeruj -> Wyzeruj ustawienia sieciowe) Ja musiałem to zrobić dwa razy. Od tego momentu już więcej nie było problemów.
Co warto sobie zainstalować na początek?
Na pewno warto zacząć od SBSettings (oczywiście wszystko się instaluje za pomocą aplikacji Rock). SBSettings to b. wygodna aplikacja, pozwala ubijać inne aplikacje, wyświetla ilość dostępnego RAM’u, pozwala czyścić RAM, chować ikony innych aplikacji itp.
Drugą aplikacją “must have” to Backgrounder – służy do odpalania dowolnej innej aplikacji w tle.
Trzecią to Categories pozwalająca na grupowanie ikon programów w foldery. Dużo wygodniej niż stary bałagan, zwłaszcza jak się ma dużo aplikacji.
Do łatwiejszej lokalizacji aplikacji (bo są w katalogach o mało czytelnych nazwach) dobrze doinstalować sobie Prostą aplikację AppLinks (w /var/mobile/AppLinks stworzy czytelne linki symboliczne do wszystkich aplikacji).
Co dalej? No, zależy co kto potrzebuje. Ja zainstalowałem sobie Pythona, Ruby, Haskella, Javę (kompaktowa JamVM), Scalę, Clojure, Vim’a, Midnight Commandera, wget, lynx, git, svn oraz oczywiście serwer OpenSSH. Dzięki temu ostatniemu mogę połączyć się z iPhonem za pomocą SSH (dla tych co nie wiedzą, domyślne hasło root’a w iPhonie to “alpine”). Dzięki SSH można łatwo modyfikować dowolne pliki i aplikacje. Przeszkadzają komuś reklamy w jakimś programie? :) Najczęściej wystarczy tylko prosta edycja pliku javascriptowego. Poza tym za pomocą SFTP można przerzucać dowolne programy i pliki z pominięciem iTunes. Jest nawet program Installous specjalnie do instalowania aplikacji bez pośrednictwa ITunes.
$ ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [arm-darwin9] $ python Python 2.5.1 (r251:54863, xx/xx/xx, xx:xx:xx) [GCC 4.2.1 (Based on Apple Inc. build 5555)] on darwin $ java -version java version "1.5.0" JamVM version 1.5.1 Copyright (C) 2003-2008 Robert Lougher <rob@lougher.org.uk> ... Execution Engine: direct-threaded interpreter with stack-caching Compiled with: gcc 4.2.1 (Based on Apple Inc. build 5555) Boot Library Path: /usr/lib/classpath Boot Class Path: /usr/share/jamvm/classes.zip:/usr/share/classpath/glibj.zip
Python zainstalował mi się w wersji 2.5. Za pomocą setuptools doinstalowałem ipythona, django, pylons, sqlalchemy, mako. Odpaliłem prosty projekt w Django. Działa bez problemu. Ruby instaluje się w wersji 1.8.6 ale ma starsze RubyGems 1.3.2. Ściągnąłem zatem z sieci najnowsze i bez problemu doinstalowały się: Rails, Merb i Sinatra. Niestety jako serwer działa tylko Webrick. Thin i Mongrel się nie skompilowały, ale to dlatego że nie miałem programu make.
Powodzenia w hackowaniu. Teraz to iPhone naprawdę Rocks ;)
...więcej...
Email verification - regexp
Jan 13Many times before when I was supposed to collect emails from users I was googling to find some regexp to verify email syntax. At least I was aware that regexp challenging email address syntax is a bullshit ;) I was working few years as Unix sysadmin mostly on mail servers, so I had some idea how RFCs related to email are bloated ;) and contain so many exceptions ;)

Step back and think again. Image CC by Vivianna_love
From some time I do use following regexp to verify email address:
/.+@.+[.].+/
This should check if:
- there is @ sign somewhere inside
- at least one character is before @ sign
- at least 3 chars (with one dot) are after @ sign
Why such simple rules? I have found comment on StackOverflow, that man should step back and think why is checking email address?
I want just to help users and stop them making simple mistakes in theirs emails. Like not providing @ at all. Or eating .com in gmail.com address. And that’s it - email will be probably shortly after that verified with only reliable method via sending email to this address.
And if You insist to verify emails with more strict regular expression, please do remember that plus sign is perfectly valid character before @. Many regexps found via google are forgetting that…
...więcej...