<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4595331212232236129</id><updated>2012-02-16T03:21:35.978-08:00</updated><category term='ruby'/><category term='editor'/><category term='javarsovia'/><category term='scala'/><category term='javarsovia2010'/><category term='scalaide'/><category term='rubymine'/><category term='ide'/><category term='rails'/><category term='netbeans'/><title type='text'>Rails Wars</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-5552842238332596599</id><published>2012-01-25T18:35:00.000-08:00</published><updated>2012-01-25T18:45:18.359-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scalaide'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>ScalaIDE (Scala 2.8) i problemy z aktorami</title><content type='html'>Dziś dla odrobiny relaksu znowu posiedziałem ze scalą. Ściągnąłem ScalaIDE i zainstalowałem na świeżej absolutnie instalacji Eclipse'a 3.6. Wyciągnąłem kawałek kodu korzystający z biblioteki scala.actors i wrzuciłem do wprost do IDE. Oto ten kod:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1680621.js?file=MyProgram.scala"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Niestety próba uruchomienia go z poziomu IDE przyniosła tylko smutny efekt w konsoli IDE:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1680629.js?file=result_actor_scalaide"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;...a uruchomienie z terminalu przynosi spodziewany efekt:&lt;br /&gt;&lt;br /&gt;$scala info.jjhop.mp.MyProgram&lt;br /&gt;Hello world!&lt;br /&gt;Dostalem: Rafal&lt;br /&gt;Dostalem: Kamilka&lt;br /&gt;Dostalem: Zosia&lt;br /&gt;???&lt;br /&gt;???&lt;br /&gt;robimy wypad&lt;br /&gt;&lt;br /&gt;Ja niestety nie rozumiem przyczyny takiego zachowania, ale usprawiedliwiam się późną porą :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-5552842238332596599?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/5552842238332596599/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=5552842238332596599' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/5552842238332596599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/5552842238332596599'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2012/01/scalaide-scala-28-i-problemy-z-aktorami.html' title='ScalaIDE (Scala 2.8) i problemy z aktorami'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-8014791171703945882</id><published>2012-01-24T04:05:00.000-08:00</published><updated>2012-01-24T04:14:04.352-08:00</updated><title type='text'>JVM CRASH</title><content type='html'>Siedzę przy komputerze i czując oddech terminów na plecach koduje. Drobna zmiana w pliku *.jsp i standardowe F5 w przeglądarce. I nagle mnie tu z flanki JVM zaatakowała :)&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1669928.js?file=%20C:%5CDev%5CJava%5C******%5Cweb-client%5Chs_err_pid4748.log"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-8014791171703945882?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/8014791171703945882/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=8014791171703945882' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/8014791171703945882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/8014791171703945882'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2012/01/jvm-crash.html' title='JVM CRASH'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-2861228421516194017</id><published>2011-12-30T04:50:00.000-08:00</published><updated>2011-12-30T04:56:52.016-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>Ruby i możliwości, które daje</title><content type='html'>Porządkując ostatnio różne rzeczy na dysku, znalazłem fragment kodu - fajny :) to dobre słowo&lt;br /&gt;&lt;br /&gt;&lt;code&gt;class Fixnum&lt;br /&gt;  def september(year=Time.new.year)&lt;br /&gt;    Time.mktime(year, 9, self, 0, 0, 0)&lt;br /&gt;  end&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Konkretnie rzecz biorąc to chodzi o to, aby móc datę zapisać tak&lt;br /&gt;&lt;br /&gt;&lt;code&gt;23.september(1974)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;i dostać obiekt Time, odpowiadający wskazanej dacie.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;irb(main):001:0&gt;&lt;br /&gt;irb(main):002:0* class Fixnum&lt;br /&gt;irb(main):003:1&gt;   def september(year=Time.new.year)&lt;br /&gt;irb(main):004:2&gt;     Time.mktime(year, 9, self, 0, 0, 0)&lt;br /&gt;irb(main):005:2&gt;   end&lt;br /&gt;irb(main):006:1&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):007:0&gt; born_date = 23.september(1974)&lt;br /&gt;=&gt; Mon Sep 23 00:00:00 +0200 1974&lt;br /&gt;irb(main):008:0&gt; born_date.class&lt;br /&gt;=&gt; Time&lt;br /&gt;irb(main):009:0&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Trzeba zaimplementować klasę w taki sposób, żeby działał z każdym miesiącem (zadanie domowe) a ideałem byłoby żeby działało tak:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;23.september year ago&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Wbrew pozorom nie jest to takie trudne :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-2861228421516194017?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/2861228421516194017/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=2861228421516194017' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/2861228421516194017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/2861228421516194017'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2011/12/ruby-i-mozliwosci-ktore-daje.html' title='Ruby i możliwości, które daje'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-4323142585636366561</id><published>2011-12-15T17:22:00.000-08:00</published><updated>2011-12-15T17:33:20.467-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rubymine'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Rails + RubyMine= Radość_z_programowania</title><content type='html'>Wiele miesięcy temu pisałem o wsparciu jakie Netbeans 6 zaoferował programistom Ruby/Rails. jedna z dystrybucji NB6 była przeznaczona dla programistów Ruby/Rails. Bardzo długo używałem właśnie NB do pracy z Railsami (jakiś kod mniejszy - nie railsowy - pisałem jednak w VIMie, takie przyzwyczajenie). Potem Oracle wykupił Suna i wsparcie dla NB powoli odeszło na drugi plan. Właśnie wtedy ludzie z Jetbrains przekonali mnie, że powinienem wypróbować RubyMine. Kupiłem je na początku tego roku i używam do dziś (podobnie jak Ideę). A teraz do rzeczy :)&lt;br /&gt;&lt;br /&gt;Siedzę sobie i koduję (aplikacja Rails). Zmieniłem model, zresetowałem DB, w bazie mam kilka produktów, zaczynam składać jakiś obiekt i zapisuję. Oczywiście korzystam z railsowej konsoli w RubyMine. Wtem przychodzi mi do głowy, że chciałbym podejrzeć poskładany obiekt jakoś sensownie (fragment koszyka).&lt;br /&gt;&lt;br /&gt;&gt;&gt; item.to_s # zwraca jakiś szajs... &lt;br /&gt;&lt;br /&gt;Sprawdzam (Ctrl-O CartItem) jak w klasie wygląda metoda to_s - wygląda fatalnie :). Poprawiam, ale w oknie konsoli, w której mam normalne podpowiadanie właściwości z klasy itd... po prostu bajka! Po napisaniu kodu, uruchamia na pierwszym obiekcie to_s - wszystko działa jak trzeba :) o jak ja kocham Rubyego, Railsy i RubyMine - wszystko na "R" - zupełnie jak moje imię "Rafał", przypadek jakiś czy co?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-tzNvTJv92TQ/TuqfmAfo0QI/AAAAAAAAAOU/I9UX3YhucKQ/s1600/ruby_mine.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 228px;" src="http://1.bp.blogspot.com/-tzNvTJv92TQ/TuqfmAfo0QI/AAAAAAAAAOU/I9UX3YhucKQ/s320/ruby_mine.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5686532954825216258" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-4323142585636366561?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/4323142585636366561/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=4323142585636366561' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/4323142585636366561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/4323142585636366561'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2011/12/rails-rubymine-radosczprogramowania.html' title='Rails + RubyMine= Radość_z_programowania'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-tzNvTJv92TQ/TuqfmAfo0QI/AAAAAAAAAOU/I9UX3YhucKQ/s72-c/ruby_mine.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-9011205842288668971</id><published>2011-12-08T15:29:00.000-08:00</published><updated>2011-12-08T15:35:27.734-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala, Idea (ta od Jetbrains) i nowa zabawa :)</title><content type='html'>Od jakiegoś czasu bliżej przyglądam się Scali, bawię się i szukam inspiracji. Dziś pierwszy kod napisany w Scali w Idei (z pluginem do Scali) i wsparciem Mavena, bez którego już nie chcę sobie wyobrażać koderki na JVM.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;package info.jjhop.scala&lt;br /&gt;package playground&lt;br /&gt;&lt;br /&gt;object App {&lt;br /&gt;  def main(args : Array[String]) : Unit = {&lt;br /&gt;    val lines = List("na", "co", "dybie", "w", "wielorybie",&lt;br /&gt;                     "czubek", "nosa", "eskimosa")&lt;br /&gt;    println(foo(lines))&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def foo(a : List[String]): String = &lt;br /&gt;    if(a.isEmpty) "" else a.head + " " + foo(a.tail)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Ciekawe dokąd mnie to zaprowadzi :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-9011205842288668971?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/9011205842288668971/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=9011205842288668971' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/9011205842288668971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/9011205842288668971'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2011/12/scala-idea-ta-od-jetbrains-i-nowa.html' title='Scala, Idea (ta od Jetbrains) i nowa zabawa :)'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-8115045997749583929</id><published>2011-01-21T05:33:00.000-08:00</published><updated>2011-01-21T05:53:26.329-08:00</updated><title type='text'>helpdesk, jhelpdesk, tomcat, jetty i maven... mnóstwo rzeczy i jeszcze echa krzesła dla programisty</title><content type='html'>Jak patrzę na mój blog, to widzę, że ostatni post, który napisałem zachwalał krzesło dla programisty :) i to było już pół roku temu (może "ciut" więcej, ale tylko "ciut" i ani trochę więcej). Krzesło rzeczywiście sprawdza się w stu procentach i wciąż z czystym sumieniem polecam firmę, która to krzesło mi sprzedała. Ale nie o tym dziś chcę napisać.&lt;br /&gt;Dziś napiszę o nowy/starym projekcie, nad którym pracuję - &lt;span style="font-weight:bold;"&gt;jHelpdesk&lt;/span&gt;. Praca nad kodem trwa już kilka lat, ale z długimi przerwami, kod w repozytorium nie zawsze był (i jest) uaktualniany. No po prostu tragedia, jednym słowem dzieje się z nim to, co dziać się nie powinno. Ostatni jednak  wraz z Adamem B. (świetnym gościem, z którym przyjaźnię od tak dawna, że nie potrafię powiedzieć od kiedy) postanowiliśmy to poważnie zmienić i przygotowaliśmy plan realizowany krok po kroku, a jego celem jest pierwszy lutego 2011. To ma być dzień, gdy będziemy gotowi zaoferować jhelpdesk komercyjnie (helpdesk byłby pewnie lepszą nazwą, ale projektów o tej nazwie jest znacznie więcej). Ale dlaczego o tym piszę tutaj (skoro napisałem już na blogu "nie tylko o tym i owym".&lt;br /&gt;Pewnie skoro czytasz ten tekst to czytałeś także &lt;a href="http://railswars.blogspot.com/2010/06/hostowanie-aplikacji-jee-na-tomcacie.html"&gt;"Hostowanie wielu instancji jednej aplikacji JEE na Tomcacie"&lt;/a&gt;. I to właśnie jest kluczem do tej zagadki. Będziemy w taki właśnie sposób hostować wiele instancji programu. Tyle tylko, że prawdopodobnie wykorzystamy do tego serwer Jetty. Proces developerski odbywa się właśnie za pomocą Jetty (a jak kochamy Maven'a i jego cudowne pluginy, dzięki którym piszemy&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ mvn jetty:run&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;i możemy oglądać webaplikację w działaniu :) Tak więc przy okazji pojawia się szansa na dorby artykuł o tym jak hostować wiele instancji jednej aplikacji JEE na  Jetty. Myślę, że się skuszę i o tym napiszę. &lt;br /&gt;A przy okazji artykułów - jestem już &lt;span style="font-style:italic;"&gt;po słowie&lt;/span&gt; z Grześkiem Dudą i w najbliższym numerze Javaexpress pojawi się kontunuacja artykułu o tym jak używać Mavena w codziennej pracy (pod warunkiem, że codziennie piszesz projekty w javie). Przy okazji dziękuję wszystkim za ciepłe słowa na temat pierwszej części artykułu.&lt;br /&gt;Tak więć nastrój czestotliwość na &lt;a href="http://jhelpdesk-online.com"&gt;jhelpdesk-online.com&lt;/a&gt;, czytaj &lt;a href="http://blog.jhelpdesk-online.com"&gt;blog.jhelpdesk-online.com&lt;/a&gt; i zajrzyj tutaj, wszedzie obiecuję coś ciekawego.&lt;br /&gt;Polecam także blog Adama =&gt; &lt;a href="http://www.ffffrozen.com/"&gt;http://www.ffffrozen.com/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-8115045997749583929?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/8115045997749583929/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=8115045997749583929' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/8115045997749583929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/8115045997749583929'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2011/01/jak-patrze-na-moj-blog-to-widze-ze.html' title='helpdesk, jhelpdesk, tomcat, jetty i maven... mnóstwo rzeczy i jeszcze echa krzesła dla programisty'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-7859210370868324419</id><published>2010-07-02T03:59:00.000-07:00</published><updated>2010-07-02T08:22:01.292-07:00</updated><title type='text'>Krzesło dla programisty - tylko z centrumkrzesel.pl</title><content type='html'>Dziwny to post na blogu - głównie - programistycznym. Jednak krzesło w życiu programisty jest niezwykle ważnym meblem, zresztą nie tylko w życiu programisty - każdy, kto spędza wiele godzin siedząc przy biurku, powinien mieć szansę siedzieć wygodnie. Teraz jednak właściwa historia.&lt;br /&gt;&lt;br /&gt;Kilka miesięcy temu w &lt;a href="http://centrumkrzesel.pl"&gt;centrumkrzesel.pl&lt;/a&gt; kupiłem krzesło Futura 10. Trochę wydaje się stworzone w aurze inspiracji kultowym Aeronem. Jest dość lekkie, dość solidne (przy czym solidności dodaje krzesłu obsługa gwarancyjna) i niezwykle wygodne. Krzesło jest dość kosztowne - jego nabycie wiąże się z wydatkiem rzędu 1200-1300zł - ale na pewno warte jest swojej ceny.&lt;br /&gt;A teraz najważniejsze, w ostatnich dniach krzesło trochę się popsuło, oparcie straciło możliwość blokowania (najważniejsza chyba funkcja krzesła) i pękł uchwyt zagłówka. Kompletny &lt;span style="font-style:italic;"&gt;disaster&lt;/span&gt;! Zajrzałem więc na stronę Centrum Krzeseł, odnalazłem numer kontaktowy, zadzwoniłem i w krótkiej rzeczowej rozmowie z panią z firmy wyjaśniłem na czym polega mój problem. Pani spokojnym głosem poprosiła, żebym opisał problem w mailu a sprawa zostanie szybko załatwiona (dodam, że rozmowa miała miejsce w poniedziałek - 28.06.2010). Tak też zrobiłem i po niedługiej chwili otrzymałem mail z odpowiedzią i informacją, że moim okaleczonym krzesłem w ciągu kilku dni ktoś się zajmie a wcześniej się ze mną skontaktuje. Uspokojony tą informacją wróciłem do swoich codziennych zajęć. &lt;br /&gt;Wczoraj wczesnym popołudniem (około 14) zadzwonił telefon i chwilę później w moich drzwiach pojawił się przemiły pracownik Centrum Krzeseł. Wyjaśnił, że przyjechał zająć się moją okaleczoną futurką i potrzebuje kilkunastu minut. Zaproszony do środka wszedł i dokonał oględzin, z których wynikało, że jednak naprawa nie ma sensu i trzeba wymienić dwie uszkodzone części (siedzisko i zagłówek). Z naprawą uporał się w jakiś 10-15 minut. &lt;br /&gt;Na moje pytanie o koszty naprawy, uśmiechnął się o powiedział, że to w ramach gwarancji. Oczywiście kwit gwarancyjny czy faktura nie były potrzebne, bo jak stwierdził, skoro miał tu przyjechać to pewnie właśnie w ramach gwarancji a i tak wystarczająco dużo kłopotu miałem, skoro trzy dni bez krzesła musiałem żyć i dzwonić jeszcze itd. A dewizą firmy jest dobra obsługa klienta :)&lt;br /&gt;&lt;br /&gt;I dodam na sam koniec - obsługa jest naprawdę fachowa. Ludzie w Centrum Krzeseł nie tylko mówią o porządnej, przyjaznej i fachowej obsłudze klienta - oni naprawdę wiedzą na ten temat wszystko! I robią co mogą żeby klient był zadowolony - zawsze z uśmiechem na ustach. &lt;br /&gt;&lt;br /&gt;Jeśli więc chcesz kupić krzesło, po prostu zajrzyj na stronę &lt;a href="http://centrumkrzesel.pl"&gt;centrumkrzesel.pl&lt;/a&gt; i wybierz jakieś, reszta jest prosta i przyjemna!&lt;br /&gt;&lt;br /&gt;A na sam koniec to polecam futurę 10 - moja na zdjęciu poniżej.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9xR2Q6esm0Q/TC3H6iQqz7I/AAAAAAAAAJ0/rwC9eMCl7Yw/s1600/futurka10.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 198px; height: 320px;" src="http://4.bp.blogspot.com/_9xR2Q6esm0Q/TC3H6iQqz7I/AAAAAAAAAJ0/rwC9eMCl7Yw/s320/futurka10.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5489263329277562802" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-7859210370868324419?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/7859210370868324419/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=7859210370868324419' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/7859210370868324419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/7859210370868324419'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2010/07/krzeso-dla-programisty-tylko-z.html' title='Krzesło dla programisty - tylko z centrumkrzesel.pl'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9xR2Q6esm0Q/TC3H6iQqz7I/AAAAAAAAAJ0/rwC9eMCl7Yw/s72-c/futurka10.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-5188643763323629340</id><published>2010-06-29T02:04:00.000-07:00</published><updated>2010-06-29T08:15:06.312-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javarsovia2010'/><category scheme='http://www.blogger.com/atom/ns#' term='javarsovia'/><title type='text'>Javarsovia 2010</title><content type='html'>Javarsovia 2010 …&lt;br /&gt;&lt;br /&gt;W ostatnią sobotę (26 czerwca) większą część dnia spędziłem na konferencji Javarsovia 2010. O samej konferencji, dostępnych w tej edycji prezentacjach i samych prezenterach można przeczytać na stronie &lt;a href="http://javarsovia.pl"&gt;http://javarsovia.pl&lt;/a&gt;. „Rozkład jazdy” informuje o czterech dostępnych „ciągach wykładowych” (czy też ścieżkach edukacyjnych) – łącznie dwadzieścia cztery wykłady! - czyni to Javarsovię jedną z najbardziej interesujących konferencji w centralnej Europie. A jak było na miejscu? I czy rzeczywiście było tak różowo? O tym w dalszej części...&lt;br /&gt;&lt;br /&gt;Zaraz po przybyciu i dokonaniu rejestracji dostałem piękną koszulkę (pewnie będzie można mnie zobaczyć w niej tu i ówdzie) i parę innych gadżetów, oraz „rozkład jazdy”. Przyjrzawszy mu się wybrałem sobie i zakreśliłem interesujące mnie prezentacje, po czym niemal natychmiast skierowałem się w stronę sali głównej, gdzie miało odbyć się oficjalne powitanie i pierwsza wybrana przeze mnie prezentacja. (Dodam jeszcze, że od samego rana, do samego końca dnia, w holach dostępna była właściwie nieograniczona ilość kawy, herbaty i soków a także ciasteczka – dla głodnych - nie tylko wiedzy – uczestników; o obiedzie opowiem później). Powitanie – jak to powitanie – było kompletne i niezbyt długie, czyli dokładnie takie jak być powinno. A zaraz po nim „na scenę” wyszedł Jakub Nabrdalik – pierwszy prezenter. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jak zapobiegać biodegradacji kodu&lt;/span&gt; – merytoryczną część prezentacji pewnie można by zamknąć w 10-15 min. Jakub Nabrdalik wybrał jednak trudniejszą drogę i jego prezentacja przeplatana była dowcipnymi uwagami i wtrąceniami „z życia”. I właściwie uznałbym, że wyszło całkiem dobrze, gdyby nie to, że było nieco inaczej. Prowadząc prezentację, często bezsensownie używał anglojęzycznych wtrąceń (co mimo wszystko dałoby się jako usprawiedliwić), ale co drugie lub trzecie zdanie kończył niezbyt ładnym (i mało kulturalnym) „taaak?”. Co ciekawe Jakub mówił o współwłasności kodu, nieustannym poprawianiu itd... wspomniał także, że trzeba mieć „wielkie cojones” by odważyć się poprawiać kod napisany przez kogoś innego (mam nieco inne zdanie na ten temat, wydaje mi się, że trzeba być bardzo odważnym by nie poprawić czyjegoś niedziałającego lub popsutego kodu). Podczas prezentacji wypatrzyłem (naprawdę rzucało się to w oczy) dwa problemy w tekście pojawiającym się na tablicy – błędy tkwiły w prezentacji Jakuba (pierwszy to o - ile pamiętam – niewinna literówka, coś w style „dlaego” zamiast „dlatego”, drugi to brzydki ortograficzny błąd, coś jak „nie potrzebne” zamiast „niepotrzebne”). Pomyślałem – zupełnie bez złośliwości – że po prezentacji podejdę i „poprawię” te błędy (może i mam „wielkie cojones”?). Tak też oczywiście zrobiłem. Podszedłem do Jakuba i zwróciłem uwagę na dwa błędy, które warto poprawić (nie wspominałem o denerwującym „taaaak?” w co drugim zdaniu, żeby nie wyjść na złośliwca). Jakub wbrew moim przypuszczeniom pewnie poczuł się dotknięty uwagą i zamiast podziękować za nią (co wydawałoby się bardzo „na miejscu”) rzucił tylko gniewnie w moją stronę „Oooo... kolejny &lt;span style="font-weight:bold;"&gt;gramanazi&lt;/span&gt;!”. No i to byłoby na tyle... nic dodać, nic ująć...  Gratuluję tylko wdrażania w życie wartości, o których mówił przez 45 minut. No i od siebie dodam, że trzeba mieć wielkie jaja, żeby przyjąć krytykę lub po prostu uwagi na temat swojego dzieła.&lt;br /&gt;&lt;br /&gt;Moja ocena prezentacji to: 5/10 za treść, 2/10 za formę, 0/10 za resztę :)&lt;br /&gt;&lt;br /&gt;(Wojciech Seliga, kolejny prezenter ma na ten temat nieco inne zdanie – warto się z nim zapoznać tutaj → &lt;a href="http://unimplemented.blogspot.com/2010/06/javarsovia-gets-really-seriously-big.html"&gt;http://unimplemented.blogspot.com/2010/06/javarsovia-gets-really-seriously-big.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jak można zarobić na uczciwości, przejrzystości i szacunku do klienta - kontrakty agile w praktyce&lt;/span&gt; – prezentacja Wojciecha Seligi zaciekawiła mnie najpewniej dlatego, że sam jestem tego samego zdania – uczciwość w relacjach z klientami jest kluczowym elementem sukcesu w trakcie tworzenia oprogramowania. Sama prezentacja na wysokim poziomie merytorycznym, została poprowadzona bardzo ciekawie. Wojciech czasami wtrącał anglojęzyczne zwroty, ale uprzedził na samym początku, że mogą się pojawiać i z góry za nie przeprosił – nie stanowiły więc żadnego problemu.&lt;br /&gt;Trudno byłoby cokolwiek jego prezentacji zarzucić. Cały czas był zrelaksowany i dokładnie wiedział, w którym jej miejscu się znajduje i dokąd zmierza.&lt;br /&gt;&lt;br /&gt;Moja ocena: 10/10 za treść, 10/10 za formę.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Liftweb - simply functional webframework&lt;/span&gt; -  prezentacja przeprowadzona przez Łukasza Kuczerę. Na tę prezentację dotarłem z lekkim opóźnieniem, ale wydaje się, że niewiele straciłem. Łukasz zaczął od wprowadzenia do języka Scala, który jest podstawą omawianego przez niego frameworka. Wydaje mi się, że właśnie to wprowadzenie nieco popsuło mój pogląd na całość jego wystąpienia. Przeciągnęło się niestety i zabrakło czasu na jakieś sensowne opowiedzenie o Lifcie. Myślę, że gdyby na tę prezentację przeznaczyć 90 minut zamiast 45 wszyscy skorzystaliby znacznie bardziej. Słuchacze dostaliby porządne wprowadzenie do języka Scala i pewnie równie porządne (i kompetentne) wprowadzenie do pracy z Liftem. Niestety czasu było mniej niż potrzeba i prezentacja Łukasza musiała po prostu na tym ucierpieć. Jednak i tak moje ogólne wrażenie jest dobre a ocena merytoryczna raczej wysoka. Dodam jeszcze, że pojawiły się jakieś problemy z kodowaniem, ale wydaje mi się, że to nie może i nie powinno wpływać negatywnie na ogólną ocenę (chociaż kolejne prezentacje pokazały, że można sobie z kodowaniem poradzić).&lt;br /&gt;&lt;br /&gt;10/10 za treść, 8/10 za formę, 6/10 za plan&lt;br /&gt;&lt;br /&gt;Zaraz po trzeciej prezentacji była przerwa obiadowa. Wyszedłem więc napić się kawy, przegryźć ciasteczko i poszukać może kogoś do pogawędki. Podczas spaceru z kawą, trafiłem do sali obiadowej, gdzie na wszystkich uczestników konferencji czekały góry smacznego jedzenia. Zjadłem lazanię i surówki, dopiłem kawę i pospacerowałem w stronę sali &lt;span style="font-weight:bold;"&gt;Boolean&lt;/span&gt;, gdzie miała odbyć się kolejna wybrana przeze mnie prezentacja.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Projekt Voldemort: gdy relacyjna baza danych to za mało (zbyt wiele?)&lt;/span&gt; - prezentacja prowadzona przez Tomka Nurkiewicza. Od początku dało się zauważyć, że Tomek dobrze wie o czym mówi, dobrze wie ile z tego co wie zamierza powiedzieć, dokładnie zna drogę od początku do końca swojej prezentacji. Z uśmiechem na ustach, bardzo pozytywną pewnością siebie i – co niezwykle ważne – niekłamaną skromnością, przechodził płynnie po kolejnych punktach swojego programu. Z dużą lekkością wchodził w interakcję ze słuchaczami i naprawdę w miarę dostępnego czasu wyczerpał omawiany przez siebie temat. Chyba dzięki niemu wrzuciłem do mojego prywatnego &lt;span style="font-style:italic;"&gt;TODO&lt;/span&gt; konieczność bliższego zapoznania się z Voldemortem.&lt;br /&gt;&lt;br /&gt;Moja ocena: 10/10 w każdej kategorii:)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Reguły kierowania wielbłądem - czyli Camel + Drools&lt;/span&gt; – prezentacja Maćka Próchniaka, była kolejnym punktem – tym razem mojego – programu. Maciej dał się dostrzec już chwilkę przed startem, dość głośno rozmawiał z kolegami (chyba z macierzystej firmy – TouK jak mi się zdaje), co samo w sobie nie jest niczym złym, ale było dostrzegalnym symptomem braku pewności siebie i chyba absolutnego debiutu w roli prowadzącego prezentację. Od początku dało się zauważyć, że Maciek raczej nie miał dobrego pomysłu (a może miał ale go gdzieś w slajdach zgubił?) na prowadzenie swojej prezentacji. Wydawało mi się nawet przez moment, że slajdy którymi się posiłkował widzi po raz pierwszy. Często odwoływał się do prezentacji &lt;span style="font-style:italic;"&gt;From zero to jBPM hero!&lt;/span&gt; Tomka Bujoka (tej niestety nie miałem okazji widzieć) jakby chciał powiedzieć „&lt;span style="font-style:italic;"&gt;Nie wiem co ja tutaj robię? Trzeba było przyjść wcześniej na prezentację Tomka!&lt;/span&gt;”. Tak czy inaczej poruszany temat wydaje mi się na tyle ciekawy (sam używam Camela), że postanowiłem zostać do końca mimo widocznych trudności z opanowaniem fabuły przez samego Maćka (kilkanaście osób po kilku minutach opuściło salę – biorąc pod uwagę moment ewakuacji raczej z powodu rozczarowania formą niż treścią). Do samego końca nic się nie zmieniło a &lt;span style="font-style:italic;"&gt;mistrz ceremonii&lt;/span&gt; zamiast z każdą chwilką nabierać pewności siebie – niestety ją tracił. Miało to duży wpływ na łatwość odbioru przez słuchaczy (a może tylko przeze mnie?). Mimo mojego zaciekawienia – przyznam szczerze – po około 20-25 minutach zajrzałem w rozkład jazdy by dowiedzieć się, gdzie mogłem trafić zamiast na nieudaną prezentację o połączeniu Camela i Drools. Tutaj kilka słów do Maćka: &lt;span style="font-weight:bold;"&gt;nie martw się stary, myślę, że pewnie jesteś świetnym programistą, ale mówca z Ciebie żaden&lt;/span&gt;. Dodatkowo moje złe wrażenie spotęgowało podśmiewanie się przed prezentacją z innych prelegentów, szczególnie tych mówiących o zwinnym programowaniu, testowaniu i refaktoryzacji. Więcej nie napiszę, jednak Maćkowi trzeba pogratulować odwagi.&lt;br /&gt;&lt;br /&gt;Moja ocena 10/10 za temat, 0/10 za resztę&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jeden rozmiar nie dla wszystkich, czyli NoSQL w środowisku Java&lt;/span&gt; prezentowane przez Jarosława Pałkę. Ostatnia oglądana przeze mnie prezentacja miała miejsce w dużej sali (tej samej, w której odbyły się pierwsze dwie) wypełnionej niemal po brzegi. Temat niezwykle ciekawy zgromadził naprawdę wielu słuchaczy. Jarek Pałka okazał się bardzo kompetentną osobą i do tego bardzo lekko poprowadził swoją opowieść o bazach danych spoza krainy SQLa. Przykłady z życia wzięte dobrze ubarwiały główny temat i wszystko było pod pełną kontrolą prowadzącego. Może – podobnie jak w przypadku prezentacji Łukasza Kuczery – trochę zabrakło czasu i może pozostał przez to lekki niedosyt, jednak ogólne wrażenie było bardzo pozytywne. Po prezentacji dopisałem sobie kolejne zadanie – przyjrzeć się bliżej silnikowi &lt;span style="font-style:italic;"&gt;neo4j&lt;/span&gt; i przyległościom.&lt;br /&gt;&lt;br /&gt;Moja ocena 10/10 za treść, 10/10 za formę, 8/10 za plan (brakło czasu na CauchDB).&lt;br /&gt;&lt;br /&gt;Na tym skończyła się merytoryczna część konferencji (merytoryczno – kulinarna trzeba by napisać, bo o pysznym obiedzie zapomnieć nie sposób) i pozostało już tylko oficjalne pożegnanie oraz przedstawienie grupy osób odpowiedzialnych za jej organizację i obsługę. Wszyscy odebrali w pełni zasłużone brawa i jeszcze teraz należą im się podziękowania za kawał wspaniałej pracy - co niniejszym czynię, chyląc przed nimi czoła. Na koniec losowanie nagród, pożegnanie i zaproszenie na tradycyjną już dla Javarsovii imprezę uczestników, zwaną SPOINĄ. Na imprezkę się nie wybrałem, w domu czekała na mnie rodzina a i tak całą niemal sobotę spędziłem poza domem.&lt;br /&gt;&lt;br /&gt;Moje ogólne wrażenie jest pozytywne, strona organizacyjna, zaplecze techniczne i dobór tematów na najwyższym poziomie. Rewelacja! Ponad 650 osób, które wzięło udział w konferencji jest najlepszym tego dowodem. Jedyne zastrzeżenie, które mam to poziom prezentowany przez niektórych prelegentów. Myślę, że w przyszłości można tego uniknąć słuchając ich prezentacji w małym gronie, aby móc upewnić się, że poziomem dorównają poziomowi organizacji.&lt;br /&gt;&lt;br /&gt;Dodam jeszcze na koniec, że wychodząc już z sali na czwartym piętrze usłyszałem rozmowę dwóch uczestników, którzy mówili, że pewnie na kolejnej konferencji wybiorą tylko &lt;span style="font-style:italic;"&gt;miękkie&lt;/span&gt; prezentacje o testowaniu, zwinności itd, bo prezentacje &lt;span style="font-style:italic;"&gt;twarde&lt;/span&gt; wypadły bardzo słabo. Nie wiem, o której &lt;span style="font-style:italic;"&gt;twardej&lt;/span&gt; prezentacji myśleli, ale jeśli miało to coś wspólnego z &lt;span style="font-style:italic;"&gt;wielbłądem&lt;/span&gt; to w 100% się z nimi zgadzam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-5188643763323629340?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/5188643763323629340/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=5188643763323629340' title='Komentarze (8)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/5188643763323629340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/5188643763323629340'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2010/06/javarsovia-2010.html' title='Javarsovia 2010'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-1170996102347598526</id><published>2010-06-12T12:09:00.000-07:00</published><updated>2010-06-14T06:22:19.032-07:00</updated><title type='text'>Hostowanie wielu instancji jednej aplikacji JEE na Tomcacie</title><content type='html'>Kilka dni temu podczas odtwarzania zawartości serwera po awarii, przyszedł mi do głowy pewien pomysł związany z hostowaniem aplikacji JEE. Szybko nakreślę problem a potem pokażę w jaki sposób udało mi się go rozwiązać – może ktoś z tego skorzysta.&lt;br /&gt;Na serwerze mam ograniczoną pamięć do hostowania aplikacji JEE – załóżmy, że aplikacja zajmuje (zainstalowana w sposób standardowy) około 30MB w pamięci. Do tego dochodzi sam Apache Tomcat – około 50MB. Chciałbym w obrębie około 1,5-2GB utrzymywać 100 instancji aplikacji. W takim układzie nie jest to niestety możliwe. &lt;br /&gt;&lt;br /&gt;Każda aplikacja jest zainstalowana w kontekście głównym oddzielnego serwera wirtualnego i w pliku server.xml wygląda to mniej więcej tak:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Host name="w1.local" appBase="webapp" unpackWARs="false"&lt;br /&gt;    autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"&amp;gt;&lt;br /&gt;    &amp;lt;Context path="" docBase="w1_local"/&amp;gt;&lt;br /&gt;&amp;lt;/Host&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Warto zwrócić uwagę na to, że dla tych aplikacji utworzyłem w katalogu serwera oddzielne drzewo o nazwie webapp (w odróżnieniu od standardowego webapps). Takich wirtualnych hostów ma być w serwerze 100. Dość dużo. W aplikacji w pliku app-ds.xml konfiguruje się także źródło danych (dostęp do bazy danych, np. Postgresql). Zawartość katalogu to około 25MB. Setka takich katalogów  o nazwach od w1_local do w100_local to 2,5GB – w zasadzie skopiowanej zawartości. Pomyślałem, że musi być jakiś lepszy sposób, więc zacząłem się zastanawiać jak sprawę ugryźć. &lt;br /&gt;Na początek postanowiłem zawartość katalogu WEB-INF/lib webaplikacji umieścić w katalogu z bibliotekami serwera ($TOMCAT_HOME/lib) i udało się to zrobić bez żadnych konfliktów. Jako, że większość objętości każdego z katalogów w1_local-w100_local to właśnie zawartość WEB-INF/lib już teraz zaoszczędziłem mnóstwo przestrzeni dyskowej. Jak się okazało, biblioteki te załadowane raz do przestrzeni classloadera serwera nie były ładowane oddzielnie przez classloadery kolejnych webaplikacji – zaoszczędziłem więc mnóstwo pamięci RAM.&lt;br /&gt;Tutaj właściwie mogłem już uznać, że problem ogarnąłem, jednak wciąż męczyło mnie sto dodatkowych katalogów :)&lt;br /&gt;Ale na szczęście i na to znalazł się sposób. &lt;br /&gt;Zamieniłem definicję źródła danych na odwołanie do już zdefiniowanego i dostępnego za pomocą JNDI.&lt;br /&gt;Po zmianie definicja w app-ds.xml wygląda tak:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;jee:jndi-lookup id="dataSource" jndi-name="ds/CustomDS"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Teraz jeszcze zmiana w definicji hosta w server.xml. Wygląda to teraz tak:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;Host name="w1.local" appBase="webapp"&lt;br /&gt;    unpackWARs="false" autoDeploy="true"&lt;br /&gt;    xmlValidation="false" xmlNamespaceAware="false"&amp;gt;&lt;br /&gt;    &amp;lt;Context path="" docBase="w1_local"&amp;gt;&lt;br /&gt;        &lt;b&gt;&amp;lt;Resource name="ds/CustomDS"&lt;br /&gt;            auth="Container" type="javax.sql.DataSource"&lt;br /&gt;            username="w1" password="w1"&lt;br /&gt;            driverClassName="org.postgresql.Driver"&lt;br /&gt;            url="jdbc:postgresql://localhost:5432/w1"&lt;br /&gt;            maxActive="4" maxIdle="4"&lt;br /&gt;        /&amp;gt;&lt;/b&gt;&lt;br /&gt;    &amp;lt;/Context&amp;gt;&lt;br /&gt;&amp;lt;/Host&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I skoro jedyna różnica pomiędzy aplikacjami, czyli definicja źródła danych, została sprowadzona do jednolitej postaci, należało się pozbyć nadmiaru katalogów. Usunąłem więc dziewięćdziesiąt dziewięć nadmiarowych teraz katalogów i we wszystkich definicjach hostów wartość docBase kontekstu ustawiłem na ten sam katalog (w1_local). &lt;br /&gt;&lt;br /&gt;Podsumujmy, w katalogu webaplikacji zamiast setki podkatalogów znajduje się jeden, dość niewielki bo pozbawiony wszystkich bibliotek, które trafiły do zbioru bibliotek serwera, dzięki czemu ładowane są tylko raz dla wszystkich instancji aplikacji w kontenerze. Na komputerze, na którym robiłem doświadczenie (Intel Pentium D 3 GHz, 4GB RAM, Windows XP Pro, Java 6) sto aplikacji zajęło po starcie serwera mniej niż 1GB. Zakładam, że po dłuższej chwili działania zajęcie pamięci wzrośnie, jednak pewnie zmieści się w zakładanych 2GB.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9xR2Q6esm0Q/TBPgZX_yckI/AAAAAAAAAJc/ZT4S5Mbrowk/s1600/w1_local.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 139px;" src="http://1.bp.blogspot.com/_9xR2Q6esm0Q/TBPgZX_yckI/AAAAAAAAAJc/ZT4S5Mbrowk/s200/w1_local.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5481971897982939714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9xR2Q6esm0Q/TBPgpdABRiI/AAAAAAAAAJk/Mr55H4wLAVc/s1600/w2_local.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 139px;" src="http://4.bp.blogspot.com/_9xR2Q6esm0Q/TBPgpdABRiI/AAAAAAAAAJk/Mr55H4wLAVc/s200/w2_local.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5481972174203995682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Cały kod testowej aplikacji do pobrania z http://bitbucket.org/jjhop/jeemultiapp/, więc każdy może przeprowadzić taki test u siebie.&lt;br /&gt;W repozytorium znajduje się oczywiście kod sql to zrobienia prostej bazy (ale jednej).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-1170996102347598526?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/1170996102347598526/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=1170996102347598526' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/1170996102347598526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/1170996102347598526'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2010/06/hostowanie-aplikacji-jee-na-tomcacie.html' title='Hostowanie wielu instancji jednej aplikacji JEE na Tomcacie'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9xR2Q6esm0Q/TBPgZX_yckI/AAAAAAAAAJc/ZT4S5Mbrowk/s72-c/w1_local.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-8513969367279000477</id><published>2010-06-12T05:19:00.000-07:00</published><updated>2010-06-12T05:23:20.788-07:00</updated><title type='text'>Małe zmiany w blogu</title><content type='html'>Rzadko zdarza mi się pisać, ale chyba wiem z czego to wynika. Głównie z tego, że RoR nie sprawia mi zbyt wiele problemów podczas pracy (to, że jestem leniwy to już zupełnie inna sprawa i tylko dokłada się do żenująco niskiej częstotliwości zamieszczania postów). Wpadłem więc na pomysł, aby na blogu zamieszczać posty na tematy związane nie tylko z Rubym i RoRem ale także inne developerskie radości, które zdarzają mi się podczas pracy. Nazwy bloga nie zmieniam póki co :)&lt;br /&gt;Należy więc spodziewać się tematów związanych także z Javą/JEE/Springiem ale także Scheme, Lispem, Erlangiem czy innymi tematami, które w swojej codziennej pracy spotykam.&lt;br /&gt;Jak to mówią - &lt;span style="font-style:italic;"&gt;stay tuned!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-8513969367279000477?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/8513969367279000477/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=8513969367279000477' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/8513969367279000477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/8513969367279000477'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2010/06/mae-zmiany-w-blogu.html' title='Małe zmiany w blogu'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-4511091013458221981</id><published>2009-10-12T14:46:00.001-07:00</published><updated>2009-10-12T14:47:48.464-07:00</updated><title type='text'>Dwa lata przerwy...</title><content type='html'>Właśnie spojrzałem na datę publikacji ostatniego wpisu... dwa lata niemal... Zdaje się, że znowu mam więcej okazji do zajmowania się Rubym i Railsami więc mam nadzieję będę nieco częściej :) coś pisał...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-4511091013458221981?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/4511091013458221981/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=4511091013458221981' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/4511091013458221981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/4511091013458221981'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2009/10/dwa-lata-przerwy.html' title='Dwa lata przerwy...'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-7983471236154419804</id><published>2007-11-06T14:07:00.000-08:00</published><updated>2007-11-06T16:00:30.670-08:00</updated><title type='text'>Projektowanie za pomocą kontraktów i Ruby</title><content type='html'>Może słabo przetłumaczyłem termin "design by contract" ale jeśli kogoś zaintrygował tytuł to pewnie wie o co chodzi (a może nawet tłumaczenie wyda mu się nie najgorsze).&lt;br /&gt;Jakiś czas temu niedługi (kilka tygodni) przystąpiłem do projektowania kolejnej aplikacji (dla firmy, w której pracuję). Oczywiście nauczony doświadczeniami poprzedniej powziąłem decyzję by od początku szukać problemów natury implementacyjnej ale jeszcze na poziomie projektu (w końcu to język determinuje nasz sposób myślenia a nie odwrotnie). Sięgnąłem więc do podręcznika języka OCL odświeżam i doskonale swój warsztat UML'owy, staram się korzystać z najnowszych zdobyczy techniki :):) (swoja drogą polecam &lt;a href="http://www.sparxsystems.com.au/products/ea.html" target="_blank"&gt;EnterpriseArchitect&lt;/a&gt;) by tym razem nie popełnić błędów popełnionych poprzednio. No ale koniec ze wspomnieniami. Jednym z narzędzi, którym postanowiłem się przyjrzeć nieco bliżej jest iContract. Ale oczywiście iContract to narzędzie przeznaczone dla Javy (nawiasem mówiąc również gorąco polecam) a tutaj zamierzam raczej skupiać się na pracy z Railsami i Rubym. Korzystając z wyszukiwarki dotarłem do fajnej klasy autorstwa M. Traverso i B. McCallistera - dbc.rb. Link na końcu artykułu :).&lt;br /&gt;Miksując kod klasy DesignByContract z własnymi klasami otrzymujemy dwie metody, które pozwalają nakładać kontrakt na nasze metody (może to nieszczęśliwe sformułowanie ale niech pozostanie). Te metody to 'pre' oraz 'post' jak łatwo się domyśleć. Każdą z nich można wykorzystać w dwojaki sposób. Po pierwsze definiując pre- i post- &lt;i&gt;conditions&lt;/i&gt; gdziekolwiek w klasie za pomocą symbolu lub stringa wskazując docelową metodę:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;pre(:nazwa_metody, "komunikat niespełnionego warunku") do |num| &lt;br /&gt;  num.to_int == num&lt;br /&gt;end&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;oczywiście sposób definiowania bloku jest dowolny do-end lub {}. Sposób drugi to (bardziej intuicyjny) umieszczenie pre- i post- &lt;i&gt;conditions&lt;/i&gt;tu przez metodą, na którą nakładamy kontrakt - nie umieszczamy wtedy jej nazwy (chociaż można), DBC sam nałoży wskazany kontrakt na metodę, która się za nim znajduje.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;pre("komunikat niespełnionego warunku") do |num| &lt;br /&gt;  num.to_int == num&lt;br /&gt;end&lt;br /&gt;def nazwa_metody(num)&lt;br /&gt; # ...&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;W ten sposób definiujemy efekt wykonanie metody - tym razem oczywiście korzystając z &lt;code&gt;post&lt;/code&gt; w miejsce &lt;code&gt;pre&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Jak korzystać z tego dobrodziejstwa i po co?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;No coż, zacznijmy od jakiejś klasy-pomocnika. Robimy aplikację RoR (każdy wie jak). Do katalogu &lt;code&gt;lib&lt;/code&gt; aplikacji wrzucamy plik dbc.rb (skąd go wziąc powiem dalej. Tworzymy jakiś kontroler (np. BlogController). Struktura aplikacji wygląda tak:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9xR2Q6esm0Q/RzD6r3vN8gI/AAAAAAAAACs/RsWRK6_eI1s/s1600-h/struktura.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_9xR2Q6esm0Q/RzD6r3vN8gI/AAAAAAAAACs/RsWRK6_eI1s/s320/struktura.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5129875607178310146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;teraz aby skorzystać z biblioteki, tworzymy jakas przykładową klasę w module &lt;code&gt;BlogHelper&lt;/code&gt; - na przykład podobną do przedstawionej poniżej:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;require 'dbc.rb'&lt;br /&gt;&lt;br /&gt;module BlogHelper&lt;br /&gt;  &lt;br /&gt;  class NilMy&lt;br /&gt;    include DesignByContract&lt;br /&gt;  &lt;br /&gt;    pre("num must be an integer value") do |num| &lt;br /&gt;      num.to_int == num&lt;br /&gt;    end&lt;br /&gt;    def show_as_text(num)&lt;br /&gt;      if num &lt; 1&lt;br /&gt;        return 'nic :('&lt;br /&gt;      elsif num &lt; 10&lt;br /&gt;        return 'niewiele'&lt;br /&gt;      else&lt;br /&gt;        return 'wystraczajaco'&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Od razu widac, gdzie skorzystaliśmy z nowej wiedzy :). Teraz pora na kontroler - również bardzo prosty.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;class BlogController &lt; ApplicationController&lt;br /&gt;  &lt;br /&gt;  def index&lt;br /&gt;    rtObj = BlogHelper::NilMy.new&lt;br /&gt;    render_text(rtObj.show_as_text(1.34)) # tutaj złamalismy kontrakt, ciekawe co się stanie?&lt;br /&gt;  end&lt;br /&gt;end&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Wywołujemy akcje w przeglądarce i oto efekt:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9xR2Q6esm0Q/RzD8MXvN8hI/AAAAAAAAAC0/zLTfDn0xtkY/s1600-h/wyjatek.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_9xR2Q6esm0Q/RzD8MXvN8hI/AAAAAAAAAC0/zLTfDn0xtkY/s320/wyjatek.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5129877265035686418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sprawa jest prosta - mamy wyjątek :) bo klient (w tym wypadku my) nie dotrzymał warunków kontraktu. Ale żeby nie było nudno to dorzucę jeszcze jeden fajny przykład na zakończenie. Tym razem napiszemy kontrakt dla akcji w kontrolerze. Załóżmy, że akcja do prawidłowego działania potrzebuje jakiejś zmiennej w sessji a po wykonaniu pojawi się w sesji jakaś inna wartość (szczegóły nieważne). Oto kodzik:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;require 'dbc.rb'&lt;br /&gt;&lt;br /&gt;class BlogController &lt; ApplicationController&lt;br /&gt;  include DesignByContract&lt;br /&gt;  &lt;br /&gt;  def index&lt;br /&gt;    #...&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  pre("Obiekt User musi być dostępny w sesji"){session[:user] != nil}&lt;br /&gt;  post{ session[:other] != nil if request.post? }&lt;br /&gt;  end&lt;br /&gt;  def preferences&lt;br /&gt;    # ...&lt;br /&gt;  end&lt;br /&gt;end&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Teraz wiadomo już jak korzystać z tego dobrodziejstwa :), ale nie wiadomo po co? A może wiadomo. Tak czy nie dla podsumowania napiszę, że dzięki zdefiniowaniu kontraktu dla naszego kodu, opisujemy (bardzo jasno i nieodwołalnie) warunki w jakich ten kod będzie działał - no chociaż warunki w jakich działanie prawidłowe bądź nie (to też opisuje kontrakt) gwarantujemy. Zainteresowanym tym tematem polecam poszperanie po bogatych zasobach Internetu w poszukiwaniu nowej wiedzy. Warto przyjrzeć się jak projektowanie z kontraktami realizowane jest w języku Eiffel, gorąco zachęcam do zapoznania się z "Projektowaniem zorientowanym obiektowo" B. Meyer'a - naprawdę warto. A poniżej kilka miejsc, które warto odwiedzić:&lt;br /&gt;&lt;br /&gt;http://utils.ning.com/ruby/dbc.rb &lt;- kod biblioteki, niezbędny do przykładów&lt;br /&gt;http://split-s.blogspot.com/2006/02/design-by-contract-for-ruby.html&lt;br /&gt;http://www.javaworld.com/javaworld/jw-02-2001/jw-0216-cooltools.html?page=1&lt;br /&gt;http://www.omg.org/docs/ptc/03-10-14.pdf&lt;br /&gt;http://en.wikipedia.org/wiki/Object_Constraint_Language &lt;- tutaj jest wiele kolejnych linków&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-7983471236154419804?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/7983471236154419804/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=7983471236154419804' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/7983471236154419804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/7983471236154419804'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2007/11/projektowanie-za-pomoc-kontraktw-i-ruby.html' title='Projektowanie za pomocą kontraktów i Ruby'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9xR2Q6esm0Q/RzD6r3vN8gI/AAAAAAAAACs/RsWRK6_eI1s/s72-c/struktura.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-5567196225025700854</id><published>2007-10-06T19:39:00.000-07:00</published><updated>2007-10-06T21:40:20.748-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><title type='text'>Ruby + Rails + Netbeans 6.x</title><content type='html'>Od jakiegoś czasu pracuję z Railsami (i Rubym w ogóle) w środowisku Netbeans 6. Przez poszczególne wersje dla twardzieli (nightlybuilds) po Milestone 10, całość spisując się raz lepiej raz gorzej, teraz jednak dociera już do granic przyzwoitości i stabilności. Efekty połączenia tego zestawu w jednym dużym IDE są zadowalające (jeśli nie zachwycające). &lt;br/&gt;Bardzo poręczny widok na cały projekt sprawia, że łatwo dotrzeć do właściwego kontrolera czy szablonu widoku (czy jakiegokolwiek innego elementu całego projektu).&lt;br/&gt;&lt;br/&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9xR2Q6esm0Q/RwhJGtHWSFI/AAAAAAAAAB0/Y-5Q6ZZn9o8/s1600-h/nb3.jpg"&gt;&lt;img style="float:left;margin:10px 10px 10px 10px;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_9xR2Q6esm0Q/RwhJGtHWSFI/AAAAAAAAAB0/Y-5Q6ZZn9o8/s320/nb3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5118421356045027410" /&gt;&lt;/a&gt;Jeśli trzeba nieco bardziej szczegółowej kontroli nad możliwymi celami naszych poszukiwań, to znany z javowego IDE widok nawigacyjny pozwoli nam w prosty i intuicyjny sposób poruszać się po aktualnie otwartym (i aktywnym w części edytora) pliku.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9xR2Q6esm0Q/RwhJidHWSGI/AAAAAAAAAB8/117f4gVy4OY/s1600-h/nb4.jpg"&gt;&lt;img style="float:right;margin:10px 10px 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_9xR2Q6esm0Q/RwhJidHWSGI/AAAAAAAAAB8/117f4gVy4OY/s320/nb4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5118421832786397282" /&gt;&lt;/a&gt;Ładnie wyróżnione elementy prywatne i publiczne (także statyczny) sprawiają, że struktura pliku nie ma przed nami żadnych tajemnic, nawet jeśli z jakichś względów edytowany przez nas plik ma 500 i więcej linii.&lt;br/&gt;Oba widoki razem stają się potężnym narzędziem w rękach programisty i pozwalają przyjemnie prosto ogarnąć nawet największy chaos spowodowany zmęczniem lub nadmiarem kawy podczas programowania :). Ja najchętniej oba widoku umieszczam po przeciwnych stronach IDE - jeśli pracuję na monitorze panoramicznym (w pracy mam 21', więc przestrzeń do zagospodarowania ogromna) i jeden pod drugim, gdy do komputera podłączony jest monitor klasyczny (4x4?) 17' lub 19'owy (taki mam w domu). Oba sposoby zapewniają wygodną i sprawną pracę.&lt;br/&gt;Jeśli chodzi o kolorowanie składni (zarówno w kodzie kontrolerów czy modeli jak i w szablonach) edytor zachowuje się doskonale. Z jednej strony domyślne ustawienia są wystarczająco przejrzyste z drugiej zaś wygląd kodu ograniczony jest tylko naszą wyobraźnią.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9xR2Q6esm0Q/RwhQh9HWSII/AAAAAAAAACM/fguZAW5gFwM/s1600-h/nb7.jpg"&gt;&lt;img style="float:left;display:block; margin:10px 10px 10px 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_9xR2Q6esm0Q/RwhQh9HWSII/AAAAAAAAACM/fguZAW5gFwM/s400/nb7.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5118429520777857154" /&gt;&lt;/a&gt; Rzeczą zupełnie normalną w edytora dla programistów jest dzielenie obszaru roboczego dla dwóch i więcej plików (vim i jego cudowny &lt;i&gt;split &lt;/i&gt;oraz &lt;i&gt;vsplit&lt;/i&gt;). Na kolejnym zrzucie widać ten obszar podzielony pomiędzy kontroler (a w nim jakaś akcja) i jego widok. Oba źródła oczywiście są podświetlone we właściwy sposób. Zarówno edycja kodu kontrolera jak i widoku jest wspomagana (niewidocznym tutaj) uzupełnianiem kodu (które wymaga jeszcze nieco dopracowania, jednak jest już na tyle użyteczne, że nie sposób z niego zrezygnować).&lt;br/&gt;Myślę, że następnym krokiem w rozwoju trybu edycji railsowych aplikacji będzie jakieś wspomaganie w przechodzeniu pomiędzy akcjami w kontrolerach a odpowiadającymi im widokami. Póki co edytor nie rozpoznaje nawet &lt;code&gt;render_partial&lt;/code&gt; by podążyć za widokiem częściowym, który jest wskazany. No cóż, takie rzeczy to tylke w E[..]e (nazwę operatora pominę).&lt;br/&gt;Ostatnie dwa zrzuty przedstawiają pracę z historią edycji pliku. Na pierwszym widać pojawiającą się informację o tym co się w danym miejscu stało, na drugim zaś możliwe akcje do wykonania, oczywiście wraz ze stosowanym paskiem i ikonami, żeby było miło dla oka. No i żeby nie było, że jakieś niedoróby są to widać także (w tym wypadku) usunięty fragment.&lt;br/&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9xR2Q6esm0Q/RwhT_tHWSJI/AAAAAAAAACU/DNXw-gog4Ro/s1600-h/nb1.jpg"&gt;&lt;img style="margin:10px 10px 10px 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_9xR2Q6esm0Q/RwhT_tHWSJI/AAAAAAAAACU/DNXw-gog4Ro/s320/nb1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5118433330413848722" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9xR2Q6esm0Q/RwhUH9HWSKI/AAAAAAAAACc/x7jGW-p0CA0/s1600-h/nb2.jpg"&gt;&lt;img style=" margin:10px 10px 10px 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_9xR2Q6esm0Q/RwhUH9HWSKI/AAAAAAAAACc/x7jGW-p0CA0/s320/nb2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5118433472147769506" /&gt;&lt;/a&gt;&lt;br/&gt;Dam już spokój kolejnym zrzutom, dodam jednak, że IDE pozwala zarządzać migracjami (niezwykle łatwo i intuicyjnie) a także innymi zadaniami &lt;b&gt;rake&lt;/b&gt;. Daje do dyspozycji programisty dostęp do okien dialogowych wspomagających zarządzanie zainstalowanymi pluginami i inne. A jeśli to wszystko Wam nie wystarcza to dodamy kilka innych ważnych właściwości:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;wbudowane wsparcie dla CVS i SVN&lt;/li&gt;&lt;br /&gt;&lt;li&gt;konsola Rails wewnątrz środowiska&lt;/li&gt;&lt;br /&gt;&lt;li&gt;w zależności od potrzeb edytor UML&lt;/li&gt;&lt;br /&gt;&lt;li&gt;edytor baz danych - dostęp do tych, dla których mamy zainstalowane sterowniki JDBC&lt;/li&gt;&lt;br /&gt;&lt;li&gt;paletę komponentów jMaki obsługiwanych myszą :) - więcej o nich już niedługo&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Innymi słowy... jeśli jeszcze nie używacie Netbeans z Railsami to na co jeszcze czekacie?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-5567196225025700854?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/5567196225025700854/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=5567196225025700854' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/5567196225025700854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/5567196225025700854'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2007/10/ruby-rails-netbeans-6x.html' title='Ruby + Rails + Netbeans 6.x'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9xR2Q6esm0Q/RwhJGtHWSFI/AAAAAAAAAB0/Y-5Q6ZZn9o8/s72-c/nb3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-6705586882820049638</id><published>2007-10-04T21:40:00.000-07:00</published><updated>2007-10-04T12:40:10.846-07:00</updated><title type='text'>Niespodzianki w ActiveRecord</title><content type='html'>Problem, który opiszę pewnie nie jest wielką niespodzianką dla niektórych, jednak mnie dziś nieco zaskoczył. Ale po kolei. Jest sobie klasa modelu, np. taka:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;class ComputerGame &lt; ActiveRecodr::Base; end&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Migracja klasy wygląda jak poniżej:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;class CreateComputeGames &lt; ActiveRecord::Migration&lt;br /&gt;  def self.up&lt;br /&gt;    create_table :computer_games, :primary_key =&gt; 'computer_game_id' do |t|&lt;br /&gt;      t.column 'title', :string, :limit =&gt; 512, :null =&gt; false&lt;br /&gt;      t.column 'developer', :string, :limit =&gt; 1024, :null =&gt; false&lt;br /&gt;      t.column 'publisher', :string, :limit =&gt; 1024, :null =&gt; false&lt;br /&gt;      t.column 'desc', :string, :limit =&gt; 16386&lt;br /&gt;      t.column 'release_date', :datetime, :null =&gt; false&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.down&lt;br /&gt;    drop_table :computer_games&lt;br /&gt;  end&lt;br /&gt;end&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;No i tyle tytułem wstępu. Oczywiście opisywany problem nie miał nic wspólnego z katalogiem gier czy czymś podobnym, ale ten przykład wydaje się na tyle prosty a problem na tyle ogólny, że przedstawiony kod dobrze obrazuje sprawę.&lt;br /&gt;Gdzieś w kontrolerze wywołuje coś takiego:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;@games = ComputerGame.findBySql('SELECT * FROM computer_games ORDER BY release_date ASC');&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;a w szablonie widoku:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;% unless @games.empty? %&gt;&lt;br /&gt;  &lt;% @games.each |game| %&gt;&lt;br /&gt;    &lt;%= game.title %&gt; &lt;!-- tu wyjątek! --&gt;&lt;br /&gt;  &lt;% end %&gt;&lt;br /&gt;&lt;% end %&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;No i jak widać leci wyjątek podczas próby dostępu do jednego z atrybutów. Sprawa ciekawa, wydawało mi się, że atrybut jest a go nie ma. No ale lipa :). Spawę załatwiła zamiana nieszczęsnego &lt;code&gt;findBySql&lt;/code&gt; na coś bardzej &lt;i&gt;rails'y&lt;/i&gt; (czy jak kto chce dżezi :)) czyli na&lt;br /&gt;&lt;code&gt;&lt;pre&gt;@games = ComputerGame.find(&lt;br /&gt;  :all,&lt;br /&gt;  :order =&gt; 'release_date ASC',&lt;br /&gt;);&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Żeby nikt nie pisał, że takie zapytania to oczywiste jeszcze raz wyjaśniam, problem był nieco bardziej złożony i kwerenda nie była taka trywialna.&lt;br /&gt;Tymczasem ide pogrzebać w kodzie ActiveRecord, aby odnaleźć przyczynę.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-6705586882820049638?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/6705586882820049638/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=6705586882820049638' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/6705586882820049638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/6705586882820049638'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2007/10/niespodzianki-w-activerecord.html' title='Niespodzianki w ActiveRecord'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595331212232236129.post-3272437593936359056</id><published>2007-10-03T01:02:00.001-07:00</published><updated>2007-10-03T01:06:57.191-07:00</updated><title type='text'>Premiera?</title><content type='html'>Ostatnio więcej mam okazji do pracownia z Rubym i z Rails, czasami trafiam na jakieś ciekawostki a czasami na problemiki (bo problemów przecież Ruby nie stwarza). Będę więc zamieszczał tu swoje spostrzeżenia, podzielę się czasami jakimś (daj Boże!) błyskotliwym kawałkiem kodu.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;class RailsWars&lt;br /&gt;  def initialize&lt;br /&gt;    puts 'Hello!'&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;RailsWars.new&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595331212232236129-3272437593936359056?l=railswars.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://railswars.blogspot.com/feeds/3272437593936359056/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4595331212232236129&amp;postID=3272437593936359056' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/3272437593936359056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595331212232236129/posts/default/3272437593936359056'/><link rel='alternate' type='text/html' href='http://railswars.blogspot.com/2007/10/premiera.html' title='Premiera?'/><author><name>rafal kotusiewicz</name><uri>http://www.blogger.com/profile/12249092234080066042</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_9xR2Q6esm0Q/SdaTPIHqyyI/AAAAAAAAAF4/Ix-YwmbhqZE/S220/jjhop.jpg'/></author><thr:total>0</thr:total></entry></feed>
