<?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>Code42 &#187; Różne</title>
	<atom:link href="http://code42.pl/kategoria/rozne/feed/" rel="self" type="application/rss+xml" />
	<link>http://code42.pl</link>
	<description>Wielkie Pytanie o Życie, Kod i całą resztę</description>
	<lastBuildDate>Wed, 25 Jan 2012 14:16:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław</title>
		<link>http://code42.pl/2012/01/25/moja-prezentacja-o-node-js-z-meet-js-i-gtug-wroclaw/</link>
		<comments>http://code42.pl/2012/01/25/moja-prezentacja-o-node-js-z-meet-js-i-gtug-wroclaw/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 13:44:10 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Różne]]></category>
		<category><![CDATA[gtug]]></category>
		<category><![CDATA[meet.js]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[ssjs]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1306</guid>
		<description><![CDATA[W listopadzie zapraszałem Was na pierwsze wrocławskie edycje Meet.JS i GTUG. Dzisiaj jesteśmy już po drugiej edycji każdej z imprez. Na obu &#8211; Meet.JS Wrocław i GTUG Wrocław przedstawiałem ten sam temat &#8211; Node.JS. Na szczęście okazało się, że zbiór wspólny uczestników był bardzo mały i chyba nawet nikt nie przysnął :). Poniżej link do [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/11/17/wroclaw-wita-javascript-meet-js-i-wroclaw-gtug/' rel='bookmark' title='Wrocław wita JavaScript – Meet.JS i Wrocław GTUG'>Wrocław wita JavaScript – Meet.JS i Wrocław GTUG</a></li>
<li><a href='http://code42.pl/2011/02/08/meet-js-javascriptowe-spotkanie-w-realu/' rel='bookmark' title='meet.js &#8211; JavaScriptowe spotkanie w realu'>meet.js &#8211; JavaScriptowe spotkanie w realu</a></li>
<li><a href='http://code42.pl/2011/07/19/node-js-i-middle-end-przenosny-kod-i-emulacja-przegladarki/' rel='bookmark' title='Node.js i middle-end – przenośny kod i emulacja przeglądarki'>Node.js i middle-end – przenośny kod i emulacja przeglądarki</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>W listopadzie <a href="http://code42.pl/2011/11/17/wroclaw-wita-javascript-meet-js-i-wroclaw-gtug/">zapraszałem Was na pierwsze wrocławskie edycje Meet.JS i GTUG</a>. Dzisiaj jesteśmy już po drugiej edycji każdej z imprez. Na obu &ndash; <a href="http://www.facebook.com/groups/meetjs.wroclaw/">Meet.JS Wrocław</a> i <a href="http://pl-pl.facebook.com/wroclawgtug">GTUG Wrocław</a> przedstawiałem ten sam temat &ndash; Node.JS. Na szczęście okazało się, że zbiór wspólny uczestników był bardzo mały i chyba nawet nikt nie przysnął :). Poniżej link do prezentacji.</p>
<p><a href="http://reinmar.github.com/meetjs-nodejs/"><img src="/wp-content/uploads/meetjs_nodejs.png" alt="Prezentacja o Node.JS"></a></p>
<p>Dodatkowo zapraszam (w szczególności uczestników GTUG-a, na którym było więcej kodu) do <a href="https://github.com/Reinmar/meetjs-nodejs">projektu na Githubie</a>, gdzie wgrałem źródła.</p>
<p>Na koniec chciałem jeszcze podziękować organizatorom za trud włożony w dogranie tych spotkań i Wam, uczestnikom, za przybycie i zadawanie ciekawych pytań :). Do zobaczenia na następnych imprezach.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/11/17/wroclaw-wita-javascript-meet-js-i-wroclaw-gtug/' rel='bookmark' title='Wrocław wita JavaScript – Meet.JS i Wrocław GTUG'>Wrocław wita JavaScript – Meet.JS i Wrocław GTUG</a></li>
<li><a href='http://code42.pl/2011/02/08/meet-js-javascriptowe-spotkanie-w-realu/' rel='bookmark' title='meet.js &#8211; JavaScriptowe spotkanie w realu'>meet.js &#8211; JavaScriptowe spotkanie w realu</a></li>
<li><a href='http://code42.pl/2011/07/19/node-js-i-middle-end-przenosny-kod-i-emulacja-przegladarki/' rel='bookmark' title='Node.js i middle-end – przenośny kod i emulacja przeglądarki'>Node.js i middle-end – przenośny kod i emulacja przeglądarki</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2012/01/25/moja-prezentacja-o-node-js-z-meet-js-i-gtug-wroclaw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zapraszam na darmowe szkolenie DevMeeting &#8211; middle-end w oparciu o NodeJS</title>
		<link>http://code42.pl/2011/09/20/zapraszam-na-darmowe-szkolenie-devmeeting-middle-end-w-oparciu-o-nodejs/</link>
		<comments>http://code42.pl/2011/09/20/zapraszam-na-darmowe-szkolenie-devmeeting-middle-end-w-oparciu-o-nodejs/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 12:16:31 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Różne]]></category>
		<category><![CDATA[devmeetings]]></category>
		<category><![CDATA[middle-end]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1191</guid>
		<description><![CDATA[Prawie miesiąc temu zapraszałem Was na różne wydarzenia związane z JavaScriptem, które miały odbyć się tej jesieni. W dwóch z nich miałem brać udział jako uczestnik &#8211; to jest na DevMeetingach w Poznaniu i Krakowie. Poznań mamy już za sobą, a w Krakowie nastąpi mała zmiana &#8211; zamiast uczestnikiem, będę prowadzącym. Ekipa organizująca szkolenia zwróciła [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/' rel='bookmark' title='Darmowe szkolenie z programowania gier w JavaScript by DevMeetings'>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</a></li>
<li><a href='http://code42.pl/2011/10/09/moje-prezentacje-z-devmeetings-i-meetjs/' rel='bookmark' title='Moje prezentacje z DevMeetings i MeetJS'>Moje prezentacje z DevMeetings i MeetJS</a></li>
<li><a href='http://code42.pl/2011/07/19/node-js-i-middle-end-przenosny-kod-i-emulacja-przegladarki/' rel='bookmark' title='Node.js i middle-end – przenośny kod i emulacja przeglądarki'>Node.js i middle-end – przenośny kod i emulacja przeglądarki</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Prawie miesiąc temu <a href="http://code42.pl/2011/08/29/javascript-na-jesien-2011/">zapraszałem Was</a> na różne wydarzenia związane z JavaScriptem, które miały odbyć się tej jesieni. W dwóch z nich miałem brać udział jako uczestnik &ndash; to jest na DevMeetingach w <a href="http://devmeetings.pl/trainings/wydajno%C5%9B%C4%87-nodejs-kontra-reszta-%C5%9Bwiata">Poznaniu</a> i <a href="http://devmeetings.pl/trainings/middle-end-w-oparciu-o-serverside-js">Krakowie</a>. Poznań mamy już za sobą, a w Krakowie nastąpi mała zmiana &ndash; <strong>zamiast uczestnikiem, będę prowadzącym</strong>.</p>
<p>Ekipa organizująca szkolenia zwróciła się do mnie z prośbą, bym zastąpił Davida, któremu wypadły pilne sprawy. Nie mogłem odmówić i zabrałem się za przygotowania. Czego możecie się spodziewać? Na pewno szkolenie będzie kręciło się w okół <strong>Node&#8217;a i middle-endu</strong>. W związku z obserwacjami dotyczącymi problemów, jakie z SSJS mieli uczestnicy <a href="http://devmeetings.pl/trainings/bazy-nosqlowe-naturalny-storage-aplikacji-jsowych">warszawskiego meetingu</a>, postaram się wyjaśnić, jak organizować kod, radzić sobie z asynchronicznością, czy pisać przenośne moduły w standardzie CommonJS. Poruszę więc kwestię <strong>odmiennych charakterystyk przeglądarkowego i serwerowego JavaScriptu</strong>. Wstęp ten przyda się do zadań praktycznych, które tak jak na pozostałych jesiennych meetingach będą kluczowym elementem Krakowskiego szkolenia.</p>
<p><strong><a href="http://devmeetings.pl/trainings/middle-end-w-oparciu-o-serverside-js#registration_form">Rejestracja</a></strong> jest <strong>darmowa</strong> i jeszcze <strong>otwarta</strong>. Do zobaczenia w Krakowie :)</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/' rel='bookmark' title='Darmowe szkolenie z programowania gier w JavaScript by DevMeetings'>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</a></li>
<li><a href='http://code42.pl/2011/10/09/moje-prezentacje-z-devmeetings-i-meetjs/' rel='bookmark' title='Moje prezentacje z DevMeetings i MeetJS'>Moje prezentacje z DevMeetings i MeetJS</a></li>
<li><a href='http://code42.pl/2011/07/19/node-js-i-middle-end-przenosny-kod-i-emulacja-przegladarki/' rel='bookmark' title='Node.js i middle-end – przenośny kod i emulacja przeglądarki'>Node.js i middle-end – przenośny kod i emulacja przeglądarki</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/09/20/zapraszam-na-darmowe-szkolenie-devmeeting-middle-end-w-oparciu-o-nodejs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Falsy Values 2011 &#8211; prawdziwy JavaScriptowy event</title>
		<link>http://code42.pl/2011/05/08/falsy-values-2011-prawdziwy-javascriptowy-event/</link>
		<comments>http://code42.pl/2011/05/08/falsy-values-2011-prawdziwy-javascriptowy-event/#comments</comments>
		<pubDate>Sun, 08 May 2011 21:14:04 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[HTML + CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Różne]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[falsy values]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=937</guid>
		<description><![CDATA[Kto nie był w zeszłym roku na konferencji Front Trends ten, czytając świetne recenzje jakie dostała, na pewno tego żałował. Sam byłem w Warszawie i wiem, że dobrze zainwestowałem swój czas i pieniądze, bo to jedyne tego typu wydarzenie w Polsce, jakie pamiętam. Wystarczy spojrzeć na listę prelegentów, którzy wzięli udział w konferencji. Douglas Crockford, [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/29/javascript-na-jesien-2011/' rel='bookmark' title='JavaScript na jesień 2011'>JavaScript na jesień 2011</a></li>
<li><a href='http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/' rel='bookmark' title='Darmowe szkolenie z programowania gier w JavaScript by DevMeetings'>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</a></li>
<li><a href='http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/' rel='bookmark' title='Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala'>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://falsyvalues.com/" title="Falsy Values 2011 - A True JavaScript Event"><img src="http://code42.pl/wp-content/uploads/falsy_values.png" width="536" height="140" alt="Falsy Values 2011 - A True JavaScript Event"/></a></p>
<p>Kto nie był w zeszłym roku na konferencji <a href="http://front-trends.com/">Front Trends</a> ten, czytając świetne recenzje jakie dostała, na pewno tego żałował. Sam byłem w Warszawie i wiem, że dobrze zainwestowałem swój czas i pieniądze, bo to jedyne tego typu wydarzenie w Polsce, jakie pamiętam. Wystarczy spojrzeć na <a href="http://front-trends.com/speakers">listę prelegentów</a>, którzy wzięli udział w konferencji. <a href="http://crockford.com">Douglas Crockford</a>, <a href="http://tantek.com">Tantek Çelik</a>, <a href="http://www.quirksmode.org/">Peter-Paul Koch</a> to bez wątpienia gwiazdy, których przedstawiać nie trzeba. Jednak bardzo dobre wrażenie zrobili na mnie również mniej znani prelegenci, jak <a href="http://cjohansen.no">Christian Johansen</a>, <a href="http://mozilla.org">Zbigniew Braniecki</a> (jako moderator panelu dyskusyjnego), czy <a href="http://webreflection.blogspot.com">Andrea Giammarchi</a>.</p>
<p>Jedyny zarzut (poza drobnymi problemami organizacyjnymi i kilkoma odstającymi poziomem prelegentami), jaki słyszałem w stosunku do zeszłorocznej konferencji to zbyt małe nastawienie na JavaScript. W tym roku <a href="http://varjs.com">Damian Wielgosik</a> i <a href="http://czerski.info/">Paweł Czerski</a>, twórcy Front Trends, postanowili wyjść na przeciw krytykom i już za 2 tygodnie, w dniach <strong>18-20 maja w Warszawie</strong> odbędzie się <strong>konferencja i 2 dni warsztatów pod nazwą <a href="http://falsyvalues.com/">Falsy Values</a></strong>. Tym razem, z pewnością, będzie to &#8222;True JavaScript Event&#8221;. W dodatku obsada zapowiada się jeszcze ciekawiej i równiej. Nie dość, że gościć będą wszyscy wielcy z Front Trends (poza PPK-em), to spotkać będzie można również kilku nowych, dobrze znanych, developerów, m.in. <a href="http://dmitrysoshnikov.com">Dmitry&#8217;a Soshnikova</a>, <a href="http://perfectionkills.com">Juriy&#8217;a &#8222;kangax&#8221; Zaytseva</a> oraz <a href="http://pornel.net">Kornela &#8222;porneL&#8221; Lesińskiego</a>.</p>
<p><span id="more-937"></span></p>
<p><a href="http://falsyvalues.com/speakers.html" title="Prelegenci"><img src="http://code42.pl/wp-content/uploads/falsy_values_speakers.png" width="536" height="230" alt="Prelegenci: m.in. Douglas Crockford i Tantek Çelik"/></a></p>
<p>W chwili obecnej <strong>zakupić można jeszcze <a href="http://falsyvalues.com/registration.html">bilety wstępu</a></strong> (upoważniające również do udziału w konferencji) na wszystkie warsztaty poza jednymi prowadzonymi przez Tanteka Çelika. Do wyboru mamy więc node.js, wstęp do JavaScriptu, gry, ECMAScript 5, Test Driven Development i aplikacje desktopowe. Można zakupić też bilet jedynie na piątkową konferencję. Ceny wahają się w zależności od tematu warsztatów i długości (są jedno i dwudniowe) i wydaje mi się, że nie są wygórowane, w szczególności kiedy porównamy je z dotyczącymi podobnych eventów organizowanych za naszą zachodnią granicą.</p>
<p>Jeśli o mnie chodzi, to ze względu na studia pojawię się tylko w piątek na konferencji (dziękuję tutaj Damianowi za zaproszenie). Zapowiada się wspaniały dzień, ponieważ plan prelekcji jest wyśmienity. Wiem, że ani nie będę mógł się spóźnić (Douglas Crockford na początek), ani wcześniej wyjść (Tantek Çelik na koniec), ani nawet przysnąć w środku (Dmitry Soshnikov). W szczególności nie mogę doczekać się występu tego trzeciego, ponieważ będzie mówił o ECMAScript 6, a kto <a href="http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/">czytał mnie wcześniej</a>, wie, że interesuje mnie rozwój tego standardu.</p>
<p>Tak więc, <strong>do zobaczenia w Warszawie!</strong></p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/29/javascript-na-jesien-2011/' rel='bookmark' title='JavaScript na jesień 2011'>JavaScript na jesień 2011</a></li>
<li><a href='http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/' rel='bookmark' title='Darmowe szkolenie z programowania gier w JavaScript by DevMeetings'>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</a></li>
<li><a href='http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/' rel='bookmark' title='Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala'>Obiektowy JavaScript i właściwości chronione &#8211; w poszukiwaniu Świętego Graala</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/05/08/falsy-values-2011-prawdziwy-javascriptowy-event/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Najszybszy stworek &#8211; algorytm genetyczny w JavaScriptcie</title>
		<link>http://code42.pl/2011/04/10/najszybszy-stworek-algorytm-genetyczny-w-javascriptcie/</link>
		<comments>http://code42.pl/2011/04/10/najszybszy-stworek-algorytm-genetyczny-w-javascriptcie/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 15:02:31 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Różne]]></category>
		<category><![CDATA[algorytmy genetyczne]]></category>
		<category><![CDATA[box2d]]></category>
		<category><![CDATA[ewolucja]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[patyczaki]]></category>
		<category><![CDATA[silnik fizyki]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=890</guid>
		<description><![CDATA[Ostatnimi czasy wykonałem na zajęcia ze sztucznej inteligencji symulację algorytmów genetycznych w JavaScriptcie. Nie lubię standardowych tematów jakie wybierają zazwyczaj studenci, więc kiedy przyszło do podejmowania decyzji jaki problem rozwiążę przypomniała mi się prelekcja Krzystofa Szafranka na meet.js w Poznaniu. Opowiadał on o silniku Box2D przeportowanym z ActionScriptu do JavaScriptu, a jako ciekawostkę pokazał symulację [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/09/co-lepiej-wiedziec-o-javascriptcie-cz-1-typy-zasiegu-i-domkniecia/' rel='bookmark' title='Co lepiej wiedzieć o JavaScriptcie cz.1.: typy zasięgu i domknięcia'>Co lepiej wiedzieć o JavaScriptcie cz.1.: typy zasięgu i domknięcia</a></li>
<li><a href='http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/' rel='bookmark' title='Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne'>Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://public.itbce.com/~reinmar/geno/"><img src="http://code42.pl/wp-content/uploads/creatures.png" width="536" height="195" alt="Genetycznie optymalizowane patyczaki w JavaScriptcie" /></a></p>
<p>Ostatnimi czasy wykonałem na zajęcia ze sztucznej inteligencji <a href="http://public.itbce.com/~reinmar/geno/">symulację algorytmów genetycznych w JavaScriptcie</a>. Nie lubię standardowych tematów jakie wybierają zazwyczaj studenci, więc kiedy przyszło do podejmowania decyzji jaki problem rozwiążę przypomniała mi się prelekcja <a href="http://szafranek.net/">Krzystofa Szafranka</a> na <a href="http://code42.pl/2011/02/08/meet-js-javascriptowe-spotkanie-w-realu/">meet.js w Poznaniu</a>. Opowiadał on o silniku <a href="http://www.box2d.org/links.html">Box2D</a> przeportowanym z <a href="http://box2dflash.sourceforge.net/">ActionScriptu</a> do <a href="http://code.google.com/p/box2dweb/">JavaScriptu</a>, a jako ciekawostkę pokazał symulację we Flashu wykorzystującą tę bibliotekę. Polegała ona na ewolucyjnej optymalizacji &#8222;rowerka&#8221;, który miał za zadanie przebyć jak największą odległość po pagórkowatej planszy (możliwe że był jeszcze dodatkowy warunek, a mianowicie pakunek musiał pozostać na rowerku). Ja niestety w momencie formułowania tematu swojej pracy nie mogłem znaleźć tego przykładu (możliwe, że w ogóle znikł z internetu, bo wszystkie linki prowadziły do nieistniejącej domeny), dlatego mój pomysł mocno się różni. Gdyby ktoś jednak znalazł adres do tej symulacji, to proszę o komentarz pod wpisem.</p>
<p><span id="more-890"></span></p>
<p><img src="http://code42.pl/wp-content/uploads/creatures7.png" width="244" height="532" alt="Genotyp stworka" class="alignright" /> Postanowiłem, że mój stworek (kreatura brzmi jakoś pokracznie :) składać się będzie z patyczków połączonych między sobą ruchomymi stawami. Jego zadaniem (czyli wartością funkcji celu bądź przystosowania) również będzie przebycie w określonym czasie największej odległości po planszy (ze względów oszczędności mojego czasu &ndash; płaskiej), czyli innymi słowy uzyskanie jak najwyższej średniej prędkości. W genotypie zapisałem następujące informacje:</p>
<ul>
<li>rozmiar (długość, szerokość), gęstość, sprężystość i współczynnik tarcia patyków (członów),</li>
<li>istnienie (bądź nie) kończyny &ndash; przyjąłem że mamy główne &#8222;ciało&#8221;, które ma maksymalnie 4 kończyny, a każda z nich jeszcze po jednej ruchomej części,</li>
<li>położenie kończyny względem rodzica oraz położenie stawu względem części wspólnej rodzica i kończyny (ileż ja się tu naliczyłem&#8230;),</li>
<li>moc silniczka w stawie, zakres ruchu, prędkość ruchu (ruch ma stałą prędkość, a kiedy wychylenie dociera do granicy zakresu zmieniam zwrot prędkości).</li>
</ul>
<p>Symulację zaczynam z całkowicie losowymi (ale z ustalonych zakresów) wartościami genów. Przyjąłem ze względów wydajnościowych dosyć niewielką populację 100 stworków i każdemu daję na jego podróż 15 sekund. Selekcji dokonuję przy pomocy metody ruletki, a genotypy krzyżuję z losową ilością punktów przecięć i równym prawdopodobieństwem co do obu rodziców. Z każdą populacją zachowuję stała liczbę osobników &ndash; czyli 100.</p>
<h2>Instrukcja użycia <a href="http://public.itbce.com/~reinmar/geno/">symulatora</a></h2>
<p><img src="http://code42.pl/wp-content/uploads/creatures_ui.png" width="506" height="368" alt="Interfejs symulatora" /></p>
<p>Po pierwsze zalecam odpalenie symulatora w Chrome&#8217;ie. Działa jeszcze pod Firefoksem, ale ten jest zbyt powolny (co mnie aż trochę zdziwiło). Pod Operą nie zadziała, bo ta ciągle nie ma zaimplementowanej metody <code>Function.prototype.bind</code> (innymi słowy &ndash; focham się). Po drugie polecam otworzyć sobie konsolę JavaScriptu (<kbd>ctrl+shift+j</kbd>), ponieważ wypisuję tam trochę przydatnych informacji.</p>
<p>Kiedy już wszystko jest przygotowane można kliknąć start. Jak widać miota nam się jakiś stworek. Z początku wartości genów są losowe, więc musimy mieć dużo szczęścia aby trafić na jakiegoś, który ruszy się gdzieś dalej. (Przy okazji &ndash; każda kreska na podłożu to 5 metrów). Widać jednak jaki jest punkt wyjścia.</p>
<p>Teraz możemy przełączyć się do trybu szybkiego. W tym trybie wstrzymane jest renderowanie, a pomiędzy kolejnymi <code>setTimeoutami</code> wywoływanych jest 1000 kroków animacji (czyli jakieś 33 sekundy z życia stworków). W tym właśnie miejscu nie daje rady Firefox, dla którego 1000 iteracji trwa tak długo, że blokuje się interfejs. Dla Chrome&#8217;a na moim sprzęcie mogłem spokojnie dać 5000 i nadal zachować przyzwoitą responsywność GUI.</p>
<p>Symulator sprawdzi nam jaki dystans przebyły wszystkie 100 stworków, po czym stworzy następną populację krzyżując pomiędzy sobą wybrane osobniki. W tym momencie na konsoli pojawią się statystyki dotyczące najlepszego rezultatu oraz średniej dla wszystkich stworków. W każdym momencie możemy podejrzeć stworki wracając do trybu powolnego symulacji.</p>
<p>W momencie utworzenia nowej populacji symulator uaktualnia też pola tekstowe z genotypami populacji odpowiednio dla całej aktualnej populacji, 10 najlepszych stworków w całej historii oraz 10 najlepszych z ostatniej populacji. Genotypy te (jak i przykłady wyników działania symulatora) można wkleić w najwyżej znajdujące się pole i przeprowadzić symulację dla zadanej populacji. Przy czym mam trzy uwagi: genotypy zapisane są bardzo nieoptymalnie, więc są długie i próba ich skopiowania, czy wklejenia może przymulić przeglądarkę; w tej chwili symulacja dla 10 najlepszych stworków zawiesi się i nie wygeneruje następnej populacji; użycie najlepszych 10 stworków może trochę zdziwić, ponieważ niektóre z nich mogą nie osiągnąć tak dobrych rezultatów jak za pierwszym razem. Wydaje mi się, że wynika to z ziarna losowości w granicznych sytuacjach w silniku Box2D, dlatego jeśli stworek przypadkiem osiągnął dobry rezultat, to za drugim razem tak być nie musi. Ewentualnie mam gdzieś w momencie publikowania najlepszych stworków błąd, ale nie chce mi się go szukać.</p>
<h2>Obserwacje i wnioski</h2>
<p>Kiedy pisałem ten symulator byłem pełen wątpliwości co do tego czy tego typu ewolucja, w której jest przecież tyle losowości dotyczącej krzyżowania genotypów, zda egzamin. Wydawało mi się, że skoro moje losowe stworki tak sobie plumkają w miejscu, to ich dzieci po wsze czasy również będą tylko plumkać. Przecież każdy z silniczków jest niezależny od drugiego, porusza się w innej fazie, z inną prędkością i z innym zakresem ruchu. Niemożliwe by przy takiej losowości ułożył się z tego jakiś skoordynowany organizm.</p>
<p>A jednak! Kiedy skończyłem metody odpowiedzialne za selekcję i krzyżowanie osobników i odpaliłem symulację pierwszy raz na czas potrzebny do wygenerowania kilkudziesięciu pokoleń, po czym zatrzymałem ją aby obejrzeć dotychczasowe wyniki nie mogłem wyjść z podziwu. Jednym z pierwszych rezultatów (i to całkiem szybkim &ndash; już po około 100 pokoleniach) była populacja z <a href="http://public.itbce.com/~reinmar/geno/examples/e1.json">przykładu pierwszego</a>, która zatrzymała się na 28 metrach. Zobaczcie sobie jak niesamowicie skoordynowane są te stworki. Na mnie to naprawdę zrobiło wrażenie, a moją dziewczynę wręcz przeraziło :).</p>
<p>Napisałem przed chwilą, że populacja zatrzymała mi się na 28 metrach. Okazało się mianowicie, że stosunkowo szybko spada presja selekcyjna i wszystkie osobniki upodobniły się do siebie. Jest to po części wina metody ruletki, która powoduje, że wiele osobników ma niemal zerową szansę stania się rodzicami. Drugim powodem tak szybkiego spadku różnorodności był brak mutacji, którą co prawda zaimplementowałem, ale jak się dużo później okazało, z błędem, który powodował, że w ogóle nie działała. Po jej naprawieniu wydaje mi się, że symulacja zachowuje się o wiele lepiej, choć pewnie mógłbym jeszcze poprawić metodę selekcji, czego jednak z braku czasu pewnie nie zrobię.</p>
<p>Inna ciekawa obserwacja, to formy do jakich ewoluują stworki. Ja zauważyłem dwie &ndash; stworek kroczący na dwóch nóżkach i stworek skaczący ze skręcenia (robiący fikołki). Pierwszy występuje dość rzadko, drugi o wiele częściej i w dodatku notuje dużo lepsze wyniki. Od prowadzącego zajęcia, który okazało się robił pracę magisterską właśnie o patyczakach, dowiedziałem się, że przewroty to nie tylko w moim przypadku najpopularniejsze rozwiązanie.</p>
<p>Zastanawiałem się też, co trzeba byłoby zmienić, aby uzyskać bardziej ludzkie formy ruchu, czyli aby przeważały formy kroczące. Chciałem zmienić maksymalne prędkości silników, ale to chyba nic by nie dało. Wydaje mi się, że trzeba było by wprowadzić dodatkowy warunek &ndash; na przykład stworek musiałby przenieść na swoim korpusie jakiś pakunek. Jestem bardzo ciekawy w jaką stronę wtedy poszłaby symulacja, choć wydaje mi się, że aby uzyskać ciekawe wyniki należałoby zwiększyć ilość osobników w populacji. Obym kiedyś wrócił do tego zagadnienia.</p>
<h2>PS</h2>
<p>Kod symulatora trzymam na <a href="https://github.com/Reinmar/geno">Githubie</a>. Gdyby komuś wpadło do głowy zaglądanie do niego, to proszę wziąć pod uwagę, że pisałem go pod dużą presją czasową. Skończyłem symulator w środku nocy, 4 godziny przed zajęciami :). W dodatku ciągle uczę się współgrania JavaScriptu z modelem MVC, a kiedy  o jakiejś późnej godzinie trafiłem na kilka problemów projektowych, to postanowiłem je po prostu zignorować :&gt;. Może powstanie kiedyś na ten temat jakiś artykuł.</p>
<p>Najlepszy wynik jaki uzyskał mój stworek to <a href="http://public.itbce.com/~reinmar/geno/examples/e5.json" title="Populacja z tym stworkiem">48.31 metrów</a> :).</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/08/09/co-lepiej-wiedziec-o-javascriptcie-cz-1-typy-zasiegu-i-domkniecia/' rel='bookmark' title='Co lepiej wiedzieć o JavaScriptcie cz.1.: typy zasięgu i domknięcia'>Co lepiej wiedzieć o JavaScriptcie cz.1.: typy zasięgu i domknięcia</a></li>
<li><a href='http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/' rel='bookmark' title='Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne'>Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/04/10/najszybszy-stworek-algorytm-genetyczny-w-javascriptcie/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Naj- opisy zmian w kodzie</title>
		<link>http://code42.pl/2009/05/19/naj-opisy-zmian-w-kodzie/</link>
		<comments>http://code42.pl/2009/05/19/naj-opisy-zmian-w-kodzie/#comments</comments>
		<pubDate>Tue, 19 May 2009 09:50:20 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Różne]]></category>
		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=379</guid>
		<description><![CDATA[Najgłupsze, najgorsze, najbardziej śmieszne opis zmian w repozytorium SVN.


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/10/08/svn-wycofywanie-zatwierdzonych-zmian/' rel='bookmark' title='SVN: Wycofywanie (zatwierdzonych) zmian'>SVN: Wycofywanie (zatwierdzonych) zmian</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/wtf-mario-536x202.jpg" alt="" title="wtf-mario" width="536" height="202" class="aligncenter size-medium wp-image-710" /></p>
<p>Najgłupsze, najśmieszniejsze, najbardziej bezsensowne, najciekawsze <em>pełne</em> opisy zmian wgranego kodu w Subversion jakie udało nam się przyuważyć:</p>
<ul>
<li>poprawka po zergu. Wstydź się :P</li>
<li>cos</li>
<li>refaktoryzacja hahaha</li>
<li>nie pamiętam co to</li>
<li>tagusie na dole</li>
<li>coby hmora taguf smigala jak na waSseLinie</li>
<li>Debile z PHP nie potrafią nawet gramatyki języka sensownie zrobić.</li>
<li>coby sie firebug nie denerwowal</li>
<li>Cichaczem zmieniłem Reinmarowi CSS-a.</li>
<li>redesign layoutu. O kurwa</li>
<li>dopieszczanko</li>
<li>Fix Knorra</li>
<li>Firefix.</li>
<li>cosie</li>
<li>haaa!</li>
<li>jkopytko</li>
<li>stylusie dla panelusia administratorka</li>
<li>dopieszczanie zdzicha</li>
<li>3h meki z textilem i nadal nikt nie wie dlaczego niedziala. Ihaha</li>
<li>Szukarko</li>
<li>Polska sie pisze z duzej litery</li>
<li>musk mię boli</li>
<li>glupia opera</li>
<li>Zergu, kocham Cię</li>
<li>+glebogryzarka</li>
<li>Forms w Syffony to jakiś żart.</li>
<li>boze , ja nie moge =)</li>
<li>kod :)</li>
<li>la la la layout</li>
<li>Ominięcie buga PHP, który autorzy nazywają ficzerem.</li>
<li>Tao w kodzie</li>
<li></li>
<li>Teraz jest dobrze</li>
</ul>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/10/08/svn-wycofywanie-zatwierdzonych-zmian/' rel='bookmark' title='SVN: Wycofywanie (zatwierdzonych) zmian'>SVN: Wycofywanie (zatwierdzonych) zmian</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/05/19/naj-opisy-zmian-w-kodzie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Jak przycinać i skalować obrazki?</title>
		<link>http://code42.pl/2009/04/17/jak-przycinac-i-skalowac-obrazki/</link>
		<comments>http://code42.pl/2009/04/17/jak-przycinac-i-skalowac-obrazki/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 17:37:59 +0000</pubDate>
		<dc:creator>eshaem</dc:creator>
				<category><![CDATA[Różne]]></category>
		<category><![CDATA[algorytmy]]></category>
		<category><![CDATA[obrazki]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=326</guid>
		<description><![CDATA[Odwiecznym problemem przy wyświetlaniu obrazków użytkowników jest przycinanie i skalowanie ich w taki sposób, który pasuje do wyglądu serwisu. Problem na pierwszy rzut oka może wydawać się dość trudny ze względu na różnorodność obrazków, które może wysłać użytkownik, posiada on jednak proste i eleganckie rozwiązanie. Na potrzeby wypisu założmy, że zajmujemy się przeskalowaniem powyższego obrazka [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/' rel='bookmark' title='Refaktoryzacja CSS — jednak coś można'>Refaktoryzacja CSS — jednak coś można</a></li>
<li><a href='http://code42.pl/2010/04/04/dwukolumnowa-lista-definicji-edit-w-html5-lista-opisow/' rel='bookmark' title='Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))'>Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Odwiecznym problemem przy wyświetlaniu obrazków użytkowników jest przycinanie i skalowanie ich w taki sposób, który pasuje do wyglądu serwisu. Problem na pierwszy rzut oka może wydawać się dość trudny ze względu na różnorodność obrazków, które może wysłać użytkownik, posiada on jednak proste i eleganckie rozwiązanie.</p>
<div id="attachment_327" class="wp-caption aligncenter" style="width: 310px"><img class="size-full wp-image-327" title="Lena" src="http://code42.pl/wp-content/uploads/2009/04/lena.jpg" alt="lena" width="300" height="300" /><p class="wp-caption-text">Lena - obiekt naszych testów</p></div>
<p style="text-align: left;">Na potrzeby wypisu założmy, że zajmujemy się przeskalowaniem powyższego obrazka z rozmiarów <em>300 x 300 px</em> na <em>200 x 100</em> <em>px</em>. Można pomyśleć o najprostszym rozwiązaniu, czyli przeskalowaniu albo wycięciu odpowiedniego kawłka z oryginalnego obrazka. Żadne z tych rozwiązań nie jest jednak dobre, pierwsze nie poradzi sobie z plikami, w których stosunek szerokości do długości jest inny niż docelowy, drugą metodą wytniemy jedynie fragment z obrazka pomijając być może istotną część interesującą użytkowników naszego serwisu. (W szczególności problem pojawia się problem przy dużych obrazkach, którą część wycinać? Przedstawiony poniżej przykład jest nieco tendecyncyjny ze względu na małą wielkość obrazka.)</p>
<div id="attachment_328" class="wp-caption aligncenter" style="width: 210px"><img class="size-full wp-image-328" title="lena-zle-1" src="http://code42.pl/wp-content/uploads/2009/04/lena-zle-1.jpg" alt="Skalowanie" width="200" height="100" /><p class="wp-caption-text">Skalowanie</p></div>
<div id="attachment_329" class="wp-caption aligncenter" style="width: 210px"><img class="size-full wp-image-329" title="lena-zle-2" src="http://code42.pl/wp-content/uploads/2009/04/lena-zle-2.jpg" alt="Wycinanie" width="200" height="100" /><p class="wp-caption-text">Wycinanie</p></div>
<p>Potrzebujemy więc rozwiązanie, które pozwoli uwzględnić różny stosunek wysokości do szerokości obrazka dostarczonego przez użytkownika, oraz umożliwi pokazanie jego jak największej zawartości. Najlepiej więc będzie jeżeli będziemy tylko ścinać obraz z góry i dołu, lub lewej i prawej a następnie skalować go do żądanego rozmiaru. Niech <strong>i<sub>w</sub></strong> i <strong>i<sub>h</sub></strong> oznaczają odpowiednio szerokość i wysokość obrazka wejściowego, natomiast <strong>o<sub>w</sub></strong> i <strong>o<sub>h</sub></strong> analogicznie dla obrazka wyjściowego. Obliczamy stosunki szerokości do wysokości dla obrazków:</p>
<ul>
<li><strong>R<sub>i</sub></strong> = i<sub>w</sub>/i<sub>h</sub> &#8211; w naszym przypadku wynosi on 300/300 = 1</li>
<li><strong>R<sub>o</sub> </strong>= o<sub>w</sub>/o<sub>h</sub> &#8211; w naszym przypadku wynosi on 200/100 = 2</li>
</ul>
<p>Ponieważ <strong>R<sub>o</sub></strong> jest większy niż <strong>R<sub>i</sub></strong>, czyli w obrazku wyjściowym przypada więcej pikseli szerokości na piksel wysokości, to powinniśmy wyciąć możliwe najmniejszy kawałek góry i dołu z oryginalnego obrazka tak aby uzyskać w nim współczynnik <strong>R<sub>o</sub></strong>. Wymiary pasów, które powinniśmy wyciąć obliczamy następująco:</p>
<ul>
<li>d<sub>h</sub> = i<sub>w</sub>/r<sub>o</sub> &#8211; w naszym przypadku 300/2 = 150</li>
</ul>
<p>Ponieważ sumaryczna szerokość pasa wynosi 150, to przytniemy z góry i dołu pasy o szerokości 300 i wysokości 75 i skalujemy to co zostało do rozmiaru <em>200 x 100 px</em>, przyjmując optymistycznie, że na skraju obrazka znajdują się zawsze najmniej istotne treści.</p>
<div id="attachment_338" class="wp-caption aligncenter" style="width: 310px"><img class="size-full wp-image-338" title="lena-dobrze-1" src="http://code42.pl/wp-content/uploads/2009/04/lena-dobrze-1.jpg" alt="Fragment obrazka do przeskalowania" width="300" height="300" /><p class="wp-caption-text">Fragment obrazka do przeskalowania</p></div>
<div id="attachment_341" class="wp-caption aligncenter" style="width: 210px"><img class="size-full wp-image-341" title="lena-dobrze-2" src="http://code42.pl/wp-content/uploads/2009/04/lena-dobrze-2.jpg" alt="Wynik działania metody" width="200" height="100" /><p class="wp-caption-text">Wynik działania metody</p></div>
<p>Sytuacja gdy <strong>R<sub>o</sub></strong> jest mniejsze od <strong>R<sub>i</sub></strong> jest analogiczna, nie będę więc jej omawiał. Przedstawiony algorytm jest bardzo prosty i w pseudokodzie wygląda następująco:</p>
<pre>R<sub>i</sub> = i<sub>w</sub> / i<sub>h</sub>
R<sub>o</sub> = o<sub>w</sub> / o<sub>h</sub>

if (R<sub>i</sub>  &lt;= R<sub>o</sub>)
{
  new_h = i<sub>w</sub> / R<sub>o</sub>
  segment = (i<sub>h</sub>-new<sub>h</sub>)/2
  zetnij pas o wysokości <em>segment</em> z góry i dołu
  i przeskaluj do rozmiarów <em>o<sub>w</sub> x o<sub>h</sub> px</em>
}
else
{
  new<sub>w</sub> = R<sub>o</sub> * i<sub>h</sub>
  segment = (i<sub>w</sub> - new<sub>w</sub>) / 2
  zetnij pas o szerokości <em>segment</em> z lewej i prawej
  i przeskaluj do rozmiarów <em>o<sub>w</sub> x o<sub>h</sub> px</em>
}</pre>
<p>Przy implementacji  powyższego rozwiązania w języku PHP do ścinania i skalowania przydatna może okazać się funkcja <em><a href="http://php.net/imagecopyresampled">imagecopyresampled()</a>.</em></p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/' rel='bookmark' title='Refaktoryzacja CSS — jednak coś można'>Refaktoryzacja CSS — jednak coś można</a></li>
<li><a href='http://code42.pl/2010/04/04/dwukolumnowa-lista-definicji-edit-w-html5-lista-opisow/' rel='bookmark' title='Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))'>Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/04/17/jak-przycinac-i-skalowac-obrazki/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Refaktoryzacja CSS — jednak coś można</title>
		<link>http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/</link>
		<comments>http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 09:57:07 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Różne]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[refaktoryzacja]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=255</guid>
		<description><![CDATA[Mówi się, i to raczej nie bez powodu, że refaktoryzowanie arkuszy stylów jest bardzo trudne. Jednak na szczęcie da się znaleźć przynajmniej jedno narzędzie bardzo usprawniające ten proces. Zwie się ono Dust-Me Selectors i jest dostarczane jako rozszerzenie do Firefoksa. Dust-Me Selectors robi właściwie „tylko” jedną rzecz — znajduje nieużywane selektory CSS. Jednak właśnie jest to jedna [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/17/jak-przycinac-i-skalowac-obrazki/' rel='bookmark' title='Jak przycinać i skalować obrazki?'>Jak przycinać i skalować obrazki?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Mówi się, i to raczej nie bez powodu, że refaktoryzowanie arkuszy stylów jest bardzo trudne. Jednak na szczęcie da się znaleźć przynajmniej jedno narzędzie bardzo usprawniające ten proces. Zwie się ono <a href='http://www.sitepoint.com/dustmeselectors/'>Dust-Me Selectors</a> i jest dostarczane jako rozszerzenie do <a href='http://firefox.com'>Firefoksa</a>.</p>
<p>Dust-Me Selectors robi właściwie „tylko” jedną rzecz — znajduje nieużywane selektory <abbr title='Cascading Style Sheets'>CSS</abbr>. Jednak właśnie jest to jedna z najtrudniejszych rzeczy do wykonania manualnie, szczególnie w przypadku dużych, długo rozwijanych projektów.</p>
<p>Rozszerzenie może działać na dwa sposoby:</p>
<ul>
<li>przeszukiwanie jednej strony (przydatne raczej w niewielu przypadkach),</li>
<li>tzw. <em>Spider Search</em>, czyli przeszukiwanie wszystkich linków z mapy strony.</li>
</ul>
<p>Mapa strony może być stroną HTML lub sitemapą w XML zgodną ze <a href='http://www.sitemaps.org/protocol.php'>standardem</a>. W tym pierwszym przypadku są pewne ograniczenia. Otóż domyślnie potrafi on wyskoczyć na inne, zewnętrzne domeny i je sprawdzać. Nie udało nam się znaleźć opcji zabraniającej tego, jedynie da się ograniczyć omijanie odnośników z rel=&#8221;external&#8221; i/lub rel=&#8221;nofollow&#8221;. Problem jest, gdy nasz serwis na to nie jest przygotowany. Wtedy pozostaje wygenerowanie lub napisanie sitemapy (która przecież i tak się przyda).</p>
<p>Samo działanie programu już jest bardzo proste. Wybieramy „Automation → Spider Search”, podajemy adres sitemapy lub strony HTML i czekamy na wyniki, które wyglądają na przykład tak:</p>
<div id="attachment_254" class="wp-caption aligncenter" style="width: 418px"><img src="http://code42.pl/wp-content/uploads/2009/03/dust-meresults.png" alt="Okno wyników Dust-me Selectors" title="dustmeresults" width="408" height="419" class="size-full wp-image-254" /><p class="wp-caption-text">Okno wyników Dust-me Selectors</p></div>
<p>Oczywiście znalezione selektory nie powinny trafiać od razu do kosza, bo narzędzie nie potrafi (i raczej wątpliwe żeby kiedykolwiek potrafiło) wziąć pod uwagę manipulacji dokonywanych przez JavaScript. Ponadto mogą istnieć specyficzne widoki, które nie będą mogły się znaleźć w mapie strony. Dlatego też wyniki należy traktować tylko jako listę podejrzanych. Warto dodać, że narzędzie pomogło nam szybko pozbyć się prawie dwustu linii z arkuszy CSS (przy kolejnych do dokładniejszego sprawdzenia).</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/17/jak-przycinac-i-skalowac-obrazki/' rel='bookmark' title='Jak przycinać i skalować obrazki?'>Jak przycinać i skalować obrazki?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dostosowanie grep-a do SVN i Symfony</title>
		<link>http://code42.pl/2009/02/16/dostosowanie-grep-a-do-svn-i-symfony/</link>
		<comments>http://code42.pl/2009/02/16/dostosowanie-grep-a-do-svn-i-symfony/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 09:32:00 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Różne]]></category>
		<category><![CDATA[grep]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=208</guid>
		<description><![CDATA[Jednym z nieocenionych narzędzi podczas programowania jest grep, który (jakby ktoś nie wiedział) służy do wyszukiwania treści w plikach tekstowych. Jednak, jak każde narzędzie, warto go dostosować do własnych potrzeb. Ja najczęściej stosuję go do przeszukiwania projektów będących pod kontrolą Subversion (SVN), poprzez taką instrukcję: grep -RIin "szukane" * --exclude-dir=\.svn Dla wyjaśnienia: -R — szukanie [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>
Jednym z nieocenionych narzędzi podczas programowania jest <a href='http://www.gnu.org/software/grep/'><code>grep</code></a>, który (jakby ktoś nie wiedział) służy do wyszukiwania treści w plikach tekstowych.
</p>
<p>
Jednak, jak każde narzędzie, warto go dostosować do własnych potrzeb. Ja najczęściej stosuję go do przeszukiwania projektów będących pod kontrolą <a href='http://subversion.tigris.org/'>Subversion (SVN)</a>, poprzez taką instrukcję:</p>
<pre><code>grep -RIin "szukane" * --exclude-dir=\.svn</code></pre>
<p>Dla wyjaśnienia: <code>-R</code> — szukanie rekursywne w podkatalogach, <code>-I</code> — pomijanie plików binarnych, <code>-i</code> — niewrażliwość na wielkość znaków, <code>-n</code> — wyświetlenie nr linii w wyniku.
</p>
<p>
Oczywiście wpisywanie tego za każdym razem nie ma nic wspólnego z wygodą, dlatego warto sobie utworzyć funkcję dla powłoki np. w pliku <code>.profile</code> (średniki na końcu są wymagana dla Basha, Zsh ich nie potrzebuje):</p>
<pre>
<code>function g { grep -RIn $1 * --exclude-dir=\.svn ; }</code>
<code>function gi { grep -RIin $1 * --exclude-dir=\.svn ; }</code>
</pre>
<p>Dzięki czemu wystarczy wykonać:</p>
<pre><code>
[src]> g fuck
arch/i386/kernel/cpu/cpufreq/powernow-k7.c:558: * Some Athlon laptops have really fucked PST tables.
arch/i386/kernel/cpu/mtrr/generic.c:70:/*  Some BIOS's are fucked and don't set all MTRRs the same!  */
…
</code></pre>
</p>
<p>
Z racji tego, że większość projektów piszę w <a href='http://www.symfony-project.org/'>Symfony</a>, stworzyłem sobie dodatkową wersję tej funkcji:</p>
<pre><code>function sfg { grep -RIn $1 lib/model apps/ --exclude-dir=\.svn ; }</code></pre>
<p>Odpalając ją w głównym katalogu projektu, można łatwo przeszukać wszystkie warstwy aplikacji (model, widoki, kontrolery i przy okazji parę innych).
</p>
<p>
Jest też możliwość włączenia „na stałe” niektórych opcji, poprzez wyeksportowanie zmiennej środowiskowej o nazwie GREP_OPTIONS, np.:</p>
<pre>
<code>export GREP_OPTIONS="--exclude-dir=\.svn"</code>
</pre>
<p>Ale ja osobiście tego nie stosuję.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/02/16/dostosowanie-grep-a-do-svn-i-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Connection: close + Apache Benchmark</title>
		<link>http://code42.pl/2008/12/19/connection-close-apache-benchmark/</link>
		<comments>http://code42.pl/2008/12/19/connection-close-apache-benchmark/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 12:18:04 +0000</pubDate>
		<dc:creator>Mistrz Wu</dc:creator>
				<category><![CDATA[Różne]]></category>
		<category><![CDATA[apache benchmark]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=93</guid>
		<description><![CDATA[Testowanie apache-benchmarkiem (/usr/sbin/ab) jest niewątpliwie łatwe, proste i przyjemne, nie licząc rozczarowania wynikami. Znakomicie spisuje się w przypadku Rails (nie mam pojęcia dlaczego), ale w aplikacyjach PHP może nieco zaskoczyć. Też nie wiem dlaczego, ale wydaje mi się, że jest prawdopodobnym iż… Otóż PHP, słusznie zresztą, przy braku nagłówka Connection czeka na kolejne zapytania na [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/' rel='bookmark' title='Aktualizacja oprogramowania a wydajność'>Aktualizacja oprogramowania a wydajność</a></li>
<li><a href='http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/' rel='bookmark' title='Refaktoryzacja CSS — jednak coś można'>Refaktoryzacja CSS — jednak coś można</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/girl_by_the_doors.jpg" alt="" title="girl_by_the_doors" width="427" height="262" class="aligncenter size-full wp-image-682" /></p>
<p>Testowanie <a href='http://httpd.apache.org/docs/2.0/programs/ab.html'>apache-benchmarkiem</a> (<code>/usr/sbin/ab</code>) jest niewątpliwie łatwe, proste i przyjemne, nie licząc rozczarowania wynikami. Znakomicie spisuje się w przypadku Rails (nie mam pojęcia dlaczego), ale w aplikacyjach <abbr>PHP</abbr> może nieco zaskoczyć.</p>
<p>Też nie wiem dlaczego, ale wydaje mi się, że jest prawdopodobnym iż…</p>
<p>Otóż <abbr>PHP</abbr>, słusznie zresztą, przy braku nagłówka <code>Connection</code> czeka na kolejne zapytania na tym samym połączeniu (zakłada domyślnie: <code>keep-alive</code>), a <code>ab</code> sam z siebie go nie wysyła i… zwiesza się na iluś tam otwartych połączeniach, na których nic się nie dzieje (<code>ab</code> chyba czeka aż to serwer się rozłączy). Niezbyt miło, bo to zaniża wyniki benczmarku i pogarsza i tak już złe samopoczucie.</p>
<p>Dlategoż zawsze dla pewniejszych wyników (i dobrego samopoczucia) warto dodawać <abbr>ab</abbr> opcje <code>-H&nbsp;'Connection: close'</code>. Manual mówi nawet, że przełącznikiem <code>-H</code> można też inne nagłówki wysyłać, gdyby komuś zależało.</p>
<p>Czy to jednak znaczy, że Rails w wersji cokolwiek starej, bo&nbsp;2.1.1, domyślnie zakłada <code>Connection: close</code>? To by było niesłuszne, lecz może być wytłumaczone jednowątkowością Rails. Tego niestety, już mi się nie chciało inwestygować, bo święta idą.</p>
<p>Tak więc szczęśliwego nowego jajka i co tam jeszcze!</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/19/aktualizacja-oprogramowania-a-wydajnosc/' rel='bookmark' title='Aktualizacja oprogramowania a wydajność'>Aktualizacja oprogramowania a wydajność</a></li>
<li><a href='http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/' rel='bookmark' title='Refaktoryzacja CSS — jednak coś można'>Refaktoryzacja CSS — jednak coś można</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2008/12/19/connection-close-apache-benchmark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

