<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7232873464941003177</id><updated>2011-12-01T03:51:17.083-08:00</updated><category term='apache'/><category term='postgresql'/><category term='MySQL'/><category term='soap'/><category term='testowanie'/><category term='php'/><category term='ppc'/><category term='utf8'/><category term='symfony'/><category term='ubuntu'/><category term='optymalizacja'/><category term='svn'/><category term='humor'/><category term='adwords api'/><category term='apache2'/><title type='text'>Web developer day</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-806449885322812039</id><published>2011-11-03T04:33:00.000-07:00</published><updated>2011-12-01T03:51:17.126-08:00</updated><title type='text'>Cesja domeny w nazwa.pl (NetArt)</title><content type='html'>&lt;b&gt;Poprzedni właściciel&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;W panelu klienta należy wybrać domenę &amp;gt; szczegóły &amp;gt; dane abonenta &amp;gt; cesja domeny (zmiana abonenta)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;W formularzu należy wprowadzić dane &lt;/span&gt;&lt;b style="color: #222222; font-size: 14px;"&gt;nowego właściciela&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;Następnie generowane są wnioski. Są osobne wnioski &lt;/span&gt;&lt;b style="color: #222222; font-size: 14px;"&gt;poprzedniego właściciela&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt; i &lt;/span&gt;&lt;b style="color: #222222; font-size: 14px;"&gt;nowego właściciela&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;. Te dla nowego można przesłać mailem w PDF.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;Pozostałe należy podpisać i dołączyć:&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;ksero dowodu (jeśli domena była rejestrowana &lt;i&gt;prywatnie&lt;/i&gt;) wraz z wymaganą klauzulą (&lt;/span&gt;&lt;em style="color: #222222; font-size: 14px;"&gt;Kserokopia dowodu tożsamości powinna zawierać klauzule: "potwierdzam zgodność z oryginałem", "dokument aktualny na dzień DD.MM.RRRR" oraz podpis.&lt;/em&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;lub zaświadczenie o wpisie do ewidencji oraz zaświadczenie o nadaniu numeru REGON (jeśli domeny były rejestrowane na firmę). -&amp;nbsp;&lt;/span&gt;&lt;em style="color: #222222; font-size: 14px;"&gt;&amp;nbsp;Dokument powinien zawierać klauzulę "potwierdzam zgodność z oryginałem", "dokument aktualny na dzień DD.MM.RRRR" oraz podpis osoby reprezentującej firmę.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;Wnioski wraz z załącznikami należy przesłać pocztą do Netart'u (&lt;/span&gt;&lt;a href="http://nazwa.pl/Kontakt.html" style="font-size: 14px;" target="_blank"&gt;http://nazwa.pl/Kontakt.html&lt;/a&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;&lt;b&gt;Nowy właściciel&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;Otrzymuje wnioski e-mailem od &lt;/span&gt;&lt;b style="color: #222222; font-size: 14px;"&gt;poprzedniego właściciela.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;Podpisuje je i wysyła pocztą do NetArt'u&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;(&lt;/span&gt;&lt;a href="http://nazwa.pl/Kontakt.html" style="font-size: 14px;" target="_blank"&gt;http://nazwa.pl/Kontakt.html&lt;/a&gt;&lt;span class="Apple-style-span" style="color: #222222; font-size: 14px;"&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Mały update: Wszystkie papiery należy wysłać do NetArtu pocztą, &lt;b&gt;nie można faksem&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Kiedy papiery dotrą do Netartu otrzymamy potwierdzenie e-mailem o zmianie abonenta domeny, czyli zostajemy właścicielem domeny. Jednak domena automatycznie nie pojawi sie na koncie nowego właściciela. Aby można było domeną zarządzać należy osobno zainicjować przeniesienie domeny.&lt;br /&gt;Nowy właściciel inicjuje przeniesienie z panelu klienta w &lt;b&gt;Zarządzanie usługami &amp;gt; &amp;nbsp;przenoszenie usług. &lt;/b&gt;W formularzu podajemy nazwe domeny oraz &lt;b&gt;login poprzedniego właściciela.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;Po akcjeptacji przez poprzedniego właściciela domena pojawia sie na naszym koncie.&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px;"&gt;I jeszcze apropos domen, tutaj wpis na blogu apropos cen utrzymania domen:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://danieldryzek.pl/2010/02/15/nie-przeplacaj-za-przedluzenie-waznosci-domen/"&gt;http://danieldryzek.pl/2010/02/15/nie-przeplacaj-za-przedluzenie-waznosci-domen/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-806449885322812039?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/806449885322812039/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2011/11/cesja-domeny-w-nazwapl-netart.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/806449885322812039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/806449885322812039'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2011/11/cesja-domeny-w-nazwapl-netart.html' title='Cesja domeny w nazwa.pl (NetArt)'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-1191031939263131276</id><published>2011-11-03T04:04:00.000-07:00</published><updated>2011-11-05T13:33:46.380-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Jak zrobić i wykonać patcha w subversion</title><content type='html'>Tworzenie patcha w SVN:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;svn diff &gt;bugfix.patch&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Zastosowanie stworzonego patcha:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;svn diff &gt;patch -p0 -i bugfix.patch&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-1191031939263131276?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/1191031939263131276/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2011/11/jak-zrobic-i-wykonac-patcha-w.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/1191031939263131276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/1191031939263131276'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2011/11/jak-zrobic-i-wykonac-patcha-w.html' title='Jak zrobić i wykonać patcha w subversion'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-818587982225382026</id><published>2011-09-17T15:39:00.000-07:00</published><updated>2011-09-17T15:43:53.169-07:00</updated><title type='text'>Zapominanie o dodaniu plików do repozytorium</title><content type='html'>Jest niewiele rzeczy, które tak frustrują jak brak jednego jedynego pliku, którego akurat potrzebujemy do dalszej pracy nad projektem. Zdarza się to często gdy inna osoba z teamu przed commitem nie doda pliku do repozytorium. W takiej sytuacji możemy się spodziewać, że inny developer nie będzie mógł kontynuwoać swojej pracy.&lt;br /&gt;&lt;br /&gt;Przy projektach w symfony czasem zdarza się taka sytuacja, że ktoś dodał nową tabelę do bazy, wygenerował nowe modele i zapomniał o ich dodaniu. Pracując nad tym samym modułem niewiele mogę zrobić... Jeśli to tylko pliki Base* mogę wygenerować brakujące klasy na podstawie schema.yml ale jeśli któraś z klas implementuje metodę stworzoną przez kolegę z zespołu musiałbym ją napisać od nowa. W takiej sytuacji zostaje tylko kontakt z danym developerem, o ile oczywiście jest możliwy...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Jak nie zapominać o dodawaniu plików do repozytorium?&lt;/b&gt;&lt;br /&gt;Jedynym skutecznym sposobem jest dyscyplina w zespole polegająca na tym, że każdy developer przez commitem sprawdza czy nie powinien dołączyć nowych plików.&lt;br /&gt;&lt;br /&gt;Korzystając nawet z samej konsoli i klienta SVN możemy sprawdzić to poprzez komendę:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;  svn st --ignore-externals | grep '^?'&lt;/code&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Samo "svn st" pokazałoby nam wszystkie zmiany. Czasem może być to długa lista, więc czytelniej będzie jeśli ograniczymy ją grepem do nowych plików. Taka lista plików wygląda mniej więcej tak:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;? &amp;nbsp; &amp;nbsp;lib/model/CampaignPeer.php&lt;br /&gt;? &amp;nbsp; &amp;nbsp;lib/model/Campaign.php&lt;br /&gt;? &amp;nbsp; &amp;nbsp;lib/model/om/BaseCampaignPeer.php&lt;br /&gt;? &amp;nbsp; &amp;nbsp;lib/model/om/BaseCampaign.php&lt;br /&gt;? &amp;nbsp; &amp;nbsp;lib/model/map/CampaignMapBuilder.php&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Brakujące pliki dodajemy i sprawdzamy JESZCZE RAZ:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt; svn st --ignore-externals | grep '^?'&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;? &amp;nbsp; &amp;nbsp;lib/model/map/CampaignMapBuilder.php&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Jeśli nadal czegoś brakuje (jak wyżej) to uzupełniamy. W ten sposób unikniemy spowodowania fatal errora u kolegi :)&lt;br /&gt;&lt;br /&gt;Dobrze także przed każdym commitem przejrzeć co "narobiliśmy", do tego także niewiele trzeba. Wystarczy konsola i np &lt;i&gt;kompare&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;svn diff &amp;gt; diff&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;kompare diff&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-818587982225382026?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/818587982225382026/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2011/09/zapominanie-o-dodaniu-plikow-do.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/818587982225382026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/818587982225382026'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2011/09/zapominanie-o-dodaniu-plikow-do.html' title='Zapominanie o dodaniu plików do repozytorium'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-3149548972782431746</id><published>2011-03-21T11:05:00.000-07:00</published><updated>2011-03-21T11:05:48.225-07:00</updated><title type='text'>Wielkanoc tuż tuż</title><content type='html'>Ponieważ Wielkanoc już tuż tuż, a ja nigdy nie wiem kiedy te święta przypadają i jak planować urlop itp postanowiłem utrwalić tę informację na stronie internetowej. Także jakby co datę można zawsze spradzić na &lt;a href="http://easterdate.net/"&gt;easterdate.net&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-3149548972782431746?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/3149548972782431746/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2011/03/wielkanoc-tuz-tuz.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/3149548972782431746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/3149548972782431746'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2011/03/wielkanoc-tuz-tuz.html' title='Wielkanoc tuż tuż'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-8677007920516315617</id><published>2011-03-10T07:21:00.000-08:00</published><updated>2011-11-05T13:27:26.575-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Instalacja xls2csv w wersji 1.06 na Ubuntu</title><content type='html'>Instrukcja instalacji xls2csv w wersji 1.06 na Ubuntu.&lt;br /&gt;&lt;a href="http://software.krimnet.com/xls/guide-converting-xls-files-csv-with-xls2csv-ubuntu.htm"&gt;http://software.krimnet.com/xls/guide-converting-xls-files-csv-with-xls2csv-ubuntu.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jest tam jeden błąd, 8 komenda w CPAN powinna być:&lt;br /&gt;&lt;code&gt;install Text::CSV_XS&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;zamiast:&lt;br /&gt;&lt;code&gt;install Test::CSV_XS&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-8677007920516315617?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/8677007920516315617/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2011/03/instalacja-xls2csv-w-wersji-106-na.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/8677007920516315617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/8677007920516315617'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2011/03/instalacja-xls2csv-w-wersji-106-na.html' title='Instalacja xls2csv w wersji 1.06 na Ubuntu'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-2295154244974356196</id><published>2010-07-21T01:28:00.000-07:00</published><updated>2011-02-11T02:05:54.802-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Optymalizacja LAMP</title><content type='html'>Świetny artykuł dla początkujących osób zmagających się z optymalizacją serwisów działających na serwerach Apache2.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html"&gt;http://onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Autor zwraca uwagę na zużycie pamięci procesów apache i podaje propozycje rozwiązania problemu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-2295154244974356196?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/2295154244974356196/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2010/07/optymalizacja-lamp.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/2295154244974356196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/2295154244974356196'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2010/07/optymalizacja-lamp.html' title='Optymalizacja LAMP'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-126669850906413099</id><published>2009-08-19T06:09:00.000-07:00</published><updated>2011-11-05T13:26:44.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adwords api'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>AdWords API v2009 w PHP5 - część 1</title><content type='html'>Od release nowej wersji API minęło już parę miesięcy. Dopiero niedawno miałem okazję bliżej się temu przyjrzeć i trochę pokodować.&lt;br /&gt;Nowa wersja znacznie różni się od poprzednich. Wygląda na to, że będziemy mieli więcej serwisów, w każdym serwisie tylko 2 metody. Np CampaignService w wersji 13 udostępniał szereg metod:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;addCampaign&lt;/li&gt;&lt;li&gt;addCampaignList&lt;/li&gt;&lt;li&gt;getCampaign&lt;/li&gt;&lt;li&gt;getCampaignList&lt;/li&gt;&lt;li&gt;getCampaignStats&lt;/li&gt;&lt;li&gt;updateCampaign&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;W nowej wersji API V2009 wszystkie te metody zostały zastąpione dwoma - &lt;span style="font-style: italic; font-weight: bold;"&gt;get &lt;/span&gt;i &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;mutate&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;Metoda &lt;span style="font-style: italic; font-weight: bold;"&gt;get &lt;/span&gt;zastępuje w zasadzie wszystkie metody z wersji 13 zaczynające się od get.... &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;Mutate&lt;/span&gt;&lt;/span&gt; zastępuje metody add oraz update.&lt;br /&gt;&lt;br /&gt;Metodą &lt;span style="font-style: italic; font-weight: bold;"&gt;get&lt;/span&gt; możemy pobrać zarówno dane kampanii jak i jej statystyki. Jako parametr metody podajemy &lt;span style="font-style: italic;"&gt;CampaignSelector&lt;/span&gt;, w którym to możemy zdefiniować o jakie kampanie i jakie dane nam chodzi. Np wybieramy tylko kampanie o statusie "ACTIVE" albo ID mieszczącym się w zbiorze 1,2,3,4,5.&lt;br /&gt;&lt;br /&gt;Zanim przejdziemy do przykładu, najpierw kilka rzeczy które musimy mieć aby skorzystać z API:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="https://www.google.com/accounts/NewAccount?continue=http%3A%2F%2Fwww.google.com%2F&amp;amp;hl=en"&gt;Konto Google&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/adwords/v2009/docs/headers.html"&gt;Auth Token&lt;/a&gt; (autoryzacja była inaczej rozwiązana w v13)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Zainicjalizowane konto &lt;a href="http://code.google.com/apis/adwords/docs/developer/adwords_api_sandbox.html"&gt;adwords sandbox&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Przykłady zapytań do AdWords API v2009 możemy znaleźć na &lt;a href="http://code.google.com/p/adwords-api-php-samples/"&gt;Google Code&lt;/a&gt;. Zawarte tam przykłady korzystają z biblioteki nusoap i są to raczej "klejone z ręki" xmle.&lt;br /&gt;W moim przykładzie korzystam z rozszerzenia &lt;a href="http://pl2.php.net/manual/en/book.soap.php"&gt;php5-soap&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Dane do nagłówka/autoryzacji:&lt;br /&gt;&lt;code&gt;$headers = array (&lt;br /&gt;'authToken' =&amp;gt; 'xxxxxxxxxxx',&lt;br /&gt;'clientEmail' =&amp;gt; 'client_1+webdevday.sandbox@gmail.com',&lt;br /&gt;'userAgent' =&amp;gt; 'webdevday',&lt;br /&gt;'developerToken' =&amp;gt; 'webdevday.sandbox@gmail.com++EUR',&lt;br /&gt;'applicationToken' =&amp;gt; 'token',&lt;br /&gt;);&lt;/code&gt;Inicjalizacja klienta i header:&lt;br /&gt;&lt;code&gt;$ns = 'https://adwords.google.com/api/adwords/cm/v200906';&lt;br /&gt;$service = 'https://adwords-sandbox.google.com/api/adwords/cm/v200906/CampaignService';&lt;br /&gt;&lt;br /&gt;$client = new SoapClient($service .'?wsdl', array('trace' =&amp;gt; true, 'connection_timeout' =&amp;gt; 60, 'exceptions' =&amp;gt; 1));&lt;br /&gt;&lt;br /&gt;$soapHeaders = array(new SOAPHeader($ns, 'RequestHeader', $headers));&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Przykład zapytania - odpowiednik metody getAllAdWordsCampaigns()  z wersji 13:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$selector = array('ids' =&amp;gt; array());&lt;br /&gt;$params = array('selector' =&amp;gt; $selector);&lt;br /&gt;$method = 'get';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;$response = $client-&amp;gt;__soapCall($method, array($params), null, $soapHeaders);&lt;br /&gt;} catch (Exception $e)&lt;br /&gt;{&lt;br /&gt;var_dump($e-&amp;gt;getMessage());&lt;br /&gt;var_dump($client-&amp;gt;__getLastRequest());&lt;br /&gt;var_dump($client-&amp;gt;__getLastResponse());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var_dump($response);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-126669850906413099?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/126669850906413099/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2009/08/adwords-api-v2009-w-php5.html#comment-form' title='Komentarze (3)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/126669850906413099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/126669850906413099'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2009/08/adwords-api-v2009-w-php5.html' title='AdWords API v2009 w PHP5 - część 1'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-6630879984958318739</id><published>2009-06-23T05:07:00.000-07:00</published><updated>2011-11-05T13:28:28.344-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Postgresql i unix time (epoch)</title><content type='html'>Funkcją &lt;span style="font-style:italic;"&gt;abstime&lt;/span&gt; możemy w łatwy sposób przekonwertować datę w formacie unix time (epoch). Np.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db=# select abstime(1245535200);&lt;br /&gt;        abstime         &lt;br /&gt;------------------------&lt;br /&gt; 2009-06-21 00:00:00+02&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Możemy też użyć nazwy kolumny;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;db=# select abstime(time), * from events;&lt;br /&gt;        abstime          |  city   &lt;br /&gt;-------------------------|---------&lt;br /&gt; 2009-06-21 00:00:00+02  | krakow  &lt;br /&gt;(1 row)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;W drugą stronę jest trochę więcej pisania:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;db=# select extract(epoch from timestamp '2009-06-21');&lt;br /&gt; date_part  &lt;br /&gt;------------&lt;br /&gt; 1245535200&lt;br /&gt;(1 row)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Przy użyciu tych funkcji możemy manipulować danymi zmieniając unix time na datę i odwrotnie. Mam nadzieję, że komuś się przyda.&lt;br /&gt;&lt;br /&gt;Funkcje date/time dla postgresqla są na &lt;a href="http://www.postgresql.org/docs/8.3/interactive/functions-datetime.html"&gt;http://www.postgresql.org/docs/8.3/interactive/functions-datetime.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-6630879984958318739?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/6630879984958318739/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2009/06/postgresql-i-unix-time-epoch.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/6630879984958318739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/6630879984958318739'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2009/06/postgresql-i-unix-time-epoch.html' title='Postgresql i unix time (epoch)'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-181607597223540669</id><published>2009-04-01T05:17:00.000-07:00</published><updated>2009-04-01T05:19:29.040-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='ppc'/><title type='text'>Polak potrafi, adwords</title><content type='html'>Jak widać na poniższym obrazku, terms&amp;conditions Google AdWords da się przeskoczyć. W każdym razie Polak potrafi.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_N77eSLcEYdE/SdNbvvpGQ-I/AAAAAAAAAA8/g390RZC_xEs/s1600-h/adswords.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 171px;" src="http://2.bp.blogspot.com/_N77eSLcEYdE/SdNbvvpGQ-I/AAAAAAAAAA8/g390RZC_xEs/s320/adswords.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5319696460655510498" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-181607597223540669?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/181607597223540669/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2009/04/polak-potrafi-adwords.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/181607597223540669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/181607597223540669'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2009/04/polak-potrafi-adwords.html' title='Polak potrafi, adwords'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_N77eSLcEYdE/SdNbvvpGQ-I/AAAAAAAAAA8/g390RZC_xEs/s72-c/adswords.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-7214918992355436230</id><published>2009-02-25T02:43:00.000-08:00</published><updated>2011-02-11T02:03:48.143-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>Staregacie.pl</title><content type='html'>Przy okazji jednej z głupkowatych rozmów na gg padło hasło zakupu domeny staregacie.pl. Po wpisaniu domeny w przeglądarkę poważnie się zdziwiłem. Oczywiście nie tym, że domena jest zajęta, spodziewałem się czegoś w rodzaju spierdalaj.pl lub jakiejś xxx strony dla fetyszów, ewentualnie sklepu z bielizną, ale to co zobaczyłem przebiło wszystko z czym miałem dotychczas do czynienia. &lt;br /&gt;Spokojnie nie ma tam żadnych obrzydliwości, treści pornograficznych czy czegoś w tym rodzaju. Wręcz przeciwnie, domena przekierowuje na stronę firmy NIVEA do oferty produktów linii Energy Fresh.&lt;br /&gt;&lt;br /&gt;No coż od dziasiaj możemy odwiedzać stronę nivea za pomocą &lt;a href="http://staregacie.pl/"&gt;http://staregacie.pl/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-7214918992355436230?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/7214918992355436230/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2009/02/staregaciepl.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/7214918992355436230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/7214918992355436230'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2009/02/staregaciepl.html' title='Staregacie.pl'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-2758540657538172157</id><published>2008-11-27T03:12:00.000-08:00</published><updated>2011-11-05T13:32:39.911-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optymalizacja'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Operatory post i pre-increment w PHP</title><content type='html'>Na pierwszy rzut oka prawie nie ma roznicy:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;$i = 0;&lt;br /&gt;while ($i &lt; 1000000)&lt;br /&gt;{&lt;br /&gt;    $i++;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;czy:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;$i = 0;&lt;br /&gt;while ($i &lt; 1000000)&lt;br /&gt;{&lt;br /&gt;    ++$i;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;W każdym razie wynik będzie ten sam. A jednak różnica w implementacji obu operatorów jest spora. W pierwszym przykładzie użyłem operatora post-increment, który dodaje do 1 do zmiennej $i po wykonaniu lini kodu. W drugim przypadku 1 jest dodawane przed wykonaniem lini kodu. &lt;br /&gt;W większości zastosowań nie ma to znaczenia, jednak przy dużej ilości takich operacji może mieć znaczący wpływ na wydajność naszej aplikacji. A co za tym idzie, zużycie czasu procesora, energii, efekt cieplarniany ;)&lt;br /&gt;Dzieje się tak, ponieważ aby wykonać $i++ jest konieczne wykonanie kopii zmiennej. Czyli w efekcie mamy "dwie" zmienne $i. Jedna przechowuje poprzednią wartość a druga przechowuje wartość po dodaniu jedynki. &lt;br /&gt;Zrobiłem pare testów szybkości na powyższym kodzie. Czas wykonania pętli z zastosowaniem $i++ jest o 10% większy niż wykonanie tej samej pętli z zastosowaniem ++$i.&lt;br /&gt;Warto na takie sprawy zwracać uwagę, szczególnie w projektach w których przetwarzamy duże ilości danych.&lt;br /&gt;&lt;br /&gt;W następnych postach postaram się opisać trochę więcej zagadnień związanych z wydajnością oraz optymalizacją kodu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-2758540657538172157?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/2758540657538172157/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2008/11/operatory-post-i-pre-increment-w-php.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/2758540657538172157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/2758540657538172157'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2008/11/operatory-post-i-pre-increment-w-php.html' title='Operatory post i pre-increment w PHP'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-4375166070379075444</id><published>2008-11-03T15:48:00.000-08:00</published><updated>2011-02-11T02:05:04.647-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testowanie'/><title type='text'>Continuous integration - Bitten</title><content type='html'>Pisanie testów (unit testów, testów funkcjonalnych, selenium) stało się integralną częścią większości projektów. Jednak uruchamianie dużej liczby testów może zajmować sporo czasu. Ponadto jeżeli nad projektem pracuje kilku programistów może pojawić się typowy problem, że u kogoś działa a u kogoś innego nie. Warto więc stworzyć środowisko testowe, na którym testy będą uruchamiane automatycznie. &lt;br /&gt;Jeżeli korzystasz z Traca i Subversion możesz skorzystać z Bittena (http://bitten.edgewall.org/).&lt;br /&gt;Poprzez zdefiniowane regułki Bitten aktualizuje kod w środowisku testowym (svn update), uruchomia skrypty migracji bazy, konfiguracji oraz uruchamia testy.&lt;br /&gt;Procedura jest uruchamiana przy każdej zmianie kodu a raport jest dostępny poprzez Traca (&lt;a href="http://bitten.edgewall.org/build/trunk"&gt;http://bitten.edgewall.org/build/trunk&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-4375166070379075444?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/4375166070379075444/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2008/11/continuous-integration-bitten.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/4375166070379075444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/4375166070379075444'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2008/11/continuous-integration-bitten.html' title='Continuous integration - Bitten'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-766280577716581555</id><published>2008-09-01T06:01:00.000-07:00</published><updated>2011-02-11T02:04:14.362-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><title type='text'>Struktura drzewa w Symfony</title><content type='html'>Na devzone (&lt;a href="http://dev.mysql.com/tech-resources/articles/hierarchical-data.html"&gt;http://dev.mysql.com/tech-resources/articles/hierarchical-data.html&lt;/a&gt;) MySQLa znajduje się artykuł o tworzeniu hierarchicznych struktur danych. Popularnym zastosowaniem takiej struktury jest menu strony internetowej, gdzie mamy do czynienia z drzewem linków (kategorii). &lt;br /&gt;W artykule omówione są dwa podejścia &lt;span style="font-weight: bold;"&gt;Adjacency List Model&lt;/span&gt; i &lt;span style="font-weight: bold;"&gt;Nested Set&lt;/span&gt;. Pierwsze doskonale sprawdza się w przypadku 2, no góra trzech zagnieżdżeć ale jest łatwiejsze do zaimplementowania. Nested Set sprawdza się gdy chcemy jednym zapytaniem pobrać całe drzewo lub całą ścieżkę.&lt;br /&gt;&lt;br /&gt;Jeżeli chcemy skorzystać z Nested Net w projekcie opartym o symfony, należy w strukturze danych (schema.yml), ktore kolumny zawierają TREE_LEFT, TREE_RIGHT, TREE_SCOPE, np:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;categories:&lt;br /&gt;_attributes: { phpName: Category, treeMode: NestedSet}&lt;br /&gt;id:          ~ #symfony default&lt;br /&gt;lft:         { type: integer, required: true, &lt;br /&gt;nestedSetLeftKey: true, phpName: Left }&lt;br /&gt;rgt:         { type: integer, required: true, &lt;br /&gt;nestedSetRightKey: true, phpName: Right }&lt;br /&gt;level:       { type: integer, required: true }&lt;br /&gt;name:        { type: varchar(100), required: true }&lt;br /&gt;photo:       { type: varchar(255) }&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Nested Set jest dostępny dopiero od ostatniej wersji propela 1.3. W symfony 1.1 musimy zainstalowac plugin Propel 1.3 z repozytorium http://svn.symfony-project.com/plugins/sfPropelPlugin/branches/1.3 &lt;br /&gt;Z moich dotychczasowych doświadczeń mogę powiedzieć, że rozwiązanie nie jest jeszcze w pełni stabilne. W przypadku modyfikacji, przenoszenia gałęzi czasem gubiona jest struktura.&lt;br /&gt;&lt;br /&gt;Innym rozwiązaniem dla symfony jest plugin &lt;a href="http://www.symfony-project.org/plugins/sfPropelActAsNestedSetBehaviorPlugin"&gt;sfPropelActAsNestedSetBehaviorPlugin&lt;/a&gt;. Ten plugin zdaje się być w pełni stabilny. Z kolei nie bedzie w pełni działał pod Propelem 1.3.&lt;br /&gt;&lt;br /&gt;Podsumowując, zarówno dla symfony 1.0, jak i dla symfony 1.1 polecam sfPropelActAsNestedSetBehaviorPlugin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-766280577716581555?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/766280577716581555/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2008/09/nested-set-vs-parentid.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/766280577716581555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/766280577716581555'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2008/09/nested-set-vs-parentid.html' title='Struktura drzewa w Symfony'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-3469593879388904941</id><published>2008-08-28T05:17:00.000-07:00</published><updated>2008-08-28T11:22:22.019-07:00</updated><title type='text'>Poruszające i takie prawdziwe (Hug a developer)</title><content type='html'>&lt;a href="http://develop-one.net/blog/2008/08/27/HugADeveloper.aspx"&gt;http://develop-one.net/blog/2008/08/27/HugADeveloper.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-3469593879388904941?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/3469593879388904941/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2008/08/poruszajce-i-takie-prawdziwe.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/3469593879388904941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/3469593879388904941'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2008/08/poruszajce-i-takie-prawdziwe.html' title='Poruszające i takie prawdziwe (Hug a developer)'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-8984782334518400919</id><published>2008-08-20T06:07:00.000-07:00</published><updated>2011-02-11T02:04:01.232-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache2'/><title type='text'>Could not reliably determine the server's fully qualified domain name</title><content type='html'>&lt;blockquote&gt;apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName&lt;/blockquote&gt;&lt;br /&gt;Zapewne taki notice widział niemal każdy. Ja się z nim spotykam prawie zawsze kiedy przychodzi do firmy nowy Junior Developer, który używa Ubuntu/Kubuntu. Oczywiście komunikat w niczym nie przeszkadza, nie zakłóca działania Apacha, ale po co.. skoro można go w bardzo prosty sposób usunąć.&lt;br /&gt;&lt;br /&gt;Wystarczy dodać linię w pliku apache2.conf (jeżeli używasz linuxa powinien się znajdować gdzieś w /etc/apache2/apache2.conf lub /usr/local/apache2/...):&lt;br /&gt;&lt;blockquote&gt;sudo vim /etc/apache2/apache2.conf&lt;br /&gt;ServerName localhost&lt;/blockquote&gt;&lt;br /&gt;Można ustawić dowolną nazwę serwera (np ServerName blabla) ale w tym wypadku należy "domenę" blabla dodać do pliku hosts (/etc/hosts).&lt;br /&gt;&lt;blockquote&gt;sudo vim /etc/hosts&lt;br /&gt;127.0.0.1    blabla&lt;/blockquote&gt;&lt;br /&gt;Po restarcie Apacha (sudo /etc/init.d/apache2 restart) już nie ujrzymy komunikatu, a także możemy korzystać z domeny http://blabla/ w przeglądarce.&lt;br /&gt;&lt;br /&gt;Warto przy okazji dodać, że dawno dawno temu plik hosts był jedyną formą systemu DNS jaką posługiwali się użytkownicy internetu. Przesyłano sobie plik z komputera na komputer, dzięki temu można było wpisywać w przeglądarkę nazę zamiast numeru IP. Nietrudno sobie wyobrazić do jakich rozmiarów musiał dochodził taki plik :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-8984782334518400919?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/8984782334518400919/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2008/08/could-not-reliably-determine-servers.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/8984782334518400919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/8984782334518400919'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2008/08/could-not-reliably-determine-servers.html' title='Could not reliably determine the server&apos;s fully qualified domain name'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-471709296212757178</id><published>2008-08-20T06:06:00.000-07:00</published><updated>2011-02-11T02:02:23.430-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><title type='text'>Symfony, propel, struktura bazy danych, unikalne kolumny</title><content type='html'>Definiowanie unikalnych kolumn, to w zasadzie dodanie 2 linii w pliku &lt;span style="font-weight: bold;"&gt;schema.yml&lt;/span&gt; (schema.yml to plik, w którym definiujemy strukturę bazy w projektach opartych na Propelu / Symfony).&lt;br /&gt;&lt;br /&gt;Mamy tabelę &lt;span style="font-weight: bold;"&gt;books&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;books:&lt;br /&gt;_attributes:       { phpName: Book }&lt;br /&gt;id:                ~ #symfony default&lt;br /&gt;title:             { type: varchar(255) }&lt;br /&gt;ISBN:              { type: varchar(255) }&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Chcemy teraz, aby nasza tabela nie zawierała duplikatów. Dla przykładu książek o tym samym numerze ISBN.&lt;br /&gt;&lt;br /&gt;W tym celu dodajemy atrybut &lt;span style="font-weight: bold;"&gt;_uniques&lt;/span&gt; a następnie podajemy nazwę klucza &lt;span style="font-weight: bold;"&gt;books_unique_isbn&lt;/span&gt; oraz nazwę kolumny (lub po przecinku kolumn). W efekcie nowa definicja tabeli &lt;span style="font-weight: bold;"&gt;books&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;books:&lt;br /&gt;_attributes:        { phpName: Book }&lt;br /&gt;id:                 ~ #symfony default&lt;br /&gt;title:              { type: varchar(255) }&lt;br /&gt;ISBN:               { type: varchar(255) }&lt;br /&gt;_uniques:&lt;br /&gt;books_unique_isbn: [ISBN]&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Jeżeli chcemy aby 2 lub więcej kolumn tworzyło klucz unikalny podajemy ich nazwy rozdzielone przecinkami, np:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;books_unique:    [ISBN, title]&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-471709296212757178?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/471709296212757178/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2008/08/symfony-propel-struktura-bazy-danych.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/471709296212757178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/471709296212757178'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2008/08/symfony-propel-struktura-bazy-danych.html' title='Symfony, propel, struktura bazy danych, unikalne kolumny'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7232873464941003177.post-2244860154383684324</id><published>2008-08-20T06:03:00.000-07:00</published><updated>2011-02-11T02:02:59.759-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='utf8'/><title type='text'>Jak założyć nowego użytkownika MySQL przez konsole?</title><content type='html'>Umieszczam małą ściągę pt. Jak założyć nową bazę mysql i użytkownika, który będzie miał pełne prawa dostępu do tej bazy (create table, drop table, delete, update etc). Użytkownik ten jednak nie może mieć prawa nawet odczytu z innych baz na serwerze MySQLa.&lt;br /&gt;&lt;br /&gt;Załóżmy, że projekt nazywa się owidiusz. Najpierw zakładam bazę:&lt;br /&gt;&lt;blockquote&gt;create database owidiusz;&lt;/blockquote&gt;&lt;br /&gt;Jeżeli ta baza będzie przechowywać dane w kodowaniu UTF8, dodajemy:&lt;br /&gt;&lt;blockquote&gt;create database owidiusz character set utf8 collate utf8_polish_ci;&lt;/blockquote&gt;&lt;br /&gt;(collate pozwala na poprawne sortowanie poslkich znaków!)&lt;br /&gt;&lt;br /&gt;Następnie uzytkownika, nadajemy mu od razu hasło:&lt;br /&gt;&lt;blockquote&gt;create user owidiusz identified by 'owidiusz123';&lt;/blockquote&gt;&lt;br /&gt;Nadajemy uprawnienia do bazy:&lt;br /&gt;&lt;blockquote&gt;GRANT ALL PRIVILEGES ON owidiusz.* TO 'owidiusz'@'localhost';&lt;/blockquote&gt;&lt;br /&gt;I odświeżamy uprawnienia:&lt;br /&gt;&lt;blockquote&gt;flush privileges;&lt;/blockquote&gt;&lt;br /&gt;I to wszystko :), można korzystać z bazy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7232873464941003177-2244860154383684324?l=webdevday.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://webdevday.blogspot.com/feeds/2244860154383684324/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://webdevday.blogspot.com/2008/08/jak-zaoy-nowego-uytkownika-mysql-przez.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/2244860154383684324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7232873464941003177/posts/default/2244860154383684324'/><link rel='alternate' type='text/html' href='http://webdevday.blogspot.com/2008/08/jak-zaoy-nowego-uytkownika-mysql-przez.html' title='Jak założyć nowego użytkownika MySQL przez konsole?'/><author><name>webdev</name><uri>http://www.blogger.com/profile/01264422049702731905</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
