<?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>blogh</title>
	<atom:link href="http://blog.michalbielecki.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.michalbielecki.pl</link>
	<description>o php, js i takich tam</description>
	<lastBuildDate>Tue, 12 Apr 2011 22:31:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Trasa do Nowego Warpna przez Niemcy</title>
		<link>http://blog.michalbielecki.pl/2011/04/trasa-do-nowego-warpna-przez-niemcy/</link>
		<comments>http://blog.michalbielecki.pl/2011/04/trasa-do-nowego-warpna-przez-niemcy/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 22:31:32 +0000</pubDate>
		<dc:creator>Michał Bielecki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.michalbielecki.pl/?p=45</guid>
		<description><![CDATA[

]]></description>
			<content:encoded><![CDATA[<p><iframe style="margin-left:-30px" src="http://www.endomondo.com/embed/workouts?w=uqRFbilNyb8&#038;width=632&#038;height=600" width="632" height="600" frameborder="0" scrolling="no"></iframe></p>
<p><embed type="application/x-shockwave-flash" src="https://picasaweb.google.com/s/c/bin/slideshow.swf" width="600" height="400" flashvars="host=picasaweb.google.com&#038;hl=pl&#038;feat=flashalbum&#038;RGB=0x000000&#038;feed=https%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fmch4l.b%2Falbumid%2F5594008842672682865%3Falt%3Drss%26kind%3Dphoto%26hl%3Dpl" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michalbielecki.pl/2011/04/trasa-do-nowego-warpna-przez-niemcy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Poprawny język tłumaczeń w module admin w Symfony</title>
		<link>http://blog.michalbielecki.pl/2010/04/poprawny-jezyk-tlumaczen-w-module-admin-w-symfony/</link>
		<comments>http://blog.michalbielecki.pl/2010/04/poprawny-jezyk-tlumaczen-w-module-admin-w-symfony/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 21:28:08 +0000</pubDate>
		<dc:creator>Michał Bielecki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.michalbielecki.pl/?p=40</guid>
		<description><![CDATA[Od kilku dni bawię się z Symfony. Cały framework wygląda naprawdę fajnie, tym bardziej, że od pewnego już czasu korzystałem z niektórych zawartch w nim elementów (np. Propel).
Jedną z fajnieszych rzeczy w Symfony jest możliwość automatycznego wygenerowania panelu administracyjnego dla przygotowanego wcześniej modelu. Można go później do woli modyfikować i ulepszać, ale na samym początku [...]]]></description>
			<content:encoded><![CDATA[<p>Od kilku dni bawię się z <a href="http://www.symfony-project.org/" target="_blank">Symfony</a>. Cały framework wygląda naprawdę fajnie, tym bardziej, że od pewnego już czasu korzystałem z niektórych zawartch w nim elementów (np. Propel).</p>
<p>Jedną z fajnieszych rzeczy w Symfony jest możliwość automatycznego wygenerowania panelu administracyjnego dla przygotowanego wcześniej modelu. Można go później do woli modyfikować i ulepszać, ale na samym początku zdecydowanie oszczędza to wiele godzin/dni pracy.</p>
<p>Łatwo znaleźć można (na stronie Symfony, lub przez wyszukiwarki) informację jak zmienić większość rzeczy (etykiety przy inputach, nazwy nagłówków, pola z bazy danych które mają być edytowalne, itp). Cały dzień dziś jednak straciłem na poszukiwaniu rozwiązania dla możliwości przetłumaczenia całego panelu.</p>
<p>Na początku kombinowałem z plikiem apps/{aplikacja}/modules/{moduł}/config/generator.yml można w nim bowiem zmieniać wiele. Można na przyklad ustawić nazwy akcji:</p>
<pre>config:
  actions:
    _list: {   label: Lista }
    _save: {   label: Zapisz }
    _delete: { label: Usuń }
    _new: {    label: Dodaj }
    _edit: {   label: Edytuj }</pre>
<p>Po częsci pomaga to w tłumaczeniu panelu, ale tylko częściowo &#8211; bo tak na prawdę zmiany te są zupełnie niepotrzebne w tym wypadku. Okazuje się bowiem, że Symfony ma już gotowe tłumaczenia (między innymi) dla języka polskiego dla tych akcji, ale i nie tylko.</p>
<p>W wielu wątkach w Internecie znaleźć można informacje o potrzebie ustawienia opcji .settings.default_culture na pl_PL w pliku apps/{aplikacja}/config/settings.yml. To jednak nie wystarczy. Nie wiem jak wyglądało to w starszych wersjach Symfony, ale przynajmnie w Symfony 1.4 opcja .settings.i18n ustawioną jest standardowo na &#8220;off&#8221;. Tak więc, aby tłumaczenia zadziałały poprawnie potrzeba, aby plik settings.yml w sekcji settings wyglądał mniej więcej tak:</p>
<pre>all:
  .settings:
    i18n:                 on
    default_culture:      pl_PL
    csrf_secret: .....</pre>
<p>I to by było na tyle. Po ustawieniu tych opcji oraz <strong>po zresetowaniu cache&#8217;a symfony (poleceniem ./symfony cc) oraz plików cookie w przeglądarce</strong> cały panel administracyjny jest przetłumaczony na język polski.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michalbielecki.pl/2010/04/poprawny-jezyk-tlumaczen-w-module-admin-w-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>bind9 inside of openvpn</title>
		<link>http://blog.michalbielecki.pl/2009/12/bind9-inside-of-openvpn/</link>
		<comments>http://blog.michalbielecki.pl/2009/12/bind9-inside-of-openvpn/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 23:49:14 +0000</pubDate>
		<dc:creator>Michał Bielecki</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.michalbielecki.pl/?p=34</guid>
		<description><![CDATA[I was playing today a little with bind9. My goal was to resolve intranet and global domain names through one server that would be inside of openvpn intranet.
I configured all the necessary zones, and all was working fine directly from server (that is a server for both openvpn and bind9). After setting up the DNS [...]]]></description>
			<content:encoded><![CDATA[<p>I was playing today a little with bind9. My goal was to resolve intranet and global domain names through one server that would be inside of openvpn intranet.</p>
<p>I configured all the necessary zones, and all was working fine directly from server (that is a server for both openvpn and bind9). After setting up the DNS to be vpn/bind server a  problem occured &#8211; I was not able to  resolve any domain name (neither intranet nor internet), from none of machines that were connected to vpn network.</p>
<p>In the /var/log/syslog I was getting</p>
<blockquote><p>named[xxxx]: client 10.12.12.3#53461 query &#8217;some.domain.name/A/IN&#8217; denied</p></blockquote>
<p>Long story short, if you encounter such problem there is one simple solution. In your bind/named configuration (it will probably be /etc/bind/named.conf.options) set up following:</p>
<blockquote><p>listen-on { any; };<br />
allow-query { any; };</p></blockquote>
<p>Of course you can switch &#8220;any&#8221; to any other IP address.</p>
<p>Funny thing is that &#8220;any&#8221; should be the default values for both options. It was&#8217;t for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.michalbielecki.pl/2009/12/bind9-inside-of-openvpn/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Co zrobić z Google Latitude</title>
		<link>http://blog.michalbielecki.pl/2009/11/co-zrobic-z-google-latitude/</link>
		<comments>http://blog.michalbielecki.pl/2009/11/co-zrobic-z-google-latitude/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 23:35:26 +0000</pubDate>
		<dc:creator>Michał Bielecki</dc:creator>
				<category><![CDATA[pomysły]]></category>
		<category><![CDATA[geolokalizacja]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[latitude]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.michalbielecki.pl/?p=3</guid>
		<description><![CDATA[Stosunkowo niedawno Google uruchomiło usługę geolokalizacji o nazwie Latitude. Usługa nie jest szczególnie popularna w Polsce, być może ze względu na fakt iż do korzystania z niej potrzebny jest telefon z obsługą latitude oraz plan taryfowy na dostęp do Internetu w komórce. Ponadto nawet jeżeli spełnimy te wymagania to aplikacja zaczyna być przydatna dopiero, gdy [...]]]></description>
			<content:encoded><![CDATA[<p>Stosunkowo niedawno Google uruchomiło usługę geolokalizacji o nazwie Latitude. Usługa nie jest szczególnie popularna w Polsce, być może ze względu na fakt iż do korzystania z niej potrzebny jest <a title="Telefony wspierane przez Google Latitude" href="http://www.google.com/support/mobile/bin/answer.py?answer=136640&amp;cbid=-1y0ziz1ehb44m&amp;src=cb&amp;lev=answer" target="_blank">telefon z obsługą latitude</a> oraz plan taryfowy na dostęp do Internetu w komórce. Ponadto nawet jeżeli spełnimy te wymagania to aplikacja zaczyna być przydatna dopiero, gdy korzystają z niej również nasi znajomi. Sami będziemy mogli co najwyżej bawić się w sprawdzanie czy Google dokładnie wykryło nasze położenie.</p>
<p>W tej chwili Latitude oferuje <a href="http://www.google.com/latitude/apps" target="_blank">cztery podstawowe funkcjonalności</a>, jest to informacja o położeniu w statusie google talk, publiczna plakietka z naszym położeniem (którą można np. umieścić na swoim blogu) oraz dwie niedawno dodane funkcjonalności historia lokalizacji oraz alerty.</p>
<p>Mnie najbardziej zainteresowała jednak funkcja w publicznej plakietce, umożliwiająca pobieranie danych o obecnej lokalizacji w formacie JSON lub KML. Mając te dane można w prosty sposób zapisywać historię lokalizacji. Oczywiście Google oferuje już dostęp do historii, ale jedyne co możemy z tymi danymi zrobić to wyświetlić je na mapce, nie da się ich użyć w żaden inny sposób.</p>
<p>Na szybko napisałem więc skrypt (w PHP &#8211; bo tak), który przy pomocy CURL&#8217;a pobiera dane w formacie JSON i wrzuca je do mojej bazy danych. Ustawiłem, aby skrypt był uruchamiany co 10 minut i mam już swoją bazę danych z historią lokalizacji. Idealnie nie jest &#8211; telefon wysyła informację o swoim położeniu średnio co 40 minut, w dodatku, gdy korzysta tylko z nadajników GSM często określa położenie z dokładnością do kilku kilometrów. O dziwo, gdy telefon ma włączony moduł wi-fi dokładność jest znacznie większa &#8211; kilkanaście metrów (<a href="http://morony.pl/?p=554" target="_blank">jak słusznie zauważono tydzień temu</a>).</p>
<p>Dobrze, mamy już dane ale po co nam one? A chociażby do <strong>geotagowania zdjęć</strong>. Jest to bardzo przydatna opcja wspierana przez coraz większą ilość programów, np. Google Picasa. Jedynym wymaganiem jest ustawienie poprawnego czasu w aparacie oraz posiadanie przy sobie komórki. Jestem w trakcie pisania aplikacji, która sprawdzi wszystkie zdjęcia z wybranego katalogu, pobierze z EXIF ich daty wykonania, odpyta bazę danych poprzez zapytanie http pobierając dla każdego pliku długość i szerokość geogr. a następnie doda je do zdjęcia.</p>
<p>Zastosowań tego typu danych oczywiście jest więcej. Mam już kilka innych pomysłów, o których być może napiszę już niebawem.</p>
<p>Poniżej skrypt do pobierania danych:</p>
<pre class="brush:php">&lt;?php

$googleId = 'XXXXXX';

$dbh = new PDO('mysql:host=localhost;dbname=***', '***', '***');
$url = "http://www.google.com/latitude/apps/badge/api?user=$googleId&amp;type=json";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_HTTPGET, true);
curl_setopt($curl, CURLOPT_POST, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$curl_result = curl_exec($curl);
curl_close($curl);

$res = json_decode($curl_result);
$lat = $res-&gt;features[0]-&gt;geometry-&gt;coordinates[0];
$lng = $res-&gt;features[0]-&gt;geometry-&gt;coordinates[1];
$name = $res-&gt;features[0]-&gt;properties-&gt;reverseGeocode;
$timestamp = $res-&gt;features[0]-&gt;properties-&gt;timeStamp;
$accuracy = $res-&gt;features[0]-&gt;properties-&gt;accuracyInMeters;

$date = date('Y-m-d H:i:s', $timestamp);

$sql = 'SELECT id FROM locations WHERE timestamp="'.$date.'"';
$stmt = $dbh-&gt;prepare($sql);
$stmt-&gt;execute();
$data = $stmt-&gt;fetch();
if( $data['id'] == '' ) {
$sql = 'INSERT INTO locations (lat, lng, name, timestamp, accuracy) VALUES ('.$lat.','.$lng.',"'.$name.'","'.$date.'",'.$accuracy.')';
$stmt = $dbh-&gt;prepare($sql);
$stmt-&gt;execute();
}

?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.michalbielecki.pl/2009/11/co-zrobic-z-google-latitude/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

