<?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>Kacper Gunia</title>
	<atom:link href="http://blog.cakper.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.cakper.net</link>
	<description></description>
	<lastBuildDate>Sat, 10 Dec 2011 11:07:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Nigdy nie ufaj PHP</title>
		<link>http://blog.cakper.net/157-nigdy-nie-ufaj-php/</link>
		<comments>http://blog.cakper.net/157-nigdy-nie-ufaj-php/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 11:06:34 +0000</pubDate>
		<dc:creator>cakper</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[FuckUP]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.cakper.net/?p=157</guid>
		<description><![CDATA[Tytuł jest przewrotny, ale kiedyś w trakcie nauki PHP znalazłem w taki fragment kodu: echo \intval((0.1+0.7)*10); // int(7) a potem o nim zapomniałem ;) I o ile jestem w stanie zrozumieć, że powyższy kod zwraca zamiast 8 liczbę 7, to &#8230; <a href="http://blog.cakper.net/157-nigdy-nie-ufaj-php/">Czytaj dalej...</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Tytuł jest przewrotny, ale kiedyś w trakcie nauki PHP znalazłem w taki fragment kodu:</p>
<pre>echo \intval((0.1+0.7)*10); // int(7)</pre>
<p style="text-align: justify;">a potem o nim zapomniałem ;) I o ile jestem w stanie zrozumieć, że powyższy kod zwraca <strong>zamiast 8 liczbę 7</strong>, to wiedza i pamięć o tym jest krytycznie ważna w trakcie wykonywania obliczeń arytmetycznych.<span id="more-157"></span></p>
<p style="text-align: justify;">Z czego wynika powyższy <em>błąd</em> wyjaśnia dokumentacja PHP: reprezentacja tej liczby w pamięci po wykonaniu dodawania i mnożenia to 7<em>.9999999999999991118… </em>a proste rzutowanie jej na Integera zwraca nam 7 (operator (int) oraz funkcja \intval() dają zgodnie z oczekiwaniami tylko całkowitą część liczby).</p>
<p style="text-align: justify;">Rozwiązań powyższego problemu znalazłem kilka, jedne mniej eleganckie, drugie bardziej, a problem sam w sobie wyniknął podczas obliczania liczby groszy (czy też innej ułamkowej części dowolnej waluty) w mojej pracy inżynierskiej. Wypłynął on na etapie implementacji tylko i wyłącznie dzięki <strong><acronym title="Test Driven Development">TDD</acronym></strong> i znając życie pewnie sam bym takiego małego błędu w obliczeniach bez testów nigdy nie zauważył :)</p>
<h2 style="text-align: justify;">Rozwiązanie 1 — praca na Integerach</h2>
<pre>echo \intval((0.1*10) + (0.7*10)); // int(8)</pre>
<p style="text-align: justify;">Jest to bardzo pewna metoda (pod względem dokładności) — przed dokonaniem jakichkolwiek obliczeń na liczbach zmiennoprzecinkowych przemnażamy je przez tą potęgę 10 jakiej dokładność obliczeń nas interesuje i działamy :) Minusy rozwiązania:</p>
<ul style="text-align: justify;">
<li>konieczność przemnożenia każdej z liczb przed wykonaniem operacji arytmetycznych</li>
<li>ograniczona możliwość wykonywania obliczeń (w zasadzie tylko dodawanie / odejmowanie / mnożenie i operacje „pochodne” )</li>
</ul>
<h2 style="text-align: justify;">Rozwiązanie 2 — funkcja \round()</h2>
<pre>echo \intval(\round((0.1+0.7)*10, 0)); // int(8)</pre>
<p style="text-align: justify;">Rozwiązanie stosowane przeze mnie — jest najszybsze (obliczeniowo), przy operacjach wykonywanych w moim kodzie (dość mało miejsc dziesiętnych) chyba najbardziej uzasadnione no i przy tym wszystkim dość eleganckie.</p>
<h2 style="text-align: justify;">Rozwiązanie 3 — rzutowanie na stringa</h2>
<pre>echo \intval(\strval((0.1+0.7)*10)); // int(8)</pre>
<p style="text-align: justify;">Rozwiązanie wolniejsze od poprzedniego, a sam pomysł (ręcznego) rzutowania liczby do ciągu tekstowego i później ponownie do liczby jakoś mnie nie przekonuje. No ale jest i w razie potrzeby można użyć. Rozwinięcie tej idei znajdziecie poniżej.</p>
<h2 style="text-align: justify;">Rozwiązanie 4 — <a href="http://www.php.net/manual/en/intro.bc.php">BC Math</a></h2>
<pre>echo \intval(\bcmul(\bcadd(0.1, 0.7, 1), 10); // int(8)</pre>
<p style="text-align: justify;">Zdecydowanie najwolniejsza opcja ze wszystkich, jednak dająca największą dokładność obliczeń. Natywne rozwiązanie PHP pobierające, wykonujące obliczenia i zwracające liczby jako stringi. Duże dokładne i wolne, ale w krytycznych przypadkach nie ma innego wyjścia :)</p>
<h2 style="text-align: justify;">Podsumowanie</h2>
<p style="text-align: justify;">To chyba tyle moich rozterek z dokładnością liczb zmiennoprzecinkowych w PHP, ale na koniec mam jeszcze jedną uwagę :) Fakt, że napisałem, że któreś rozwiązań jest szybsze, a któreś wolniejsze nie powinien rzutować na decyzję o jego wyborze ;) No chyba, że macie do wykonania setki tysięcy obliczeń, w innym przypadku na pewno znajdzie się kilka innych miejsc które można przyśpieszyć. Powodzenia! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakper.net/157-nigdy-nie-ufaj-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pobieranie dokumentów MongoDB poprzez @ParamConveter</title>
		<link>http://blog.cakper.net/3-pobieranie-dokumentow-mongodb-poprzez-paramconveter/</link>
		<comments>http://blog.cakper.net/3-pobieranie-dokumentow-mongodb-poprzez-paramconveter/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 09:19:17 +0000</pubDate>
		<dc:creator>cakper</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[ODM]]></category>

		<guid isPermaLink="false">http://blog.cakper.net/?p=3</guid>
		<description><![CDATA[Symfony2 w swojej standardowej dystrybucji posiada zainstalowaną i skonfigurowaną paczkę SensioFrameworkExtraBundle. Dorzuca ona do Symfony kilka wygodnych anotacji adnotacji, dzięki którym bezpośrednio w przypisach kontrolera możemy definiować Routing, Cache, Szablon widoku oraz konwertować parametry routera na encje bazy danych przy &#8230; <a href="http://blog.cakper.net/3-pobieranie-dokumentow-mongodb-poprzez-paramconveter/">Czytaj dalej...</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><strong>Symfony2</strong> w swojej standardowej dystrybucji posiada zainstalowaną i skonfigurowaną paczkę <a href="http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/index.html">SensioFrameworkExtraBundle</a>. Dorzuca ona do Symfony kilka wygodnych <del>anotacji</del> adnotacji, dzięki którym bezpośrednio w przypisach kontrolera możemy definiować Routing, Cache, Szablon widoku oraz konwertować parametry routera na encje bazy danych przy pomocy <a href="http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html"><strong>@ParamConverte</strong>r</a>.<span id="more-3"></span></p>
<p style="text-align: justify;">Podczas pisania <a href="http://twitter.com/#!/cakper/media/slideshow?url=http%3A%2F%2Ftwitpic.com%2F79inii">bundla Notyfikacji dla Symfony2</a> stwierdziłem, że skorzystam z tego mechanizmu do pobierania danych z MongoDB. Szybki research pokazał mi, że <a href="https://github.com/sensio/SensioFrameworkExtraBundle/commits/master/Request/ParamConverter/DoctrineParamConverter.php">kiedyś była taka możliwość</a>, jednak jeszcze przed wydaniem SF2 Fabien wyrzucił tą funkcjonalność kosztem możliwości skonfigurowania własnego Entity Managera, z którego jest pobierany obiekt Doctrine ORM.</p>
<p style="text-align: justify;">Pozostało mi nic innego jak zgodnie z sugestią napisać swój <strong>własny @ParamConverter</strong> i skonfigurować jego serwis w odpowiedni sposób. I nie było by w tym nic super trudnego gdyby nie fakt, że prawdopodobnie znalazłem <em>błąd w samym frameworku</em>, który powodował globalne przerwanie procesu konwersji w przypadku nieznalezienia „Entity namespace alias”, a przecież w moim konkretnym przypadku chciałem skorzystać z Document Managera i co mnie obchodzi, że akurat w tym bundlu nie ma zdefiniowanych encji? ;)</p>
<p style="text-align: justify;">Po odpaleniu XDebuga i przebrnięciu przez część kodu Symfony (IHMO to bardzo rozwijające!) znalazłem winowajcę, którym okazał się plik i linijka:</p>
<pre style="text-align: justify;">SensioFrameworkExtraBundle/Request/ParamConverter/DoctrineParamConverter.php</pre>
<pre style="text-align: justify;">$this-&gt;registry-&gt;getEntityManager($options['entity_manager'])-&gt;getClassMetadata($configuration-&gt;getClass());</pre>
<p style="text-align: justify;">Szybki przegląd dokumentacji i wniosek — metoda <em><strong>supports(ConfigurationInterface $configuration)</strong></em> zadeklarowana w <strong><em>ParamConverterInterface</em></strong>, której definicja była odpowiedzialna za wywołanie powyższej linii kodu powinna zwracać <em>True</em> w przypadku gdy jest w stanie skonwertować podane parametry na Encję, a <em>False</em> gdy nie, żadnej mowy o wyjątku nie nie ma toteż i fix był szybki:</p>
<pre style="text-align: justify;"> // Doctrine Entity?
 try {
     $this-&gt;registry-&gt;getEntityManager($options['entity_manager'])-&gt;getClassMetadata($configuration-&gt;getClass());

     return true;
 } catch (MappingException $e) {
     return false;
 } catch (ORMException $e) {
     return false;
 }</pre>
<p style="text-align: justify;">Po tym wszystkim napisanie własnego <a href="https://github.com/cakper/SensioFrameworkExtraBundle/blob/master/Request/ParamConverter/DoctrineMongoDBParamConverter.php">DoctrineMongoDBParamConvertera</a> na podstawie konwertera ORM było przyjemnością, a jego kod jest na GitHubie. Naniesione przeze mnie zmiany i dodane funkcjonalności poszły jako <a href="https://github.com/sensio/SensioFrameworkExtraBundle/pull/67">Pull Request</a> do oryginalnego bundla i być może w przyszłości będą jego częścią. Ci, którzy chcieliby z tej funkcjonalności skorzystać już teraz mogą pobrać <a href="https://github.com/cakper/SensioFrameworkExtraBundle">mojego forka na GitHubie</a> i podmienić z oryginalnym w pliku deps, bądź zwinąć kod konwetera, napisać swoją definicję serwisu bazując na <a href="https://github.com/cakper/SensioFrameworkExtraBundle/commit/548a458fecea3467070b592f229e183bb409b6a6">dostarczonej przeze mnie</a> i korzystać gdziekolwiek ;)</p>
<p style="text-align: justify;">Dodatkowo napisany przeze mnie konwerter sprawdza czy w adnotacji jest ustawiona opcja ’document_manager’ i jeśli tak, to korzysta z tego podanego, a nie z opcji defaultowej.</p>
<h2 style="text-align: justify;"> Pytanie do czytelników</h2>
<p style="text-align: justify;">Chłopaki na kanale IRC <em><a href="http://webchat.freenode.net/?channels=symfony-pl">#symfony-pl (freenode)</a></em> słusznie zauważyli, że obecna implementacja ParamConvertera uniemożliwia zrealizowanie następującego schematu:</p>
<pre style="text-align: justify;">/**
 * @Route(/community/{community-id}/project/{project-id})
 */</pre>
<p style="text-align: justify;">Mechanizm ten wymaga, by id Encji/Dokumentu było nazwane w parametrze routingu jako {id}.</p>
<p style="text-align: justify;">Dodanie opcji konfiguracyjnej do adnotacji @ParamConverter jest dość proste i prawdopodobnie w najbliższej przyszłości zrobię taki PR (czekam na odpowiedź co z poprzednim), ale może Wy macie jeszcze jakieś pomysły jak można by ten mechanizm usprawnić i co do niego dodać? :) Sensowne idee postaram się zaimplementować i podrzucić Fabienowi, a być może sami się zainteresujecie tworzeniem kodu dla tego Frameworka? ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakper.net/3-pobieranie-dokumentow-mongodb-poprzez-paramconveter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integracja Twitter Bootstrap z projektami Symfony2</title>
		<link>http://blog.cakper.net/88-integracja-twitter-bootstrap-z-projektami-symfony2/</link>
		<comments>http://blog.cakper.net/88-integracja-twitter-bootstrap-z-projektami-symfony2/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 09:59:43 +0000</pubDate>
		<dc:creator>cakper</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[Assetic]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[LESS]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Twitter Bootstap]]></category>

		<guid isPermaLink="false">http://blog.cakper.net/?p=88</guid>
		<description><![CDATA[Tytułem wstępu, krótko się przedstawię, gdyż to pierwszy post na tym blogu. Nazywam się Kacper Gunia, studiuję Informatykę na Politechnice Śląskiej (semestr inżynierski). Od 2,5 roku pracuję jako Software Developer (Web/Mobile). Więcej informacji o mnie na cakper.net Twitter Bootstrap Bootstrap &#8230; <a href="http://blog.cakper.net/88-integracja-twitter-bootstrap-z-projektami-symfony2/">Czytaj dalej...</a>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Tytułem wstępu, krótko się przedstawię, gdyż to pierwszy post na tym blogu.<br />
Nazywam się Kacper Gunia, studiuję Informatykę na Politechnice Śląskiej (semestr inżynierski). Od 2,5 roku pracuję jako Software Developer (Web/Mobile). Więcej informacji o mnie na <a href="http://cakper.net/">cakper.net</a></p>
<h1 style="text-align: justify;">Twitter Bootstrap</h1>
<blockquote><p>Bootstrap is a toolkit from Twitter designed to kickstart development of webapps and sites. It includes base CSS and HTML for typography, forms, buttons, tables, grids, navigation, and more.</p></blockquote>
<p style="text-align: justify;">To tylko w kwestii rozjaśnienia tematyki osobom niezaznajomionym, po więcej informacji odsyłam na  <a href="https://dev.twitter.com/blog/bootstrap-twitter">DevBloga Twittera</a> i oficjalne <a href="http://twitter.github.com/bootstrap/">demo</a> Bootstrapa.<span id="more-88"></span></p>
<p style="text-align: justify;">Około 2 miesiące temu rzeczony projekt narobił w sieci dość sporo zamieszania, po tym okresie czasu myślę, że można już na chłodno ocenić jego przydatność i stabilnie używać w większych projektach (trochę błędów zostało poprawionych ;) ). A dodatkowo wydana została <a href="http://twitter.github.com/bootstrap/javascript.html">JavaScriptowa część Bootstrapa</a>.</p>
<p style="text-align: justify;">Pomijając wszystkie designerskie zalety tej paczki (całość wygląda dość schludnie) to ma ona jeszcze jedną ważną zaletę — arkusze stylów zostały napiane w <a href="http://lesscss.org/">LESSie</a>, dzięki czemu po pierwsze zapewniona jest wygodna możliwość rozwoju stylów (niezaznajomionym polecam poczytać o zaletach LESSa), a po drugie mamy porządny przykład w postaci kodu Bootstrapa, na którym możemy się wzorować.</p>
<p style="text-align: justify;">LESS wymaga jednak od nas developerów jednej podstawowej rzeczy — interpetacji swoich plików tak, by przeglądarki mogły na ich podstawie wyświetlać style. I można zrobić to na trzy sposoby (z użyciem JavaScriptu, Node.js oraz PHP) -  tym również zajmiemy się w tym wpisie.</p>
<h1 style="text-align: justify;">Konfiguracja Symfony2</h1>
<p style="text-align: justify;">Z założenia pomijam wszystkie kwestie związane z <a href="http://symfony.com/doc/current/quick_tour/the_big_picture.html">instalacją Symfony2</a> i przejdę od razu do rzeczy. SF2 dzięki mocnej integracji z GIT-em udostępnia bardzo fajny mechanizm dostarczania i aktualizacji bibliotek niezależnych dostawców i z tego mechanizmu też skorzystamy — po co się martwić o aktualizacje Bootstrapa skoro GIT zrobi to za nas ;)</p>
<p style="text-align: justify;">Do pliku deps wystarczy dorzucić następujące linijki:</p>
<pre>[twitter-bootstrap]
    git=https://github.com/twitter/bootstrap.git</pre>
<p style="text-align: justify;">Pozostaje teraz instalacja/aktualizacja bibliotek poprzez bin/vendors i gotowe.</p>
<h1 style="text-align: justify;">Instalacja Node.js</h1>
<p style="text-align: justify;">Zasadniczo LESSa można interpretować na 3 sposoby — z użyciem <a href="http://lesscss.org/#-client-side-usage">skryptu JS</a> bezpośrednio w przeglądarce (fuj z założenia) z użyciem <a href="https://github.com/kriswallsmith/assetic">Assetica</a> i <a href="http://leafo.net/lessphp/docs/">LessPHP</a> (próbowałem, ale miał problemy z dołączaniem plików LESSa i się sypał) oraz Assetica  i <a href="http://nodejs.org/">Node.js</a> — ta metoda u mnie zadziałała i ją polecam.</p>
<p style="text-align: justify;">By zainstalować Node.js z obsługą LESSa na debianoidach pójdziemy trochę na skróty i podrzucam listę poleceń do wykonania:</p>
<pre>wget http://nodejs.org/dist/node-v0.4.12.tar.gz
tar xvfz node-v0.4.12.tar.gz
cd node-v0.4.12
./configure
make
sudo make install
cd ../
rm -rf node-v0.4.12
sudo "curl http://npmjs.org/install.sh | sh"
cd /usr/local/lib/node_modules
sudo npm install less</pre>
<p style="text-align: justify;">Nie do końca polecam natomiast instalować Node.js z paczek np przez APT — dlaczego? Z jednego prostego powodu — w Ubuntu 11.04 spaczkowana była któraś z wersji 3.x, w 11.10 jest już co prawda 4.9, ale od kilku miesięcy stabilna wersja to 4.12. Kwestia waszej własnej decyzji :)</p>
<h1 style="text-align: justify;">Instalacja YUI-Compressor</h1>
<p style="text-align: justify;">YUI-Compressor to taka fajna biblioteka do minimalizacji plików CSS oraz JS, o zaletach zmniejszania ilości i wielkości zapytań HTTP poczytać możecie na <a href="http://blog.kamilbrenk.pl/minimalizacja-zapytan-http/">blogu Kamila Brenka</a>.</p>
<p style="text-align: justify;">Instalacja YC sprowadza się do pobrania pliku jar z wersją 2.4.6 ze strony: <a href="http://yuilibrary.com/download/yuicompressor/">http://yuilibrary.com/download/yuicompressor/</a> i umieszczenia w katalogu app/Resources/java naszej aplikacji SF2.</p>
<h1 style="text-align: justify;">Konfiguracja Assetica</h1>
<p style="text-align: justify;">Jest dość prosta — ważne są przede wszystkim wszystkie ścieżki, wpis w moim pliku</p>
<pre> app/config/config.yml</pre>
<p style="text-align: justify;">wygląda następująco:</p>
<pre># Assetic Configuration
assetic:
   debug: %kernel.debug%
   use_controller: false
   filters:
      cssrewrite: ~
      less:
         node: /usr/local/bin/node
         node_paths: [ /usr/local/lib/node_modules ]
      yui_css:
         jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.6.jar"
      yui_js:
         jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.6.jar"</pre>
<p style="text-align: justify;">Teraz pozostaje dodać jedynie w naszym szablonie widoku odpowiednie wpisy by Assetic widział co i jak ma interpretować i kompresować (dodatkowy wpis ze stylami i JSem wynika z wymagań Boostrapa — ponownie odsyłam do dokumentacji):</p>
<pre> {% stylesheets filter='less,?yui_css' output='css/bootstrap.css'
   '../vendor/twitter-bootstrap/lib/bootstrap.less' %}
   &lt;link href="{{ asset_url }}" rel="stylesheet" media="screen" /&gt;
 {% endstylesheets %}

 &lt;style type="text/css"&gt;
   body {
   padding-top: 60px;
   }
 &lt;/style&gt;

 &lt;!-- HTML5 shim, for IE6-8 support of HTML elements --&gt;
 &lt;!--[if lt IE 9]&gt;
 &lt;script src="http://html5shim.googlecode.com/svn/trunk/html5.js"&gt;&lt;/script&gt;
 &lt;![endif]--&gt;

 {% javascripts filter='?yui_js' output='js/bootstrap.js'
   'https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js'
   '../vendor/twitter-bootstrap/js/bootstrap-alerts.js'
   '../vendor/twitter-bootstrap/js/bootstrap-dropdown.js'
   '../vendor/twitter-bootstrap/js/bootstrap-modal.js'
   '../vendor/twitter-bootstrap/js/bootstrap-twipsy.js'
   '../vendor/twitter-bootstrap/js/bootstrap-popover.js'
   '../vendor/twitter-bootstrap/js/bootstrap-scrollspy.js'
   '../vendor/twitter-bootstrap/js/bootstrap-tabs.js' %}
   &lt;script src="{{ asset_url }}"&gt;&lt;/script&gt;
 {% endjavascripts %}</pre>
<p style="text-align: justify;">Analogicznie możemy dodać swoje własne pliki LESS do bloku ’stylesheets’ i pozwolić asseticowi zarządzać nimi. Teraz by zainstalować skompesowane pliki CSS i JS wystarczy polecenie:</p>
<pre>./app/console assetic:dump</pre>
<p style="text-align: justify;"><a href="http://blog.cakper.net/wp-content/uploads/2011/10/Zrzut-ekranu-2011-10-23-114430.png"><img class="size-thumbnail wp-image-136 alignright" title="Symfony2 + Twitter Boostrap" src="http://blog.cakper.net/wp-content/uploads/2011/10/Zrzut-ekranu-2011-10-23-114430-150x150.png" alt="Symfony2 + Twitter Boostrap" width="150" height="150" /></a><span>I to tyle :) Po prawej zrzut ekranu z działającej aplikacji Symfony2 z wstwionym przykładowym szablonem widoku z Bootstrapa. </span></p>
<p style="text-align: justify;">A dla wszystkich którzy przebrnęli mały bonus:</p>
<p style="text-align: justify;"><a href="https://github.com/cakper/cakper-symfony-bootstrap">Repo GitHub ze zintegrowanym Symfony 2.0.4 i Bootstrapem</a></p>
<p style="text-align: justify;"><a href="https://github.com/cakper/cakper-symfony-bootstrap"><br />
</a></p>
<p style="text-align: justify;">Aktualizacja 28.10.2011:</p>
<p style="text-align: justify;"><a href="https://github.com/kibao">@Kibao</a> znalazł błąd w kolejności ładowania plików JavaScript.<br />
Zmiany są już zmergowane na <a href="https://github.com/cakper/cakper-symfony-bootstrap/">GitHubie</a>, naniesione są również w poście.<br />
Dzięki za poprawkę! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cakper.net/88-integracja-twitter-bootstrap-z-projektami-symfony2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

