<?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>Zenobius, czyli Piotr Baranowski &#187; db2</title>
	<atom:link href="http://zenobius.zeno.pl/archives/tag/db2/feed" rel="self" type="application/rss+xml" />
	<link>http://zenobius.zeno.pl</link>
	<description>IT, Świat, Praca, PHP.. życie.</description>
	<lastBuildDate>Wed, 23 Mar 2011 16:47:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>MongoDB. Baza zorientowana w okół dokumentów. NoSQL. Schema-free.</title>
		<link>http://zenobius.zeno.pl/archives/511/opinie/mongodb-baza-zorientowana-w-okol-dokumentow-nosql-schema-free</link>
		<comments>http://zenobius.zeno.pl/archives/511/opinie/mongodb-baza-zorientowana-w-okol-dokumentow-nosql-schema-free#comments</comments>
		<pubDate>Mon, 15 Nov 2010 08:23:27 +0000</pubDate>
		<dc:creator>Zenobius</dc:creator>
				<category><![CDATA[Opinie]]></category>
		<category><![CDATA[Technologia]]></category>
		<category><![CDATA[baza danych]]></category>
		<category><![CDATA[db]]></category>
		<category><![CDATA[db2]]></category>
		<category><![CDATA[ibm]]></category>
		<category><![CDATA[mongo]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://zenobius.zeno.pl/?p=511</guid>
		<description><![CDATA[Próbując uruchomić Diasporę doznałem kilku olśnień. Głównym z nich było odkrycie MongoDB. Istnieje cała masa baz danych które powstały dzięki rozwojowi aplikacji WWW jak choćby &#8220;key-&#62;value store&#8221; używane przez Facebooka, a teraz prowadzone przez Apache pod nazwa Apache Cassandra Project. Mówiąc z perspektywy programisty WWW &#8211; bazy relacyjne nie wpasowują się w potrzeby moich aplikacji. [...]]]></description>
			<content:encoded><![CDATA[<p>Próbując uruchomić Diasporę doznałem kilku olśnień. Głównym z nich było odkrycie <a title="MongoDB" href="http://www.mongodb.org/" target="_blank">MongoDB</a>. Istnieje cała masa baz danych które powstały dzięki rozwojowi aplikacji WWW jak choćby &#8220;key-&gt;value store&#8221; używane przez Facebooka, a teraz prowadzone przez Apache pod nazwa <a title="Apache Cassandra Project" href="http://cassandra.apache.org/" target="_blank">Apache Cassandra Project</a>. Mówiąc z perspektywy programisty WWW &#8211; bazy relacyjne nie wpasowują się w potrzeby moich aplikacji. Klientom dostarczam dokumenty, liczy się szybkość ich generowania. Rządzi XML. W końcu XHTML to jest XML. Dane są hierarchiczne i często ich struktury naturalnie są dynamiczne. Fajnie by więc było gdyby mogły w łatwy sposób być tak przechowywane. Tworzenie kilku tabel dla pięciu rekordów w bazie danych, gdy klient podał trzy numery telefonów zamiast jednego, jest olbrzymim (stosunkowo) narzutem pracy, logiki i skomplikowania. Ile razy widzieliście pola VARCHAR/TEXT w których dane były przechowywane po przecinku? No właśnie. Za dużo.</p>
<p>Dlatego wiele lat temu zakochałem się w PureXML serwowanym przez IBM DB2 od wersji 9.0 . A teraz porzucam moją starą miłość dla zupełnie nowej. Nie oszukujmy się, zmuszenie DB2 do działania według tego jak się chce, a nie jak baza chce, to jest katorga dla osoby która nie spędziła przynajmniej kilku miesięcy na kursach. Narzędzia do obsługi bazy są toporne i bolesne w użyciu. A narzut wiedzy który był mi potrzebny do wykonywania na niej operacji liczył około trzech tysięcy stron A4 (od instalacji, przez używanie do administracji). Nie chce nawet szacować ile czasu zajęło mi instalowanie tej bazy na serwerach i maszynie developerskiej za pierwszym razem.. drugim i kolejnymi trzema. Uczenie się DB2 przyniosło mi sporo wiedzy ogólnej, która przydaje mi się teraz od czasu do czasu, ale to nie jest godna rekompensata zużytego czasu.</p>
<p>Ale dość wstępu. W tym wpisie chcę się skupić na MongoDB, jako, że po kilku ładnych tygodniach testów różnych baz doszedłem do wniosku, że właśnie ten produkt najlepiej spełnia oczekiwania które mamy w Zeno.pl i te które można mieć przy pisaniu mocno obciążonych aplikacji. Z pewnością zbiorę się do napisania wniosków ogólnych dotyczących innych moich odkryć wyniesionych z Diaspory along the way. Ale póki co Mongo i jego <a title="NoSQL" href="http://en.wikipedia.org/wiki/NoSQL" target="_blank">NoSQL</a>, Schema-free podejście do życia.</p>
<h3>MongoDB</h3>
<p>Baza oparta jest o JavaScript i JSON/BSON. Do wykonywania zapytań używa się składni JS i JSON, dane przechowywane są przy użyciu JSONa i BSONa (do danych binarnych). Próg wejścia jest więc znikomy dla każdego kto pisał jakąkolwiek interaktywna aplikację WWW. Jest to ogromny plus. Od instalacji do pierwszych zapytań minęło u mnie kilkanaście minut. Na stronie jest ciekawie zrobiony <a title="Try MongoDB" href="http://try.mongodb.org/" target="_blank">interaktywny tutorial</a>, dokumentacja jest tworzona na bieżąco i można o niej powiedzieć, że jest kompletna.</p>
<p>Sama instalacja bazy jest prościutka &#8211; wystarczy swoim managerem paczek zassać i zainstalować bazę i klienta. Standardowa konfiguracja wystarcza do zabawy i testów. Sterowniki do PHP dostępne są z poziomu PECLa</p>
<p><code>sudo pecl install mongo</code></p>
<p>Na stronie podręcznika do PHP dostępny jest <a title="MongoDB" href="http://pl.php.net/manual/en/mongo.tutorial.php">opis klas tego sterownika</a>.</p>
<h4>Baza jest w stu procentach dynamiczna.</h4>
<p>Ma to swoje plusy i minusy. Bazy danych i kolekcje (odpowiedniki tabel) tworzone są dynamicznie &#8211; oznacza to, że baza nie krzyczy na nas za literówki. Jeżeli raz napiszemy</p>
<p><code>db.users.insert({"name": "Zenobius" });</code></p>
<p>(komenda wstawiająca dokument &#8211; odpowiednik rekordu &#8211; do kolekcji <em>user </em>z polem &#8211; kolumną -<em> name </em>która ma wartość<em> &#8220;Zenobius&#8221;</em>) to Mongo sprawdzi czy w używanej przez nas bazie jest już kolekcja <em>users</em>, jeżeli nie to ją utworzy. Gdy za drugim razem wpiszemy</p>
<p><code>db.usrs.find();</code></p>
<p>(komenda listująca wszystkie dokumenty z kolekcji<em> usrs</em> ) to Mongo nie nakrzyczy na nas, tylko wyświetli pusty zbiór wyników. Gdy wpiszemy</p>
<p><code>db.usrs.insert( {"name": "Zenobius" } );</code></p>
<p>to Mongo stworzy kolekcję <em>usrs</em>, wstawi do niej dokument z polem <em>name</em> o wartości <em>Zenobius</em> i będzie się cieszyć z dobrze wykonanego zadania.</p>
<p>Co ciekawe <strong>każdy dokument przy insercie dostaje generowany przez bazę identyfikator</strong>. Dotyczy to też sterowników do PHP &#8211; po wywołaniu inserta obiekt który dodawaliśmy dostaje automatycznie pole<em> _id</em> .</p>
<p><strong>Kolekcje tworzone są dynamicznie</strong>.<strong> </strong>Jestem w stanie wyobrazić sobie godziny spędzone na szukaniu buga polegającego na zjedzeniu literki. Z drugiej strony nazwy kolekcji i baz danych powinny być trzymane w modelu lub pliku konfiguracyjnym i nie zmieniane &#8211; więc da się z tym żyć.</p>
<p>Aby <strong>stworzyć bazę danych</strong> wystarczy użyć polecenia</p>
<p>use &lt;nazwa bazy&gt;</p>
<p>i baza jest gotowa do użycia. Domyślnie przy użyciu wiersza poleceń ( mongo ) używana jest baza <em>test</em> .</p>
<p>Baza jest <strong><a title="Sharding Introduction" href="http://www.mongodb.org/display/DOCS/Sharding+Introduction">skalowalna horyzontalnie</a>.</strong> Jest to niesamowicie proste do skonfigurowania &#8211; wystarczy kilka poleceń na poziomie roota i admina bazy.</p>
<p><strong><a title="Replication" href="http://www.mongodb.org/display/DOCS/Replication">Replikacja danych</a></strong>, podobnie jak skalowanie, jest bardzo łatwa do skonfigurowania. Bazę można z łatwością dostosować do swoich potrzeb. Można wymusić zapis na kilku serwerach. Z łatwością w trybie produkcyjnym można przełączać status <em>master</em> i <em>slave</em>, aby zrobić np. backup danych.</p>
<p><strong>Używa UTF8</strong> &#8211; tak jak powinien to robić każdy z nas.</p>
<p><strong>Support i interakcja twórców ze społecznością i developerami jest świetna.</strong> Przykładem może być współpraca twórców MongoDB po wpadce <a title="foursquare" href="http://foursquare.com/">foursquare</a> opisana na łamach <a title="Troubles with Sharding - What can we learn from the Foursquare Incident?" href="http://highscalability.com/blog/2010/10/15/troubles-with-sharding-what-can-we-learn-from-the-foursquare.html" target="_blank">high scalability</a>. Oczywiście twórcy bazy nie mogli sobie pozwolić na zły PR, ale poziom szczegółowości, otwartość i szybkość reakcji sprawiają, że jestem pod wrażeniem.</p>
<h4>MongoDB Admin UI</h4>
<p>Do MySQLa mamy phpMyAdmina, do Postgresa mamy pgAdmina, do DB2 jest DB2 Developer Workbench. Dla Mongo też jest kilka interfejsów. Ich opis, po angielsku, dostępny jest na <a title="Tuesday Night Tech - MongoDB UI Edition" href="http://blog.timgourley.com/post/453680012/tuesday-night-tech-mongodb-ui-edition" target="_blank">blogu Tima</a>, oraz na <a title="Admin UIs" href="http://www.mongodb.org/display/DOCS/Admin+UIs">stronie MongoDB</a>.</p>
<p>Osobiście używałem póki co tylko ob PHPowych, z których o wiele lepszy jest <a title="Opricot" href="http://www.icmfinland.fi/oss/opricot/" target="_blank">Opricot</a>. Ale jeżeli ktoś z was ma ochotę pobawić się Pythonem lub Ruby i dać znać czy warto &#8211; to czekam na komentarze.</p>
<p>Na koniec jeszcze mały <a title="SQL to Mongo Mapping" href="http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart" target="_blank">cheat-sheet SQL &lt;-&gt; Mongo</a>.</p>
<p>Aplikacje Webowe muszą być dynamiczne. Musimy mieć też możliwość szybkiego wprowadzania w nich zmian aby wyprzedzać konkurencję. Próg wejścia dla Mongo jest niski &#8211; wystarczy kilka dni nauki i poruszamy się w jego środowisku swobodnie. Natomiast zyski z użycia Mongo wydają się być spore, jeżeli nie ogromne. Łatwość użycia, szybkość działania, łatwość konfiguracji replikacji i skalowania, prosta składnia &#8211; to wszystko rozwiązuje wiele problemów czy pytań które pojawiają się gdy używamy MySQLa czy Postgresa. Dynamiczna struktura dokumentów pozwala z łatwością zapisać w tej bazie wszystko. Fakt, że opiera się na JSON pozwala na bardzo łatwą manipulację danymi z poziomu PHP. Minusem jest mała dostępność bazy na hostingach i potrzeba migracji danych ze starej bazy i przepisanie całego modelu aplikacji. Natomiast jeżeli zaczynamy pisać coś zupełnie nowego to radzę poważnie zastanowić się nad MongoDB.
<div class="fblike_button" style="margin-left: 30px; margin-top: 10px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fzenobius.zeno.pl%2Farchives%2F511%2Fopinie%2Fmongodb-baza-zorientowana-w-okol-dokumentow-nosql-schema-free&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
]]></content:encoded>
			<wfw:commentRss>http://zenobius.zeno.pl/archives/511/opinie/mongodb-baza-zorientowana-w-okol-dokumentow-nosql-schema-free/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DB2 V9.x i PHP &#8211; co mi da ich mariaż?</title>
		<link>http://zenobius.zeno.pl/archives/135/notka/db2-v9-x-i-php-co-mi-da-ich-mariaz</link>
		<comments>http://zenobius.zeno.pl/archives/135/notka/db2-v9-x-i-php-co-mi-da-ich-mariaz#comments</comments>
		<pubDate>Sat, 19 Jun 2010 01:10:07 +0000</pubDate>
		<dc:creator>Zenobius</dc:creator>
				<category><![CDATA[Notka]]></category>
		<category><![CDATA[Opinie]]></category>
		<category><![CDATA[Praca]]></category>
		<category><![CDATA[db2]]></category>
		<category><![CDATA[informatyka]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://zenobius.zeno.pl/?p=135</guid>
		<description><![CDATA[Dobrych kilka lat temu usłyszałem o powstaniu hybrydowych baz danych. Hybrydowe w poprzednim zdaniu oznacza łączące silniki relacyjne z hierarchicznymi. Z moich informacji, z tego co wiem, wynika, że póki co połączenie XMLa (bo to zazwyczaj jest implementacją hierarchiczności) z relacyjnością zostało dodane w takich bazach jak Oracle czy IBM DB2. Od tamtego czasu sporo [...]]]></description>
			<content:encoded><![CDATA[<p>Dobrych kilka lat temu usłyszałem o powstaniu hybrydowych baz danych. Hybrydowe w poprzednim zdaniu oznacza łączące silniki relacyjne z hierarchicznymi. Z moich informacji, z tego co wiem, wynika, że póki co połączenie XMLa (bo to zazwyczaj jest implementacją hierarchiczności) z relacyjnością zostało dodane w takich bazach jak <a title="Oracle Database" href="http://www.oracle.com/global/pl/database/index.html">Oracle</a> czy <a title="IBM DB2 Data Server" href="http://www-01.ibm.com/software/data/db2/">IBM DB2</a>.</p>
<p>Od tamtego czasu sporo się w bazach namieszało, <a title="Oracle MySQL" href="http://mysql.com/">Oracle przejęło MySQLa</a>, Facebook zrobił własną bazę danych, która aktualnie jest pod opieką fundacji Apache i zwie się <a title="The Apache Cassandra Project" href="http://cassandra.apache.org/">Cassandra</a> (zresztą, to co zrobił Facebook z PHPem zasługuje na osobny wpis). Przyszłość bazowa może być bardzo ciekawa :-)</p>
<p>Ale skupmy się na temacie mariażu DB2 z PHP.</p>
<h3>Po co?</h3>
<p><strong>XHTML to XML</strong>. Ten prosty fakt sprowadza się do tego, że możemy zapisywać gotowe kawałki kodu XML w bazie danych w polach XML &#8211; wyciągać odpowiednie kawałki, składać ze sobą i &#8220;wypluwać&#8221; stronę. Proste, ale od czegoś trzeba zacząć.</p>
<p><strong>XML nadaje się świetnie do składowania różnych płynnych danych</strong> &#8211; jako, że nie narzuca nam z góry formy w której musimy je przechowywać (możemy sami sobie je narzucić poprzez DTD lub XML Schema). W przypadku chęci posiadania wielu adresów klienta, czy wielu numerów telefonu jednej osoby &#8211; XML jest lepszą alternatywą, niż tworzenie kolejnej tabeli tylko na któreś z tych danych. PHP jest biedne (miejmy nadzieję, że &#8220;jeszcze biedne&#8221; a nie &#8220;na zawsze biedne&#8221;) jeżeli chodzi o modyfikację XML. Jedynym sposobem sensownej modyfikacji jest DOM, który jest o wiele bardziej nieprzyjemny w użyciu niż SimpleXML. Coś za coś, możliwe, ze udostępnię w jakimś czasie klasy do modyfikacji PHP pozwalające na dowolną modyfikację XMLa z łatwością SimpleXMLa.</p>
<p><strong>XML w połączeniu z XSLT może robić za świetną warstwę danych i wizualizacji.</strong> Przy pomocy XSLT możemy przetworzyć dowolny plik XML do.. dowolnego innego formatu opartego na tekście. W naszym kontekście oznacza to możliwość przeniesienia warstwy widoku na klienta. Do klienta wysyła się plik XML z danymi (za każdym razem w odpowiedni sposób zmodyfikowany &#8211; aby odzwierciedlić dane które są aktualne), oraz szablon XSLT który parsuje XML do XHTMLa i pokazuje użytkownikowi za pomocą przeglądarki. To jest dość ciężki punkt, gdyż trudno w XSLT tworzyć dynamiczne linki (składać atrybut node&#8217;a XMLowego z kilku wartości). Ale przy odpowiednim przetworzeniu XMLa po stronie PHP, żeby lepiej nadawał się do parsowania przez XSLT &#8211; jest to do zrobienia.</p>
<p>Pierwsze dwa punkty były dość trywialne. Ot, kolejna opcja do rozwiązania dość popularnego problemu. Mająca swoje minusy i plusy &#8211; wybrać można co się chce.</p>
<p>Trzeci punkt to zupełnie nowe (<strong>a może już nie takie nowe i ktoś już tak robi?</strong>) podejście do parsowania stron i pokazywania ich klientowi. Parsowanie szablonu i upychanie do niego odpowiednich danych to jest ból i dla serwera i dla ludzi którzy muszą uczyć się specyficznego, użytego w naszym projekcie, języka szablonów.</p>
<p>Tak naprawdę XSLT jest, znów, kolejnym językiem do nauczenia.. ale w odróżnieniu od Smarty czy OPT spełnia więcej niż jedną funkcję i można go zastosować do dowolnej transformacji dowolnego pliku XML &#8211; ma to swoje plusy.</p>
<p>Co do serwera to zostaje on odciążony od tego &#8211; klient dostaje XML i XSTL i to jego przeglądarka zajmuje się przetworzeniem szablonu i wrzuceniu w niego danych &#8211; to jest piękne. Oczywiście to serwer może przetwarzać XMLa do XSLT przy użyciu np. <a title="XSL" href="http://pl.php.net/manual/en/book.xsl.php">XSL</a> i klient dostaje już gotowego XHTMLa (ale skrótów, uff :-) ). Np. jeżeli nie chcemy udostępniać użytkownikowi XMLa z danymi.</p>
<p>Przy użyciu jednego zestawu danych XML możemy dostarczyć stronę na wiele platform przy użyciu różnych szablonów XSLT.</p>
<p>Wszystko to co powyżej opisałem da się zrobić przy użyciu DB2 w połączeniu z PHP.</p>
<p>Mam wrażenie, że nie wszystko zostało tu napisane, więc temat będę jeszcze rozwijał. Postaram się też opublikować kod implementujący te rozwiązania. <a title="Instalacja DB2 na Linux’ie. Łączenie DB2 z PHP." href="http://zenobius.zeno.pl/archives/137/notka/instalacja-db2-na-linuxie-laczenie-db2-z-php">Opis instalacji DB2 na Linuxie i połączenie z PHP</a> znajdziecie na moim blogu parę postów niżej.
<div class="fblike_button" style="margin-left: 30px; margin-top: 10px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fzenobius.zeno.pl%2Farchives%2F135%2Fnotka%2Fdb2-v9-x-i-php-co-mi-da-ich-mariaz&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
]]></content:encoded>
			<wfw:commentRss>http://zenobius.zeno.pl/archives/135/notka/db2-v9-x-i-php-co-mi-da-ich-mariaz/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalacja DB2 na Linux&#8217;ie. Łączenie DB2 z PHP.</title>
		<link>http://zenobius.zeno.pl/archives/137/notka/instalacja-db2-na-linuxie-laczenie-db2-z-php</link>
		<comments>http://zenobius.zeno.pl/archives/137/notka/instalacja-db2-na-linuxie-laczenie-db2-z-php#comments</comments>
		<pubDate>Sun, 28 Feb 2010 22:11:37 +0000</pubDate>
		<dc:creator>Zenobius</dc:creator>
				<category><![CDATA[Notka]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[db2]]></category>
		<category><![CDATA[fedora]]></category>
		<category><![CDATA[informatyka]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://zenobius.zeno.pl/?p=137</guid>
		<description><![CDATA[Edit: dodałem tekst o tym co może wyniknąć z połączenia DB2 z PHP. O tym, czemu w temacie tej notki DB2 i PHP występują w jednym zdaniu, będzie gdzie indziej. A zapewniam, że temat jest interesujący. Poniżej opis jak zainstalować DB2 na serwerze z Linuxem ( testowaliśmy to na systemach: Fedora, CentOS, RedHat, Ubuntu ). [...]]]></description>
			<content:encoded><![CDATA[<p>Edit: dodałem tekst o tym co może wyniknąć z <a title="db2 i php - co mi da ich mariaż" href="http://zenobius.zeno.pl/archives/135/notka/db2-v9-x-i-php-co-mi-da-ich-mariaz">połączenia DB2 z PHP</a>.</p>
<p>O tym, czemu w temacie tej notki DB2 i PHP występują w jednym zdaniu, będzie <a title="db2 i php - co mi da ich mariaż" href="http://zenobius.zeno.pl/archives/135/notka/db2-v9-x-i-php-co-mi-da-ich-mariaz">gdzie indziej</a>. A zapewniam, że temat jest interesujący. Poniżej opis jak zainstalować DB2 na serwerze z Linuxem ( testowaliśmy to na systemach: <a title="Projekt Fedora" href="http://fedoraproject.org/pl/index">Fedora</a>, <a title="The Community ENTerprise Operating System" href="http://centos.org/">CentOS</a>, <a title="RedHat" href="http://www.redhat.com/">RedHat</a>, <a title="Ubuntu" href="http://ubuntu.pl/">Ubuntu</a> ). Większość tego tutoriala została najpierw przetestowana przez <a title="Kamil Jakubowski" href="http://kamil.zeno.pl">Kamila</a>, mi udało się rozwiązać kluczowy problem. Ale.. po kolei.</p>
<p><strong>Ten poradnik jest też dla tych, którym po instalacji DB2 i sterowników pod PHP wyskakują błędy połączenia z bazą mimo, że wszystko poszło jak trzeba (patrzcie na punkt ostatni)!</strong></p>
<h3>Jaki Linux?</h3>
<p>Po pierwsze, musimy zdecydować się na jakąś dystrybucję. DB2, jako, że jest produktem IBM&#8217;a, lubi się z RedHat&#8217;em (czyli z Fedorą i CentOS&#8217;em również) oraz SuSE. Kamilowi udało się to wszystko zrobić na Ubuntu. Myślę, że i inne dystrybucje dadzą sobie radę.</p>
<p>Ja osobiście używam Windowsa ( tak, Windowsa ) jako środowiska do pisania kodu, natomiast Linux&#8217;a postawionego mam na SUN&#8217;owskim <a title="VirtualBox" href="http://www.virtualbox.org/">VirtualBox</a>&#8216;ie. Do plików na nim dostaje się przez Sambę. Dzięki temu PDT myśli, że pracuje na Windzie, a ja odpalam wszystko na Linuxie. Jak się komuś spodoba taki sposób, to napiszę kiedyś jak to sobie ustawić wszystko.</p>
<p>Ale.. nie chce wywoływać burzy Win vs. Linux, czy dystrybucja A vs. dystrybucja B, więc na tym co powyżej poprzestanę.</p>
<h3>Czego mi potrzeba?</h3>
<p>Na pewno wspomnianego już Linux&#8217;a ;-) Poza tym trzeba <a title="IBM DB2 download" href="http://www-01.ibm.com/software/data/db2/express/download.html">ściągnąć DB2 w wersji Express-C</a> (testowaliśmy z wersją 9.5 jak i 9.7 ), chyba, że ktoś ma licencje na pełną wersję DB2. Ale nie sądzę, żeby wtedy wchodził na mojego bloga ;-)</p>
<p>Jako, że na końcu tego tutoriala mamy mieć możliwość podłączenia się do DB2 za pomocą PHP &#8211; to przyda się mieć Apache&#8217;a oraz PHP ( my używaliśmy do tego 5.3.1 ). My zaczynaliśmy od czystego, ale myślę, że nie będzie problemów z &#8220;brudnym&#8221;.</p>
<p>Przy instalacji DB2 przez setup graficzny trzeba mieć zainstalowaną Java&#8217;e. Sposób wytestowany jest zarówno graficznie jak i z linii poleceń, aczkolwiek druga opcja oznacza więcej ręcznego babrania się w konfiguracji. W przypadku serwerowych systemów trudno o jakiegoś managera okien, jeżeli bawimy się na Linux&#8217;owym desktopie &#8211; to droga wolna.</p>
<p>Aby skompilować DB2 oraz drivery do połączenia z PHP potrzebny jest.. kompilator ( d-oh! ). Wypada więc zainstalować <strong>gcc</strong> .</p>
<h3>Instalacja DB2</h3>
<p>Ja omówię instalacje z linii poleceń. Kamil pewnie wrzuci na swojego bloga informacje o instalacji graficznej. Chociaż ona zazwyczaj polega na czytaniu tego co na ekranie i umiejętnym klikaniu &#8220;next&#8221; ;-)</p>
<h4>Z linii poleceń</h4>
<p>Ściągamy plik, rozpakowujemy, wchodzimy do katalogu który powstał, potem od katalogu expc no i zaczyna się zabawa..</p>
<p>1. Uruchamiamy:<br />
<code>./db_install</code><br />
2. Wybieramy katalog instalacji ( domyślnie jest to /opt/ibm/db2/V9.[x]), <strong>katalog trzeba zapamiętać! </strong>( x to wersja DB2 którą się instaluje ).</p>
<p>3. Wpisujemy &#8220;EXP&#8221; i pacamy &#8220;enter&#8221;</p>
<p>4. Instalacja robi swoje, idziemy po herbatę/kawę/colę/lub-gdzie-chcemy ;-)</p>
<p>5. Jeżeli wróciliśmy i na ekranie znaleźliśmy błąd w stylu<br />
<code>ERROR:<br />
The following library files could not be loaded by db2langdir<br />
in /tmp/exp/disk1/db2/linux/install/../bin</code></p>
<p>libstdc++.so.5<br />
libstdc++.so.5<br />
to oznacza to iż brakuje nam niektórych bibliotek C++ i musimy zrobić coś takiego<br />
<code>yum install compat-libstdc++-33</code><br />
Po czym wracamy do pkt. 1 .</p>
<p>6. Przechodzimy do konfiguracji serwera po instalacji ręcznej. Opis tego procesu, po polsku, znajduje się w <a title="IBM InfoCenter - Konfigurowanie serwerów DB2 po ręcznej instalacji" href="http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.uprun.doc/doc/t0007067.htm">InfoCenter IBM&#8217;a</a>.</p>
<p>Parę wskazówek, sugestii i rzeczy pomocnych do pkt 6. :</p>
<p>1) nie bawcie się w zmienianie domyślnych, sugerowanych tam rzeczy, jeżeli nie wiecie co robicie. DB2 w wielu miejscach ma różne ustawienia, które również trzeba wtedy zmienić. Czasem trudno do tego dojść. Jeżeli zdecydujecie się na wprowadzenie DB2 na produkcyjny serwer &#8211; wtedy poświęćcie czas na dokładniejszą naukę i zrozumienie zasad działania DB2.</p>
<p>2) w podpunkcie 3cim, jako typ uwierzytelniania, wybieramy &#8220;server&#8221;. Jest to najpopularniejsza metoda uwierzytelniania do której jesteśmy przyzwyczajeni. Jako login/hasło do bazy podajemy wtedy usera którego stworzyliśmy w podpunkcie 1szym. Czyli domyślnie db2inst1 i hasło takie jakie utworzyliśmy. Jak wyżej &#8211; nie kombinujcie z tym, chyba, że wiecie co robicie :-)</p>
<p>3) konfiguracja komunikacji DB2. W podpunkcie 3cim wpisujemy tą komendę<br />
<code>update database manager configuration using svcename serwer1|3100</code><br />
razem ze znakiem |. Oczywiście biorąc pod uwagę swoją nazwę usługi, port itp.</p>
<p>Instalacja DB2 to, aktualnie, prościzna. Jeżeli trzymamy się instrukcji i czytamy to co &#8220;mówi&#8221; nam system &#8211; to jesteśmy w domu. &#8220;Tricky&#8221; jest kolejny punkt..</p>
<h3>Instalacja driverów do DB2 dla PHP</h3>
<p>Do połączenia się z DB2 potrzebujemy jakichś driverów. My używamy <a title="PECL PDO_IBM" href="http://pecl.php.net/package/PDO_IBM">PDO_IBM</a>. Dostępny jest także <a title="PECL ibm_db2" href="http://pecl.php.net/package/ibm_db2">ibm_db2</a> który bardziej przypomina zestaw funkcji do MySQL&#8217;a, więc nie bierzemy go nawet pod uwagę (OOP ftw ;-) ).</p>
<p><strong>Bardzo ważne</strong> jest aby zainstalować <a title="PECL PDO_IBM 1.2.5" href="http://pecl.php.net/package/PDO_IBM/1.2.5">PDO_IBM w wersji 1.2.5</a> . Wersje wyższe (podczas pisania tego tekstu dostępne są 1.3.0 i 1.3.1) powodują sporo błędów przy wykonywaniu zapytań.</p>
<p>Kolejną sprawą jest to, że Fedora uparcie twierdzi, że PDO jest zainstalowane gdy próbujemy je zainstalować poprzez PECL&#8217;a. Natomiast gdy próbujemy zainstalować PDO_IBM to twierdzi, że PDO nie widział na serwerze. Tworzy to pewien impas. Jedynym sposobem na przełamanie owego jest ręczna kompilacja sterowników. A oto jak sprawić, by PHP miało PDO oraz PDO_IBM :<br />
<code>pecl download PDO_IBM-1.2.5<br />
tar -xzf PDO_IBM-1.2.5.tgz<br />
cd PDO_IBM-1.2.5<br />
phpize</code><br />
Jeżeli nie mamy phpize, trzeba sobie zainstalować paczkę php-devel poprzez<br />
<code>yum install php-devel.i686</code><br />
Teraz czas na<strong> zapamiętany wyżej katalog</strong>, w którym zostało zainstalowane DB2. Należy go <strong>wstawić w miejsce mojego</strong> <em>/opt/ibm/db2/V9.5/</em> .<br />
<code>./configure --with-pdo-ibm=/opt/ibm/db2/V9.5/<br />
make<br />
make install</code><br />
W tym momencie plik pdo_ibm.so znajduje się w katalogu z extensions do PHP. Teraz należy dodać <em>extension=pdo_ibm.so</em> . W ulubionym edytorze stwórz sobie plik pdo_ibm.ini w katalogu /etc/php.d/ i wpisz tam extension=pdo_ibm.so .</p>
<p>Teraz resecik apache&#8217;a i..<br />
<code>php -m</code><br />
Jeżeli nie ma błędu, a na liście pojawia się pdo_ibm &#8211; to jesteśmy w domu :-)</p>
<h3>Tworzenie bazy danych w DB2</h3>
<p>W necie jest <a title="DB2 Survival Guide" href="http://www.michael-thomas.com/tech/db2/db2_survival_guide.htm">dobry &#8220;survival guide&#8221; dla DB2</a>. Jako, że jest to baza danych z długą historią życiową ma sporo naleciałości niezrozumiałych dla ludzi którzy nigdy nie mieli nic wspólnego z bazą danych tego typu. Jednym z przykładów na &#8220;wtf?&#8221; jest długość nazwy bazy danych. Otóż maksymalna długość nazwy bazy danych to 8 znaków.</p>
<p>Podobną śmiesznością jest &#8220;escapowanie&#8221; stringów. Otóż żeby &#8220;uciec&#8221; znak &#8216; należy go poprzedzić drugim &#8216;. Czyli np.<br />
<code>SELECT ... WHERE name = 'Don''t be stupid!';</code><br />
Żeby dostać się do linii poleceń db2, zakładając, ze właściciel instancji nazywa się <em>db2inst1</em> klepiemy:<br />
<code>su db2inst1<br />
db2</code><br />
W linii poleceń db2 klepiemy:<br />
<code>create database test</code><br />
I mamy już bazę danych ;-)</p>
<h3>Tworzenie bazy danych DB2 nie uwzględniającej wielkości znaków przy sortowaniu ( do czego przyzwyczaja nas każda inna baza w standardzie )</h3>
<p>W DB2 9.7 lub wyższej możemy sprawić, aby silnik nie uwzględniał wielkości liter przy sortowaniu. Aby tak się stało musimy stworzyć bazę z odpowiednim &#8220;collate&#8221;<br />
<code>CREATE DATABASE test<br />
USING CODESET UTF-8 TERRITORY PL<br />
COLLATE USING <strong>UCA500R1_LEN_S2</strong><strong></strong></code></p>
<p><strong></strong><br />
<strong>Ważna sprawa!</strong> Nie można zmienić &#8220;collate&#8221; później. Więc stosujcie to domyślnie przy tworzeniu bazy danych. Pomysł zgapiono z <a title="Making DB2 case-insensitive" href="http://www.ibm.com/developerworks/data/library/techarticle/0203adamache/0203adamache.html">oficjalnego poradnika IBMa dotyczącego DB2</a>.</p>
<h3>Problem z kodowaniem znaków do UTF8</h3>
<p>Jeszcze jeden mały &#8220;pro tip&#8221; który może się przydać, żebyście nie musieli przechodzić przez to co ja. Aby klient zwracał do PHP dane z odpowiednim kodowaniem UTF8 trzeba przelogować się na usera db2inst1 ( su db2inst1 ) i odpalić komendę<br />
<code>db2set db2codepage=1208</code><br />
Miłej zabawy ;-)</p>
<p>A o pytania, instrukcje i sugestie proszę uderzać w komentarze. Nie uważam się za guru Linux&#8217;a ani za guru DB2 &#8211; to co tu opisałem to to do czego udało mi się dojść w ciągu ostatnich 3-4 lat obcowania z tą bazą w połączeniu z PHP.
<div class="fblike_button" style="margin-left: 30px; margin-top: 10px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fzenobius.zeno.pl%2Farchives%2F137%2Fnotka%2Finstalacja-db2-na-linuxie-laczenie-db2-z-php&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
]]></content:encoded>
			<wfw:commentRss>http://zenobius.zeno.pl/archives/137/notka/instalacja-db2-na-linuxie-laczenie-db2-z-php/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

