<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>xlab</title>
	
	<link>http://xlab.pl</link>
	<description>XSolve laboratory - dzielimy się tym co wiemy...</description>
	<lastBuildDate>Mon, 30 Aug 2010 07:34:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/xlab/IYMP" /><feedburner:info uri="xlab/iymp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Czym różnią się aplikacje webowe od desktopowych</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/_Z5YW4ts638/</link>
		<comments>http://xlab.pl/2010/08/czym-roznia-sie-aplikacje-webowe-od-desktopowych/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 13:20:33 +0000</pubDate>
		<dc:creator>marcin.andrzejewski</dc:creator>
				<category><![CDATA[Lorem Ipsum]]></category>
		<category><![CDATA[aplikacja desktopowa]]></category>
		<category><![CDATA[aplikacja internetowa]]></category>
		<category><![CDATA[aplikacja webowa]]></category>
		<category><![CDATA[aplikacja www]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1542</guid>
		<description><![CDATA[Często nasi Klienci pytają nas, czym różnią się aplikacje webowe od desktopowych. Wiemy, że jest to ważne i znaczące pytanie, zatem pragniemy podzielić się naszą wiedzą w tym temacie.

Czas, możliwości oraz ciągły rozwój technologii sprawił, że aplikacje muszą być jak najlepiej dopasowane do działalności Klienta. Wychodząc na przeciw oczekiwaniom, staramy się doradzić jaką aplikację wybrać [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Często nasi Klienci pytają nas, czym różnią się aplikacje webowe od desktopowych. Wiemy, że jest to ważne i znaczące pytanie, zatem pragniemy podzielić się naszą wiedzą w tym temacie.</p>
<p style="text-align: left;">
<p style="text-align: left;">Czas, możliwości oraz ciągły rozwój technologii sprawił, że aplikacje muszą być jak najlepiej dopasowane do działalności Klienta. Wychodząc na przeciw oczekiwaniom, staramy się doradzić jaką aplikację wybrać – webową, czy desktopową.</p>
<p style="text-align: left;">
<p style="text-align: left;">W ostatnich latach zauważyliśmy trend wzrostowy dla aplikacji webowych. Bez wątpienia przyczynił się do tego rozwój Internetu, który w szerokim paśmie oplótł kulę ziemską. Dlaczego więc z tej możliwości nie skorzystać? Pełna mobilność, możliwość skorzystania z aplikacji w każdym miejscu na świecie – to wygoda. A co z aplikacjami desktopowymi – czy nastał ich kres? Nie, natomiast mają one większe wymagania i wprowadzają pewne ograniczenia. Czym zatem te dwie aplikacje się różnią? O tym piszę poniżej.</p>
<p style="text-align: left;">
<p style="text-align: left;">Pierwszą i najważniejszą różnicą jest fakt, iż aplikacja webowa (internetowa) jest programem, który komunikuje się z użytkownikiem za pomocą okna przeglądarki internetowej, a aplikacja desktopowa instalowana jest na dysku komputera użytkownika.</p>
<p style="text-align: left;">
<p style="text-align: left;">Ogromną zaletą wybrania aplikacji webowej w tym przypadku jest możliwość dostępu do aplikacji z praktycznie dowolnego miejsca na ziemi, w którym znajduje się Internet. Nie jest konieczne instalowanie aplikacji na komputerze, co z pewnością nadaje nam mobilności i możliwości pracy bez sztucznych barier.</p>
<p style="text-align: left;">
<p style="text-align: left;">Aplikacja desktopowa uruchamiana jako program na komputerze ogranicza, przywiązuje do stanowiska pracy i do urządzenia. Aby skorzystać z takiej aplikacji na innym komputerze należy ją wcześniej zainstalować. A przecież czas spędzony na instalowaniu i późniejszym odinstalowaniu aplikacji można przeznaczyć na coś zupełnie innego.</p>
<p style="text-align: left;">
<p style="text-align: left;">Aplikacje webowe, w przeciwieństwie do większości aplikacji desktopowych nie są zależne od systemów operacyjnych. Nie musimy się zatem martwić, że aplikacja nie będzie działała na maszynie z innym systemem. Nie musimy jej także dopasowywać do pudełka, jakim jest system operacyjny, a do indywidualnych wymagań Klienta. Dzięki wykorzystaniu serwerów www i przeglądarki internetowej z aplikacji webowej możemy skorzystać na każdym komputerze w innym dziale, mieście lub kraju.</p>
<p style="text-align: left;">
<p style="text-align: left;">Kolejnym ważnym punktem do rozważenia jest kwestia aktualizacji. W przypadku aplikacji desktopowej zmuszeni jesteśmy zaktualizować każdy z komputerów, na którym zainstalowana jest aplikacja. W przypadku aplikacji webowej jest to kwestia niewymagająca tyle zaangażowania i czasu – administrator aplikacji aktualizuje ją, dzięki czemu już po chwili na każdym z komputerów możemy korzystać z najaktualnieszej wersji aplikacji.</p>
<p style="text-align: left;">
<p style="text-align: left;">A co z szybkością pracy, czy są jakieś różnice pomiędzy aplikacją desktopową a webową? Generalnie, na pierwszy rzut oka różnic nie widać. W każdej z nich możemy spotkać się z czynnikami warunkującymi efektywność aplikacji, takimi jak przepustowość łącza internetowego (w przypadku aplikacji webowej), jak również wydajności samego sprzętu komputerowego (w aplikacji desktopowej).</p>
<p style="text-align: left;">
<p style="text-align: left;">Bezpieczeństwo naszych danych to równie ważny punkt do rozważenia. Aplikacje webowe mogą stać się obiektem zainteresowania hakerów. Dobrze zabezpieczone, szyfrowane – nie stanowią problemu. Należy również pamiętać, że logując się w sposób nieostrożny do takiej aplikacji, na przykład z kafejki internetowej, zostawiamy po sobie ślad. Dane mogą powędrować w niepowołane ręce. Są to czynniki ludzkie, na które twórcy aplikacji nie mają wpływu. Aplikacje desktopowe natomiast uzależnione są od kondycji sprzętu, na których są zainstalowane. Wirusy, którymi dany komputer może być zainfekowany także mogą zbierać dane z programów, z których korzysta się na komputerze. Należy zatem pamiętać, że same aplikacje, choć dobrze zabezpieczone, wymagają od nas odpowiedzialności.</p>
<p style="text-align: left;">
<p style="text-align: left;">Na koniec podam kilka przykładów, gdzie można wykorzystać poszczególne aplikacje.</p>
<p style="text-align: left;">Aplikacjami desktopowymi mogą być różnego rodzaju programy księgowe, fakturowe, wszystkie, które musimy instalować na naszych komputerach.</p>
<p style="text-align: left;">Aplikacjami webowymi mogą być serwisy społecznościowe, kurierskie, transakcyjne, lojalnościowe, sklepy internetowe jak również inne aplikacje, w których dokonuje się autoryzacji. Pozwalają one, w przeciwieństwie do zwykłych stron internetowych interakcję z użytkownikiem. Aplikacjami webowymi mogą być również rozbudowane aplikacje desktopowe.</p>
<p style="text-align: left;">
<p style="text-align: left;">Nie zamykamy się jednak na taki podział. Klienci wymagają od nas również połączenia aplikacji webowych i desktopowych. Wtedy, nawet osoby niezdecydowane znajdą rozwiązanie dla siebie. Jedynym minusem takiego rozwiązania jest czas, który ze względu na większą ilość pracy wydłuża się podczas tworzenia takich rozwiązań.</p>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/_Z5YW4ts638" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/08/czym-roznia-sie-aplikacje-webowe-od-desktopowych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/08/czym-roznia-sie-aplikacje-webowe-od-desktopowych/</feedburner:origLink></item>
		<item>
		<title>GIT-SVN, czyli połączenie dwóch światów</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/zePX5fasKy8/</link>
		<comments>http://xlab.pl/2010/08/git-svn-czyli-polaczenie-dwoch-swiatow/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 12:24:20 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Lorem Ipsum]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[kontrola wersji]]></category>
		<category><![CDATA[scm]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1531</guid>
		<description><![CDATA[SVN jest jednym z najpopularniejszych i najpowszechniej używanych systemów kontroli wersji w dzisiejszych czasach. Nie oznacza to jednak, że jest rozwiązaniem najlepszym. Coraz większą popularność zyskują rozproszone systemy kontroli wersji, takie jak Git, Mercurial czy Bazaar. W tym artykule skupimy się na Gicie, który został stworzony przez Linusa Torvaldsa, w celu wersjonowania kernela Linuksa (zastąpił [...]]]></description>
			<content:encoded><![CDATA[<p>SVN jest jednym z najpopularniejszych i najpowszechniej używanych systemów kontroli wersji w dzisiejszych czasach. Nie oznacza to jednak, że jest rozwiązaniem najlepszym. Coraz większą popularność zyskują rozproszone systemy kontroli wersji, takie jak Git, Mercurial czy Bazaar. W tym artykule skupimy się na Gicie, który został stworzony przez Linusa Torvaldsa, w celu wersjonowania kernela Linuksa (zastąpił BitKeepera). Nie sposób wymienić wszystkich zalet, ale można wymienić kilka projektów, które go używają, co pokaże jego pozycję na rynku: Andorid, Arch Linux, Fedora, Gimp, Gnome, jQuery, OpenSuSE, Perl, Ruby On Rails, Wine, X.Org.</p>
<p>Poniżej pokażę rozwiązanie następującego problemu: &#8220;jestem programistą, znam i lubię Gita, ale w mojej firmie używa się SVNa&#8221;.<span id="more-1531"></span> Z pomocą przychodzi rozszrzenie <strong>git-svn</strong>, które umożliwia obustronną synchronizację repozytoriów. Rozpoczynamy od instalacji w systemach z rodziny Debian:</p>
<pre class="bash">sudo apt-get install git-svn</pre>
<p>Następnie inicjalizujemy repozytorium:</p>
<pre class="bash">mkdir repo
cd repo
git svn init svn://repo.path/trunk
git svn fetch -r HEAD</pre>
<p>Po tych czynnościach w folderze <em>repo</em> mamy już źródła naszego projektu. Możemy przystąpić do kodowania. Standardowo procedura nie różni się od normalnego używania Gita (czyli branch&#8217;owanie, rebase&#8217;y, mergowanie). Jedynie dochodzą dwie komendy którymi synchronizujemy się z repozytorium SVN:</p>
<pre class="bash">git svn rebase</pre>
<p>Pobiera najnowsze zmiany z repozytorium SVN do gałęzi <em>master</em> (odpowiednik <em>svn update</em>).</p>
<pre class="bash">git svn dcommit</pre>
<p>Wysyła nasze najnowsze zmiany z gałęzi <em>master</em> do repozytorium SVN (odpowiednik <em>svn commit</em>).</p>
<p>Warto jeszcze nadmienić o często spotykanej metodyce pracy z Gitem, tzw. ticket-workflow. Korzystając z aplikacji zarządzania zadaniami, takiej jak Jira lub Trac, każde zadanie ma swój numer. Dla każdego zadania tworzymy osobny <em>branch</em> w Gicie o nazwie TICKET_NR-krotki-opis. Dzięki temu możemy łatwo przełączać konteksty, jeśli przyjdzie nam nagle pracować nad innym zadaniem, a także porządkować commity przez spłaszczanie ich przy mergowaniu do gałęzi master. W naszym branchu na zadanie commitujemy do woli, a mergując do mastera używamy opcji <em>squash</em>, która stworzy nam jeden commit. Można też użyć mechanizmu <em>rebase</em> z opcją <em>interactive</em>, dzięki któremu możemy grupować lub reorganizować commity.</p>
<p>Powyższe rozwiązania zostały sprawdzone w praktyce i sprawowały się bardzo dobrze, obecność SVN była praktycznie nieodczuwalna w całym procesie :-)</p>
<p>Więcej informacji o samym Gicie znajdziesz w artykule Konrada: <a href="http://xlab.pl/2010/07/git-owy-piatek-z-xsolve/">GIT-owy piątek z XSolve</a></p>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/zePX5fasKy8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/08/git-svn-czyli-polaczenie-dwoch-swiatow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/08/git-svn-czyli-polaczenie-dwoch-swiatow/</feedburner:origLink></item>
		<item>
		<title>Bezbolesna konfiguracja OpenVPN pod Windows 7</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/L-2PbsRzSho/</link>
		<comments>http://xlab.pl/2010/08/bezbolesna-konfiguracja-openvpn-pod-windows-7/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 20:31:05 +0000</pubDate>
		<dc:creator>Krzysztof Wawoczny</dc:creator>
				<category><![CDATA[Lorem Ipsum]]></category>
		<category><![CDATA[openvpn]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1527</guid>
		<description><![CDATA[Standardowa instalka OpenVPN pod Windows 7 sprawia problemy. Niby się instaluje, niby wszystko ok ale jak przyjdzie do połączenia to rzuca błędami.
Sposobem na szybką i przyjemną instalację jest pobranie przygotowanej paczki z:
Kliknij tutaj
Po zapisaniu paczki należy wykonać następujące kroki:

&#8211;Prawy klik na SurfBouncer.exe -> Właściwości -> Zgodność
&#8211;Tryb zgodności -> zaznacz &#8216;Uruchom ten program w trybie zgodności [...]]]></description>
			<content:encoded><![CDATA[<p>Standardowa instalka OpenVPN pod Windows 7 sprawia problemy. Niby się instaluje, niby wszystko ok ale jak przyjdzie do połączenia to rzuca błędami.<br />
Sposobem na szybką i przyjemną instalację jest pobranie przygotowanej paczki z:</p>
<p><a href="http://www.surfbouncer.com/SB/win_install/SurfBouncer.exe">Kliknij tutaj</a></p>
<p>Po zapisaniu paczki należy wykonać następujące kroki:</p>
<ul>
<li>&#8211;Prawy klik na SurfBouncer.exe -> Właściwości -> Zgodność</li>
<li>&#8211;Tryb zgodności -> zaznacz &#8216;Uruchom ten program w trybie zgodności z:&#8217; -> wybierz &#8216;Windows Vista (Service Pack 1)</li>
<li>&#8211;W sekcji Poziom uprawnień zaznacz &#8216;Uruchom ten program jako administrator&#8217;</li>
<li>&#8211;Kliknij w &#8216;Zastosuj&#8217;</li>
<li>&#8211;Kliknij w &#8216;OK&#8217;</li>
</ul>
<p>Po wykonaniu powyższych kroków należy uruchomić SurfBouncer.exe i zainstalować wszystko z domyślnymi ustawieniami. Po instalacji w menu start w sekcji wyszukiwarki wpisujemy OpenVPN i na dostępnym wyniku klikamy prawym -> Właściwości aby sprawdzić czy tryb zgodności jest taki jak dla SurfBouncer.exe (powinien być taki sam, ale jeśli nie to na taki należy ustawić).</p>
<p>Dalsze postępowanie jak w README udostępnionym przez Michała Organka, czyli:</p>
<ul>
<li>&#8211;menu START > programy > OpenVPN > &#8220;OpenVPN configuration file directory&#8221;</li>
<li>&#8211;do otwartego katalogu konfiguracji &#8220;config&#8221;  kopiujemy:</li>
<ul>
<li>&#8212;&#8212;katalog &#8220;certyfikates&#8221;</li>
<li>&#8212;&#8212;plik konfiguracyjny &#8220;windows/xsolve-hq-openvpn.ovpn&#8221; </li>
</ul>
</ul>
<p>Teraz można już uruchomić klienta, kliknąć prawym na ikonę monitorów z czerwonym ekranem oraz wybrać z listy połączenie do &#8216;xsolve-hq-openvpn&#8217;.<br />
Prawdopodobnie ten sposób działa również dla Visty.</p>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/L-2PbsRzSho" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/08/bezbolesna-konfiguracja-openvpn-pod-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/08/bezbolesna-konfiguracja-openvpn-pod-windows-7/</feedburner:origLink></item>
		<item>
		<title>Zarządzanie projektami</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/xwvoelkAVZg/</link>
		<comments>http://xlab.pl/2010/07/zarzadzanie-projektami/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 15:15:40 +0000</pubDate>
		<dc:creator>piotr.nowinski</dc:creator>
				<category><![CDATA[Lorem Ipsum]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1502</guid>
		<description><![CDATA[Mimo coraz większej popularności tzw. metodyk zwinnych (np. stosowany w XSolve &#8211; SCRUM), nadal często trudno obejść się bez klasycznych metodyk zarządzania projektami typu PMBOK czy Prince2, których elementy &#8211; często mniej lub bardziej świadomie &#8211; powszechnie stosuje się w praktyce.  Celem niniejszej prezentacji jest przybliżenie słuchaczom elementów klasycznego podejścia do planowania zadań i [...]]]></description>
			<content:encoded><![CDATA[<p>Mimo coraz większej popularności tzw. <strong>metodyk zwinnych</strong> (np. stosowany w XSolve<em> &#8211; SCRUM</em>), nadal często trudno obejść się bez klasycznych metodyk zarządzania projektami typu <strong>PMBOK</strong> czy <strong>Prince2</strong>, których elementy &#8211; często mniej lub bardziej świadomie &#8211; powszechnie stosuje się w praktyce.  Celem niniejszej prezentacji jest przybliżenie słuchaczom elementów klasycznego podejścia do planowania zadań i tworzenia harmonogramu w projekcie.</p>
<p><span id="more-1502"></span></p>
<div id="__ss_4753344" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"> </strong></div>
<p style="text-align: center;"><object id="__sse4753344" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=zarz-100714101037-phpapp02&amp;stripped_title=zarzdzanie-projektami" /><param name="name" value="__sse4753344" /><param name="allowfullscreen" value="true" /><embed id="__sse4753344" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=zarz-100714101037-phpapp02&amp;stripped_title=zarzdzanie-projektami" name="__sse4753344" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Na początku najważniejsze jest, aby dobrze zrozumieć, czym jest projekt. Każda z metodyk podaje swoją definicję projektu, ale uogólniając można powiedzieć, że jest to jednorazowy, zaplanowany ciąg zadań podjętych w celu wytworzenia unikalnego produktu lub usługi. Koniecznie należy przy tym pamiętać, że każdy projekt ma dokładnie określony początek i koniec oraz dysponuje ograniczonymi zasobami. Jest to ważne, gdyż umożliwia oraz wpływa na sposób planowania projektu.</p>
<p>Realizację każdego projektu podzielić można na <strong>4 główne fazy</strong> &#8211; inicjacji (definiowania projektu), planowania, realizacji oraz zamknięcia projektu.  Częstym błędem jest przekonanie, że faza planowania jest pierwszym etapem realizacji projektu. Nie jest to prawda &#8211; na samym początku, zanim jeszcze projekt zostanie dokładnie zaplanowany, następuje faza inicjacji projektu, w ramach której podejmowana jest decyzja, czy projekt będzie realizowany. Aby jednak możliwe było podjęcie takiej decyzji, konieczne jest zastanowienie się, jakie cele chcemy osiągnąć realizując dany projekt, zgrubne określenie zasobów i budżetu, podanie najważniejszych produktów projektu i na tej podstawie ustalenie, czy realizacja projektu jest uzasadniona z puntu widzenia biznesowego.</p>
<p>W momencie, gdy projekt jest zatwierdzony do realizacji, następuje przejście do fazy <strong>planowania</strong>. W fazie tej &#8211; nie zagłębiając się w szczegóły &#8211; następuje doprecyzowanie zakresu projektu oraz jego dokładne zaplanowanie. Planowanie to jednak nie tylko utworzenie harmonogramu, ale także określenie planu jakości, planu komunikacji, planu zarządzania ryzykiem, itd. W tej prezentacji skupimy się na tworzeniu struktury podziału pracy oraz harmonogramu.</p>
<p>Pierwszym krokiem, który trzeba wykonać przed utworzeniem harmonogramu, jest ustalenie listy zadań, które będą realizowane w projekcie i zapisanie jej w postaci struktury podziału pracy (<em>WBS &#8211; Work Breakdown Structure</em>). Ustalenie wszystkich zadań nie zawsze jest jednak proste &#8211; często stosowaną praktyką jest skorzystanie z tzw. mapy myśli, która pozwala w zorganizowany sposób stworzyć hierarchię zadań do wykonania.</p>
<p>Mając gotową strukturę podziału pracy można przystąpić do kolejnego kroku, tj. stworzenia sieci <em>PERT</em>. Wśród wyznaczonych zadań wiele może być realizowane w dowolnej kolejności, jednak wiele zadań w projekcie jest w określony sposób powiązanych i uzależnionych od siebie (np. raczej nie jest możliwe wykonanie testów systemowych przed zakończeniem kodowania). Sieć PERT pozwala właśnie zamodelować zależności pomiędzy zadaniami &#8211; generalnie dostępne są 4 rodzaje zależności, z których jednak najpopularniejszą jest zależność typu &#8220;koniec-start&#8221;, w której początek realizacji określonego zadania uzależniony jest od zakończenia realizacji innego zadania. Warto pamiętać, że przy tworzeniu sieci PERT należy brać pod uwagę wszystkie możliwe zależności &#8211; te obiektywne  (wynikające np. z przyjętego procesu wytwórczego czy ograniczeń prawnych), jak i subiektywne, wynikające często z wewnętrznych ustaleń lub ograniczeń.</p>
<p>Z siecią PERT związane jest bardzo ważne pojęcie dotyczące zarządzania projektami, tj. ścieżka krytyczna. Ścieżka krytyczna jest to sekwencja zadań o najdłuższym czasie trwania (najdłuższa ścieżka w projekcie), na której występuje zerowy zapas czasu. Każde opóźnienie w realizacji zadań występujących na ścieżce krytycznej powoduje opóźnienie w realizacji całego projektu. Ścieżka krytyczna zależy (i wynika) z ustalonych powiązań między zadaniami oraz zdefiniowanych czasów trwania poszczególnych zadań.</p>
<p>Mając stworzoną sieć PERT można przystąpić do tworzenia harmonogramu. Harmonogram jest to &#8211; w uproszczeniu &#8211; sieć PERT nałożona na zdefiniowany kalendarz i uwzględniająca dostępność w czasie zasobów niezbędnych do realizacji poszczególnych zadań. Harmonogram projektu zwykle prezentowany jest w formie tzw. wykresu  Gantt&#8217;a.</p>
<p>Ostatnim tematem poruszonym w prezentacji jest krótkie wprowadzenie do metody wartości uzyskanej (ang. Earned Value Management), służącej do kontroli harmonogramu i budżetu w trakcie realizacji projektu (kontroli stanu bieżącego z założonym planem). Metoda ta, bazując na 3 głównych parametrach &#8211; PV (Planned Value &#8211; wydatki planowane do poniesienia na danym etapie realizacji zadania), AC (Actual Cost – wydatki rzeczywiście poniesione) i EV (Earned Value – wartość wykonanej pracy wyrażona zaplanowanym budżetem) pozwala określić, czy projekt (zadanie) realizowane jest w ramach założonego harmonogramu (współczynnik SPI) i budżetu (współczynnik CPI).</p>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/xwvoelkAVZg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/07/zarzadzanie-projektami/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/07/zarzadzanie-projektami/</feedburner:origLink></item>
		<item>
		<title>GIT-owy piątek z XSolve</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/EsukktwvgIs/</link>
		<comments>http://xlab.pl/2010/07/git-owy-piatek-z-xsolve/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 15:04:41 +0000</pubDate>
		<dc:creator>Konrad Malawski</dc:creator>
				<category><![CDATA[Lorem Ipsum]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[scm]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[vcs]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1499</guid>
		<description><![CDATA[Od zeszłego tygodnia mam niewątpliwą przyjemność uczestniczenia w praktykach organizowanych przez XSolve. W tym czasie zastanawiałem się troszkę nad systemami kontroli wersji &#8211; a konkretniej porównaniem (lubianego i używanego przeze mnie) Gita z SVNem. Są to narzędzia na pierwszy rzut oka podobne &#8211; &#8220;jakieś SCMy&#8221;, jednak różnice w podejściach obu projektów do problemu są naprawdę [...]]]></description>
			<content:encoded><![CDATA[<p>Od zeszłego tygodnia mam niewątpliwą przyjemność uczestniczenia w praktykach organizowanych przez XSolve. W tym czasie zastanawiałem się troszkę nad systemami kontroli wersji &#8211; a konkretniej porównaniem (lubianego i używanego przeze mnie) Gita z SVNem. Są to narzędzia na pierwszy rzut oka podobne &#8211; &#8220;jakieś SCMy&#8221;, jednak różnice w podejściach obu projektów do problemu są naprawdę ogromne.<br />
<span id="more-1499"></span></p>
<p style="text-align:center"><object id="__sse4721725" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=git4xsolve-100709124340-phpapp01&#038;stripped_title=dlaczego-git-to-nie-svn" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4721725" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=git4xsolve-100709124340-phpapp01&#038;stripped_title=dlaczego-git-to-nie-svn" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></p>
<p>W ramach &#8220;Piątków z XSolve&#8221; miałem zaszczyt i przyjemność pokazać reszcie zespołu czym ten GIT jest, i dlaczego warto się nim zainteresować. Podczas prezentacji osoby bardziej obeznane w SCMach &#8211; w tym poza SVN oraz Gitem również Mercurialem &#8211; wtrącały swoje trzy grosze co zawsze jest mile widziane i bardzo pomogło ogólnej wartości prezentacji. Mam nadzieję że ta króciutka prezentacja zachęci niektórych z obecnych &#8211; lub Was, czytających bloga &#8211; do rzucenia okiem na dokumentację lub liczne poradniki dotyczące Gita &#8211; poniżej kilka dobrych linków od których można by zacząć:</p>
<ul>
<li><a href="http://www.youtube.com/watch?v=4XpnKHJAok8">http://www.youtube.com/watch?v=4XpnKHJAok8</a> Wystąpienie Linusa Torvaldsa dotyczące Git</li>
<li><a href="http://whygitisbetterthanx.com">http://whygitisbetterthanx.com</a> &#8211; przechwalająca Git&#8217;a stronka, zestawiająca go z innymi SCM</li>
<li><a href="http://git.or.cz/course/svn.html">http://git.or.cz/course/svn.html</a> &#8211; porównanie side-by-side z SVN</li>
<li><a href="http://git-scm.com">http://git-scm.com</a> &#8211; Strona domowa projektu</li>
</ul>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/EsukktwvgIs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/07/git-owy-piatek-z-xsolve/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/07/git-owy-piatek-z-xsolve/</feedburner:origLink></item>
		<item>
		<title>Wywoływanie procedur składowanych MSSQL z poziomu PHP</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/R_SJZd4O-TY/</link>
		<comments>http://xlab.pl/2010/07/wywolywanie-procedur-skladowanych-mssql-z-poziomu-php/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 07:48:17 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[pdo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sql server]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1492</guid>
		<description><![CDATA[Pracując z bazą MS SQL Server z poziomu aplikacji PHP prędzej czy później zajdzie potrzeba używacia procedur składowanych. Aby wywołać taką procedurę z poziomu PHP, należy posłużyć się biblioteką PDO, tak jak pokazano to poniżej:
    $conn = new PDO('dblib:host=127.0.0.1;dbname=database', 'user', 'pass');
    $stmt = $conn-&#62;prepare("EXEC sp_SaveMagicNumber ?");
    [...]]]></description>
			<content:encoded><![CDATA[<p>Pracując z bazą MS SQL Server z poziomu aplikacji PHP prędzej czy później zajdzie potrzeba używacia procedur składowanych. Aby wywołać taką procedurę z poziomu PHP, należy posłużyć się biblioteką PDO, tak jak pokazano to poniżej:<span id="more-1492"></span></p>
<pre class="php" name="code">    $conn = new PDO('dblib:host=127.0.0.1;dbname=database', 'user', 'pass');
    $stmt = $conn-&gt;prepare("EXEC sp_SaveMagicNumber ?");
    $stmt-&gt;bindValue(1, 5, PDO::PARAM_INT);
    $stmt-&gt;execute();</pre>
<p>Kod z powyższego listingu wywoła procedurę sp_SaveMagicNumber z parameterem 5. Jeśli używamy symfony wraz z Doctrine, możemy (a nawet powinniśmy) zamienić pierwszą linijkę na:</p>
<pre class="php" name="code">    $conn = Doctrine_Manager::getInstance()-&gt;getConnection();</pre>
<p>Można też przekazywać parametry jako &#8220;placeholdery&#8221;, jak na listingu poniżej:</p>
<pre class="php" name="code">    $conn = Doctrine_Manager::getInstance()-&gt;getConnection();
    $stmt = $conn-&gt;prepare("EXEC sp_IntroduceYourself :name, :surname");
    $stmt-&gt;bindValue(':surname', 'Sznapka', PDO::PARAM_STR);
    $stmt-&gt;bindValue(':name', 'Wojtek', PDO::PARAM_STR);
    $stmt-&gt;execute();</pre>
<p>Ostatnim punktem programu są parametry typu OUTPUT, czyli zwracające wartości z procedury składowanej (podobnie jak parametry funkcji PHP przekazywanych przez referencję). Niestety biblioteka PDO posiada błąd, który uniemożliwia poprawne działanie metod z takimi parametrami. W idealnym przypadku, jeśli parametr w MSSQL jest zdefiniowany jako OUTPUT powinniśmy go dostać następujący sposób:</p>
<pre class="php" name="code">    $conn = Doctrine_Manager::getInstance()-&gt;getConnection();
    $stmt = $conn-&gt;prepare("EXEC sp_GetCountry :city, :country OUTPUT");
    $stmt-&gt;bindValue(':city', 'Gliwice', PDO::PARAM_STR);
    $country = NULL;
    $stmt-&gt;bindParam(':country', $country, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT);
    $stmt-&gt;execute();
    printf("Dla miasta %s procedura zwraca kraj %s", $city, country);</pre>
<p>Niestety pomimo wielu prób, nie udało się obejść tego błędu i na chwilę obecną wygląda na to, że nie ma sposobu na pozyskiwanie parametrów typu OUTPUT z procedur składowanych MSSQL. Podobne problemy można spotkać na bugtrackerze PHP: http://bugs.php.net/bug.php?id=50555</p>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/R_SJZd4O-TY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/07/wywolywanie-procedur-skladowanych-mssql-z-poziomu-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/07/wywolywanie-procedur-skladowanych-mssql-z-poziomu-php/</feedburner:origLink></item>
		<item>
		<title>Round Robin Database Tool. Wprowadzenie</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/GAd9_rHTwxw/</link>
		<comments>http://xlab.pl/2010/07/round-robin-database-tool-wprowadzenie/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 14:29:32 +0000</pubDate>
		<dc:creator>Paweł Sołtysek</dc:creator>
				<category><![CDATA[Lorem Ipsum]]></category>
		<category><![CDATA[RRDtool]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1134</guid>
		<description><![CDATA[Charakter niektórych danych wymaga, aby były one gromadzone w pewnych ustalonych odstępach czasu. Załóżmy, zupełnie teoretycznie i z pominięciem poprawności realizacji, że bierzemy udział w projekcie mającym na celu monitorowanie temperatury ustalonych punktów na Ziemi. Przyjmijmy, że w owych punktach zainstalowana została aparatura pomiarowa, która co godzinę dokonuje pomiaru, a następnie przesyła zmierzoną wartość do komputera [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Charakter niektórych danych wymaga, aby były one gromadzone w pewnych ustalonych odstępach czasu. Załóżmy, zupełnie teoretycznie i z pominięciem poprawności realizacji, że bierzemy udział w projekcie mającym na celu monitorowanie temperatury ustalonych punktów na Ziemi. Przyjmijmy, że w owych punktach zainstalowana została aparatura pomiarowa, która co godzinę dokonuje pomiaru, a następnie przesyła zmierzoną wartość do komputera odpowiadającego danemu punktowi. W tym miejscu zaczyna się nasze zadanie&nbsp;&mdash;&nbsp;gromadzenie otrzymanych danych. <a href="http://oss.oetiker.ch/rrdtool/" target="_blank">Round Robin Database Tool</a> (RRDtool), to narzędzie które nadaje się do tego wprost idealnie.</p>
<p style="text-align: justify;">RRDtool to oprogramowanie open source służące do przechowywania danych, które pojawiają się stale co pewien okres czasu. Dane gromadzone są w bazach o rozszerzeniu rrd, które wyróżnia wysoka regularność zapisu, cykliczność oraz stały rozmiar. Oprócz funkcjonalności charakterystycznych dla bazy danych, RRDtool oferuje inne mechanizmy. Jako przykład może tutaj posłużyć mechanizm prezentacji graficznej, który pozwala przedstawiać gromadzone dane w postaci konfigurowalnych wykresów. Licznie biblioteki (m. in. dla PHP, Ruby, Perl) umożliwiają używanie RRDtool bezpośrednio z poziomu języka.</p>
<p style="text-align: justify;">Rozpocznijmy od utworzenia nowej bazy, przy czym dla uproszczenia i bez większych strat na ogólności ograniczymy się do jednego punktu pomiarowego. Tworząc bazę (RRDtool udostępnia do tego polecenie <a href="http://oss.oetiker.ch/rrdtool/doc/rrdcreate.en.html" target="_blank">create</a>) musimy określić, poprzez jawne podanie wartości lub decydując się na wartość domyślą (dostępną tylko w niektórych przypadkach), zestaw parametrów które ściśle określą jej strukturę i zachowanie.  Przykładowo parametr kroku (en. step) oznacza wartość interwału, z jakim będą analizowane dane.  Każda baza wymaga zdefiniowana co najmniej jednego źródła danych DS (en. data source), czyli wielkości, której pomiary będziemy chcieli przechowywać. Każde źródło danych posiada nazwę, typ, dopuszczalne wartości ekstremalne oraz wartość pulsu (en. heartbeat), która oznacza maksymalną ilość sekund pomiędzy zapisem dwóch danych. W sytuacji, gdy RRDtool nie otrzyma nowych danych przez okres dłuższy niż wynosi wartość pulsu, automatycznie użyta zostanie wbudowana wartość <em>UNKNOWN (U)</em>. RRDtool udostępnia cztery podstawowe typy źródeł danych: GAUGE, COUNTER, DERIVE oraz ABSOLUTE. Źródła typu GAUGE przechowują wartości w postaci, w jakiej zostały one dostarczone do RRDtool, dlatego nadają się do przechowywania np. wartości temperatury. Źródła typów COUNTER, DERIVE oraz ABSOLUTE przechowują wartość przyrostu mierzoną na jednostkę czasu (kroku). Na podstawie wartości kroku i zgodnie ze zdefiniowanymi źródłami danych RRDtool konstruuje układ punktów głównych PDP (en. primary data point) &mdash; uporządkowanych par, których pierwszym elementem jest znormalizowany znacznik czasu, a drugim &mdash; zestaw wartości wszystkich źródeł danych odpowiadających temu znacznikowi. Dane trafiające do pliku rrd w pierwszej kolejności zapisywane są w układzie punktów głównych, a&nbsp;następnie, po przetworzeniu przez funkcję konsolidującą CF (en. consolidation function), tworzą punkt skonsolidowany CDP (en. consolidated data point). Punkty skonsolidowane przechowywane są w Round Robin Archive (RRA) &mdash; specjalnych archiwach, których zdefiniowanie (co najmniej jednego) jest wymagane podczas tworzenia bazy. Na podstawie definicji RRA obliczana jest długość cyklu. Długość cyklu w tym przypadku należy rozumieć jako ilość punktów CDP, które mogą znaleźć się w danym archiwum (kosztem zapisu n+1 punktu CDP, gdzie n oznacza długość cyklu, następuje utrata najstarszego). Dzięki takiemu rozwiązaniu RRDtool posiada jednoznacznie wyznaczone informacje dotyczące ilości punków PDP, które musi przechowywać. Skutkuje to stałym, obliczanym podczas kreacji rozmiarem baz RRD.</p>
<p style="text-align: justify;">Pełna definicja przykładowej bazy RRD odpowiadającej naszym wymaganiom mogłaby wyglądać następująco:</p>
<div style="background-color: black; color: white; padding: 10px; margin-bottom: 10px;">
<pre>rrdtool create somewhereOnEarth.rrd --start 1277675999 --step 3600 /
DS:temperature:GAUGE:3600:U:U /
RRA:MIN:0.5:24:365 /
RRA:MAX:0.5:24:365 /
RRA:AVERAGE:0.5:24:365 /
RRA:MIN:0.5:720:12 /
RRA:MAX:0.5:720:12 /
RRA:AVERAGE:0.5:720:12 /
RRA:MIN:0.5:8760:1 /
RRA:MAX:0.5:8760:1 /
RRA:AVERAGE:0.5:8760:1</pre>
</div>
<p style="text-align: justify;">Powyższe polecenie utworzy nową bazę danych o nazwie somewhereOnEarth, z jednym źródłem danych typu GAUGE oraz dziewięcioma archiwami RRA przechowującymi odpowiednio minimalne, maksymalne i średnie temperatury dzienne, minimalne, maksymalne i średnie temperatury miesięczne oraz minimalną, maksymalną i średnią temperaturę roczną. Wartości powinny napływać co godzinę, nie wcześniej niż 28.06.2010, 0:00:00 CET (1277676000 to pierwszy znormalizowany znacznik czasu po 1277675999).</p>
<p style="text-align: justify;">Na tym etapie jesteśmy gotowi na gromadzenie danych. Za uaktualnianie bazy o nowe wartości odpowiedzialna jest funkcja <a href="http://oss.oetiker.ch/rrdtool/doc/rrdupdate.en.html" target="_blank">update</a>. Niestety nie dysponujemy odpowiednimi możliwościami, aby dodawać nową wartość temperatury co godzinę. Spróbujemy zasymulować część pomiarów przy użyciu poniższego generatora temperatur:</p>
<div style="background-color: black; color: white; padding: 10px; margin-bottom: 10px;">
<pre>#!/bin/bash
base=( 15.6 17.4 19.3 23.9 26.1 28.5 30.1 31.4 31.1 29.4 26.9 24.4 22.5 21.3
       20.5 19.7 19.1 18.4 17.5 16.9 16.7 17 17.3 18.9 14.4 15 16.2 17.1 18.8
       18.9 19.1 19.4 19.3 19.1 18.6 18.4 17.4 16.4 16.1 15.4 14.3 14.1 13.3
       11.9 11.3 10.3 10.1 9.9 20.1 22.3 23.3 24.2 27 28.8 30.6 31.1 31.9 31.4
       31.1 30.2 28.9 24.3 20.2 19.5 17.3 15.1 12.9 12.1 13.2 13.6 14.2 14.9 )

fluctuations=( 3.4 5.5 1.3 -3.6 4.2 0.3 2.5 -2.2 -4.1 2.1 )

rrd='somewhereOneEarth.rrd'
timestamp=1277676000

for((i=0;i&lt;=90;i++))
do

 let fluctuationIndex=$RANDOM%10
 let baseIndex=$RANDOM%3

 for((j=0;j&lt;=23;j++))
  do

   let k=$j+$(($baseIndex*24))
   rrdtool update $rrd $timestamp:`echo ${base[$k]}+${fluctuations[$fluctuationIndex]} |bc`
   let timestamp=$timestamp+3600

  done
done</pre>
</div>
<p style="text-align: justify;">Skrypt powinien uzupełnić naszą bazę o dane z okresu dziewięćdziesięciu dni. Do odpytywania bazy służy funkcja <a href="http://oss.oetiker.ch/rrdtool/doc/rrdfetch.en.html" target="_blank">fetch</a>.  Funkcja fetch używana jest przez mechanizm prezentacji graficznej wywoływany poleceniem <a href="http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html" target="_blank">graph</a>. Szeroki zbiór parametrów konfiguracyjnych  w większości przypadków umożliwia dostosowywanie  wykresów do własnych potrzeb. Przykaładowe polecenie</p>
<div style="background-color: black; color: white; padding: 10px; margin-bottom: 10px;">
<pre>rrdtool graph sampleGraph.png -s 1277676000 -e 1293832800 /
-w 500 -h 200 -G mono -E -v "Temperature [Celsius]" /
DEF:maxtemp=somwhereOnEarth.rrd:temperature:MAX /
DEF:mintemp=somwhereOnEarth.rrd:temperature:MIN /
AREA:maxtemp#bbff00:"Maximum temperature\n" /
AREA:mintemp#0066ee:"Minimum temperature"</pre>
</div>
<p style="text-align: justify;">powinno wygenerować wykres zbliżony do następującego (z każdym uruchomieniem skrypt najprawdopodobniej wygeneruje inny zestaw danych, stąd prawdopodobne są różnice w wartościach na wykresie):</p>
<p><a href="http://xlab.pl/wp-content/uploads/2010/06/sampleGraph.png"><img class="aligncenter size-full wp-image-1436" title="sampleGraph RRDtool" src="http://xlab.pl/wp-content/uploads/2010/06/sampleGraph.png" alt="" width="597" height="276" /></a></p>
<p style="text-align: justify;">RRDtool to z pewnością ciekawe narzędzie, które może okazać się bardzo pomocne w wielu sytuacjach. Należy jednak pamiętać, że powstało, aby radzić sobie z pewną klasą problemów i zastosowanie w niektórych przypadkach będzie niemożliwe lub bardzo trudne. Jednocześnie zachęcam do własnych eksperymentów oraz zapoznania się z <a href="http://oss.oetiker.ch/rrdtool/doc/index.en.html" target="_blank">dokumentacją</a> oraz <a href="http://oss.oetiker.ch/rrdtool/tut/index.en.html" target="_blank">tutorialami</a> na stronie projektu.</p>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/GAd9_rHTwxw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/07/round-robin-database-tool-wprowadzenie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/07/round-robin-database-tool-wprowadzenie/</feedburner:origLink></item>
		<item>
		<title>Fast development with Spring, Roo &amp; GWT</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/w1ieFINGZvE/</link>
		<comments>http://xlab.pl/2010/06/fast-development-with-spring-roo-gwt/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 12:02:09 +0000</pubDate>
		<dc:creator>Łukasz Zagórski</dc:creator>
				<category><![CDATA[Programowanie Java]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Roo]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1215</guid>
		<description><![CDATA[Na tapecie narzędzie Spring Roo pozwalające generować kod dla projektów tworzonych z wykorzystaniem framework&#8217;a Spring. Wspomniany program zyskał ostatnio wsparcie dla technologii GWT, czego efektem jest poniższy tutorial. Zaprezentowane zostanie w jaki sposób bardzo niskim kosztem stworzyć z jego pomocą prostą aplikację. Zagadnienie podzieliłem na kilka postów. Temat pierwszego obejmuje podstawowe zagadnienia i zbliżony jest do tego [...]]]></description>
			<content:encoded><![CDATA[<div>Na tapecie narzędzie <strong>Spring Roo </strong>pozwalające generować kod dla projektów tworzonych z wykorzystaniem framework&#8217;a Spring. Wspomniany program zyskał ostatnio wsparcie dla technologii <strong>GWT, </strong>czego efektem jest poniższy tutorial. Zaprezentowane zostanie w jaki sposób bardzo niskim kosztem stworzyć z jego pomocą prostą aplikację. Zagadnienie podzieliłem na kilka postów. Temat pierwszego obejmuje podstawowe zagadnienia i zbliżony jest do tego co zaprezentował Ben Alex (ojciec Roo) na ostatnim Google IO, tu temat zostanie przedstawiony w sposób bardziej kompletny po to aby osoby z wiedzą==0 we wspomnianych technologiach mogły z powodzeniem zacząć. Celem tutoriala jest implementacja kompletnej aplikacji przy okazji zbytnio się nie męcząc. Dodatkowo w kolejnych częściach postaram się dodać analizę generowanego przez Roo kodu.</div>
<p><br/></p>
<div><strong>1.</strong> Najprostszym sposobem na rozpoczęcie pracy jest ściągnięcie i zainstalowanie<strong> STS </strong>(SpringSource Tool Suite) spod adresu: <a href="http://www.springsource.com/products/springsource-tool-suite-download">http://www.springsource.com/products/springsource-tool-suite-download</a> .</div>
<div>Jest to zintegrowane środowisko programistyczne, które de-facto jest podrasowanym Eclipse&#8217;m springowymi pluginami. Zainstalowanie go ułatwi start w projekcie ponieważ domyślnie zawiera większą część potrzebnych rozszerzeń. W dystrybucji zainstalowany jest plugin ułatwiający pracę z Roo o nazwie &#8220;Roo shell&#8221;, trzeba włączyć jego widok lub wywołać za pomocą skrótu Ctrl + r. We wspomnianej konsoli należy do bólu stosować polecenie &#8220;hint&#8221; i skrót Ctrl + Space.</div>
<p><br/></p>
<div><strong>2.</strong> Następnie instalujemy dowolną bazę danych (w przykładzie wykorzystano MYSQL) i utworzyć w niej bazę &#8220;informations&#8221;.</div>
<p><br/></p>
<div><strong>3.</strong> Kolejno można już uruchomić środowisko programistyczne i ściągnąć potrzebne rozszerzenia. Na początku wystarczy Google Plugin for Eclipse.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_211fzr88gfn_b.jpg"><img class="alignnone size-full wp-image-1216" title="dcq2pcgs_211fzr88gfn_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_211fzr88gfn_b.jpg" alt="" width="870" height="265" /></a></div>
<div><strong><br/><br />
4.</strong> Następnie należy przystąpić do utworzenia projektu Roo. Najprościej za pomocą menu &#8220;File&#8221; (jak przedstawiono poniżej).</div>
<p><br/><br />
<a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_199cjc2hqfc_b-1.jpg"><img src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_199cjc2hqfc_b-1.jpg" alt="" title="dcq2pcgs_199cjc2hqfc_b (1)" width="977" height="627" class="alignleft size-full wp-image-1276" /></a></p>
<div>Należy wpisać nazwę projektu i określić główną paczkę.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_200gmhrgd8t_b.jpg"><img class="alignnone size-full wp-image-1217" title="dcq2pcgs_200gmhrgd8t_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_200gmhrgd8t_b.jpg" alt="" width="540" height="694" /></a></div>
<div><br/>Po wypełnieniu formularza &#8220;klikniąć&#8221; Next, Finish i można obserwować poruszenie u dołu ekranu w konsoli Roo.</div>
<div><strong><br/><br />
5.</strong> Po założeniu projektu trzeba skonfigurować warstwę utrwalania.</div>
<div>Aby to zrobić wykorzystany zostanie wspomniany Roo Shell, a aby to osiągnąć wystarczy wpisać polecenie jak poniżej.</div>
<div>Po jego wykonaniu skonfigurowana zostanie warstwa utrwalania dla bazy MYSQL z implementacją Hibernate do bazy o nazwie &#8220;informations&#8221;.</div>
<div>Dodatkowe opcje konfiguracji (takie jak użytkownik i hasło do bazy) można ustawić w pliku <strong>database.properties</strong>.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_201fnwpqz2b_b.jpg"><img class="alignleft size-full wp-image-1219" title="dcq2pcgs_201fnwpqz2b_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_201fnwpqz2b_b.jpg" alt="" width="885" height="329" /></a></div>
<p><br/></p>
<div><strong>6.</strong> Kolejno tworzymy pierwszą encję za pomocą komendy jak poniżej.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_203fp6f9zfm_b.jpg"><img class="alignleft size-full wp-image-1220" title="dcq2pcgs_203fp6f9zfm_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_203fp6f9zfm_b.jpg" alt="" width="875" height="322" /></a></div>
<p><br/></p>
<div><strong>7.</strong> Mając stworzona encję dodajemy do niej pola.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_204zvjz9kcr_b.jpg"><img class="alignleft size-full wp-image-1221" title="dcq2pcgs_204zvjz9kcr_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_204zvjz9kcr_b.jpg" alt="" width="865" height="325" /></a></div>
<p><br/></p>
<div><strong>8.</strong> Po dodaniu odpowiednich pól do encji można &#8220;podpiąć&#8221; GWT poprzez wpisanie w konsoli Roo &#8220;gwt setup&#8221;.</div>
<div>Komenda ta spowoduje wygenerowanie kodu warstwy prezentacji.</div>
<p><br/></p>
<div><strong>9.</strong> Następnie należy skonfigurować GWT &#8220;klikając&#8221; prawym przyciskiem na projekcie i wybierając opcję jak poniżej.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_205drr832gm_b.jpg"><img class="alignleft size-full wp-image-1222" title="dcq2pcgs_205drr832gm_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_205drr832gm_b.jpg" alt="" width="620" height="772" /></a></div>
<p><br/></p>
<div>Należy upewnić się, że wybrane jest SDK GWT 2.1.0.M1 .</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_207ccncgngh_b.jpg"><img class="alignleft size-full wp-image-1223" title="dcq2pcgs_207ccncgngh_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_207ccncgngh_b.jpg" alt="" width="638" height="628" /></a></div>
<p><br/></p>
<div><strong>10.</strong> Popełniwszy powyższe punkty należy włączyć Maven Dependency Management,</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_209dmf4hrt8_b.jpg"><img class="alignleft size-full wp-image-1224" title="dcq2pcgs_209dmf4hrt8_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_209dmf4hrt8_b.jpg" alt="" width="571" height="722" /></a></div>
<p><br/></p>
<div>&#8220;odświeżyć&#8221; projekt, uruchomić,</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_208dpn99kdw_b.jpg"><img class="alignleft size-full wp-image-1225" title="dcq2pcgs_208dpn99kdw_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_208dpn99kdw_b.jpg" alt="" width="573" height="745" /></a></div>
<p><br/></p>
<div>wybrać katalog z buildem,</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_210gq7nh7cs_b.jpg"><img class="alignleft size-full wp-image-1226" title="dcq2pcgs_210gq7nh7cs_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_210gq7nh7cs_b.jpg" alt="" width="475" height="659" /></a></div>
<p><br/></p>
<div>i VOILA! .</div>
<p><br/></p>
<div>W rezultacie otrzymujemy aplikację (screen wygenerowanej warstwy prezentacji poniżej) która umożliwia dodawanie rekordów do bazy, przeglądanie ich na stronicowanej liście, edycję i usuwanie.</div>
<p><br/></p>
<div>Proces tworzenia zajmuje około 5 min (mając już skonfigurowane środowisko).</div>
<div>Dodatkowo w pliku logu zapisywane są wszystkie wykonywane w konsoli Roo instrukcje co pozwala odtworzyć cały proces .</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_212fmwzrvfm_b.jpg"><img class="alignleft size-full wp-image-1227" title="dcq2pcgs_212fmwzrvfm_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_212fmwzrvfm_b.jpg" alt="" width="869" height="895" /></a></div>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/w1ieFINGZvE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/06/fast-development-with-spring-roo-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/06/fast-development-with-spring-roo-gwt/</feedburner:origLink></item>
		<item>
		<title>MongoDB – baza danych zorientowana dokumentowo. Czy ruch NoSQL ma sens?</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/WQuc_seDu4E/</link>
		<comments>http://xlab.pl/2010/05/mongodb-baza-danych-zorientowana-dokumentowo-czy-ruch-nosql-ma-sens/#comments</comments>
		<pubDate>Sat, 29 May 2010 10:53:55 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[piątek z xsolve]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1179</guid>
		<description><![CDATA[Wczoraj miałem przyjemność poprowadzić &#8220;Piątek z XSolve&#8221; prezentując temat &#8220;MongoDB &#8211; baza danych zorientowana dokumentowo. Czy ruch NoSQL ma sens?&#8221;. MongoDB jest bazą nowej generacji, która jest zorientowana na przechowywanie dokumentów JSON, o dowolnej strukturze. Nie mamy w tym przypadku problemów z schamatami bazy, czy migracjami na nowsze wersje jej struktur. MongoDB, jak i inne [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj miałem przyjemność poprowadzić &#8220;Piątek z XSolve&#8221; prezentując temat &#8220;MongoDB &#8211; baza danych zorientowana dokumentowo. Czy ruch NoSQL ma sens?&#8221;. MongoDB jest bazą nowej generacji, która jest zorientowana na przechowywanie dokumentów JSON, o dowolnej strukturze. Nie mamy w tym przypadku problemów z schamatami bazy, czy migracjami na nowsze wersje jej struktur. MongoDB, jak i inne rozwiązania nurtu NoSQL, jest stworzona z myślą o pracy w dużych obciążeniach oraz posiada wbudowane mechanizmy skalowania i replikacji. Baza ta posiada bardzo przyjemne API dostępu do danych, które jest podobne do niektórych bibliotek ORM.<br />
Podczas prezentacji i dyskusji jaka się rozwinęła, staraliśmy się odpowiedzieć na pytanie &#8220;Czy ruch NoSQL ma sens?&#8221;. Odpowiedź, zarówno moja, jak i kolegów była jednoznaczna: tak, ale tylko gdy NoSQL, będziemy rozwijać jak Not only SQL. Bazy nierelacyjne mogą być doskonałym uzupełnieniem dla baz SQL, ale raczej mało prawdopodobne, żeby w całości zastąpiły bazy relacyjne w złożonych aplikacjach i systemach.<br />
Zapraszam do obejrzenia slajdów z prezentacji (podczas prelekcji był jeszcze pokaz &#8220;na żywo&#8221; możliwości bazy, którego w slajdach niestety nie ma).</p>
<div id="__ss_4348786" style="width: 600px;"><object id="__sse4348786" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="600" height="501" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-nosql-xsolve-100529041429-phpapp02&amp;stripped_title=mongodb-baza-danych-zorientowana-dokumentowo-czy-ruch-nosql-ma-sens" /><param name="name" value="__sse4348786" /><param name="allowfullscreen" value="true" /><embed id="__sse4348786" type="application/x-shockwave-flash" width="600" height="501" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-nosql-xsolve-100529041429-phpapp02&amp;stripped_title=mongodb-baza-danych-zorientowana-dokumentowo-czy-ruch-nosql-ma-sens" name="__sse4348786" allowscriptaccess="always" allowfullscreen="true"></embed></object>
</div>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/WQuc_seDu4E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/05/mongodb-baza-danych-zorientowana-dokumentowo-czy-ruch-nosql-ma-sens/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/05/mongodb-baza-danych-zorientowana-dokumentowo-czy-ruch-nosql-ma-sens/</feedburner:origLink></item>
		<item>
		<title>Symfony sfWidgetFormSelect z nieaktywnymi opcjami</title>
		<link>http://feedproxy.google.com/~r/xlab/IYMP/~3/ZBFx3qD8NgQ/</link>
		<comments>http://xlab.pl/2010/05/symfony-sfwidgetformselect-z-nieaktywnymi-opcjami/#comments</comments>
		<pubDate>Tue, 25 May 2010 08:06:33 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sfWidgetFormSelect]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1157</guid>
		<description><![CDATA[sfWidgetFormSelect nie daje możliwości wyświetlania nieaktywnych opcji. Jest to rzadko wykorzystywana właściwość elementu select, ale czasami może się na prawdę przydać :-) Pomimo to, możemy uzyskać tą funkcjonalność poprzez stworzenie własnego widgetu, który dziedziczy z  sfWidgetFormSelect. Kod klasy znajduję się poniżej. W tym przypadku nieaktywne opcje, to te które mają ujemne value. Można oczywiście [...]]]></description>
			<content:encoded><![CDATA[<p><strong>sfWidgetFormSelect</strong> nie daje możliwości wyświetlania nieaktywnych opcji. Jest to rzadko wykorzystywana właściwość elementu select, ale czasami może się na prawdę przydać :-) Pomimo to, możemy uzyskać tą funkcjonalność poprzez stworzenie własnego widgetu, który dziedziczy z  <strong>sfWidgetFormSelect</strong>. Kod klasy znajduję się poniżej. W tym przypadku nieaktywne opcje, to te które mają ujemne <strong>value</strong>. Można oczywiście ustawiać inne opcje na nieaktywne, wystaczy odpowiednio zmodyfikować metodę <strong>disableCondition</strong>.<span id="more-1157"></span></p>
<pre class="php" name="code">
  class myWidgetFormSelect extends sfWidgetFormSelect
  {
    public function renderContentTag($tag, $content = null, $attributes = array())
    {
      if ($tag == 'option' &amp;&amp; isset($attributes['value'])
        &amp;&amp; $this-&gt;disableCondition($attributes['value'])
      ) {
        $attributes['disabled'] = 'disabled';
      }
      return parent::renderContentTag($tag, $content, $attributes);
    }   

    protected function disableCondition($value)
    {
      return (int)$value &lt; 0;
    }
  }
</pre>
<img src="http://feeds.feedburner.com/~r/xlab/IYMP/~4/ZBFx3qD8NgQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2010/05/symfony-sfwidgetformselect-z-nieaktywnymi-opcjami/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://xlab.pl/2010/05/symfony-sfwidgetformselect-z-nieaktywnymi-opcjami/</feedburner:origLink></item>
	</channel>
</rss>
