<?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</title>
	<atom:link href="http://code42.pl/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>PostgreSQL: Reset wszystkich sekwencji</title>
		<link>http://code42.pl/2011/11/26/postgresql-reset-wszystkich-sekwencji/</link>
		<comments>http://code42.pl/2011/11/26/postgresql-reset-wszystkich-sekwencji/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 08:43:15 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Bazy danych]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1287</guid>
		<description><![CDATA[Problem Czasami udaje się nam doprowadzić swoją niemałą bazę danych do takiego stanu, w którym część sekwencji będzie źle ustawiona, a tym samym nie będzie możliwe dodawanie nowych danych w standardowy sposób, gdyż kolejnym id wg sekwencji, będzie takie, które już w bazie istnieje. Możemy wtedy ręcznie naprawić daną sekwencję, zgodnie z manualem: ALTER SEQUENCE [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
<li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
<li><a href='http://code42.pl/2009/01/14/czas-zycia-krotki-w-postgresie/' rel='bookmark' title='PostgreSQL: obliczanie odstępów czasu'>PostgreSQL: obliczanie odstępów czasu</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/counter.jpg" alt="" title="counter" width="536" height="167" class="aligncenter size-full wp-image-1291" /></p>
<h2>Problem</h2>
<p>Czasami udaje się nam doprowadzić swoją niemałą bazę danych do takiego stanu, w którym część sekwencji będzie źle ustawiona, a tym samym nie będzie możliwe dodawanie nowych danych w standardowy sposób, gdyż kolejnym id wg sekwencji, będzie takie, które już w bazie istnieje.</p>
<p>Możemy wtedy ręcznie naprawić daną sekwencję, zgodnie z manualem:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">SEQUENCE</span> serial RESTART <span style="color: #993333; font-weight: bold;">WITH</span> <span style="color: #cc66cc;">105</span>;</pre></div></div>

<p>Gdzie <code>serial</code> to nazwa sekwencji. Co jednak, gdy mamy kilkaset popsutych tabelek?</p>
<h2>Rozwiązanie — teoria</h2>
<p>Na szczęście PostgreSQL udostępnia nam duuużo informacji o każdej swojej bazie danych w schemie <code><a href="http://www.postgresql.org/docs/9.1/static/information-schema.html">information_schema</a></code>, która to zawiera zestaw zawsze dostępnych widoków. My tutaj wykorzystamy dwa:</p>
<ul>
<li><code>columns</code> — informacje o wszystkich kolumnach i widokach w bazie</li>
<li><code>constraint_column_usage</code> — informacje o kolumnach, które są obłożone jakimś <code>constraintem</code></li>
</ul>
<p>To co chcemy zrobić to:</p>
<ol>
<li>Znaleźć wszystkie zestawy tabela-kolumna-sekwencja (bazując na tym, że definicja sekwencji jest stała, zawiera wywołanie <code>nextval()</code>.</li>
<li>Dla każdej kolumny znaleźć największą wartość identyfikatora.</li>
<li>Zrestartować każdą sekwencję z wartością znalezioną w poprzednim kroku i zwiększoną o 1.</li>
</ol>
<h2>Rozwiązanie — praktyka</h2>
<p>W praktyce wystarczy wykonać poniższy kod w swojej bazie danych. Tworzy on funkcję naprawiającą sekwencje, wykonuje ją raz i a następnie ją kasuje. Należy pamiętać, że działanie jest ograniczone do schemy <em>public</em>. Jeśli chcemy naprawić inną, trzeba sobie kod lekko zmodyfikować (np. dodając nazwę schemy jako paramert).</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> rebuild_sequences<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">RETURNS</span> <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">AS</span>
$body$
<span style="color: #993333; font-weight: bold;">DECLARE</span>
	sequencedefs RECORD;
	c <span style="color: #993333; font-weight: bold;">INTEGER</span>;
<span style="color: #993333; font-weight: bold;">BEGIN</span>
	<span style="color: #808080; font-style: italic;">-- Find sequence name and primary key column for every table</span>
	<span style="color: #993333; font-weight: bold;">FOR</span> sequencedefs <span style="color: #993333; font-weight: bold;">IN</span>
	<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">DISTINCT</span>
		constraint_column_usage<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">TABLE_NAME</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">TABLE_NAME</span><span style="color: #66cc66;">,</span>
		constraint_column_usage<span style="color: #66cc66;">.</span>column_name <span style="color: #993333; font-weight: bold;">AS</span> column_name<span style="color: #66cc66;">,</span>
		<span style="color: #993333; font-weight: bold;">REPLACE</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">REPLACE</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">COLUMNS</span><span style="color: #66cc66;">.</span>column_default<span style="color: #66cc66;">,</span><span style="color: #ff0000;">''</span><span style="color: #ff0000;">'::regclass)'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'nextval('</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">''</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> sequence_name
		<span style="color: #993333; font-weight: bold;">FROM</span>
			information_schema<span style="color: #66cc66;">.</span>constraint_column_usage<span style="color: #66cc66;">,</span> information_schema<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">COLUMNS</span>
		<span style="color: #993333; font-weight: bold;">WHERE</span>
			constraint_column_usage<span style="color: #66cc66;">.</span>table_schema <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'public'</span> <span style="color: #993333; font-weight: bold;">AND</span> 
			<span style="color: #993333; font-weight: bold;">COLUMNS</span><span style="color: #66cc66;">.</span>table_schema <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'public'</span> <span style="color: #993333; font-weight: bold;">AND</span>
			<span style="color: #993333; font-weight: bold;">COLUMNS</span><span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">TABLE_NAME</span> <span style="color: #66cc66;">=</span> constraint_column_usage<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">TABLE_NAME</span> <span style="color: #993333; font-weight: bold;">AND</span>
			constraint_column_usage<span style="color: #66cc66;">.</span>column_name <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">COLUMNS</span><span style="color: #66cc66;">.</span>column_name <span style="color: #993333; font-weight: bold;">AND</span>
			<span style="color: #993333; font-weight: bold;">COLUMNS</span><span style="color: #66cc66;">.</span>column_default <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AND</span>
			<span style="color: #993333; font-weight: bold;">COLUMNS</span><span style="color: #66cc66;">.</span>column_default <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'nextval%'</span><span style="color: #66cc66;">&#41;</span>
	LOOP
		<span style="color: #808080; font-style: italic;">-- Find current max PK value</span>
		<span style="color: #993333; font-weight: bold;">EXECUTE</span> <span style="color: #ff0000;">'SELECT max('</span><span style="color: #66cc66;">||</span>sequencedefs<span style="color: #66cc66;">.</span>column_name<span style="color: #66cc66;">||</span><span style="color: #ff0000;">') FROM '</span> <span style="color: #66cc66;">||</span> sequencedefs<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">TABLE_NAME</span> <span style="color: #993333; font-weight: bold;">INTO</span> c;
&nbsp;
		<span style="color: #993333; font-weight: bold;">IF</span> c <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">THEN</span>
			c <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>;
		<span style="color: #993333; font-weight: bold;">ELSE</span>
			c <span style="color: #66cc66;">=</span> c <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span>;
		<span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">IF</span>;
&nbsp;
		<span style="color: #808080; font-style: italic;">-- Rebuild sequence</span>
		<span style="color: #993333; font-weight: bold;">EXECUTE</span> <span style="color: #ff0000;">'ALTER SEQUENCE '</span> <span style="color: #66cc66;">||</span> sequencedefs<span style="color: #66cc66;">.</span>sequence_name <span style="color: #66cc66;">||</span><span style="color: #ff0000;">' RESTART WITH '</span> <span style="color: #66cc66;">||</span> c;
	<span style="color: #993333; font-weight: bold;">END</span> LOOP;
&nbsp;
	<span style="color: #993333; font-weight: bold;">RETURN</span> <span style="color: #cc66cc;">1</span>;
<span style="color: #993333; font-weight: bold;">END</span>;
$body$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> plpgsql;
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span> rebuild_sequences<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> rebuild_sequences<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p class="notice">Pierwsza wersja funkcji została napisana przez <a href="http://stackoverflow.com/questions/244243/how-to-reset-postgres-primary-key-sequence-when-it-falls-out-of-sync">Klausa ze StackOverflow</a>. Wersja powyżej zawiera poprawki błędów, niedociągnięć oraz formatowania.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/07/21/logowanie-do-pliku-wszystkich-zapytan-w-postgresql/' rel='bookmark' title='Logowanie do pliku wszystkich zapytań w PostgreSQL'>Logowanie do pliku wszystkich zapytań w PostgreSQL</a></li>
<li><a href='http://code42.pl/2008/12/15/migracja-mysql%c2%a0%e2%86%92-postgresql-aplikacji-w-symfony-11/' rel='bookmark' title='Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1'>Migracja MySQL → PostgreSQL aplikacji w Symfony 1.1</a></li>
<li><a href='http://code42.pl/2009/01/14/czas-zycia-krotki-w-postgresie/' rel='bookmark' title='PostgreSQL: obliczanie odstępów czasu'>PostgreSQL: obliczanie odstępów czasu</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/11/26/postgresql-reset-wszystkich-sekwencji/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wrocław wita JavaScript – Meet.JS i Wrocław GTUG</title>
		<link>http://code42.pl/2011/11/17/wroclaw-wita-javascript-meet-js-i-wroclaw-gtug/</link>
		<comments>http://code42.pl/2011/11/17/wroclaw-wita-javascript-meet-js-i-wroclaw-gtug/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 17:28:21 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[barcamp]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gtug]]></category>
		<category><![CDATA[meet.js]]></category>
		<category><![CDATA[wrocław]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1273</guid>
		<description><![CDATA[Ku mej rozpaczy, od maja tego roku, kiedy to odbyło się szkolenie z SSJS by DevMeetings, żaden JavaScriptowy event nie zawitał do Wrocławia. Co więcej &#8211; mam wrażenie, że w ogóle nie wydarzyło się nic związanego z szeroko pojętym frontendem. Na szczęście dwie niezależne ekipy postanowiły to zmienić i tak 24 i 29 listopada odbędą [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2012/01/25/moja-prezentacja-o-node-js-z-meet-js-i-gtug-wroclaw/' rel='bookmark' title='Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław'>Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław</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/10/17/walka-dart-vs-javascript-nokaut-podczas-wazenia/' rel='bookmark' title='Walka Dart vs JavaScript &ndash; nokaut podczas ważenia'>Walka Dart vs JavaScript &ndash; nokaut podczas ważenia</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Ku mej rozpaczy, od maja tego roku, kiedy to odbyło się szkolenie z <a href="http://devmeetings.pl/trainings/javascript-na-serwerze-ringojs-v8cgi-i-nodejs">SSJS by DevMeetings</a>, żaden JavaScriptowy event nie zawitał do Wrocławia. Co więcej &ndash; mam wrażenie, że w ogóle nie wydarzyło się nic związanego z szeroko pojętym frontendem. Na szczęście dwie niezależne ekipy postanowiły to zmienić i tak <strong>24 i 29 listopada odbędą się Meet.JS i Wrocław GTUG</strong>.</p>
<h2>Meet.JS</h2>
<p>Żeby się nie powtarzać, za <a href="http://ferrante.pl/frontend/javascript/dobra-informacja-dla-wroclawa-meet-js-wroclaw-24-11/">Damianem Wielgosikiem</a>:</p>
<blockquote><p><a href="http://meetjs.pl">Meet.js</a> jako społeczna i darmowa platforma dzielenia się wiedzą o technologiach front-endowych rozwija się w niesamowitym tempie. Dzięki chłopakom z firmy <a href="http://monterail.com">Monterail.com</a> spotkania meet.js będą organizowane również &#8211; obok Poznania, Warszawy i Krakowa &#8211; we Wrocławiu.</p>
<p><strong><a href="http://www.facebook.com/event.php?eid=192419417506290">Pierwszy event</a> odbędzie się w najbliższy czwartek 24.11.2011 w siedzibie <a href="http://monterail.com">Monterail</a>. Start od 18!</strong></p>
<p>Jednocześnie poszukiwani są prelegenci do tego ekscytującego wydarzenia. Jeśli chcesz podzielić się czymś o HTML5, CSS3 czy JS nie zastanawiaj się! Bartek Pietrzak, organizator meet.js, czeka na zgłoszenia wszystkich chętnych pod <a href="mailto:bartosz@monterail.com">bartosz@monterail.com</a>.</p>
</blockquote>
<p>Więcej informacji na <a href="http://www.facebook.com/event.php?eid=192419417506290">Facebooku</a>, <a href="https://twitter.com/meetjs">@meetjs</a> i u <a href="http://ferrante.pl/frontend/javascript/dobra-informacja-dla-wroclawa-meet-js-wroclaw-24-11/">Damiana</a>.</p>
<h2>Wrocław GTUG &ndash; Wrocław Google Technology User Group</h2>
<p>Z braku weny, również cytat, tym razem z <a href="http://wroclaw.gtug.pl/eventy/spotkanie1-chromeapps">oficjalnej strony wydarzenia</a>:</p>
<blockquote><p>Zapraszamy serdecznie na pierwsze spotkanie wrocławskiej grupy GTUG.</p>
<p>Zaczniemy krótkim wprowadzeniem na temat działalności naszej grupy. Jednakże tematem wiodącym spotkania będą aplikacje dla platformy Chrome. Poruszone zostaną zagadnienia związane z możliwościami jakie daje ta platforma. Postaramy się zaprezentować przykładowe aplikacje oraz technologie wykorzystane do ich stworzenia.</p>
<p>Na koniec przedstawimy pomysły na kolejne eventy i ewentualne tematy kolejnych spotkań.
<p><strong>Po spotkaniu proponujemy wspólne wyjście na piwo :)</strong></p>
</blockquote>
<p>Spotkanie odbędzie się we <strong><a href="http://mapy.google.pl/maps?q=Google+Wroclaw,+Wroclaw&#038;hl=pl&#038;ll=51.117607,17.042401&#038;spn=0.001658,0.004128&#038;sll=51.097846,17.053824&#038;sspn=0.013273,0.033023&#038;vpsrc=6&#038;t=w&#038;hq=Google+Wroclaw,+Wroclaw&#038;z=19&#038;iwloc=A">wrocławskim biurze Google (Bema Plaza)</a> we wtorek, 29 listopada, o godzinie 19:00</strong>. Możliwe są jeszcze drobne korekty dotyczące miejsca i na pewno pojawi się formularz rejestracyjny. Tak więc polecam śledzić WroGTUG-a, do wyboru &ndash; <a href="http://www.facebook.com/wroclawgtug">Facebook</a>, <a href="https://plus.google.com/114034723187684195194/posts">Google+</a>, <a href="https://twitter.com/wroclawgtug">@wroclawgtug</a>.</p>
<h2>Do zobaczenia!</h2>
<p>Ja okazji nie przegapię i jeśli studia nie przeszkodzą, to pojawię się na obu spotkaniach. Sam niestety, ze względu na napięty czas przed obroną pracy inżynierskiej, nic nie powiem, ale prelegentów nigdy dość, więc chętni niech się zgłaszają :).</p>
<p>Przy okazji dowiedziałem się, że nie tylko ja uważam, że we Wrocławiu firm zajmujących się frontendem na poziomie praktycznie nie ma. Mamy setki korporacyjnych miejsc pracy dla programistów Javy i C#, ale związanych z webem prawie nie widać. Najgorzej wypada JavaScript, w związku z czym swój wzrok musiałem skierować na Poznań, Kraków, czy Warszawę. Trochę szkoda będzie wyjeżdżać :).</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2012/01/25/moja-prezentacja-o-node-js-z-meet-js-i-gtug-wroclaw/' rel='bookmark' title='Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław'>Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław</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/10/17/walka-dart-vs-javascript-nokaut-podczas-wazenia/' rel='bookmark' title='Walka Dart vs JavaScript &ndash; nokaut podczas ważenia'>Walka Dart vs JavaScript &ndash; nokaut podczas ważenia</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/11/17/wroclaw-wita-javascript-meet-js-i-wroclaw-gtug/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Walka Dart vs JavaScript &#8211; nokaut podczas ważenia</title>
		<link>http://code42.pl/2011/10/17/walka-dart-vs-javascript-nokaut-podczas-wazenia/</link>
		<comments>http://code42.pl/2011/10/17/walka-dart-vs-javascript-nokaut-podczas-wazenia/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 22:47:04 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[dart]]></category>
		<category><![CDATA[ecmascript]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[harmony]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1260</guid>
		<description><![CDATA[Myślałem, że nie napiszę nic o Darcie, bo cała historia z nim związana z początku nie wywoływała we mnie żadnych specjalnie negatywnych czy pozytywnych emocji. Dzięki Zbyszkowi Branieckiemu i Markowi Stępniowi trochę szerzej spojrzałem na temat, biorąc pod uwagę też historie o których, czy to z racji mojego krótkiego życia, czy braku wiedzy o pracach [...]


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/2010/12/22/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/' rel='bookmark' title='Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka'>Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka</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>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Myślałem, że nie napiszę nic o Darcie, bo cała historia z nim związana z początku nie wywoływała we mnie żadnych specjalnie negatywnych czy pozytywnych emocji. Dzięki <a href="http://diary.braniecki.net/">Zbyszkowi Branieckiemu</a> i <a href="http://blog.marcoos.com/">Markowi Stępniowi</a> trochę szerzej spojrzałem na temat, biorąc pod uwagę też historie o których, czy to z racji mojego krótkiego życia, czy braku wiedzy o pracach komitetów i producentów przeglądarek, nie wiedziałem i&#8230; sami przeczytajcie. Załączam poniżej coś co miało stać się przydługim komentarzem na <a href="http://www.goldenline.pl/forum/2621108/czy-dart-to-nastepca-javascriptu-od-google">forum Goldenline</a>.</p>
<h2>Pożal się Google</h2>
<p>To co zrobiło Google, to żart. Cała historia z wewnętrznymi, nie do końca miłymi mailami z Google&#8217;a, które wyszły na światło dzienne, sam Dart i otoczka PR-owa jaką ma, to jedno wielkie nieporozumienie. Google się nie popisało i, moim skronym zdaniem, wyjdzie to tylko na dobre open webowi.</p>
<p>Wyobraźmy sobie, co by się stało gdyby Dart rzeczywiście powalał na kolana i miałby świetnie zaimplementowaną, super wydajną i dostępną out of the box w Chrome maszynę. Szybko znalazłoby się grono fan boy&#8217;ów, którzy bez zastanowienia zaczęliby pisać aplikacje &#8222;only for Chrome&#8221;, bądź &#8222;works best with Chrome&#8221;, z ewentualną, wątpliwej jakości, kompilacją do powolnego i starego JavaScriptu dla &#8222;gorszych przeglądarek&#8221;. (BTW. <a href="https://gist.github.com/1277224">hello world w Dartcie</a> skompilowany do JS to 17<strong>000</strong> linii kodu :D).</p>
<p><span id="more-1260"></span></p>
<p>Po chwili okazałoby się, że Google, wykorzystując swoją pozycję lidera na wielu rynkach, zaczyna (pośrednio &ndash; przez zadowolonych użytkowników) wymuszać na innych producentach implementację Darta. No dobra &ndash; wygrał, ale w czym problem, pytacie? W tym, że Google nie raczy podzielić się odpowiedniej jakości specyfikacją języka i Mozilla, MS, czy Opera zostają zmuszone do reverse engineeringu z Chrome&#8217;a. Brzmi jak głupia apokaliptyczna wizja? Problem w tym, że ten przypadek już mieliśmy z protokołem SPDY, ponieważ Mozilla została zmuszona przez Google do zgadywania jak on w szczegółach działa. Koniec końców, po wykonaniu nieprzyjemnej pracy, pozostali producenci i tak kończą z &#8222;gorszą&#8221; implementacją. Innymi słowy &ndash; wracamy do czasów wojny przeglądarek i nieczystych zagrań. W dodatku pieczę nad specyfikacją języka sprawuje Google i wcale nie mamy pewności, czy się nią podzieli.</p>
<p>Dalej brzmi to jak bajka? Ciekawostka &ndash; opublikowana &#8222;specyfikacja&#8221; (wczesny draft oczywiście) Darta ma 70 stron, a specyfikacja wiele razy mniej złożonego ES5 250 stron. I nie, nie z powodu wielkości fonta. Mówicie &ndash; są języki, które radzą sobie bez specyfikacji &ndash; Python, Ruby &ndash; i są świetne (ktoś wymienił PHP &ndash; strzał w stopę w tej dyskusji :D). Tak, ale implementuje je jeden producent. W webie to nie działa i nigdy nie działało. Chcecie żeby przeglądarki miały spójne implementacje, to nie cofajcie się teraz o krok wstecz (prawie jak cofać się do tyłu :P). Nie po to wielokrotnie straciliśmy włosy na głowie (a i twarz też, bo czasami głupio się przyznać &ndash; &#8222;jestem programistą JavaScript&#8221;), by zapominać czego nauczyła nas historia. Nie po to został włożony i nadal jest wkładany ogromny trud w to, by ujednolicić i dogłębnie dospecyfikować wykorzystywane przez nas technologie, byśmy teraz tę pracę skreślili i zaczęli od początku. W szczególności, że&#8230;<br />
<h2>Na poważnie, czyli z forkowaniem za pan brat</h2>
<p>&#8230; nie ma takiej potrzeby. Wiele osób, w tym i ja, narzeka na JavaScript. Niektórzy wciąż nie wiedzą ile naprawił ES5 ze strict modem, niektórzy też nie zdają sobie sprawy ile jeszcze problemów jest do rozwiązania. Większość jednak narzeka i moim zdaniem słusznie. Na szczęście trwają prace nad ES6 aka Harmony aka ES.next (w których oczywiście Google uczestniczy). O ile, co smutne, ale racjonalne, ES5 nie wprowadził żadnych (może poza strict modem) przełomowych zmian w JavaScriptcie, o tyle ES6 takie zmiany ma wprowadzić, włącznie z dużymi w składni (choć Marcoos mi ostatnio powiedział, że myślą o wydaniu pośrednim, bez zmian składniowych, stąd pośrednie nazwy &ndash; oby pomysł upadł &ndash; miejcie jaja, Panowie!).</p>
<p>Na pewno jednak ten właściwy ES6 zrywa ze wsteczną zgodnością. Jest więc pole do popisu i czas, by, jeśli ktoś się postara, niemal od nowa projektować pewne aspekty języka. Można mieć tylko jeden zarzut do Harmony &ndash; nic nie wiemy o planowanym terminie zakończenia prac. Jednym z argumentów zwolenników strategii Google jest to, że &#8222;nie chcieli czekać, aż się powolny komitet naprodukuje i jako największy gracz wzięli sprawy w swoje ręce&#8221;. Brzmi niemal przekonująco. Poza tym, że Darta też szybko w wersji stabilnej i szeroko dostępnej nie zobaczymy (jeśli w ogóle). W dodatku praktyka odległej wersji finalnych HTML5 i CSS3 pokazuje, że dzięki wczesnym prototypom częściowym możemy raz, że wiele poprawić jeszcze podczas prac nad specyfikacją, dwa że płynnie przejść pomiędzy wersjami i szybko z nowych ficzerów korzystać. Co prawda JavaScript, to nie CSS, gdzie możemy sobie pozwolić na graceful degradation, jednak gracze typu Google bez problemu mogą serwować inne źródła w zależności od zdolności przeglądarki (a i tak mówimy o kompilacji ES6 do ES3, bo polyfilli to nie będzie). W dodatku wiele osób pisze aplikacje w JavaScript na w miarę przewidywalne środowiska (intranet, komórki, serwer), gdzie problemu nie ma w ogóle.</p>
<p>Stąd przechodzę do pytania &ndash; dlaczego Google zamiast forkować istniejące rozwiązania, nie zdecydowało się na wczesną, testową implementację ES6 w V8 (choć zdaje się chodziły takie słuchy)? Dzięki temu mogłoby wpływać na prace komitetu (wprowadzać ficzery w V8 i pokazywać, że świetnie się przyjmują wśród developerów, bądź po prostu dobrze działają), przyspieszyć je i poprawić zawczasu wiele wątpliwych kwestii. Spotkałem się też z argumentem, że konkurencja jest przecież dobra. Owszem, mamy na szczęście kilku producentów i stosunkowo równomierny ich udział w rynku. Moim zdaniem to wystarcza, co widać choćby na przykładzie wcześniej przeze mnie wspomnianych HTML5 i CSS3 (kontrargument swoją drogą, to to, że wyścig rodzi kiepskie implementacje &ndash; vide koszmarne formsy).</p>
<p>Bawi mnie niezmiernie jeszcze jedna kwestia. Dart wcale nie jest fajny. Wygląda jak Java, jest toporny, nie ściągnie gawiedzi jak laska z cycem na wierzchu zwana CoffeeSkryptą (BTW. uroda z inteligencją w parze nie idzie &ndash; to może ten Dart taki zły nie jest? Małżeństwo z rozsądku? ;). Nie jest też wybitnie rewolucyjny, ani&#8230; odległy od ES6. Koncepcje, które znalazłem w Dartcie widywałem też w materiałach o ES6. Jego implementacja też póki co nie powala na ziemię pod względem wydajności, a był to przecież podobno jeden z powodów porzucenia JS. W dodatku pokazuje to jak wiele pracy jest do wykonania, by dogonić już wiele lat rozwijany engine V8. To jest kolejny powód dla którego nie rozumiem decyzji Google&#8217;a.</p>
<h2>Jest też plus</h2>
<p>Jest jednak jedna rzecz, która mi się podoba w Dartcie &ndash; szersza biblioteka standardowa (włączając w to sensowną implementację DOM-a). Uważam, że w tej chwili jednym z największych problemów JavaScriptu, jest brak ustandaryzowanych (mniej, lub bardziej formalnie) podstawowych narzędzi. Ja np. w najświeższym projekcie postanowiłem wykorzystać <a href="https://github.com/medikoo/deferred">deferred</a> i <a href="https://github.com/medikoo/es5-ext">es5-ext</a> skompilowane do niecommonjsowej postaci. Zastanawiałem się jednak, czy nie wolę underscore&#8217;a. Ale zaraz &ndash; deferred i tak korzysta z es5-ext, więc ten kod i tak załaduję (tutaj ukłon w kierunku Medikoo &ndash; na szczęscie es5-ext jest 100% zmodularyzowane, więc konfigurowalne). Potrzebowałem jeszcze czegoś do DOM-a. Z jQuery nie skorzystam, bo nie potrzebuję 90% (dosłownie!) tej biblioteki, w dodatku pokrywa mi się z deferred i trochę es5-ext, no i szukałem czegoś lekkiego. Trafiłem na xui.js, które okazało się niedopieszczone. Szukałem czegoś do single page apps &ndash; Backbone? Nieee&#8230; ktoś wymyślił, że dla XHR-a,  delegate&#8217;a i deferred (i czegoś jeszcze?) skorzysta z jQuery. Jeszcze gorzej chyba ze Spine.js, gdzie znalazłem jakoś z 5 odniesień do jQuery, ale zaszytych głęboko w kodzie, bez możliwości łatwej podmiany. Przy całym tym śmietniku idiotycznych decyzji twórców tych (i wielu innych) narzędzi, są myślące osobniki, które wyprodukowały takie mini biblioteki jak <a href="http://millermedeiros.github.com/crossroads.js/">Crossroads</a>, czy <a href="http://millermedeiros.github.com/js-signals/">js-signals</a>. Robiące dokładnie jedną rzecz i nie zawierające zbędnych zależności.</p>
<p>Żalę się generalnie, ale nie bez powodu. Dart rozwiązałby połowę moich problemów. Mamy i promise&#8217;y, i wygodniejszego DOM-a. Dużo więcej ciekawych rzeczy niestety nie znalazłem, ale początek jest dobry. Uważam, że to jest aspekt języka, na który powinny zwrócić uwagę osoby pracujące nad ES6. Wiem na pewno, że jeden problem zostanie rozwiązany &ndash; zostaną wprowadzone natywne moduły. Trochę martwi mnie ich rozbieżność w stosunku do CommonJS-owej wersji (i trochę niezrozumiała dla mnie decyzja o wprowadzeniu nowej składni), ale może uda się to zgrabnie rozegrać.</p>
<h2>Podsumowując</h2>
<p>Nie wierzę, a przynajmniej nie chcę wierzyć, w sukces Darta. Póki co niczym mnie nie zainteresował i nie zamierzam się w niego zagłębiać. Mam nadzieję, że byłaby to strata czasu.</p>
<p>Zauważyliście pewnie, że brakuje w treści linków do źródeł. Tak &ndash; nie chce mi się. Google w tym wypadku pomoże :). Poza tym, nie chcę być wyrocznią, nie chcę napisać pracy doktorskiej, nie chcę nikogo zniszczyć, wypunktowując go bezlitośnie. Co więcej, możliwe, że sam niedługo zmienię na co poniektóre tematy zdanie, bo i nie mam pełnej wiedzy o tym co się dzieje i co się stanie. Powyższa opinia rodziła się we mnie jednak już kilka tygodni, więc nie jest też pisana pod wpływem wielkich emocji. Może więc jest racjonalna :).</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/2010/12/22/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/' rel='bookmark' title='Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka'>Zarezerwowane słowa kluczowe w JavaScript &#8211; gramatyka języka</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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/10/17/walka-dart-vs-javascript-nokaut-podczas-wazenia/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Moje prezentacje z DevMeetings i MeetJS</title>
		<link>http://code42.pl/2011/10/09/moje-prezentacje-z-devmeetings-i-meetjs/</link>
		<comments>http://code42.pl/2011/10/09/moje-prezentacje-z-devmeetings-i-meetjs/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 13:59:58 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[HTML + CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[deferred]]></category>
		<category><![CDATA[devmeetings]]></category>
		<category><![CDATA[middle-end]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[promise]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1255</guid>
		<description><![CDATA[Trzy tygodnie temu zapraszałem Was na warsztaty DevMeetings z middle-endu, które prowadziłem. Dodatkowo, czego jeszcze wtedy nie wiedziałem, zostałem zaproszony jako speaker na MeetJS do Krakowa, gdzie zdecydowałem się opowiedzieć o jednym wątku z DevMeetingu &#8211; asynchronicznej pułapce. Poniżej zamieszczam linki do tych prezentacji. Podobne wpisy:Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław Darmowe [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2012/01/25/moja-prezentacja-o-node-js-z-meet-js-i-gtug-wroclaw/' rel='bookmark' title='Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław'>Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław</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/2011/09/20/zapraszam-na-darmowe-szkolenie-devmeeting-middle-end-w-oparciu-o-nodejs/' rel='bookmark' title='Zapraszam na darmowe szkolenie DevMeeting &ndash; middle-end w oparciu o NodeJS'>Zapraszam na darmowe szkolenie DevMeeting &ndash; middle-end w oparciu o NodeJS</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Trzy tygodnie temu <a href="http://code42.pl/2011/09/20/zapraszam-na-darmowe-szkolenie-devmeeting-middle-end-w-oparciu-o-nodejs/">zapraszałem Was</a> na <a href="http://devmeetings.pl/trainings/middle-end-w-oparciu-o-serverside-js">warsztaty DevMeetings z middle-endu</a>, które prowadziłem. Dodatkowo, czego jeszcze wtedy nie wiedziałem, zostałem zaproszony jako speaker na <a href="http://meetjs.pl">MeetJS</a> do Krakowa, gdzie zdecydowałem się opowiedzieć o jednym wątku z DevMeetingu &ndash; asynchronicznej pułapce. Poniżej zamieszczam linki do tych prezentacji.</p>
<p><a href="http://reinmar.github.com/dm-middle-end/pres/"><img src="http://code42.pl/wp-content/uploads/middleend.png" alt="Middle-end w oparciu o NodeJS @ DevMeetings by Piotrek Koszuliński"></p>
<p><a href="http://reinmar.github.com/meetjs-async/"><img src="http://code42.pl/wp-content/uploads/asynchroniczna_pulapka.png" alt="Asynchroniczna pułapka @ MeetJS by Piotrek Koszuliński"></p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2012/01/25/moja-prezentacja-o-node-js-z-meet-js-i-gtug-wroclaw/' rel='bookmark' title='Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław'>Moja prezentacja o Node.JS z Meet.JS i GTUG Wrocław</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/2011/09/20/zapraszam-na-darmowe-szkolenie-devmeeting-middle-end-w-oparciu-o-nodejs/' rel='bookmark' title='Zapraszam na darmowe szkolenie DevMeeting &ndash; middle-end w oparciu o NodeJS'>Zapraszam na darmowe szkolenie DevMeeting &ndash; middle-end w oparciu o NodeJS</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/10/09/moje-prezentacje-z-devmeetings-i-meetjs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN: Wycofywanie (zatwierdzonych) zmian</title>
		<link>http://code42.pl/2011/10/08/svn-wycofywanie-zatwierdzonych-zmian/</link>
		<comments>http://code42.pl/2011/10/08/svn-wycofywanie-zatwierdzonych-zmian/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 08:55:02 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[SVN]]></category>
		<category><![CDATA[svn:merge]]></category>
		<category><![CDATA[svn:revert]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1227</guid>
		<description><![CDATA[Wycofywanie zmian w Subversion można podzielić na dwie kategorie. Pierwsza to wycofywanie zmian lokalnych, jeszcze przed wysłaniem do repozytorium. Druga to odwracanie zmian już zatwierdzonych. Wycofywanie lokalne Anulowanie zmian w kopii lokalnej jest w miarę proste i intuicyjne. Wykorzystujemy tutaj podpolecenie revert, po którym podajemy nazwę pliku lub maskę. Opcją którą właściwie trzeba znać jest [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/05/19/naj-opisy-zmian-w-kodzie/' rel='bookmark' title='Naj- opisy zmian w kodzie'>Naj- opisy zmian w kodzie</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/no-turn-around-199x300.jpg" alt="" title="no-turn-around" width="199" height="300" class="alignright size-medium wp-image-1245" /></p>
<p>Wycofywanie zmian w Subversion można podzielić na dwie kategorie. Pierwsza to wycofywanie zmian lokalnych, jeszcze przed wysłaniem do repozytorium. Druga to odwracanie zmian już zatwierdzonych.</p>
<h2>Wycofywanie lokalne</h2>
<p>Anulowanie zmian w kopii lokalnej jest w miarę proste i intuicyjne. Wykorzystujemy tutaj podpolecenie <code>revert</code>, po którym podajemy nazwę pliku lub maskę. Opcją którą właściwie trzeba znać jest <code>-R</code>, która włącza wycofywanie rekursywne. Przykłady:</p>
<p>Anulowanie zmian w pliku &#8216;playground&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">svn revert playground</pre></div></div>

<p>Anulowanie wszystkich zmian w projekcie (uruchamiane w głównego katalogu):</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">svn revert -R *</pre></div></div>

<h2>Wycofywanie zmian z repozytorium</h2>
<p>W Subversion <em>de facto</em> nie da się wycofać zmiany już zatwierdzonej. Zamiast tego można jednak zatwierdzić zmiany odwrotne do wprowadzonych. Efekt będzie taki jak zamierzony, jednak „wadliwe” zmiany zostaną w historii. Dlatego konieczne jest tutaj użycie podpolecenia <code>merge</code> a nie <code>revert</code>, które, patrząc na nazwę, wydawało by się bardziej intuicyjne.</p>
<p><span id="more-1227"></span></p>
<p>Zakres zmian do wycofania możemy podać używając dwóch przełączników:</p>
<p><code>-c</code> Podajemy nr jednego zatwierdzenia, który może być ujemy. Podanie <code>-c 123</code> jest równoważne z <code>-r 122:123</code>, natomiast <code>-c -64</code> to to samo co <code>-r 65:64</code></p>
<p><code>-r</code> Podajemy zakres zatwierdzeń. Przykładowo <code>-r 100:120</code>.</p>
<p>Podając malejący zakres rewizji lub nr poprzedzony minusem otrzymujemy zmian odwrotne do wprowadzonych, co można sobie fajnie sprawdzić używając podpolecenia <code>diff</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #660033;">-r</span> <span style="color: #000000;">56</span>:<span style="color: #000000;">57</span> testfile 
Index: testfile
===================================================================
<span style="color: #660033;">---</span> testfile    <span style="color: #7a0874; font-weight: bold;">&#40;</span>revision <span style="color: #000000;">56</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
+++ testfile    <span style="color: #7a0874; font-weight: bold;">&#40;</span>revision <span style="color: #000000;">57</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">@@</span> <span style="color: #660033;">-1</span> +<span style="color: #000000;">1</span>,<span style="color: #000000;">3</span> <span style="color: #000000; font-weight: bold;">@@</span>
 Treść początkowa
+
+Wprowadzenie treści błędnej</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #660033;">-c</span> <span style="color: #660033;">-57</span> testfile
Index: testfile
===================================================================
<span style="color: #660033;">---</span> testfile    <span style="color: #7a0874; font-weight: bold;">&#40;</span>revision <span style="color: #000000;">57</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
+++ testfile    <span style="color: #7a0874; font-weight: bold;">&#40;</span>revision <span style="color: #000000;">56</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">@@</span> -<span style="color: #000000;">1</span>,<span style="color: #000000;">3</span> +<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">@@</span>
 Treść początkowa
-
<span style="color: #660033;">-Wprowadzenie</span> treści błędnej</pre></div></div>

<p>Powyższe przykłady prezentują jak podejrzeć wprowadzoną zmianę oraz jak otrzymać patch do jej wycofania. Samo wycofanie polega na scaleniu zmian odwrotnych oraz zatwierdzeniu tej zmiany:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">svn</span> merge <span style="color: #660033;">-c</span> <span style="color: #660033;">-57</span> testfile
<span style="color: #660033;">---</span> Reverse-merging r57 into <span style="color: #ff0000;">'testfile'</span>:
U    testfile
&nbsp;
<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">diff</span> testfile 
Index: testfile
===================================================================
<span style="color: #660033;">---</span> testfile    <span style="color: #7a0874; font-weight: bold;">&#40;</span>revision <span style="color: #000000;">57</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
+++ testfile    <span style="color: #7a0874; font-weight: bold;">&#40;</span>working copy<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">@@</span> -<span style="color: #000000;">1</span>,<span style="color: #000000;">3</span> +<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">@@</span>
 Treść początkowa
-
<span style="color: #660033;">-Wprowadzenie</span> treści błędnej
&nbsp;
<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">svn</span> ci</pre></div></div>



<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/05/19/naj-opisy-zmian-w-kodzie/' rel='bookmark' title='Naj- opisy zmian w kodzie'>Naj- opisy zmian w kodzie</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/10/08/svn-wycofywanie-zatwierdzonych-zmian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: Statyczne zmienne funkcji — do czego mogą się przydać?</title>
		<link>http://code42.pl/2011/09/24/php-statyczne-zmienne-funkcji-%e2%80%94-do-czego-moga-sie-przydac/</link>
		<comments>http://code42.pl/2011/09/24/php-statyczne-zmienne-funkcji-%e2%80%94-do-czego-moga-sie-przydac/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 09:47:44 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[static]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=974</guid>
		<description><![CDATA[Jak statyczne zmienne działają? Wielu z nas jest przyzwyczajonych do tego, że elementy oznaczone jako statyczne to coś co występuje tylko w klasach. Jednak słówka static można również użyć w zwykłej funkcji do oznaczenia zmiennej. Czym się różni zwykła zmienna od statycznej? Wartość statycznej zmiennej jest inicjowana za pierwszym wywołaniem funkcji i zapamiętywana pomiędzy jej [...]


Podobne wpisy:<ol><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>
<li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='PHP: Sortowanie obiektów po dacie utworzenia'>PHP: Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/' rel='bookmark' title='PHP: prawie jak parametry nazwane'>PHP: prawie jak parametry nazwane</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h2><img class="aligncenter size-full wp-image-1214" title="static" src="http://code42.pl/wp-content/uploads/static.jpg" alt="" width="536" height="86" /><span></span></h2>
<h2>Jak statyczne zmienne działają?</h2>
<p>Wielu z nas jest przyzwyczajonych do tego, że elementy oznaczone jako statyczne to coś co występuje tylko w klasach. Jednak słówka <code>static</code> można również użyć w zwykłej funkcji do oznaczenia zmiennej. Czym się różni zwykła zmienna od statycznej?</p>
<p>Wartość statycznej zmiennej jest inicjowana za pierwszym wywołaniem funkcji i <strong>zapamiętywana</strong> pomiędzy jej kolejnymi wywołaniami. Czyli zachowuje się zupełnie podobnie do klasowych zmiennych statycznych, tyle że nie za bardzo jest do niej dostęp z zewnątrz.</p>
<h2>Gdzie to się może przydać?</h2>
<h3>1. Licznik wywołań funkcji.</h3>
<p>Sztandarowym przykładem wykorzystania statycznych zmiennych w funkcji jest licznik jej wywołań, raczej rzadko wykorzystywany w praktyce.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> say_hello_and_count_yourself<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    static <span style="color: #000088;">$counter</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Hello! I've already said this &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$counter</span><span style="color: #339933;">++.</span><span style="color: #0000ff;">&quot; time(s).&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><span id="more-974"></span></p>
<h3>2. Licznik elementów na stronicowanej liście</h3>
<p>Tu już przykład z życia wzięty. Mamy do wyświetlenia listę elementów podzieloną na strony i chcemy wyświetlić liczby porządkowe przy każdym z nich. Do funkcji jako parametr podajemy nr strony i za każdym jej wywołaniem dostajemy liczbę większą o jeden (oczywiście z uwzględnieniem strony na której aktualnie jesteśmy):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> calculate_order_num <span style="color: #009900;">&#40;</span><span style="color: #000088;">$page</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>PER_PAGE <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$page</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>3. Odróżnianie parzystych i nieparzystych wierzy</h3>
<p>Dość często zachodzi potrzeba pokolorowowania co drugiego wiersza w tabeli w inny sposób. Wykorzystując statyczne zmienne, możemy sobie napisać zwięzłą i możliwą do wykorzynia wiele razy funkcję:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> calculate_parity <span style="color: #009900;">&#40;</span><span style="color: #000088;">$word1</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'odd'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$word2</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'even'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$current</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$current</span> <span style="color: #339933;">=</span> <span style="color: #339933;">!</span><span style="color: #000088;">$current</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$current</span> ? <span style="color: #000088;">$word1</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$word2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wywołując tę funkcję wiele razy będziemy otrzymywać podane wartości naprzemiennie. Przykładowo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;tr class=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span> calculate_parity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;…
&lt;tr class=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span> calculate_parity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;…
&lt;tr class=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span> calculate_parity<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;…</pre></div></div>

<p>Da nam:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;tr class=&quot;odd&quot;&gt;…
&lt;tr class=&quot;even&quot;&gt;…
&lt;tr class=&quot;odd&quot;&gt;…</pre></div></div>

<h2>Prędkość działania</h2>
<p>Miałem podejrzenia, że przechowywanie wartości w zmiennej statycznej może działać nieco szybciej niż w standardowy sposób jednak okazało się inaczej, przynajmniej w jednym prostym teście. Na (pozbawionym sensu) przykładzie sumowania kolejnych liczb:</p>
<p>1) Sumę trzymamy w „globalu” a funkcja do aktualnej sumy dodaje składnik:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> sum_up <span style="color: #009900;">&#40;</span><span style="color: #000088;">$sum</span><span style="color: #339933;">,</span> <span style="color: #000088;">$addend</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$sum</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$addend</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">40000000</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> sum_up <span style="color: #009900;">&#40;</span><span style="color: #000088;">$sum</span><span style="color: #339933;">,</span> <span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$sum</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Średni czas wykonania: 13-14s.</p>
<p>2) Sumę inicjujemy w funkcji i tam ją trzymamy:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> sum_up <span style="color: #009900;">&#40;</span><span style="color: #000088;">$addend</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	static <span style="color: #000088;">$sum</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$sum</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$addend</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #cc66cc;">40000000</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$s</span> <span style="color: #339933;">=</span> sum_up <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$s</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Średni czas wykonania: 15-16s.</p>
<p>Także jak widać, ze zmiennymi statycznym jest wolniej. Do tego, pierwszy przykład można zoptymalizować, przekazując zmienną przez referencję, ale tego już nie robiłem, żeby zachować odzwierciedlenie działania możliwie dobrze (i mam nadzieje, że nic nie pomieszałem).</p>
<h2>Podsumowanie</h2>
<p>Podsumowując: bardzo wielu zastosowań dla zmiennych statycznych w funkcji nie widać, jednak w kilku przypadkach mogą one nam całkiem fajnie skrócić i uprościć kod. Jednocześnie trzeba się liczyć z tym, że ich wykorzystanie może nie być najszybszym rozwiązaniem, jednak są to różnice, które dla 99.9% projektów są raczej pomijalne.</p>


<p>Podobne wpisy:<ol><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>
<li><a href='http://code42.pl/2009/02/23/sortowanie-obiektow-po-dacie-utworzenia/' rel='bookmark' title='PHP: Sortowanie obiektów po dacie utworzenia'>PHP: Sortowanie obiektów po dacie utworzenia</a></li>
<li><a href='http://code42.pl/2010/03/03/php-prawie-jak-parametry-nazwane/' rel='bookmark' title='PHP: prawie jak parametry nazwane'>PHP: prawie jak parametry nazwane</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/09/24/php-statyczne-zmienne-funkcji-%e2%80%94-do-czego-moga-sie-przydac/feed/</wfw:commentRss>
		<slash:comments>5</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>JavaScript na jesień 2011</title>
		<link>http://code42.pl/2011/08/29/javascript-na-jesien-2011/</link>
		<comments>http://code42.pl/2011/08/29/javascript-na-jesien-2011/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 14:59:52 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[HTML + CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[chouchdb]]></category>
		<category><![CDATA[devmeetings]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[middle-end]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[ssjs]]></category>
		<category><![CDATA[wydajność]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1168</guid>
		<description><![CDATA[Nieubłaganie zbliżamy się do końca lata, a na pewno letniej pogody. Warto więc zaplanować sobie kilka indoorowych imprez. Oto moje propozycje: DevMeetings &#8211; hot topics Na początku lata ekipa z DevMeetings zorganizowała trzydniowy DevCamp, na którym wykrystalizowały się trzy ciekawe backendowe tematy. Teraz nadszedł czas, aby przyjrzeć im się dokładniej. I tak odbędą się po [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2011/05/08/falsy-values-2011-prawdziwy-javascriptowy-event/' rel='bookmark' title='Falsy Values 2011 &#8211; prawdziwy JavaScriptowy event'>Falsy Values 2011 &#8211; prawdziwy JavaScriptowy event</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/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>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Nieubłaganie zbliżamy się do końca lata, a na pewno letniej pogody. Warto więc zaplanować sobie kilka indoorowych imprez. Oto moje propozycje:</p>
<h2><a href="http://devmeetings.pl">DevMeetings &ndash; hot topics</a></h2>
<p><img alt="DevMeetings - hot topics" src="http://code42.pl/wp-content/uploads/dm_logos.png" width="536" height="124"/></p>
<p>Na początku lata ekipa z DevMeetings zorganizowała trzydniowy <a href="http://devcamps.pl">DevCamp</a>, na którym wykrystalizowały się trzy ciekawe backendowe tematy. Teraz nadszedł czas, aby przyjrzeć im się dokładniej. I tak odbędą się po kolei:</p>
<p><span id="more-1168"></span></p>
<ul>
<li><strong><a href="http://devmeetings.pl/trainings/wydajno%C5%9B%C4%87-nodejs-kontra-reszta-%C5%9Bwiata">Wydajność Node.JS kontra reszta świata</a></strong> (3 września, Poznań) &ndash; kontrowersyjny temat &ndash; ile prawdy jest we wszystkich stwierdzeniach o super wydajności Node&#8217;a? Trochę na ten temat dowiedzieliśmy się już na <a href="http://devcamps.pl/">DevCampie</a> (polecam zajrzeć do materiałów z naszych badań), jednak wiele osób krytykowało zastosowane podejście jako zbyt oderwane od rzeczywistości. Dlatego tym razem postaramy przygotować się prawdziwą aplikację i na tej podstawie wyciągnąć wnioski. Rozpoczęła się już <a href="http://devmeetings.pl/trainings/wydajno%C5%9B%C4%87-nodejs-kontra-reszta-%C5%9Bwiata#forum">dyskusja</a>, o tym jak podejść do tematu. <strong>Ja oczywiście będę</strong>, a Ty wciąż możesz się <strong><a href="http://devmeetings.pl/trainings/wydajno%C5%9B%C4%87-nodejs-kontra-reszta-%C5%9Bwiata#registration_form">zarejestrować</a></strong>.</li>
<li><strong><a href="http://devmeetings.pl/trainings/bazy-nosqlowe-naturalny-storage-aplikacji-jsowych">Bazy noSQL-owe &ndash; naturalny storage aplikacji JSON-owych</a></strong> (10 września, Warszawa) &ndash; drugi temat na czasie, czyli bazy noSQL-owe (np. CouchDB, MongoDB, Redis). Meeting powinien być interesujący dla zwolenników, jak i przeciwników tego typu rozwiązań, w końcu nie ma nic lepszego niż potężny flame :). Jedni i drudzy dodatkowo dowiedzą się jak radzić sobie w nowym środowisku, które wymaga nowego podejścia (żegnaj <code>SELECT</code>, witaj <code>map-reduce</code>). Tym razem mnie nie będzie, bo do Warszawy mi zbyt daleko, ale i tak polecam :). Również można się jeszcze <strong><a href="http://devmeetings.pl/trainings/bazy-nosqlowe-naturalny-storage-aplikacji-jsowych#registration_form">zarejestrować</a></strong>.</li>
<li><strong><a href="http://devmeetings.pl/trainings/middle-end-w-oparciu-o-serverside-js">Middle-end w oparciu o serverside JavaScript</a></strong> (24 września, Kraków) &ndash; to temat, na który czekam z niecierpliwością. Z jednej strony bowiem wiem co to middle-end, o którym nawet <a href="http://code42.pl/2011/07/19/node-js-i-middle-end-przenosny-kod-i-emulacja-przegladarki/">pisałem</a>, a na <a href="http://devcamps.pl/topics/int_middle_end">DevCampie</a> bawiliśmy się w jego implementacje, z drugiej, faktyczna architektura całego przekroju zastosowań (nie tylko DOM po stronie serwera, ale też np. walidatory) jest dla mnie pewną zagadką. Polecam ten temat wszystkim, którzy zastanawiali się kiedyś tym, czy da się współdzielić kod pomiędzy serwerem i przeglądarką i jak do tego podejść. <strong>Ja oczywiście będę</strong> i zachęcam do <strong><a href="http://devmeetings.pl/trainings/middle-end-w-oparciu-o-serverside-js#registration_form">rejestrowania się</a></strong>.</li>
</ul>
<h2><a href="http://ongamestart.com/">onGameStart &ndash; first HTML5 conference</a></h2>
<p><img alt="onGameStart" src="http://code42.pl/wp-content/uploads/ogs.png" width="200" height="131" class="alignleft"/></p>
<p>Konferencja organizowana przez <a href="http://michalbe.blogspot.com/">Michała Budzyńskiego</a> odbędzie się <strong>22-23 września w Warszawie</strong>. Michałowi udało się ściągnąć wielu ciekawych prelegentów, więc na pewno warto posłuchać co mają do powiedzenia. W szczególności, że temat gier budowanych przy użyciu pakietu HTML5+CSS3+JS, jest ostatnimi czasy bardzo na topie i dużo w tej kwestii się dzieje. Mnie niestety nie będzie, mimo że <a href="http://ferrante.pl/frontend/javascript/ostateczna-lista-zwyciezcow-konkursu-na-najkrotszy-skrypt/">wygrałem bilet</a>, ale polecam zainteresowanym. Bilety po 79 i 89 euro są jeszcze <a href="http://www.amiando.com/onGameStart2011.html">do kupienia</a>. Można też spróbować <strong>wygrać bilet</strong> u <a href="http://blog.ily.li/2011/08/porcine-css3html5-contest/">Lidii Wilczyńskiej</a>.</p>
<h2><a href="http://frontrowconf.com/">Front Row Conference</a></h2>
<p><img alt="Front Row Conference" src="http://code42.pl/wp-content/uploads/fr.png" width="100" height="128" class="alignleft"/></p>
<p>Konferencja poświęcona frontendowi, która odbędzie się <strong>20-21 października w Krakowie</strong>. Póki co nie ogłoszono zbyt wielu prelegentów, ale dwóch może być Wam znanych. To wspomniany przeze mnie przed chwilą <a href="http://twitter.com/michalbe">Michał Budzyński</a> oraz znany uczestnikom DevMeetingów <a href="http://twitter.com/m4r00p">Marek Pawłowski</a>. Bilety <a href="http://frontrowconf.com/registration/">do kupienia</a> po 123 euro. Na razie, przyznam szczerze, odnoszę wrażenie, że organizatorom idzie topornie z organizacją, ale kibicuję im, bo im więcej tego typu imprez w Polsce, tym lepiej.</p>
<p><strong>Do zobaczenia we wrześniu i październiku!</strong></p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2011/05/08/falsy-values-2011-prawdziwy-javascriptowy-event/' rel='bookmark' title='Falsy Values 2011 &#8211; prawdziwy JavaScriptowy event'>Falsy Values 2011 &#8211; prawdziwy JavaScriptowy event</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/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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/08/29/javascript-na-jesien-2011/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne</title>
		<link>http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/</link>
		<comments>http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/#comments</comments>
		<pubDate>Sat, 20 Aug 2011 20:33:00 +0000</pubDate>
		<dc:creator>Piotrek Reinmar Koszuliński</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[deklaracje funkcji]]></category>
		<category><![CDATA[fd]]></category>
		<category><![CDATA[fe]]></category>
		<category><![CDATA[funkcje]]></category>
		<category><![CDATA[hoisting]]></category>
		<category><![CDATA[nfe]]></category>
		<category><![CDATA[wyrażenia funkcyjne]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=1097</guid>
		<description><![CDATA[W poprzednim artykule pokazałem czym się różni zasięg blokowy od funkcyjnego, jakie problemy może spowodować ten drugi i jakie są plany na przyszłość. Wspomniałem też o zasięgu statycznym, czyli o domknięciach. W tym artykule chciałbym wyjaśnić czym jest hoisting i porównać deklaracje funkcji (function declarations) z wyrażeniami funkcyjnymi (function expressions). Zauważyłem, że są to tematy [...]


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/09/24/php-statyczne-zmienne-funkcji-%e2%80%94-do-czego-moga-sie-przydac/' rel='bookmark' title='PHP: Statyczne zmienne funkcji — do czego mogą się przydać?'>PHP: Statyczne zmienne funkcji — do czego mogą się przydać?</a></li>
<li><a href='http://code42.pl/2011/04/10/najszybszy-stworek-algorytm-genetyczny-w-javascriptcie/' rel='bookmark' title='Najszybszy stworek &ndash; algorytm genetyczny w JavaScriptcie'>Najszybszy stworek &ndash; algorytm genetyczny w JavaScriptcie</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>W <a href="http://code42.pl/2011/08/09/co-lepiej-wiedziec-o-javascriptcie-cz-1-typy-zasiegu-i-domkniecia/">poprzednim artykule</a> pokazałem czym się różni zasięg blokowy od funkcyjnego, jakie problemy może spowodować ten drugi i jakie są plany na przyszłość. Wspomniałem też o zasięgu statycznym, czyli o domknięciach.</p>
<p>W tym artykule chciałbym wyjaśnić czym jest ho<u>i</u>sting i porównać deklaracje funkcji (function declarations) z wyrażeniami funkcyjnymi (function expressions). Zauważyłem, że są to tematy obce wielu programistom JavaScript i myślę, że o ile test z poprzedniego artykułu wielu z Was nie powinien sprawić problemu, o tyle poniższy ma szansę być małym zaskoczeniem. Taką mam przynajmniej nadzieję :).</p>
<p><a href="#zrodla">Źródła</a> z których korzystałem, umieściłem na końcu wpisu.</p>
<h2>Sprawdź się!</h2>
<p>Spróbuj rozpoznać co wydrukuje każde wywołanie <code>console.log</code>. Skrypt z wszystkimi pytaniami, <strong>wraz z odpowiedziami</strong> wrzuciłem na <a href="https://gist.github.com/1159049">Gista</a>.</p>
<p><span id="more-1097"></span></p>
<h3>Hoisting</h3>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'3.1:'</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'3.2:'</span><span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'3.3:'</span><span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> c <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'3.4:'</span><span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> d <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>d <span style="color: #339933;">===</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> d <span style="color: #339933;">=</span> <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'3.5:'</span><span style="color: #339933;">,</span> d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Funkcje</h3>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">a<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.1:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> <span style="color: #3366CC;">'1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">function</span> a<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> <span style="color: #3366CC;">'2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
a<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.2:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> b<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.3: 1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">function</span> b<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.4: 2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
b<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> c1 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> c2<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> c1<span style="color: #339933;">,</span> c2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
c1<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.5:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
c2<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.6:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Hoisting, czyli wynoszenie</h2>
<p>Myślę, że nikomu nie powinien sprawić problemów przykład <code>3.1</code>. To będzie oczywiście <code>RerefenceError</code>. Co jednak dostaniemy dla przykładu <code>3.2</code>? Deklaracja zmiennej <code>b</code> znajduje się w kodzie poniżej próby jej użycia, a więc też błąd? Nie &ndash; dostaniemy wartość <code>undefined</code>.</p>
<p>Zachowanie to jest efektem hoistingu (po polsku &ndash; wynoszenie). Polskie tłumaczenie co prawda lepiej informuje nas o wyniku działania tej konstrukcji, jednak brzmi strasznie, tak więc będę go unikał (przynajmniej w rzeczowniku :).</p>
<p>Czym jest więc hoisting? Jest to <strong>wyniesienie deklaracji zmiennych, bądź funkcji</strong> do samego początku kontekstu deklaracji (najczęściej ciała funkcji &ndash; zasięg funkcyjny), przy jednoczesnym <strong>pozostawieniu inicjalizacji samej zmiennej w oryginalnym miejscu</strong>. Takie zachowanie jest spowodowane istnieniem dwóch etapów wykonywania kodu, o czym pisze <a href="http://dmitrysoshnikov.com/notes/note-4-two-words-about-hoisting/">Dmitry Soshnikov</a>:</p>
<blockquote><p>There are two stages of the code handling: (1) entering the context, where all the data are created, and (2) the code execution stage.</p>
</blockquote>
<p>Dla przykładu przyjrzyjmy się następującej funkcji:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> fn <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> sth <span style="color: #339933;">=</span> getSomeStuff<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> sthelse <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> sthelse.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> sth <span style="color: #339933;">=</span> sthelse<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #003366; font-weight: bold;">var</span> ok <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Taka funkcja zostanie przez interpreter wykonana w następujący sposób:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> fn <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// etap 1. - deklaracje</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// zmienne automatycznie zostają</span>
    <span style="color: #006600; font-style: italic;">// zainicjalizowane wartością undefined</span>
    <span style="color: #003366; font-weight: bold;">var</span> sth<span style="color: #339933;">,</span> sthelse<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> ok<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// etap 2. - wykonanie</span>
&nbsp;
    sth <span style="color: #339933;">=</span> getSomeStuff<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    sthelse <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> sthelse.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        sth <span style="color: #339933;">=</span> sthelse<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// wyjaśnienie pkt. 3.3: wszystkie deklaracje są wynoszone</span>
        <span style="color: #006600; font-style: italic;">// nawet te do których interpreter nigdy nie dojdzie</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span> ok <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Jak widzisz, wszystkie zmienne zadeklarowane w obrębie całego ciała funkcji zostają zgromadzone na początku. By wyeliminować &#8222;magię&#8221;, identyczny zabieg stosują ręcznie niektórzy programiści JavaScript i deklarują wszystkie zmienne na samym początku ciała funkcji (czasami wraz z inicjalizacją tych wartości, których wartość jest znana od początku). Ja też tak postępuję jeśli ciało funkcji jest na tyle długie, że mógłbym pogubić się które zmienne mam zadeklarowane, a które nie. Przykład żywcem z kodu, który pisałem wczoraj:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> txt_ratio <span style="color: #339933;">=</span> Math.<span style="color: #660066;">ceil</span><span style="color: #009900;">&#40;</span>TXT_WIDTH <span style="color: #339933;">/</span> TXT_HEIGHT<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    rows<span style="color: #339933;">,</span> cols<span style="color: #339933;">,</span>
    geometry<span style="color: #339933;">,</span>
    x<span style="color: #339933;">,</span> y<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> t<span style="color: #339933;">,</span> d<span style="color: #339933;">,</span> xi<span style="color: #339933;">,</span> yi<span style="color: #339933;">,</span> rowi<span style="color: #339933;">,</span> coli<span style="color: #339933;">;</span></pre></div></div>

<p>Jak widać, bywa tego dużo :). Tak na marginesie, o ile w ogóle dobrą praktyką jest dzielić dłuższe funkcje na kilka osobnych, o tyle w JavaScriptcie jest to jeszcze ważniejsze. Dlaczego?</p>
<h3>Wady hoistingu</h3>
<p>Daleko szukać nie trzeba, by trafić na pierwsze wady hoistingu. W szczególności początkujący programiści nie lubią magii i niejawnych zachowań czy to we frameworkach, czy w językach samych w sobie. Spójrzmy na przykład <code>3.5</code> z testu (wyciągnąłem go z <a href="http://www.slideshare.net/ferrantes/just-advanced-javascript">prezentacji</a> <a href="http://ferrante.pl">Damiana Wielgosika</a>):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> d <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>d <span style="color: #339933;">===</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> d <span style="color: #339933;">=</span> <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'3.5:'</span><span style="color: #339933;">,</span> d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Na pierwszy rzut oka myślimy (sam przed chwilą to zrobiłem :D) &ndash; <code>d</code> jest równe <code>10</code>, więc warunek się wykona i dostaniemy wartość <code>20</code>. Nic bardziej mylnego. Powyższy kod zostanie wykonany w następujący sposób:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> d <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> d<span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//undefined!</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>d <span style="color: #339933;">===</span> <span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        d <span style="color: #339933;">=</span> <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'3.5:'</span><span style="color: #339933;">,</span> d<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Nieco inny, ale nawet łatwiejszy do doświadczenia, przykład podał <a href="http://dmitrysoshnikov.com/notes/note-4-two-words-about-hoisting/">Dmitry Soshnikov</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// undefined ?</span>
    <span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #CC0000;">20</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>CoffeScript na lekarstwo?</h3>
<p>Problem ten dostrzegli autorzy <a href="http://jashkenas.github.com/coffee-script/#lexical_scope">CoffeScriptu</a> i postanowili mu zaradzić:</p>

<div class="wp_syntax"><div class="code"><pre class="coffeescript" style="font-family:monospace;">outer = 1
changeNumbers = -&gt;
  inner = -1
  outer = 10
inner = changeNumbers()</pre></div></div>

<p>Powyższy kod zostanie skompilowany do:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> changeNumbers<span style="color: #339933;">,</span> inner<span style="color: #339933;">,</span> outer<span style="color: #339933;">;</span>
outer <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
changeNumbers <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> inner<span style="color: #339933;">;</span>
  inner <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> outer <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
inner <span style="color: #339933;">=</span> changeNumbers<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Widać, że zmiennych w ogóle nie trzeba deklarować, ponieważ są automatycznie deklarowane w pierwszym kontekście wystąpienia. Rozwiązuje to problem magii hoistingu, zabezpiecza nam obiekt globalny, ponieważ nie ma opcji, żeby niezadeklarowana zmienna wypłynęła do niego (w czystym JavaScriptcie sprawę załatwia <a href="http://blog.marcoos.com/2011/01/25/ecmascript-5-strict-mode-tryb-scisly/">strict mode</a> &ndash; polecam). Co jednak jeśli chcemy ograniczyć zasięg zmiennej jedynie do zagnieżdżonej funkcji? Tego chyba autorzy CoffeeScript nie przewidzieli (jeśli się mylę, poprawcie mnie) i dla mnie to duża wada. Dlatego też z tego i kilku innych powodów mówię CoffeScriptowi nie.</p>
<h3>A jakieś zalety?</h3>
<p>Przedstawiłem wady hoistingu, ale pozostało pytanie &ndash; dlaczego w ogóle został wprowadzony, skoro powoduje tyle niejasności? Pytanie jest o tyle dobre, że nie udało mi się znaleźć na nie odpowiedzi. Jedyne o czym wspomina Dmitry Soshnikov to optymalizacja. Jak pokazał jeden z poprzednich przykładów, wyniesienie deklaracji zabezpieczyło nas przed redeklarowaniem zmiennej w pętli (<code>sth</code>), czy przy wielokrotnym użyciu (np. <code>i</code>). Hoisting nie jest jednak jedynym sposobem na radzenie sobie z tymi sytuacjami, tak więc wydaje się, że jego zastosowanie można uznać za złą decyzję twórców języka.</p>
<h2>Deklaracje funkcji vs wyrażenia funkcyjne</h2>
<p>Temat hoistingu łączy się zgrabnie z tematem funkcji. Okazuje się, że mamy w JavaScriptcie dwie konstrukcje składniowe do ich definiowania. <a href="http://es5.github.com/#x13">ECMAScript5</a> specyfikuje obydwie następująco:</p>

<div class="wp_syntax"><div class="code"><pre class="syntax" style="font-family:monospace;">FunctionDeclaration :
&nbsp;
    function Identifier ( FormalParameterListopt ) { FunctionBody }
&nbsp;
FunctionExpression :
&nbsp;
    function Identifier_opt ( FormalParameterListopt ) { FunctionBody }</pre></div></div>

<p>Początkowo wydaje się, że jedyną różnicą jest opcjonalność identyfikatora funkcji. Różnica jednak wynika z możliwości umieszczenia obydwu konstrukcji w różnych kontekstach składniowych. Deklaracja funkcji znajduje się na równi z <a href="http://pl.wikipedia.org/wiki/Instrukcja_%28informatyka%29">instrukcją</a> (statement), zaś wyrażenie funkcyjne, jak sama nazwa wskazuje, jest wyrażeniem, które jest dopiero częścią instrukcji.</p>
<p>Domyślam się, że teraz wiesz, że jest jakaś różnica, ale nie wiesz dalej co z niej wynika :). W uproszczeniu można więc powiedzieć, że deklarację funkcji mamy tam gdzie funkcja nie jest wykorzystana jako wartość (jest osobną pseudo-instrukcją). Funkcja wykorzystana jako wartość (jest częścią instrukcji) jest wyrażeniem funkcyjnym. Przykłady:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// deklaracja funkcji</span>
<span style="color: #003366; font-weight: bold;">function</span> a<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// wyrażenie funkcyjne - zostało przypisane</span>
<span style="color: #006600; font-style: italic;">// więc użycie jako wartość</span>
<span style="color: #003366; font-weight: bold;">var</span> b <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>arg<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    arg<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// przekazujemy wyrażenie funkcyjne</span>
b<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Hoisting deklaracji rozwiązaniem testu</h3>
<p>Definiując hoisting wspomniałem o tym, że zachodzi on również dla deklaracji funkcji. Inaczej niż w przypadku zmiennych, w tym wypadku wynoszona jest też cała &#8222;zawartość&#8221; funkcji, nie tylko inicjalizacja zmiennej do <code>undefined</code>. Bardzo spodobał mi się przykład, mojego własnego, skromnego autorstwa, na który, co ciekawe, sam się naciąłem :).</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">a<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.1:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 2</span>
<span style="color: #003366; font-weight: bold;">var</span> a <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> <span style="color: #3366CC;">'1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">function</span> a<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> <span style="color: #3366CC;">'2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
a<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.2:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 1</span></pre></div></div>

<p>Na pierwszy rzut oka nie ma w tym żadnego sensu. Kiedy pomyślimy jednak jak wynoszone są deklaracje, wszystko staje się jasne:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> a<span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">function</span> a<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> <span style="color: #3366CC;">'2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
a<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.1:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 2</span>
&nbsp;
a <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> <span style="color: #3366CC;">'1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
a<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.2:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; 1</span></pre></div></div>

<p>Okazuje się, że hoisting deklaracji funkcji niesie ze sobą jeszcze więcej problemów, niż hoisting deklaracji zmiennych. Załóżmy, że mamy dwa pliki ze skryptami. W pierwszym deklarujemy funkcję <code>fn</code> i w drugim również deklarujemy funkcję <code>fn</code>. W środowisku deweloperskim wszystko działa jak należy, jednak kiedy połączymy oba pliki na produkcję, funkcja z drugiego pliku nadpisuje funkcję z pierwszego i teraz również kod z pierwszego pliku korzysta z drugiej funkcji. Co prawda jest to też przykład kiepskiej architektury, ale zdarzyć się może.</p>
<h3>Named Function Expressions</h3>
<p>Pisałem o tym, że wyrażenie funkcyjne ma opcjonalny identyfikator. Wyrażenia funkcyjne z podanym identyfikatorem, to po prostu nazwane wyrażenia funkcyjne, czyli NFE. Okazuje się, że są bardzo przydatną konstrukcją, ponieważ identyfikator takiej funkcji nie jest widoczny z zewnątrz, a jedynie wewnątrz niej. Przykładem jest ostatnie zadanie z testu:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> c1 <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> c2<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> c1<span style="color: #339933;">,</span> c2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
c1<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.5:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; function, function</span>
c2<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'4.6:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// -&gt; ReferenceError</span></pre></div></div>

<p>Pierwszy powód dlaczego NFE są przydatne, to wycofanie w strict modzie <code>arguments.callee</code>. Dzięki NFE wciąż możemy tworzyć rekurencyjne wywołania. Teraz zamiast pisać (przykład wzięty z wybitnego <a href="http://kangax.github.com/nfe/">artykułu kangaxa o NFE</a>):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> x <span style="color: #339933;">*</span> arguments.<span style="color: #660066;">callee</span><span style="color: #009900;">&#40;</span>x <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Napiszemy:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> factorial<span style="color: #009900;">&#40;</span>x<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&lt;=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> x <span style="color: #339933;">*</span> factorial<span style="color: #009900;">&#40;</span>x <span style="color: #339933;">-</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Drugi powód to debugowanie. Niestety nienazwane wyrażenia funkcyjne, są niemal anonimowe. Używając ich widzimy później call stack pełen &#8222;anonymous function, anonymous function&#8221;. I co prawda Google się chwali, że Chrome identyfikuje funkcje anonimowe (po tym do jakich zmiennych, czy właściwości są przypisywane), ale według mnie nie działa to najlepiej. W dodatku jak nazwać funkcję przekazywaną jako callback do jakiejś funkcji? No nie da się. Dlatego w ostatnim projekcie zacząłem nazywać wiele funkcji. Na przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> BigInteger <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> BigInteger<span style="color: #009900;">&#40;</span>num<span style="color: #339933;">,</span> base<span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">//...</span>
BigInteger.<span style="color: #660066;">prototype</span>._addOffset <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> _BI_addOffset<span style="color: #009900;">&#40;</span>n<span style="color: #339933;">,</span> w<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">//...</span>
BigInteger.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">abs</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> BI_abs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>Miałem nie wspominać, ale żeby nie było &ndash; Z NFE związanych jest kilka błędów. Większość dotyczy starych wersji Safari (2.x) i Firefoksa (<=3), jednak największym problemem mogą być te związane z IE (<9). Na szczęście są stosunkowo "niekrytyczne", choć jeśli zamierzasz je stosować, to polecam <a href="http://kangax.github.com/nfe">artykuł kangaxa</a>.</p>
<h2>FD vs (N)FE &ndash; wynik walki</h2>
<p>Zdecydowanie wyrażenia funkcyjne. Pomijamy część wad hoistingu, deklaracje funkcji (ponoć) nie wszędzie są dopuszczalne (aczkolwiek nie znalazłem przykładu gdzie nie są &ndash; może ktoś zna?), deklaracje funkcji to kiepska kalka z Javy oraz argument ostateczny &ndash; 90% naszego kodu to i tak będą wyrażenia funkcyjne.</p>
<h2 id="zrodla">Źródła, czyli poczytaj więcej</h2>
<ul>
<li><a href="http://dmitrysoshnikov.com/notes/note-4-two-words-about-hoisting/">Dmitry Soshnikov &ndash; Note 4. Two words about “hoisting”</a> &ndash; bardzo lubię artykuły Dmitry&#8217;a, ponieważ schodzi aż do akademickiego poziomu,</li>
<li><a href="http://www.slideshare.net/ferrantes/just-advanced-javascript">Damian Wielgosik (Ferrante) &ndash; prezentacja Just advanced JavaScript</a> &ndash; polecam całą, ale część związana z tym artykułem zaczyna się od slajdu 132.,</li>
<li><a href="http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/">Angus Croll &ndash; Function Declarations vs. Function Expressions</a> &ndash; uzupełnienie i rozjaśnienie tego o czym ja pisałem,</li>
<li><a href="http://kangax.github.com/nfe/">Juriy &#8222;kangax&#8221; Zaytsev &ndash; Named function expressions demystified</a> &ndash; niesamowicie dokładny przegląd dotyczący NFE (m.in. omówienie kilku błędów przeglądarek); tak długie, że nie przeczytałem, ale na pewno to zrobię :D.</li>
</ul>


<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/09/24/php-statyczne-zmienne-funkcji-%e2%80%94-do-czego-moga-sie-przydac/' rel='bookmark' title='PHP: Statyczne zmienne funkcji — do czego mogą się przydać?'>PHP: Statyczne zmienne funkcji — do czego mogą się przydać?</a></li>
<li><a href='http://code42.pl/2011/04/10/najszybszy-stworek-algorytm-genetyczny-w-javascriptcie/' rel='bookmark' title='Najszybszy stworek &ndash; algorytm genetyczny w JavaScriptcie'>Najszybszy stworek &ndash; algorytm genetyczny w JavaScriptcie</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/08/20/co-lepiej-wiedziec-o-javascriptcie-cz-2-hoisting-deklaracje-funkcji-i-wyrazenia-funkcyjne/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

