<?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>BBProject.net &#187; javascript</title>
	<atom:link href="http://www.bbproject.net/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bbproject.net</link>
	<description>Programowanie, webmastering, informatyka</description>
	<lastBuildDate>Mon, 26 Jul 2010 08:03:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>AJAX w jQuery dla początkujących</title>
		<link>http://www.bbproject.net/2010/04/ajax-w-jquery-dla-poczatkujacych/</link>
		<comments>http://www.bbproject.net/2010/04/ajax-w-jquery-dla-poczatkujacych/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 19:10:40 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[load]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=288</guid>
		<description><![CDATA[Szybki i lekki kurs dla początkujących pod tytułem: AJAX w jQuery. Innymi słowy, jak przy pomocy tej biblioteki załadować dynamiczną treść bez przeładowania strony. Wszystko czego będziemy potrzebować to biblioteka jQuery, dobre chęci oraz szczypta zapału. Przechodzimy na stronę jquery.com i pobieramy najnowszą wersję skryptu. Ja na potrzeby tego wpisu stworzyłem sobie dwa pliki, pierwszy [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-289" title="jQuery" src="http://www.bbproject.net/wp-content/uploads/2010/03/jquery.png" alt="" width="235" height="73" />Szybki i lekki kurs dla początkujących pod tytułem: <a href="http://pl.wikipedia.org/wiki/AJAX">AJAX</a> w jQuery. Innymi słowy, jak przy pomocy tej biblioteki załadować dynamiczną treść bez przeładowania strony.</p>
<p>Wszystko czego będziemy potrzebować to biblioteka jQuery, dobre chęci oraz szczypta zapału. Przechodzimy na stronę <a href="http://jquery.com">jquery.com</a> i pobieramy najnowszą wersję skryptu.</p>
<p>Ja na potrzeby tego wpisu stworzyłem sobie dwa pliki, pierwszy będący główną stroną która będzie korzystać z techniki AJAX, oraz drugą zawierającą ładowane treści &#8211; obie jako skrypty PHP, aby nie było zbyt nudno. Ok, przechodzimy do działania.</p>
<p><span id="more-288"></span>Pierwszym krokiem będzie dołączenie do dokumenty biblioteki jQuery w sekcji <em>head</em> strony:</p>
<pre class="brush: xml">&lt;script type="text/javascript" src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;
</pre>
<h4>Najprostszy przypadek</h4>
<p>Czyli zwyczajne załadowanie zawartości innego pliku html/php bez przeładowania strony.</p>
<p>Dodam do naszej strony dwie warstwy, jedną która będzie przyjmować ładowane treści, i drugą z przyciskiem wywołującym zdarzenie.</p>
<pre class="brush: xml">&lt;div id="box"&gt;&lt;/div&gt;
&lt;div&gt;&lt;input id="btn" type="button" value="Wyślij"&gt;&lt;/div&gt;
</pre>
<p>Teraz pozostaje nam już tylko dodanie akcji do przycisku.</p>
<pre class="brush: jscript">$(document).ready(function(){
  $('#btn').click(function(){
    $('#box').load('data.php');
  });
});
</pre>
<p>Może czas na wyjaśnienie powyższego kodu. Pierwsza linia przypisuje zdarzeniu załadowania strony funkcję w której określamy co ma się dziać. Jest to wymagane podczas używania jQuery (i nie tylko), aby mieć pewność że struktura dokumentu widziana przez przeglądarkę jest kompletna. Kolejno elementowi o identyfikatorze <em>btn</em> przypisujemy zdarzenie kliknięcia w którym do elementu <em>box</em> ładujemy przy pomocy funkcji <a href="http://api.jquery.com/load"><em>.load</em></a> dane z pliku <em>data.php</em>.</p>
<p>W <em>data.php</em> umieściłem zwyczajowy tekst, równie dobrze może to być plik html. Przy tak przygotowanym kodzie, kliknięcie przycisku „Wyślij” powinno skutkować pojawieniem się nad nim treści zawartej w zewnętrznym pliku.</p>
<p>Kompletny kod całego dokumentu wygląda następująco:</p>
<pre class="brush: xml">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;
    &lt;script type="text/javascript" src="jquery-1.4.2.min.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript"&gt;
      $(document).ready(function(){
        $('#btn').click(function(){
          $('#box').load('data.php');
        });
      });
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id="box"&gt;&lt;/div&gt;
    &lt;div&gt;&lt;input id="btn" type="button" value="Wyślij"&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<h4>Przekazywanie parametrów</h4>
<p>Jeśli powyższy przypadek chcielibyśmy wzbogacić o przekazanie jakichś parametrów do wywoływanego pliku <em>data.php</em>, musimy rozbudować nieco funkcję <em>.load</em>.</p>
<pre class="brush: jscript">$('#box').load('data.php', {index: 4, str: 'abc'});
</pre>
<p>Drugi parametr określa tablicę par klucz: wartość. Dane te są przesyłane metodą POST, zatem mamy do nich łatwy dostęp w docelowym skrypcie php. Przykładowa zawartość <em>data.php</em>:</p>
<pre class="brush: php">Index: &lt;?php echo $_POST['index']; ?&gt;&lt;br&gt;
Ciąg znaków: &lt;?php echo $_POST['str']; ?&gt;
</pre>
<p>Tym sposobem możemy wpływać na to co ma zostać załadowane. Podawane dane możemy odczytać z pola tekstowe lub innych zmiennych &#8211; wszystko zależy od naszej inwencji oraz umiejętności pisania w JavaScript.</p>
<h4>Wysyłanie formularzy</h4>
<p>Ostatnim punktem będzie wysłanie formularza. Można by oczywiście skorzystać z powyższej metody kopiując zawartości pól formy, jednak było by to mało wygodne. My skorzystamy z funkcji <a href="http://api.jquery.com/serializeArray"><em>.serializeArray</em></a>.</p>
<p>Zmodyfikowałem zawartość dokumentu wzbogacając go o prosty formularz z dwoma polami:</p>
<pre class="brush: xml">&lt;div id="box"&gt;&lt;/div&gt;
&lt;div&gt;
  &lt;form id="form"&gt;
    Pole 1: &lt;input type="text" name="pole1"&gt;&lt;br&gt;
    Pole 2: &lt;input type="text" name="pole2"&gt;&lt;br&gt;
    &lt;input id="btn" type="button" value="Wyślij"&gt;
  &lt;/form&gt;
&lt;/div&gt;
</pre>
<p>Kolejno modyfikujemy kod JavaScript:</p>
<pre class="brush: jscript">$('#box').load('data.php', $('#form').serializeArray());
</pre>
<p>Tym sposobem, do pliku <em>data.php</em> zostanie przekazana zawartość pól formularza o identyfikatorze <em>form</em>. Co z nimi zrobimy, zależy już od nas.</p>
<h4>Podsumowanie</h4>
<p>Mam nadzieję iż chociaż troszkę pomogłem osobą które po raz pierwszy próbowały użyć technologii AJAX przy pomocy jQuery. Bardziej zaawansowanym polecam zapoznanie się z resztą <a href="http://api.jquery.com/category/ajax">funkcji</a> dostępnych w jQuery, które dają większe możliwości manipulacji danymi i tym co się dzieje podczas wywołania asynchronicznego.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/04/ajax-w-jquery-dla-poczatkujacych/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CAPTCHA bez dręczenia użytkownika</title>
		<link>http://www.bbproject.net/2010/04/captcha-bez-dreczenia-uzytkownika/</link>
		<comments>http://www.bbproject.net/2010/04/captcha-bez-dreczenia-uzytkownika/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 15:11:00 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[zabezpieczenia]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=275</guid>
		<description><![CDATA[CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) &#8211; rodzaj techniki stosowanej jako zabezpieczenie na stronach www, celem której jest dopuszczenie do przesłania danych tylko wypełnionych przez człowieka. Źródło: http://pl.wikipedia.org/wiki/CAPTCHA Zapewne nie raz spotkaliście się z kodami obrazkowymi które trudno było rozpoznać nawet człowiekowi. Widziałem już różne zabezpieczenia przeciw spam botom, [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>CAPTCHA</strong> (Completely Automated Public Turing test to tell Computers and Humans Apart) &#8211; rodzaj techniki stosowanej jako zabezpieczenie na stronach www, celem której jest dopuszczenie do przesłania danych tylko wypełnionych przez człowieka.</p>
<p>Źródło: <a href="http://pl.wikipedia.org/wiki/CAPTCHA">http://pl.wikipedia.org/wiki/CAPTCHA</a></p></blockquote>
<p><img class="alignleft size-full wp-image-276" title="CAPTCHA" src="http://www.bbproject.net/wp-content/uploads/2010/03/captcha.png" alt="" width="167" height="60" />Zapewne nie raz spotkaliście się z kodami obrazkowymi które trudno było rozpoznać nawet człowiekowi. Widziałem już różne zabezpieczenia przeciw spam botom, mniej lub bardziej wymyślne, a nawet takie które spowodowały że sobie odpuściłem wysłanie formularza gdyż nie byłem w stanie ich pomyślnie przejść.</p>
<p>W tym wpisie pokaże Wam jak zrobić alternatywne metody weryfikacji człowieczeństwa bez denerwujących kodów obrazkowych czy innych mechanizmów utrudniających życie.</p>
<p><span id="more-275"></span>Być może to co opiszę ktoś już wynalazł i stosuje z powodzeniem, nie mniej, wymyśliłem to przy okazji jednego projektu gdzie po dziś dzień działa i spisuje się znakomicie &#8211; chyba że tą stronę omijają spam boty <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_wink.png' alt=';)' class='wp-smiley' /> .</p>
<h4>Idea</h4>
<p>Na czym polega ów metoda? <strong>Na dynamicznej zmianie formularza, przed jego wysłaniem.</strong> Kolejno, w skrypcie PHP obsługującym daną formę, sprawdzamy poprawność struktury.</p>
<p>Spam boty, przeczesując sieć, odczytują z kodu HTML dostępne pola i wysyłają żądanie <em>POST</em> do lokacji widniejącej w  parametrze <em>action</em>. Jeśli zmienimy formularz dynamicznie przy pomocy JavaScript&#8217;u, wtedy spam bot nie zobaczy tych zmian i wyśle pierwotną wersję &#8211; wyjątkiem było by tutaj gdyby bot działał jak przeglądarka i interpretował całą stronę, ale w to wątpię.</p>
<h4>Praktyka</h4>
<p>Jeśli powyższy opis nie jest zbyt jasny, to poniższy przykład rozwieje wszelkie wątpliwości.</p>
<p>Załóżmy że mamy prosty formularz z jednym polem tekstowym &#8211; na przykład do dodawania komentarzy na stronę.</p>
<pre class="brush: xml">&lt;form id="form" action="form.php" method="post"&gt;
  &lt;input type="text" name="comment"&gt;
  &lt;input type="submit" name="submit" value="Wyślij"&gt;
&lt;/form&gt;</pre>
<p>Po wysłaniu takiej formy i zrzuceniu w PHP zawartości tablicy <em>$_POST</em> otrzymamy:</p>
<pre class="brush: plain">array(2) {
  ["comment"]=&gt;
  string(14) "mój komentarz"
  ["submit"]=&gt;
  string(7) "Wyślij"
}</pre>
<p>I w ten sposób wyglądała by przesłana zawartość jeśli wysłał by ją spam bot. Teraz wprowadzimy kilka zmian, aby ta wysłana przez człowieka (tj. z tradycyjnej przeglądarki) różniła się od tej powyższej.</p>
<p>Skorzystam z biblioteki <a href="http://jquery.com">jQuery</a> w celu łatwiejszego manipulowania elementami dokumentu HTML.</p>
<pre class="brush: jscript">$(document).ready(function(){
  $('#form').append('&lt;input type="hidden" name="key" value="234786"&gt;');
  $('#form input[name="submit"]').removeAttr('name');
});</pre>
<p>Co zrobiłem? Tuż po załadowaniu całego dokumentu, dodałem nowe ukryte pole formularza o nazwie <em>key</em> i wartości <em>234786</em>. Kolejno, usunąłem atrybut <em>name</em> z przycisku <em>submit</em>. Po takim zabiegu, skrypt PHP widzi nasz formularz w następujący sposób:</p>
<pre class="brush: plain">array(2) {
  ["comment"]=&gt;
  string(14) "mój komentarz"
  ["key"]=&gt;
  string(6) "234786"
}</pre>
<p>Jak widać, nie występuje już w tablicy <em>$_POST</em> w ogóle przycisk <em>submit</em>, a dodatkowo doszło ukryte pole <em>key</em>.</p>
<p>Jeśli teraz wyczulimy skrypt przetwarzający formularz na te zmiany, możemy odróżnić bota od człowieka:</p>
<pre class="brush: php">if (( ! isset($_POST['submit'])) &amp;&amp; isset($_POST['key']) &amp;&amp; ($_POST['key'] == '234786'))
{
  echo 'jesteś człowiekiem :]';
}
else
{
  echo 'jesteś spam botem :[';
}</pre>
<h4>Zabezpieczenia</h4>
<p>Pokazane tutaj rozwiązanie, w postaci usunięcia atrybutu przycisku <em>submit</em>, oraz dodanie pola <em>hidden</em> są tylko przykładowe. Siła tego rozwiązania tkwi w unikalności metody, a tutaj mamy naprawdę spore pole do popisu.</p>
<p>Możemy dodawać i usuwać pola. Manipulować nazwą lub zawartością pól ukrytych, np.: jego wartość musi być sumą kontrolną z tego co wpisze użytkownik w innym polu (wymagane podpięcie się pod zdarzenie <em>onSubmit</em> w takim wypadku). Możemy dodać pole z nazwą przeglądarki, adresem IP i porównać w skrypcie PHP czy się zgadzają oba wpisy. Pole do popisu jest naprawdę ogromne &#8211; niech poniesie Was fantazja, grunt to dobrze namieszać <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_smile.png' alt=':)' class='wp-smiley' /> .</p>
<p>Sam kod JavaScript warto umieścić w zewnętrznym pliku oraz potraktować narzędziem typu <a href="http://www.minifyjavascript.com">kompresor JS</a>. To utrudni ew. rozgryzienie naszego przypadku.</p>
<h4>Uwagi</h4>
<p>Czy jest to rozwiązanie idealne? Oczywiście nie. Pierwsza wada to wymagana obsługa JavaScript u użytkownika. Druga to łatwość obejścia tego typu zabezpieczenia przez człowieka. I tutaj są dwa aspekty tej przypadłości.</p>
<p>Autor bota musiał by przejrzeć kod naszej strony i zorientować się co tam się dokładnie dzieje i zmodyfikować swój twór. Jeśli przyjmiemy że każdy webmaster zastosuje inny algorytm zabezpieczający, to mało komu będzie się chciało dostosowywać swojego szkodnika do każdej strony z osobna tylko po to by móc masowo spamować. Koszt tej operacji przewyższał by zyski z rozsyłanego spamu.</p>
<p>Czyli, zasadniczo da się prosto dojść do tego jak spreparować formularz (chociaż jeśli ktoś namiesza to wcale to takie łatwe być nie musi <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_wink.png' alt=';)' class='wp-smiley' /> ), jednak jest to z ekonomicznego punktu widzenia nieopłacalne dla spamera.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/04/captcha-bez-dreczenia-uzytkownika/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Firefox 3.6 &#8211; wydajność silnika JavaScript</title>
		<link>http://www.bbproject.net/2010/01/firefox-3-6-wydajnosc-silnika-javascript/</link>
		<comments>http://www.bbproject.net/2010/01/firefox-3-6-wydajnosc-silnika-javascript/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 19:26:50 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Laboratorium]]></category>
		<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[sunspider]]></category>
		<category><![CDATA[wydajność]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=187</guid>
		<description><![CDATA[Wraz z wydaniem nowego ognistego lisa, oznaczonego numerem 3.6, otrzymaliśmy sporo zmian w tej przeglądarce. To co najbardziej interesujące z punktu widzenia programisty to wydajność silnika JavaScript, która została poprawiona wg. zapewnień producenta o ok. 20%. Pokusiłem się o mały test przy pomocy benchmark&#8217;a SunSpider nowej wersji Firefox&#8217;a, tego jak wypada w porównaniu do poprzedniej [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mozilla-europe.org/pl/firefox"><img class="size-medium wp-image-190 alignleft" title="Firefox" src="http://www.bbproject.net/wp-content/uploads/2010/01/firefox-256x96.png" alt="" width="256" height="96" /></a>Wraz z wydaniem nowego ognistego lisa, oznaczonego numerem 3.6, otrzymaliśmy sporo zmian w tej przeglądarce. To co najbardziej interesujące z punktu widzenia programisty to wydajność silnika <a href="http://pl.wikipedia.org/wiki/JavaScript">JavaScript</a>, która została poprawiona wg. zapewnień producenta o ok. 20%.</p>
<p>Pokusiłem się o mały test przy pomocy benchmark&#8217;a <a href="http://www2.webkit.org/perf/sunspider-0.9/sunspider.html">SunSpider</a> nowej wersji Firefox&#8217;a, tego jak wypada w porównaniu do poprzedniej 3.5.7, oraz na tle innych popularnych przeglądarek. Co z tego wyszło? Zobaczcie sami.</p>
<p><span id="more-187"></span>Wyniki przedstawione na poniższym wykresie są rezultatami testów SunSpider&#8217;a, podanymi w milisekundach. Ogólnie rzecz ujmując, im mniej, tym lepiej.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-189" title="SunSpider 0.9" src="http://www.bbproject.net/wp-content/uploads/2010/01/sunspider09.png" alt="" width="559" height="445" /></p>
<p>Stawkę otwiera Internet Explorer 8 z oszałamiającym wynikiem na poziomie prawie 5 sekund. Najlepiej wypada przeglądarka firmy Google, deklasując pozostałych rywali. Nowy Firefox 3.6 stara się zbliżyć do lidera poprawiając swój dotychczasowy wynik o <strong>25%</strong>. Jak widzimy, słowa Mozilli są jednak coś warte jeśli chodzi o deklaracje wydajności.</p>
<p>Oczywiście bezwzględne wartości liczbowe zależą od konfiguracji sprzętowej na jakiej wykonywany był pomiar. Nie mniej, względne różnice między wersjami czy też przeglądarkami mówią nam o wydajności ich silnika JavaScript.</p>
<p>Jak przekłada się to na realne odczucia? W dobie popularyzacji technik takich jakich jak <a href="http://pl.wikipedia.org/wiki/AJAX">AJAX</a>, oraz dominacji framework&#8217;ów pokroju jQuery, bardzo! Może nowa wersja produktu Mozilli, w porównaniu ze starszą, nie wgniecie nas w fotel, to jednak dobrze że producenci starają się implementować coraz to lepsze rozwiązania w tym zakresie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/01/firefox-3-6-wydajnosc-silnika-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
