<?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>Athlan • Piotr Pelczar • blog programisty &#187; Internet</title>
	<atom:link href="http://athlan.pl/kategoria/internet/feed/" rel="self" type="application/rss+xml" />
	<link>http://athlan.pl</link>
	<description>Napisać kod zrozumiały dla komputera potrafi byle głupek. Dobrzy programiści tworzą kod zrozumiały dla człowieka...</description>
	<lastBuildDate>Sat, 17 Jul 2010 18:54:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>jQuery Animate i Easing</title>
		<link>http://athlan.pl/jquery-animate-i-easing/</link>
		<comments>http://athlan.pl/jquery-animate-i-easing/#comments</comments>
		<pubDate>Sat, 08 May 2010 08:17:41 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=457</guid>
		<description><![CDATA[Nie można kwestionować faktu, że jQuery.animate() jest jednym z najbardziej potężnych narzędzi jQuery. Służy on do animowania atrybutów CSS (czyli zmiany ich wartości w czasie od obecnego stanu A do definiowanego stanu B). Najprostszą implementacją jQuery Animate jest podanie zbioru atrybutów CSS, które mają ulec zmianie oraz czasu, w jakim ta zmiana ma nastąpić. Nie będę się [...]]]></description>
			<content:encoded><![CDATA[<p>Nie można kwestionować faktu, że <code><a href="http://api.jquery.com/animate/">jQuery.animate()</a></code> jest jednym z najbardziej potężnych narzędzi <strong>jQuery</strong>. Służy on do animowania <strong>atrybutów CSS</strong> (czyli zmiany ich wartości w czasie od obecnego stanu A do definiowanego stanu B). Najprostszą implementacją <strong>jQuery Animate</strong> jest podanie zbioru atrybutów CSS, które mają ulec zmianie oraz czasu, w jakim ta zmiana ma nastąpić. Nie będę się zagłębiał w najprostsze przykłady użycia, <a rel="nofollow" href="http://api.jquery.com/animate/">są one dostępne w oficjalnej dokumentacji</a> jQuery.</p>
<p>Należy pamiętać, że dzięki jQuery jesteśmy w stanie nie tylko płynnie zmieniać kolory, wielkość czcionki, obramowanie, ale także pozycje elementów, nadając stronie dynamicznego kształtu. Domyślnym sposobem animowania (<em>easing</em>) jest płynne przechodzenie. Istnieje natomiast sposób na zmianę adaptera animowania. Robert Penner &#8211; autor pluginu <a rel="nofollow" href="http://gsgd.co.uk/sandbox/jquery/easing/"><strong>jQuery Easing</strong></a> dostarczył nam niewiarygodnie efektowne i proste w implementacji narzędzie. Na oficjalnej stronie pluginu można znaleźć <a rel="nofollow" href="http://gsgd.co.uk/sandbox/jquery/easing/">wiele przykładów animacji</a>, które dostarcza nam dodatek. Efekty widoczne są zwłaszcza przy animowaniu pozycji i wymiarów obiektu, ale następują także w przypadku zmiany koloru &#8211; czyli są aplikowane do zmiany stanu każdego z atrybutów CSS.</p>
<p>Dziś postaram się pokazać efekty, jakie można uzyskać za pomocą <strong>jQuery Animate</strong> rozszerzonego o <strong>jQuery Interface</strong> oraz <strong>Easing</strong>.</p>
<ul>
<li><a href="http://athlan.pl/code/jQueryAnimateEasing/">Przykład różnego rodzaju easingu</a>.</li>
</ul>
<p>Pierwszym krokiem jest wygenerowanie własnej biblioteki <a href="http://jqueryui.com/download">jQuery Interface</a>. Dzięki generatorowi, jesteśmy w stanie ściągnąć tylko te części Interface, które są nam de facto potrzebne, zmniejszając jednocześnie ilość kodu. Klikamy &#8216;deselect all components&#8217;, a w sekcji <em>Effects</em> wybieramy efekty, których będziemy używać. Mnie w tej chwili interesuje <em>Bounce</em> i <em>Slide</em>. W paczce otrzymamy wersję deweloperską (z wcięciami) oraz <em>minified</em>, gotową do publikacji na serwerze.</p>
<p>Do wykorzystania efektu slideowania a&#8217;la iPhone (elastyczne odbicie od krawędzi ściany ekranu) sprowadza się drobny kawałek kodu, w którym istotnym jest parametr <em>easing</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#example'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">animate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> left<span style="color: #339933;">:</span> <span style="color: #CC0000;">500</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> duration<span style="color: #339933;">:</span> <span style="color: #CC0000;">1000</span><span style="color: #339933;">,</span> easing<span style="color: #339933;">:</span> <span style="color: #3366CC;">'easeOutElastic'</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Na pewno komuś się przyda.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/jquery-animate-i-easing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Chmura tagów Tagcloud w PHP</title>
		<link>http://athlan.pl/chmura-tagow-tagcloud-php/</link>
		<comments>http://athlan.pl/chmura-tagow-tagcloud-php/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 19:12:21 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[tagcloud]]></category>
		<category><![CDATA[tagi]]></category>
		<category><![CDATA[tags]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=439</guid>
		<description><![CDATA[Ostatnio byłem zobligowany napisać nową klasę tagów do mojego projektu Sypacz.pl, która de facto zachowała stare API, lecz rozszerzyła swoje funkcjonalności, więc w kodzie projektu nie było wielu zmian. Wena spowodowała to, że zacząłem pisać kod od zera. Cały problem polega na tym, aby napisać na tyle elastyczną klasę tagów, która przyjmie nam zestaw danych, [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio byłem zobligowany napisać nową klasę tagów do mojego projektu <a href="http://sypacz.pl">Sypacz.pl</a>, która de facto zachowała stare API, lecz rozszerzyła swoje funkcjonalności, więc w kodzie projektu nie było wielu zmian. Wena spowodowała to, że zacząłem pisać kod od zera.</p>
<p>Cały problem polega na tym, aby napisać na tyle elastyczną klasę tagów, która przyjmie nam zestaw danych, a następnie zaprezentować ją w formie chmury, czym zaopiekuje się arkusz stylów CSS:</p>
<p><code>Nazwa tagu => Ilość występowań</code></p>
<p>Parę osób mnie pytało, jak wyciągnąć takie informacje z bazy danych:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">SELECT tag_name<span style="color: #339933;">,</span> <span style="color: #990000;">COUNT</span><span style="color: #009900;">&#40;</span>tag_name<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">AS</span> tag_times FROM tags GROUP BY tag_name ORDER BY tag_times LIMIT <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">50</span></pre></div></div>

<p>Wykorzystałem obiekt <a href="http://athlan.pl/code/Attribute.Class">Vframe_Attribute</a>, aby ustandaryzować komponent względem pozostałych w moim frameworku. Jeżeli ktoś nie chce używać obiektu Attribute, może w prosty sposób przekształcić klasę tagów, otrzymując ten sam efekt, deklarując tylko atrybut chroniony <code>protected $_aAttributes = array();</code>. Temat chmury tagów wydaje mi się na tyle trywialny, że nie ma się co nad nim zbyt wiele rozwodzić, zamieszczę tylko klasę i opiszę krótko w przykładach jej możliwości.</p>
<ul>
<li><a href="http://athlan.pl/code/Tagcloud.Class">Vframe_Tagcloud</a> &#8211; klasa tagów,</li>
<li><a href="http://athlan.pl/code/Attribute.Class"> Vframe_Attribute</a> &#8211; pomocnicza klasa atrybutów dla stosu $_aAttributes, dziedziczenie można usunąć i zadeklarować atrybut samemu.</li>
</ul>
<p>Aby stworzyć nowy obiekt tagów, po prostu wywołujemy konstruktor:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$oCloud</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Vframe_Tagcloud<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Konstruktor nie przyjmuje żadnych argumentów, wiec możemy od razu przejść do podawania obiektowi tagów. W tym miejscu warto nadmienić, że każdy znak jest rozróżniany (ze względów elastycznych), więc jeżeli chcesz, aby Nazwatagu oraz nazwatagu były rozpoznawane jako jeden klucz, wypadałoby użyć funkcji <a href="http://php.net/strtolower">strtolower</a> lub <a href="http://php.net/mb_strtolower">mb_strtolower</a> (dla Multibyte Strings):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aDataTags</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$iKey</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$aRow</span><span style="color: #009900;">&#41;</span>
  <span style="color: #000088;">$oCloud</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aRow</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tag_name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aRow</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tag_times'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Najistotniejszą częścią klasy jest sposób renderowania chmury, które może działać w dwóch trybach:</p>
<ul>
<li><strong>Tryb prosty</strong> zwraca nam nazwę tagu oraz jego wagę po przeliczeniu w formie liczby.</li>
<li><strong>Tryb zaawansowany</strong> zwraca nam nazwę tagu oraz tablicę z danymi:
<ul>
<li><code>level</code> &#8211; waga tagu po przeliczeniu,</li>
<li><code>count</code> &#8211; ilość występowań, taka jaką podaliśmy,</li>
<li><code>count_percentage</code> &#8211; informacja, w jakiej procentowej części ilości występowań znajduje się tag, przyjmując za 100% tag, który występuje najczęściej.</li>
</ul>
</li>
</ul>
<p>Aby w prosty sposób wyrenderować chmurę tagów, używamy poniższego przykładu:</p>

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

<p>Najczęściej używa się trybu prostego. Oba tryby są dalej rozbudowane, bowiem <strong>mamy możliwość zdefiniowania zakresu i dokładności wag tagów</strong>. <u>Domyślnie wagi tagów zawierają się pomiędzy 1, a 10</u>. Możemy na przykład przyjąć, że najmniejszą wagą jest liczba 3, największą 5, a precyzja wag tagów to 2 miejsca po przecinku:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$aDataTagsRender</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oCloud</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>W celu uniknięcia precyzji po przecinku (chcemy otrzymać liczby całkowite), ustawimy precyzję na 0.</p>
<p>Aby wywołać tryb zaawansowany, musimy podać 4 argument dla metody <code>render()</code> i ustawić go na <code>true</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$aDataTagsRender</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oCloud</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Warto w tym miejscu nadmienić, że tagi mogą nie być posortowane alfabetycznie (co ma miejsce podczas tworzenia chmury tagów). Wystarczy wywołać funkcję <code>ksort</code> (key sort).</p>
<p>Finalny przykład używania klasy tagów, celem wywołania klas CSS level_X, gdzie X to liczba całkowita z zakresu od 1 do 10, resztę robi CSS (kolorowanie, nakładanie rozmiaru):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aDataTags</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #000088;">$oCloud</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Vframe_Tagcloud<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aDataTags</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$iKey</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$aRow</span><span style="color: #009900;">&#41;</span>
  <span style="color: #000088;">$oCloud</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aRow</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tag_name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$aRow</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tag_times'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$aDataTags</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$oCloud</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">ksort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aDataTags</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$aDataTags</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$sTag</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$iTag</span><span style="color: #009900;">&#41;</span>
  <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;a href=&quot;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">route</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tag'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sTag</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&quot; class=&quot;level_'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$iTag</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&quot;&gt;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$sTag</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;/a&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/chmura-tagow-tagcloud-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Recenzja iPhone 3G</title>
		<link>http://athlan.pl/recenzja-iphone-3g/</link>
		<comments>http://athlan.pl/recenzja-iphone-3g/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 10:02:27 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Recenzje]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iTunes]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=413</guid>
		<description><![CDATA[Po trzech miesiącach użytkowania, jestem w stanie napisać konstruktywną recenzję iPhone 3G. Na samym w stępie chciałbym zaznaczyć, że urządzenie jest warte swojej ceny. Moja opinia nie jest w żaden sposób zdeterminowana ślepą miłością do marki Apple. Nie będę się tu rozwodził nad wyglądem, jest to indywidualna sprawa każdego użytkownika telefonu &#8211; dla mnie iPhone [...]]]></description>
			<content:encoded><![CDATA[<p>Po trzech miesiącach użytkowania, jestem w stanie napisać konstruktywną recenzję <strong>iPhone 3G</strong>.</p>
<p>Na samym w stępie chciałbym zaznaczyć, że urządzenie jest warte swojej ceny. Moja opinia nie jest w żaden sposób zdeterminowana ślepą miłością do marki <strong>Apple</strong>. Nie będę się tu rozwodził nad wyglądem, jest to indywidualna sprawa każdego użytkownika telefonu &#8211; dla mnie iPhone ma po prostu elegancki wygląd. Urządzenie wyposażone jest w 4 przyciski: blokowanie telefonu, home button (powrót), wyciszenie i sterowanie poziomem głośności &#8211; klawiaturę zastępuje ekran dotykowy. Warto nadmienić, że pojawia się ona tylko wtedy, gdy jest potrzebna. Telefon ma bardzo czuły ekran z obsługą multi-touch. Wbudowana funkcja auto-jasności pozwala oszczędzać baterię w miejscach ciemnych &#8211; polega to na redukcji oświetlenia ekranu w mroku, gdyż ludzkie oko doskonale widzi, co dzieje się wokół, a rozświetlony (jak za dnia) ekran telefonu powodował by irytację (jak w urządzeniach starszej generacji).</p>
<h4>Zwykłe użytkowanie urządzenia jako telefon</h4>
<p><a href="http://athlan.pl/wp-content/uploads/iphone-springboard.png"><img class="alignright size-full wp-image-428" title="iphone-springboard" src="http://athlan.pl/wp-content/uploads/iphone-springboard.png" alt="" width="250" height="375" /></a>Produkty Apple charakteryzują się dużą intuicyjnością interfejsu. Telefon podzielony jest na dwie zasadnicze części: Text messages (SMS) i telefon. Obie &#8220;aplikacje&#8221; zintegrowane są z komponentem kontaktów, który jest de facto ogólnodostępny dla innych aplikacji (twórcy telefonu podeszli do tej kwestii bardzo ideologicznie). Zasadniczym brakiem w oprogramowaniu jest brak raportów doręczenia SMS, ale można to obejść crackując telefon, o czym później. Dodatkowym minusem jest długie ładowanie się listy SMS przy jej większej ilości, co również można obejść crackując telefon, o czym również później : -). Kolejnym minusem jest to, że wszystkie kontakty przechowywane są w pamięci telefonu, a nie na karcie SIM, co gorsza &#8211; nie ma możliwości eksportu kontaktów na kartę SIM, a jedynie istnieje możliwość importu. Nie ma się czego obawiać &#8211; przy każdej synchronizacji iPhone z iTunes, kontakty zapisywane są w backupie.</p>
<h4>Telefon z niezniszczalnym software</h4>
<p>Zdarzyło mi się &#8220;popsuć&#8221; oprogramowanie iPhone instalując nieautoryzowane przez Apple oprogramowanie na własną odpowiedzialność. Przywrócenie telefonu do stanu używalności? Nic prostszego &#8211; instalujemy nowy software na iPhone via iTunes i klikamy przycisk Restore &#8211; wybieramy nasz backup i gotowe. Wszystkie kontakty, SMS&#8217;y, save&#8217;y z gier, aplikacje, muzyka widnieją z powrotem na ekranie naszego telefonu.</p>
<h4>Urządzenie przyjazne użytkownikowi</h4>
<p>Wyobraź sobie, że słuchasz muzyki, masz telefon w kieszeni, jest zimno. Musisz ściągnąć rękawiczki, wyciągnąć telefon, włączyć odtwarzacz muzyki, wejść  playlistę, kliknąć next, schować telefon, założyć rękawiczki. Nie ma się czym zachwycać, bo rozwiązania te zostały już zaimplementowane z poprzednich telefonach, ale Apple nie zapomniało o przycisku kontrolnym w zestawie słuchawkowym. Pomijając to, że wygląda elegancko, pozwala nam na odebranie/odrzucenie rozmowy i kontrolę iPod&#8217;a (play/pause &#8211; single click, next &#8211; double click, previous &#8211; tripple click).</p>
<p>Wcześniej wspomniałem o ekranie dostosowującym się do warunków oświetlenia. Gdy jest ciemno &#8211; ekran ciemnieje, bo nasze oko akomoduje się do otoczenia, oszczędzamy tym samym baterię. Gdy przykładamy telefon do ucha, ekran wygasza się, aby uniknąć przypadkowych kliknięć w ekran dotykając go uchem &#8211; tutaj również oszczędzamy baterię.</p>
<p><a href="http://athlan.pl/wp-content/uploads/iphone-ipod-cover.png"></a><a href="http://athlan.pl/wp-content/uploads/iphone-sms.png"><img class="alignright" title="iphone-sms" src="http://athlan.pl/wp-content/uploads/iphone-sms.png" alt="" width="250" height="167" /></a>Szybka edycja danych &#8211; na liście wystarczy wykonać gest przeciągnięcia palca w prawą stronę i pojawi nam się przycisk usunięcia go ze stosu &#8211; genialne. Pomyliłeś się pisząc SMS? Potrząśnij telefonem, a iPhone zaproponuje Ci wprowadzenie korekty. Niewygodnie pisze Ci się SMS&#8217;a? Przechyl iPhone na bok, a dostaniesz do dyspozycji większa klawiaturę i większy obszar pola tekstowego. Trzymasz iPhone w ręku i słuchasz muzyki? Potrząśnij telefonem, a zmieni się track. Chcesz przeglądnąć swoje albumy z iPodzie? przechyl telefon, a wyświetlą Ci się okładki, które dodałeś w iTunes.</p>
<p style="text-align: center;"><a href="http://athlan.pl/wp-content/uploads/iphone-ipod-cover.png"><img class="aligncenter" title="iphone-ipod-cover" src="http://athlan.pl/wp-content/uploads/iphone-ipod-cover.png" alt="" width="480" height="320" /></a></p>
<p>Szukanie w całym telefonie &#8211; kolejna opcja, która pomaga mi szybko dostać się do interesujących mnie rzeczy. Jedno pole wyszukiwania odpowiada za wyniki z: aplikacji, kontaktów, maili, sms&#8217;ów, tracków, artystów i albumów z iPod&#8217;a.</p>
<p>Nie ukrywajmy &#8211; Apple dostarcza nam masę aplikacji, z czego wiele jest darmowych. Co więcej, nasz telefon stara się utrzymać całe oprogramowanie w najnowszej wersji. Z telefonu możemy zrobić nawet zwykłą latarkę (której nie ma w urządzeniu) &#8211; aplikacja rozjaśnia ekran i pokrywa go białym kolorem. Nie wspominam już o masie gier serwowanych przez AppStore za darmo!</p>
<div style="text-align: center;"><a href="http://athlan.pl/wp-content/uploads/iphone-appstore.png"><img title="iphone-appstore" src="http://athlan.pl/wp-content/uploads/iphone-appstore.png" alt="" width="250" height="375" /></a> <a href="http://athlan.pl/wp-content/uploads/iphone-games.png"><img class="alignnone size-full wp-image-430" title="iphone-games" src="http://athlan.pl/wp-content/uploads/iphone-games.png" alt="" width="250" height="375" /></a></div>
<p>Przeglądanie Internetu nie było dla mnie prostsze &#8211; wbudowana przeglądarka Safari z obsługą kart i schowka jest idealnym narzędziem do surfowania po Sieci. Player YouTube również spełnia moje oczekiwania. Jeżeli jesteś społecznikiem &#8211; zintegruj swój telefon z Blip&#8217;em, Twitter&#8217;em, Flaker&#8217;em, Facebook&#8217;iem, importuj swoje ulubione kanały RSS, dodaj konta pocztowe i zainstaluj Parlingo &#8211; komunikator z obsługą sieci Gadu-Gadu, Jabbera, ICQ, AOL, Google Talk, MSN i innych.</p>
<h4>Nieautoryzowane oprogramowanie na iPhone &#8211; Jailbreak</h4>
<p><a href="http://athlan.pl/wp-content/uploads/iphone-jailbreak.png"><img class="alignright size-full wp-image-432" title="iphone-jailbreak" src="http://athlan.pl/wp-content/uploads/iphone-jailbreak.png" alt="" width="250" height="375" /></a>Jest wielu zwolenników crackowania oprogramowania iPhone, jest też wielu przeciwników. Moje stanowisko w tej sprawie &#8211; crackować. Co nam to daje? Wcześniej opisałem wiele nieudogodnień, które możemy poprawić w oprogramowaniu, np:</p>
<ul>
<li>raporty SMS są dostępne w Cydii pod nazwą iDelivery,</li>
<li>możemy wyłączyć przycisk automatycznej sekretarki w telefonie, który może nam się zdarzać przypadkowo kliknąć,</li>
<li>mamy możliwość pobierania filmików z YouTube&#8217;a za pomocą MXTube,</li>
<li>możemy scrobblować piosenki przesłuchiwane w iPodzie do last.fm za pomocą Scrobbl,</li>
<li>mamy możliwość zainstalowania kamerki, standardowo niedostępnej w iPhone &#8211; Cycorder,</li>
<li>odblokowanie nowych theme jest teraz możliwe &#8211; Winterboard,</li>
<li>dostosowanie telefonu, wyłączenie EDGE, wyłączanie niepotrzebnych ikonek w Springboard (typu giełda) &#8211; BossPrefs.</li>
</ul>
<p>I na koniec cały smaczek łamania oprogramowania:</p>
<h4>Czyli&#8230; telefon mi &#8216;zamula&#8217;</h4>
<p>Długie ładowanie SMS&#8217;ów, kontaktów, kalkulatora lub alarmów? Zcrackuj swój telefon i zainstaluj Backgrounder z pakietów Cydii. Pozwala on na działanie niektórych aplikacji &#8220;w tle&#8221;. Niektóre możemy ustawić jako automatycznie pracujące w trybie niewidocznym, innym nie pozwolić na taką opcję. Ile razy zdarzyło Ci się przerwać grę, gdy chciałeś odczytać SMS? Przytrzymaj Home button, gra schowa się do paska, odpisz na SMS&#8217;a i ponownie kliknij na ikonkę gry &#8211; powrócisz do stanu pierwotnego, a nie (jak w legalnym oprogramowaniu) proces zostanie całkowicie zakończony. Analogicznie sprawa wygląda w przypadku korzystania z komunikatora (np. Parlingo). Aby wyjść z trybu background, ponownie przytrzymaj Home button. Przycisk wprowadzania aplikacji w stan niewidoczny można skonfigurować indywidualnie, może to być np. Power button (Home jest chyba najwygodniejszy).</p>
<p>Dyskusja na temat działania aplikacji w tle jest burzliwa &#8211; pamiętajmy jednak, że crackując software narażamy się na nieoptymalne działanie telefonu i szybkie zużycie baterii, za co Apple nie odpowiada.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/recenzja-iphone-3g/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Allegro nie zawsze wygodne</title>
		<link>http://athlan.pl/allegro-nie-zawsze-wygodne/</link>
		<comments>http://athlan.pl/allegro-nie-zawsze-wygodne/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 23:51:57 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Private]]></category>
		<category><![CDATA[Przemyślenia]]></category>
		<category><![CDATA[allegro]]></category>
		<category><![CDATA[aukcja]]></category>
		<category><![CDATA[aukcje]]></category>
		<category><![CDATA[oszustwo]]></category>
		<category><![CDATA[play station]]></category>
		<category><![CDATA[policja]]></category>
		<category><![CDATA[shopping]]></category>
		<category><![CDATA[zakupy]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=378</guid>
		<description><![CDATA[Jestem zwolennikiem ułatwiania sobie życia wykorzystując Internet do robienia zakupów i zarządzania swoim kapitałem. Natomiast po ostatniej akcji na Allegro, zacząłem wątpić w moje ograne ideały, uznaję to za ostrzeżenie i poprawiam markerem cienką linię pomiędzy realnym shoppingiem, a dokonywania zakupów via Allegro na znacznie grubszą. Zamiast kupić pada do Play Station 3 kiloma kliknięciami, musiałem [...]]]></description>
			<content:encoded><![CDATA[<p>Jestem zwolennikiem ułatwiania sobie życia wykorzystując <strong>Internet</strong> do robienia zakupów i zarządzania swoim kapitałem. Natomiast po ostatniej akcji na <strong>Allegro</strong>, zacząłem wątpić w moje ograne ideały, uznaję to za ostrzeżenie i poprawiam markerem cienką linię pomiędzy realnym shoppingiem, a dokonywania zakupów via Allegro na znacznie grubszą. Zamiast kupić pada do Play Station 3 kiloma kliknięciami, musiałem ruszać tyłek po kilku instytucjach.</p>
<p>Wszystko zaczęło się 25 czerwca, kiedy postanowiłem zakupić wcześniej wspominanego pada. Mam zwyczaj, że jeżeli jest opisana procedura płatności za przedmioty, a kontrahent jest <em>Super Sprzedawcą</em>, robię to od razu po dokonaniu zakupu &#8211; tak było i tym razem. System <a href="http://www.sello.pl/">Sello</a> wysłał mi potwierdzenie złożenia zamówienia.</p>
<p>Od 26.06 do 07.07 obserwowałem status wysyłki. Przelewu nie zaksięgowano po 13 dniach, stąd status wysyłki zakolorowany na czerwono. Sprawa zaczyna śmierdzieć, bowiem nie mogę się dodzwonić do kontrahenta (number busy), a gdy już mi się to udaje &#8211; nikt nie odbiera. Kilkukrotna próba kontaktu telefonicznego i mailowego pozostawiona bez odpowiedzi motywuje mnie, żeby&#8230;</p>
<p>09.07 wypełniłem wniosek w <strong>Centrum Sporów Allegro</strong>. Tego samego dnia wybrałem się na <strong>Policję</strong>, aby złożyć zawiadomienie o popełnieniu przestępstwa na tle wyłudzenia internetowego. Na komendzie czekałem około 40 minut zanim mnie przesłuchali, potem straciłem 30 minut na przesłuchanie i sporządzenie raportu.</p>
<p>Czas płynie i płynie&#8230;</p>
<p>27.07 &#8211; kontrahent dzwoni z wyjaśnieniami. &#8220;Okazało się&#8221;, że odwiedziła go Policja. Tłumaczenie: padła im baza klientów i zamówień, przez co nie mogli mnie zidentyfikować, pomimo szukania transakcji w historii sprzedaży na Allegro (przecież jest lista czarno na białym). Na moim koncie powinny być już zaksięgowane zwrócone pieniążki, ale niestety nie mogą wysłać mi mojego pada ze względu na to, że są zablokowani przez skarbówkę&#8230; muszą się rozliczyć. Za wszystko jeszcze raz przeprasza&#8230;</p>
<p>28.07 godz 11:00, telefon z Policji. Wezwanie na jutro, punkt 9 rano w pokoju numer 53. Sprawdzam konto, pieniążki są. Drukuję potwierdzenie zaksięgowania zwrotu jako załącznik do jutrzejszych zeznań.</p>
<p>29.07 godz 9:00 (wakacje są, daliby pospać). Zaniechujemy ściganie, dziękuję za pomoc. Kończę spór transakcyjny w panelu na Allegro i wystawiam negatywny komentarz:</p>
<blockquote><p>Towar nie dotarł do mnie do dziś. Po interwencji Policji sprawa się wyjaśniła. Natomiast nieuczciwym wobec innych użytkowników Allegro byłoby wystawienie poz. lub neut. komentarza za transakcję, która nie doszła do skutku. Miesiąc w plecy.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/allegro-nie-zawsze-wygodne/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Zintegrowane logowanie cms z forum</title>
		<link>http://athlan.pl/zintegrowane-logowanie-forum/</link>
		<comments>http://athlan.pl/zintegrowane-logowanie-forum/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 09:42:35 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[autoryzacja]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[forum]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[phpBB]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=214</guid>
		<description><![CDATA[Projektowałem wiele serwisów, które miały zintegrowane z forum komponenty takie jak: rejestracja, przypomnienie hasła, zmiana hasła, nicku lub adresu email, usunięcie konta. Wówczas nie było żadnego problemu &#8211; wystarczyło wszystkie te akcje z forum przekierować na URL&#8217;e obsługiwane przez CMS, który zajmował się zmianami  tabelach forum. Dlaczego przekierować? Jeżeli ktoś rejestruje się w serwisie, jest [...]]]></description>
			<content:encoded><![CDATA[<p>Projektowałem wiele serwisów, które miały zintegrowane z forum komponenty takie jak:</p>
<ul>
<li>rejestracja,</li>
<li>przypomnienie hasła,</li>
<li>zmiana hasła, nicku lub adresu email,</li>
<li>usunięcie konta.</li>
</ul>
<p>Wówczas nie było żadnego problemu &#8211; wystarczyło wszystkie te akcje z forum przekierować na URL&#8217;e obsługiwane przez CMS, który zajmował się zmianami  tabelach forum. Dlaczego przekierować? Jeżeli ktoś rejestruje się w serwisie, jest zarejestrowany na forum, natomiast, gdy rejestruje się na forum, nie jest rejestrowany w serwisie. To CMS integrujemy z forum, a nie forum z CMS&#8217;em (chyba, że zamierzamy inaczej, wtedy na odwrót).</p>
<p>Ostatnio klient zażyczył sobie, żeby zintegrowane było również logowanie. Nie najlepiej widzi mi się implementacja systemu autoryzacji z forum w CMS&#8217;ie, więc poszedłem &#8220;na łatwiznę&#8221;, bowiem miałem do czynienia z <a href="http://przemo.org/phpBB2/">phpBB</a>. Do osiągnięcia celu postanowiłem wykonać dwa kroki:</p>
<ol>
<li>wysłać żądanie POST do forum na adres logowania z wypełnionymi polami POST z formularza logowania w CMS&#8217;ie,</li>
<li>przechwycić wysłane przez forum ciasteczka i przekazać je użytkownikowi.</li>
</ol>
<p>Do połączenia się z forum via http użyłem <a href="http://pl.php.net/HttpRequest">HttpRequest</a>. Wyszło z tego <a href="http://athlan.pl/code/ForumAuth">parę linijek kodu</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/zintegrowane-logowanie-forum/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Logowanie po nickname i email (usability)</title>
		<link>http://athlan.pl/logowanie-nickname-email-usability/</link>
		<comments>http://athlan.pl/logowanie-nickname-email-usability/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 14:35:13 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Przemyślenia]]></category>
		<category><![CDATA[Usablity]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[username]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=169</guid>
		<description><![CDATA[Projektując serwisy zaczynam ostrożnie podchodzić do usability. Temat jest bardzo wrażliwy, każdy webmaster to inne zdanie. Dziś chciałbym przedstawić problem logowania do serwisu. Oprócz hasła, przy logowaniu używamy: standardowo nazwy użytkownika, w niektórych serwisach adresu email, rzadziej spotykane zjawisko. W trosce o użytkowników w kilku moich serwisach zastosowałem możliwość logowania się na adres email lub [...]]]></description>
			<content:encoded><![CDATA[<p>Projektując serwisy zaczynam ostrożnie podchodzić do usability. Temat jest bardzo wrażliwy, każdy webmaster to inne zdanie. Dziś chciałbym przedstawić problem logowania do serwisu. Oprócz hasła, przy logowaniu używamy:</p>
<ul>
<li>standardowo <strong>nazwy użytkownika</strong>,</li>
<li>w niektórych serwisach <strong>adresu email</strong>, rzadziej spotykane zjawisko.</li>
</ul>
<p>W trosce o użytkowników w kilku moich serwisach zastosowałem możliwość logowania się na adres email lub nazwę użytkownika. Wszystko po to, aby ułatwić dostęp do ukrytej części witryny, aby nikt nie &#8220;zwątpił&#8221; bo nazwy użytkownika, lub adresu email, który podał przy zakładaniu profilu. Sam używam w sieci kilku adresów email oraz kilku prefixów i suffixów do nicka <strong>Athlan</strong>. Mam problem z zalogowaniem, gdy danie nie pasują, a potrzebuję dostęp tylko na chwilę.</p>
<p>Przygotujmy zatem tok myślenia programu, który pobierze dane, w zależności od tego, jakie dane podał użytkownik. Pomijam walidację hasła etc:</p>
<ol>
<li>Wykrycie, czy nick jest adresem email.</li>
<li>Jeżeli tak, pobierz dane użytkownika po polu <em>user_mail</em> i zapisz je do zmiennej <code>$aUser</code>.</li>
<li>Jeżeli nie, pobierz dane identyfikując rekord po kluczu <em>user_name</em> i zapisz pobrane dane do zmiennej <code>$aUser</code>.</li>
</ol>
<p>Jak możemy zauważyć, w obu przypadkach dane zapisujemy do tej samej zmiennej <code>$aUser</code>, więc możemy je dalej tak samo wykorzystywać. Różni się tylko pobieranie, dlateg nie trzeba w żadnym wypadku powielać kodu.</p>
<ul>
<li><a href="http://athlan.pl/code/UsablityLogin">Przykładowy kod logowania</a>.</li>
</ul>
<p>Jak słusznie zauważył <a href="http://greensky.pl">devnull</a>, <span style="text-decoration: underline;">należy wykluczyć możliwość użycia znaku małpy w loginie przy rejestracji użytkownika</span>. Wyjaśnienie znajdziecie w komentarzach.</p>
<p>Dla programisty nie jest wiele pracy, a warto ułatwić dostęp użytkownikowi do serwisu. <strong>Usability</strong> na pierwszym miejscu ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/logowanie-nickname-email-usability/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Podtrzymanie sesji</title>
		<link>http://athlan.pl/podtrzymanie-sesji/</link>
		<comments>http://athlan.pl/podtrzymanie-sesji/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 19:35:39 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Przemyślenia]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[Usablity]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[sesje]]></category>
		<category><![CDATA[sessions]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=159</guid>
		<description><![CDATA[Dla niektórych wygasanie sesji jest zabezpieczeniem (banki, etc.). Realizując jeden z projektów oczekiwałem od systemu tego, aby użytkownik nigdy nie gubił sesji, gdy ma otwarte okno w przeglądarce. Dlaczego? Może dodaje posta, być może uzupełnia dość obszerny tekst na stronie. Gdy klika zapisz, przerzuca go do strony logowania, a cały tekst zniknął za sprawą tego, [...]]]></description>
			<content:encoded><![CDATA[<p>Dla niektórych wygasanie sesji jest zabezpieczeniem (banki, etc.). Realizując jeden z projektów oczekiwałem od systemu tego, aby użytkownik nigdy nie gubił sesji, gdy ma otwarte okno w przeglądarce. Dlaczego? Może dodaje posta, być może uzupełnia dość obszerny tekst na stronie. Gdy klika <em>zapisz</em>, przerzuca go do strony logowania, a cały tekst zniknął za sprawą tego, że jego przeglądarka nie zapisuje wartości pól formularza. Skąd to znamy.</p>
<p><strong>Jak użytkownik gubi sesję?</strong></p>
<ol>
<li>Jego ciastko wygasa, więc serwer nie może go zidentyfikować z sesją.</li>
<li>Po jakimś czasie, choćby odtworzył ciastko, plik sesji znika z naszego serwera (<a href="http://pl.php.net/manual/pl/session.configuration.php#ini.session.gc-divisor">garbage collection</a>).</li>
</ol>
<p><strong>Rozwiązania:</strong></p>
<ol>
<li>Wydłużenie czasu wygasania ciastka i sesji.</li>
<li>Odświeżenie strony w interwale mniejszym, niż wynosi czas wygasania sesji i ciastka.</li>
</ol>
<p>Rozmyślając nad podtrzymaniem sesji, próbowałem znaleźć wszystkie metody oraz wybrać najlepszą. Wszystkie sprowadzają się do &#8220;odświeżenia&#8221; strony lub jej fragmentu tak, aby nasz silnik wykonał tylko potrzebne session_start(); czyli podtrzymanie aktywności sesji. Jest kilka mniej lub bardziej zadowalających sposobów:</p>
<ol>
<li><strong>Odświeżenie całej strony.</strong><br />
To może spowodować, że dane wprowadzane przez użytkownika w formularzu zostaną utracone. Ponad to, jeżeli użytkownik czyta newsy, denerwującym może być fakt, że lista nagle zostanie przescrollowana do góry (prócz opery).</li>
<li><strong>Wysłanie requestu ajax w tle.</strong><br />
Minusem jest to, że trzeba używać biblioteki ajax lub pisać dodatkowy kod javascriptu. Jeżeli ktoś na stronie używa jakiegoś ajaxa &#8211; co za różnica. Poza tym same plusy.</li>
<li><strong>Odświeżanie ukrytej ramki</strong> iframe lub elementu frameset.<br />
Minusów usablity prawie brak. Brak potrzeby instalacji javascriptów i ajaxa. Odświeżacz powinien wysłać nagłówek <em>Refresh</em> lub odpowiedni metatag.</li>
</ol>
<p>Sposób 3 wydaje mi się najlepszy. Można go ulepszyć w ten sposób, aby ramka nie wysyłała żądania zaraz po załadowaniu strony. Powodowałoby to podwójne requesty do serwera.</p>
<ul>
<li><a href="http://athlan.pl/code/PingIframe">Przykład z ukrytym iframe</a>.</li>
<li><a href="http://athlan.pl/code/PingAdvajax">Przykład z Advajax</a>.</li>
<li>plik <code>ping.php</code> wygląda wówczas następująco: <span style="color: #999999; font-size: 9px;">aplikacje nie używające frameworków ingerujących w standardowe działanie sesji</span><br />
<code>session_start(); header('Refresh: 60');</code></li>
</ul>
<p><span style="font-size: 9px">Zapewne znajdą się osoby, które powiedzą: a co z użytkownikami, którzy mają wyłączone ramki, lub ich przeglądarki w ogóle ich nie obsługują. Zapytam wówczas: a co z użytkownikami, którzy nie akceptują cisteczek (wówczas sesje nie są dla nich użyteczne, chyba, że użyjemy przesłyki jej identyfikatora w adresie url). Dopytam również: a co z użytkownikami, którzy mają wyłączony Javascript? Patologiczne przepadki się po prostu pomija ;)</span></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/podtrzymanie-sesji/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>wordwrap() czy linewrap()</title>
		<link>http://athlan.pl/wordwrap/</link>
		<comments>http://athlan.pl/wordwrap/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 10:57:22 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Solutions]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=143</guid>
		<description><![CDATA[Rzadko bo rzadko, ale jestem zmuszony używać funkcji wordwrap(). Zawsze denerwowało mnie, że wordwrap łamie linię (ciągi znaków) a nie wyrazy (jak na to nazwa funkcji wskazuje). Czy aby na pewno nazwa funkcji jest trafna? Zwraca łańcuch str zawinięty w kolumny o odpowiedniej ilości znaków określonej przez opcjonalny parametr szerokość . Linia jest łamana przy [...]]]></description>
			<content:encoded><![CDATA[<p>Rzadko bo rzadko, ale jestem zmuszony używać funkcji <strong><a href="http://php.net/wordwrap">wordwrap</a></strong>(). Zawsze denerwowało mnie, że <strong>wordwrap</strong> łamie linię (ciągi znaków) a nie wyrazy (jak na to nazwa funkcji wskazuje). Czy aby na pewno nazwa funkcji jest trafna?</p>
<blockquote><p>Zwraca łańcuch <em><tt class="parameter">str</tt></em> zawinięty      w kolumny o odpowiedniej ilości znaków określonej przez opcjonalny parametr      <em><tt class="parameter">szerokość</tt></em> .  <strong><span style="text-decoration: underline;">Linia jest łamana</span></strong> przy użyciu (opcjonalnego)parametru <em><tt class="parameter">break</tt></em> .</p></blockquote>
<p>Niestety, potrzebowałem załamać wyrazy, a nie linie. Z pomocą przychodzi <strong><a href="http://php.net/wordwrap">preg_replace</a></strong>(). Założenie jest takie, że wyrazem jest każdy ciąg znaków nie zawierający spacji. Łamiemy nawet ciągi liczb oraz znaków specjalnych, niekoniecznie zawierających litery:</p>
<pre>function _wordwrap($sString, $iLimit = 32)
{
  return preg_replace('/([^ ]{' . (int)$iLimit . '})/', '$1 ', $sString);
}</pre>
<p>Paradoksy w nazewnictwie się zdarzają.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/wordwrap/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Google atakuje kinematografię</title>
		<link>http://athlan.pl/google-atakuje-kinematografie/</link>
		<comments>http://athlan.pl/google-atakuje-kinematografie/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 12:29:46 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=142</guid>
		<description><![CDATA[Od niedawna można coraz częściej zauważyć, że Google zabiera się za sporządzenie bazy recenzji i ocen filmów oraz repertuaru kin. Wpisując hasło &#8220;kobiety&#8221; możemy na samej górze zauważyć taki oto obraz: Drążąc temat dalej&#8230; możemy zobaczeć recenzje filmu zaczerpnięte z różnych źródeł (w typ przypadku, interia i onet) oraz repeatuar kin, w którym film jest [...]]]></description>
			<content:encoded><![CDATA[<p>Od niedawna można coraz częściej zauważyć, że Google zabiera się za sporządzenie bazy recenzji i ocen filmów oraz repertuaru kin.</p>
<p>Wpisując hasło &#8220;<a href="http://www.google.pl/search?hl=pl&amp;q=kobiety">kobiety</a>&#8221; możemy na samej górze zauważyć taki oto obraz:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://img80.imageshack.us/img80/86/googlekinoeh3.jpg" alt="" /></p>
<p>Drążąc temat dalej&#8230; możemy zobaczeć <a href="http://img392.imageshack.us/img392/1502/googlekino2kh5.jpg">recenzje filmu</a> zaczerpnięte z różnych źródeł (w typ przypadku, interia i onet) oraz <a href="http://img380.imageshack.us/img380/8603/googlekino3qu1.jpg">repeatuar kin</a>, w którym film jest wyświetlany. Brawo Panowie&#8230; takie narzędzie na pewno się przyda.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/google-atakuje-kinematografie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Milion na StartUp</title>
		<link>http://athlan.pl/milion-na-startup/</link>
		<comments>http://athlan.pl/milion-na-startup/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 17:34:41 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=140</guid>
		<description><![CDATA[Portal Money.pl wyznaczył swoja nową akcję nad akcją Milion na StartUp (milion-na-startup.pl) widząc, co się dzieje w Internecie. W ostatnich latach w Polsce powstały dziesiątki nowych, obiecujących przedsięwzięć internetowych. Ta branża staje się szansą dla młodych ludzi na uruchomienie własnego biznesu. Internet kreuje nowe potrzeby, nowe usługi, nowe trendy. Money.pl &#8211; portal finansowy nr 1 [...]]]></description>
			<content:encoded><![CDATA[<p>Portal <a href="http://money.pl">Money.pl</a> wyznaczył swoja nową akcję nad akcją <a href="http://milion-na-startup.pl/">Milion na StartUp</a> (<a href="http://milion-na-startup.pl/">milion-na-startup.pl</a>) widząc, co się dzieje w Internecie.</p>
<blockquote><p>W ostatnich latach w Polsce powstały dziesiątki nowych,          obiecujących przedsięwzięć internetowych. Ta branża staje się szansą dla młodych ludzi na uruchomienie własnego          biznesu. Internet kreuje nowe potrzeby, nowe usługi, nowe trendy. Money.pl &#8211; portal finansowy nr 1 &#8211; ogłasza akcję na najlepszy biznesplan.          Oferujemy milion złotych z naszej puli inwestycyjnej na realizację pomysłu          na serwis lub usługę internetową. Na projekty czekamy do 30 listopada 2008 r. Zapoznaj się z <a href="http://milion-na-startup.pl/idea/">ideą</a> i <a href="http://milion-na-startup.pl/zasady/">zasadami</a> naszej akcji.</p></blockquote>
<p>Podobną akcję ogłosił TVN24.pl, tym razem pod tytułem <a href="http://nowybiznes.tvn24.pl">Nowy Biznes</a> (<a href="http://nowybiznes.tvn24.pl">nowybiznes.tvn24.pl</a>).</p>
<p>Razem z ekipą mamy zamiar zgłosić nasz projekt Ocenpizze.pl (oraz subprojekty), który ma na celu zrzeszyć <a href="http://www.ocenpizze.pl">pizzerie</a> w całej Polsce.</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" src="http://img222.imageshack.us/img222/5402/milionnastartupzo4.jpg" alt="" width="593" height="315" /></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/milion-na-startup/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Google Chrome</title>
		<link>http://athlan.pl/google-chrome/</link>
		<comments>http://athlan.pl/google-chrome/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 13:30:50 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=139</guid>
		<description><![CDATA[Google w dniu dzisiejszym zamieściła link na stronie głównej do swojego nowego projektu Google Chrome. Jest to nowa przeglądarka internetowa. Zapowiada się całkiem nieźle. Wprowadzono wiele nowych opcji, które pomagają w przeglądaniu Internetu, takich jak: podświetlenie domeny na pasku adresu, ciekawy, chowający się pasek statusu, inaczej rozwiązane menu narzędzi, przeglądarka jest od razu otwarta w [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right;" src="http://img134.imageshack.us/img134/7858/chrome205noshadowxn0.png" alt="Google Chrome" /><img class="alignleft" style="margin-left: 10px; margin-right: 10px; float: left;" src="http://img231.imageshack.us/img231/6549/logosmuh4.jpg" alt="" width="150" height="55" />Google w dniu dzisiejszym zamieściła link na stronie głównej do swojego nowego projektu <strong><a href="http://www.google.com/chrome/">Google Chrome</a></strong>. Jest to nowa przeglądarka internetowa.</p>
<p>Zapowiada się całkiem nieźle. Wprowadzono wiele nowych opcji, które pomagają w przeglądaniu Internetu, takich jak:</p>
<ul>
<li>podświetlenie domeny na pasku adresu,</li>
<li>ciekawy, chowający się pasek statusu,</li>
<li>inaczej rozwiązane menu narzędzi, przeglądarka jest od razu otwarta w &#8220;trybie pełnoekranowym&#8221;, dostępnym normalnie w przeglądarkach po wciśnięciu klawisza F11, co zwiększa obszar przeglądanej strony.</li>
</ul>
<p>Więcej featurów: <a href="http://www.google.com/chrome/intl/pl/features.html">http://www.google.com/chrome/intl/pl/features.html</a></p>
<p>Poza nowościami zostały zastosowane stare, konserwatywne techniki:</p>
<ul>
<li>karty (zakładki),</li>
<li>ulubione (bookmarks), rozwiązanie identyczne jak w Firefox 3,</li>
<li>strona startowa (splash) zastosowany w Operze (udoskonalona o opcję inteligentnego doboru stron).</li>
</ul>
<p>Dla webmasterów dodano debugowanie JS (dostępne w FF i Operze) oraz (i tutaj uwaga) zużycie procesora przez każdą z kart!</p>
<p><span style="text-decoration: line-through;">Przeglądarka bardzo mi sie podoba, ustawiam jako defaultowa :)</span></p>
<p>Edit: Po wykryciu dziur, wracam defaultowo na ff.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/google-chrome/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Google wdraża usługę translate</title>
		<link>http://athlan.pl/google-wdraza-usluge-translate/</link>
		<comments>http://athlan.pl/google-wdraza-usluge-translate/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 20:10:28 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=136</guid>
		<description><![CDATA[Mimo tego, że Google Translate jest jeszcze w fazie testowej, Google wdraża już usługę na rynek. Obok wyników wyszukiwania coraz częściej można znaleźć przycisk &#8220;Tłumaczenie strony&#8221;. Betatesty przeprowadzają sami użytkownicy, poprzez wprowadzanie własnego tłumaczenia: Niektóre wyniki wyszukiwania prezentują się w ten sposób:]]></description>
			<content:encoded><![CDATA[<p>Mimo tego, że <a href="http://translate.google.com">Google Translate</a> jest jeszcze w fazie testowej, Google wdraża już usługę na rynek. Obok wyników wyszukiwania coraz częściej można znaleźć przycisk &#8220;Tłumaczenie strony&#8221;. Betatesty przeprowadzają sami użytkownicy, poprzez wprowadzanie własnego tłumaczenia:</p>
<p style="text-align: center;"><img class="aligncenter" style="border: 1px solid black;" src="http://img292.imageshack.us/img292/2204/gt2kz0.jpg" alt="" width="514" height="147" /></p>
<p>Niektóre wyniki wyszukiwania prezentują się w ten sposób:</p>
<p style="text-align: center;"><img style="border: 1px solid black;" src="http://img139.imageshack.us/img139/4791/gt1rz1.jpg" alt="" width="617" height="403" /></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/google-wdraza-usluge-translate/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Szkoła hackerów</title>
		<link>http://athlan.pl/szkola-hackerow/</link>
		<comments>http://athlan.pl/szkola-hackerow/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 18:34:40 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[JS/Ajax]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=134</guid>
		<description><![CDATA[Tak się składa, że czasem szperam w kodach źródłowych witryn. Szkoła hackerów &#8211; kurs &#8220;hackingu&#8221;, który się reklamuje po całym Internecie (padła propozycja również dla mojego serwisu lookme.pl) nie dba o swoją aplikację webową. Jeżeli stawiamy walidator do formularza, który ma obsłużyć dane wprowadzone przez użytkownika, musimy: Sprawdzić je po stronie serwera, jeżeli przejdą proces [...]]]></description>
			<content:encoded><![CDATA[<p>Tak się składa, że czasem szperam w kodach źródłowych witryn. Szkoła hackerów &#8211; kurs &#8220;hackingu&#8221;, który się reklamuje po całym Internecie (padła propozycja również dla mojego serwisu lookme.pl) nie dba o swoją aplikację webową.</p>
<p>Jeżeli stawiamy walidator do formularza, który ma obsłużyć dane wprowadzone przez użytkownika, musimy:</p>
<ol>
<li>Sprawdzić je po stronie serwera, jeżeli przejdą proces walidacji, dopiero potem podjąć akcję, w przypadku wystąienia błędów &#8211; wyświetlić je użytkownikowi.</li>
<li>(Ewentualnie) Poinformować o błędzie już po stronie użytkownika bez przeładowania strony ani bez użycia jakiegokolwiek requestu ajax (sprawa kosmetyczna, niekonieczna).</li>
</ol>
<p>Każdy programista powinien powiedzieć, że walidacja po stronie serwera jest najważniejsza, już pomijając tą po stronie użytkownika, bo przecież kod JS można modyfikować, więc może go teoretycznie nie być.</p>
<p><img class="alignright" style="border: 1px solid black; margin-left: 10px; margin-right: 10px; float: right;" src="http://img216.imageshack.us/img216/6100/shss5.jpg" alt="" width="335" height="114" /><a href="http://nt.interia.pl/wiadomosc_dnia/news/jak-zhakowac-szkole-hakerow,949699">Już raz Szkoła Hackerów dała popis</a> &#8211; dziura <a href="http://pl.wikipedia.org/wiki/SQL_injection">SQL Injection</a>. Specjaliści? Nawet na <a href="http://forum.php.pl/Przedszkole_f27.html">forum przedszkole</a> (<a href="http://forum.php.pl/">forum.php.pl</a>) rzadko zdarzają się aż tak amatorskie kody.</p>
<p>Narzędziem firebug sprawdziłem formularz kontaktowy szkoły hackerów. Okazało się, że formularz posiada atrybut onsubmit, który wykonuje funkcję javascript valid(). Za pomocą narzędzia Firebug pozwoliłem sobie ją pominąć, tak, aby formularz zawsze otrzymywał true przy onsubmit (czyli się wykonywał). Okazało się, że dane po stronie serwera nie są sprawdzane. Nie jestem w stanie zdiagnozować, czy mail się wysłał, ale w takim przypadku użytkownik otrzymuje komunikat:</p>
<blockquote><p><span class="style16"><span style="font-size: xx-small;"><strong></strong></span> Twoja wiadomość została wysłana. Odpowiemy tak szybko, jak tylko będzie to możliwe, z reguły w ciągu 24 godzin. Odpowiedź  zostanie przesłana na podany przez Ciebie adres e-mail (). </span></p></blockquote>
<p>Amatorka?</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/szkola-hackerow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Weryfikacja właściciela strony</title>
		<link>http://athlan.pl/weryfikacja-wlasciciela-strony/</link>
		<comments>http://athlan.pl/weryfikacja-wlasciciela-strony/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 09:48:58 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Solutions]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=133</guid>
		<description><![CDATA[Niedługo być może zaimplementuje w jeden z moich nowych projektów weryfikację właściciela strony. Pomysł pozwoliłem zrobię zaczerpnąć z Google Webmaster Tool. Natomiast troszeczkę zmieniłem jeden ze sposobów, aby mniej się napracować. Zweryfikowanie właściciela witryny odbywa się po wywołaniu jednej z poniższych metod. Oto one: Weryfikacja poprzez upload pliku na serwer. Chwilowe dodanie meta-tagu do sekcji [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="margin-left: 10px; margin-right: 10px; float: right;" src="http://img232.imageshack.us/img232/194/bannerwebsitedesignbx2.jpg" alt="" width="352" height="352" />Niedługo być może zaimplementuje w jeden z moich nowych projektów weryfikację właściciela strony. Pomysł pozwoliłem zrobię zaczerpnąć z Google Webmaster Tool. Natomiast troszeczkę zmieniłem jeden ze sposobów, aby mniej się napracować. Zweryfikowanie właściciela witryny odbywa się po wywołaniu jednej z poniższych metod. Oto one:</p>
<ul>
<li>Weryfikacja poprzez upload pliku na serwer.</li>
<li>Chwilowe dodanie meta-tagu do sekcji HEAD.</li>
</ul>
<p>W stosunku do google, zmianie uległa u mnie weryfikacja pierwsza.</p>
<p>Sposób Google: Upload pliku bez zawartości (lub z dowolną) o nazwie jako hash aktywacyjny, np: <code>&lt;?php md5( secret-salt ) . '.html'; ?&gt;</code></p>
<p>Mój sposób: Upload pliku ze stałą lub hashowaną nazwą o zawartości 32 znakowego hashu md5.</p>
<p>Zmienia się tylko zawartość pliku. Dlaczego? Niektóre strony zamiast zwracać kod 404 dla nieistniejących plików/podstron zwracają kod 200 (sukces). Wówczas trudno stwierdzić, czy jest to oczekiwany plik. Google dodatkowo sprawdza, czy strona zawsze zwraca kod 200, ale po co się babrać i wykonywać więcej requestów, jak można zrobić to trochę prościej. Jeżeli plik nie będzie fizycznie istniał na serwerze, a strona zwróci kod 200, skrypt musi oczekiwać w odpowiedzi tylko i wyłącznie hashu strony. Nazwa pliku na serwerze może być stała, ale niekoniecznie (dla większego bezpieczeństwa zalecane jest logiczne hashowanie nazwy pliku).</p>
<p>Przygotujmy zatem zarys klasy (od tego zawsze zaczynam):</p>
<ul>
<li><code>public function CheckFile($sUrl, $sFilename)</code> funkcja sprawdzająca hash w pliku na serwerze.</li>
<li><code>public function CheckMetatag($sUrl, $sTagName)</code> funkcja sprawdzająca hash w metatagu.</li>
<li><code>public static function Hash($sUrl)</code> funkcja budująca hash na postawie adresu URL (jako że podajemy go jako parametr obu metod sprawdzających, zmienna jest łatwo dostępna dla systemu).</li>
<li><code>public static function Metatag($sHash, $sTagName)</code> generowanie kodu XHTML dla metatagu &#8211; metoda potrzebna nam przy podaniu użytkownikowi meta tagu oraz do prega w metodzie CheckMetatag();</li>
<li><code>protected static function _Request($sUrl)</code> tworzenie requestu za pomocą HttpRequest i zwracanie treści metodą getResponseBody() wspomnianej klasy.</li>
</ul>
<p>Jako że komponent jest niejako zewnętrzną biblioteką, nie mogłem go wcisnąć w komponentu frameworka. Otrzymał status biblioteki: VframeLib_WebVeryfication.</p>
<p>Oczekiwane API:</p>
<p><code>var_dump(VframeLib_WebVeryfication::CheckFile('http://example.com/', 'Veryfication.txt')); // bool result<br />
var_dump(VframeLib_WebVeryfication::CheckMetatag('http://example.com/', 'Veryfication'));</code><code> // bool result</code></p>
<p>Gotowy kod:</p>
<p><a href="http://athlan.pl/code/VframeLib_WebVeryfication">http://athlan.pl/code/VframeLib_WebVeryfication</a></p>
<p><em style="color: red">Uwaga. Kod jest w fazie testowej. Wszelkie Wasze komentarze będą uwzględniane przy poprawkach.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/weryfikacja-wlasciciela-strony/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Dziury w prywatności użytkowników Nasza-Klasa.pl</title>
		<link>http://athlan.pl/dziury-w-prywatnosci-uzytkownikow-nasza-klasapl/</link>
		<comments>http://athlan.pl/dziury-w-prywatnosci-uzytkownikow-nasza-klasapl/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 08:14:08 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Wykop]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=131</guid>
		<description><![CDATA[Dziś postanowiłem przeglądnąć opcje prywatności konta na naszej klasie. Co się okazało, jest opcja pozwalająca na blokadę wysyłania zdjęcia na telefony komórkowe (&#8220;Nie pozwalaj innym wysyłać moich zdjęć na komórki&#8221; ): Spróbowałem to przetestować. Po zaznaczeniu opcji przycisk &#8220;Wyślij na komórkę&#8221; zniknął spod zdjęcia. Postanowiłem wywołać wcześniej skopiowany adres odnośnika w pasek adresu: javascript:nktapeta('Tutaj adres [...]]]></description>
			<content:encoded><![CDATA[<p>Dziś postanowiłem przeglądnąć <a href="http://nasza-klasa.pl/profile/privacy_settings">opcje prywatności</a> konta na <a href="http://nasza-klasa.pl">naszej klasie</a>. Co się okazało, jest opcja pozwalająca na blokadę wysyłania <a href="http://www.lookme.pl">zdjęcia</a> na telefony komórkowe (<em>&#8220;Nie pozwalaj innym wysyłać moich zdjęć na komórki&#8221; </em>):</p>
<p>Spróbowałem to przetestować. Po zaznaczeniu opcji przycisk <em>&#8220;Wyślij na komórkę&#8221;</em> <img style="vertical-align: middle;" src="http://img233.imageshack.us/img233/9416/69830513hl2.png" alt="" /> zniknął spod zdjęcia. Postanowiłem wywołać wcześniej skopiowany adres odnośnika w pasek adresu:</p>
<p><code>javascript:nktapeta('Tutaj adres URL zdjęcia')</code></p>
<p>Ujrzałem okienko z możliwością przycięcia wybranej fotografii. Ja sobie tego nie życzę :)</p>
<p>Analiza? Dobrze jest w widoku, źle lub brak (stawiam na to) sprawdzania opcji w kontrolerze. Każdy popup powinien być najpierw sprawdzany, nawet przy ręcznym wywołaniu. Sprawdzany przynajmniej po stronie NK, wówczas portal nie będzie odpowiadał za kopiowanie <a href="http://www.lookme.pl">fotki</a> na dysk i ręczny upload na serwery serwisu umożliwającego wysyłanie tapet na telefon komórkowy.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/dziury-w-prywatnosci-uzytkownikow-nasza-klasapl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
