<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code42 &#187; zergu</title>
	<atom:link href="http://code42.pl/author/zergu/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>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>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>Vim: łatwe zwiększanie/zmnieszanie liczb i liter</title>
		<link>http://code42.pl/2011/04/17/vim-latwe-zwiekszaniezmnieszanie-liczb-i-liter/</link>
		<comments>http://code42.pl/2011/04/17/vim-latwe-zwiekszaniezmnieszanie-liczb-i-liter/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 10:01:40 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=909</guid>
		<description><![CDATA[Vim pozwala na łatwe zwiększanie lub zmniejszanie liczb, które mamy w trybie edycji pod kursorem poprzez skróty CTRL-A (zwiększanie) i CTRL-X (zmniejszanie). Kiedy i jak to działa? Vim może operować na 4 zestawach znaków: liczby dziesiętne, liczby ósemkowe, liczby szesnastkowe, litery. Liczby ósemkowe Vim rozpoznaje po zerach początkowych. Przykładowo: 01 jest zwiększane do 02, 007 [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/01/13/vim-dopelnianie-dowolnego-tekstu-np-slow-kluczowych-php/' rel='bookmark' title='Vim: dopełnianie dowolnego tekstu (np. słów kluczowych PHP)'>Vim: dopełnianie dowolnego tekstu (np. słów kluczowych PHP)</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/plus-minus1.png" alt="" title="plus-minus" width="150" height="74" class="alignright size-full wp-image-913" /></p>
<p>Vim pozwala na łatwe zwiększanie lub zmniejszanie liczb, które mamy w trybie edycji pod kursorem poprzez skróty <code>CTRL-A</code> (zwiększanie) i <code>CTRL-X</code> (zmniejszanie).</p>
<h2>Kiedy i jak to działa?</h2>
<p>Vim może operować na 4 zestawach znaków:</p>
<ul>
<li>liczby dziesiętne,</li>
<li>liczby ósemkowe,</li>
<li>liczby szesnastkowe,</li>
<li>litery.</li>
</ul>
<p>Liczby ósemkowe Vim rozpoznaje po zerach początkowych. Przykładowo: <code>01</code> jest zwiększane do <code>02</code>, <code>007</code> do <code>010</code>. Liczy szesnastkowe Vim rozpozna, jeśli zaczynają się od <code>0x</code> lub <code>0X</code> — tym samym zwiększenie wygląda przykładowo tak: <code>0xff</code> → <code>0x100</code>. Pozostałe liczby traktowane są jako dziesiętne, a operacje na nich są dość intuicyjne.</p>
<p>Ponadto Vim może zwiększać pojedyncze litery: <code>'a'</code> zostanie zwiększone do <code>'b'</code>, jednak próbując zwiększyć <code>'aa'</code> zmieni się tylko litera pod kursorem, a nie całe słowo. </p>
<h2>Przejmujemy kontrolę</h2>
<p>Za pomocą opcji <code>:set nrformats</code> (skrót <code>nf</code>) możemy wyłączyć lub włączyć rozpoznawanie liter, liczb ósemkowych i szesnastkowych. Dostępne opcje to:</p>
<ul>
<li>alpha,</li>
<li>octal,</li>
<li>hex.</li>
</ul>
<p>Liczby dziesiętne zawsze są rozpoznawane.</p>
<p>Moje ustawienie w <code>.vimrc</code> to:<br />
<code>set nrformats=alpha,hex</code><br />
Różni się ono od domyślnego przede wszystkim wyłączeniem zwiększania ósemkowego, gdyż dużo częściej operuję na słowach typu <code>006</code>, <code>007</code>, <code>008</code> niż liczbach ósemkowych. Inaczej mówiąc zmieniam z <code>007</code> na <code>008</code>, a nie na <code>010</code>.</p>
<h2>Uwagi</h2>
<ul>
<li>Skróty <code>CTRL-A</code>, <code>CTRL-X</code> mogą operować na ujemnych liczbach dziesiętnych.</li>
<li>Możliwe jest wielokrotne zwiększenie, przez podanie liczby wykonań zaraz przez skrótem. Przykładowo mając pod kursorem cyfrę <code>0x01</code> i wklepując <code>17&lt;CTRL-A&gt;</code> otrzymamy <code>0x12</code>.</li>
</ul>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/01/13/vim-dopelnianie-dowolnego-tekstu-np-slow-kluczowych-php/' rel='bookmark' title='Vim: dopełnianie dowolnego tekstu (np. słów kluczowych PHP)'>Vim: dopełnianie dowolnego tekstu (np. słów kluczowych PHP)</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/04/17/vim-latwe-zwiekszaniezmnieszanie-liczb-i-liter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony: domyślny wygląd modułu</title>
		<link>http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/</link>
		<comments>http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 16:31:45 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=879</guid>
		<description><![CDATA[Mając utworzony projekt Symfony (1.4) mamy dostęp do zadań (tasków), którymi możemy wygenerować aplikację i moduł: ./symfony generate:app nazwa_aplikacji ./symfony generate:module nazwa_aplikacji nazwa_modułu O ile aplikacji zwykle jest jedna albo dwie, to modułów może być w danym projekcie całkiem sporo. Więc, jeżeli nie zadowala Cię domyślny wygląd modułu, warto sobie go dostosować do własnych potrzeb. [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/02/16/dostosowanie-grep-a-do-svn-i-symfony/' rel='bookmark' title='Dostosowanie grep-a do SVN i Symfony'>Dostosowanie grep-a do SVN i Symfony</a></li>
<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/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/randomness_01.jpg" alt="" title="randomness_01" width="536" height="69" class="aligncenter size-full wp-image-884" /></p>
<p>Mając utworzony projekt Symfony (1.4) mamy dostęp do zadań (<code>tasków</code>), którymi możemy wygenerować aplikację i moduł:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>symfony generate:app nazwa_aplikacji
.<span style="color: #000000; font-weight: bold;">/</span>symfony generate:module nazwa_aplikacji nazwa_modułu</pre></div></div>

<p>O ile aplikacji zwykle jest jedna albo dwie, to modułów może być w danym projekcie całkiem sporo. Więc, jeżeli nie zadowala Cię domyślny wygląd modułu, warto sobie go dostosować do własnych potrzeb. Opłaca się to zrobić choćby dla jednego zmienionego znaku, gdyż sprawa jest bardzo prosta.</p>
<p>Domyślnie Symfony wykorzystuje szkielet, który dostępny jest w jej źródłach w katalogu: <code>lib/task/generator/skeleton</code>.</p>
<p>Aby zmienić domyślny wygląd modułów, wystarczy skopiować ten katalog do własnego projektu do katalogu <code>data</code>. Czyli w katalogu projektu, w <code>data/skeleton</code> powinniśmy mieć takie katalogi jak:</p>
<ul>
<li>app</li>
<li>module</li>
<li>project</li>
</ul>
<p>Teraz pozostaje tylko edytować zawartość katalogu <code>data/skeleton/module</code> (nie zmieniamy w źródłach tylko tokena <code>##MODULE_NAME##</code>), a po utworzeniu nowego modułu, w standardowy sposób, wszystko będzie wyglądać po naszemu.</p>
<h2>Co warto zmienić, czyli co ja zmieniam?</h2>
<ul>
<li>Usuwam zbędne komentarze na początku pliku <code>actions.class.php</code>.</li>
<li>Formatuję sobie kod wg lepszego standardu (np. taby zamiast spacji).</li>
<li>Zmieniam dziedziczenie w akcjach na <code>myActions</code>.</li>
<li>Przygotowuję sobie akcje i widoki pod kątem projektu. Zwykle jest to jakiś prosty <a href="http://pl.wikipedia.org/wiki/CRUD">CRUD</a>, w którym wystarczy wykonać kilka razy <em>search &amp; replace</em>.</li>
</ul>
<h2>Zmiana domyślnego wyglądu aplikacji i projektu</h2>
<p>Jeśli spojrzymy na zawartość katalogu <code>skeleton</code> to widać, że nie tylko moduł może być dostosowany do naszych potrzeb. Ja jednak w katalogach do aplikacji nie mieszałem, bo zbyt rzadko się je generuje, a wygląd początkowy jest zadowalający. Natomiast katalog do generowania projektu musiałby by edytowany w źródłach Symfony co nie jest zbyt fajne. Ale może trafią się komuś takie projekty, że i ten „ficzer” znajdzie zastosowanie.</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/02/16/dostosowanie-grep-a-do-svn-i-symfony/' rel='bookmark' title='Dostosowanie grep-a do SVN i Symfony'>Dostosowanie grep-a do SVN i Symfony</a></li>
<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/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/03/28/symfony-domyslny-wyglad-modulu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bardzo ciężki quiz PHP — edycja II</title>
		<link>http://code42.pl/2011/01/22/bardzo-ciezki-quiz-php-%e2%80%94-edycja-ii/</link>
		<comments>http://code42.pl/2011/01/22/bardzo-ciezki-quiz-php-%e2%80%94-edycja-ii/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 11:47:48 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[quiz]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=853</guid>
		<description><![CDATA[Sprawdź swoją wiedzę na temat magicznego zachowania PHP-owej funkcji count().


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/' rel='bookmark' title='Bardzo ciężki quiz PHP'>Bardzo ciężki quiz PHP</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/hela-waaat1.jpg" alt="" title="hela-waaat" width="220" height="185" class="alignright size-full wp-image-859" /></p>
<p>W <a href='http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/'>pierwszej edycji</a> „Bardzo ciężkiego quizu PHP” sprawdzaliśmy naszą wiedzę na temat porównań. Tym razem na ruszt poszła funkcja <code>count()</code>.</p>
<p>Na początek rzućmy krótko okiem do manuala, żeby sprawdzić co ona robi.</p>
<blockquote><p>count — Count all elements in an array, or properties in an object</p>
</blockquote>
<p>Ok, proste. Tak więc spróbujmy zgadnąć do się stanie gdy wywołamy ja na paru różnych rzeczach.</p>
<table>
<tr>
<th>Parametr do <code>count()</code></th>
<th>Reinmar</th>
<th>mcv</th>
<th>Odpowiedź prawidłowa</th>
</tr>
<tr>
<td><code>array(1)</code></td>
<td>1</td>
<td>1</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>array()</code></td>
<td>0</td>
<td>0</td>
<td style='background: #fff; color: #fff'>0</td>
</tr>
<tr>
<td><code>$undefined_var</code></td>
<td>error</td>
<td>0 + notice</td>
<td style='background: #fff; color: #fff'>0 + notice</td>
</tr>
<tr>
<td><code>new stdclass()</code></td>
<td>1</td>
<td>0</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>true</code></td>
<td>1</td>
<td>0 + notice</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>false</code></td>
<td>0</td>
<td>0 + notice</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>isset ($undefined_var)</code></td>
<td>0</td>
<td>0 + notice</td>
<td style='background: #fff; color: #fff'>1</td>
</tr>
<tr>
<td><code>null</code></td>
<td>0</td>
<td>notice</td>
<td style='background: #fff; color: #fff'>0</td>
</tr>
</table>
<p><em>Żeby zobaczyć prawidłową odpowiedź trzeba zaznaczyć sobie odpowiednią komórkę.</em></p>
<p>Jak Wam poszło?</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/02/bardzo-ciezki-quiz-php/' rel='bookmark' title='Bardzo ciężki quiz PHP'>Bardzo ciężki quiz PHP</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2011/01/22/bardzo-ciezki-quiz-php-%e2%80%94-edycja-ii/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PHP: łączenie tablic na dwa sposoby</title>
		<link>http://code42.pl/2010/12/29/php-laczenie-tablic-na-dwa-sposoby/</link>
		<comments>http://code42.pl/2010/12/29/php-laczenie-tablic-na-dwa-sposoby/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 08:00:37 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[array_merge]]></category>
		<category><![CDATA[tablice w php]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=790</guid>
		<description><![CDATA[Połączenie wartości dwóch tablic w jedną nie jest w PHP tak intuicyjne jak można by oczekiwać. Powodem zamieszania są dwie funkcje do wykorzystania oraz dwa rodzaje tablic.


Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/' rel='bookmark' title='Epic: ALERT w PHP i niespodziewane białe ekrany śmierci'>Epic: ALERT w PHP i niespodziewane białe ekrany śmierci</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/2009/04/02/bardzo-ciezki-quiz-php/' rel='bookmark' title='Bardzo ciężki quiz PHP'>Bardzo ciężki quiz PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/geek-books-225x300.jpg" alt="" title="geek-books" width="225" height="300" class="alignright size-medium wp-image-804" /></p>
<p>PHP pozwala na połączenie tablic ze sobą za pomocą operatora <code>+</code> lub funkcji <code>array_merge</code>. Zależnie od przypadku mogą one zwracać różne wyniki.</p>
<h2>Łączenie za pomocą operatora +</h2>
<p>„Plus” to jedyny operator, którym można wykonywać jakieś operacje na tablicach. Pozostałe służą do porównań. Jego działanie polega na tym, że do tablicy po lewej stronie operatora dołączane są elementy z tablicy z prawej strony, z wyjątkiem sytuacji gdzie klucz się powtarza. Elementy z „prawej” tablicy o kluczu istniejącym już w „lewej” są pomijane. Do porównywania kluczy wykorzystywany jest niejawnie operator <code>===</code>.<br />
<span id="more-790"></span><br />
Przykładowo mając następujące tablice:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1st'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'first'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2nd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'second'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1st'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2nd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'3rd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'3rd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'final3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'4th'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'final4'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wynik „dodawania” tablic (<code>$a + $b + $c</code>) będzie wyglądał tak:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;1st&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;first&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;2nd&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;second&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;3rd&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;zonk3&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;4th&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;final4&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jak można się już domyślać — mając tablice, w których kluczy jawnie nie podajemy (czyli są one liczbami naturalnym zaczynającymi się od zera), rezultat łączenia może nie być zgodny z oczekiwanym:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'php'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'js'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'symfony'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'css'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><code>$a + $b</code> daje nam:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;php&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;html&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;css&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jeżeli chcemy, żeby żadna wartość nie została pominięta, lepiej zainteresować się <code>array_merge</code>.</p>
<h2>Łączenie za pomocą array_merge</h2>
<p>Działanie <code>array_merge</code> może już być bardziej intuicyjne. Jednak trzeba wiedzieć, że łączenie wartości przebiega inaczej, zależnie od tego czy mamy do czynienia ze zwykłą tablicą (z kluczami 0, 1, 2…) czy tablicą asocjacyjną (zwaną również mapą lub <em>hashem</em>).</p>
<p>W przypadku zwykłych tablic do elementów pierwszej dołączane są elementy drugiej. Przykładowo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'php'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'js'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'symfony'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'css'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wynik <code>array_merge ($a, $b)</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;php&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;html&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;js&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;symfony&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;css&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Takie dołączanie następuje również, gdy do <code>array_merge</code> podamy jedną tablicę zwykłą i jedną asocjacyjną. Żadna wartość wtedy nie przepadnie.</p>
<p>Natomiast w przypadku samych tablic asocjacyjnych klucze zaczynają mieć znaczenie. Wartość z tablicy drugiej (lub kolejnej, bo można łączyć wiele tablic) nadpisze wartość z tablicy poprzedzającej, jeśli posiadała ona taki sam klucz. Przykładowo dla tablic:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$a</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1st'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'first'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2nd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'second'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$b</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1st'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'2nd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'3rd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'zonk3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'3rd'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'final3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'4th'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'final4'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wynik <code>array_merge ($a, $b, $c)</code> będzie następujący:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;1st&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;zonk1&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;2nd&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;zonk2&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;3rd&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;final3&quot;</span>
  <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;4th&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>
  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;final4&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2008/12/22/epic-alert-w-php-i-niespodziewane-biale-ekrany-smierci/' rel='bookmark' title='Epic: ALERT w PHP i niespodziewane białe ekrany śmierci'>Epic: ALERT w PHP i niespodziewane białe ekrany śmierci</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/2009/04/02/bardzo-ciezki-quiz-php/' rel='bookmark' title='Bardzo ciężki quiz PHP'>Bardzo ciężki quiz PHP</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/12/29/php-laczenie-tablic-na-dwa-sposoby/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ignorowanie plików w SVN</title>
		<link>http://code42.pl/2010/12/24/ignorowanie-plikow-w-svn/</link>
		<comments>http://code42.pl/2010/12/24/ignorowanie-plikow-w-svn/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 13:05:14 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[SVN]]></category>
		<category><![CDATA[svn:ignore]]></category>
		<category><![CDATA[właściwości w svn]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=757</guid>
		<description><![CDATA[Dość typową sytuacją w każdym projekcie jest fakt, że część plików lub katalogów nie powinna się znajdować pod kontrolą wersji. Przykładami takich plików są: generowane pliki tymczasowe, logi, pliki cache, pliki konfiguracyjne, inne dla każdej kopii roboczej, pliki tworzone przez edytor tekstu lub IDE, zbyt duże pliki, by je wysyłać do repozytorium. Pliki można ignorować [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/21/uprawnienia-plikow-w-repo-svn/' rel='bookmark' title='Uprawnienia plików w repo SVN'>Uprawnienia plików w repo SVN</a></li>
<li><a href='http://code42.pl/2009/03/26/vim-znajdowanie-plikow-w-podkatalogach/' rel='bookmark' title='Vim: Znajdowanie plików w podkatalogach'>Vim: Znajdowanie plików w podkatalogach</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-778" title="ignored-girls-full" src="http://code42.pl/wp-content/uploads/ignored-girls-full-201x300.jpg" alt="" width="201" height="300" /></p>
<p>Dość typową sytuacją w każdym projekcie jest fakt, że część plików lub katalogów nie powinna się znajdować pod kontrolą wersji. Przykładami takich plików są:</p>
<ul>
<li>generowane pliki tymczasowe,</li>
<li>logi,</li>
<li>pliki cache,</li>
<li>pliki konfiguracyjne, inne dla każdej kopii roboczej,</li>
<li>pliki tworzone przez edytor tekstu lub IDE,</li>
<li>zbyt duże pliki, by je wysyłać do repozytorium.</li>
</ul>
<p>Pliki można ignorować na dwa sposoby.</p>
<p><span id="more-757"></span></p>
<h2>Ignorowanie globalne</h2>
<p>Każdy użytkownik może ustawić sobie dowolne ignorowanie plików według typowych dla konsol linuksowych masek. Aby to zrobić należy wyedytować plik <code>config</code>, który powinien znajdować się w katalogu <code>.subversion</code> w katalogu domowym użytkownika (Linux) lub w jego profilu (Windows). Interesująca nas opcja nazywa się <strong><code>global-ignores</code></strong>. Domyślnie jest ona objęta komentarzem a jej domyślna wartość wygląda następująco:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000099;">global-ignores</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store</span></pre></div></div>

<p>I właśnie takie pliki są domyślnie ignorowane. Dlatego też, chcąc dodać kolejną maskę, nie powinniśmy raczej kasować początkowych wartości (chociaż oczywiście możemy). Ja tutaj dodałem sobie tylko pliki tymczasowe jakie generuje mi Vim:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000099;">global-ignores</span> <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store *.swp *.swo *.swn</span></pre></div></div>

<p>Maski lub nazwy plików działają również na katalogi.</p>
<h2>Ignorowanie lokalne</h2>
<p>Subversion dostarcza mechanizm pozwalający na ustawianie dowolnych właściwości (<em>properties</em>) plikom i katalogom znajdującym się pod jego kontrolą. Kilka właściwości jest zdefiniowanych od razu — każda z nich zaczyna się od <code>svn:</code> (jak np. <a title="Uprawnienia plików w repo SVN" href="http://code42.pl/2009/04/21/uprawnienia-plikow-w-repo-svn/">svn:executable</a>). Prawdopodobnie najpopularniejszą z nich jest <code>svn:ignore</code>, służąca właśnie do ignorowania plików.</p>
<p>Musicie pamiętać, że właściwość <code>svn:ignore</code> można ustawiać tylko na katalogach (tj. plik nie możne przechowywać informacji o tym, że on sam ma być zignorowany). Jej wartością mogą być nazwy plików, nazwy katalogów lub maski oddzielone znakiem nowej linii. Innymi słowy — aby zignorować pojedynczy plik, musimy edytować właściwości katalogu, w którym się znajduje, a nie tegoż pliku. Wg mnie najwygodniejszym sposobem ustawiania ignorowania jest wykorzystanie podpolecenia <code>propedit</code> (skrót <code>pe</code>), które to otwiera nam edytor, dzięki czemu możemy wygodnie wpisać nazwy do ignorowania.</p>
<h3>Przykład: zignorowanie plików log1, log2, katalogu test i wszyskich plików kończących się na „a” w bieżącym katalogu</h3>
<p>Otwieramy edytor dla właściwości <code>svn:ignore</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> pe <span style="color: #c20cb9; font-weight: bold;">svn</span>:ignore .</pre></div></div>

<p>Po czym w edytorze wpisujemy:</p>
<pre>log1
log2
test
*a</pre>
<p>Możemy sprawdzić czy wszystko jest ok:</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> proplist <span style="color: #660033;">-v</span>
Properties on <span style="color: #ff0000;">'.'</span>:
  <span style="color: #c20cb9; font-weight: bold;">svn</span>:ignore
    log1
    log2
    <span style="color: #7a0874; font-weight: bold;">test</span>
    <span style="color: #000000; font-weight: bold;">*</span>a</pre></div></div>

<p>Pozostaje tylko <em>zakomitować</em> zmiany:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> ci <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Trochę bezsensu, ale dobry jako przykład svn:ignore&quot;</span></pre></div></div>

<h3>Przykład: zignorowanie istniejącego, niepustego katalogu z cachem</h3>
<p>Zakładając, że sam katalog powinien znaleźć się w repozytorium, natomiast jego zawartość nie. Najpierw dodajemy katalog do svn:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> add cache <span style="color: #660033;">--depth</span> empty</pre></div></div>

<p>Gdzie <code>cache</code> jest nazwą katalogu, a parametr <code>--depth empty</code> powoduje, że pliki wewnątrz nie zostaną dodane.<br />
Następnie ustawiamy ignorowanie wszystkich plików w katalogu, za pomocą podpolecenia <code>propset</code> (skrót <code>pe</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> propset <span style="color: #c20cb9; font-weight: bold;">svn</span>:ignore \<span style="color: #000000; font-weight: bold;">*</span> cache</pre></div></div>

<p>Gwiazdka musi być wyeskejpowana, żeby nasz <em>shell</em> jej nie zinterpretował i nie podstawił wszystkich nazw plików z bieżącego katalogu. Teraz pozostaje już tylko zatwierdzenie zmian w repozytorium:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> ci <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;svn:ignore na zawartość katalogu cache&quot;</span></pre></div></div>

<h3>Przykład negatywny: ignorowanie dwa lub więcej katalogi niżej</h3>
<p>Załóżmy, że chcemy zignorować pliki <code>./log/2010/*</code>. Może wydawać się intuicyjne ustawienie <code>svn:ignore</code> w bieżącym katalogu na wartość <code>log/2010/*</code>. Jednak taki zapis nie zadziała. Musimy ustawić właściwość na katalog bezpośrednio nadrzędny, czyli:</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;">ps</span> <span style="color: #c20cb9; font-weight: bold;">svn</span>:ignore \<span style="color: #000000; font-weight: bold;">*</span> log<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2010</span></pre></div></div>



<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/04/21/uprawnienia-plikow-w-repo-svn/' rel='bookmark' title='Uprawnienia plików w repo SVN'>Uprawnienia plików w repo SVN</a></li>
<li><a href='http://code42.pl/2009/03/26/vim-znajdowanie-plikow-w-podkatalogach/' rel='bookmark' title='Vim: Znajdowanie plików w podkatalogach'>Vim: Znajdowanie plików w podkatalogach</a></li>
<li><a href='http://code42.pl/2009/01/26/vim-edycja-plikow-php/' rel='bookmark' title='Krótko: Vim i powolna edycja plików PHP'>Krótko: Vim i powolna edycja plików PHP</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/12/24/ignorowanie-plikow-w-svn/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Symfony+Propel: domyślne sortowanie</title>
		<link>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/</link>
		<comments>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 07:29:32 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=551</guid>
		<description><![CDATA[W przypadku gdy mamy wiele różnych metod pobierających kolekcje obiektów z bazy danych i chcemy, żeby były posortowane w podobny sposób — można dodać sortowanie w metodzie doSelect. public static function doSelect &#40;Criteria $criteria, PropelPDO $con = null&#41; &#123; if &#40;!$criteria-&#62;getOrderByColumns&#40;&#41;&#41; &#123; $criteria-&#62;addAscendingOrderByColumn &#40;self::YEAR&#41;; $criteria-&#62;addAscendingOrderByColumn &#40;self::MONTH&#41;; $criteria-&#62;addAscendingOrderByColumn &#40;self::DAY&#41;; &#125; return parent::doSelect &#40;$criteria, $con&#41;; &#125; Warunek [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<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/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://code42.pl/wp-content/uploads/posortuj_mnie1.jpg" alt="Posortuj mnie" height="240"/><br />
W przypadku gdy mamy wiele różnych metod pobierających kolekcje obiektów z bazy danych i chcemy, żeby były posortowane w podobny sposób — można dodać sortowanie w metodzie <code>doSelect</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> doSelect <span style="color: #009900;">&#40;</span>Criteria <span style="color: #000088;">$criteria</span><span style="color: #339933;">,</span> PropelPDO <span style="color: #000088;">$con</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOrderByColumns</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">YEAR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">MONTH</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #000088;">$criteria</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addAscendingOrderByColumn</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">DAY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">doSelect</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$criteria</span><span style="color: #339933;">,</span> <span style="color: #000088;">$con</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Warunek <code>if</code> umożliwia nam zdefiniowanie dowolnego innego sortowania <em>wcześniej</em>. W przypadku, gdy jakaś metoda (np. <code>getAll</code>) nie definiowała sortowania za pomocą obiektu <code>Criteria</code> — zostanie użyte domyślne (tutaj: po dacie).</p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/' rel='bookmark' title='Formularze Symfony: select ograniczony przez wartość innego pola'>Formularze Symfony: select ograniczony przez wartość innego pola</a></li>
<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/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Formularze Symfony: select ograniczony przez wartość innego pola</title>
		<link>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/</link>
		<comments>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/#comments</comments>
		<pubDate>Wed, 12 May 2010 19:38:52 +0000</pubDate>
		<dc:creator>zergu</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[sfWidgetFormChoice]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=538</guid>
		<description><![CDATA[Opis na przykładzie Propela. Problem Jak ograniczyć liczbę opcji w sfWidgetFormChoice na podstawie wartości z innego pola formularza. Mowa o ograniczeniu stałym, zdefiniowanym w klasie formularza. Rozwiązanie Będąc w klasie formularza mamy dostęp do wartości odpowiadającego obiektu, tylko gdy dany formularz zostanie zainicjalizowany poprzez podanie obiektu do konstruktora (czyli przykładowo $this-&#62;form = new SampleForm ($sample_object)). [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-546" title="html-select" src="http://code42.pl/wp-content/uploads/html-select.png" alt="" width="367" height="223" /></p>
<p><em>Opis na przykładzie Propela.</em></p>
<h2>Problem</h2>
<p>Jak ograniczyć liczbę opcji w <code>sfWidgetFormChoice</code> na podstawie wartości z innego pola formularza. Mowa o ograniczeniu stałym, zdefiniowanym w klasie formularza.</p>
<h2>Rozwiązanie</h2>
<p>Będąc w klasie formularza mamy dostęp do wartości odpowiadającego obiektu, tylko gdy dany formularz zostanie zainicjalizowany poprzez <strong>podanie obiektu do konstruktora</strong> (czyli przykładowo <code>$this-&gt;form = new SampleForm ($sample_object)</code>). Wtedy możemy pobrać jakąś informację z obiektu i na jej podstawie stworzyć <code>Criteria</code> ograniczające:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Criteria<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span> <span style="color: #009900;">&#40;</span>APeer<span style="color: #339933;">::</span><span style="color: #004000;">XYZ</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getObject</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAsd</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widgetSchema</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'asd'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> sfWidgetFormPropelChoice <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'model'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'B'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'criteria'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>



<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/31/walidacja-jednego-pola-formularza-w-symfony/' rel='bookmark' title='Walidacja jednego pola formularza w symfony'>Walidacja jednego pola formularza w symfony</a></li>
<li><a href='http://code42.pl/2010/07/09/symfonypropel-domyslne-sortowanie/' rel='bookmark' title='Symfony+Propel: domyślne sortowanie'>Symfony+Propel: domyślne sortowanie</a></li>
<li><a href='http://code42.pl/2009/01/05/symfony-paginacja-przy-wlasnychnietypowych-warunkach-sql/' rel='bookmark' title='Symfony: Paginacja przy własnych/nietypowych warunkach SQL'>Symfony: Paginacja przy własnych/nietypowych warunkach SQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2010/05/12/formularze-symfony-select-ograniczony-przez-wartosc-innego-pola/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

