<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>WebArchitect.pl Blog</title>
	<atom:link href="http://blog.webarchitect.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.webarchitect.pl</link>
	<description>Michał 'Seth' Gołębiowski devBlog</description>
	<lastBuildDate>Fri, 06 Feb 2009 20:53:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Augment Reality &#8211; Rozszerzona Rzeczwistość</title>
		<link>http://blog.webarchitect.pl/2009/02/06/augment-reality-rozszerzona-rzeczwistosc/</link>
		<comments>http://blog.webarchitect.pl/2009/02/06/augment-reality-rozszerzona-rzeczwistosc/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 20:49:20 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[Ciekawostki]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/?p=21</guid>
		<description><![CDATA[W latach 90&#8242;tych wiele mówiło się o wirtualnej rzeczywistości. Miała to być przyszłość w dziedzinie interakcji z komputerem i świetna zabawa dla fanów gier 3d. Do dzisiaj pamiętam jak po raz pierwszy miałem okazje zobaczyć jak to naprawdę wygląda. Były to gogle Virtual Boy dla Nintendo - i chociaż grafika nie była jak na dzisiejsze [...]]]></description>
			<content:encoded><![CDATA[<p>W latach 90&#8242;tych wiele mówiło się o wirtualnej rzeczywistości. Miała to być przyszłość w dziedzinie interakcji z komputerem i świetna zabawa dla fanów gier 3d.</p>
<p>Do dzisiaj pamiętam jak po raz pierwszy miałem okazje zobaczyć jak to naprawdę wygląda. Były to <a href="http://pl.wikipedia.org/wiki/Virtual_Boy">gogle Virtual Boy dla Nintendo </a>- i chociaż grafika nie była jak na dzisiejsze standardy wysokich lotów, to uczucie było niesamowite. Pomijam milczeniem fakt, że po niespełna 30 minutach używania tego cuda miało się nieodpartą chęć uściskania toalety i zwrócenia wszystkiego co się zjadło <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Czas jednak płynął, hełmy wirtualne nadal były tylko życzeniem pod choinkę, każdego zapalonego gracza.</p>
<p>Obecnie, mimo ogromnej mocy obliczeniowej i zapierającej dech w piersiach grafiki 3d, nadal nie ma co marzyć o pełnym zagłębieniu się w wirtualny świat przy pomocy takich gogli.</p>
<p>Być może nadal problemem jest cena, a co za tym idzie niski popyta na takie akcesoria, a co za tym idzie bardzo mała ilość oprogramowania wspierającego tą technologię, ale na przeciw temu wysuwa się ostatnimi czasy inna, równie ciekawa technologia &#8211; Rozszerzona Rzeczywistość (<a href="http://en.wikipedia.org/wiki/Augmented_reality">Augment Reality</a>).</p>
<p><span id="more-21"></span>AR jest to w skrócie technologia pozwalająca na połączenie świata rzeczywistego z tym wygenerowanym komputerowo.</p>
<p>Powiedzmy, że stoimy w muzeum przed pięknym obrazem autorstwa&#8230; no właśnie kogo? Podpis pod obrazem jest za mały abyśmy mogli go odczytać, a masa ludzi nie ułatwi nam podejścia do niego. W takim przypadku możemy skorzystać z AR. Zakładamy nasze okulary, które dzięki kamerom umieszczonym na nich skanują to co widzimy. Oprogramowanie rozpoznaje obraz i na wyświetlaczu w szkłach naszych okularów, prezentuje nam informacje o obrazie.</p>
<p>Dzięki oprogramowaniu możemy także tworzyć wirtualne obiekty, które wchodzą w interakcje z otoczeniem. System sam tworzy sobie siatkę geometryczną widzianej przez nas przestrzeni i kieruje obiektami tak aby te przy np. zderzeniu ze ścianą zachowały się naturalnie &#8211; jak prawdziwe obiekty.</p>
<p>Gdyby dodać do tego jeszcze rękawice z <a href="http://en.wikipedia.org/wiki/Force_feedback"><span class="mw-redirect">force feedback</span>iem</a>, takie jak chociażby <a href="http://www.immersion.com/3d/products/cyber_grasp.php">oferowane przez firmę Immersion</a> uczucie zanurzenia w wirtualną rzeczywistość było by większe niż w przypadku wirtualnych gogli.</p>
<p>Tyle słowem wstępu, a teraz zapraszam Was do obejrzenia AR w akcji:</p>
<p>Przykład aplikacji na iPhonea:</p>
<p><a href="http://www.youtube.com/watch?v=tpaJBu4BEuA">http://www.youtube.com/watch?v=tpaJBu4BEuA</a></p>
<p>Obiekty 3d w realnym świecie:</p>
<p><a href="http://www.youtube.com/watch?v=yAvR2dJvZCc">http://www.youtube.com/watch?v=yAvR2dJvZCc</a></p>
<p>Przykład tego jak AR może pomóc lekarzom:</p>
<p><a href="http://www.youtube.com/watch?v=vgCDTPqAj2E">http://www.youtube.com/watch?v=vgCDTPqAj2E</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2009/02/06/augment-reality-rozszerzona-rzeczwistosc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prehistoryczne ikonki</title>
		<link>http://blog.webarchitect.pl/2008/04/29/prehistoryczne-ikonki/</link>
		<comments>http://blog.webarchitect.pl/2008/04/29/prehistoryczne-ikonki/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 18:50:46 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[Ciekawostki]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Webdeveloping]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/?p=18</guid>
		<description><![CDATA[Ikonki towarzyszą nam od czasu kiedy na stałe zadomowiły się u nas systemy z graficznym interfejsem użytkownika. Ich zadanie jest proste: w czytelny dla użytkownika sposób przedstawić funkcjonalność/akcję do której jest ona przypisana. Dzięki temu bez potrzeby czytania całego opisu wiemy w co kliknąć. Postęp technologiczny sprawia jednak, że część ikonek zaczyna tracić sens i [...]]]></description>
			<content:encoded><![CDATA[<p>Ikonki towarzyszą nam od czasu kiedy na stałe zadomowiły się u nas systemy z graficznym interfejsem użytkownika. Ich zadanie jest proste: w czytelny dla użytkownika sposób przedstawić funkcjonalność/akcję do której jest ona przypisana.</p>
<p>Dzięki temu bez potrzeby czytania całego opisu wiemy w co kliknąć.</p>
<p>Postęp technologiczny sprawia jednak, że część ikonek zaczyna tracić sens i przestaje być zrozumiała dla młodego odbiorcy.</p>
<p><span id="more-18"></span></p>
<p>Zwróćmy uwagę na poniższą listę ikonek:</p>
<p><img style="vertical-align: middle;" src="http://blog.webarchitect.pl/images/ikonki.gif" alt="Ikonki" width="366" height="139" /></p>
<p>&#8222;Zapisz&#8221; prezentowane jako dyskietka.</p>
<p>&#8222;Filmy&#8221; prezentowane jako klisza filmowa.</p>
<p>&#8222;Szukaj&#8221; prezentowane jako lupa (szkło powiększające).</p>
<p>Wszystkie te znaki graficzne choć zrozumiałe dla starszego pokolenia i ludzi często przesiadających przed komputerem, dla młodszych osób mogą już nie być tak oczywiste.</p>
<p>Kto w dzisiejszych czasach używa dyskietek do przechowywania danych? Współczesne komputery zaczynają być pozbawiane stacji dyskietek, a więc czemu ten piktogram miał by nam się kojarzyć z &#8222;zapisywaniem&#8221;?</p>
<p>Lupa także jest rzeczą, która obecnie rzadko kiedy jest wykorzystywana &#8211; w dobie internetu i książek wydawanych elektronicznie, młode pokolenie rzadko ma z nią styczność.</p>
<p>Przedstawianie filmów jako rolki taśmy filmowej było dobre za czasów VHSów (chociaż i utaj taśma wyglądała nieco inaczej). Ale dzisiaj kiedy nawet w kamerach dane zapisuje się na płytach, dyskach czy pamięciach flash taka wizualna identyfikacja już traci na znaczeniu &#8211; to tak jakbyśmy ikonkę &#8222;Mój komputer&#8221; zaprezentowali jako pancerną szafę w której znajdowały się wczesne komputery.</p>
<p>Sądzę, że projektanci aplikacji/stron powinni już teraz pomyśleć nad tym aby odświeżyć ikonki tak aby ich znaczenie było aktualne i zrozumiałe w dzisiejszych czasach, bez potrzeby sięgania do podręcznika historii <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/04/29/prehistoryczne-ikonki/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Przerost formy nad treścią</title>
		<link>http://blog.webarchitect.pl/2008/04/16/przerost-formy-nad-trescia/</link>
		<comments>http://blog.webarchitect.pl/2008/04/16/przerost-formy-nad-trescia/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 11:33:38 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[(nie)codzienność]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Webdeveloping]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/?p=15</guid>
		<description><![CDATA[Jaki jest najlepszy sposób na doprowadzenie ciekawego i przemyślanego projektu do sytuacji w której staje się on horrorem nie tylko dla jego twórcy ale i dla developerów którzy mają przy nim pracować? Najlepiej zacząć wszystko unifikować. Tworzyć kod ogólnego użytku, tworzyć warstwę-warstwy-warstwy pośredniej, używać wielu klas abstrakcyjnych, przewidywać możliwe sposoby użycia dla wręcz paranoicznych przypadków. [...]]]></description>
			<content:encoded><![CDATA[<p>Jaki jest najlepszy sposób na doprowadzenie ciekawego i przemyślanego projektu do sytuacji w której staje się on horrorem nie tylko dla jego twórcy ale i dla developerów którzy mają przy nim pracować?</p>
<p>Najlepiej zacząć wszystko unifikować. Tworzyć kod ogólnego użytku, tworzyć warstwę-warstwy-warstwy pośredniej, używać wielu klas abstrakcyjnych, przewidywać możliwe sposoby użycia dla wręcz paranoicznych przypadków. Poddać się naszej chęci do stworzenia kodu wręcz doskonałego. Kodu gotowego do zastosowania dla pierwotnej idei ale także do nieco bardziej rozbudowanych funkcji, a może i nawet do funkcjonalności której ten kod nie został z początku pomyślany&#8230; a dlaczego nie miał by on parzyć kawy i wyrzucania śmieci &#8211; w końcu skąd mamy wiedzieć czy docelowo do tego go nie użyjemy?</p>
<p>Jednym słowem najlepiej stworzyć kod, którego sam Bóg by się nie powstydził, a po naszej śmierci (jak to zwykle bywa z tego typu honorami) postawiono by nam pomnik w dowód naszego wkładu w budowanie lepszego świata.</p>
<p><span id="more-15"></span></p>
<p>Ale zacznijmy od początku.</p>
<p>W swojej pracy i poza nią spotkałem się z dwoma głównymi typami programistów, pod opisami którymi, mniej lub bardziej każdy z nas może się podpisać.</p>
<p>Pierwsza grupa to zadaniowcy. Programiści, którzy pracują nad projektem od zadania, do zadania. Rozwiązując na bieżąco problemy, które napotkają. Nie wnikając zbytnio w atomowe części projektu i skupiający się na uzyskaniu założonego celu.</p>
<p>Druga grupa to artyści. Programiści, którzy mają wizję i często dają się jej ponieść. A wtedy już nie trudno o to aby projekt stał się kolejną częścią koszmaru z ulicy wiązów.<br />
Niestety często mogę podpisać się pod tą druga definicją.</p>
<p>Nie tak dawno wraz z kolegą omawialiśmy pewien projekt. Siedząc przy piwku sporządzaliśmy zestaw wymagań tego co ta aplikacja ma posiadać.</p>
<p>Wyszliśmy z podstawowego celu jakim była założona funkcjonalność, ale szybko doszliśmy do wniosku, że może się ona rozszerzyć o kilka innych, których powiązanie może nie do końca współgrać z tym co ustaliliśmy (a przynajmniej tak sobie wmawialiśmy).</p>
<p>Zaczęliśmy więc kombinować i rozbudowywać funkcjonalność kierując się zasadą uniwersalnego rozwiązania, które w przyszłości będzie na tyle elastyczne, że nie będziemy mieli problemów z jakąkolwiek modyfikacją&#8230;</p>
<p>Po ponad 1h doszliśmy wspólnie do jednego wniosku: dzięki naszemu rozwiązaniu pozycja obecnych systemów operacyjnych jest zagrożona. Czemu ? Bo oto wymyśliliśmy rozwiązanie, które z powodzeniem posłuży jako podwaliny pod nasz projekt ale z równym powodzeniem można by go użyć do budowy systemu operacyjnego.</p>
<p>(nawiasem mówiąc przypomina mi się projekt Thot tworzony na php.pl <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</p>
<p>Zapewne przed emeryturą byśmy go skończyli ale jak wiadomo zapał programistów maleje wykładniczo do funkcji czasu. A przecież sam projekt zapowiadał się na prostą aplikację na góra 2 miesiące roboty.</p>
<p>Popłynęliśmy. Mając jednak tą świadomość zeszliśmy na właściwy tor.</p>
<p>Takie podejście w porę niezauważone i pielęgnowane przez developerów jest powodem dla którego nie jeden dobrze zapowiadający się projekt zostaje z czasem pogrzebany w lawinie funkcjonalności.</p>
<p>A rozwiązanie jest bardzo proste: należy skupić się wyłącznie na określonej funkcjonalności. Trzeba precyzyjnie określić ramy działania aplikacji i oczekiwania wobec nich. Myśląc o przyszłości i konieczności rozbudowania aplikacji zawsze warto najpierw zastanowić się czy obecna funkcjonalność jest na tyle hermetyczna, że nic się z nią nie da później zrobić &#8211; przy odpowiednio pisanym kodzie (korzystając z wzorców projektowych) zawsze znajdzie się jakieś pole do zmian i nie trzeba z góry zakładać, że potrzebna jest nam kolejna abstrakcyjna warstwa już na początku etapu pisania kodu.</p>
<p>Projekt trzeba tworzyć w myśl zasady KISS (keep it simple stupid). Budować projekt klocek po klocku. Oczywiście z zachowaniem zasad OOP. Przerost formy nad treścią w końcowym rezultacie może doprowadzić do zakończenia projektu totalna klapą albo sytuacją w której będziemy mieli uniwersalne środowisko (framework) do którego dopiero zaczniemy dopisywać docelową funkcjonalność.</p>
<p>Myślę, że dobrym porównaniem było by stworzenie przez Microsoft Visty zamiast DOSa. W końcu czemu mieli by się ograniczać do zwykłej linii komend skoro mogą zrobić od razu coś wielkiego.</p>
<p>Reasumując: tym postem chciałem tylko zaznaczyć pewien problem który wielu z nas zapewne już przeszło, są w jego trakcie <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  albo dopiero się z nim zmierzy. Z mojego doświadczenia mogę doradzić tylko jedno: lepiej w porę przystopować i starać się zajmować podstawową funkcjonalnością &#8211; nie jest to oznaką braku inwencji, a jedynie rozsądnym podejściem do pisania programów.</p>
<p>Czekam na komentarze i Wasze spostrzeżenia w tym temacie <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/04/16/przerost-formy-nad-trescia/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>moBlog.pl &#8211; mobilne blogowanie</title>
		<link>http://blog.webarchitect.pl/2008/03/24/moblogpl-mobilne-blogowanie/</link>
		<comments>http://blog.webarchitect.pl/2008/03/24/moblogpl-mobilne-blogowanie/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 22:40:16 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[(nie)codzienność]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/2008/03/24/moblogpl-mobilne-blogowanie/</guid>
		<description><![CDATA[Czym jest moBlog.pl? moBlog to serwis społecznościowy skupiony wokół marki Nokia i udostępniający swoim użytkownikom platformę blogową dostępną przez WWW jak i telefon komórkowy&#8230; No dobra&#8230; dosyć tej marketingowej gadki Powody dla których chciał bym Wam nieco przybliżyć ten serwis są dwa: współtworzę ten serwis od czasu powstania nowej wersji (pierwsza wersja powstała ponad 2 [...]]]></description>
			<content:encoded><![CDATA[<p>Czym jest <a href="http://www.moblog.pl" target="_blank">moBlog.pl</a>?</p>
<p>moBlog to serwis społecznościowy skupiony wokół marki Nokia i udostępniający swoim użytkownikom platformę blogową dostępną przez WWW jak i telefon komórkowy&#8230;</p>
<p>No dobra&#8230; dosyć tej marketingowej gadki <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Powody dla których chciał bym Wam nieco przybliżyć ten serwis są dwa: współtworzę ten serwis od czasu powstania nowej wersji (pierwsza wersja powstała ponad 2 lata temu) oraz dlatego, że jest to bardzo ciekawa alternatywa dla innych tego typu stron.</p>
<p><span id="more-16"></span>Głównym kanałem publikacji wpisów na blogach są MMSy. Chociaż ta forma komunikacji jest wykorzystywana w innych serwisach to na moBlogu jest ona dominującą funkcjonalnością &#8211; nie ma możliwości dodania zdjęcia w inny sposób niż po przez MMS lub aplikację LifeBlog z telefonu komórkowego. Mimo dostępnej opcji dodania wpisu tekstowego z poziomu strony WWW, tylko wpisy MMSowe są promowane umieszczeniem na stronie głównej.</p>
<p>I tutaj mała uwaga: z moich obserwacji wynika, że takie podejście sprawia iż pewne grono osób zakładających tzw. &#8222;bLoGaSkI&#8221; już na wstępie jest filtrowana. Powód jest prozaiczny: kasa. Wydanie kilku groszy na MMSa powoduje że prędzej czy później osoba taka rezygnuje.</p>
<p>Pomijając ten fakt warto zaznaczyć, że w dobie komunikacji obrazkowej ludzie chętniej oglądają ładne zdjęcia niż zagłębiają się w dwu stronicowe wywody o tym jaki świat jest okrutny <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>Wracając do funkcjonalności: wysłane MMSy można edytować z poziomu WWW po przez dodawanie/edycję tekstu i tematu, przypisywanie tagów do wpisu, przypisanie do galerii, ustawianie położenia na mapie czy też edycję samego zdjęcia.</p>
<p>Warto zaznaczyć, że użytkownicy już na etapie wysyłania MMSa mają możliwość skorzystania z komend MMSowych umożliwiających im umieszczenie wpisu od razu w wybranej przez nich galerii, przesłania wpisu znajomemu na email czy też ustawienia lokalizacji na mapie.</p>
<p>Nie zapomnieliśmy o prywatności dlatego też galerie mogą mieć status publiczny, tylko dla znajomych lub na hasło.</p>
<p>To co zwiększa atrakcyjność tego serwisu to możliwość prawie nieograniczonej modyfikacji wyglądu. Począwszy od położenia i widoczności boxów, po przez edycję skórki i umieszczania elementów zaciąganych z zewnętrznych serwisów (YouTube, LastFM, Grono).</p>
<p>W porównaniu z innym serwisami edycja skórek nie odbywa się po przez ręczne wklepywanie kodów kolorów czy edycję HTMLa, a po przez wizualny edytor umożliwiający nawet laikowi stworzenie własnego niepowtarzalnego wyglądu (także na bazie udostępnionych przez nas skórek publicznych).</p>
<p>W niedawno udostępnionej aktualizacji wprowadziliśmy także możliwość udostępniania skórek (po wcześniejszej akceptacji moderatorów) innym użytkownikom.</p>
<p>Dodam jeszcze, że przy każdej ze skórek wyświetlany jest jej podgląd w postaci miniaturki, generowanej z naszej autorskiej aplikacji do tworzenia zrzutów stron WWW.</p>
<p>Wspomniana przeze mnie wcześniej geolokalizacja wpisów na mapie wykorzystuje mapy Google. Poza lokalizowaniem na mapie wpisów mamy także możliwość ustawienia własnej lokalizacji. Dzięki globalnej mapce mamy możliwość podglądu miejsc do których zostały przypisane wpisy, a także ostatnio zalogowanych osób.</p>
<p>Oczywiście nie zabrakło także funkcjonalności czysto społecznościowych takich jak lista znajomych, lista ulubionych moBlogów, prywatne wiadomości czy grupy dyskusyjne tworzone przez użytkowników.</p>
<p>Całość spaja rozbudowana wyszukiwarka umożliwiająca przeszukanie moBloga po prawie wszystkich danych jakie użytkownik udostępnił publicznie na swojej stronie.</p>
<p>To co opisałem to tylko najważniejsze elementy funkcjonalne moBloga, a zapewniam Was, że jest jeszcze więcej innych ciekawych opcji.</p>
<p>Podsumowując tą małą krypto reklamę <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />   dodam, że moBloga napisany został w&#8230; PHP.</p>
<p>Mimo, że nie mogę zdradzić szczegółów to po samej ilości użytkowników i wpisów możecie stwierdzić, że obciążenie serwisu nie jest małe, a baza danych nie mieści się na jednej dyskietce <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Może więc da to trochę do myślenia niedowiarkom, którzy twierdzą że PHP nie nadaje się do poważniejszych zastosowań.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/03/24/moblogpl-mobilne-blogowanie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ASP.NET custom WebControl and fonts list property</title>
		<link>http://blog.webarchitect.pl/2008/03/24/aspnet-webcontrol-and-custom-fonts-list-property/</link>
		<comments>http://blog.webarchitect.pl/2008/03/24/aspnet-webcontrol-and-custom-fonts-list-property/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 22:23:25 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/2008/03/24/aspnet-webcontrol-and-custom-fonts-list-property/</guid>
		<description><![CDATA[After hours spending surfing on the web for solution of my problem with custom fonts list property in web control, finally I&#8217;ve found an answer! When accessing a web control from design mode you&#8217;ve probably seen a Font property. This property has a sub property Name which lists all fonts in a sexy drop down [...]]]></description>
			<content:encoded><![CDATA[<p>After hours spending surfing on the web for solution of my problem with custom fonts list property in web control, finally I&#8217;ve found an answer! <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>When accessing a web control from design mode you&#8217;ve probably seen a <em>Font</em> property. This property has a sub property <em>Name</em> which lists all fonts in a sexy drop down list.</p>
<p>Those font properties are made by <em>FontInfo</em> class which you can freely use in your control. But if you would like to grab only <em>Name</em>  sub property of <em>FileInfo</em> for your control the horror begins.</p>
<p>But here is the solution <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="csarp" style="font-family:monospace;">( ...)
[Editor(&quot;System.Drawing.Design.FontNameEditor, System.Drawing.Design&quot;, typeof(System.Drawing.Design.UITypeEditor))]
[TypeConverter(typeof(System.Drawing.FontConverter.FontNameConverter))]
public string FontName
{
(...)
}
(...)</pre></div></div>

<p>Adding <em>Editor</em> and <em>TypeConverter</em> makes all magic.  After that you can see a property with lovely fonts list <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>This little trick I&#8217;ve found thanks to&#8230; Open Source and implementation of <em>FileInfo</em> in <a href="http://www.mono-project.com/" target="_blank">Mono project</a>.</p>
<p>Hope this help you save a time <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/03/24/aspnet-webcontrol-and-custom-fonts-list-property/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SELECT, UPDATE, INSERT, DELETE w Doctrine</title>
		<link>http://blog.webarchitect.pl/2008/03/15/select-update-insert-delete-w-doctrine/</link>
		<comments>http://blog.webarchitect.pl/2008/03/15/select-update-insert-delete-w-doctrine/#comments</comments>
		<pubDate>Sat, 15 Mar 2008 13:44:25 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[Doctrine ORM]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/2008/03/15/select-update-insert-delete-w-doctrine/</guid>
		<description><![CDATA[Znalazłem trochę czasu i poniżej przedstawiam Wam mały wyciąg z podstawowych operacji na danych przy wykorzystaniu biblioteki Doctrine opisywanej przeze mnie w poprzednim wpisie. SELECT Proste pobieranie rekordu po kluczy głównym: $rekord = Doctrine::getTable&#40;'DoctrinowaNazwaTabeli'&#41;-&#62;find&#40;$idRekordu&#41;; Inna postać powyższego przykładu: $rekord = Doctrine_Query::create&#40;&#41; -&#62;from&#40;'DoctrinowaNazwaTabeli dnt'&#41; -&#62;where&#40;'dnt.id_tabeli = ?', $idRekordu&#41; -&#62;limit&#40;1&#41; -&#62;execute&#40;&#41; -&#62;getFirst&#40;&#41;; W powyższym przykładzie mogli byśmy [...]]]></description>
			<content:encoded><![CDATA[<p>Znalazłem trochę czasu i poniżej przedstawiam Wam mały wyciąg z podstawowych operacji na danych przy wykorzystaniu biblioteki <a href="http://www.phpdoctrine.org/" target="_blank">Doctrine</a> opisywanej przeze mnie w <a href="http://blog.webarchitect.pl/2008/02/23/jedyna-sluszna-doktryna-w-php/">poprzednim wpisie</a>.</p>
<p><span id="more-14"></span></p>
<p><strong>SELECT</strong></p>
<p>Proste pobieranie rekordu po kluczy głównym:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DoctrinowaNazwaTabeli'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$idRekordu</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Inna postać powyższego przykładu:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span> <span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DoctrinowaNazwaTabeli dnt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.id_tabeli = ?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$idRekordu</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFirst</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>W powyższym przykładzie mogli byśmy jeszcze dodać po create()->select() ale w przypadku pobierania rekordu w postaci obiektów nie używa się tego. O innej metodzie zwracania wyników napisałem kilka pięter niżej <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>W sekcji WHERE w pierwszej wartości podajemy warunek. W miejsce znaku zapytania wstawiona zostanie wartość podana po przecinku. W przypadku gdy chcemy zastąpić więcej niż jeden znak zapytania, odpowiednimi wartościami, musimy listę zmiennych umieścić w postaci tablicy:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span> <span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DoctrinowaNazwaTabeli dnt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.id_tabeli = ? AND dnt.name = ?'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$idRekordu</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nazwa</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFirst</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Zmienne są automatycznie odśmiecane, więc nie musimy się o to martwić.<br />
Zwróćcie także uwagę na to, że w sekcji FROM obok &#8222;doctrinowej&#8221; nazwy tabeli, po spacji dodajemy alias dla tej tabeli. Jest to dowolny ciąg znaków (chociaż ja przyjmuje zawsze pierwsze litery z cammel-caseowej nazwy), który później posłuży nam do odwoływania się do nazw kolumn w tej tabeli.</p>
<p>To na co jeszcze warto zwrócić uwagę, to metody execute() oraz getFirst().<br />
execute() wywołuje nam całe zapytanie i zwraca obiekt Doctrine_Collection zawierający zwrócone rekordy. Jest to kolekcja obiektów, a więc możemy spokojnie użyć pętli foreach aby pobrać każdy z rekordów (który w naszym przypadku będzie instancją klasy DoctrinowaNazwaTabeli).<br />
getFirst() służy do pobrania z kolekcji zwróconej przez execute() tylko jednego (pierwszego) rekordu.</p>
<p>I tutaj mała uwaga: nawet jeżeli zapytanie nie zwróci żadnych rekordów to execute() i tak zwróci kolekcje Doctrine_Collection. Będzie ona jednak pusta. Dlatego warunek w stylu if ($wynik) zawsze zwróci true. W tym przypadku należy więc użyć if (count($wynik) > 0).<br />
Natomiast korzystając z metody getFirst() otrzymamy albo rekord, albo wartość null &#8211; i tutaj powyższy pierwszy IF zadziała.</p>
<p>Wracając jeszcze do metody execute() warto zaznaczyć, że możemy w niej wykonać dwie rzeczy: przekazać listę parametrów które mają zastąpić znaki zapytania oraz podać typ w jakim mają zostać zwrócone wyniki.</p>
<p>Listę parametrów podajemy zawsze w postaci tablicy, a typ zwracanych danych jest stałą dostępną w klasie Doctrine.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span> <span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DoctrinowaNazwaTabeli dnt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.id_tabeli = ? AND dnt.name = ?'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$idRekordu</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nazwa</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ARRAY</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFirst</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Przekazując zmienne w execute() nie podajemy ich już w where(). Dodatkowo jeżeli chcemy tylko ustawić typ zwracanych danych listę parametró∑ zostawiamy jako pustą tablicę:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span> <span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DoctrinowaNazwaTabeli dnt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.id_tabeli = ? AND dnt.name = ?'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$idRekordu</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nazwa</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ARRAY</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFirst</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dzięki Doctrinowi możemy także pobrać powiązane rekordy:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">PowiazanaTabela</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nazwa</span><span style="color: #339933;">;</span></pre></div></div>

<p>Doctrine sam wykona odpowiednie zapytanie pobierając powiązany rekord &#8211; metoda ta nazywa się lazy-loading.</p>
<p>Aby zapobiec każdorazowemu pobieraniu pojedyńczych powiązanych rekordów możemy pobrać je za jednym zamachem stosując konstrukcję * JOIN.<br />
W Doctrine wygląda to w ten sposób:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span> <span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DoctrinowaNazwaTabeli dnt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">innerJoin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.PowiazanaTabela pt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.id_tabeli = ? AND dnt.name = ?'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$idRekordu</span><span style="color: #339933;">,</span> <span style="color: #000088;">$nazwa</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ARRAY</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFirst</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Do metody innerJoin() przekazujemy co chcemy pobrać podając następujące dane:<br />
- nazwa aliasu tabeli głównej<br />
- kropka<br />
- &#8222;doctrinowa&#8221; nazwa tabeli powiązanej z główną<br />
- po spacji podajemy alias dla powiązanej tabeli.</p>
<p>Poza innerJoin() możemy też użyć innych metod jak chociażby leftJoin(), rightJoin() &#8211; szczegóły w dokumentacji <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>UPDATE</strong></p>
<p>Update można zrealizować na dwa sposoby.</p>
<p>Po przez aktualizacje aktualnie używanego obiektu metodą save() na tym obiekcie:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nazwa</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Test'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'test@example.org'</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>I jeszcez nieco bardziej skomplikowany UPDATE aktualizujący od razu powiązany rekord:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">PowiazanaTabela</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nazwa</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Testing'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">PowiazanaTabela</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ala_ma_kota</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nazwa</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Test'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'test@example.org'</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Można też skorzystać z takiej oto metody:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">update</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DoctrinowaNazwaTabeli dnt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.nazwa'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Test'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.email'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test@example.org'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.id_tabeli = ?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$idRekordu</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Przykład jest jasny, więc nie będę go opisywał.</p>
<p><strong>INSERT</strong></p>
<p>Dodawanie rekordów jest równie proste co pobieranie danych i ich aktualizacja.</p>
<p>Aby utworzyć nowy rekord wystarczy stworzyć nowy obiekt klasy tabeli:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DoctrinowaNazwaTabeli<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">nazwa</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Abc'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'test2@example.org'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Metoda save() wstawi za nas rekord do bazy.<br />
Uprzedzam pytanie: nie ma możliwości wstawienia rekordu inną metodą jak w przypadku SELECT czy UPDATE.</p>
<p><strong>DELETE</strong></p>
<p>Usuwanie rekordów wykonuje się dwoma metodami tak jak w przypadku UPDATEa.</p>
<p>Mając już pobrany rekord w postaci obiektu, wystarczy że wykonamy na nim metodę delete():</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$rekord</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Lub też zbudujemy sobie zapytanie:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DoctrinowaNazwaTabeli dnt'</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'dnt.id_tabeli = ?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$idRekordu</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/03/15/select-update-insert-delete-w-doctrine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Zend Framework &#8211; klocki lego dla wytrwałych</title>
		<link>http://blog.webarchitect.pl/2008/03/05/zend-framework-klocki-lego-dla-wytrwalych/</link>
		<comments>http://blog.webarchitect.pl/2008/03/05/zend-framework-klocki-lego-dla-wytrwalych/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 00:09:42 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/2008/03/05/zend-framework-klocki-lego-dla-wytrwalych/</guid>
		<description><![CDATA[To co odróżnia Zend Framework od innych frameworków jest jego bardzo duża elastyczność, prostota i dbałość o jak najefektywniejszą implementacje rozwiązań w nim zawartych. Jednak ZF to tak naprawdę zbiór klas. Coś na kształt .NET&#8217;a (nie ASP.NET, a sam .NET Framework) czy też, nie szukając zbyt daleko, eZ Components. Takie podejście ma zdecydowanie swoje plusy, [...]]]></description>
			<content:encoded><![CDATA[<p>To co odróżnia Zend Framework od innych frameworków jest jego bardzo duża elastyczność, prostota i dbałość o jak najefektywniejszą implementacje rozwiązań w nim zawartych.</p>
<p>Jednak ZF to tak naprawdę zbiór klas. Coś na kształt .NET&#8217;a (nie ASP.NET, a sam .NET Framework) czy też, nie szukając zbyt daleko, eZ Components.  Takie podejście ma zdecydowanie swoje plusy, jednak posiada zasadniczą wadę. Jeżeli spojrzymy na to z punktu widzenia programisty, który siada do projektu i ma przed sobą kilka mniej lub bardziej przydatnych rozwiązań, luźno ze sobą związanych, to można sobie zadać pytanie czy ZF nie zabierze nam za dużo czasu przy lepieniu całości? Czy nie lepiej wybrać inny framework jak np Symfony, CakePHP, Prado etc? Frameworków opartych o zasadę out-of-the-box.</p>
<p><span id="more-13"></span>Zważywszy na to, że dokumentacja czasami jest niekompletna, przebicie się przez nią i stworzenie szkieletu ZF dla strony WWW zabiera trochę czasu. Czasu, który moglibyśmy spożytkować na kodowanie funkcjonalności docelowej strony.</p>
<p>Przy pierwszych wersjach ZF oznaczonych jeszcze numerkiem 0.x starałem się przymykać oko na to, że aby rozpocząć pracę muszę w pierw przygotować sobie całe środowisko. Pododawać klasy do obsługi MVC, stworzyć niezbędne katalogi, skonfigurować front-controller etc. Jednak w wersjach 1.x nic się w tej materii nie ruszyło. Dodatkowo dokumentacja nie oddawła pełnych możliwości i opcji jakimi dysponuje ZF. Nadal brak było (i jest <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) szkieletu dla aplikacji webowych &#8211; mówię tu o gotowym rozwiązaniu, które pozwalało by po prostu na to aby wpisać dane dostępowe do bazy, dodać HTMLa w odpowiednim miejscu i akcje do operowania na danych.</p>
<p>Dlatego właśnie moją uwagę bardziej przykuwają rozwiązania takie jak Symfony czy Prado.</p>
<p>Niestety jednak ZF nie daje mi spokoju <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Jest on zdecydowanie szybszy niż rozwiązania konkurencji, właśnie ze względu na swoją prostotę i to, że wykorzystuje on niezbędne minimum do działania.</p>
<p>Kiedy usłyszałem o ZF 1.5 i w końcu (!!!) dodanemu Zend_Layout, zmotywowało mnie to do przygotowania małego szkieletu ZF, tak aby na jego podstawie móc tworzyć mniej lub bardziej skomplikowane rozwiązania.</p>
<p>W krótcę podeślę na bloga paczkę ze szkieletem ZF, który mam nadzieję pomoże nieco w konstruowaniu strony opartych na ZF.</p>
<p>W założeniach będzie to bardzo minimalistyczny szkielet:</p>
<ul>
<li>predefiniowany layout katalogów,</li>
<li>struktura modułowa,</li>
<li>predefiniowane pliki konfiguracyjne w postaci XMLa (albo YAML jeżeli będę miał czas napisać do tego klasy) &#8211; ustawienia bazy danych, routingu etc.,</li>
<li>Doctrine jako  warstwa dostępu do bazy danych,
<ul>
<li>+ implementacja logowania zdarzeń oraz autoryzacji w oparciu o Doctrinea &#8211; Zend_Log_Writer_DB oraz Zend_Auth_Adapter_DbTable z wykorzystaniem Doctrine.</li>
</ul>
</li>
</ul>
<p>Czyli totalne minimum aby móc zacząć pracę bez potrzeby zagłębiania się w szczegóły konfiguracji modelu MVC w Zend Framework.</p>
<p>Jeżeli macie jakieś propozycje co do tego co mogło by się tam znaleźć zapraszam do dyskusji <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/03/05/zend-framework-klocki-lego-dla-wytrwalych/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Nowa strona K2.pl :-)</title>
		<link>http://blog.webarchitect.pl/2008/02/27/nowa-strona-k2pl/</link>
		<comments>http://blog.webarchitect.pl/2008/02/27/nowa-strona-k2pl/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 23:06:14 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[(nie)codzienność]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/2008/02/27/nowa-strona-k2pl/</guid>
		<description><![CDATA[Pozwolę sobie na odrobinę prywaty i zapraszam wszystkich na nową stronę firmy K2. Chłopaki dali z siebie dużo serca i trzeba przyznać, że efekt końcowy jest rewelacyjny Szczególnej uwadze polecam podstronę http://k2.pl/case_moblog.html jako, że mocno maczałem w tym projekcie palce]]></description>
			<content:encoded><![CDATA[<p>Pozwolę sobie na odrobinę prywaty i zapraszam wszystkich na <a href="http://www.k2.pl" target="_blank">nową stronę firmy K2</a>.</p>
<p>Chłopaki dali z siebie dużo serca i trzeba przyznać, że efekt końcowy jest rewelacyjny <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Szczególnej uwadze polecam podstronę <a href="http://k2.pl/case_moblog.html" target="_blank">http://k2.pl/case_moblog.html</a> jako, że mocno maczałem w tym projekcie palce <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/02/27/nowa-strona-k2pl/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Jedyna słuszna doktryna w PHP</title>
		<link>http://blog.webarchitect.pl/2008/02/23/jedyna-sluszna-doktryna-w-php/</link>
		<comments>http://blog.webarchitect.pl/2008/02/23/jedyna-sluszna-doktryna-w-php/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 23:28:24 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[Doctrine ORM]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/2008/02/23/jedyna-sluszna-doktryna-w-php/</guid>
		<description><![CDATA[Prawie każda aplikacja pisana w PHP&#8217;ie korzysta z bazy danych. Od wczesnych wersji PHP&#8217;a zmuszeni byliśmy do pisania &#8222;czystego&#8221; kodu SQL. Z czasem jednak pojawiały się z tym problemy takie jak kompatybilność zapytań SQL z różnymi typami baz danych. Na przeciw temu powstawały biblioteki &#8222;abstrakcyjnego&#8221; dostępu do baz danych &#8211; DAO (Data Access Object) &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Prawie każda aplikacja pisana w PHP&#8217;ie korzysta z bazy danych. Od wczesnych wersji PHP&#8217;a zmuszeni byliśmy do pisania &#8222;czystego&#8221; kodu SQL. Z czasem  jednak pojawiały się z tym problemy takie jak kompatybilność zapytań SQL z różnymi typami baz danych.</p>
<p>Na przeciw temu powstawały biblioteki &#8222;abstrakcyjnego&#8221; dostępu do baz danych &#8211; DAO (Data Access Object) &#8211; nazywane także warstwą pośrednią dostępu do danych.</p>
<p>Niewątpliwie takie podejście pozwoliło, przynajmniej w teorii, odetchnąć z ulgą w przypadku gdy musieliśmy zmienić bazę na inną niż dotychczas używaną.</p>
<p>Świat na szczęście nie stoi w miejscu i doczekaliśmy się rozwiązań dla leniuchów <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><span id="more-11"></span><br />
Mówię tu o tzw. ORM&#8217;ach &#8211; Object-Relational Mapping. Jest to w skrócie technika umożliwiająca mapowanie danych do postaci obiektów, które w prosty i łatwy sposób możemy wykorzystywać w aplikacji. Dzięki niej, nie musimy także pisać SQLa przez co raz, że skraca się czas tworzenia aplikacji, a dwa zmniejsza ilość błędów &#8211; w tym zapobiega atakom SQL Injection.</p>
<p>I właśnie o jednej z implementacji ORM&#8217;ów chciał bym tutaj napisać.</p>
<p><a href="http://www.phpdoctrine.org/" target="_blank">Doctrine</a>, bo o niego mi chodzi, to implementacja ORM&#8217;a rodem z Javy i jej Hibernate&#8217;a. Tak jak i on posiada swóją własną abstrakcyjną warstwę dostępu do danych i wewnętrzny język SQLowy zwany DQL &#8211; &#8222;obiektowy&#8221; SQL.</p>
<p>Oczywiście jego głównym zadaniem jest mapowanie danych do postaci obiektów. Dzięki temu w prosty sposób mam dostęp do naszych danych.</p>
<p>Nie będę opisywał szczegółów działania czy procedury instalacyjnej i konfiguracyjnej tego środiwska, ale chciał bym przedstawić Wam tylko kilka przykładów w jaki sposób wygląda dostęp do bazy przy użyciu Doctrine&#8217;a.  Niestety w polskiej sieci mało jest informacji o tej bibliotece, a jest to w mojej ocenie jeden z lepszych produktów dla PHP, którym warto się zainteresować.</p>
<p>Zobaczmy więc przykładowe wywołanie zapytania INSERT:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$user</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>name <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Jan'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$user</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>surname <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Kowalski'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$user</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>save<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>&#8230;i tyle <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Oczywiście klasę <em>User</em> zdefiniowaliśmy wcześniej zgodnie z wytycznymi jakie zawarte są w dokumentacji Doctrine&#8217;a.</p>
<p>Powyższy kod w bardzo prosty sposób wstawia rekord do tabeli z użytkownikami. Jak widać w ogóle nie użyliśmy SQL&#8217;a.</p>
<p>Kolejnym przykładem jest dostęp do powiązanej z tabeli <em>profile</em>, powiązanej z tabelą <em>user</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>Profile<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>hobby<span style="color: #339933;">;</span></pre></div></div>

<p>Kod ten ma za zadanie pobranie z tabeli <em>profile</em>, kolumny <em>hobby</em>. Tabela <em>profile</em>, jest powiązana z tabelą <em>user</em>, co zdefiniowane zostało w konfiguracji tej tabeli.</p>
<p>Taki zapis jest tym samym co wykonanie zapytania:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> hobby <span style="color: #993333; font-weight: bold;">FROM</span> profile <span style="color: #993333; font-weight: bold;">WHERE</span> id_user <span style="color: #66cc66;">=</span> xxx</pre></div></div>

<p>Jednak doctrine sam zajmie się skonstruowaniem zapytania tak abyśmy nie musieli się tym zajmować.</p>
<p>Przyjrzyjmy się teraz nieco bardziej skomplikowanemu kodowi:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$users</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Doctrine_Query<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>from<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'User u'</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>innerJoin<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'u.Profile p'</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>innerJoin<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'u.Group g'</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>where<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'u.birthday = ?'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'now()'</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>limit<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>execute<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$users</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
   <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>name <span style="color: #339933;">.</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>Group<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>name <span style="color: #339933;">.</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>Profile<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>hobby <span style="color: #339933;">.</span> <span style="color: #0000ff;">'
&nbsp;
'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Na początku wykonujemy zapytanie które pobierze nam 5 użytkowników, którzy urodziny wypadają dzisiaj (zwróćcie uwagę na zapytanie WHERE, które zawiera znak &#8216;?&#8217; &#8211;  w jego miejsce wstawiona zostanie wartość &#8216;now()&#8217;. Gdyby była to inna wartość została by ona automatycznie oczyszczona ze znaków, które powodowały by błędy w zapytaniu SQL). Dodatkowo pobierzemy dane z dwóch powiązanych tabel <em>profile</em> oraz <em>group</em>. A na koniec wylistujemy wyniki.</p>
<p>Jak widać kod jest  bardzo prosty i przejrzysty. Nie musieliśmy pisać żadnego SQL&#8217;a.</p>
<p>Przykład ten mogli byśmy także nieco okroić, przez usunięcie wywołań innerJoin(). W pętli foreach nie musielibyśmy nic zmieniać, gdyż Doctrine sam będzie wiedział co oznacza wywołanie $user-&gt;Group-&gt;name i zamieni je na pojedyńcze zapytanie SQL (metoda ta nazywa się <a href="http://en.wikipedia.org/wiki/Lazy_loading">lazy loading</a>).</p>
<p>Przy tym przykładzie, wewnątrz pętli foreach moglibyśmy także zastosować metodę delete() na obiekcie $user, w celu usunięcia rekordu z bazy.</p>
<p>Doctrine oferuje oczywiście znacznie więcej jak np. wspomniany DQL, obsługę transakcji, własne triggery i sekwencje, obsługe drzewek SQLowych i wiele innych zaawansowanych rozwiązań. Dodatkowo warto wspomnieć iż Doctrine używa PDO, przez co jest to wydajne rozwiązanie. No i jak sami widzicie używanie go jest bardzo intuicyjne i nawet początkującemu nie powinno sprawić problemów.</p>
<p>Oczywiście są i inne tego typu rozwiązania jak chociażby Propel, Zend_Db, POG ale sądzę, że Doctrine już na tyle rozwiniętą biblioteką (i stale rozwijaną), że warto się nim zainteresować.</p>
<p>Więcej informacji o Doctrine dowiecie się z oficjalnej strony znajdującej się pod tym adresem:</p>
<p><a href="http://www.phpdoctrine.org/" target="_blank">http://www.phpdoctrine.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/02/23/jedyna-sluszna-doktryna-w-php/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Energia serwerotermalna ;-)</title>
		<link>http://blog.webarchitect.pl/2008/02/22/energia-serwerotermalna/</link>
		<comments>http://blog.webarchitect.pl/2008/02/22/energia-serwerotermalna/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 21:28:03 +0000</pubDate>
		<dc:creator>Michał Seth Gołębiowski</dc:creator>
				<category><![CDATA[Ciekawostki]]></category>

		<guid isPermaLink="false">http://blog.webarchitect.pl/2008/02/22/energia-serwerotermalna/</guid>
		<description><![CDATA[Wiele się mówi i pisze w mediach na temat ograniczania efektu cieplarnianego. Elektrownie słoneczne i wiatrowe, turbiny wodne i korzystanie z innych odnawialnych źródeł energii ma być panaceum na nasze kłopoty. Czy jednak musimy korzystać tylko z naturalnych źródeł energii? Otóż nie. Jakiś czas temu władze miasta Vancouver wpadły na genialny pomysł. Otóż miasteczka olimpijskie, [...]]]></description>
			<content:encoded><![CDATA[<p>Wiele się mówi i pisze w mediach na temat ograniczania efektu cieplarnianego. Elektrownie słoneczne i wiatrowe, turbiny wodne i korzystanie z innych odnawialnych źródeł energii ma być panaceum na nasze kłopoty.</p>
<p>Czy jednak musimy korzystać tylko z naturalnych źródeł energii? <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Otóż nie.</p>
<p>Jakiś czas temu władze miasta Vancouver wpadły na genialny pomysł. Otóż miasteczka olimpijskie, przygotowywane na olimpiadę zimową w 2010 roku będą ogrzewane z&#8230; ciepła pochodzącego z serwerowni.</p>
<p>Zasada jest niemalże identyczna jak przy wykorzystaniu ciepła pochodzącego z wnętrza ziemi (<a href="http://pl.wikipedia.org/wiki/Energia_geotermalna" target="_blank">energia geotermalna</a>). W tym przypadku będzie to jednak ciepło wytwarzane przez serwery.</p>
<p>Specjalne systemy mają odprowadzać ciepło i przekazywać je do systemów grzewczych budynku oraz do podgrzewania wody.</p>
<p>Trzeba przyznać, że pomysł jest bardzo rewolucyjny, a może raczej odważny, gdyż do tej pory serwerownie były raczej pożeraczami energii niż ich źródłami <img src='http://blog.webarchitect.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Więcej informacji możecie przeczytać pod tymi linkami:</p>
<p><a href="http://www.reuters.com/article/sportsNews/idUSN1830885620070419" target="_blank">http://www.reuters.com/article/sportsNews/idUSN1830885620070419</a></p>
<p><a href="http://www.city.vancouver.bc.ca/ctyclerk/newsreleases2007/NRneuFINAL.htm" target="_blank">http://www.city.vancouver.bc.ca/ctyclerk/newsreleases2007/NRneuFINAL.htm</a></p>
<p><a href="http://greenlineblog.com/2010-olympic-village-using-sewage-heat-recovery/" target="_blank">http://greenlineblog.com/2010-olympic-village-using-sewage-heat-recovery/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.webarchitect.pl/2008/02/22/energia-serwerotermalna/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
