<?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-7460465</id><updated>2012-01-09T10:48:01.434+01:00</updated><category term='javabean'/><category term='java'/><category term='fluent interface'/><category term='commons-beanutils'/><category term='egg'/><title type='text'>Jacek Olszak: Sugar free Java</title><subtitle type='html'>Blog about everything which has something to do with Java, programming and web applications.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7460465.post-6306860574234669777</id><published>2012-01-09T10:46:00.001+01:00</published><updated>2012-01-09T10:48:01.442+01:00</updated><title type='text'>TryCatch: Sterowane zdarzeniami nieblokujące serwery</title><content type='html'>Na blogu TryCatch zamieściłem 2 pierwsze części cyklu traktujące o nieblokujących serwerach sterowanych zdarzeniami:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://blogger.trycatch.pl/2011/12/sterowane-zdarzeniami-nieblokujace.html"&gt;http://blogger.trycatch.pl/2011/12/sterowane-zdarzeniami-nieblokujace.html&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blogger.trycatch.pl/2012/01/sterowane-zdarzeniami-nieblokujace.html"&gt;http://blogger.trycatch.pl/2012/01/sterowane-zdarzeniami-nieblokujace.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-6306860574234669777?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/6306860574234669777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=6306860574234669777&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/6306860574234669777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/6306860574234669777'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2012/01/na-blogu-trycatch-zamiesciem-2-pierwsze.html' title='TryCatch: Sterowane zdarzeniami nieblokujące serwery'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-5317195647554584449</id><published>2011-12-15T21:01:00.000+01:00</published><updated>2011-12-15T21:01:28.432+01:00</updated><title type='text'>TryCatch: Rozpoczęcie działalności TryCatch</title><content type='html'>&lt;a href="http://blogger.trycatch.pl/2011/12/od-1.html?spref=bl"&gt;TryCatch: Rozpoczęcie działalności TryCatch&lt;/a&gt;: Od 1. grudnia firma TryCatch jest oficjalnie zarejestrowaną firmą w Polsce. Została założona przeze mnie aby sprostać wymaganiom wszy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-5317195647554584449?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/5317195647554584449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=5317195647554584449&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/5317195647554584449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/5317195647554584449'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2011/12/trycatch-rozpoczecie-dziaalnosci.html' title='TryCatch: Rozpoczęcie działalności TryCatch'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-2682040664813677110</id><published>2011-02-27T15:31:00.014+01:00</published><updated>2011-02-28T16:04:46.908+01:00</updated><title type='text'>Use Java as a dynamically typed programming language</title><content type='html'>&lt;p&gt;
Java is a statically typed programming language. This means that at the time of compilation the types of variables used in the program are known. This feature is one of the most powerful (if not the most powerful) thing, which gives a programmer warnings about bad code written before he runs it. This allows also to build powerful development environments like Eclipse with content assists and refactoring support. Unfortunately there is no rose without a thorn. Because of static typing a program code is a much bigger (types need to be specified in declarations, casting is necessarily) and sometimes simple problem becomes too complex. If you don't believe in this statement - check the core of JavaServer Pages technology (I mean scriptlets, without JSP tags) and see how much unnecessarily code you need to write just to print some attribute's field on the screen.
&lt;/p&gt;
&lt;p&gt;
There is a lot of frameworks written for Java. Most of these frameworks use interfaces or abstract classes as a building block. Let me give an example: in order to create a HTTP servlet you need to create a new class extending the abstract HttpServlet class. This is simple, but... hmm... Do you really need to write a dedicated class for every action? It will not be better if you have multiple actions grouped together? Because of static typing you can't just do this easily, which of course does not mean that this is not possible. The solution is the reflection API bundled into JRE. You can execute methods, access or update fields etc. of objects of any type. 
&lt;/p&gt;
&lt;p&gt;
As a simple example what you can do with reflections check the following code of controller written in &lt;a href="http://eggframework.org"&gt;Egg Framework&lt;/a&gt; (full stack web framework being developed by me):
&lt;/p&gt;
&lt;pre&gt;
package controllers;

import static framework.GlobalHelpers.*;
import framework.Response;

public class SampleController {
 
 public void newProduct() {
  Product product = paramsAsBean(Product.class);
  // TODO save product in db
 }
 
 public Response removeProduct() {
  if (session("logged") == null) {
   // not allowed
   return renderText("Access denied");
  }
  // TODO remove product from db
  return null;
 }
 
}

&lt;/pre&gt;
&lt;p&gt;
The Egg Framework uses reflections extensively. There is no configuration (Convention over Configuration), no interfaces. Every class can be a controller, every class can be a form bean etc. (just plain old java objects - POJO). In this example Egg Framework uses request parameters sent to the server to decide which method (action) to invoke. Note that both methods have different signatures - not only the name, but the return type. But for Egg Framework it does not matter. If the action returns something not null then Egg Framework handles this, otherwise it runs normal processing. In this example I have used also static methods (check the import static statement on the top). Static imports are really great and can simplify your program dramatically. 
&lt;/p&gt;
&lt;p&gt;
So what the conclusion for this post? I think that there is still a lot to do in Java libraries, frameworks and APIs design. Egg Framework is one of many examples how to make Java programs looks prettier.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-2682040664813677110?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/2682040664813677110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=2682040664813677110&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/2682040664813677110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/2682040664813677110'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2011/02/use-java-as-dynamically-typed.html' title='Use Java as a dynamically typed programming language'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-581851653568147333</id><published>2007-12-28T18:24:00.004+01:00</published><updated>2008-10-29T22:14:58.651+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='javabean'/><category scheme='http://www.blogger.com/atom/ns#' term='commons-beanutils'/><title type='text'>API do kopiowania JavaBeans</title><content type='html'>&lt;p&gt;
Ostatnimi czasy często spotykam się z problemem konieczności stworzenia kopii JavaBean'a. O ile dla Javy napisano już tysiące API to jednak do tej prostej czynności wciąż nie ma rozwiązania idealnego.
&lt;/p&gt;
&lt;p&gt;
Omówię teraz pokrótce o co mi chodzi. Przede wszystkim API takie powinno dostarczać następujące funkcjonalności:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kopiować wgłąb (tzw. deep copy) - kopiowanie referencji nie wchodzi w grę gdyż nie jest to wtedy tak naprawdę operacja kopiowania&lt;/li&gt;
&lt;li&gt;nie kopiować n razy tej samej referencji - jeśli w oryginalnym obiekcie znajduje się wiele referencji do 1 obiektu, to w kopii też powinno być wiele referencji do skopiowanego obiektu&lt;/li&gt;
&lt;li&gt;radzić sobie z cyklami - w przypadku wystąpienia cyklu nie powinien wyrzucać wyjątków&lt;/li&gt;
&lt;li&gt;wykorzystywać dostarczony ClassLoader do wczytywania klas - tak aby można było dostarczyć zmodyfikowane klasy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Na www znalazłem kilka rozwiązań. Między innymi dobrze znane &lt;a href="http://commons.apache.org/beanutils/"&gt;Commons Beanutils&lt;/a&gt;. Niestety ono nie spełnia ani jednego wymogu. Drugą biblioteką, która mi wpadła do rąk była &lt;a href="http://sojo.sourceforge.net/"&gt;Sojo&lt;/a&gt;. API jest w fazie rozwoju ale już teraz udostępnia wiele funkcjonalności. Obsługuje kopiowanie wgłąb i radzi sobie z cyklami. Nie kopiuje też uprzednio skopiowanej referencji. Niestety nie znalazłem sposobu na dostarczenie własnego ClassLoadera.
&lt;/p&gt;
&lt;p&gt;
Ze względu na brak wymarzonej biblioteki zacząłem szukać alternatywnych rozwiązań. Pierwszą techniką, którą wykorzystałem była wbudowana serializacja. Niestety ta metoda nie pozwala na dostarczenie własnego ClassLoadera (wykorzystywany jest ClassLoader wywołujący metodę deserializacji) i wymaga by każda klasa implementowała interfejs Serializable.
&lt;/p&gt;
&lt;p&gt;
Kolejnym rozwiązaniem, które przetestowałem było użycie koderów JavaBean&lt;-&gt;XML dostarczanych wraz z JRE (klasy XMLEncoder, XMLDecoder). Technika ta jest zdecydowanie najwolniejsza, jednak na pierwszy rzut oka wydawało się, że posiada wszystkie cechy, które od takiego API wymagam. Niestety pomimo dostarczenia własnego ClassLoader'a nie jest on wykorzystywany do wczytania wszystkich niezbędnych klas. 
&lt;/p&gt;
&lt;p&gt;
Po kilku dniach próbowania różnych technologii stwierdziłem, że szybciej będzie jak sam zaimplementuję taką funkcjonalność. I w ten oto sposób w 2 dni napisałem proste API do kopiowania beanów ze wszystkimi funkcjonalnościami. API nosi roboczą nazwę BeanCopier i na razie dostępne jest do ściągnięcia na repozytorium Maven 2 pod adresem: &lt;a href="http://eggframework.org/maven2"&gt;http://eggframework.org/maven2&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Aby użyć API we własnym projekcie Maven 2 należy dodać do pom.xml:
&lt;/p&gt;
&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;project&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
    &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;dependencies&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
        &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;dependency&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
            &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;groupId&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;com.jacekolszak&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;groupId&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
            &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;artifactId&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;beancopier&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;artifactId&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
            &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;version&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;0.9&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;version&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
        &lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;dependency&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
    &lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;dependencies&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
    &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;repositories&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
        &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;repository&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
            &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;id&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;Egg Framework&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;id&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
            &lt;span style='color:#a65700; '&gt;&amp;lt;&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;url&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;http://eggframework.org/maven2&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;url&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
        &lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;repository&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
    &lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;repositories&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
&lt;span style='color:#a65700; '&gt;&amp;lt;/&lt;/span&gt;&lt;span style='color:#5f5035; '&gt;project&lt;/span&gt;&lt;span style='color:#a65700; '&gt;&gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Sposób użycia BeanCopier:
&lt;/p&gt;
&lt;pre style='color:#000000;background:#ffffff;'&gt;BeanCopier beanCopier = new BeanCopierImpl()&lt;span style='color:#808030; '&gt;;&lt;/span&gt;
copy = beanCopier.copy(original, classLoader)&lt;span style='color:#808030; '&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Niebawem wrzucę źródła na CVS. Póki co są one dostępne w jarze beancopier-0.9-sources.jar na repozytorium Maven 2.
&lt;/p&gt;
&lt;p&gt;
UPDATE: Źródła są dostępne na repozytorium Bazaar po adresem:  &lt;i&gt;http://bazaar.launchpad.net/~jacekolszak/beancopier/trunk&lt;/i&gt;. Wystarczy wydać polecenie: &lt;br /&gt;
&lt;code&gt;bzr branch http://bazaar.launchpad.net/~jacekolszak/beancopier/trunk&lt;/code&gt;&lt;br /&gt;
aby ściągnąć najnowsze źródła.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-581851653568147333?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/581851653568147333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=581851653568147333&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/581851653568147333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/581851653568147333'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2007/12/api-do-kopiowania-javabeans.html' title='API do kopiowania JavaBeans'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-2317292965448504469</id><published>2007-12-17T15:39:00.001+01:00</published><updated>2007-12-17T18:33:33.459+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='fluent interface'/><category scheme='http://www.blogger.com/atom/ns#' term='egg'/><title type='text'>Fluent Interface w Egg Framework 2.0</title><content type='html'>&lt;p&gt;Jedną z najciekawszych funkcjonalności wprowadzonych do &lt;a href="http://eggframework.org"&gt;Egg Framework 2.0&lt;/a&gt; jest Fluent Interface - API, za pomocą którego można tworzyć czytelny kod aplikacji www w języku Java - wyglądający o dziwo bardzo podobnie do HTMLa. &lt;/p&gt;

&lt;p&gt;Fluent Interface to pojęcie wprowadzone przez Martina Fowlera i Erica Evansa. Nazwali oni tym terminem pewien styl tworzenia interfejsów programowych. Więcej można przeczytać na &lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;blogu Martina Fowlera&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;
Oto przykład strony www stworzonej przy użyciu Fluent Interface zaimplementowanym w &lt;a href="http://eggframework.org"&gt;Egg Framework 2.0&lt;/a&gt;:
&lt;/p&gt;


&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;package&lt;/span&gt;&lt;span style='color:#004a43; '&gt; org&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;eggframework2&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;view&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;examples&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;xhtml&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold; '&gt;import&lt;/span&gt;&lt;span style='color:#004a43; '&gt; static org&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;eggframework2&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;view&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;elements&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;xhtml&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;ext&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;FluentInterfaceMethods&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;*&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold; '&gt;import&lt;/span&gt;&lt;span style='color:#004a43; '&gt; org&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;eggframework2&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;view&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;elements&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;IElement&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
&lt;span style='color:#800000; font-weight:bold; '&gt;import&lt;/span&gt;&lt;span style='color:#004a43; '&gt; org&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;eggframework2&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;view&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;elements&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;xhtml&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;tags&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;&lt;span style='color:#004a43; '&gt;Html&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;

&lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;class&lt;/span&gt; FluentInterfaceUsageExample &lt;span style='color:#800000; font-weight:bold; '&gt;extends&lt;/span&gt; Html &lt;span style='color:#800080; '&gt;{&lt;/span&gt;

    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; FluentInterfaceUsageExample&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
        IElement body &lt;span style='color:#808030; '&gt;=&lt;/span&gt; &lt;span style='color:#696969; '&gt;//&lt;/span&gt;
        body&lt;span style='color:#808030; '&gt;(&lt;/span&gt; &lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                p&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Hello World"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                a&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Egg Framework Page"&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; href&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"http://eggframework.org"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                form&lt;span style='color:#808030; '&gt;(&lt;/span&gt;action&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"/action.do"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; method&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"post"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                        input&lt;span style='color:#808030; '&gt;(&lt;/span&gt;type&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"text"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; name&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Login"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; br&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                        input&lt;span style='color:#808030; '&gt;(&lt;/span&gt;type&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"password"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; name&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Password"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; br&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; &lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                        input&lt;span style='color:#808030; '&gt;(&lt;/span&gt;type&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"submit"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; value&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Please log me in"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                &lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                table&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                        tr&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                                td&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Cell 1"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; td&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Cell 2"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; td&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Cell 3"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                        &lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                        tr&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                                td&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Cell 1"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; td&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Cell 2"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;,&lt;/span&gt; td&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#0000e6; '&gt;"Cell 3"&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                        &lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#696969; '&gt;//&lt;/span&gt;
                &lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;

        add&lt;span style='color:#808030; '&gt;(&lt;/span&gt;body&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;

    &lt;span style='color:#800000; font-weight:bold; '&gt;public&lt;/span&gt; &lt;span style='color:#800000; font-weight:bold; '&gt;static&lt;/span&gt; &lt;span style='color:#bb7977; '&gt;void&lt;/span&gt; main&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#bb7977; font-weight:bold; '&gt;String&lt;/span&gt;&lt;span style='color:#808030; '&gt;[&lt;/span&gt;&lt;span style='color:#808030; '&gt;]&lt;/span&gt; args&lt;span style='color:#808030; '&gt;)&lt;/span&gt; &lt;span style='color:#800080; '&gt;{&lt;/span&gt;
        &lt;span style='color:#bb7977; font-weight:bold; '&gt;System&lt;/span&gt;&lt;span style='color:#808030; '&gt;.&lt;/span&gt;out&lt;span style='color:#808030; '&gt;.&lt;/span&gt;println&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#800000; font-weight:bold; '&gt;new&lt;/span&gt; FluentInterfaceUsageExample&lt;span style='color:#808030; '&gt;(&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#808030; '&gt;)&lt;/span&gt;&lt;span style='color:#800080; '&gt;;&lt;/span&gt;
    &lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;span style='color:#800080; '&gt;}&lt;/span&gt;
&lt;/pre&gt;



&lt;p&gt;
Jak widać kod Javy jest bardzo czytelny i podobny do wynikowego kodu HTML. Wszystko dzięki wykorzystaniu metod statycznych i statycznych importów. Dzięki zaimportowaniu wszystkich metod z klasy FluentInterfaceMethods możemy ich użyć w kodzie strony tak jakby były one jej częścią. Nie musimy więc poprzedzać nazwy metody nazwą klasy w jakiej jest ona zdefiniowana. To sprawia, że kod jest znacznie bardziej zwięzły.
&lt;/p&gt;
&lt;p&gt;
Klasa FluentInterfaceMethods oprócz metod tworzących instancje elementów (znaczników) HTML posiada metody tworzące atrybuty np. &lt;span style="font-style: italic;"&gt;type&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;name, id&lt;/span&gt;. Dzięki temu można w jednej linijce utworzyć element i ustawić jego atrybuty. 
&lt;/p&gt;
&lt;p&gt;
Jeśli często używasz układania kodu źródłowego (Pretty Print) to musisz być przygotowany na to, iż większość IDE ułoży kod takiej strony w jednej linijce (albowiem całą zawartość tworzysz poprzez zagnieżdżone wywołania metod). To na pewno nie przyczyni się do zwiększenia czytelności kodu, wręcz odwrotnie - znacznie ją pogorszy. Aby ustrzec się przed taką sytuacją należy użyć komentarzy ("//") w miejscach gdzie IDE ma złamać linię. Dzięki nim nawet po operacji układania kodu kod będzie ładnie się prezentował.
&lt;/p&gt;
&lt;p&gt;
Fluent Interface w &lt;a href="http://eggframework.org"&gt;Egg Framework&lt;/a&gt; to sposób na zwiększenie czytelności tworzonego kodu. Jest to swojego rodzaju nakładka i wykorzystuje istniejące API. Po kilkunastu/kilkudziesięciu minutach pracy powinieneś się przyzwyczaić do tego "dziwnego stylu programowania". Od Ciebie zależy czy będziesz go wykorzystywał czy nie - w wielu wypadkach może okazać się lepszy, jednak mogą zdarzyć się sytuacje gdy utworzenie zawartości strony "w standardowy sposób" będzie prostsze i szybsze.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-2317292965448504469?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/2317292965448504469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=2317292965448504469&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/2317292965448504469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/2317292965448504469'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2007/12/fluent-interface-w-egg-framework-20.html' title='Fluent Interface w Egg Framework 2.0'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-115497118165901894</id><published>2006-08-07T19:19:00.000+02:00</published><updated>2006-08-07T19:31:05.956+02:00</updated><title type='text'>Przekleństwo frameworków Javowych</title><content type='html'>&lt;a style="float: left;"
href="http://www.flickr.com/photos/69188654@N00/209200440/" 
title="Photo Sharing"&gt;&lt;img 
src="http://static.flickr.com/77/209200440_34d82ab369_s.jpg
" width="75" height="75" alt="Egg Framework" /&gt;&lt;/a&gt;
Dla Javy napisano już setki, jeśli nie tysiące szkieletów 
do pisania aplikacji webowych. Jeśli ktoś wnikliwie czyta 
newsy na &lt;a href="http://theserverside.com" 
target="_blank"&gt;theserverside&lt;/a&gt; to wie, że nowe frameworki
powstają jak grzyby po deszczu.
&lt;br/&gt;&lt;br/&gt;

Pytanie jednak brzmi... skoro każdy szkielet jest taki 
dobry, to czemu powstają nowe? Odpowiedź jest jedna - nie 
da się napisac szkieletu dla każdego. Ponadto wiele nowych 
frameworków bardziej utrudnia niż ułatwia życie 
programistów, starając się rozwiązać każdy problem. 
Świadczy może o tym na przykład fakt, iż wciąż najczęsciej 
używany jest Struts, pomimo swego sędziwego wieku.
&lt;br/&gt;&lt;br/&gt;

Jakie więc powinny być cechy idealnego frameworka? W mojej 
opinii szkielet to narzędzie, które pozwoli programiście 
przede wszystkich na łatwiejsze i szybsze pisanie 
aplikacji. Dlatego też szkielet powinien być jak 
najprostszy, mieć przejrzyste API, zadbany i przemyślany 
kod źródłowy, aby programista mógł bez problemu go 
zrozumieć (często lepiej jest po prostu zobaczyć jako kod 
działa, aniżeli czytać często niekompletną dokumentację). 
Jeśli zaś mówimy o szybkości pisania aplikacji to developer 
powinien implementować ją w sposób niezwykle zwinny (ang. 
agile). Chodzi o to, żeby programista (na przykład na 
życzenie klienta) mógł bardzo szybko nanieść poprawki bez 
konieczności wprowadzania zmian w kilku miejscach, długim 
testowaniu aplikacji od strony GUI (na przykład w przypadku 
brak możliwości pisania testów jednostkowych dla 
komponentów GUI) czy wreszcie ciągłych restartów serwera. 
Jeszcze jedna kwestia - szkielet nie powinien w żaden 
sposób ograniczać programisty! Jeśli coś można w prosty 
sposób zrobić w HTMLu i JavaScriptcie, to i w tym 
szkielecie musi to być czynność prosta i przede wszystkim 
możliwa(!). 

&lt;br/&gt;&lt;br/&gt;
Oburzony brakiem "idealnego" frameworka, stworzyłem własny 
prototyp takiego szkieletu - zaprojektowany tak, aby 
mógłbyć podstawą większości aplikacji tworzonych w 
standardowym modelu klient-serwer (bez udziwnień AJAXowych, 
z wiszącymi połączeniami włącznie). Szkielet ten zawiera 
jedynie podstawową funkcjonalność (brakuje w nim chociażby 
walidatorów), jednak w mojej opinii jest ona w zupełności 
wystarczająca. Uznaję zasadę, że programista musi znać 
szkielet, którego używa w 100 procentach. Jeśli 
udostępniłbym programiście zaawansowane komponenty, to 
mógłby on w ogóle nie rozumieć zasady ich działania (co w 
końcu doprowadziłoby do poważnych przestojów w projekcie,  
związanyc z poprawianiem uprzednio napisanego kodu).
&lt;br/&gt;&lt;br/&gt;

Ów prototyp okazał się na tyle ciekawy, że postanowiłem 
zacząć pisać projekt z prawdziwego zdarzenia. Projekt nosi 
nazwę &lt;a href="http://code.google.com/p/egg"&gt;Egg&lt;/a&gt; i jak 
sama nazwa wskazuje jest zalążkiem tworzonej przez Ciebie 
aplikacji. Używając go będziesz mógł stworzyć zarówno 
prostą, jak i szalenie skomplikowaną aplikację. Do 
niektórych jego cech należą: automatyczne reloadowanie klas 
bez restartów serwera, pełna obiektowość (możliwość 
tworzenia własnych komponentów w śmiesznie prosty sposób), 
DRY (zasada nie powtarzania kodu w różnych miejscach), CoC 
(konwencja zamiast konfiguracji) oraz możliwość łatwego 
testowania tworzenego GUI (na zasadach TDD). 
Wersja alpha projektu będzie dostępna w ciągu kilku dni na 
serwerach &lt;a href="http://code.google.com/p/egg"&gt;Google 
Code&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-115497118165901894?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/115497118165901894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=115497118165901894&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/115497118165901894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/115497118165901894'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2006/08/przeklestwo-frameworkw-javowych.html' title='Przekleństwo frameworków Javowych'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-114819460401229394</id><published>2006-05-21T08:56:00.000+02:00</published><updated>2006-06-03T10:07:14.850+02:00</updated><title type='text'>Google Web Toolkit</title><content type='html'>Szukając ostatnio javowych framework'ów do tworzenia aplikacji AJAXowych natrafiłem na &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt;. Spotkałem już wiele narzędzi, jednak muszę przyznać, że jeszcze nigdy nie byłem 
tak podekscytowany :)&lt;br&gt;&lt;br&gt;

GWT to podobnie jak SWT czy SWING biblioteka do tworzenia interfejsów użytkownika. Jednak w tym przypadku tworzymy aplikacje webowe a nie desktopowe. Z pewnością niektórzy używali lub zapoznali się wcześniej z takimi frameworkami jak Echo - tu sprawa wygląda podobnie. Czemu więc jestem podekscytowany? Powodów jest kilka. &lt;br&gt;&lt;br&gt;
Pierwszy to ten, że Google ma za sobą stworzenie kilku świetnych aplikacji AJAXowych (Google Maps, GMAIL). Drugi fakt, że biblioteka jest na licencji Open Source (choć część kodu nie jest dostępna). Po trzecie framework umożliwia w łatwy sposób tworzenie kodu JavaScript w Javie (tak, kod Javy jest kompilowany do JavaScriptu!). Po czwarte umożliwia łatwe debugowanie (w trybie debugowania Java nie jest tłumaczona do JavaScriptu). &lt;br&gt;&lt;br&gt;

Podsumowując GWT wygląda bardzo okazale. Jest to nie tylko biblioteka ale też zbiór narzędzi, które znacznie mogą podnieść wydajność programisty. GWT może na zawsze zmienić życie programistów aplikacji webowych. Sprawi, że będą szybciej i lepiej tworzyć interaktywne interfejsy użytkownika. Wraz z powstaniem wersji stablinej i zaimplementowaniem obsługi Javy 5.0, GWT to ma szansę stać się najpopularniejszych frameworkiem aplikacji AJAX wszechczasów :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-114819460401229394?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/114819460401229394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=114819460401229394&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/114819460401229394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/114819460401229394'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2006/05/google-web-toolkit.html' title='Google Web Toolkit'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-114059611741875397</id><published>2006-02-22T09:00:00.000+01:00</published><updated>2006-02-22T11:56:44.516+01:00</updated><title type='text'>Pierwszy duży projekt w Ruby</title><content type='html'>Postanowiłem wstrzymać wszystkie moje prace Open Source, na rzecz jednego projektu, który w moim przekonaniu jest najlepszym projektem w całym moim życiu (życiu krótkim, acz niewzykle ciekawym;) ). Framework (albowiem projekt będzie szkieletem aplikacji) ten ma jako jeden z pierwszych umożliwić szybkie i bezbolesne tworzenie gier MMOG (ang. Massive Multiplayer Online Game) oraz aplikacji RIA (ang. Rich Internet Application) działających w "czasie rzeczywistym" (czyt. automatycznie aktualizowanych po stronie klienta)&lt;br&gt;&lt;br&gt;

Tego rodzaju aplikacje stawiają bardzo duże wymagania przed programistą. Tworzy je się zupełnie inaczej niż standardowe web-aplikacje. Jest tu znacznie więcej technik AJAXowych i DHTMLa (co przy dużej liczbie metod podmieniających fragmenty stron może być niezwykle uciążliwe). Programista musi zaimplementować skomplikowane mechanizmy aktualizacji danych u użytkowników. Użycie standardowych frameworków jest tu zupełnie nie na miejscu, ze względu na zbyt duże obciążenie procesora i pamięci (w tego typu aplikacjach ilość użytkowników naraz korzystających z aplikacji mierzy się w tysiącach). Ponadto trudo jest coś takiego sklastrować. Zadaniem frameworka będzie więc ułatwienie życia programisty poprzez dostarczenie mu gotowych mechanizmów, po to, aby mógł się skupić jedynie na implementacji rozgrywki i zaprojektowaniu GUI.&lt;br&gt;&lt;br&gt;

Projekt jest dość śmiały technologicznie choć nie nazbyt przesadzony. Aby mówić o wersji gotowej do użytku będę musiał stworzyć własny serwer WWW, nieco różniący się od istniejących rozwiązań (obecnie zrobiony w 20%), pseudo obiektową bazę danych (coś na wzór prevlayera, ale trochę z innym zastosowaniem), mechanizm "dirty templates" (moja kodowa nazwa na szablony dynamicznie zmieniające się w czasie) oraz parę innych równie ważnych mechanizmów. &lt;br&gt;&lt;br&gt;

Oczywiście użytą technologią będzie Ruby, ze względu na to, że do takich zastosowań jak prototypowanie język ten nadaje się znakomicie.&lt;br&gt;&lt;br&gt;

W ciągu najbliższych kilku dni dodam projekt, na którymś z portali Open Source (Sourceforge albo RubyForge). Ponadto stworzę jakieś wiki (prawdopodobnie na swik.net) oraz blog (mam własnego VPSa więc nie będzie z tym problemu).
&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-114059611741875397?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/114059611741875397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=114059611741875397&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/114059611741875397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/114059611741875397'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2006/02/pierwszy-duy-projekt-w-ruby.html' title='Pierwszy duży projekt w Ruby'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-113748754765805961</id><published>2006-01-17T09:45:00.000+01:00</published><updated>2006-01-17T09:55:43.213+01:00</updated><title type='text'>Watir rocks!</title><content type='html'>Ruby coraz bardziej daje o sobie znać na świecie. Nie tylko dlatego, iż jest świetnym językiem programowania, ale także dlatego, że powstaje w nim coraz więcej genialnych projektów.&lt;br&gt;&lt;br&gt;

Szukając sposobu na testowanie gui aplikacji webowych nie mogłem do tej pory znaleźć idealnego rozwiązania. Używałem JMetera, który posiada możliwość porównywania strony wynikowej z żądaną zawartością, jednak takie rozwiązanie było dość ograniczone (nie można było testować AJAXowych aplikacji). Tymczasem technologia idzie do przodu - coraz więcej stron używa skomplikowanego JavaScriptu, więc i narzędzia do testowania muszą się zmieniać. JMetera mogłem ze spokojem odłożyć na półkę, gdy na rubyforge.org znalazłem świętego grala do testów aplikacji webowych.&lt;br&gt;&lt;br&gt;

&lt;a href="http://wtr.rubyforge.org"&gt;Watir&lt;/a&gt; to projekt umożliwiający symulowanie interakcji użytkownika z przeglądarką. Umożliwia symulowanie działań użytkownika - klikania na buttony, wypełniania formularzy a nawet poruszania myszką. Zasada działania programu jest prosta: piszemy program (test jednostkowy), który odpala przeglądarkę, wykonuje określone czynności i sprawdza wyniki. Podczas testu na żywo widzimy co dzieje się w przeglądarce. Podsumowując program genialny bo prosty i intuicyjny. Oczywiście cały kod testujący piszemy w Ruby :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-113748754765805961?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/113748754765805961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=113748754765805961&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113748754765805961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113748754765805961'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2006/01/watir-rocks.html' title='Watir rocks!'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-113714054314082571</id><published>2006-01-13T09:22:00.000+01:00</published><updated>2006-01-13T09:25:33.806+01:00</updated><title type='text'>Ruby forever!</title><content type='html'>Minęły 2 miesiące od kiedy poraz pierwszy zetknąłem się z językiem Ruby. Jednak przez ostatni miesiąc szczególnie się nim interestowałem - odwiedzałem serwisy jemu poświęcone, stawiałem różnorodne railsowe web-aplikacje, no i oczywiście programowałem w nim (i w Ruby on Rails również).&lt;br&gt;&lt;br&gt;
Muszę przyznać, że Ruby stał się moim ulubionym językiem. Pomimo, iż w Javie programuję już szmat czasu, to jednak Java chyba nigdy nie wydawała mi się tak genialna jak Ruby. Programując w nim mogłem zapomnieć o conajmniej kilkunastu wzorcach projektowych (w Rubym są one po prostu niepotrzebne!).&lt;br&gt;&lt;br&gt;
Poczułem w końcu (od czasów gdy stworzyłem swoją pierwszą stronę w PHP) przyjemność tworzenia - świadczyć może o tym fakt, iż odpowiednik biblioteki &lt;a href="http://olitext.org"&gt;Olitext&lt;/a&gt; (napisanej w Javie) stworzyłem w Rubym w zaledwie tydzień (czyli ponad 4x szybciej niz w Javie!). Nie zdarzały mi się momenty gdy technologia stawała mi na drodze - momenty gdy więcej musiałem się zastanawiać nad sposobem użycia bibliotek czy nad strukturą klas aniżeli nad samą implementacją.&lt;br&gt;&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;Dlatego i Wam szczególnie polecam ten język! :)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-113714054314082571?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/113714054314082571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=113714054314082571&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113714054314082571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113714054314082571'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2006/01/ruby-forever.html' title='Ruby forever!'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-113320738915059363</id><published>2005-11-28T20:49:00.000+01:00</published><updated>2005-11-28T20:51:05.190+01:00</updated><title type='text'>Początki z Ruby cz. 3. - Rails</title><content type='html'>No i doszedłem w końcu do technologii wywołującej osatnimi czasy największe rumieńce u programistów aplikacji webowych. Chodzi oczywiście o Ruby on Rails - framework, który ma szansę stać się najpopularniejszym szkieletem aplikacji wszechczasów.
Aplikacje webowe to szczególny rodzaj oprogramowania. Wiele czynności, które musi wykonać programista jest powtarzalna - od stworzenia mechanizmu dispatchującego, poprzez akcje, widoki i model.&lt;br&gt;&lt;br&gt;
Railsy spełniają wszystkie podstawowe wymogi, które stawiane są nowoczesnym szkieletom web-aplikacji. Można więc w nim korzystać z kontrolerów i szablonów. Można także korzystać z mapowań OR i interfesów web serviceów (to raczej nie często się spotyka w typowych frameworkach).&lt;br&gt;&lt;br&gt;
Mamy więc gotowe samowystarczalne rozwiązanie do pisania małych, średnich a nawet dużych webaplikacji - nie trzeba używać zewnętrzych bibliotek np. do wysyłania maili czy operacji na bazie danych. &lt;br&gt;&lt;br&gt;
Ruby on Rails to także szkielet z bardzo silnym wsparciem dla AJAXu. Mamy zbiór komend, które znacznie skracają czas pisania prawdziwie interaktywnych aplikacji.
Co jednak sprawia, że w Railsach zakochuje się coraz większa ilość programistów dawniej przekonanych o potędze Javy? PRZYJEMNOŚĆ Z TWORZENIA i CZAS JAKI TRZEBA POŚWIĘCIĆ NA NIEWAŻNE Z PUNKTU WIDZENIA UŻYTKOWNIKA RZECZY. &lt;br&gt;&lt;br&gt;
W następnym wątku opiszę po krótce mój pierwszy dzień tworzenia projektu &lt;b&gt;Communities Website System&lt;/b&gt;, który pisany jest właśnie w Railsach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-113320738915059363?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/113320738915059363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=113320738915059363&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113320738915059363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113320738915059363'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/11/pocztki-z-ruby-cz-3-rails.html' title='Początki z Ruby cz. 3. - Rails'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-113208001022885703</id><published>2005-11-15T19:40:00.000+01:00</published><updated>2005-11-15T19:45:27.046+01:00</updated><title type='text'>Sposób na automatyczne aktualizacje w Rich Internet Applications</title><content type='html'>Ostatnimi czasy bardzo intensywnie zajmuję się tworzeniem Rich Internet Applications. Większość tych programów pisałem w ActionScript 2.0. Od tygodnia jednak zajmuję się pisaniem małych aplikacji w RubyOnRails z wykorzystaniem bibliotek javascriptowych do asynchronicznych wywołań (czyli do AJAXa). 
&lt;br&gt;&lt;br&gt;
Podstawowym problemem każdego programisty aplikacji WWW jest napisanie czegoś co nie będzie generować dużego ruchu w sieci. Pisząc RIA nie można się przed tym uchronić. Niestety model HTTP nie jest zbyt odpowiedni do tego typu aplikacji - o wszelkich zmianach w bazie danych klient dowiaduje się dopiero po wysłaniu żądania. 
&lt;br&gt;&lt;br&gt;
Przykładowo mamy prostą grę www, w której ruchy jednego gracza są obserwowane przez drugiego. Załóżmy, że gracz 1 co kilkanaście sekund dokonuje ruchu. Natomiast gracz 2 chciałby od razu widzieć co się wydarzyło. Teraz pojawia się problem - aby coś takiego uzyskać trzeba na przykład w odstępie 2 sekund wysyłać zapytania typu GET do serwera, aby sprawdzić czy ruch w ogóle nastąpił. Zakładając, że prawie puste zapytanie typu GET + odpowiedź serwera pochlania około 4kB (razem w obie strony) mamy więc 2kB/s dla jednego gracza. Jeśli dysponujemy łączem powiedzmy 1Mbit(~128kB), to jesteśmy w stanie obsłużyć naraz zaledwie 64 użytkowników (!). Trzeba jednak pamiętać, że możemy mieć nawet 2 sekundy poślizgu z aktualnością danych.&lt;br&gt;&lt;br&gt;
Bardzo dużo nad tym problemem myślałem i przychodziły mi do głowy jedynie rozwiązania polegające na tworzeniu własnych trwałych połączeń w obie strony. Jednakże dzisiejsze firewalle czy serwery proxy na to nie pozwolą... Trzeba więc trzymać się protokołu HTTP...&lt;br&gt;&lt;br&gt;
Wpadłem jednak na rozwiązanie problemu :D Nie wiem czy jest odpowiednie i czy na pewno będzie działać. Wiem jednak, że jest najlepsze z moich dotychczasowych rozwiązań... :D &lt;br&gt;&lt;br&gt;
Trik polega na tworzeniu nasłuchiwaczy. Nasłuchiwaczem jest po prostu każdy klient, który chce dowiedzieć się o zmianach wybranej częsci bazy danych. Klient łączy się z serwerem, podczas gdy serwer nie odsyła mu od razu odpowiedzi.... &lt;b&gt;Połączenie więc "wisi" do momentu gdy któryś z graczy zmieni jakieś dane w bazie.&lt;/b&gt; Gdy wiszący wątek otrzyma taką informację - generuje odpowiedź serwera, po czym kończy wykonywanie żądania. Nasłuchiwacz dostaje więc info, od razu gdy dane zostały zmienione. Po czymś takim nasłuchiwacz ponownie łączy się z bazą danych, gdyż chce znów nasłuchiwać zmian.&lt;br&gt;&lt;br&gt;
Rozwiązanie jest przede wszystkim idealne, z uwagi na to że działa przez HTTP. Jedynym problemem są timeouty. Na przykład serwery proxy mogą czekać określoną ilość sekund na odpowiedź, po czym się rozłączają. Wtedy klient musi coś takiego przechwycić i połączyć się ponownie (oczywiscie po stronie serwera wiszący wątek musi takze zostać usunięty).&lt;br&gt;&lt;br&gt;
Co myślicie o tym rowiązaniu? Czy nie ma żadnych innych przeciwskazań aby użyć takiego techniki?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-113208001022885703?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/113208001022885703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=113208001022885703&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113208001022885703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113208001022885703'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/11/sposb-na-automatyczne-aktualizacje-w.html' title='Sposób na automatyczne aktualizacje w Rich Internet Applications'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-113153733942925013</id><published>2005-11-09T12:55:00.000+01:00</published><updated>2005-11-09T12:55:39.486+01:00</updated><title type='text'>Początki z Ruby cz. 2. - RDT</title><content type='html'>&lt;p&gt;
Naukę zacząłem oczywiście od poszukania jakiegoś porządnego środowiska programistycznego. Ku mojemu zaskoczeniu okazało się, że najlepsze środowisko zostało napisane pod... tak tak... ukochanego Eclipse'a :D 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://rubyeclipse.sf.net"&gt;Ruby Development Tool&lt;/a&gt;, bo tak ów plugin się nazywa posiada wiele cech Javovego JDT. Oczywiście daleko mu do zaawansowanych mozliwosci JDT, jednakże posiada podstawową funkcjonalność, która znacznie ułatwić może życie początkującego i średnio zaawnsowanego programisty języka Ruby.
&lt;/p&gt;
&lt;p&gt;
Mamy więc takie rzeczy jak: quick assist (ctrl+spacja), widok outline, debugger zintegrowany z tym eclipsowym, gui testow jednostkowych niemal identyczne jak to dla javowego JUnit, podswietlanie składni czy sprawdzanie w locie.
&lt;/p&gt;
&lt;p&gt;
Projekt ostatnimi czasy coraz szybciej się rozwija, w związku z czym możemy liczyć na szybkie dodawanie nowych funkcjonalności i poprawienie bugów.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-113153733942925013?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/113153733942925013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=113153733942925013&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113153733942925013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113153733942925013'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/11/pocztki-z-ruby-cz-2-rdt.html' title='Początki z Ruby cz. 2. - RDT'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-113094889637091285</id><published>2005-11-02T17:25:00.000+01:00</published><updated>2005-11-02T17:30:09.896+01:00</updated><title type='text'>Początki z Ruby cz. 1.</title><content type='html'>&lt;p&gt;
Mamy ostatnio modę na &lt;a href="http://ruby-lang.org" target="_blank"&gt;Ruby&lt;/a&gt; - świetny język skryptowy autorstwa Yukihiro Matsumoto. Na najpopularniejszych blogach javowców co 5 wątek dotyczy &lt;a href="http://ruby-lang.org" target="_blank"&gt;Rubiego&lt;/a&gt; lub &lt;a href="http://rubyonrails.org" target="_blank"&gt;Ruby on Rails&lt;/a&gt;. Postanowiłem sprawdzić co takiego genialnego ma w sobie ten skryptowy język i zacząłem się go uczyć.
&lt;/p&gt;
&lt;p&gt;
Ruby to przełom w programowaniu obiektowym. Jest to język, w którym wszystko jest obiektem. Nie ma tu typów prostych jak int, long czy double w Javie. Każda zmienna i wartość posiada więc metody i właściwosci. Jest to jednak przede wszystkim język dynamicznego typowania - nie trzeba definiowac typu obiektu ani rzutować typów. Brakuje tu interfejsów, są za to moduły. Mamy bardzo rozwinięte mechanizmy iteracji i bloki kodu będące wywołaniami zwrotnymi (ang. callbacks). Jest to język o bardzo skrótowym zapisie - z powodzeniem na jednym ekranie można mieć otwarte 2 edytory obok siebie (w javie monitora nie starcza na jednego;). To wszystko sprawia, że programuje się szybko i bezboleśnie - w myśl zasady Agile Programming. Ideą twórców zaś, jest sprawienie, że programujący w Ruby poczują prawdziwą przyjemność z programowania.
&lt;/p&gt;
&lt;p&gt;
W następnych wątkach postaram się przybliżyć dobre strony (i być może złe strony) programowania w Rubym.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-113094889637091285?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/113094889637091285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=113094889637091285&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113094889637091285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/113094889637091285'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/11/pocztki-z-ruby-cz-1.html' title='Początki z &lt;b&gt;Ruby&lt;/b&gt; cz. 1.'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-112565020324596569</id><published>2005-09-02T10:36:00.000+02:00</published><updated>2005-09-03T15:59:34.283+02:00</updated><title type='text'>ODBMS vs. RDBMS - czyli wydajność i wygoda vs popularność i dostępność ;)</title><content type='html'>Przez kilka ostatnich dni zajmuję się tworzeniem aplikacji, której wydajność jest kluczowa - to czy będzie działać kilka procent szybciej ma ogromne znaczenie. Dlatego też staram się na wszystkim oszczędzać - na ilości przesyłanych danych (bo to aplikacja klient-serwer), ilości tworzonych nowych wątków do obsługi żądań, no i na czasie wykonywania operacji na bazie danych.
&lt;br/&gt;&lt;br/&gt;
Przyznam, że dotychczas jeśli chodzi o aplikacje bazodanowe to tworzyłem je tylko w oparciu o relacyjne bazy danych (zarówno w Javie, jak i w PHP). Jakiś czas temu zacząłem też używać frameworków do mapowań &lt;b&gt;O/R&lt;/b&gt; (&lt;b&gt;JDO&lt;/b&gt;, &lt;b&gt;Hibernate&lt;/b&gt;, &lt;b&gt;Propel&lt;/b&gt;). Nigdy jednak nie pomyślałem, że zastosowanie tych technologii może być 
niewłaściwe dla jakiejkolwiek aplikacji. A jednak...
&lt;br/&gt;&lt;br/&gt;
Dziś w tworzeniu web-aplikacji używa się niemal jedynie relacyjnych baz danych (sam nie znam żadnej PHP-owej witryny, która by używała czegoś innego). Rzeczywistość pokazuje jednak, że w przypadku baz danych, do których wysyła się dużą liczbę zapytań takie rozwiązanie wcale nie jest wydajne, a nawet wygodne(!).
&lt;br/&gt;&lt;br/&gt;
Programując systemy z użyciem obiektowych języków prorgamowania chciałoby się używać tylko i wyłącznie tego języka i niczego więcej. Tymczasem programując aplikacje bazodanowe z użyciem RDBMS trzeba mieć na względzie strukturę bazy danych, wiedzieć jak taka baza pracuje, martwić się wieloma niepotrzebnymi rzeczami. Najgorsze jest jednak to, że taka baza nie przechowuje obiektów a jedynie zbiory rekordów, które muszą być mapowane na obiekty (lub na odwrót). Tu z pomocą przychodzą narzędzia O/R - JDO, Hibernate (Hibernate+Spring+Transakcje), Propel -  jednak zastanówmy się jakim kosztem ? Im więcej warstw pośrednich, tym mniejsza wydajność aplikacji. Pójdę jeszcze o krok dalej - a czy w ogóle JDBC jest wydajne? Przecież dla każdej kolumny w zapytaniu JDBC tworzone są nowe obiekty - a duża ilość takich operacji może znacznie obciążyć naszą aplikację.
&lt;br/&gt;&lt;br/&gt;
Tu z pomocą przychodzą obiektowe bazy danych - proste, wydajne, łatwe w użyciu, a przede wszystkim "obiektowe" ;) &lt;a href="http://www.prevayler.org" target="_blank"&gt;Prevayler&lt;/a&gt; to jedna z najpopularniejszych ODBMS dla Javy. Zakłada ona, iż wszystkie dane pochodzące z naszej aplikacji będą trzymane w pamięci operacyjnej RAM. Ktoś mógłby powiedzieć: "No dobrze, to po co w ogóle używać bazy danych skoro wszystko może być w pamięci RAM". Oczywiście można trzymać wszystkie obiekty w RAMie, ale przeszukanie ich może zająć bardzo dużo czasu (o ile nie napisze się jakiegoś własnego wydajnego mechanizmu, ale to już sie mija z celem ;) Aplikacja używająca Prevayler musi więc sama zarządzać tworzeniem zrzutów bazy danych (backup na wypadek awarii lub restartu serwera). Ponadto trzeba się 
liczyć z tym, że jeśli ilość danych będzie bardzo duża to zajmie dużo miejsca w pamięci operacyjnej - a przecież nie mamy jej w nieskończonych ilościach. Powracając do sedna sprawy, czyli wydajności - ile taka baza jest szybsza od np. bazy MySQL ? Odpowiedź może być zaskakująca - kilkaset-kilka tysięcy razy 
szybsza (!). Zachęcam do zapoznania się z wynikami testów wydajnościowych na stronie &lt;a href="http://www.prevayler.org" target="_blank"&gt;projektu&lt;/a&gt; (czytając go trzeba mieć na względzie, że testy te dotyczą tylko prostych zapytań, nie ma np. porównania z testami na SQLu wykorzystującymi złączenia, procedury, widoki itp.).
&lt;br/&gt;&lt;br/&gt;
Nieco "ulepszoną" wersją dla Prevayler jest &lt;a href="http://www.db4objects.com" target="_blank"&gt;db4objects&lt;/a&gt; - baza, która potrafi już bezpośrednio operować na plikach (oczywiście kosztem wydajności). Projekt ten posiada 2 licencje: GPL i komercyjną. Gorąco zachęcam to zapoznania się z obiema technologiami, bo naprawdę warto. Sam zastanawiam się, którą z nich wybrać - prawdopodnie do 
prostych systemów, w których nie jest aż tak ważne "bezpieczeństwo danych" (chodzi o możliwość utraty niektórych danych w przypadku awarii) oraz ilość danych nie przekracza kilkudziesięciu MB Ramu - użyję Prevayler. W innych sytuacja db4objects może okazać się dobrym rozwiązaniem.&lt;br/&gt;&lt;br/&gt;
Na forum &lt;a href="http://forums.java.net/jive/thread.jspa?messageID=23643"&gt;Java.net&lt;/a&gt; można przeczytać mój wątek o porównaniu ODBMS i RDBMS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-112565020324596569?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/112565020324596569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=112565020324596569&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112565020324596569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112565020324596569'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/09/odbms-vs-rdbms-czyli-wydajno-i-wygoda.html' title='ODBMS vs. RDBMS - czyli wydajność i wygoda vs popularność i dostępność ;)'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-112383305555030886</id><published>2005-08-12T09:43:00.000+02:00</published><updated>2005-09-02T10:39:33.250+02:00</updated><title type='text'>Moja recenzja Sothink SWF Decompiler MX 2005b</title><content type='html'>Na witrynie &lt;b&gt;Software Developers Journal&lt;/b&gt; - jednego z najbardziej prestiżowych czasopism w Polsce, no i przede wszystkim jedynego czasopisma o programowaniu zamieszczono recenzję mojego autorstwa. Recenzja dotyczy programu Sothink SWF Decompiler - w skrócie, aplikacji do dekompilacji plików swf.

&lt;a href="http://www.sdjournal.org/pl/index.php?page=sothink_swf_decompil" target="_blank"&gt;Artykuł można przeczytać tutaj&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-112383305555030886?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/112383305555030886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=112383305555030886&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112383305555030886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112383305555030886'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/08/moja-recenzja-sothink-swf-decompiler.html' title='Moja recenzja Sothink SWF Decompiler MX 2005b'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-112343688731914607</id><published>2005-08-07T19:44:00.000+02:00</published><updated>2005-08-29T21:19:39.223+02:00</updated><title type='text'>Marna dola programisty Java cz. 1</title><content type='html'>Sytuacja w Polsce, jeśli chodzi o &lt;b&gt;hosting dla webaplikacji tworzonych w Javie&lt;/b&gt; jest conajmniej nieciekawa. Tak najprawdę istnieje jedyna poważna firma – &lt;a href="http://www.jhosting.pl" target="_blank"&gt;http://www.jhosting.pl&lt;/a&gt; , która jednak za swoje usługi życzy sobie bajońskie sumy (1200 złoty netto rocznie za marne konto z dzieloną wirtualną maszyną Javy!). Reszta to po prostu wielkie nieporozumienie. Co jest tego przyczyną? Zbyt duże wymagania aplikacji javowych co do ilości pamięci operacyjnej czy niedouczenie polskich administratorów? Jeśli chodzi o to ostatnie to rzeczywiście, polscy administratorzy niewiele wiedzą o Tomcacie czy JBossie. Prędzej specjalistami w tych dziedzinach są programiści Java. Sam osobiście znam kilkoro adminów, którzy na pytanie o znajomość javowych serwerów milkną i zmieniają temat. Póki co dla Polaka pozostaje zakup takiego konta zagranicą. Tam ceny są już nieco niższe, jednak nie ma tak naprawdę rozsądnych rozwiązań za sumy poniżej 500-600 złotych rocznie. Najlepszym rozwiązaniem wydawać się więc może kupno wirtualnego serwera o przyzwoitych parametrach (np. &lt;a href="http://www.adiungo.com" target="_blank"&gt;Adiungo&lt;/a&gt; lub &lt;a target="_blank" href="http://www.fdcservers.net"&gt;FDCServers&lt;/a&gt;) lub ew. serwera dedykowanego.&lt;br&gt;&lt;br&gt;
Tymczasem sytuacja programistów PHP ma się zgoła odmiennie. Ilość firm oferujących hosting dla takich aplikacji jest ogromna - zarówno w Polsce jak i na świecie. Ofert jest tyle, że nie sposób przed zakupem zapoznać się z 1/10 tego co jest dostępne na rynku. Co więc ma zrobić Javowiec? Przenieść się na php ? Wolne żarty;) Nawet PHP 5 ze swoimi możliwościami obiektowymi w niczym nie dorówna Javie. Póki co jednak, aplikacje webowe napisane w Javie będą stosowane w intranecie i hostowane na serwerach firmowych, które tą aplikację stworzyły.
&lt;br&gt;&lt;br&gt;
Na &lt;a href="http://jdn.pl"&gt;JDN&lt;/a&gt; można zobaczyć mój post na temat hostingu Java w Polsce: &lt;a href="http://jdn.pl/node/182" target="_blank"&gt;http://jdn.pl/node/182&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-112343688731914607?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jacekolszak.blogspot.com/feeds/112343688731914607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7460465&amp;postID=112343688731914607&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112343688731914607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112343688731914607'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/08/marna-dola-programisty-java-cz-1.html' title='Marna dola programisty Java cz. 1'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-112342743744491160</id><published>2005-08-07T17:09:00.000+02:00</published><updated>2006-10-14T10:16:06.626+02:00</updated><title type='text'>Moje CV</title><content type='html'>&lt;table&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Imię&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;Jacek&lt;/td&gt;&lt;/tr&gt; 
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Nazwisko&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;Olszak&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Telefon&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;********&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Adres&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;ul. ***** */*, 02-441 Warszawa&lt;/td&gt;&lt;/tr&gt; 
&lt;tr&gt;&lt;td&gt;&lt;b&gt;E-mail&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;jacekolszak [at] gmail.com&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Data urodzenia&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;18 august 1983&lt;/td&gt;&lt;/tr&gt; 
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Stan cywilny&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;kawaler&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;b&gt;Wykształcenie&lt;/b&gt;&lt;/td&gt;
&lt;td width="130"&gt;2004 - do dziś&lt;/td&gt;&lt;td&gt;Wyższa Szkoła Informatyki w Łodzi (wydział zamiejscowy w Bydgoszczy) &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td width="70"&gt;2003&lt;/td&gt;&lt;td&gt;Uniwersytet Mikołaja Kopernika, Wydział Fizyki, Astronomii i Informatyki Stosowanej&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1998 - 2003&lt;/td&gt;&lt;td&gt;Technikum Elektroniczne, Toruń
dyplom technika w specjalnoci automatyka przemysłowa&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;b&gt;Certyfikaty&lt;/b&gt;&lt;/td&gt;
&lt;td with="130"&gt;sierpień 2006&lt;/td&gt;&lt;td&gt;Sun Certified Java Programmer SCJP 5.0&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;b&gt;Doświadczenie&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;05.2006 - do dziś&lt;/td&gt;
&lt;td&gt;ISolution [programista/projektant J2EE, Hibernate, Spring, JSF]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10.2005 - 05.2006&lt;/td&gt;
&lt;td&gt;Ramzes Sp. z o.o. [programista/projektant J2EE, EJB 3, web services, Spring, Hibernate]&lt;/td&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;05.2004 - 10.2005&lt;/td&gt;
&lt;td&gt;WiedzaNet Sp. z o.o. [programista Java, ActionScript 2(Flash), Toolbook, PHP]&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;2003 – 2005&lt;/td&gt;
&lt;td&gt;Praca jako freelancer – PHP, Java, SQL, Flash, DHTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;2002 – obecnie&lt;/td&gt;
&lt;td&gt;Praca przy projektach open source – programowanie i&amp;nbsp;zarządzanie projektami&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;b&gt;Osiągnięcia&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;&lt;td&gt;otrzymanie nagrody Dyrektora za Najlepszą Pracę Dyplomową roku 2002/03 w dziedzinie Informatyki&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1998&lt;/td&gt;&lt;td&gt;zajęcie 5 miejsca w wojewódzkim Konkursie Informatycznym (algorytmy)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-112342743744491160?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112342743744491160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112342743744491160'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/08/moje-cv.html' title='Moje CV'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-112342593465348749</id><published>2005-08-07T16:38:00.001+02:00</published><updated>2006-10-14T10:17:01.088+02:00</updated><title type='text'>My CV</title><content type='html'>&lt;table&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Name&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;Jacek&lt;/td&gt;&lt;/tr&gt; 
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Surname&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;Olszak&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Phone number&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;********&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Address&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;ul. ***** */*, 02-441 Warszawa&lt;/td&gt;&lt;/tr&gt; 
&lt;tr&gt;&lt;td&gt;&lt;b&gt;E-mail&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;jacekolszak [at] gmail.com &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Date of birth&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;18 august 1983&lt;/td&gt;&lt;/tr&gt; 
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Marital status&lt;/b&gt;&lt;/td&gt;&lt;td colspan="2"&gt;bachelor&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;b&gt;Education&lt;/b&gt;&lt;/td&gt;
&lt;td width="100"&gt;2004 - today&lt;/td&gt;&lt;td&gt;The College of Computer Science, Lodz (Division in Bydgoszcz) &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td width="70"&gt;2003&lt;/td&gt;&lt;td&gt;
Nicolaus Copernicus University, Torun&lt;br/&gt;
Faculty of Physics, Astronomy and Informatics NCU&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1998-2003&lt;/td&gt;&lt;td&gt;Electronic Technical College, Toruń&lt;br/&gt;
technical degree in industrial automatics&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;b&gt;Certificates&lt;/b&gt;&lt;/td&gt;
&lt;td width="100"&gt;august 2006&lt;/td&gt;&lt;td&gt;Sun Certified Java Programmer SCJP 5.0&lt;/td&gt;&lt;/tr&gt;
&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;b&gt;Job experience:&lt;/b&gt;&lt;/td&gt;
&lt;td width="100"&gt;05.2006 - today&lt;/td&gt;
&lt;td&gt;ISolution [Java developer/architect - JavaServer Faces, Spring, Hibernate]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;10.2005 - 05.2006&lt;/td&gt;
&lt;td&gt;Ramzes Sp. z o.o. [Java developer/architect - J2EE, EJB 3, web services, Hibernate, Spring]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;05.2004 - 09.2005&lt;/td&gt;
&lt;td&gt;WiedzaNet Sp. z o.o. [Java programmer, ActionScript 2(Flash), Toolbook, PHP]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;2003 – 2005&lt;/td&gt;
&lt;td&gt;Work as a freelancer – PHP, Java, SQL, Flash, DHTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;2002 – today&lt;/td&gt;
&lt;td&gt;Open Source – developing and projects leading&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;&lt;td&gt;&lt;b&gt;Achievements&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;&lt;td&gt;headmaster's price for the Best Diplom Work in Computer Science in 2002/03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1998&lt;/td&gt;&lt;td&gt;fifth place in Computer Science Provincial Contest (algorithms)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-112342593465348749?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112342593465348749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112342593465348749'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/08/my-cv_07.html' title='My CV'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7460465.post-112342051201434507</id><published>2005-08-07T15:05:00.000+02:00</published><updated>2007-02-01T09:55:56.768+01:00</updated><title type='text'>My skills</title><content type='html'>&lt;table&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://photos1.blogger.com/blogger/4931/460/1600/main_left1.gif"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/4931/460/320/main_left.gif" border="0" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;&lt;h3&gt;Java&lt;/h3&gt;
Skills: &lt;b&gt;9/10&lt;/b&gt;&lt;br&gt;
&lt;b&gt;JSE 5.0&lt;/b&gt; - [scjp 5.0] (oop, eclipse, junit, maven, ant, aop (jboss aop, spring aop), rmi, io, net, jakarta commons, xml, xmlbeans, swt, jface, swing, basics of eclipse plugins making),&lt;br&gt;
&lt;b&gt;JEE&lt;/b&gt; (javaserver faces, servlets, jsp, struts, spring, ejb 3.0, hibernate 3, web services - xfire, jdbc, velocity), &lt;b&gt;JME&lt;/b&gt; (basics)
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;a href="http://photos1.blogger.com/blogger/4931/460/1600/flash1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4931/460/320/flash1.jpg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;h3&gt;ActionScript 2.0 (Flash)&lt;/h3&gt;Skills: &lt;b&gt;9/10&lt;/b&gt;
object oriented programming, AS2Lib (collections, unit tests etc.), Action Script Development Tool + Flashout, Flash MX 2004 Professional
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;a href="http://photos1.blogger.com/blogger/4931/460/1600/php-logo1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4931/460/320/php-logo1.jpg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;h3&gt;PHP&lt;/h3&gt;Skills: &lt;b&gt;9/10&lt;/b&gt;
PHP 4, PHP 5 (object oriented programming), Smarty, phpunit, systems (Mambo, MediaWiki,PhpBB, ezPublish etc.)
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;&lt;h3&gt;Ruby&lt;/h3&gt; Skills: &lt;b&gt;6/10&lt;/b&gt;
(eclipse rdt, oop, io, drb, rinda, webrick, threads, xml, unit tests)
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;img src="http://rubyonrails.org/images/rails.png"/&gt;
&lt;/td&gt;
&lt;td&gt;&lt;h3&gt;Ruby on Rails&lt;/h3&gt; Skills: &lt;b&gt;6/10&lt;/b&gt;
(Active Record, Action View, AJAX techniques, Action Controller, lighttpd, webrick, eclipse radrails)
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;a href="http://photos1.blogger.com/blogger/4931/460/1600/mysql.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4931/460/320/mysql.jpg" border="0" alt="" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;h3&gt;Databases&lt;/h3&gt;Skills: &lt;b&gt;7/10&lt;/b&gt;
relational databases (MySQL, PostgreSQL, HSQLDb), o/r mapping tools for Java and PHP (EJB 3 persistance, JDO, Propel), Berkeley DB, db4o, Prevayler
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;a href="http://photos1.blogger.com/blogger/4931/460/1600/linuxorg.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4931/460/320/linuxorg.gif" border="0" alt="" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;h3&gt;Linux&lt;/h3&gt;Skills: &lt;b&gt;5/10&lt;/b&gt;
Daily use - desktop linux (os: Mandrake, Aurox, RedHat), www servers - Apache 2, Tomcat 5, Lighttpd
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;td&gt;&lt;h3&gt;Object Oriented Programming&lt;/h3&gt; Skills: &lt;b&gt;7/10&lt;/b&gt;
design patterns, UML
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;td&gt;&lt;h3&gt;HTML, JavaScript (DHTML), CSS&lt;/h3&gt;Skills: &lt;b&gt;9/10&lt;/b&gt;
XHTML, CSS 2.0, web applications/websites gui making
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;td&gt;&lt;h3&gt;Toolbook&lt;/h3&gt; Skills: &lt;b&gt;7/10&lt;/b&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;td&gt;&lt;h3&gt;XML&lt;/h3&gt; Skills: &lt;b&gt;7/10&lt;/b&gt;
XML APIs for Java, PHP, ActionScript, XML Schema, DTD
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;td&gt;&lt;h3&gt;Other technologies&lt;/h3&gt;C, Eclipse, CVS, Subversion, Microsoft Office, Open Office, JEdit, Dreamweaver MX, Pajączek, Quanta, Photoshop, ImageReady CS, Gimp, Windows XP,98,Me
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;
&lt;td&gt;&lt;h3&gt;Native languages&lt;/h3&gt;polish - Skills: &lt;b&gt;8/10&lt;/b&gt;
english - Skills: &lt;b&gt;5/10&lt;/b&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7460465-112342051201434507?l=jacekolszak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112342051201434507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7460465/posts/default/112342051201434507'/><link rel='alternate' type='text/html' href='http://jacekolszak.blogspot.com/2005/08/my-skills.html' title='My skills'/><author><name>Jacek Olszak</name><uri>https://profiles.google.com/111920569292443192417</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-V_PYn7IlLY0/AAAAAAAAAAI/AAAAAAAAAP8/8v9QTN_Xc7I/s512-c/photo.jpg'/></author></entry></feed>
