<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>SebanLog</title><link>http://blog.sebastiannowak.com/</link><description>Wpisy z dziennika internetowego Jogger, wspomaganego przez Jabbera</description><lastBuildDate>Wed, 16 May 2012 00:38:28 +0200</lastBuildDate><generator>JoggerPL</generator><item><title>Leiningen, Clojure, przyszłość Ruby</title><link>http://blog.sebastiannowak.com/2012/03/28/leiningen-clojure-przyszlosc-ruby/</link><description>&lt;p&gt;Nie kryję się z tym, że od jakiegoś czasu próbuję swoich sił przy nauce &lt;a href=&quot;http://clojure.org&quot;&gt;Clojure&lt;/a&gt;. Ostatnio próbowałem napisać swój pierwszy projekt z użyciem narzędzia &lt;a href=&quot;https://github.com/technomancy/leiningen/blob/master/README.md&quot;&gt;Leiningen&lt;/a&gt;. Gdyby przyrównać go do rubiowego ekosystemu to jest to jakby połączenie &lt;a href=&quot;http://gembundler.com/&quot;&gt;Bundlera&lt;/a&gt; i &lt;a href=&quot;http://rake.rubyforge.org/&quot;&gt;rake&lt;/a&gt;. Ale właściwie chciałem napisać o czymś innym.&lt;/p&gt;
&lt;p&gt;Jak można przeczytać w internecie Ruby 2.0 ma być nieco odchudzony. Sporo bibliotek ze stdliba ma być wyciągniętych do gemów, co mi się całkiem podoba. Tego typu zmianę przeszedł Clojure w wersji 1.3. Clojure normalnie jest rozpowszechniany w dwóch paczkach - &lt;tt&gt;clojure-main&lt;/tt&gt; i &lt;tt&gt;clojure-contrib&lt;/tt&gt;. Właśnie ten &lt;tt&gt;clojure-contrib&lt;/tt&gt; przeszedł takie zmiany w wersji 1.3. Na przykład biblioteka &lt;tt&gt;clojure.contrib.math&lt;/tt&gt; została wydzielona do &lt;tt&gt;clojure.math.numeric-tower&lt;/tt&gt; i jest rozpowszechniana jako oddzielna &quot;paczka&quot;.&lt;/p&gt;
&lt;p&gt;A co to ma wspólnego z &lt;a href=&quot;https://github.com/technomancy/leiningen/blob/master/README.md&quot;&gt;Leiningen&lt;/a&gt;? Otóż w pliku-manifeście (nie wiem czy to dobra nazwa) w grupie &lt;tt&gt;:dependencies&lt;/tt&gt; wpisuje się: &lt;script src=&quot;https://gist.github.com/2059172.js?file=gistfile1.clj&quot; type=&quot;text/javascript&quot;&gt;
&lt;/script&gt; A w Ruby 2.0 mogłoby być coś takiego: &lt;script src=&quot;https://gist.github.com/2059341.js?file=gistfile1.rb&quot; type=&quot;text/javascript&quot;&gt;
&lt;/script&gt; Całkiem ładnie to wygląda, przynajmniej według mnie. Idea by Ruby nie ciągnął za sobą wielkiego ogona bibliotek, których i tak nie chcę używać wydaje mi się bardzo dobra i interesująca. Z drugiej strony może powstać małe dependency-hell, gdy jakieś gemy będą musiały robić sobie zależności do libów, które kiedyś były w standardzie.&lt;/p&gt;
</description><pubDate>Wed, 28 Mar 2012 18:52:48 +0200</pubDate><guid>http://blog.sebastiannowak.com/2012/03/28/leiningen-clojure-przyszlosc-ruby/</guid><category>clojure</category><category>programowanie</category><category>ruby</category><category>Techblog</category><category>ruby rubygems clojure leiningen</category></item><item><title>Elokwentny Rubista</title><link>http://blog.sebastiannowak.com/2012/01/29/elokwentny-rubista/</link><description>&lt;p&gt;Po &lt;a href=&quot;http://www.amazon.com/Eloquent-Ruby-Addison-Wesley-Professional/dp/0321584104/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1327844369&amp;amp;sr=1-1&quot;&gt;Eloquent Ruby&lt;/a&gt; Russa Olsena sporo sobie obecywałem, może nawet trochę za wiele. Czy jestem zawiedziony? Chyba trochę tak. Ale z drugiej strony ciężko pewnie o książkę o &lt;a href=&quot;http://ruby-lang.org&quot;&gt;Ruby&lt;/a&gt;, która mogłaby zaskoczyć programistę z pięcioletnim doświadczeniem. Chociaż &lt;a href=&quot;http://www.amazon.com/Eloquent-Ruby-Addison-Wesley-Professional/dp/0321584104/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1327844369&amp;amp;sr=1-1&quot;&gt;Eloquent Ruby&lt;/a&gt; w pewnych miejscach był zaskakujący i bardzo ciekawy (rozdziały o operatorach). Czasami miałem pretensje o autora, że opisuje kompletne podstawy. Czemu każda książka o Ruby musi opisywać takie rzeczy jak &lt;tt&gt;if, until, while&lt;/tt&gt;? Autor chyba mógł załóżyć, czytający zna chociaż podstawy &lt;a href=&quot;http://ruby-lang.org&quot;&gt;Rubiego&lt;/a&gt;. Zastanawiające jest to, że w poprzedniej książce tego autora &lt;a href=&quot;http://blog.sebastiannowak.com/2010/04/15/ruby-wzorce-projektowe-recenzja/&quot;&gt;Design Patterns in Ruby&lt;/a&gt; też mi się to nie podobało.&lt;/p&gt;
&lt;p&gt;Podsumowując całą książkę trzeba ją uznać za pozycję dobrą, nawet tak na 4+. Książka w dobry sposób pokazuje niektóre bardziej 'magiczne' aspekty języka. Kolejna książka, która bardzo dużo może zaoferować komuś kto już zna Rubiego, ale nie ma jeszcze dużego doświadczenia.&lt;/p&gt;
</description><pubDate>Sun, 29 Jan 2012 16:43:46 +0100</pubDate><guid>http://blog.sebastiannowak.com/2012/01/29/elokwentny-rubista/</guid><category>programowanie</category><category>recenzje</category><category>ruby</category><category>Techblog</category><category>book review eloquent ruby recenzja</category></item><item><title>Subprocesy w aplikacjach uruchomionych na Thin</title><link>http://blog.sebastiannowak.com/2011/04/25/subprocesy-w-aplikacjach-uruchomionych-na-thin/</link><description>&lt;p&gt;Ostantio odkryłem, dość przypadkiem przyznam, jedną ciekawostkę związaną z forkowaniem procesów w &lt;a href=&quot;http://ruby-lang.org&quot;&gt;Ruby&lt;/a&gt;. Problem dzięki, któremu odkryłem metodę &lt;a href=&quot;http://apidock.com/ruby/Kernel/at_exit&quot;&gt;&lt;tt&gt;Kernel#at_exit&lt;/tt&gt;&lt;/a&gt; polegał na tym, że aplikacja oparta na &lt;a href=&quot;http://sinatrarb.com&quot;&gt;Sinatrze&lt;/a&gt; i &lt;a href=&quot;http://rubygems.org/gems/thin&quot;&gt;Thin&lt;/a&gt; w momencie odpalania innego procesu poprzed &lt;a href=&quot;http://apidock.com/ruby/Process/fork/class&quot;&gt;&lt;tt&gt;fork&lt;/tt&gt;&lt;/a&gt; w pewnym momencie usuwała swój &lt;tt&gt;pidfile&lt;/tt&gt;.&lt;/p&gt;
&lt;h3&gt;Winowajca&lt;/h3&gt;
&lt;p&gt;Winowajcą, w cudzysłowie, była metoda &lt;a href=&quot;https://github.com/macournoyer/thin/blob/master/lib/thin/daemonizing.rb#L38&quot;&gt;&lt;tt&gt;daemonize&lt;/tt&gt;&lt;/a&gt; z modułu &lt;a href=&quot;https://github.com/macournoyer/thin/blob/master/lib/thin/daemonizing.rb&quot;&gt;&lt;tt&gt;Thin::Deamonizing&lt;/tt&gt;&lt;/a&gt;, która definiuje blok &lt;tt&gt;at_exit&lt;/tt&gt;. Blok robi super prosta rzecz: usuwa &lt;tt&gt;pidfile&lt;/tt&gt;. Cała zagwozdka polega na tym, że blok &lt;tt&gt;at_exit&lt;/tt&gt; jest uruchamiany również po zakończeniu procesów potomnych. Prościej mówiąc wszystko co uruchomimy przez &lt;tt&gt;fork&lt;/tt&gt; w aplikacji opartej o &lt;a href=&quot;http://rubygems.org/gems/thin&quot;&gt;Thin&lt;/a&gt; (sprowadzonym do demona) prędzej czy później dojdzie do &lt;a href=&quot;https://github.com/macournoyer/thin/blob/master/lib/thin/daemonizing.rb#L57&quot;&gt;tego &lt;tt&gt;at_exit&lt;/tt&gt;&lt;/a&gt; i usunie &lt;tt&gt;pidfile&lt;/tt&gt;&lt;/p&gt;
&lt;h3&gt;Rozwiązanie&lt;/h3&gt;
&lt;p&gt;Rozwiązanie jest super hiper proste:&lt;/p&gt;
&lt;h1&gt;&lt;abbr title=&quot;Read The Fucking Manual To The End&quot;&gt;RTFMTTE!&lt;/abbr&gt;&lt;/h1&gt;
&lt;p&gt;W dokumentacji jak byk jest napisane, że jeśli chce się uniknąć uruchomienia &lt;tt&gt;at_exit&lt;/tt&gt; należy zakończyć proces metodą &lt;a href=&quot;http://apidock.com/ruby/Process/exit!/class&quot;&gt;&lt;tt&gt;exit!&lt;/tt&gt;&lt;/a&gt;, co spowoduje jego natychmiastowe zakończenie. Przygotowałem krótkie streszczenie - &lt;a href=&quot;https://gist.github.com/940327&quot;&gt;gist&lt;/a&gt;.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/940327.js?file=app.rb&quot; type=&quot;text/javascript&quot;&gt;
&lt;/script&gt;
&lt;p&gt;</description><pubDate>Mon, 25 Apr 2011 12:51:49 +0200</pubDate><guid>http://blog.sebastiannowak.com/2011/04/25/subprocesy-w-aplikacjach-uruchomionych-na-thin/</guid><category>it</category><category>programowanie</category><category>ruby</category><category>Techblog</category><category>ruby sinatra thin pidfile fork</category></item><item><title>Testowanie oprogramowania - podręcznik</title><link>http://blog.sebastiannowak.com/2011/04/09/testowanie-oprogramowania-pordrecznik/</link><description>&lt;p&gt;To co najbardziej mi się podoba w społeczności stworzonej wokół języka &lt;a href=&quot;http://ruby-lang.org&quot;&gt;Ruby&lt;/a&gt; to kultura testowania pisanego oprogramowania. Obojętnie czy jest do duży serwis internetowy pisany w &lt;a href=&quot;http://rubyonrails.com&quot;&gt;Rails&lt;/a&gt;, mała stronka wydziergana w &lt;a href=&quot;http://sinatrarb.com&quot;&gt;Sinatra&lt;/a&gt; czy bilioteka do realizowania konkretnych zadań prawie zawsze ma napisany dobry zestaw testów. Brak takich testów bardzo często jest piętnowany i uważany za skazę na jakości tworzonego oprogramowania.&lt;/p&gt;
&lt;p&gt;Książka &lt;a href=&quot;http://www.growing-object-oriented-software.com/&quot;&gt;Growing Object Oriented Software, Guided by Tests&lt;/a&gt; to doskonała pozycja dla wszystkich, którzy chcieli by ugruntować swoją wiedzę o TDD lub chcą poznać techniki związane z automatycznym testowaniem oprogramowania. Książka pokazuje krok po kroku co i jak testować. Na co zwrócić szczególną uwagę, co testować na którym poziomie testów. Według mnie pozycja obowiązkowa dla każdego programisty. Robert 'Ruper' Pankowiecki w swojej &lt;a href=&quot;http://blog.robert.pankowecki.pl/2010/09/growing-object-oriented-software-guided.html&quot;&gt;recenzji&lt;/a&gt; tej książki pisze, że książka powinna być obowiązkowa na studiach. Trudno mi się z tym nie zgodzić!&lt;/p&gt;
&lt;p&gt;Jeśli nie czytałeś tej książki kup ją i przeczytaj. Zamów do firmowej biblioteczki. Jestem pewien, że na tym skorzystasz.&lt;/p&gt;
</description><pubDate>Sat, 09 Apr 2011 13:58:49 +0200</pubDate><guid>http://blog.sebastiannowak.com/2011/04/09/testowanie-oprogramowania-pordrecznik/</guid><category>agile</category><category>it</category><category>programowanie</category><category>recenzje</category><category>Techblog</category><category>software test programming</category></item><item><title>RVM raz jeszcze</title><link>http://blog.sebastiannowak.com/2011/03/11/rvm-raz-jeszcze/</link><description>&lt;p&gt;&lt;a href=&quot;http://rvm.beginrescueend.com/&quot;&gt;rvm&lt;/a&gt; znam i używam od jakiegoś czasu. Jednak nigdy nie miałem go porządnie skonfigurowanego. Dopiero kilka dni temu porządnie się nim zająłęm. Nie będę pisał o tym czy &lt;tt&gt;rvm&lt;/tt&gt; jest bo to już bardzo dobrze opisał Łukasz Adamczak na stronach &lt;a href=&quot;http://rubysfera.pl/2010/09/warte-uwagi-rvm/&quot;&gt;Rubysfery&lt;/a&gt;. Ja dziś opiszę kilka spraw, które tam umknęły, a które u mnie się fajnie sprawdzają.&lt;/p&gt;
&lt;h3&gt;Gemsety&lt;/h3&gt;
&lt;p&gt;Gemsety były opisywane przez Łukasza, ale kilka słów więcej nie zaszkodzi. Czasami zdarza się, szczególnie w starszych projektach, że mając zainstalowane kilka wersji gema - jedną święzą, drugą starą (powiedzmy, że sprzed 2 lat) - iż projekt nijak nie chce ruszyć. Ja nazywam gemsety jak jak projekty przy których pracuję. Każdy projekt dostaje swój wyizolowany zestaw gemów - gemset i tak mam gemsety: &lt;tt&gt;@getresponse&lt;/tt&gt;, &lt;tt&gt;@multiconverter&lt;/tt&gt;, &lt;tt&gt;@clickmeeting_partners&lt;/tt&gt; i kilka innych ...&lt;/p&gt;
&lt;h3&gt;Aliasy&lt;/h3&gt;
&lt;p&gt;Ileż to razy zadarzyło mi się wpisywać &lt;kbd&gt;rvm use ruby-1.8.7-p330&lt;/kbd&gt; i zawsze myliłem się do co numeru patchelevla. Musiałem sprawdzić listę zainstalowanych wersji i dopiero poprawnie wpisywałem &lt;tt&gt;rvm use ...&lt;/tt&gt; Aliasy to rozwiązują. &lt;kbd&gt;rvm alias create 1.8.7 ruby-1.8.7-p334&lt;/kbd&gt; Powyższe polecenie tworzy alias &lt;tt&gt;1.8.7&lt;/tt&gt; i nidy nie będzie już trzeba wpisywać patchlevela, wystarczy &lt;kbd&gt;rvm use 1.8.7&lt;/kbd&gt;. Podoby alias mam stworzony na najnowszą wersję z lini 1.9.&lt;/p&gt;
&lt;h3&gt;Nie chce mi się tego pisać&lt;/h3&gt;
&lt;p&gt;I bardzo dobrze! Bo nie musisz. Jeśli stworzysz w katalogu z projektem mały pliczek &lt;tt&gt;.rvmrc&lt;/tt&gt; będzie on odczytywany przy każdym wejściu do katalogu i dzięki niemu rvm może automatycznie przełączyć wersje Rubiego i &lt;tt&gt;gemset&lt;/tt&gt;. Taka zawartość &lt;tt&gt;.rvmrc&lt;/tt&gt;: &lt;kbd&gt;rvm use 1.8.7@getresponse&lt;/kbd&gt; spowoduje automatyczne przełączenie na alias '1.8.7' i gemset 'getresponse'. Czysta magia! ;-)&lt;/p&gt;
&lt;h3&gt;Jeszcze bardziej DRY&lt;/h3&gt;
&lt;p&gt;Po zainstalowaniu kolejnej wersji Rubiego rvm domyślnie zainstaluje takie gemy jak rake i rdoc. Stworzysz swój gemset, wydasz polecenie &lt;kbd&gt;bundle install&lt;/kbd&gt; w swoim katalogu z projektem i ... nic. &lt;a href=&quot;http://gembundler.com/&quot;&gt;Bundler&lt;/a&gt; nie jest zainstalowany. Czar pryska. Rozwiązanie: &lt;tt&gt;@global&lt;/tt&gt; gemset. Ten gemset zawiera gemy, które będa dostępne nawet gdy zadeklarujemy, że chcemy używać naszego gemseta. Idealne miejsce na tak powszechnie używany gem jak bundler. Gemy, które mają być zainstalowane automatycznie najlepiej wpisać do pliku &lt;tt&gt;~/.rvm/gemsets/global.gems&lt;/tt&gt;. Jakby tego mało można zdefiniować gemy, które mają być zainstalowane w &lt;tt&gt;@global&lt;/tt&gt; oddzielnie dla &lt;a href=&quot;http://jruby.org&quot;&gt;JRuby&lt;/a&gt;, &lt;a href=&quot;http://rubini.us&quot;&gt;Rubinius&lt;/a&gt;, &lt;a href=&quot;http://www.rubyenterpriseedition.com/&quot;&gt;REE&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Give my some prompt ...&lt;/h3&gt;
&lt;p&gt;Jeśli trochę dłużej popracujemy przełączając się pomiędzy różnymi gemsetami, wersjami Rubiego łatwo się zgubić i stracić orientację jakiego gemsetu i Rubiego teraz się używa. &lt;tt&gt;rvm&lt;/tt&gt; rozwiązuje ten problem - &lt;a href=&quot;http://rvm.beginrescueend.com/workflow/prompt/&quot;&gt;rvm-prompt&lt;/a&gt;. W połączeniu z &lt;a href=&quot;http://www.zsh.org/&quot;&gt;zsh&lt;/a&gt; i pewnie z każdym innym shellem potrafi dać niezłe rezultaty. Mój prompt wygląda tak: &lt;img src=&quot;http://farm6.static.flickr.com/5218/5516604585_9b8dc9de8d.jpg&quot;&gt; uzyskuje go korzystając z &lt;a href=&quot;https://gist.github.com/865680&quot;&gt;takiego&lt;/a&gt; &lt;tt&gt;zlogin&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;To właściwie byłoby na tyle. Jeśli znacie jakieś inne sztuczki, których używacie z &lt;tt&gt;rvm&lt;/tt&gt; to chętnie je poznam.&lt;/p&gt;
</description><pubDate>Fri, 11 Mar 2011 11:07:18 +0100</pubDate><guid>http://blog.sebastiannowak.com/2011/03/11/rvm-raz-jeszcze/</guid><category>it</category><category>Ogólne</category><category>programowanie</category><category>ruby</category><category>Techblog</category><category>ruby rvm zsh trick</category></item><item><title>UJS, atrytuby data-* w Rails 3</title><link>http://blog.sebastiannowak.com/2010/09/20/ujs-atrytuby-data-w-rails-3/</link><description>&lt;p&gt;Ostatnio sporo radności i satysfakcji daje mi zabawa z nowymi &lt;a href=&quot;http://rubyonrails.com&quot;&gt;Railsami&lt;/a&gt;. Pisząc nowymi mam na myśli nowinki jakie pojawiły się w Rails 3. Ponieważ mam podejście do &quot;jeśli piszę coś w domu i nikt mnie nie ogranicza to użyję coś czego nie mam okazji używać nacodzień&quot;. W końcu trzeba się czegoś nowego czasem nauczyć ;). I tak ostatnio trochę bawiłem się &lt;a href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt; w Rails 3.&lt;/p&gt;
&lt;p&gt;Każdy kto śledził nowości w Rails 3 wie, że teraz na topie jest &quot;unobtrusive JavaScript&quot; i korzystanie z niestandardowych atrybutów &lt;a href=&quot;http://ejohn.org/blog/html-5-data-attributes/&quot;&gt;data-*&lt;/a&gt;. I tak to co w wcześniejszych wersjach wypluwał helper: &lt;code&gt;{geshi lang=ruby}link_to 'Delete', object_path(object), :confirm =&amp;gt; &quot;Are you sure?&quot;, :method =&amp;gt; :delete{/geshi}&lt;/code&gt; wstawiało jakieś wstrętne i rozwlekłe kody JS, a teraz wygląda tak: {geshi lang=html4strict}&lt;a href=&quot;/object/1024&quot; data-method=&quot;delete&quot; data-confirm=&quot;Are you sure?&quot;&gt;Delete&lt;/a&gt;{/geshi} Przez to kod wypluwany przez metody pomocnicze nie ma bezpośrednio do czynienia z kodem JavaScript i nie ma znaczenia czy jest używany &lt;a href=&quot;http://prototypejs.org&quot;&gt;Prototype&lt;/a&gt;, &lt;a href=&quot;http://jquery.com&quot;&gt;jQuery&lt;/a&gt; czy coś jeszcze innego. Obsługa tego typu helperów umieszczona jest standardowo w pliku &lt;tt&gt;public/javascripts/rails.js&lt;/tt&gt;. Poniżej zademonstruję jak zaimplementować obsługę własnych atrybutow &lt;tt&gt;data-*&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Przykładowe zadanie: wyświetlać ilość wpisanych w textarea znaków.&lt;br&gt;
W widoku będzie coś takiego: {geshi lang=ruby}= form_for(:message, :url =&amp;gt; messages_path, :html =&amp;gt; { :class =&amp;gt; &quot;form&quot;, :id =&amp;gt; &quot;new_message_form&quot; }) do |f| = f.text_area :body, &quot;data-counter&quot; =&amp;gt; &quot;span#message-counter&quot; # bla bla bla{/geshi} W rezultacie zostanie wypluty HTML: {geshi lang=html4strict}&lt;/p&gt;
&lt;form action=&quot;/messages&quot;&gt;&lt;textarea name=&quot;message_body&quot; data-counter=&quot;span#message-counter&quot;&gt;&lt;/form&gt;
&lt;p&gt;{/geshi} 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: {geshi lang=javascript}$(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) }) }) }){/geshi} Trzeba tylko pamiętać by plik JS ładować w szablonie za pomocą &lt;tt&gt;javascript_include_tag&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Ciekawe linki na podobny temat:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.robert.pankowecki.pl/2010/08/rails-3.html&quot;&gt;Dynamically removing some website content in Rails 3 Way (Prototype, UJS)&lt;/a&gt; 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!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://joshhuckabee.com/jquery-rails-3&quot;&gt;jQuery with Rails 3&lt;/a&gt; - opis jak zastąpić standardowy rails.js tym, który korzysta z jQuery&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;</description><pubDate>Mon, 20 Sep 2010 18:29:27 +0200</pubDate><guid>http://blog.sebastiannowak.com/2010/09/20/ujs-atrytuby-data-w-rails-3/</guid><category>it</category><category>programowanie</category><category>rails</category><category>Techblog</category><category>ujs jquery unobtrusive javascrive rails3 rails</category></item><item><title>Rails 3 + Ruby 1.9.2 + Megiteam</title><link>http://blog.sebastiannowak.com/2010/09/04/rails-3-ruby-1-9-2-megiteam/</link><description>&lt;p&gt;Jak powszechnie wiadomo Rails 3 &lt;a href=&quot;http://rubysfera.pl/2010/08/ruby-on-rails-3/&quot;&gt;zostało wydane&lt;/a&gt;. 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 &lt;a href=&quot;http://www.megiteam.pl/refk/seban/&quot;&gt;Megiteam&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Ruby 1.9.2&lt;/h3&gt;
&lt;p&gt;Moja ulubiona firma hostingowa - &lt;a href=&quot;http://www.megiteam.pl/refk/seban/&quot;&gt;Megiteam&lt;/a&gt; już od dłuższego czasu dawała możliwość korzystania z Ruby 1.9.1-p0. Jak zrobić to krok bo kroku &lt;a href=&quot;http://www.megiteam.pl/tag/1.9&quot;&gt;w pomocy&lt;/a&gt; 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: &lt;kbd&gt;/home/seban/www/.ruby/gems/1.9/bin/&lt;/kbd&gt;. Pierwszy sukces! Tak, pewnie można zrobić to za pomocą &lt;a href=&quot;http://rvm.beginrescueend.com/&quot;&gt;rvm&lt;/a&gt;, jednak ja nie próbowałem.&lt;/p&gt;
&lt;h3&gt;Bundler&lt;/h3&gt;
&lt;p&gt;Jeśli nie wiesz co to jest Bundler zachęcam do przeczytania artykułu w serwisie &lt;a href=&quot;http://rubysfera.pl/2010/08/warte-uwagi-bundler/&quot;&gt;rubysfera.pl&lt;/a&gt;.&lt;br&gt;
Instalacja bundlera: &lt;kbd&gt;gem install bundler&lt;/kbd&gt;. Nie powinno być najmniejszych problemów. Drugi sukces!&lt;/p&gt;
&lt;h3&gt;Thin&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.megiteam.pl/refk/seban/&quot;&gt;Megiteam&lt;/a&gt; daje trzy możliwości uruchamiana aplikacji Rails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mongrel, Ruby 1.8&lt;/li&gt;
&lt;li&gt;Thin, Ruby 1.8&lt;/li&gt;
&lt;li&gt;Thin,Ruby 1.9&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jak widać wybór dla Ruby 1.9 jest bardzo prosty ;). Wybrałem &lt;a href=&quot;http://code.macournoyer.com/thin/&quot;&gt;thin&lt;/a&gt;. Jednakże tutaj pojawił się problem. Po zdeployowaniu aplikacji (o tym za chwile) aplikacja nie wstawała. Według mnie problemem okazała się wersja thina, domyślnie jest to 1.2.2. Po zainstalowaniu (zwykłe gem install) najnowszej wersji 1.2.7 aplikacja wstała już bez problemu. Dodatkowo trzeba pamiętać by ustawić zmienną środowiskową &lt;tt&gt;RACK_ENV&lt;/tt&gt; na żądane przez nas środowisko - 'production'.&lt;/p&gt;
&lt;p&gt;
&lt;h3&gt;Deploy&lt;/h3&gt;
&lt;p&gt;Deploy za pomoca &lt;a href=&quot;capify.org&quot;&gt;Capistrano&lt;/a&gt; nie różni się specjalnie od standardowego. Musimy jedynie zmienić dwie rzeczy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deploy musi uwzględniać użycie bundlera&lt;/li&gt;
&lt;li&gt;restart aplikacji musi się odbyć za pomocą meigteamowego skryptu 'restart-app'&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pierwszą sprawę załatwiłem metodą copy-paste. Kacper Bielecki przedstawił już działające rozwiązanie &lt;a href=&quot;http://kazjote.eu/2010/08/04/bundler-and-capistrano-the-right-way&quot;&gt;połączenia bundlera i capistrano&lt;/a&gt;. Wszystko jest tam całkiem proste i dobrze wytłumaczone.&lt;br&gt;
Restart aplikacji już kiedyś &lt;a href=&quot;http://kazjote.eu/2010/08/04/bundler-and-capistrano-the-right-way&quot;&gt;opisywałem&lt;/a&gt;. Cały Capfile dostępny jest w formie &lt;a href=&quot;http://gist.github.com/565132&quot;&gt;gista&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;img src=&quot;http://blogs.escolaturbula.com/bestmusic/files/2009/06/the-end-03.jpg&quot;&gt;&lt;/p&gt;
</description><pubDate>Sat, 04 Sep 2010 14:05:34 +0200</pubDate><guid>http://blog.sebastiannowak.com/2010/09/04/rails-3-ruby-1-9-2-megiteam/</guid><category>programowanie</category><category>rails</category><category>ruby</category><category>Techblog</category><category>rails ruby megiteam thin hosting bundler</category></item><item><title>Distributed programming with Ruby</title><link>http://blog.sebastiannowak.com/2010/07/29/distributed-programming-with-ruby/</link><description>&lt;p&gt;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 &lt;a href=&quot;http://www.amazon.com/Distributed-Programming-Ruby-Mark-Bates/dp/0321638360&quot;&gt;Distributed Programming with Ruby&lt;/a&gt; Marka Batesa. Wspomniana ksiązka wydana jest przez wydawnictwo Addison-Wesley. Wcześniej opisywałem kilka książek z tego wydawnictwa &lt;a href=&quot;http://seban.jogger.pl/2010/03/11/refaktoring-ruby-edition-recenzja/&quot;&gt;Refactoring. Ruby Edition&lt;/a&gt; i &lt;a href=&quot;http://seban.jogger.pl/2010/04/15/ruby-wzorce-projektowe-recenzja/&quot;&gt;Ruby. Wzorce Projektowe&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/seattlerb/ringydingy&quot;&gt;RingyDingy&lt;/a&gt; - brzmi jak imie dla pasa, ostatni commit 15.12.2006.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/cardmagic/starfish&quot;&gt;Starfish&lt;/a&gt; - ostatni commit 06.12.2007&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/markbates/distribunaut&quot;&gt;Distribunaut&lt;/a&gt; - autorstwa tego samego Pana co cała książka&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/mperham/politics&quot;&gt;Politics&lt;/a&gt; - też wielkiej kariery ten gem nie zrobił&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Najciekawszą częścią książki było omówienie &lt;a href=&quot;http://github.com/starling/starling&quot;&gt;Starlinga&lt;/a&gt; i &lt;a href=&quot;http://www.amqp.org/confluence/display/AMQP/Advanced+Message+Queuing+Protocol&quot;&gt;AMQP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;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.&lt;/p&gt;
</description><pubDate>Thu, 29 Jul 2010 09:54:26 +0200</pubDate><guid>http://blog.sebastiannowak.com/2010/07/29/distributed-programming-with-ruby/</guid><category>programowanie</category><category>recenzje</category><category>ruby</category><category>Techblog</category><category>ruby book review distributed programming programowanie</category></item><item><title>Ruby. Wzorce projektowe - recenzja</title><link>http://blog.sebastiannowak.com/2010/04/15/ruby-wzorce-projektowe-recenzja/</link><description>&lt;p&gt;Ostatnio jakoś same książki opisuję. Dziś chciałem opisać książkę &lt;a href=&quot;http://helion.pl/ksiazki/ruby_wzorce_projektowe,rubywz.htm&quot;&gt;Ruby. Wzorce projektowe&lt;/a&gt; Russa Olsena. Inaczej niż &quot;Refactoring, Ruby edition&quot; książka jest wydana po polsku i można ją kupić choćby w księgarni &lt;a href=&quot;http://helion.pl&quot;&gt;Helionu&lt;/a&gt;. 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 &lt;a href=&quot;http://ruby-lang.org&quot;&gt;Ruby&lt;/a&gt;. Według mnie to lekkie przegięcie by wpychać wszędzie &quot;szybkie wprowadzenie do Ruby&quot;. Kompletny Ruby-laik pewnie po tym krótkim kursie (50 stron) będzie rozumiał wszystkie przykłady zamieszczone w książce.&lt;/p&gt;
&lt;p&gt;W książce mamy opisane kilka standardowych wzorców projektowych pokazanych już przez &quot;gang of four&quot; 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.&lt;/p&gt;
&lt;p&gt;Uważam, że książka jest dobrą pozycją dla programistów, którzy nie są nowicjuszami, ale też nie da wymiataczy. Ale pewnie wielu &quot;wymiataczy&quot;, 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 &quot;pitu-pitu&quot; zamiast konkretnych informacji. Jak ktoś pisze w Ruby i jeszcze nie zna wzorców projektowych to &lt;b&gt;musi&lt;/b&gt; to przecztać.&lt;/p&gt;
</description><pubDate>Thu, 15 Apr 2010 09:55:30 +0200</pubDate><guid>http://blog.sebastiannowak.com/2010/04/15/ruby-wzorce-projektowe-recenzja/</guid><category>programowanie</category><category>recenzje</category><category>ruby</category><category>Techblog</category><category>ruby wzorce projektowe ksiazki recenzja</category></item><item><title>Refactoring: Ruby edition - recenzja</title><link>http://blog.sebastiannowak.com/2010/03/11/refaktoring-ruby-edition-recenzja/</link><description>&lt;p&gt;Dziś chcę napisać o książce &lt;a href=&quot;http://www.amazon.com/Refactoring-Ruby-Jay-Fields/dp/0321603508&quot;&gt;Refactoring: Ruby Edition&lt;/a&gt;. Stety albo niestety książka nie jest dostępna w języku polskim. Książka nie jest przeznaczona dla początkujących programistów &lt;a href=&quot;http://ruby-lang.org&quot;&gt;Ruby&lt;/a&gt;. Nie ma w niej szybkiego kursu języka, jednak nie trzeba być &quot;wyjadaczem&quot; 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.&lt;/p&gt;
&lt;p&gt;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. &quot;code smells&quot; i powinien znać sposoby jak się ich pozbyć.&lt;/p&gt;
&lt;p&gt;Warto zwrócić uwagę, że wydawnictwo &lt;a href=&quot;http://www.informit.com/promotions/promotion.aspx?promo=135393&quot;&gt;Addison-Wesley&lt;/a&gt; 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ą&lt;/p&gt;
</description><pubDate>Thu, 11 Mar 2010 20:19:54 +0100</pubDate><guid>http://blog.sebastiannowak.com/2010/03/11/refaktoring-ruby-edition-recenzja/</guid><category>it</category><category>programowanie</category><category>recenzje</category><category>ruby</category><category>Techblog</category><category>ruby refactoring  books review</category></item></channel></rss>
