<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3391942589902184482</id><updated>2012-02-16T18:24:51.980+01:00</updated><category term='C++'/><category term='QT'/><category term='iphone'/><category term='android'/><category term='jQuery'/><category term='CSS'/><category term='git'/><category term='php'/><category term='Linux'/><category term='html'/><category term='vim'/><category term='Prototype'/><category term='CodeIgniter'/><category term='Ruby on Rails'/><category term='JavaScript'/><category term='Windows 7'/><title type='text'>Programowanie to sztuka...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>70</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4116265480793283292</id><published>2012-02-13T16:06:00.002+01:00</published><updated>2012-02-13T16:06:28.270+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Jak usunąć plik z repozytorium GIT'a nie usuwając go z dysku</title><content type='html'>Jak?&lt;br /&gt;Ano tak:&lt;br /&gt;&lt;pre&gt;git rm --cached mylogfile.log&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4116265480793283292?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4116265480793283292/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2012/02/jak-usunac-plik-z-repozytorium-gita-nie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4116265480793283292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4116265480793283292'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2012/02/jak-usunac-plik-z-repozytorium-gita-nie.html' title='Jak usunąć plik z repozytorium GIT&apos;a nie usuwając go z dysku'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4066074592281548937</id><published>2012-02-13T15:20:00.000+01:00</published><updated>2012-02-13T15:20:42.750+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Pojawianie się zmodyfikowanych plików zaraz po "clone" w GIT'cie</title><content type='html'>Zainicjowanie w GIT'cie nowego repozytorium to&lt;br /&gt;&lt;pre&gt;git clone ssh://nazwa_uzytkownika.serwer.pl/ nazwa_repo&lt;br /&gt;&lt;/pre&gt;Standardowo zaraz po tej operacji wszystkie zaciągnięte pliki są gotowe do edycji, ale nie edytowane. Innymi słowy&lt;br /&gt;&lt;pre&gt;git status&lt;br /&gt;&lt;/pre&gt;nic nie pokazuje.&lt;br /&gt;Niestety czasami (oczywiście w Windows) zaraz po tej operacji &lt;i&gt;git status&lt;/i&gt; pokazuje kupę właśnie co wyedytowanych plików. Jest to arcyirytujące i nie mija po wykonywaniu ślepych &lt;i&gt;commit&lt;/i&gt;'ów itp. Bywa, że po dowolnym &lt;i&gt;pull&lt;/i&gt;'u problem znów odradza się niczym fenix z popiołów.&lt;br /&gt;Okazało się, że problem tkwi w windowsowych znacznikach końca linii CRLF.&lt;br /&gt;Wystarczy na repozytorium wywołać:&lt;br /&gt;&lt;pre&gt;git config core.autocrlf false&lt;br /&gt;&lt;/pre&gt;i wszystko wraca do normy.&lt;br /&gt;&lt;br /&gt;Problem ten opisany jest szczegółowo tutaj:&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/5009096/files-showing-as-modified-directly-after-git-clone"&gt;http://stackoverflow.com/questions/5009096/files-showing-as-modified-directly-after-git-clone&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4066074592281548937?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4066074592281548937/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2012/02/pojawianie-sie-zmodyfikowanych-plikow.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4066074592281548937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4066074592281548937'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2012/02/pojawianie-sie-zmodyfikowanych-plikow.html' title='Pojawianie się zmodyfikowanych plików zaraz po &quot;clone&quot; w GIT&apos;cie'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2901969145817604002</id><published>2012-01-20T15:38:00.006+01:00</published><updated>2012-01-20T15:53:06.562+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Jak wyeleminować duplikaty w tabelach złączeń</title><content type='html'>W standardowej asocjacji Rails zwanej &lt;i&gt;has_and_belongs_to_many&lt;/i&gt; do utworzenia złączenia pomiędzy dwoma tabelami potrzebna jest trzecia tabela z parami kluczy id. Na przykład tabele &lt;i&gt;firm&lt;/i&gt;s i &lt;i&gt;categories&lt;/i&gt; łączy tabela &lt;i&gt;categories_firms&lt;/i&gt;. Włożenie do tej tabeli pary kluczy łączy daną firmę z kategorią. Problem w tym, że system dopuszcza wkładanie dowolnej ilości par kluczy. Pomaga w wielu wypadkach zastosowanie zapisu :uniq =&amp;gt; true tak jak tu w modelu &lt;i&gt;firm&lt;/i&gt;:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;has_and_belongs_to_many :categories, :uniq =&amp;gt; true&lt;br /&gt;&lt;/pre&gt;ale niestety nie zawsze. &lt;br /&gt;Aby zabezpieczyć się przed umieszczaniem duplikatów najpierw robimy migrację, która przygotuje unikalny indeks zabezpieczający bazę danych przed zduplikowaniem wpisu:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;.&lt;br /&gt;add_index :categories_firms, [ :category_id, :firm_id ], :unique =&amp;gt; true, :name =&amp;gt; 'unique_by_category_and_firm'&lt;br /&gt;.&lt;br /&gt;&lt;/pre&gt;Teraz co prawda nie da się zrobić duplikowanego wpisu, ale baza danych wywala błędy.&lt;br /&gt;Przjdźmy więc do modelu firmy i tam dopiszmy do &lt;i&gt;has_and_belongs_to_many&lt;/i&gt;:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;.&lt;br /&gt;has_and_belongs_to_many :categories, :uniq =&amp;gt; true, :before_add =&amp;gt; :validates_category&lt;br /&gt;.&lt;br /&gt;&lt;/pre&gt;czyli zanim dokona się wpisu należałoby wykonać jakąś walidację:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;def validates_category(category)&lt;br /&gt;  raise ActiveRecord::Rollback if self.categories.include? category&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Proste, łatwe i przyjemne.&lt;br /&gt;&lt;br /&gt;Inspirację zaczerpnąłem z &lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/4988630/habtm-uniqueness-constraint"&gt;http://stackoverflow.com/questions/4988630/habtm-uniqueness-constraint&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2901969145817604002?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2901969145817604002/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2012/01/jak-wyeleminowac-duplikaty-w-tabelach.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2901969145817604002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2901969145817604002'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2012/01/jak-wyeleminowac-duplikaty-w-tabelach.html' title='Jak wyeleminować duplikaty w tabelach złączeń'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-6646844154404038923</id><published>2011-12-28T14:06:00.004+01:00</published><updated>2011-12-28T14:21:24.342+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Spis statusów i żądań HTTP</title><content type='html'>Przytaczam za Wikipedią:&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;span class="mw-headline" id="1xx_Informational"&gt;1xx Informational&lt;/span&gt;&lt;/h2&gt;Request received, continuing process.&lt;sup class="reference" id="cite_ref-RFC_2616_1-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;br /&gt;This class of status code indicates a provisional response,  consisting only of the Status-Line and optional headers, and is  terminated by an empty line. Since HTTP/1.0 did not define any 1xx  status codes, servers &lt;i&gt;must not&lt;/i&gt; send a 1xx response to an HTTP/1.0 client except under experimental conditions.&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span id="100"&gt;&lt;/span&gt;100 Continue&lt;/dt&gt;&lt;dd&gt;This means that the server has received the request headers, and  that the client should proceed to send the request body (in the case of a  request for which a body needs to be sent; for example, a &lt;a href="http://en.wikipedia.org/wiki/POST_%28HTTP%29" title="POST (HTTP)"&gt;POST&lt;/a&gt;  request). If the request body is large, sending it to a server when a  request has already been rejected based upon inappropriate headers is  inefficient. To have a server check if the request could be accepted  based on the request's headers alone, a client must send &lt;code&gt;Expect: 100-continue&lt;/code&gt; as a header in its initial request&lt;sup class="reference" id="cite_ref-RFC_2616_1-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; and check if a &lt;code&gt;100 Continue&lt;/code&gt; status code is received in response before continuing (or receive &lt;code&gt;417 Expectation Failed&lt;/code&gt; and not continue).&lt;sup class="reference" id="cite_ref-RFC_2616_1-2"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="101"&gt;&lt;/span&gt;101 Switching Protocols&lt;/dt&gt;&lt;dd&gt;This means the requester has asked the server to switch protocols and the server is acknowledging that it will do so.&lt;sup class="reference" id="cite_ref-RFC_2616_1-3"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="102"&gt;&lt;/span&gt;102 Processing (&lt;a href="http://en.wikipedia.org/wiki/WebDAV" title="WebDAV"&gt;WebDAV&lt;/a&gt;) (RFC 2518)&lt;/dt&gt;&lt;dd&gt;As a WebDAV request may contain many sub-requests involving file  operations, it may take a long time to complete the request. This code  indicates that the server has received and is processing the request,  but no response is available yet.&lt;sup class="reference" id="cite_ref-RFC_2518_2-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2518-2"&gt;[3]&lt;/a&gt;&lt;/sup&gt; This prevents the client from timing out and assuming the request was lost.&lt;/dd&gt;&lt;dt&gt;&lt;span id="103"&gt;&lt;/span&gt;103 Checkpoint&lt;/dt&gt;&lt;dd&gt;This code is used in the Resumable HTTP Requests Proposal to resume aborted PUT or POST requests.&lt;sup class="reference" id="cite_ref-ResumableHttpRequestsProposal_3-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-ResumableHttpRequestsProposal-3"&gt;[4]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="122"&gt;&lt;/span&gt;122 Request-URI too long&lt;/dt&gt;&lt;dd&gt;This is a non-standard IE7-only code which means the URI is longer than a maximum of 2083 characters.&lt;sup class="reference" id="cite_ref-4"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-4"&gt;[5]&lt;/a&gt;&lt;/sup&gt;&lt;sup class="reference" id="cite_ref-5"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-5"&gt;[6]&lt;/a&gt;&lt;/sup&gt; (See code 414.)&lt;/dd&gt;&lt;/dl&gt;&lt;h2&gt;&lt;span class="editsection"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=List_of_HTTP_status_codes&amp;amp;action=edit&amp;amp;section=2" title="Edit section: 2xx Success"&gt;edit&lt;/a&gt;]&lt;/span&gt; &lt;span class="mw-headline" id="2xx_Success"&gt;2xx Success&lt;/span&gt;&lt;/h2&gt;This class of status codes indicates the action requested by the  client was received, understood, accepted and processed successfully.&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span id="200"&gt;&lt;/span&gt;200 OK&lt;/dt&gt;&lt;dd&gt;Standard response for successful HTTP requests. The actual response  will depend on the request method used. In a GET request, the response  will contain an entity corresponding to the requested resource. In a  POST request the response will contain an entity describing or  containing the result of the action.&lt;sup class="reference" id="cite_ref-RFC_2616_1-4"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="201"&gt;&lt;/span&gt;201 Created&lt;/dt&gt;&lt;dd&gt;The request has been fulfilled and resulted in a new resource being created.&lt;sup class="reference" id="cite_ref-RFC_2616_1-5"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="202"&gt;&lt;/span&gt;202 Accepted&lt;/dt&gt;&lt;dd&gt;The request has been accepted for processing, but the processing has  not been completed. The request might or might not eventually be acted  upon, as it might be disallowed when processing actually takes place.&lt;sup class="reference" id="cite_ref-RFC_2616_1-6"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="203"&gt;&lt;/span&gt;203 Non-Authoritative Information (since HTTP/1.1)&lt;/dt&gt;&lt;dd&gt;The server successfully processed the request, but is returning information that may be from another source.&lt;sup class="reference" id="cite_ref-RFC_2616_1-7"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="204"&gt;&lt;/span&gt;204 No Content&lt;/dt&gt;&lt;dd&gt;The server successfully processed the request, but is not returning any content.&lt;sup class="reference" id="cite_ref-RFC_2616_1-8"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="205"&gt;&lt;/span&gt;205 Reset Content&lt;/dt&gt;&lt;dd&gt;The server successfully processed the request, but is not returning  any content. Unlike a 204 response, this response requires that the  requester reset the document view.&lt;sup class="reference" id="cite_ref-RFC_2616_1-9"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="206"&gt;&lt;/span&gt;206 Partial Content&lt;/dt&gt;&lt;dd&gt;The server is delivering only part of the resource due to a range  header sent by the client. The range header is used by tools like &lt;a href="http://en.wikipedia.org/wiki/Wget" title="Wget"&gt;wget&lt;/a&gt; to enable resuming of interrupted downloads, or split a download into multiple simultaneous streams.&lt;sup class="reference" id="cite_ref-RFC_2616_1-10"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="207"&gt;&lt;/span&gt;207 Multi-Status (WebDAV) (RFC 4918)&lt;/dt&gt;&lt;dd&gt;The message body that follows is an &lt;a href="http://en.wikipedia.org/wiki/XML" title="XML"&gt;XML&lt;/a&gt; message and can contain a number of separate response codes, depending on how many sub-requests were made.&lt;sup class="reference" id="cite_ref-RFC_4918_6-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_4918-6"&gt;[7]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="208"&gt;&lt;/span&gt;208 Already Reported (WebDAV) (RFC 5842)&lt;/dt&gt;&lt;dd&gt;The members of a DAV binding have already been enumerated in a previous reply to this request, and are not being included again.&lt;/dd&gt;&lt;dt&gt;&lt;span id="226"&gt;&lt;/span&gt;226 IM Used (RFC 3229)&lt;/dt&gt;&lt;dd&gt;The server has fulfilled a GET request for the resource, and the  response is a representation of the result of one or more  instance-manipulations applied to the current instance. &lt;sup class="reference" id="cite_ref-RFC_3229_7-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_3229-7"&gt;[8]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h2&gt;&lt;span class="editsection"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=List_of_HTTP_status_codes&amp;amp;action=edit&amp;amp;section=3" title="Edit section: 3xx Redirection"&gt;edit&lt;/a&gt;]&lt;/span&gt; &lt;span class="mw-headline" id="3xx_Redirection"&gt;3xx Redirection&lt;/span&gt;&lt;/h2&gt;The client must take additional action to complete the request.&lt;sup class="reference" id="cite_ref-RFC_2616_1-11"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;br /&gt;This class of status code indicates that further action needs to be  taken by the user agent in order to fulfil the request. The action  required &lt;i&gt;may&lt;/i&gt; be carried out by the user agent without interaction  with the user if and only if the method used in the second request is  GET or HEAD. A user agent &lt;i&gt;should not&lt;/i&gt; automatically redirect a request more than five times, since such redirections usually indicate an &lt;a href="http://en.wikipedia.org/wiki/Infinite_loop" title="Infinite loop"&gt;infinite loop&lt;/a&gt;.&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span id="300"&gt;&lt;/span&gt;300 Multiple Choices&lt;/dt&gt;&lt;dd&gt;Indicates multiple options for the resource that the client may  follow. It, for instance, could be used to present different format  options for video, list files with different &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/File_extensions" title="File extensions"&gt;extensions&lt;/a&gt;, or &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Word_sense_disambiguation" title="Word sense disambiguation"&gt;word sense disambiguation&lt;/a&gt;.&lt;sup class="reference" id="cite_ref-RFC_2616_1-12"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="301"&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/HTTP_301" title="HTTP 301"&gt;301 Moved Permanently&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;This and all future requests should be directed to the given &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/URI" title="URI"&gt;URI&lt;/a&gt;.&lt;sup class="reference" id="cite_ref-RFC_2616_1-13"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="302"&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/HTTP_302" title="HTTP 302"&gt;302 Found&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;This is an example of industrial practice contradicting the standard.&lt;sup class="reference" id="cite_ref-RFC_2616_1-14"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;  HTTP/1.0 specification (RFC 1945) required the client to perform a  temporary redirect (the original describing phrase was "Moved  Temporarily"),&lt;sup class="reference" id="cite_ref-RFC_1945_8-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_1945-8"&gt;[9]&lt;/a&gt;&lt;/sup&gt;  but popular browsers implemented 302 with the functionality of a 303  See Other. Therefore, HTTP/1.1 added status codes 303 and 307 to  distinguish between the two behaviours.&lt;sup class="reference" id="cite_ref-RFC2616-10_9-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC2616-10-9"&gt;[10]&lt;/a&gt;&lt;/sup&gt; However, some Web applications and frameworks use the 302 status code as if it were the 303.&lt;sup class="Template-Fact" style="white-space: nowrap;"&gt;[&lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Wikipedia:Citation_needed" title="Wikipedia:Citation needed"&gt;&lt;span title="This claim needs references to reliable sources from February 2011"&gt;citation needed&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;]&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="303"&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/HTTP_303" title="HTTP 303"&gt;303 See Other&lt;/a&gt; (since HTTP/1.1)&lt;/dt&gt;&lt;dd&gt;The response to the request can be found under another &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier" title="Uniform Resource Identifier"&gt;URI&lt;/a&gt;  using a GET method. When received in response to a POST (or  PUT/DELETE), it should be assumed that the server has received the data  and the redirect should be issued with a separate GET message.&lt;sup class="reference" id="cite_ref-RFC_2616_1-15"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="304"&gt;&lt;/span&gt;304 Not Modified&lt;/dt&gt;&lt;dd&gt;Indicates the resource has not been modified since last requested.&lt;sup class="reference" id="cite_ref-RFC_2616_1-16"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;  Typically, the HTTP client provides a header like the If-Modified-Since  header to provide a time against which to compare. Using this saves  bandwidth and reprocessing on both the server and client, as only the  header data must be sent and received in comparison to the entirety of  the page being re-processed by the server, then sent again using more  bandwidth of the server and client.&lt;/dd&gt;&lt;dt&gt;&lt;span id="305"&gt;&lt;/span&gt;305 Use Proxy (since HTTP/1.1)&lt;/dt&gt;&lt;dd&gt;Many HTTP clients (such as &lt;a href="http://en.wikipedia.org/wiki/Mozilla" title="Mozilla"&gt;Mozilla&lt;/a&gt;&lt;sup class="reference" id="cite_ref-mozilla_bugzilla_bug_187996_10-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-mozilla_bugzilla_bug_187996-10"&gt;[11]&lt;/a&gt;&lt;/sup&gt; and &lt;a href="http://en.wikipedia.org/wiki/Internet_Explorer" title="Internet Explorer"&gt;Internet Explorer&lt;/a&gt;) do not correctly handle responses with this status code, primarily for security reasons.&lt;sup class="reference" id="cite_ref-RFC_2616_1-17"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="306"&gt;&lt;/span&gt;306 Switch Proxy&lt;/dt&gt;&lt;dd&gt;No longer used.&lt;sup class="reference" id="cite_ref-RFC_2616_1-18"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; Originally meant "Subsequent requests should use the specified proxy."&lt;sup class="reference" id="cite_ref-11"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-11"&gt;[12]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="307"&gt;&lt;/span&gt;307 Temporary Redirect (since HTTP/1.1)&lt;/dt&gt;&lt;dd&gt;In this occasion, the request should be repeated with another URI, but future requests can still use the original URI.&lt;sup class="reference" id="cite_ref-RFC_2616_1-19"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;  In contrast to 303, the request method should not be changed when  reissuing the original request. For instance, a POST request must be  repeated using another POST request.&lt;/dd&gt;&lt;dt&gt;&lt;span id="308"&gt;&lt;/span&gt;308 Resume Incomplete&lt;/dt&gt;&lt;dd&gt;This code is used in the Resumable HTTP Requests Proposal to resume aborted PUT or POST requests.&lt;sup class="reference" id="cite_ref-ResumableHttpRequestsProposal_3-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-ResumableHttpRequestsProposal-3"&gt;[4]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h2&gt;&lt;span class="editsection"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=List_of_HTTP_status_codes&amp;amp;action=edit&amp;amp;section=4" title="Edit section: 4xx Client Error"&gt;edit&lt;/a&gt;]&lt;/span&gt; &lt;span class="mw-headline" id="4xx_Client_Error"&gt;4xx Client Error&lt;/span&gt;&lt;/h2&gt;The 4xx class of status code is intended for cases in which the  client seems to have erred. Except when responding to a HEAD request,  the server &lt;i&gt;should&lt;/i&gt; include an entity containing an explanation of  the error situation, and whether it is a temporary or permanent  condition. These status codes are applicable to any request method. User  agents &lt;i&gt;should&lt;/i&gt; display any included entity to the user.&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span id="400"&gt;&lt;/span&gt;400 Bad Request&lt;/dt&gt;&lt;dd&gt;The request cannot be fulfilled due to bad syntax.&lt;sup class="reference" id="cite_ref-RFC_2616_1-20"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="401"&gt;&lt;/span&gt;401 Unauthorized&lt;/dt&gt;&lt;dd&gt;Similar to &lt;i&gt;403 Forbidden&lt;/i&gt;, but specifically for use when authentication is possible but has failed or not yet been provided.&lt;sup class="reference" id="cite_ref-RFC_2616_1-21"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; The response must include a WWW-Authenticate header field containing a challenge applicable to the requested resource. See &lt;a href="http://en.wikipedia.org/wiki/Basic_access_authentication" title="Basic access authentication"&gt;Basic access authentication&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Digest_access_authentication" title="Digest access authentication"&gt;Digest access authentication&lt;/a&gt;.&lt;/dd&gt;&lt;dt&gt;&lt;span id="402"&gt;&lt;/span&gt;402 Payment Required&lt;/dt&gt;&lt;dd&gt;Reserved for future use.&lt;sup class="reference" id="cite_ref-RFC_2616_1-22"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; The original intention was that this code might be used as part of some form of &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Digital_cash" title="Digital cash"&gt;digital cash&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Micropayment" title="Micropayment"&gt;micropayment&lt;/a&gt; scheme, but that has not happened, and this code is not usually used. As an example of its use, however, Apple's &lt;a href="http://en.wikipedia.org/wiki/MobileMe" title="MobileMe"&gt;MobileMe&lt;/a&gt; service generates a 402 error ("httpStatusCode:402" in the Mac OS X Console log) if the MobileMe account is delinquent.&lt;/dd&gt;&lt;dt&gt;&lt;span id="403"&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/HTTP_403" title="HTTP 403"&gt;403 Forbidden&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The request was a legal request, but the server is refusing to respond to it.&lt;sup class="reference" id="cite_ref-RFC_2616_1-23"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; Unlike a &lt;i&gt;401 Unauthorized&lt;/i&gt; response, authenticating will make no difference.&lt;sup class="reference" id="cite_ref-RFC_2616_1-24"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="404"&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/HTTP_404" title="HTTP 404"&gt;404 Not Found&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The requested resource could not be found but may be available again in the future.&lt;sup class="reference" id="cite_ref-RFC_2616_1-25"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; Subsequent requests by the client are permissible.&lt;/dd&gt;&lt;dt&gt;&lt;span id="405"&gt;&lt;/span&gt;405 Method Not Allowed&lt;/dt&gt;&lt;dd&gt;A request was made of a resource using a request method not supported by that resource;&lt;sup class="reference" id="cite_ref-RFC_2616_1-26"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; for example, using GET on a form which requires data to be presented via POST, or using PUT on a read-only resource.&lt;/dd&gt;&lt;dt&gt;&lt;span id="406"&gt;&lt;/span&gt;406 Not Acceptable&lt;/dt&gt;&lt;dd&gt;The requested resource is only capable of generating content not acceptable according to the Accept headers sent in the request.&lt;sup class="reference" id="cite_ref-RFC_2616_1-27"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="407"&gt;&lt;/span&gt;407 Proxy Authentication Required&lt;/dt&gt;&lt;dd&gt;The client must first authenticate itself with the proxy.&lt;sup class="reference" id="cite_ref-RFC_2616_1-28"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="408"&gt;&lt;/span&gt;408 Request Timeout&lt;/dt&gt;&lt;dd&gt;The server timed out waiting for the request.&lt;sup class="reference" id="cite_ref-RFC_2616_1-29"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;  According to W3 HTTP specifications: "The client did not produce a  request within the time that the server was prepared to wait. The client  MAY repeat the request without modifications at any later time."&lt;/dd&gt;&lt;dt&gt;&lt;span id="409"&gt;&lt;/span&gt;409 Conflict&lt;/dt&gt;&lt;dd&gt;Indicates that the request could not be processed because of conflict in the request, such as an &lt;a href="http://en.wikipedia.org/wiki/Edit_conflict" title="Edit conflict"&gt;edit conflict&lt;/a&gt;.&lt;sup class="reference" id="cite_ref-RFC_2616_1-30"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="410"&gt;&lt;/span&gt;410 Gone&lt;/dt&gt;&lt;dd&gt;Indicates that the resource requested is no longer available and will not be available again.&lt;sup class="reference" id="cite_ref-RFC_2616_1-31"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;  This should be used when a resource has been intentionally removed and  the resource should be purged. Upon receiving a 410 status code, the  client should not request the resource again in the future. Clients such  as search engines should remove the resource from their indices. Most  use cases do not require clients and search engines to purge the  resource, and a "404 Not Found" may be used instead.&lt;/dd&gt;&lt;dt&gt;&lt;span id="411"&gt;&lt;/span&gt;411 Length Required&lt;/dt&gt;&lt;dd&gt;The request did not specify the length of its content, which is required by the requested resource.&lt;sup class="reference" id="cite_ref-RFC_2616_1-32"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="412"&gt;&lt;/span&gt;412 Precondition Failed&lt;/dt&gt;&lt;dd&gt;The server does not meet one of the preconditions that the requester put on the request.&lt;sup class="reference" id="cite_ref-RFC_2616_1-33"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="413"&gt;&lt;/span&gt;413 Request Entity Too Large&lt;/dt&gt;&lt;dd&gt;The request is larger than the server is willing or able to process.&lt;sup class="reference" id="cite_ref-RFC_2616_1-34"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="414"&gt;&lt;/span&gt;414 Request-URI Too Long&lt;/dt&gt;&lt;dd&gt;The &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/URI" title="URI"&gt;URI&lt;/a&gt; provided was too long for the server to process.&lt;sup class="reference" id="cite_ref-RFC_2616_1-35"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="415"&gt;&lt;/span&gt;415 Unsupported Media Type&lt;/dt&gt;&lt;dd&gt;The request entity has a &lt;a href="http://en.wikipedia.org/wiki/Internet_media_type" title="Internet media type"&gt;media type&lt;/a&gt; which the server or resource does not support.&lt;sup class="reference" id="cite_ref-RFC_2616_1-36"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; For example, the client uploads an image as &lt;a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics" title="Scalable Vector Graphics"&gt;image/svg+xml&lt;/a&gt;, but the server requires that images use a different format.&lt;/dd&gt;&lt;dt&gt;&lt;span id="416"&gt;&lt;/span&gt;416 Requested Range Not Satisfiable&lt;/dt&gt;&lt;dd&gt;The client has asked for a portion of the file, but the server cannot supply that portion.&lt;sup class="reference" id="cite_ref-RFC_2616_1-37"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; For example, if the client asked for a part of the file that lies beyond the end of the file.&lt;/dd&gt;&lt;dt&gt;&lt;span id="417"&gt;&lt;/span&gt;417 Expectation Failed&lt;/dt&gt;&lt;dd&gt;The server cannot meet the requirements of the Expect request-header field.&lt;sup class="reference" id="cite_ref-RFC_2616_1-38"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="418"&gt;&lt;/span&gt;418 I'm a teapot (RFC 2324)&lt;/dt&gt;&lt;dd&gt;This code was defined in 1998 as one of the traditional &lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/IETF" title="IETF"&gt;IETF&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/April_Fools%27_Day_RFC" title="April Fools' Day RFC"&gt;April Fools' jokes&lt;/a&gt;, in &lt;a class="external mw-magiclink-rfc" href="http://tools.ietf.org/html/rfc2324"&gt;RFC 2324&lt;/a&gt;, &lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol" title="Hyper Text Coffee Pot Control Protocol"&gt;Hyper Text Coffee Pot Control Protocol&lt;/a&gt;&lt;/i&gt;, and is not expected to be implemented by actual HTTP servers. However, known implementations do exist.&lt;sup class="reference" id="cite_ref-12"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-12"&gt;[13]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="422"&gt;&lt;/span&gt;422 Unprocessable Entity (WebDAV) (RFC 4918)&lt;/dt&gt;&lt;dd&gt;The request was well-formed but was unable to be followed due to semantic errors.&lt;sup class="reference" id="cite_ref-RFC_4918_6-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_4918-6"&gt;[7]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="423"&gt;&lt;/span&gt;423 Locked (WebDAV) (RFC 4918)&lt;/dt&gt;&lt;dd&gt;The resource that is being accessed is locked.&lt;sup class="reference" id="cite_ref-RFC_4918_6-2"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_4918-6"&gt;[7]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="424"&gt;&lt;/span&gt;424 Failed Dependency (WebDAV) (RFC 4918)&lt;/dt&gt;&lt;dd&gt;The request failed due to failure of a previous request (e.g. a PROPPATCH).&lt;sup class="reference" id="cite_ref-RFC_4918_6-3"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_4918-6"&gt;[7]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="425"&gt;&lt;/span&gt;425 Unordered Collection (RFC 3648)&lt;/dt&gt;&lt;dd&gt;Defined in drafts of "WebDAV Advanced Collections Protocol",&lt;sup class="reference" id="cite_ref-WEBDAV_CP_04_13-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-WEBDAV_CP_04-13"&gt;[14]&lt;/a&gt;&lt;/sup&gt; but not present in "Web Distributed Authoring and Versioning (WebDAV) Ordered Collections Protocol".&lt;sup class="reference" id="cite_ref-RFC_3648_14-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_3648-14"&gt;[15]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="426"&gt;&lt;/span&gt;426 Upgrade Required (RFC 2817)&lt;/dt&gt;&lt;dd&gt;The client should switch to a different protocol such as &lt;a href="http://en.wikipedia.org/wiki/Transport_Layer_Security" title="Transport Layer Security"&gt;TLS/1.0&lt;/a&gt;.&lt;sup class="reference" id="cite_ref-RFC_2817_15-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2817-15"&gt;[16]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="428"&gt;&lt;/span&gt;428 Precondition Required&lt;/dt&gt;&lt;dd&gt;The origin server requires the request to be conditional. Intended  to prevent "the 'lost update' problem, where a client GETs a resource's  state, modifies it, and PUTs it back to the server, when meanwhile a  third party has modified the state on the server, leading to a  conflict."&lt;sup class="reference" id="cite_ref-http-new-status-02_16-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-http-new-status-02-16"&gt;[17]&lt;/a&gt;&lt;/sup&gt; Proposed in an Internet-Draft.&lt;/dd&gt;&lt;dt&gt;&lt;span id="429"&gt;&lt;/span&gt;429 Too Many Requests&lt;/dt&gt;&lt;dd&gt;The user has sent too many requests in a given amount of time. Intended for use with &lt;a href="http://en.wikipedia.org/wiki/Rate_limiting" title="Rate limiting"&gt;rate limiting&lt;/a&gt; schemes. Proposed in an Internet-Draft.&lt;sup class="reference" id="cite_ref-http-new-status-02_16-1"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-http-new-status-02-16"&gt;[17]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="431"&gt;&lt;/span&gt;431 Request Header Fields Too Large&lt;/dt&gt;&lt;dd&gt;The server is unwilling to process the request because either an  individual header field, or all the header fields collectively, are too  large. Proposed in an Internet-Draft.&lt;sup class="reference" id="cite_ref-http-new-status-02_16-2"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-http-new-status-02-16"&gt;[17]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="444"&gt;&lt;/span&gt;444 No Response&lt;/dt&gt;&lt;dd&gt;An &lt;a href="http://en.wikipedia.org/wiki/Nginx" title="Nginx"&gt;nginx&lt;/a&gt;  HTTP server extension. The server returns no information to the client  and closes the connection (useful as a deterrent for malware).&lt;/dd&gt;&lt;dt&gt;&lt;span id="449"&gt;&lt;/span&gt;449 Retry With&lt;/dt&gt;&lt;dd&gt;A Microsoft extension. The request should be retried after performing the appropriate action.&lt;sup class="reference" id="cite_ref-MS_DD891478_17-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-MS_DD891478-17"&gt;[18]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="450"&gt;&lt;/span&gt;450 Blocked by Windows Parental Controls&lt;/dt&gt;&lt;dd&gt;A Microsoft extension. This error is given when Windows Parental  Controls are turned on and are blocking access to the given webpage.&lt;sup class="reference" id="cite_ref-18"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-18"&gt;[19]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="499"&gt;&lt;/span&gt;499 Client Closed Request&lt;/dt&gt;&lt;dd&gt;An Nginx HTTP server extension. This code is introduced to log the  case when the connection is closed by client while HTTP server is  processing its request, making server unable to send the HTTP header  back.&lt;sup class="reference" id="cite_ref-Nginx_mailing_list.2C_2007-08-27_19-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-Nginx_mailing_list.2C_2007-08-27-19"&gt;[20]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;h2&gt;&lt;span class="editsection"&gt;[&lt;a href="http://en.wikipedia.org/w/index.php?title=List_of_HTTP_status_codes&amp;amp;action=edit&amp;amp;section=5" title="Edit section: 5xx Server Error"&gt;edit&lt;/a&gt;]&lt;/span&gt; &lt;span class="mw-headline" id="5xx_Server_Error"&gt;5xx Server Error&lt;/span&gt;&lt;/h2&gt;The server failed to fulfill an apparently valid request.&lt;sup class="reference" id="cite_ref-RFC_2616_1-39"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;br /&gt;Response status codes beginning with the digit "5" indicate cases in  which the server is aware that it has encountered an error or is  otherwise incapable of performing the request. Except when responding to  a HEAD request, the server &lt;i&gt;should&lt;/i&gt; include an entity containing  an explanation of the error situation, and indicate whether it is a  temporary or permanent condition. Likewise, user agents &lt;i&gt;should&lt;/i&gt; display any included entity to the user. These response codes are applicable to any request method.&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;span id="500"&gt;&lt;/span&gt;500 Internal Server Error&lt;/dt&gt;&lt;dd&gt;A generic error message, given when no more specific message is suitable.&lt;sup class="reference" id="cite_ref-RFC_2616_1-40"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="501"&gt;&lt;/span&gt;501 Not Implemented&lt;/dt&gt;&lt;dd&gt;The server either does not recognise the request method, or it lacks the ability to fulfill the request.&lt;sup class="reference" id="cite_ref-RFC_2616_1-41"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="502"&gt;&lt;/span&gt;502 Bad Gateway&lt;/dt&gt;&lt;dd&gt;The server was acting as a gateway or proxy and received an invalid response from the upstream server.&lt;sup class="reference" id="cite_ref-RFC_2616_1-42"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="503"&gt;&lt;/span&gt;503 Service Unavailable&lt;/dt&gt;&lt;dd&gt;The server is currently unavailable (because it is overloaded or down for maintenance).&lt;sup class="reference" id="cite_ref-RFC_2616_1-43"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt; Generally, this is a temporary state.&lt;/dd&gt;&lt;dt&gt;&lt;span id="504"&gt;&lt;/span&gt;504 Gateway Timeout&lt;/dt&gt;&lt;dd&gt;The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.&lt;sup class="reference" id="cite_ref-RFC_2616_1-44"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="505"&gt;&lt;/span&gt;505 HTTP Version Not Supported&lt;/dt&gt;&lt;dd&gt;The server does not support the HTTP protocol version used in the request.&lt;sup class="reference" id="cite_ref-RFC_2616_1-45"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2616-1"&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="506"&gt;&lt;/span&gt;506 Variant Also Negotiates (RFC 2295)&lt;/dt&gt;&lt;dd&gt;Transparent &lt;a href="http://en.wikipedia.org/wiki/Content_negotiation" title="Content negotiation"&gt;content negotiation&lt;/a&gt; for the request results in a &lt;a href="http://en.wikipedia.org/wiki/Circular_reference" title="Circular reference"&gt;circular reference&lt;/a&gt;.&lt;sup class="reference" id="cite_ref-RFC_2295_20-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2295-20"&gt;[21]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="507"&gt;&lt;/span&gt;507 Insufficient Storage (WebDAV) (RFC 4918)&lt;/dt&gt;&lt;dd&gt;The server is unable to store the representation needed to complete the request.&lt;sup class="reference" id="cite_ref-RFC_4918_6-4"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_4918-6"&gt;[7]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="508"&gt;&lt;/span&gt;508 Loop Detected (WebDAV) (RFC 5842)&lt;/dt&gt;&lt;dd&gt;The server detected an infinite loop while processing the request (sent in lieu of 208).&lt;/dd&gt;&lt;dt&gt;&lt;span id="509"&gt;&lt;/span&gt;509 Bandwidth Limit Exceeded (Apache bw/limited extension)&lt;/dt&gt;&lt;dd&gt;This status code, while used by many servers, is not specified in any RFCs.&lt;/dd&gt;&lt;dt&gt;&lt;span id="510"&gt;&lt;/span&gt;510 Not Extended (RFC 2774)&lt;/dt&gt;&lt;dd&gt;Further extensions to the request are required for the server to fulfill it.&lt;sup class="reference" id="cite_ref-RFC_2774_21-0"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-RFC_2774-21"&gt;[22]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="511"&gt;&lt;/span&gt;511 Network Authentication Required&lt;/dt&gt;&lt;dd&gt;The client needs to authenticate to gain network access. Intended  for use by intercepting proxies used to control access to the network  (e.g. "captive portals" used to require agreement to Terms of Service  before granting full Internet access via a Wi-Fi hotspot). Proposed in  an Internet-Draft.&lt;sup class="reference" id="cite_ref-http-new-status-02_16-3"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-http-new-status-02-16"&gt;[17]&lt;/a&gt;&lt;/sup&gt;&lt;/dd&gt;&lt;dt&gt;&lt;span id="598"&gt;&lt;/span&gt;598 Network read timeout error&lt;/dt&gt;&lt;dd&gt;This status code is not specified in any RFCs, but is used by some&lt;sup class="noprint Inline-Template" style="white-space: nowrap;"&gt;[&lt;i&gt;&lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Wikipedia:Avoid_weasel_words" title="Wikipedia:Avoid weasel words"&gt;&lt;span title="The material in the vicinity of this tag may use weasel words or too-vague attribution. from December 2011"&gt;which?&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;]&lt;/sup&gt; HTTP proxies to signal a network read timeout behind the proxy to a client in front of the proxy.&lt;/dd&gt;&lt;dt&gt;&lt;span id="599"&gt;&lt;/span&gt;599 Network connect timeout error&lt;sup class="reference" id="cite_ref-22"&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#cite_note-22"&gt;[23]&lt;/a&gt;&lt;/sup&gt;&lt;/dt&gt;&lt;dd&gt;This status code is not specified in any RFCs, but is used by some&lt;sup class="noprint Inline-Template" style="white-space: nowrap;"&gt;[&lt;i&gt;&lt;a class="mw-redirect" href="http://en.wikipedia.org/wiki/Wikipedia:Avoid_weasel_words" title="Wikipedia:Avoid weasel words"&gt;&lt;span title="The material in the vicinity of this tag may use weasel words or too-vague attribution. from December 2011"&gt;which?&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;]&lt;/sup&gt; HTTP proxies to signal a network connect timeout behind the proxy to a client in front of the proxy.&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;br /&gt;Mogłem oczywiście podać sam link: &lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes"&gt;http://en.wikipedia.org/wiki/List_of_HTTP_status_codes&lt;/a&gt;&lt;br /&gt;ale wolałem mieć wszystko w jednym miejscu kiedy czegoś szukam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-6646844154404038923?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/6646844154404038923/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/12/spis-statusow-i-zadan-http.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6646844154404038923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6646844154404038923'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/12/spis-statusow-i-zadan-http.html' title='Spis statusów i żądań HTTP'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7381720297398445074</id><published>2011-12-19T15:45:00.000+01:00</published><updated>2011-12-19T15:45:43.781+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Jak zamienić string na nazwę klasy</title><content type='html'>Napotkałem na taki problem: nazwy klas (modeli) mam złożone w postaci zwykłych stringów czyli klasycznych ciągów znaków. Chciałem używać tych stringów jako normalnych klas.&lt;br /&gt;&lt;br /&gt;zamiast:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;  @employees=Employee.all&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;użyłem czegoś takiego:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;  class_name="Employee"&lt;br /&gt;  @employees=Kernel.const_get(class_name).all&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Na pierwszy rzut oka wydaje się to niepotrzebne. Do czasu...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7381720297398445074?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7381720297398445074/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/12/jak-zamienic-string-na-nazwe-klasy.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7381720297398445074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7381720297398445074'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/12/jak-zamienic-string-na-nazwe-klasy.html' title='Jak zamienić string na nazwę klasy'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7164763389288927360</id><published>2011-12-01T16:05:00.005+01:00</published><updated>2011-12-01T16:15:00.264+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>Dynamiczne dodawanie opcji do kontrolki "select"</title><content type='html'>Wydawałoby się, że jest to prosta i jakże częsta akcja twórców stron i aplikacji internetowych. Jednak nie udało mi się znaleźć żadnego(sic!) rozwiązania, które byłoby zgodne z duchem Rails. Jak nie ma, to trzeba napisać. Siadłem i popełniłem kod jak poniżej.&lt;br /&gt;&lt;br /&gt;Założenia są proste (podam w składni Rails) jest jakaś lista select, na przykład:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&lt;%= select_tag :event_container %&gt;&lt;br /&gt;&lt;/pre&gt;i chciałbym do tej listy dorzucać pracowników z listy&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&lt;%= select_tag(:employee_id,&lt;br /&gt;                options_for_select(Employee.all.map { |employee| [employee.full_name, employee.id] }) %&gt;&lt;br /&gt;&lt;/pre&gt;Chcę sobie kliknąć na listę z pracownikami, a po kliknięciu zaznaczony pracownik ma "przeskoczyć" z jednej listy na drugą. "Przeskoczyć" to znaczy zniknąć z jednej listy, a pojawić się na drugiej i &lt;i&gt;vice versa&lt;/i&gt;.&lt;br /&gt;Do widoku wrzucam więc obserwatory:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&lt;%= observe_field "employee_id",&lt;br /&gt;                   :url =&gt; {:action =&gt; :move_employee_name},&lt;br /&gt;                   :with =&gt; "employee_id" %&gt;&lt;br /&gt;&lt;%= observe_field "event_container",&lt;br /&gt;                   :url =&gt; {:action =&gt; :remove_employee_from_event},&lt;br /&gt;                   :with =&gt; "event_container" %&gt;&lt;br /&gt;&lt;/pre&gt;i tworzę dla nich pliki RJS odpowiednio: &lt;i&gt;move_employee_name.rjs&lt;/i&gt; i &lt;i&gt;remove_employee_from_event.rjs&lt;/i&gt;. Muszą one być skorelowane z metodami o takich samych nazwach w kontrolerze! Nie zapomnieć!&lt;br /&gt;Wpisy w &lt;i&gt;move_employee_name.rjs&lt;/i&gt; dotyczą oczywiście kontrolek select:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;page[:event_container].addNewOption @employee.full_name, @employee.id&lt;br /&gt;page[:employee_id].removeSelectedOption&lt;br /&gt;&lt;/pre&gt;Wpisy w &lt;i&gt;remove_employee_from_event.rjs&lt;/i&gt; są analogiczne&lt;br /&gt;&lt;pre class="brush: ruby"&gt;page[:employee_id].addNewOption @employee.full_name, @employee.id&lt;br /&gt;page[:event_container].removeSelectedOption&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I tu pytanie za 12 punktów: skąd RJS zna te dziwne metody? Mowa oczywiście o "&lt;i&gt;.addNewOption&lt;/i&gt;" i "&lt;i&gt;.removeSelectedOption&lt;/i&gt;". I od razu odpowiedź: wpisałem je w /public/savascripts/application.js w postaci:&lt;br /&gt;&lt;pre class="brush: javascript"&gt;/* Dodawanie metod do szablonów RJS. */&lt;br /&gt;Element.addMethods({&lt;br /&gt; /* Dodawanie nowej opcji do kontrolki select. W tym przypadku jest to "element". */&lt;br /&gt; addNewOption: function(element, option, id) {&lt;br /&gt;  element.options.add(new Option(option, id));&lt;br /&gt;  return element;&lt;br /&gt; },&lt;br /&gt; /* Usuwanie zaznaczonej opcji w kontrolce select. Bez parametrów, gdyż funkcja leci po wszystkich. */&lt;br /&gt; removeSelectedOption: function(element) {&lt;br /&gt;  var i;&lt;br /&gt;  for (i = element.length - 1; i &gt;= 0; i--) {&lt;br /&gt;   if (element.options[i].selected) {&lt;br /&gt;    element.remove(i);&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;Tam jest właśnie cała magia :-)&lt;br /&gt;&lt;br /&gt;Sposób opisany tu przeze mnie jest jak najbardziej zgodny z ideą Rails. Daje się łatwo utrzymać w kodzie aplikacji i jest czytelny. Nic tylko brać!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7164763389288927360?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7164763389288927360/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/12/dynamiczne-dodawanie-opcji-do-kontrolki.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7164763389288927360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7164763389288927360'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/12/dynamiczne-dodawanie-opcji-do-kontrolki.html' title='Dynamiczne dodawanie opcji do kontrolki &quot;select&quot;'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7027035005629937676</id><published>2011-08-08T12:27:00.002+02:00</published><updated>2011-08-08T12:30:12.481+02:00</updated><title type='text'>Polski słownik do Intellij Idea</title><content type='html'>Nareszcie udało mi się podłączyć polski słownik do mojego ulubionego IDE. Niech będzie, że to reklama i ujawnię (wszakże jest to w temacie), że moim ulubionym IDE jest Intellij Idea. Po jaką cholerę oni tak komplikują tę nazwę? Nie wiem.&lt;br /&gt;Ale ad rem! W środowisku tym możemy podłączyć plik słownika w formacie .dic. Proszę mnie nie pytać jak wygląda ten format. Nie wiem. Wiem natomiast jak go wygenerować.&lt;br /&gt;O tak (w jednej linijce):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;aspell --lang pl dump master | aspell --lang pl expand | tr ' ' '\n' &amp;gt; polish.dic&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Czyli wchodzę sobie do mojego Linuxa i w terminalu wpisuje powyższą linijkę, czekam chwiluśkę i mam słownik! Nie obywa się oczywiście bez schodów (w Linuxie nic nie obywa się bez schodów) bo system mi pisze, że w katalogu \usr\lib\cos_tam\aspell nie ma żadnego pliku o nazwie pl. W Ubuntu wchodzę sobie w instalator pakietów i doinstalowuję pakiet o wdzięcznie brzmiącej nazwie &lt;i&gt;aspell-pl&lt;/i&gt;. Od tej chwili czary już działają. Aby dokończyć dzieła wchodzę do Idei i w &lt;i&gt;Settings&lt;/i&gt; wybieram opcję &lt;i&gt;spelling&lt;/i&gt;, a tam dodaję katalog, w którym znajduje się wygenerowany plik polish.dic. Idea sama już wszystko dorozumie :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7027035005629937676?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7027035005629937676/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/08/polski-sownik-do-intellij-idea.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7027035005629937676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7027035005629937676'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/08/polski-sownik-do-intellij-idea.html' title='Polski słownik do Intellij Idea'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7689448363145897152</id><published>2011-06-28T17:06:00.001+02:00</published><updated>2011-06-28T17:08:37.601+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><title type='text'>Zmiana położenia profilu i dokumentów w Windows 7</title><content type='html'>Pierwszą rzeczą, którą robię po instalacji Windows 7 to zmiana położenia profilu dla użytkowników. Dlaczego wszystkie moje dane mają leżeć na partycji, która może być szybko przeinstalowywana? Dziwne, że Microshit nie wpadł na taki pomysł! Można by to zrealizować podczas instalacji Windows, w przypadku gdy jest więcej niż jedna partycja... Ale może nie bardzo to takie dziwne w porównaniu z ich innymi wybrykami.&lt;br /&gt;Co by nie gadał przenieść profile trzeba. Używam takich sztuczek:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Zabezpieczam rejestr. I żeby mi nikt nie pisał, że nie ostrzegałem... &lt;/li&gt;&lt;li&gt;Kopiuję cały folder C:\Users na inny dysk. Dla skupienia uwagi przyjmijmy, że to będzie dysk D:. Jako ciekawostkę podaję, że ten folder widać w systemie jako C:\Użytkownicy i z taką nazwą przekopiuje się na D:. Uwaga! W folderze tym są ukryte pliki i foldery! Należałoby więc wejść do Eksploratora Windows, z menu wybrać Narzędzia -&amp;gt; Opcje Folderów -&amp;gt; Widok -&amp;gt; Pokaż ukryte pliki, foldery i dyski. Dopiero wtedy przekopiuje się OK.&lt;/li&gt;&lt;li&gt;Otwieram edytor rejestru (regedit) i wchodzę w drzewko &lt;b&gt;&lt;i&gt;HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CurrentVersion\ProfileList&lt;/i&gt;&lt;/b&gt; &lt;/li&gt;&lt;li&gt;Zmieniam tam 3 (słownie trzy) wartości. Czyli &lt;b&gt;&lt;i&gt;Default, Public, Profile Directory&lt;/i&gt;&lt;/b&gt; &lt;/li&gt;&lt;li&gt;No i przelogowuję się. Można już zakładać nowego użytkownika, który pokaże się w nowej lokalizacji na innej partycji.&lt;/li&gt;&lt;/ol&gt;Tak to mogłoby wyglądać przed zmianą:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BAlNalS_6js/Tgntd5nqv4I/AAAAAAAAAVI/yER4R_nVLlc/s1600/reg_before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-BAlNalS_6js/Tgntd5nqv4I/AAAAAAAAAVI/yER4R_nVLlc/s1600/reg_before.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A tak po zmianie:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-AnOoTkkMDBc/TgntqUJgRgI/AAAAAAAAAVM/dgDJdK6Pseg/s1600/reg_after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-AnOoTkkMDBc/TgntqUJgRgI/AAAAAAAAAVM/dgDJdK6Pseg/s1600/reg_after.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Rzecz całą wyczytałem na: &lt;a href="http://www.windows7hacker.com/index.php/2009/05/how-to-change-user-profile-default-location-in-windows-7/"&gt;http://www.windows7hacker.com/index.php/2009/05/how-to-change-user-profile-default-location-in-windows-7/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7689448363145897152?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7689448363145897152/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/06/zmiana-poozenia-profilu-i-dokumentow-w.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7689448363145897152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7689448363145897152'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/06/zmiana-poozenia-profilu-i-dokumentow-w.html' title='Zmiana położenia profilu i dokumentów w Windows 7'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-BAlNalS_6js/Tgntd5nqv4I/AAAAAAAAAVI/yER4R_nVLlc/s72-c/reg_before.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-8075200702012849795</id><published>2011-05-30T13:37:00.000+02:00</published><updated>2011-05-30T13:37:38.916+02:00</updated><title type='text'>Program do prostych screencastów</title><content type='html'>Nie potrzeba nic instalować. Usługa już z hostingiem. Dla prostych, szybkich screencastów dla klienta wymarzony:&lt;br /&gt;&lt;a href="http://www.screenr.com/"&gt;http://www.screenr.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-8075200702012849795?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/8075200702012849795/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/program-do-prostych-screencastow.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8075200702012849795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8075200702012849795'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/program-do-prostych-screencastow.html' title='Program do prostych screencastów'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2054627810889801112</id><published>2011-05-29T06:19:00.000+02:00</published><updated>2011-05-29T06:19:38.120+02:00</updated><title type='text'>Góra tutoriali dla webdesignerów</title><content type='html'>Tutoriale, tutoriale, tutriale...&lt;br /&gt;Niektóre całkiem ciekawe:&lt;br /&gt;&lt;a href="http://www.tutorialshock.com/"&gt;http://www.tutorialshock.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2054627810889801112?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2054627810889801112/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/gora-tutoriali-dla-webdesignerow.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2054627810889801112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2054627810889801112'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/gora-tutoriali-dla-webdesignerow.html' title='Góra tutoriali dla webdesignerów'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-632534096081478154</id><published>2011-05-29T06:04:00.000+02:00</published><updated>2011-05-29T06:04:34.059+02:00</updated><title type='text'>Zawodowy button maker, czyli jak wizualnie tworzyć przyciski na stronę</title><content type='html'>Dla mnie bomba:&lt;br /&gt;&lt;a href="http://css-tricks.com/examples/ButtonMaker/"&gt;http://css-tricks.com/examples/ButtonMaker/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-632534096081478154?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/632534096081478154/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/zawodowy-button-maker-czyli-jak.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/632534096081478154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/632534096081478154'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/zawodowy-button-maker-czyli-jak.html' title='Zawodowy button maker, czyli jak wizualnie tworzyć przyciski na stronę'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-192254646095470960</id><published>2011-05-10T16:01:00.001+02:00</published><updated>2011-05-10T16:02:40.598+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>System do próbowania html/css/javascript</title><content type='html'>Na dodatek wspierający frameworki Mootools, jQuery, Prototype, YUI, Dojo, ExtJS i kilka innych.&lt;br /&gt;Wskocz na &lt;a href="http://jsfiddle.net/"&gt;http://jsfiddle.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Piszesz po prostu kod html okraszasz go css'em i uaktywniasz Javascriptem w dowolnej konfiguracji. Efekt po naciśnięciu klawisza "&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Run&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F05%2Fsystem-do-probowania-htmlcssjavascript.html&amp;amp;send=true&amp;amp;layout=standard&amp;amp;width=450&amp;amp;show_faces=true&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-192254646095470960?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/192254646095470960/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/system-do-probowania-htmlcssjavascript.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/192254646095470960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/192254646095470960'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/system-do-probowania-htmlcssjavascript.html' title='System do próbowania html/css/javascript'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7235729258400945608</id><published>2011-05-10T15:41:00.001+02:00</published><updated>2011-05-10T15:44:14.234+02:00</updated><title type='text'>Sposób na ukrycie swojego emaila na stronie</title><content type='html'>Wejdź na stronkę:&lt;br /&gt;&lt;a href="http://www.vincentcheung.ca/jsencryption/"&gt;http://www.vincentcheung.ca/jsencryption/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;W żółtym polu "&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Key&lt;/span&gt;" wpisz dowolny klucz. Na przykład taki jak adres tej strony:&amp;nbsp; "http://pomoceprogramisty.blogspot.com/"&lt;br /&gt;W polu zielonym zapisz swój email i naciśnij przycisk "&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Encrypt&lt;/span&gt;". W polu czerwonym "&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Clipher text&lt;/span&gt;" zobaczysz wygenerowany klucz.&lt;br /&gt;W niebieskim polu "&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;HTML Code&lt;/span&gt;" otrzymasz kod do wklejenia na swoją stronę.&lt;br /&gt;Każdy, kto będzie chciał zobaczyć twój email będzie musiał podać klucz, który w naszym przypadku jest adresem tej strony.&lt;br /&gt;&lt;br /&gt;Roboty zbierające emaile się nabiedzą :-)&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F05%2Fsposob-na-ukrycie-swojego-emaila-na.html&amp;amp;send=true&amp;amp;layout=standard&amp;amp;width=450&amp;amp;show_faces=true&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7235729258400945608?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7235729258400945608/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/sposob-na-ukrycie-swojego-emaila-na.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7235729258400945608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7235729258400945608'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/sposob-na-ukrycie-swojego-emaila-na.html' title='Sposób na ukrycie swojego emaila na stronie'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2108011466009114315</id><published>2011-05-09T13:39:00.005+02:00</published><updated>2011-05-09T14:09:40.841+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Prototype'/><title type='text'>Pozycja myszy w JavaScript i dynamiczne ustawianie pojemnika</title><content type='html'>Czasami zachodzi potrzeba aby pojemnik z wygenerowaną zawartością (na przykład Ajaxową) pojawił się w okolicach kursora myszy. Można to wykonać na różny sposób, ale że dużo piszę &lt;a href="http://rubyonrails.pl/"&gt;Ruby on Rails&lt;/a&gt;, które używa biblioteki &lt;a href="http://prototypejs.org/"&gt;Prototype&lt;/a&gt;, to opiszę na tej właśnie drodze.&lt;br /&gt;Aby zapoznać się z działaniem mechanizmów można wypróbować ten kod:&lt;br /&gt;&lt;pre class="brush:js;html-script:true"&gt;&amp;lt;script type="text/javascript" &amp;gt;&lt;br /&gt;  function getcords(e){&lt;br /&gt;    mouseX = Event.pointerX(e);&lt;br /&gt;    mouseY = Event.pointerY(e);&lt;br /&gt;    //dla celów testowych&lt;br /&gt;    $('debug').innerHTML = 'mouseX:' + mouseX + '-- mouseY:' + mouseY;&lt;br /&gt;  }&lt;br /&gt;  Event.observe(document, 'mousemove', getcords);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;div id="debug"&amp;gt;&lt;br /&gt;  tu za chwilę pojawią się koordynaty kursora myszy&lt;br /&gt;&amp;lt;/div&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Kluczowym jest tu obserwator (albo donosiciel) zdarzeń &lt;a href="http://www.prototypejs.org/api/event/observe"&gt;Event.observe&lt;/a&gt;, który w tym przypadku obserwuje cały dokument i śledząc położenie myszy "donosi" do kontenera &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;div id="debug"&amp;gt;&lt;/span&gt;.&lt;br /&gt;Jak wcześniej wspomniałem, opisuję to jedynie aby pokazać mechanizm. Nam chodzi o coś innego.&lt;br /&gt;Potrzeba była taka: po prawej stronie ekranu jest lista pytań skróconych &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$('question_list')&lt;/span&gt;. Zajmuje ona całą wysokość ekranu. Klikniesz sobie na pytanie skrócone, a Rails przeszuka bazę i dostarczy pełną treść pytania. Treść tę umieści w kontenerze &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$('question_long')&lt;/span&gt;. Kontener ten wisi sobie spokojnie w jednym miejscu strony, a nam chodziło o to, aby pokazywał się na wysokości klikniętego pytanka na liście, i aby wszystko było pod ręką i przed oczami.&lt;br /&gt;No to trzask:&lt;br /&gt;&lt;pre class="brush:js;html-script:true"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;nbsp; function getcords(e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseY = Event.pointerY(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $('question_long').setStyle('top: ' + mouseY + 'px;');&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; Event.observe($('question_list'), 'click', getcords);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;czary mary i działa!&lt;br /&gt;&lt;br /&gt;Krótki opis:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linijka 4:&lt;/b&gt;&lt;br /&gt;&lt;a href="http://api.prototypejs.org/dom/Element/prototype/setStyle/"&gt;Element.setStyle&lt;/a&gt; nadaje styl CSS wybranemu elementowi na stronie. W naszym przypadku kontenerowi z wygenerowaną pełną treścią pytania. Ustawiamy mu pozycję patrząc od góry strony. Uwaga nie zapomnij mu nadać odpowiedniego pozycjonowania:&lt;br /&gt;&lt;pre class="brush: css"&gt;#question_long {&lt;br /&gt;&amp;nbsp; position: fixed;&lt;br /&gt;&amp;nbsp; right: 200px;&lt;br /&gt;&amp;nbsp; width: 300px;&lt;br /&gt;&amp;nbsp; /* tra ta ta, kolory, zaokrąglenia rogów itp. */&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Linijka 6:&lt;/b&gt;&lt;br /&gt;Obserwujemy teraz nie cały dokument, a jedynie listę z pytaniami skróconymi. Nie interesują nas też oczywiście wszystkie ruchy myszy w zakresie tej listy, ale konkretne kliknięcia.&lt;br /&gt;&lt;br /&gt;Oczywiście można to wszystko zrobić bez &lt;a href="http://prototypejs.org/"&gt;Prototype&lt;/a&gt;, ale skoro już jest... to dlaczego nie użyć?&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F05%2Fpozycja-myszy-w-javascript-i-dynamiczne.html&amp;amp;send=true&amp;amp;layout=standard&amp;amp;width=450&amp;amp;show_faces=true&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2108011466009114315?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2108011466009114315/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/pozycja-myszy-w-javascript-i-dynamiczne.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2108011466009114315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2108011466009114315'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/05/pozycja-myszy-w-javascript-i-dynamiczne.html' title='Pozycja myszy w JavaScript i dynamiczne ustawianie pojemnika'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4879811515675471070</id><published>2011-04-28T14:14:00.010+02:00</published><updated>2011-12-18T13:29:25.290+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Prosta konfiguracja autocomplete w Ruby on Rails</title><content type='html'>Znowu walczyłem z autocomplete w Rails. Walczyłem, bo inaczej tego nie można określić.&lt;br /&gt;&lt;br /&gt;Twórcą tego pluginu jest osobnik o swojsko brzmiącym nicku &lt;a href="https://github.com/dhh"&gt;dhh&lt;/a&gt;. Na &lt;a href="https://github.com/rails/auto_complete"&gt;stronie poświęconej temu pluginowi&lt;/a&gt; można nawet (sic!) natknąć się na przykład jego wykorzystania. Przeglądając tę stronkę trudno coś o niej powiedzieć innego niż "łomatulu!". Wyjaśniać to ona niczego nie wyjaśnia, a tylko denerwuje niedziałającymi linkami scriptacoulosa.&lt;br /&gt;&lt;br /&gt;Aby zainstalować z konsoli zawołaj:&lt;br /&gt;&lt;pre&gt;ruby script/plugin install auto_complete&lt;br /&gt;&lt;/pre&gt;oczywiście zazwyczaj nie działa :-(&lt;br /&gt;Można więc ręcznie. Ściągnij zatem plugin i rozpakuj do&lt;br /&gt;&lt;pre&gt;/vendor/plugins/auto_complete&lt;br /&gt;&lt;/pre&gt;zazwyczaj pomaga.&lt;br /&gt;&lt;br /&gt;Aby rozwikłać pozostałe zawiłości złapałem się po raz kolejny za google i gugłam. Czytam, czytam... i nadziwić się nie mogę. Zerknij tylko (albo raczej nie zerkaj) na &lt;a href="http://railsforum.com/viewtopic.php?id=23188"&gt;railsforum&lt;/a&gt;, albo nawet na &lt;a href="http://railscasts.com/episodes/102-auto-complete-association"&gt;railscasts&lt;/a&gt;. To jakaś masakra jest!&lt;br /&gt;&lt;br /&gt;Chodziło mi o prostą rzecz. Chciałem sam zapanować nad zapytaniem do bazy i nad tym co ona zwróci do użytkownika.&lt;br /&gt;Najbardziej zdziwił mnie fakt, że to poniżej działa!!!&lt;br /&gt;&lt;pre class="brush: ruby"&gt;class CustomersController &amp;lt; ApplicationController&lt;br /&gt;  auto_complete_for :customer, :name, :conditions =&amp;gt; ["gender = ?", "female"]&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;&lt;/pre&gt;Zadziałało! Uradowany, nigdzie tego nie wyczytałem, tylko wykombinowałem "na macanta".&amp;nbsp; Fajno jest. I tak zostało na jakiś czas.&lt;br /&gt;Gdy w następnym miejscu aplikacji znów musiałem czegoś podobnego użyć, miałem prawie gotowe rozwiązanie:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;class ProductsController &amp;lt; ApplicationController&lt;br /&gt;  # Nie stosuj tego, to nie działa!&lt;br /&gt;  auto_complete_for :product, :name, :conditions =&amp;gt; ["group_id = ?", @group_id]&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;&lt;/pre&gt;ale to nie działa. Zmienna egzemplarza pojawia się za wcześnie. Trick z tą zmienną &lt;i&gt;@group_id&lt;/i&gt; odpowiadał mi, więc nie chciałem stosować trzymania się prawą ręką za lewe ucho i zacząłem drążyć temat. Po jakimś czasie okazało się, że notacja:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;auto_complete_for :product, :name, :conditions =&amp;gt; ["group_id = ?", @group_id]&lt;/pre&gt;tworzy dynamicznie metodę:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;def auto_complete_for_product_name&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;def&lt;br /&gt;&lt;/pre&gt;Co wiec stało na przeszkodzie aby taka metodę samemu napisać? Nic, więc napisałem:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;def auto_complete_for_product_name&lt;br /&gt;  product_name=params[:product][:name]&lt;br /&gt;  conditions=["name = ? AND group_id = ?", product_name, @group_id]&lt;br /&gt;  @products=Product.all(:conditions =&amp;gt; conditions)&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;Sprawdzam... prawie działa.&lt;br /&gt;Prawie bo Rails krzyczy, że brak mu pliku widoku &lt;i&gt;auto_complete_for_product_name.erb&lt;/i&gt;&lt;br /&gt;Znów "na macanta" poleciałem. Utworzyłem plik widoku i... zadziałało:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&amp;lt;ul&amp;gt;&amp;nbsp;&lt;br /&gt;  &amp;lt;% @products.each do |product| %&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;&amp;lt;%= h product.name %&amp;gt;&amp;lt;/li&amp;gt;&amp;nbsp;&lt;br /&gt;  &amp;lt;% end %&amp;gt;&amp;nbsp;&lt;br /&gt;&amp;lt;/ul&amp;gt; &lt;br /&gt;&lt;/pre&gt;Rozwiązanie proste, łatwe i przyjemne.&lt;br /&gt;W kontrolerze panuje się nad każdym przejawem tworzonej listy. Można zrobić dosłownie wszystko czego się tylko zapragnie. Nie trzeba z niczym kombinować jak to pokazywali w sreencaście i proponowali na liście. Moje rozwiązanie jest całkowicie naturalne i w duchu Rails.&lt;br /&gt;&lt;br /&gt;Pozostała jeszcze sprawa pozostałych opcji.&lt;br /&gt;Opcje są, a jakże. Żywcem je tu przytaczam:&lt;br /&gt;# Required +options+ are:&lt;br /&gt;# &lt;tt&gt;:url&lt;/tt&gt;::                  URL to call for autocompletion results&lt;br /&gt;#                                  in url_for format.&lt;br /&gt;# &lt;br /&gt;# Addtional +options+ are:&lt;br /&gt;# &lt;tt&gt;:update&lt;/tt&gt;::               Specifies the DOM ID of the element whose &lt;br /&gt;#                                  innerHTML should be updated with the autocomplete&lt;br /&gt;#                                  entries returned by the AJAX request. &lt;br /&gt;#                                  Defaults to &lt;tt&gt;field_id&lt;/tt&gt; + '_auto_complete'&lt;br /&gt;# &lt;tt&gt;:with&lt;/tt&gt;::                 A JavaScript expression specifying the&lt;br /&gt;#                                  parameters for the XMLHttpRequest. This defaults&lt;br /&gt;#                                  to 'fieldname=value'.&lt;br /&gt;# &lt;tt&gt;:frequency&lt;/tt&gt;::            Determines the time to wait after the last keystroke&lt;br /&gt;#                                  for the AJAX request to be initiated.&lt;br /&gt;# &lt;tt&gt;:indicator&lt;/tt&gt;::            Specifies the DOM ID of an element which will be&lt;br /&gt;#                                  displayed while autocomplete is running.&lt;br /&gt;# &lt;tt&gt;:tokens&lt;/tt&gt;::               A string or an array of strings containing&lt;br /&gt;#                                  separator tokens for tokenized incremental &lt;br /&gt;#                                  autocompletion. Example: &lt;tt&gt;:tokens =&gt; ','&lt;/tt&gt; would&lt;br /&gt;#                                  allow multiple autocompletion entries, separated&lt;br /&gt;#                                  by commas.&lt;br /&gt;# &lt;tt&gt;:min_chars&lt;/tt&gt;::            The minimum number of characters that should be&lt;br /&gt;#                                  in the input field before an Ajax call is made&lt;br /&gt;#                                  to the server.&lt;br /&gt;# &lt;tt&gt;:on_hide&lt;/tt&gt;::              A Javascript expression that is called when the&lt;br /&gt;#                                  autocompletion div is hidden. The expression&lt;br /&gt;#                                  should take two variables: element and update.&lt;br /&gt;#                                  Element is a DOM element for the field, update&lt;br /&gt;#                                  is a DOM element for the div from which the&lt;br /&gt;#                                  innerHTML is replaced.&lt;br /&gt;# &lt;tt&gt;:on_show&lt;/tt&gt;::              Like on_hide, only now the expression is called&lt;br /&gt;#                                  then the div is shown.&lt;br /&gt;# &lt;tt&gt;:after_update_element&lt;/tt&gt;:: A Javascript expression that is called when the&lt;br /&gt;#                                  user has selected one of the proposed values. &lt;br /&gt;#                                  The expression should take two variables: element and value.&lt;br /&gt;#                                  Element is a DOM element for the field, value&lt;br /&gt;#                                  is the value selected by the user.&lt;br /&gt;# &lt;tt&gt;:select&lt;/tt&gt;::               Pick the class of the element from which the value for &lt;br /&gt;#                                  insertion should be extracted. If this is not specified,&lt;br /&gt;#                                  the entire element is used.&lt;br /&gt;# &lt;tt&gt;:method&lt;/tt&gt;::               Specifies the HTTP verb to use when the autocompletion&lt;br /&gt;#                                  request is made. Defaults to POST.&lt;br /&gt;&lt;br /&gt;Ogólna notacja kontrolki w widoku jest taka:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;.&lt;br /&gt;&lt;%= text_field_with_auto_complete(object, method, tag_options = {}, completion_options = {})  %&gt;&lt;br /&gt;.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Aby na przykład zacząć wyszukiwanie od wpisanych trzech liter kontrolkę skomponuj tak:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;.&lt;br /&gt;&lt;%= text_field_with_auto_complete :employee, :name, {}, {:min_chars =&gt; 3} %&gt;&lt;br /&gt;.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Fprosta-konfiguracja-autocomplete-w-ruby.html&amp;amp;send=true&amp;amp;layout=standard&amp;amp;width=450&amp;amp;show_faces=true&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4879811515675471070?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4879811515675471070/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/prosta-konfiguracja-autocomplete-w-ruby.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4879811515675471070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4879811515675471070'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/prosta-konfiguracja-autocomplete-w-ruby.html' title='Prosta konfiguracja autocomplete w Ruby on Rails'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-8010386150204933986</id><published>2011-04-26T22:03:00.001+02:00</published><updated>2011-04-26T22:04:15.802+02:00</updated><title type='text'>Screencasty o Vim'ie</title><content type='html'>Wybaczcie, że nie będę oryginalny ale dzięki &lt;a href="http://edwinpiekart.blip.pl/"&gt;blipowi&lt;/a&gt; niezauważenie zacząłem oglądać arcyciekawe (dla mnie oczywiście) screencasty o vim'ie.&lt;br /&gt;Dostępne to to jest pod adresem: &lt;a href="http://vimcasts.org/"&gt;http://vimcasts.org&lt;/a&gt; i cieszy, że jest taka rzesza entuzjastów.&lt;br /&gt;Nie będę ukrywał, że piszący te słowa z chęcią do tych entuzjastów się przyznaje :-).&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Fscreencasty-o-vimie.html&amp;amp;send=true&amp;amp;layout=standard&amp;amp;width=450&amp;amp;show_faces=true&amp;amp;action=like&amp;amp;colorscheme=light&amp;amp;font&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-8010386150204933986?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/8010386150204933986/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/screencasty-o-vimie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8010386150204933986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8010386150204933986'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/screencasty-o-vimie.html' title='Screencasty o Vim&apos;ie'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-1841640602435518555</id><published>2011-04-22T11:01:00.029+02:00</published><updated>2011-05-03T08:56:44.135+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>count vs length vs size w Rails</title><content type='html'>W Ruby zarówno #length jak i #size to synonimy podawania wielkości tablicy bądź tablicy asocjacyjnej.&lt;br /&gt;W Railsowym ActiveRecord wygląda na to, że są trzy drogi podawania wielkości asocjacji:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;firm.customers.count - wykonuje standardowe zapytanie SQL COUNT. Co ciekawe można podawać warunki podzbioru. Na przykład :conditions =&amp;gt; {:customer_name = "Nowak"}. Jeśli nastąpiło wcześniejsze zapytanie SQL COUNT, wtedy #count pokaże zawartość cache, jeśli nie, wykona nowe zapytanie.&lt;/li&gt;&lt;li&gt;firm.customers.length - zawsze ładuje całą asocjację do pamięci, potem ją zlicza i podaje wielkość. Ważne jest, że ta metoda nie wymusza zapytania, jeśli zawartość asocjacji była już pobierana.&lt;/li&gt;&lt;li&gt;firm.customers.size - ta metoda działa w przybliżeniu jako kombinacja dwóch powyższych. Jeśli acocjacja była już pobierana podaje po prostu jej wielkość i tyle. Jeśli nie była pobierana, to wykonuje #count z punktu 1.&lt;/li&gt;&lt;/ol&gt;Piszę o tym, bo czasami można się naciąć jeśli oczekuje się bardzo szybkiej operacji, a trwa ona zdecydowanie dłużej niż spodziewana. No i to cachowanie...&lt;br /&gt;Więc właśnie. Dwa słowa odnośnie cachowania. Rozważmy następujące przypadki:&lt;br /&gt;Przypadek 1:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;@firm = Firm.find(params[:id]) &lt;br /&gt;@amount_customers_in_firm = @firm.customers.size &lt;br /&gt;#tu nastąpi zapytanie do bazy&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Przypadek 2:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;@firm = Firm.find(params[:id])&lt;br /&gt;@customers = @firm.customers &lt;br /&gt;@amount_customers_in_firm = @firm.customers.size &lt;br /&gt;#tu zwrócona zostanie ilość rekordów pobrana z cache&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Przypadek 3:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;@firm = Firm.find(params[:id])&lt;br /&gt;@customers = @firm.customers &lt;br /&gt;. # tu&lt;br /&gt;. # jakieś&lt;br /&gt;. # gęste&lt;br /&gt;. # operacje&lt;br /&gt;. # na rekordach&lt;br /&gt;@amount_customers_in_firm = @firm.customers(true).size &lt;br /&gt;#tu wymuszam ponowne zapytanie do bazy z pominięciem cache&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Więcej na temat cachowania  asocjacji w &lt;a href="http://apohllo.pl/guides/association_basics.html#kontrolowanie-cachingu"&gt;Rails guides&lt;/a&gt;.&lt;br /&gt;Zaś ogólnie o cachowaniu zawodowy artukuł z &lt;a href="http://thewebfellas.com/blog/2008/6/9/rails-2-1-now-with-better-integrated-caching"&gt;thewebfellas&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Fcount-vs-length-vs-size-w-rails.html&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=80" style="border: medium none; height: 80px; overflow: hidden; width: 450px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-1841640602435518555?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/1841640602435518555/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/count-vs-length-vs-size-w-rails.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/1841640602435518555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/1841640602435518555'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/count-vs-length-vs-size-w-rails.html' title='count vs length vs size w Rails'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-6245208895186654207</id><published>2011-04-13T08:25:00.008+02:00</published><updated>2011-04-29T10:34:00.482+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Zainicjowanie danymi zdalnego repozytorium w Git</title><content type='html'>Czasami, choć rzadko, musimy zainicjować danymi zdalne repozytorium. Jak zdążyłem się zorientować czytając artykuły o Git'cie, są one pisane dla szeregowego programisty, którego jedynym marzeniem jest podłączenie się do istniejącego projektu, ściągnięcie kodu i włożenie do niego własnych trzech groszy. A co z tymi, którzy zakładają projekty? A co z tymi, którzy te projekty inicjują dla szeregowych programistów. Tu już nie jest tak różowo...&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Właśnie dlatego, że robi się to tak rzadko (bo ileż można otworzyć projektów w ciągu roku?), łatwo zapomnieć procedurę. Potem znowu żmudne poszukiwania w sieci... a taki samouczek trudno znaleźć :-) &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Krok 1&lt;/h4&gt;Utwórz na serwerze świeże repozytorium, udostępnij aby było widziane z zewnątrz, nadaj mu adres i utwórzy użytkownika z pełnymi prawami. Jak to zrobić? Mam to w nosie, bo u naszego &lt;a href="http://vipserv.org/p/1311849268"&gt;dostawcy hostingowego&lt;/a&gt; robi to opcja w menu.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Krok 2&lt;/h4&gt;Zakładam, że na swoim lokalnym komputerze (a może laptopie?) masz już folder ze zrębami aplikacji do rozwijania. Przejdź do tego folderu i zainicjuj repozytorium:&lt;br /&gt;&lt;pre&gt;&amp;gt; git init&lt;br /&gt;&lt;/pre&gt;Repozytorium utworzone, ale wciąż puste. &lt;b&gt;Nie spiesz się z commitem!&lt;/b&gt; Jak go zrobisz teraz, to narobisz sobie zbędnej pracy. A po co?&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Krok 3&lt;/h4&gt;Utwórz plik .gitignore zanim dokonasz inicjalny commit. U mnie zazwyczaj odbywa się to tak:&lt;br /&gt;&lt;pre&gt;&amp;gt; vim .gitignore&lt;br /&gt;tmp/*&lt;br /&gt;log/*&lt;br /&gt;*.iml&lt;br /&gt;*.ipr&lt;br /&gt;*.iws&lt;br /&gt;&lt;/pre&gt;Oczywiście umieść tam własne wpisy wszystkich folderów niepotrzebnych w procesie tworzenia kodu.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Krok 4&lt;/h4&gt;Teraz czas na inicjalny commit:&lt;br /&gt;&lt;pre&gt;&amp;gt; git add . &lt;/pre&gt;kropka na końcu jest ważna!&lt;br /&gt;&lt;pre&gt;&amp;gt; git commit -a -m 'initial commit'&lt;br /&gt;&lt;/pre&gt;Lokalnie już prawie wszystko masz, no może oprócz "remote"&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Krok 5&lt;/h4&gt;Wpisujesz&lt;br /&gt;&lt;pre&gt;&amp;gt; git remote&lt;br /&gt;&lt;/pre&gt;i co widzisz? Nic! Nic, bo system lokalny nie wie nic o naszym serwerze. Czas go o tym poinformować:&lt;br /&gt;&lt;pre&gt;&amp;gt; git remote add origin ssh://uzytkownik@serwer_hostingowy.pl/&lt;br /&gt;&lt;/pre&gt;pamiętaj o kończącym slashu "/". Teraz po komendzie&lt;br /&gt;&lt;pre&gt;&amp;gt; git remote&lt;br /&gt;&lt;/pre&gt;zobaczysz nasz "origin"&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Krok 6&lt;/h4&gt;To już prawie wszystko, bo zostało jedynie wypchnąć kod na serwer:&lt;br /&gt;&lt;pre&gt;&amp;gt; git push origin master&lt;br /&gt;&lt;/pre&gt;Podajesz hasło do użytkownika na serwerze i kod leeeeci..., aż doleciał. Zakładasz swoim ludziom użytkowników do repozytorium na serwerze, rozsyłasz im dane do tych kont i delektujesz się bezproblemowym rozwojem aplikacji. Czego oczywiście Ci życzę, absolutnie nie wierząc w te brednie, które piszę :-)&lt;br /&gt;Bo czy istnieje idealny świat z "bezproblemowym rozwojem aplikacji"?&lt;br /&gt;&lt;br /&gt;Udało się. Zdalne repozytorium działa. Ja zazwyczaj jeszcze dodaję projekt do naszej instancji &lt;a href="http://www.redmine.org/"&gt;Redmine&lt;/a&gt;. Dzięki niej wszyscy wiedzą jaki jest plan rozwoju aplikacji, bugi do naprawienia, kalendarz wydarzeń itp. itd.&lt;br /&gt;&lt;br /&gt;Powodzenia z tym okropnym Git'em!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Fzainicjowanie-danymi-zdalnego.html&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-6245208895186654207?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/6245208895186654207/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/zainicjowanie-danymi-zdalnego.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6245208895186654207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6245208895186654207'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/zainicjowanie-danymi-zdalnego.html' title='Zainicjowanie danymi zdalnego repozytorium w Git'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-6129701516837415754</id><published>2011-04-10T14:19:00.001+02:00</published><updated>2011-04-10T14:22:27.828+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Krótkie screencasty o systemie kontroli wersji - Git</title><content type='html'>Okazało się, że coś takiego jest:&lt;br /&gt;&lt;a href="http://gitcasts.com/"&gt;http://gitcasts.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nawet miło i zrozumiale zrobione. Fajnym akcentem jest to, że na koniec każdego z filmików pokazują się inne w tym temacie. Przydałoby się to na portalu o &lt;a href="http://railscasts.com/"&gt;railscats&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Fkrotkie-screencasty-o-systemie-kontroli.html&amp;amp;layout=button_count&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:21px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-6129701516837415754?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/6129701516837415754/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/krotkie-screencasty-o-systemie-kontroli.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6129701516837415754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6129701516837415754'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/krotkie-screencasty-o-systemie-kontroli.html' title='Krótkie screencasty o systemie kontroli wersji - Git'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-279676368962311239</id><published>2011-04-06T12:04:00.006+02:00</published><updated>2011-07-11T09:56:38.531+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Odcinanie ogonków, czyli zamiana polskich liter w Ruby on Rails</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Napotkałem na problem polegający na tym aby tekst zawierający polskie znaki zamienić na tekst bez polskich znaków. Czyli napis "Łabędź i żółw" ma stać się napisem "Labedz i zolw".&lt;br /&gt;Troszkę poszperałem w sieci, troszkę pokombinowałem i powstał taki kod:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;require 'iconv'&lt;br /&gt;&lt;br /&gt;class String&lt;br /&gt;&amp;nbsp; def to_ascii&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ascii = "acelnoszzACELNOSZZ"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cep = "\271\346\352\263\361\363\234\277\237\245\306\312\243\321\323\214\257\217"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; s = Iconv.new("cp1250", "UTF-8").iconv(self)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.tr!(cep, ascii)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (s.length==0) ? self : s&amp;nbsp;&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Lubię Ruby za to całkowicie bezkonfliktowe i niezwykle proste wzbogacanie standardowych klas.&lt;br /&gt;Na pierwszy rzut oka pada pytanie: po co sprawdzać długość łańcucha &lt;i&gt;s&lt;/i&gt;? Więc to zagadka. Dla wszystkich, którzy zgadną i nadeślą rozwiązanie - nagroda :-)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Jeśli potrzebujesz takiego rozwiązania to wrzuć powyższy listing do pliku na przykład o nazwie &lt;i&gt;str_utl.rb&lt;/i&gt; i umieść w Railsach w katalogu &lt;i&gt;lib&lt;/i&gt;, a do pliku &lt;i&gt;environment.rb&lt;/i&gt; wstaw &lt;i&gt;require 'str_utl'&lt;/i&gt;. U mnie działa to tak:&lt;br /&gt;&lt;pre&gt;&amp;gt;&amp;gt; "Łabędź i żółw".to_ascii&lt;br /&gt;&amp;gt;&amp;gt; "Labedz i zolw"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Fodcinanie-ogonkow-czyli-zamiana.html&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=80" style="border: medium none; height: 80px; overflow: hidden; width: 450px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-279676368962311239?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/279676368962311239/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/odcinanie-ogonkow-czyli-zamiana.html#comment-form' title='Komentarze (4)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/279676368962311239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/279676368962311239'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/odcinanie-ogonkow-czyli-zamiana.html' title='Odcinanie ogonków, czyli zamiana polskich liter w Ruby on Rails'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-450780575888696286</id><published>2011-04-04T11:09:00.002+02:00</published><updated>2011-04-10T14:24:37.779+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Fajna książka o Ruby on Rails v3</title><content type='html'>Wszystko ładnie podane z przykładami, zrzutami ekranów, spisem treści i ładnym layoutem:&lt;br /&gt;&lt;a href="http://ruby.railstutorial.org/ruby-on-rails-tutorial-book#sec:development_tools"&gt;http://ruby.railstutorial.org/ruby-on-rails-tutorial-book#sec:development_tools&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Ffajna-ksiazka-o-ruby-on-rails-v3.html&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-450780575888696286?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/450780575888696286/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/fajna-ksiazka-o-ruby-on-rails-v3.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/450780575888696286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/450780575888696286'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/fajna-ksiazka-o-ruby-on-rails-v3.html' title='Fajna książka o Ruby on Rails v3'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-5658320544449471680</id><published>2011-04-03T12:41:00.002+02:00</published><updated>2011-04-10T14:25:13.029+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Jak w JavaScript przenieść się na inną stronę</title><content type='html'>Ciągle zapominam tę komendę i tę składnię, postanowiłem  więc to sobie zapisać:&lt;br /&gt;&lt;pre class="brush: javascript"&gt;window.location.href = 'http://piszemyprogramy.pl';&lt;/pre&gt;JavaScript napotykając taką frazę przeniesie nas na naszą ulubioną stronę &lt;a href="http://piszemyprogramy.pl/"&gt;http://piszemyprogramy.pl&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Fjak-w-javascript-przeniesc-sie-na-inna.html&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-5658320544449471680?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/5658320544449471680/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/jak-w-javascript-przeniesc-sie-na-inna.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5658320544449471680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5658320544449471680'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/jak-w-javascript-przeniesc-sie-na-inna.html' title='Jak w JavaScript przenieść się na inną stronę'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7688993370502511958</id><published>2011-04-03T06:24:00.002+02:00</published><updated>2011-04-10T14:26:01.711+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Jak zamieścić ikonkę facebooka "Lubię.to" na swojej stronie</title><content type='html'>Wejdź po prostu na:&lt;br /&gt;&lt;a href="http://developers.facebook.com/docs/reference/plugins/like/"&gt;http://developers.facebook.com/docs/reference/plugins/like/&lt;/a&gt;&lt;br /&gt;W pole "URL to Like (?)" wpisz adres swojej strony i kliknij przycisk "Get Code".&lt;br /&gt;Wklej pobrany kod na swojej stronce. Działa.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Fjak-zamiescic-ikonke-facebooka-lubieto.html&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7688993370502511958?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7688993370502511958/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/jak-zamiescic-ikonke-facebooka-lubieto.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7688993370502511958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7688993370502511958'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/jak-zamiescic-ikonke-facebooka-lubieto.html' title='Jak zamieścić ikonkę facebooka &quot;Lubię.to&quot; na swojej stronie'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-3488221825689299517</id><published>2011-04-03T06:05:00.010+02:00</published><updated>2011-04-09T15:13:57.629+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Rails autocomplete - uruchamianie akcji po kliknięciu</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pomiędzy tysiącami dodatków do Ruby on Rails znajduje się kilka, z których korzystamy praktycznie zawsze. Jednym z nich jest "autocomplete". Umożliwia on dynamicznie uzupełnianie zawartości pola tekstowego treścią z bazy danych. Użyteczne, proste w obsłudze i łatwo implementowalne w programie.&lt;br /&gt;Przy czym stwierdzenie "łatwo implementowalne" dałem tak troszkę na wyrost. Pierwsze schody już na samym początku: dokumentacja. Na &lt;a href="https://github.com/rails/auto_complete"&gt;stronie pluginu&lt;/a&gt; otrzymujemy przykład prostej konfiguracji i linki do szczegółowej dokumentacji. Radość? Przedwczesna! Ta prosta konfiguracja opisywana na stronie jest o tyle szybko implementowalna, o ile nigdy nie wystarczająca do Twojego projektu, który akurat piszesz. Natychmiast więc klikasz w linki aby uzyskać szczegóły API, przykłady kodu i inne tego typu, wydawało by się, duperele. Co się okazuje? Linki prowadzą na strony scriptaculous, które nie tylko, że niczego nie rozwiązują, to jeszcze wstydliwie się rozjeżdżają. Jeśli nie wiesz o czym piszę, to kliknij sobie tam na te linki. Wstyd? Mi też się tak wydaje. Nie podaję więc ich tutaj. Podaję zaś link do &lt;a href="http://madrobby.github.com/scriptaculous/"&gt;działającej dokumentacji scriptaculous&lt;/a&gt;. Nie pytaj mnie dlaczego tak jest? Nie wiem. Tysiące programistów pytających się o to samo w sieci też nie wie. Cisną się na usta epitety :-) ale nie z takimi rzeczami dawaliśmy radę :-)&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Oprócz bardziej szczegółowej konfiguracji autocomplete natychmiast szuka się rozwiązania automatycznego jego zadziałania. Bo umówmy się, że autouzupełnianie pola tekstowego, to zazwyczaj jest tylko pretekstem do używania autocomplete jako szybkiej wyszukiwarki. Czyli, na przykład, jeśli wyszukujesz kandydata po nazwisku i imieniu (kandydata, bo w naszym programie do rekrutacji HR mówimy o kandydatach na stanowisko pracy) szukając Kowalskiego Jana, wpisujesz powoli "Kow..." i spodziewasz się, że system podpowie Ci Kowalskiego, Kowalewskiego, Kowalczyka i innych na "Kow...". Z pokazującej się listy klikasz na Kowalskiego i hyc! Przeskakujesz do widoku szczegółowych danych Kowalskiego. Denerwowało by Cię gdybyś kliknąwszy Na Kowalskiego zobaczył jak pole tekstowe wypełnia się jego nazwiskiem i imieniem, a Ty musisz dodatkowo naciskać przycisk "szukaj", który może znajdować się, na przykład, gdzieś daleko na dole formularza.&lt;br /&gt;Szukasz więc rozwiązania tej trywialnej i, co tu dużo mówić, jakże pospolitej potrzeby. I co Cię spotyka? Schody. I to schody całkowicie niezrozumiałe. Przecież to, czego szukasz jest potrzebne praktycznie zawsze! Dlaczego autor pluginu tego nie zamieścił? Potem Ci opadają ręce: autor pluginu niczego nie zamieścił! Dupek skończony nie zamieścił nigdzie dokumentacji do API, przykładów, a dodatkowo wprowadza w błąd podając wstydliwe linki. Chwilkę siędzisz wkurzony (delikatne słowo) z opadniętymi rękami. Potem odpalasz google i próbujesz najróżniejszych fraz zgadując jak inni mogli o to samo zapytać. Potem modlisz się aby wpisana przez Ciebie fraza była właśnie tą, na którą znajdzie się odpowiedź. Potem przekopujesz setki rozwiązań i wciąż nie znika Ci z twarzy wyraz niedowierzania jak inni to implementują...&lt;br /&gt;Bo na przykłąd tak:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&amp;lt;%= text_field_with_auto_complete :candidate, :name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {:onchange =&amp;gt; "#{remote_function(:url&amp;nbsp; =&amp;gt; {:action =&amp;gt; "update_text_fields"},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :with =&amp;gt; "'surname='+value")}", :size =&amp;gt; 18},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {:min_chars =&amp;gt; 3, :skip_style =&amp;gt; true} %&amp;gt;&lt;br /&gt;&lt;/pre&gt;a później gdzieś w kontrolerze:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;def update_text_fields&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; # implementacja&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;end &lt;br /&gt;&lt;/pre&gt;Prawie działa, tylko że przechwytuje to, co użytkownik wpisał, a nie tę znalezioną już wartość.&lt;br /&gt;To może tak:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&amp;lt;%= text_field_with_auto_complete :candidate, :name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {:size =&amp;gt; 18},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {:after_update_element =&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "function(element,value){" + remote_function(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :url =&amp;gt; {:action =&amp;gt; :update_text_fields},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :with =&amp;gt;"'surname='+element.value") + "}",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :skip_style =&amp;gt; true, :method =&amp;gt; :get} %&amp;gt;&lt;br /&gt;&lt;/pre&gt;To działa, ale ma zastosowanie tylko do tego, aby funkcja "&lt;i&gt;update_text_fields&lt;/i&gt;" mogła Ajaxem dynamicznie wypełnić jakąś zawartość na stronie bez przeładowania. Uwaga! W powyższym przykładzie &lt;b&gt;nie jest zaimplementowana ta funkcjonalność&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aż w końcu, zamiast dalej szukać, zaimplementuj &lt;b&gt;to proste i łatwe rozwiązanie&lt;/b&gt;:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&amp;lt;%= text_field_with_auto_complete :candidate, :name,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {:size =&amp;gt; 18},&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {:after_update_element =&amp;gt; "candidateNameSearch"} %&amp;gt;&lt;br /&gt;&lt;/pre&gt;Gdzie "{:size =&amp;gt; 18}" ustawia wielkość pola.&lt;br /&gt;Dodajesz jeszcze tylko króciutką funkcję JavaScript:&lt;br /&gt;&lt;pre class="brush: javascript"&gt;function candidateNameSearch(element, value) {&lt;br /&gt;  window.location.href = '/candidates/update_text_fields?surname='+element.value;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;I wszystko! Działa. Praktyczne, szybkie, łatwe, zdrowe.&lt;br /&gt;Miłej zabawy.&lt;br /&gt;&lt;br /&gt;&lt;iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fpomoceprogramisty.blogspot.com%2F2011%2F04%2Frails-autocomplete-uruchamianie-akcji.html&amp;amp;layout=standard&amp;amp;show_faces=true&amp;amp;width=450&amp;amp;action=like&amp;amp;font&amp;amp;colorscheme=light&amp;amp;height=80" style="border: medium none; height: 80px; overflow: hidden; width: 450px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-3488221825689299517?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/3488221825689299517/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/rails-autocomplete-uruchamianie-akcji.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/3488221825689299517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/3488221825689299517'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/04/rails-autocomplete-uruchamianie-akcji.html' title='Rails autocomplete - uruchamianie akcji po kliknięciu'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-6337702392267128195</id><published>2011-03-31T12:55:00.004+02:00</published><updated>2011-12-18T05:30:24.632+01:00</updated><title type='text'>Stronicowanie w Ruby on Rails - najpopularniejsze opcje</title><content type='html'>Mowa oczywiście o pluginie do Ruby on Rails o nazwie &lt;a href="https://github.com/mislav/will_paginate"&gt;will_paginate&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Aby go zainstalować z konsoli zawołaj:&lt;br /&gt;&lt;pre&gt;gem install will_paginate&lt;br /&gt;&lt;/pre&gt;potem do &lt;br /&gt;&lt;pre&gt;/config/environment.rb&lt;br /&gt;&lt;/pre&gt;wpisz&lt;br /&gt;&lt;pre&gt;config.gem 'will_paginate', :version =&gt; '~&gt; 2.3.15'&lt;br /&gt;&lt;/pre&gt;przy czym uwaga! &lt;i&gt;:version =&gt; '~&gt; 2.3.15'&lt;/i&gt; nie tyczy się wersji rails, tylko wersji tego plugina!&lt;br /&gt;&lt;br /&gt;Opcje wyświetlania:  &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;tt&gt;:previous_label&lt;/tt&gt; — domyślnie: "« Previous", nazwa linka do poprzedniej strony&lt;/li&gt;&lt;li&gt;&lt;tt&gt;:next_label&lt;/tt&gt; — domyślnie: "Next »"  , nazwa linka do następnej strony&lt;/li&gt;&lt;li&gt;&lt;tt&gt;:page_links&lt;/tt&gt; — kiedy jest to false, tylko poprzedni/następny link jest renderowany (domyślnie: true)  &lt;/li&gt;&lt;li&gt;&lt;tt&gt;:inner_window&lt;/tt&gt; — mówi ile linków widnieje przed i za aktualną stroną (domyślnie: 4)  &lt;/li&gt;&lt;li&gt;&lt;tt&gt;:outer_window&lt;/tt&gt; — mówi ile linków widnieje dookoła pierwszej i ostatniej strony (domyślnie: 1) &lt;/li&gt;&lt;li&gt;&lt;tt&gt;:separator&lt;/tt&gt; — string reprezentujący separator oddzielający numerki stron (domyślnie: pojedyncza spacja)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Na przykład:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&amp;lt;%= will_paginate @customers, :previous_label =&amp;gt; "wstecz", :next_label =&amp;gt; "dalej" %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Opcje HTML: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;tt&gt;:class&lt;/tt&gt; — nazwa klasy CSS dla wygenerowanego DIV'a (domyślnie: "pagination")  &lt;/li&gt;&lt;li&gt;&lt;tt&gt;:container&lt;/tt&gt; — przełącza renderowanie dla podanego wcześniej DIV'a. Ustaw na false tylko w przypadku stosowanie własnych rozwiązań (domyślnie: true)&lt;/li&gt;&lt;li&gt;&lt;tt&gt;:id&lt;/tt&gt; — HTML ID dla kontenera z linkami&amp;nbsp; (domyślnie: nil). Ustaw true dla automatycznego rozpoznawania ID z nazwy klasy obiektów kolekcji. Na przykład jeśli stronicujesz model ArticleComment to automatycznie zostanie nadany ID "article_comments_pagination".&amp;nbsp;  &lt;/li&gt;&lt;/ul&gt;Opcje zaawansowane: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;tt&gt;:param_name&lt;/tt&gt; — nazwa parametru zawartego w URL&amp;nbsp; (domyślnie&lt;tt&gt;:page&lt;/tt&gt;)  &lt;/li&gt;&lt;li&gt;&lt;tt&gt;:params&lt;/tt&gt; — dodatkowe parametry przy generowaniu stronicowania (na przykład  &lt;tt&gt;:controller =&amp;gt; "foo", :action =&amp;gt; nil&lt;/tt&gt;)  &lt;/li&gt;&lt;li&gt;&lt;tt&gt;:renderer&lt;/tt&gt; — nazwa klasy, klasa lub instancja klasy dla renderowanych linków (domyślnie: &lt;tt&gt;&lt;a href="http://piszemyprogramy.pl/api_will_paginate/classes/WillPaginate/LinkRenderer.html"&gt;WillPaginate::LinkRenderer&lt;/a&gt;&lt;/tt&gt;)  &lt;/li&gt;&lt;/ul&gt;Wszystkie opcje rozpoznawane przez &lt;a href="http://piszemyprogramy.pl/api_will_paginate/classes/WillPaginate/ViewHelpers.html#M000011"&gt;will_paginate&lt;/a&gt; stają się automatycznie opcjami kontenera DIV. Na przykład: &lt;br /&gt;&lt;pre class="brush: ruby"&gt;&amp;lt;%= will_paginate @posts, :style =&amp;gt; 'font-size: small' %&amp;gt;&lt;/pre&gt;… staje się po renderowaniu: &lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;div class="pagination" style="font-size: small"&amp;gt; ... &amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pełna dokumentacja na naszej stronie poświęconej &lt;a href="http://piszemyprogramy.pl/api_will_paginate"&gt;dokumentacji API will_paginate&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/stronicowanie-w-ruby-on-rails_31.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-6337702392267128195?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/6337702392267128195/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/stronicowanie-w-ruby-on-rails_31.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6337702392267128195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6337702392267128195'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/stronicowanie-w-ruby-on-rails_31.html' title='Stronicowanie w Ruby on Rails - najpopularniejsze opcje'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-5242067335976001533</id><published>2011-03-31T12:13:00.002+02:00</published><updated>2011-03-31T12:14:48.569+02:00</updated><title type='text'>Stronicowanie w Ruby on Rails - dokumentacja do API</title><content type='html'>&lt;p&gt;Skądinąd dobry plugin dla Ruby on Rails do stronicowania o tajemniczej nazwie &lt;a href="https://github.com/mislav/will_paginate" target="_blank"&gt;will_paginate&lt;/a&gt; ma kilka ciekawych możliwości. Niestety o możliwościach tych nie dowiesz się ze strony macierzystej. Większość linków tam nie działa. Nie pytaj dlaczego. Nie wiem. Nie wiedzą również o tym inni internauci. Powstają na grupach nawet wątki z pytaniami do autora o ten fenomen. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Kogo denerwuje brak dokumentacji do API tego pluginu mam dla niego rozwiązanie. Jako, że nas to też wkurzyło przygotowaliśmy dla wszystkich &lt;a href="http://piszemyprogramy.pl/api_will_paginate" target="_blank"&gt;dokumentację API dla will_paginate v. 2.3.15&lt;/a&gt;. Korzystaj :-)&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/stronicowanie-w-ruby-on-rails.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-5242067335976001533?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/5242067335976001533/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/stronicowanie-w-ruby-on-rails.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5242067335976001533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5242067335976001533'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/stronicowanie-w-ruby-on-rails.html' title='Stronicowanie w Ruby on Rails - dokumentacja do API'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-5711757369086302233</id><published>2011-03-27T12:46:00.003+02:00</published><updated>2011-03-30T16:18:18.945+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Jak w C++ zainicjalizować otwarcie pliku klasą std::string</title><content type='html'>&lt;pre class="brush: cpp"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;fstream&amp;gt;&lt;br /&gt;#include &amp;lt;string&amp;gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;  std::string filename = "testfile";&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;  std::ifstream fin;&lt;br /&gt;&lt;br /&gt;  fin.open(filename.c_str()); // Works just fine.&lt;br /&gt;  fin.close();&lt;br /&gt;&lt;br /&gt;  //fin.open(filename); // Error: no such method.&lt;br /&gt;  //fin.close();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pełny tekst tutaj:&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/32332/why-dont-the-stdfstream-classes-take-a-stdstring"&gt;http://stackoverflow.com/questions/32332/why-dont-the-stdfstream-classes-take-a-stdstring&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/jak-w-c-zainicjalizowac-otwarcie-pliku.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-5711757369086302233?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/5711757369086302233/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/jak-w-c-zainicjalizowac-otwarcie-pliku.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5711757369086302233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5711757369086302233'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/jak-w-c-zainicjalizowac-otwarcie-pliku.html' title='Jak w C++ zainicjalizować otwarcie pliku klasą std::string'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-6636155374758791968</id><published>2011-03-27T12:36:00.001+02:00</published><updated>2011-03-30T16:16:31.267+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QT'/><title type='text'>Polskie literki w czystym Qt</title><content type='html'>w nagłówku:&lt;br /&gt;#include &amp;lt;QTextCodec&amp;gt;&lt;br /&gt;&lt;br /&gt;na początku programu należy wywołać:&lt;br /&gt;&lt;br /&gt;// w tłumaczeniach np. tr("ąśżźćółń");&lt;br /&gt;QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); &lt;br /&gt;// w pozostałych tekstach klasy QString&lt;br /&gt;QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));&lt;br /&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/jak-w-c-zainicjalizowac-otwarcie-pliku.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-6636155374758791968?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/6636155374758791968/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/polskie-literki-w-czystym-qt.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6636155374758791968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6636155374758791968'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/polskie-literki-w-czystym-qt.html' title='Polskie literki w czystym Qt'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-1275932722241711663</id><published>2011-03-26T06:55:00.001+01:00</published><updated>2011-03-30T16:19:10.871+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Ikonki, paski, klepsydry - wszystko o czekaniu (waiting icons)</title><content type='html'>W każdej aplikacji webowej potrzeba animowanych elementów przedstawiających proces ładowania. Albo potrzeba ikon, które nie mówią nic o procesie ładowania poza enigmatycznym zapewnieniem, że jakoweś tajne informacje przetwarzane są po stronie serwera.&lt;br /&gt;Na tej stronce mamy wybór: &lt;a href="http://mentalized.net/activity-indicators/"&gt;http://mentalized.net/activity-indicators/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/ikonki-paski-klepsydry-wszystko-o.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-1275932722241711663?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/1275932722241711663/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/ikonki-paski-klepsydry-wszystko-o.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/1275932722241711663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/1275932722241711663'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/ikonki-paski-klepsydry-wszystko-o.html' title='Ikonki, paski, klepsydry - wszystko o czekaniu (waiting icons)'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7669871666713441146</id><published>2011-03-25T11:39:00.002+01:00</published><updated>2011-03-30T16:19:58.743+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Kilka sztuczek w modelach Ruby on Rails</title><content type='html'>Przedstawiam kilka ciekawych "chwytów" dla modeli w Ruby on Rails. Dla jednych bardzo odkrywcze, a dla innych może już nie.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Polskie nazwy dla atrybutów&lt;/h3&gt;Rails z "automatu" fajnie wyświetla błędy dla modelu. Fajnie tylko pod warunkiem, że się &lt;a href="http://pomoceprogramisty.blogspot.com/2011/03/ba-bach-dwa-strzay-aby-spolonizowac.html"&gt;spolonizowało aplikację&lt;/a&gt;. Pozostało oczywiście to, że atrybuty wyświetlają się nadal w swojej oryginalnej formie.&lt;br /&gt;Jest na to rada. Umieszczamy to w modelu:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;HUMANIZED_ATTRIBUTES = {&lt;br /&gt;&amp;nbsp; :last_name =&amp;gt; "Nazwisko",&lt;br /&gt;&amp;nbsp; :first_name =&amp;gt; "Imię",&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; :gender =&amp;gt; "Płeć"&lt;br /&gt;}&lt;br /&gt;def self.human_attribute_name(attr)&lt;br /&gt;&amp;nbsp; HUMANIZED_ATTRIBUTES[attr.to_sym] || super&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;No i już wszędzie pojawi się zamiast "last_name" napis "Nazwisko".&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Walidacje dla grupy atrybutów (pól)&lt;/h3&gt;Załóżmy, że mamy kilka pól dla których należy nanieść ograniczenie. Warto zbudować dla nich stałą, aby później (po latach) zmieniając kod aplikacji rozumieć co artysta (ja) miał na myśli :-)&lt;br /&gt;Mogłoby to wyglądać mniej więcej tak: &lt;br /&gt;&lt;pre class="brush: ruby"&gt;class DayPayment &amp;lt; ActiveRecord::Base&lt;br /&gt;&amp;nbsp; SHORT_FIELD_LENGHT = 4 &lt;br /&gt;&amp;nbsp; SHORT_FIELDS = %w(morning afternoon midnight)&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; validates_lenght_of SHORT_FIELDS, :maximum =&amp;gt; SHORT_FIELD_LENGHT&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;end &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Proste typy wyliczeniowe wymagane w polach&lt;/h3&gt;Załóżmy, że chcielibyśmy aby w bazie zapisywana była płeć użytkownika w formacie tekstowym jako "mężczyzna" albo "kobieta". Możemy to zrobić tak:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;class User &amp;lt; ActiveRecord::Base&lt;br /&gt;  VALID_GENDERS = ["mężczyzna", "kobieta"]&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  validates_inclusion_of :gender,&lt;br /&gt;                         :in =&amp;gt; VALID_GENDERS,&lt;br /&gt;                         :allow_nil =&amp;gt; true,&lt;br /&gt;                         :message =&amp;gt; 'tylko "mężczyzna" albo "kobieta"'&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;opis:&lt;br /&gt;VALID_GENDERS -&amp;nbsp; jak zwykle wykorzystywanie stałych, aby później rozumieć co się pisało;&lt;br /&gt;:allow_nil =&amp;gt; true - bo użytkownik nie musi wypełniać pola "płeć";&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Wykorzystanie zakresu jako ograniczenia&lt;/h3&gt;Ruby udostępnia przejrzysty w swej składni i bardzo prosty w użyciu system zakresów. Można go użyć w modelu na przykład do ograniczenia wprowadzanych dat. Wejdą wtedy tylko te akceptowane. Można to zrobić na przykład tak:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;class User &amp;lt; ActiveRecord::Base&lt;br /&gt;  YEAR_FROM = 1939&lt;br /&gt;  VALID_DATES = DateTime.new(YEAR_FROM)..DateTime.now&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  validates_inclusion_of :birth_date,&lt;br /&gt;                         :in =&amp;gt; VALID_DATES,&lt;br /&gt;                         :allow_nil =&amp;gt; true,&lt;br /&gt;                         :message =&amp;gt; "jest nieprawidłowa"&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;  .&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;opis:&lt;br /&gt;VALID_DATES - zakres dopuszczalnych dat&lt;br /&gt;:allow_nil =&amp;gt; true - bo użytkownik nie musi wypełniać daty&lt;br /&gt;&lt;br /&gt;Więcej informacji w książce Hartla i Prohazki "RailsSpace".&lt;br /&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/kilka-sztuczek-w-modelach-ruby-on-rails.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7669871666713441146?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7669871666713441146/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/kilka-sztuczek-w-modelach-ruby-on-rails.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7669871666713441146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7669871666713441146'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/kilka-sztuczek-w-modelach-ruby-on-rails.html' title='Kilka sztuczek w modelach Ruby on Rails'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4875337336478488218</id><published>2011-03-25T07:38:00.001+01:00</published><updated>2011-03-30T16:20:58.984+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Ciekawy artykuł - stronicowanie, sortowanie tabel w Ruby on Rails</title><content type='html'>Stronicowanie i sortowanie tabel to bardzo popularne zagadnienie w każdej aplikacji webowej, czyli również w Rails. Dodatkowo autor porusza problem wyszukiwania w tabelach.&lt;br /&gt;Całość artykułu znajduje się pod adresem:&lt;br /&gt;&lt;a href="http://dev.nozav.org/rails_ajax_table.html"&gt;http://dev.nozav.org/rails_ajax_table.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/ciekawy-artyku-stronicowanie-sortowanie.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4875337336478488218?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4875337336478488218/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/ciekawy-artyku-stronicowanie-sortowanie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4875337336478488218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4875337336478488218'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/ciekawy-artyku-stronicowanie-sortowanie.html' title='Ciekawy artykuł - stronicowanie, sortowanie tabel w Ruby on Rails'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-8376447399464127146</id><published>2011-03-23T09:00:00.002+01:00</published><updated>2011-03-30T16:21:43.951+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Jak w jQuery wywołać funkcję z parametrami</title><content type='html'>JQuery w bardzo wielu miejscach używa funkcji bezimiennej jako parametru.&lt;br /&gt;Na przykład jeśli chcemy zareagować na zmianę w polu &lt;i&gt;"#name"&lt;/i&gt;:&lt;br /&gt;&lt;pre class="brush: javascript"&gt;jQuery("#name").change(function(){&lt;br /&gt;&amp;nbsp; //tu jakieś operacje&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;Wszystko fajnie do momentu, gdy te wewnętrzne funkcje nie zaczynają się rozrastać i ciągnąć za sobą nowe funkcje. Kod staje się całkowicie nieczytelny i bałagan z każdą chwilą się pogłębia.&lt;br /&gt;Częściowym rozwiązaniem jest osadzanie funkcji nazwanych jako parametru.&lt;br /&gt;W poprzednim przykładzie funkcję bezimienną moglibyśmy zastąpić nazwaną, jak choćby:&lt;br /&gt;&lt;pre class="brush: javascript"&gt;function makeChanges() {&lt;br /&gt;&amp;nbsp; //tu kod z funkcji nienazwanej&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;którą osadzamy w poprzednim przykładzie:&lt;br /&gt;&lt;blockquote&gt;jQuery("#name").change(makeChanges);&lt;/blockquote&gt;Zwróć uwagę na &lt;b&gt;brak nawiasów&lt;/b&gt;!&lt;br /&gt;&lt;br /&gt;Taaa... wygląda nieźle.&amp;nbsp; Wygląda nieźle, ale tylko do momentu, w którym musimy użyć funkcji &lt;i&gt;makeChanges()&lt;/i&gt; w jakimś innym miejscu kodu. Po to przecież ją wyekstrahowaliśmy (pamiętasz zasadę DRY?). Potrzebny wtedy jakiś parametr, a najczęściej dwa... albo i trzy.&lt;br /&gt;Niestety coś takiego w sposób prosty nie zadziała:&lt;br /&gt;&lt;blockquote&gt;jQuery("#name").change(makeChanges(paramOne, paramTwo)); &lt;/blockquote&gt;Aby zadziałało funkcja &lt;i&gt;makeChanges()&lt;/i&gt; musi zwrócić funkcję gdyż tego wymaga jQuery. Zróbmy więc tak:&lt;br /&gt;&lt;pre class="brush: javascript"&gt;function makeChanges(paramOne, paramTwo) {&lt;br /&gt;&amp;nbsp; return function() { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // tu dopiero kod z funkcji nienazwanej&lt;br /&gt;&amp;nbsp; &amp;nbsp; // z wykorzystaniem parametru paramOne&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // i parametru paramTwo&lt;br /&gt;&amp;nbsp; } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Teraz działa!&lt;br /&gt;&lt;br /&gt;Miłej zabawy :-)&lt;br /&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/jak-w-jquery-wywoac-funkcje-z.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-8376447399464127146?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/8376447399464127146/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/jak-w-jquery-wywoac-funkcje-z.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8376447399464127146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8376447399464127146'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/jak-w-jquery-wywoac-funkcje-z.html' title='Jak w jQuery wywołać funkcję z parametrami'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2313507983876691222</id><published>2011-03-17T08:01:00.005+01:00</published><updated>2011-03-30T16:23:32.178+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Zawartość generowana w plikach layoutu (Layout in layout) w Ruby on Rails</title><content type='html'>Zagadnienie, które poruszyłem w temacie wzbudza wiele emocji (albo raczej postów na listach). Jak zwykle burza pomysłów u kreatywnych programistów. Oczywiście rozwiązanie jest już zaimplementowane w Railsach. Rozwiązaniem tym jest&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;content_for&lt;/i&gt;&lt;/blockquote&gt;Drobny przykład.&lt;br /&gt;Załóżmy, że na panelu bocznym jest standardowe menu aplikacji. Zasadniczo spełnia ono wszystkie pokładane w nim nadzieje oprócz menu dla usera, które jako jedyne wymaga zmiany hasła. Dobrze by było więc aby podczas operacji dotyczącej użytkownika w panu pojawiała się dodatkowo opcja "zmiana hasła".&lt;br /&gt;W panelu bocznym standardowo menu wygląda tak:&lt;br /&gt;&lt;pre class="brush: html;"&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;klienci&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;płatności&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; ...a tu dodatkowe opcje menu w zależności od kontekstu...&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;/pre&gt;Zamiast łapać się prawą ręką za lewe ucho użyjmy standardowych mechanizmów Rails.&lt;br /&gt;W rzeczonym szablonie umieszczamy zajawkę:&lt;br /&gt;&lt;pre class="brush: html;"&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;klienci&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;płatności&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; .&lt;br /&gt;&amp;nbsp; &amp;lt;%= yield :new_options %&amp;gt; &lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;zaś w dowolnym pliku *.html.erb używamy &lt;i&gt;content_for&lt;/i&gt;: &lt;br /&gt;&lt;pre class="brush: ruby;"&gt;&amp;lt;% content_for :new_options do %&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;zmień hasło&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;li&amp;gt;sprawdź email&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Dzięki temu zapisowi dwie nowe pozycje znajdą się w menu panela bocznego.&lt;br /&gt;&lt;br /&gt;Oczywiście w głównym szablonie aplikacji może być więcej nazwanych bloków &lt;i&gt;yield&lt;/i&gt;, które będą mogły być wypełniane w zależności od okoliczności. Bardzo wygodne, proste i łatwe.&lt;br /&gt;&lt;br /&gt;Po więcej informacji sięgnij do tutoriala &lt;a href="http://apohllo.pl/guides/layouts_and_rendering.html"&gt;Layouty i Renderowanie w Ruby on Rails&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframesrc="http://www.facebook.com/plugins/like.php?href=http://pomoceprogramisty.blogspot.com/2011/03/zawartosc-generowana-w-plikach-layoutu.html&amp;layout=standard&amp;show_faces=true&amp; width=450&amp;action=like&amp;colorscheme=light&amp;height=80"scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px;height:80px;" allowTransparency="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2313507983876691222?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2313507983876691222/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/zawartosc-generowana-w-plikach-layoutu.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2313507983876691222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2313507983876691222'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/zawartosc-generowana-w-plikach-layoutu.html' title='Zawartość generowana w plikach layoutu (Layout in layout) w Ruby on Rails'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-6952372684835625074</id><published>2011-03-14T16:26:00.000+01:00</published><updated>2011-03-14T16:26:29.016+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Przykłady użytecznych elementów strony z użyciem jQuery</title><content type='html'>Ciekawie i prosto zrobione:&lt;br /&gt;&lt;a href="http://www.noupe.com/jquery/50-amazing-jquery-examples-part1.html"&gt;http://www.noupe.com/jquery/50-amazing-jquery-examples-part1.html&lt;/a&gt;&lt;br /&gt;aczkolwiek szata graficzna pozostawia wiele do życzenia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-6952372684835625074?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/6952372684835625074/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/przykady-uzytecznych-elementow-strony-z.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6952372684835625074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6952372684835625074'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/przykady-uzytecznych-elementow-strony-z.html' title='Przykłady użytecznych elementów strony z użyciem jQuery'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-574003352048699235</id><published>2011-03-14T11:31:00.007+01:00</published><updated>2011-03-14T14:50:14.534+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Ba Bach - dwa strzały aby spolonizować aplikację Ruby on Rails</title><content type='html'>Jak spolonizować aplikację pisaną w Ruby on Rails? Wystarczy zerknąć do netu aby złapać się za głowę ile trzeba przekopać materiału aby zdobyć taką wiedzę. Pomysły, pomysły, pomysły... Ludzie ich mają setki. Kreatywni programiści. Na dodatek są w stanie prawicę dać sobie odciąć za słuszność ich pomysłu. Przeglądając je zastanawiałem się jak bardzo można wykręcić sobie prawą nogę aby złapać nią za lewe ucho? Przecież twórcy Rails to przewidzieli. O co kopie kruszyć?&lt;br /&gt;&lt;br /&gt;Wystarczą dwa strzały!&lt;br /&gt;&lt;br /&gt;Strzał pierwszy, czyli tytułowy Ba:&lt;br /&gt;&lt;blockquote&gt;1. Napisz sobie plik pl.yml. Nie chce się? Pobierz od nas &lt;a href="http://piszemyprogramy.pl/download/pl.yml"&gt;PiszemyProgramy.pl/download/pl.yml&lt;/a&gt; i wrzuć do katalogu /config/locales&lt;/blockquote&gt;Strzał drugi, czyli Bach:&lt;br /&gt;&lt;blockquote&gt;2. Dodaj wpis &lt;i&gt;config.i18n.default_locale = :pl&lt;/i&gt; do pliku /config/environment.rb&lt;/blockquote&gt;&lt;br /&gt;Wygrałeś. Trafiłeś dwie dziesiątki. Koniec pieśni.&lt;br /&gt;&lt;br /&gt;Jeśli potrzeba Ci szczegółów przeczytaj to: &lt;a href="http://apohllo.pl/guides/i18n.html"&gt;http://apohllo.pl/guides/i18n.html&lt;/a&gt; delektując się pięknem polskiego języka.&lt;br /&gt;&lt;br /&gt;Jak masz zapędy masochistyczne i chcesz poznać kreatywność programistów zerknij też tu: &lt;a href="http://rubyonrails.pl/forum/p3572-2007-10-22-00:50:44"&gt;http://rubyonrails.pl/forum/p3572-2007-10-22-00:50:44&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-574003352048699235?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/574003352048699235/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/ba-bach-dwa-strzay-aby-spolonizowac.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/574003352048699235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/574003352048699235'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/ba-bach-dwa-strzay-aby-spolonizowac.html' title='Ba Bach - dwa strzały aby spolonizować aplikację Ruby on Rails'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-9083603364580062229</id><published>2011-03-12T14:47:00.000+01:00</published><updated>2011-03-12T14:47:03.253+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>GIT - kontrowersje i problemy</title><content type='html'>Jak się okazało nie tylko ja wieszam psy na panu Linusie za wyprodukowanie gigantycznego problemu w postaci GIT'a. Ale do rzeczy.&lt;br /&gt;Wspomniana przeze mnie we wcześniejszych postach książka &lt;a href="http://progit.org/book/pl/"&gt;Pro Git&lt;/a&gt; ukazuje w &lt;a href="http://progit.org/book/pl/ch2-4.html"&gt;sekcji o cofaniu zmian&lt;/a&gt; komendę:&lt;br /&gt;&lt;blockquote&gt;&amp;gt; git commit --amend &lt;i&gt;//nie używaj tego!&lt;/i&gt;&lt;/blockquote&gt;jako receptę na zapomniane poprawki. Autor z lekkością motylka zawiadamia czytelnika o pięknych możliwościach git'a. Na litość boską! &lt;b&gt;Nie używaj tego!&lt;/b&gt; Mogą Cię za to zaszlachtować inni uczestnicy projektu. Narobisz takiego bigosu w kodzie i tylu problemów dla prowadzącego projekt, że raczej nie rozważy poważnie Twojej kandydatury podczas rozdzielania premii, albo po prostu Cię wyleje i będzie miał spokój. &lt;br /&gt;To co się dzieje w publicznym repozytorium po użyciu tego cholerstwa... Omg!&lt;br /&gt;Najlepiej jest to opisane tutaj:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo"&gt;http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo&lt;/a&gt;&lt;/blockquote&gt;ale życzę abyś nie miał z tym nic do czynienia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-9083603364580062229?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/9083603364580062229/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/git-kontrowersje-i-problemy.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/9083603364580062229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/9083603364580062229'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/git-kontrowersje-i-problemy.html' title='GIT - kontrowersje i problemy'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-3265742055982533055</id><published>2011-03-11T16:10:00.000+01:00</published><updated>2011-03-11T16:10:09.053+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>GIT - usuwanie kilku commitów jednym poleceniem</title><content type='html'>Jak wiadomo usunięcie konkretnego commita w GIT'cie odbywa się komendą: &lt;br /&gt;&lt;blockquote&gt;git revert &lt;i&gt;odcisk_SHA&lt;/i&gt;&lt;/blockquote&gt;Całe szczęście, że można wpisywać tylko 7 pierwszych znaków odcisku SHA commita.&lt;br /&gt;&lt;br /&gt;Czasami się tak zdarza, że można zabrnąć w kodzie w ślepą uliczkę nie tworząc do tego gałęzi (branch). Może zaistnieć wtedy potrzeba usunięcia pod rząd kilku commitów. Wpisywanie "z palca" raczej nie wchodzi w rachubę bo można oszaleć. Trzeba więc było coś wymyślić.&lt;br /&gt;Z pomocą przyszła komenda&lt;br /&gt;&lt;blockquote&gt;git rev-list&lt;/blockquote&gt;Ma ona mnóstwo opcji, ale w podstawie wyświetla ona między innymi odciski SHA commitów. Gdy się użyje w takiej składni:&lt;br /&gt;&lt;blockquote&gt;git rev-list f182667 --max-count=5&lt;/blockquote&gt;to wyświetlone zostanie 5 odcisków commitów&amp;nbsp; począwszy od commita oznaczonego jako f182667. No to już bliziutko do finału, który brzmi:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;for i in `git rev-list f182667 --max-count=5`; do git revert --no-edit $i; done&lt;/blockquote&gt;Po co została użyta opcja --no-edit? Ano gdyby jej nie było, to pięć razy git by prosił o opisanie kolejnie wykonywanej operacji revert. Upierdliwe, że hej.&lt;br /&gt;&lt;br /&gt;UWAGA! &lt;b&gt;Pułapka&lt;/b&gt;: te górne apostrofki to nie są te normalne... To są te po lewej stronie klawisza "1" pod tyldą "~".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-3265742055982533055?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/3265742055982533055/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/git-usuwanie-kilku-commitow-jednym.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/3265742055982533055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/3265742055982533055'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/git-usuwanie-kilku-commitow-jednym.html' title='GIT - usuwanie kilku commitów jednym poleceniem'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-8026192370390493334</id><published>2011-03-11T15:55:00.001+01:00</published><updated>2011-12-23T09:33:15.130+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Rake spis poleceń</title><content type='html'>Udało mi się znaleźć prawie kompletny spis poleceń Rake dla Ruby on Rails.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;rake db:fixtures:load&lt;/b&gt; - Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:migrate &lt;/b&gt; - Migrate the database through scripts in db/migrate. Target specific version with VERSION=x&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:schema:dump&lt;/b&gt; - Create a db/schema.rb file that can be portably used against any DB supported by AR.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:schema:load&lt;/b&gt; - Load a schema.rb file into the database.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:sessions:clear&lt;/b&gt; - Clear the sessions table.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:sessions:create&lt;/b&gt; - Creates a sessions table for use with  CGI::Session::ActiveRecordStore.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:structure:dump&lt;/b&gt; - Dump the database structure to a SQL file.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:test:clone &lt;/b&gt; - Recreate the test database from the current environment's database schema.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:test:clone_structure&lt;/b&gt; - Recreate the test databases from the development structure.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:test:prepare&lt;/b&gt; - Prepare the test database and load the schema.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake db:test:purge&lt;/b&gt; - Empty the test database.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake doc:app&lt;/b&gt;Build the app HTML Files.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake doc:clobber_app &lt;/b&gt; - Remove rdoc products.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake doc:clobber_plugins&lt;/b&gt; - Remove plugin documentation.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake doc:clobber_rails &lt;/b&gt; Remove rdoc products.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake doc:plugins&lt;/b&gt; - Generate documation for all installed plugins.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake doc:rails&lt;/b&gt; - Build the rails HTML Files.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake doc:reapp&lt;/b&gt; - Force a rebuild of the RDOC files&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake doc:rerails&lt;/b&gt; - Force a rebuild of the RDOC files&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake log:clear&lt;/b&gt; - Truncates all *.log files in log/ to zero bytes&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake rails:freeze:edge&lt;/b&gt; - Lock this application to latest Edge Rails. Lock a specific revision with REVISION=X.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake rails:freeze:gems&lt;/b&gt; - Lock this application to the current gems (by unpacking them  into vendor/rails)&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake rails:unfreeze&lt;/b&gt; - Unlock this application from freeze of gems or edge and return to a fluid use of system gems&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake rails:update&lt;/b&gt; - Update both scripts and public/javascripts from Rails.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake rails:update:javascripts&lt;/b&gt; - Update your javascripts from your current rails install.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake rails:update:scripts&lt;/b&gt; - Add new scripts to the application script/ directory.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake stats&lt;/b&gt; - Report code statistics (KLOCs, etc) from the application.&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake test&lt;/b&gt; - Test all units and functionals&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake test:functionals&lt;/b&gt; -  Run tests for functionalsdb:test:prepare&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake test:integration&lt;/b&gt; -  Run tests for integrationdb:test:prepare&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake test:plugins &lt;/b&gt; -  Run tests for pluginsenvironment&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake test:recent  &lt;/b&gt; -  Run tests for recentdb:test:prepare&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake test:uncommitted &lt;/b&gt; -  Run tests for uncommitteddb:test:prepare&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake test:units &lt;/b&gt; -  Run tests for unitsdb:test:prepare&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake tmp:cache:clear&lt;/b&gt; -  Clears all files and directories in tmp/cache&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake tmp:clear&lt;/b&gt; -  Clear session, cache, and socket files from tmp/&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake tmp:create&lt;/b&gt; -  Creates tmp directories for sessions, cache, and sockets&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake tmp:sessions:clear&lt;/b&gt; -  Clears all files in tmp/sessions&lt;/li&gt;&lt;li&gt;&lt;b&gt;rake tmp:sockets:clear &lt;/b&gt; -  Clears all ruby_sess.* files in tmp/sessions&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Źródło na:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://www.tutorialspoint.com/ruby-on-rails/rails-and-rake.htm"&gt;http://www.tutorialspoint.com/ruby-on-rails/rails-and-rake.htm&lt;/a&gt;&lt;/blockquote&gt;Wszystko w jednym miejscu, krótko i treściwie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-8026192370390493334?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/8026192370390493334/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/rake-spis-polecen.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8026192370390493334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8026192370390493334'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/rake-spis-polecen.html' title='Rake spis poleceń'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4638283445742074150</id><published>2011-03-11T12:54:00.002+01:00</published><updated>2011-03-11T13:02:43.902+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>GIT - używanie, czyli codzienne starcia z urojeniami Linusa</title><content type='html'>Mimo, że używam GIT'a na co dzień, to gdyby mnie ktoś zapytał dlaczego, udzieliłbym nieco wymijającej odpowiedzi. Osobiście nie mam o nim dobrego zdania. System wygląda na projekt, który miał być mały, a stał się za duży. Co ciekawe tak chyba było w istocie. Linus tworząc Linuxa napisał system kontroli wersji dla tego projektu. Zaczęto go używać powszechnie, bo na wolnej licencji , bo tworzył to wielki Linus... Diabli wiedzą dlaczego...&lt;br /&gt;Logiki tam z lupą szukać. Weźmy pierwszy z brzegu przykład. Utworzenie nowej gałęzi wygląda normalnie:&lt;br /&gt;&lt;blockquote&gt;git branch test&lt;/blockquote&gt;ale przełączenie się na nią to już prawą nogą za lewe ucho:&lt;br /&gt;&lt;blockquote&gt;git checkout test&lt;/blockquote&gt;O kurde! COŚ jest nie tak. Sprawdzamy wobec tego co to jest checkout:&lt;br /&gt;&lt;a href="http://www.diki.pl/slownik-angielskiego/?q=checkout&amp;amp;x=0&amp;amp;y=0"&gt;http://www.diki.pl/slownik-angielskiego/?q=checkout&amp;amp;x=0&amp;amp;y=0&lt;/a&gt;&lt;br /&gt;I dowiadujemy się, że to kasa, bądź wymeldowanie. Na litość boską! Towarzyszu Linusie, skąd ci to wpadło do głowy? Słówko "branch" (gałąź) cię boli? Czyli gałąź niedokładnie opisuje gałąź? Lepiej do przełączenia na gałąź użyć słowa kasa-wymeldowanie? Dlaczego nie "cegła" albo "sznurówka"? Tak samo przypadkowe i tak samo dobre.&lt;br /&gt;Myślisz drogi czytaczu, że to odosobniony przypadek? Można książkę napisać o głupotach GIT'a. Zresztą niech przemówią fakty. Wrzuć w google frazę "git commit", a zaraz potem "bazaar commit". Sprawdź za każdym razem ilość wyników. I co? Tobie też wyszło, że stron wyjaśniających działanie GIT'a jest (uwaga!) stopiętnaścierazywięcej? Albo 115 razy więcej?! Każdy, kto choć chwilę się nad tym zastanowi natychmiast odrzuci kwestię popularności GIT'a versus Bazaar'a. Bazaar jest po prostu prosty :-) Fajnie wyszło: "po prostu prosty". Ale tak jest w istocie. Bazaar jest prosty. W Bazaar aby cofnąć ostatni commit piszesz:&lt;br /&gt;&lt;blockquote&gt;bazaar uncommit&lt;/blockquote&gt;O zgrozo! Jak prosto i domyślnie!&lt;br /&gt;Sprawdźmy więc jak to się robi w GIT:&lt;br /&gt;&lt;blockquote&gt;git revert 1ed35d3&lt;/blockquote&gt;To nie ściema! Tak jest naprawdę. I to jest skrócona wersja! Użyłem klucza tylko w wersji 7-dmio znakowej. A co by było gdybym musiał użyć całego klucza SHA? Drogi Linusie! Brawa za kreatywność.&lt;br /&gt;Pomijam tu kwestię, że na przykład, w skądinąd dobrej książce o Git'cie:&lt;br /&gt;&lt;a href="http://progit.org/book/pl/"&gt;http://progit.org/book/pl/&lt;/a&gt;&lt;br /&gt;na próżno będziesz szukał informacji na temat jak cofnąć ostatni commit. Ciekawe no nie? Ciekawym też jest fakt, że w ogóle taka książka jest potrzebna. Wiem, bo ją przeczytałem. Nie dlatego abym był masochistą. Nie zwariowałem. Przeczytałem, bo trzeba się było nauczyć. Ale, jak widać, jej przeczytanie nie daje nawet tak podstawowej wiedzy jak cofnąć commit. A teraz uwaga... aby korzystać bezproblemowo z Bazaara wystarczy poświęcić kwadrans na przeczytanie jednego tutoriala. Więcej tutoriali ani książek nie ma. Nie ma... zgadnij dlaczego? Ano dlatego, że nie potrzeba. Tam wszystko jest prosto i kawa na ławę. Jeden tutorial i po sprawie. Po co się rozpisywać skoro wszystko jest proste?&lt;br /&gt;Już słyszę te pytania: "&lt;i&gt;dlaczego, baranie, nie używasz więc Bazaara?&lt;/i&gt;". Ano spuszczę głowę i odpowiem, że dla tego samego co durnych windowsów. Wszędzie do tego coś jest. A to wtyczka do &lt;a href="http://netbeans.org/"&gt;NetBeansów&lt;/a&gt; i &lt;a href="http://www.jetbrains.com/idea/"&gt;Idei&lt;/a&gt;. A to u naszego &lt;a href="http://vipserv.org/p/1311849268"&gt;dostawcy usług hostingowych&lt;/a&gt; pełne wsparcie i tutoriale. Masakra! Uległem wielkości &lt;a href="https://github.com/"&gt;githuba&lt;/a&gt;. Stuliłem po sobie uszy, przymknąłem paszczę i używam tej durnoty. Mam nadzieję, że Ty, jak już dotarłeś do końca tych słów, to chociaż obejrzysz &lt;a href="http://bazaar.canonical.com/en/"&gt;Bazaara&lt;/a&gt; i zapłaczesz dlaczego takie wspaniałe narzędzie pozostaje w cieniu fantasmagorii wielkiego Linusa.&lt;br /&gt;&lt;br /&gt;Ach... byłbym zapomniał... kolejny z milionów tutoriali o GIT'cie:&lt;br /&gt;&lt;a href="http://marioosh.5dots.pl/2009/06/27/gitowy-system-kontroli-wersji.html"&gt;http://marioosh.5dots.pl/2009/06/27/gitowy-system-kontroli-wersji.html&lt;/a&gt;&lt;br /&gt;tam chociaż jest coś o cofnięciu commita...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4638283445742074150?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4638283445742074150/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/git-uzywanie-czyli-codzienne-starcia-z.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4638283445742074150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4638283445742074150'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/git-uzywanie-czyli-codzienne-starcia-z.html' title='GIT - używanie, czyli codzienne starcia z urojeniami Linusa'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2767601552241488275</id><published>2011-03-11T11:39:00.000+01:00</published><updated>2011-03-11T11:39:35.250+01:00</updated><title type='text'>devPytania.pl - serwis dla programistów</title><content type='html'>Ciekawy jestem jak to się będzie rozwijać...&lt;br /&gt;&lt;br /&gt;Póki co jest to dobrze zrobiony serwis pod względem programistycznym. Wyglądem nieco przypomina StackOverflow.&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://devpytania.pl/"&gt;http://devpytania.pl&lt;/a&gt;&lt;/blockquote&gt;W skrócie: pytania i odpowiedzi programistów.&amp;nbsp; Blogi programistów.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2767601552241488275?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2767601552241488275/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/devpytaniapl-serwis-dla-programistow.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2767601552241488275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2767601552241488275'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/devpytaniapl-serwis-dla-programistow.html' title='devPytania.pl - serwis dla programistów'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-8204530914810499679</id><published>2011-03-10T06:00:00.001+01:00</published><updated>2011-03-10T06:01:37.809+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Vim - kompletny plik _vimrc, lub _gvimrc</title><content type='html'>Okazało się, że publikacja kilku wpisów wywołała żywe zainteresowanie Vim'em jako hiper-szybkim edytorem tekstu. Zdaję sobie sprawę, że na początku ciężko jest przebrnąć przez ogrom możliwości konfiguracyjnych. Zamieszczam więc tutaj jedną z wersji naszego pliku _gvimrc jako przykład:&lt;br /&gt;&lt;blockquote&gt;set nocompatible&lt;br /&gt;source $VIMRUNTIME/vimrc_example.vim&lt;br /&gt;&lt;br /&gt;"Nie chcę aby gvim był podobny do windowsów&lt;br /&gt;"source $VIMRUNTIME/mswin.vim&lt;br /&gt;"behave mswin&lt;br /&gt;&lt;br /&gt;"nie zawijaj wierszy&lt;br /&gt;set nowrap&lt;br /&gt;&lt;br /&gt;"wcięcia&lt;br /&gt;set tabstop=4&lt;br /&gt;set shiftwidth=4&lt;br /&gt;&lt;br /&gt;"poprawne odkodowywanie plików wraz zautomatycznym ich rozpoznawaniem&lt;br /&gt;set fileencodings=utf-8,latin2&lt;br /&gt;set enc=utf-8&lt;br /&gt;&lt;br /&gt;"chcę zachować pliki przed zmianą, tyle że w tym katalogu&lt;br /&gt;set backupdir=d:/Archiwum/vim_backups&lt;br /&gt;&lt;br /&gt;"schemat kolorów&lt;br /&gt;"colorscheme desert&lt;br /&gt;colorscheme murphy&lt;br /&gt;&lt;br /&gt;"wielkość okna&lt;br /&gt;set columns=120&lt;br /&gt;set lines=60&lt;br /&gt;winp 0 0&lt;br /&gt;&lt;br /&gt;"ignorowanie wielkości liter podczas wyszukiwania&lt;br /&gt;set ignorecase&lt;br /&gt;&lt;br /&gt;"ukrywanie wskaźnika myszy gdy się pisze&lt;br /&gt;set mousehide&lt;br /&gt;set linebreak&lt;br /&gt;&lt;br /&gt;"autocomplete po naciśnięciu Ctrl-P lub Ctrl-N&lt;br /&gt;set completeopt=longest,menuone&lt;br /&gt;inoremap &amp;lt;expr&amp;gt; &amp;lt;CR&amp;gt; pumvisible() ? "\&amp;lt;C-y&amp;gt;" : "\&amp;lt;C-g&amp;gt;u\&amp;lt;CR&amp;gt;"&lt;br /&gt;inoremap &amp;lt;expr&amp;gt; &amp;lt;C-n&amp;gt; pumvisible() ? '&amp;lt;C-n&amp;gt;' :&lt;br /&gt;&amp;nbsp; \ '&amp;lt;C-n&amp;gt;&amp;lt;C-r&amp;gt;=pumvisible() ? "\&amp;lt;lt&amp;gt;Down&amp;gt;" : ""&amp;lt;CR&amp;gt;'&lt;br /&gt;inoremap &amp;lt;expr&amp;gt; &amp;lt;M-,&amp;gt; pumvisible() ? '&amp;lt;C-n&amp;gt;' :&lt;br /&gt;&amp;nbsp; \ '&amp;lt;C-x&amp;gt;&amp;lt;C-o&amp;gt;&amp;lt;C-n&amp;gt;&amp;lt;C-p&amp;gt;&amp;lt;C-r&amp;gt;=pumvisible() ? "\&amp;lt;lt&amp;gt;Down&amp;gt;" : ""&amp;lt;CR&amp;gt;'&lt;br /&gt;&lt;br /&gt;"Włączam pokazanie numerów wierszy&lt;br /&gt;set number&lt;br /&gt;set numberwidth=4 "ale nie więcej niż 9999&lt;br /&gt;&lt;br /&gt;"na dole i na górze zostawiam 5 linijek żeby coś widzieć&lt;br /&gt;set scrolloff=5&lt;br /&gt;&lt;br /&gt;"set cursorcolumn " highlight the current column&lt;br /&gt;set cursorline " highlight current line&lt;br /&gt;set incsearch " BUT do highlight as you type you search phrase&lt;br /&gt;&lt;br /&gt;"Obsługa foldingu czyli zwijania i rozwijania wierszy&lt;br /&gt;set foldmethod=manual&lt;br /&gt;let Tlist_Auto_Open=0 " let the tag list open automagically&lt;br /&gt;let Tlist_Compact_Format = 1 " show small menu&lt;br /&gt;let Tlist_Ctags_Cmd = 'ctags' " location of ctags&lt;br /&gt;let Tlist_Enable_Fold_Column = 0 " do show folding tree&lt;br /&gt;let Tlist_Exist_OnlyWindow = 1 " if you are the last, kill yourself&lt;br /&gt;let Tlist_File_Fold_Auto_Close = 0 " fold closed other trees&lt;br /&gt;let Tlist_Sort_Type = "name" " order by&lt;br /&gt;let Tlist_Use_Right_Window = 1 " split to the right side of the screen&lt;br /&gt;let Tlist_WinWidth = 40 " 40 cols wide, so i can (almost always) read my functions&lt;br /&gt;&lt;br /&gt;"Ideą, która przyświecała mi przy tworzeniu rozwinięć były dwie literki i "#".&lt;br /&gt;"Wszystko po to aby się nie myliło z normalnym pisaniem. Ten # całkowicie to&lt;br /&gt;"separuje.&lt;br /&gt;ab &amp;lt;ph# &amp;lt;?php echo; ?&amp;gt;&amp;lt;left&amp;gt;&amp;lt;left&amp;gt;&amp;lt;left&amp;gt;&amp;lt;left&amp;gt;&lt;br /&gt;ab fo# for($i=0; $i&amp;lt;10; ++$i) {&lt;br /&gt;}&amp;lt;up&amp;gt;A&lt;br /&gt;ab if# if() {&lt;br /&gt;}&amp;lt;Esc&amp;gt;&amp;lt;up&amp;gt;&amp;lt;End&amp;gt;3&amp;lt;Left&amp;gt;&lt;br /&gt;"W poniższym rozwinięciu ciekawostka jest spacja na końcu wyrażenia.&lt;br /&gt;"Denerewującą cechą rozwinięć jest to, że na końcu każdego wstawiają ten biały znak,&lt;br /&gt;"który je rozwija (np. CR albo spacja). Dzięki temu, że na końcu jest spacja&lt;br /&gt;"poszukiwanie w linii (f) szuka właśnie spacji i dostawia na końcu biały znak&lt;br /&gt;"znajdując się dokładnie na nazwie funkcji.&lt;br /&gt;ab fu# function nazwa_funkcji() {&lt;br /&gt;}&amp;lt;Esc&amp;gt;&amp;lt;Up&amp;gt;&amp;lt;Home&amp;gt;f &lt;br /&gt;ab $th# $this-&amp;gt;&amp;lt;Esc&amp;gt;F-&lt;br /&gt;&lt;br /&gt;"Rozwinięcia dla html&lt;br /&gt;ab &amp;lt;ht# &amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&amp;lt;Esc&amp;gt;3&amp;lt;up&amp;gt;&lt;br /&gt;ab &amp;lt;di# &amp;lt;div class=""&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;Esc&amp;gt;&amp;lt;Home&amp;gt;f&amp;gt;&lt;br /&gt;ab &amp;lt;p# &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;Esc&amp;gt;&amp;lt;Home&amp;gt;f&amp;gt;&lt;br /&gt;ab &amp;lt;fo# &amp;lt;form&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&amp;lt;Esc&amp;gt;kFm&lt;br /&gt;ab &amp;lt;ta# &amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&amp;lt;Esc&amp;gt;2&amp;lt;Up&amp;gt;&amp;lt;Home&amp;gt;f&amp;gt;&lt;br /&gt;ab &amp;lt;ul# &amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&amp;lt;Esc&amp;gt;&amp;lt;Up&amp;gt;&amp;lt;Home&amp;gt;f&amp;gt;&lt;br /&gt;ab &amp;lt;li# &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;Esc&amp;gt;&amp;lt;Home&amp;gt;f&amp;gt;&lt;br /&gt;ab &amp;lt;h1# &amp;lt;h1&amp;gt;&amp;lt;/h1&amp;gt;&amp;lt;Esc&amp;gt;&amp;lt;Home&amp;gt;f&amp;gt;&lt;br /&gt;ab &amp;lt;h2# &amp;lt;h2&amp;gt;&amp;lt;/h2&amp;gt;&amp;lt;Esc&amp;gt;&amp;lt;Home&amp;gt;f&amp;gt;&lt;br /&gt;ab &amp;lt;h3# &amp;lt;h3&amp;gt;&amp;lt;/h3&amp;gt;&amp;lt;Esc&amp;gt;&amp;lt;Home&amp;gt;f&amp;gt;&lt;br /&gt;ab &amp;lt;in# &amp;lt;input id="" name="" type="text" class="" /&amp;gt;&amp;lt;Esc&amp;gt;F&amp;lt;3f"&lt;br /&gt;ab &amp;lt;a# &amp;lt;a href="" title=""&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;Esc&amp;gt;4F"&lt;br /&gt;ab cl# class=""&amp;lt;Esc&amp;gt;2F"&lt;br /&gt;&lt;br /&gt;"wstawianie nawiasików&lt;br /&gt;map \( &amp;lt;Esc&amp;gt;a('')&amp;lt;Esc&amp;gt;&amp;lt;Left&amp;gt;i&lt;br /&gt;map \[ &amp;lt;Esc&amp;gt;a['']&amp;lt;Esc&amp;gt;&amp;lt;Left&amp;gt;i&lt;br /&gt;map \{ &amp;lt;Esc&amp;gt;a{&lt;br /&gt;}&amp;lt;Esc&amp;gt;&amp;lt;Up&amp;gt;A&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"otaczanie&lt;br /&gt;map \h1 &amp;lt;Esc&amp;gt;bi&amp;lt;h1&amp;gt;&amp;lt;Esc&amp;gt;ea&amp;lt;/h1&amp;gt;&amp;lt;Esc&amp;gt;F&amp;lt;&lt;br /&gt;map \h2 &amp;lt;Esc&amp;gt;bi&amp;lt;h2&amp;gt;&amp;lt;Esc&amp;gt;ea&amp;lt;/h2&amp;gt;&amp;lt;Esc&amp;gt;F&amp;lt;&lt;br /&gt;map \h3 &amp;lt;Esc&amp;gt;bi&amp;lt;h3&amp;gt;&amp;lt;Esc&amp;gt;ea&amp;lt;/h3&amp;gt;&amp;lt;Esc&amp;gt;F&amp;lt;&lt;br /&gt;map \sp &amp;lt;Esc&amp;gt;bi&amp;lt;span&amp;gt;&amp;lt;Esc&amp;gt;ea&amp;lt;/span&amp;gt;&amp;lt;Esc&amp;gt;F&amp;lt;&lt;br /&gt;map \a &amp;lt;Esc&amp;gt;bi&amp;lt;a href="" title=""&amp;gt;&amp;lt;Esc&amp;gt;ea&amp;lt;/a&amp;gt;&amp;lt;Esc&amp;gt;3F"&lt;br /&gt;&lt;br /&gt;"zakomentowanie linii znaczkiem # (dla Ruby)&lt;br /&gt;map &amp;lt;C-K&amp;gt; mkI#&amp;lt;Esc&amp;gt;`k &lt;br /&gt;&lt;br /&gt;"zakomentowanie linii znaczkiem //&lt;br /&gt;map &amp;lt;C-L&amp;gt; mkI//&amp;lt;Esc&amp;gt;`k &lt;br /&gt;&lt;br /&gt;"usunięcie wyrazu, na którym stoi kursor&lt;br /&gt;map &amp;lt;C-D&amp;gt; bdw&lt;/blockquote&gt;W następnych wpisach wyjaśnię co ciekawsze fragmenty.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-8204530914810499679?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/8204530914810499679/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-kompletny-plik-vimrc-lub-gvimrc.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8204530914810499679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8204530914810499679'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-kompletny-plik-vimrc-lub-gvimrc.html' title='Vim - kompletny plik _vimrc, lub _gvimrc'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-712785428674032008</id><published>2011-03-10T05:53:00.000+01:00</published><updated>2011-03-10T05:53:08.696+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Vim autocomplete czyli autouzupełnianie tekstu podobne do środowisk IDE</title><content type='html'>W Vim'ie, co może wielu zdziwić, też da się autouzupełniać kod. Jest to doskonała funkcja zapobiegająca powstawaniu trudnych do znalezienia błędów w kodzie.&lt;br /&gt;&lt;br /&gt;Ten kod poniżej należy wstawić do pliku _vimrc albo _gvimrc&lt;br /&gt;&lt;blockquote&gt;"autocomplete po naciśnięciu Ctrl-P lub Ctrl-N&lt;br /&gt;set completeopt=longest,menuone&lt;br /&gt;inoremap &amp;lt;expr&amp;gt; &amp;lt;CR&amp;gt; pumvisible() ? "\&amp;lt;C-y&amp;gt;" : "\&amp;lt;C-g&amp;gt;u\&amp;lt;CR&amp;gt;"&lt;br /&gt;inoremap &amp;lt;expr&amp;gt; &amp;lt;C-n&amp;gt; pumvisible() ? '&amp;lt;C-n&amp;gt;' :&lt;br /&gt;&amp;nbsp; \ '&amp;lt;C-n&amp;gt;&amp;lt;C-r&amp;gt;=pumvisible() ? "\&amp;lt;lt&amp;gt;Down&amp;gt;" : ""&amp;lt;CR&amp;gt;'&lt;br /&gt;inoremap &amp;lt;expr&amp;gt; &amp;lt;M-,&amp;gt; pumvisible() ? '&amp;lt;C-n&amp;gt;' :&lt;br /&gt;&amp;nbsp; \ '&amp;lt;C-x&amp;gt;&amp;lt;C-o&amp;gt;&amp;lt;C-n&amp;gt;&amp;lt;C-p&amp;gt;&amp;lt;C-r&amp;gt;=pumvisible() ? "\&amp;lt;lt&amp;gt;Down&amp;gt;" : ""&amp;lt;CR&amp;gt;'&lt;/blockquote&gt;Gwoli wyjaśnienia dodam, że Ctrl-P przeszukuje &lt;b&gt;P&lt;/b&gt;oprzednio napisany kod, a Ctrl-N &lt;b&gt;N&lt;/b&gt;astępnie (dalej) napisany kod. Oczywiście wciska się to w normalnym trybie edycji.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-712785428674032008?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/712785428674032008/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-autocomplete-czyli-autouzupenianie.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/712785428674032008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/712785428674032008'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-autocomplete-czyli-autouzupenianie.html' title='Vim autocomplete czyli autouzupełnianie tekstu podobne do środowisk IDE'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-319753763811186868</id><published>2011-03-09T16:09:00.004+01:00</published><updated>2011-03-09T16:13:14.390+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>PHP - powrót danych z formularza jako listy</title><content type='html'>Ciekawostką, jak się okazało, w php jest możliwość pobrania danych z formularzy jako tablic. Wystarczy do nazwy kontrolki na formularzu dodać nawiasy "[]".&lt;br /&gt;&lt;br /&gt;Na przykład:&lt;br /&gt;&lt;br /&gt;przed zmianą:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&amp;lt;select name="lista"&amp;gt;&amp;lt;/select&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;po zmianie:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;&amp;lt;select name="lista[]"&amp;gt;&amp;lt;/select&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-319753763811186868?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/319753763811186868/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/php-powrot-danych-z-formularza-jako.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/319753763811186868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/319753763811186868'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/php-powrot-danych-z-formularza-jako.html' title='PHP - powrót danych z formularza jako listy'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-249445245178296309</id><published>2011-03-08T10:05:00.002+01:00</published><updated>2011-03-09T11:36:54.573+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Co to jest ||= czyli dziwna notacja w Ruby</title><content type='html'>Sformułowanie ||= może wyglądać dziwnie, ale jest użyteczne.&lt;br /&gt;Zapis&lt;br /&gt;&lt;pre class="brush: csharp"&gt;foo ||= "hello"&lt;br /&gt;&lt;/pre&gt;znaczy, że jeśli zmienna foo nie jest zainicjowana (lub ma wartość nil) to przypisz jej string "hello".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-249445245178296309?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/249445245178296309/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/co-to-jest-czyli-dziwna-notacja-w-ruby.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/249445245178296309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/249445245178296309'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/co-to-jest-czyli-dziwna-notacja-w-ruby.html' title='Co to jest ||= czyli dziwna notacja w Ruby'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7214603961117420841</id><published>2011-03-08T07:01:00.003+01:00</published><updated>2011-03-09T10:15:48.802+01:00</updated><title type='text'>Serwis dla programistów do kolorowania składni</title><content type='html'>Czasami trzeba przesłać komuś trochę kodu. Może wstawić do jakiegoś forum... Bez wcinek i kolorów czyta się to ciężko. Autorzy tej strony:&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://pastebin.com/"&gt;http://pastebin.com/&lt;/a&gt;&lt;/blockquote&gt;domyślili się jak wielu ludzi przesyła swoje źródła i postanowili pomóc programistom w przekazywaniu czytelnego kodu. Wklej tam swój kod i odbierz pokolorowany.&lt;br /&gt;Okazało się jednak, że wiele fragmentów kodu to po prostu perełki. Warto się nimi dzielić na szerszym forum. Skoro ludzie już używają Pastebin to tylko krok aby Pastebin stał się naturalnym centrum prezentacji wartościowego kodu. Można z niego korzystać okazyjnie, a można założyć tam konto i dzielić się z innymi swoim kodem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7214603961117420841?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7214603961117420841/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/serwis-dla-programistow-do-kolorowania.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7214603961117420841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7214603961117420841'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/serwis-dla-programistow-do-kolorowania.html' title='Serwis dla programistów do kolorowania składni'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7309011891330443186</id><published>2011-03-08T06:54:00.000+01:00</published><updated>2011-03-08T06:54:12.047+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Strony pod iPhone'a i Androida - jak robić</title><content type='html'>Wygląda na ciekawy turial:&lt;br /&gt;&lt;a href="http://blog.piotrnalepa.pl/2011/02/07/jquery-html5-jak-zrobic-mobilna-wersje-strony-internetowej-pod-iphonea-i-androida/"&gt;http://blog.piotrnalepa.pl/2011/02/07/jquery-html5-jak-zrobic-mobilna-wersje-strony-internetowej-pod-iphonea-i-androida/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7309011891330443186?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7309011891330443186/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/strony-pod-iphonea-i-androida-jak-robic.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7309011891330443186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7309011891330443186'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/strony-pod-iphonea-i-androida-jak-robic.html' title='Strony pod iPhone&apos;a i Androida - jak robić'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2633601922633717361</id><published>2011-03-07T16:22:00.002+01:00</published><updated>2011-03-09T11:35:27.783+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Vim - katalog TEMP oraz litery w UTF-8</title><content type='html'>Vim posiada arcyprzydatną opcję generowania przy każdej zmianie pliku z jego poprzednią wersją. Jest to o tyle przydatne, co denerwujące na dłuższą metę. Przy edycji dużej ilości plików powstaje ich nadmierna ilość, co w końcu może denerwować.&lt;br /&gt;Wystarczy jednak ustawić zmienną systemową, aby pliki backupowe były automatycznie przerzucane do wybranego katalogu. Dane konfiguracyjne znajdują się w pliku konfiguracyjnym (jak to tajemniczo brzmi).&lt;br /&gt;Dla Windows ten plik to&lt;br /&gt;&lt;blockquote&gt;C:\Program Files\Vim\_vimrc&amp;nbsp;&lt;/blockquote&gt;zaś dla Linuxa wystarczy&lt;br /&gt;&lt;blockquote&gt;~/.vimrc&lt;/blockquote&gt;Należy tam wpisać: &lt;br /&gt;&lt;blockquote&gt;:set backupdir=c:/Windows/temp&lt;/blockquote&gt;Oczywiście ścieżka jest dowolna.&lt;br /&gt;&lt;br /&gt;Osobnym problemem to kodowanie polskich liter. Polecanym jest UTF-8, ale w Windows oczywiście tak nie jest :-(&lt;br /&gt;Wrzucamy więc do pliku konfiguracyjnego:&lt;br /&gt;&lt;blockquote&gt;:set fileencodings=utf-8,latin2&lt;/blockquote&gt;i po kłopocie.&lt;br /&gt;&lt;br /&gt;Nieco szerzej jest to opisane tutaj: &lt;a href="http://automaciej.jogger.pl/2006/07/18/vim-utf-8-i-iso-8859-2/"&gt;http://automaciej.jogger.pl/2006/07/18/vim-utf-8-i-iso-8859-2/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2633601922633717361?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2633601922633717361/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-i-katalog-temp-oraz-litery-w-utf-8.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2633601922633717361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2633601922633717361'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-i-katalog-temp-oraz-litery-w-utf-8.html' title='Vim - katalog TEMP oraz litery w UTF-8'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-8321227820636013545</id><published>2011-03-03T22:46:00.003+01:00</published><updated>2011-03-03T22:48:24.583+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Vim - opis klawiszy</title><content type='html'>Pomocny link:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linux.ie/articles/tutorials/vim-3.0.refcard.html" target="_blank"&gt;http://www.linux.ie/articles/tutorials/vim-3.0.refcard.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-8321227820636013545?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/8321227820636013545/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-opis-klawiszy.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8321227820636013545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8321227820636013545'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-opis-klawiszy.html' title='Vim - opis klawiszy'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-7806276259388616469</id><published>2011-03-03T22:38:00.001+01:00</published><updated>2011-03-03T22:39:03.056+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Vim - tabulacje i wcięcia - konfiguracja</title><content type='html'>Żeby poprawnie ustawić tabulacje i wcięcia w Vim'ie należy w pliku (dla Windows):&lt;br /&gt;C:\Program Files\Vim\_vimrc&lt;br /&gt;&lt;br /&gt;wstawić linie:&lt;br /&gt;&lt;pre&gt;set tabstop=4&lt;br /&gt;set shiftwidth=4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;oczywiście jeśli chcemy ustawić wcięcia na 4 :-)&lt;br /&gt;&lt;br /&gt;dodatkowo można wyłączyć zawijanie wierszy:&lt;br /&gt;&lt;pre&gt;set nowrap&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-7806276259388616469?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/7806276259388616469/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-tabulacje-i-wciecia-konfiguracja.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7806276259388616469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/7806276259388616469'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/vim-tabulacje-i-wciecia-konfiguracja.html' title='Vim - tabulacje i wcięcia - konfiguracja'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2279511364950309088</id><published>2011-03-02T16:10:00.000+01:00</published><updated>2011-03-02T16:10:35.656+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Zmienne środowiskowe w Linuksie</title><content type='html'>Minimalny skrót. &lt;br /&gt;&lt;br /&gt;Wyświetlenie wszystkich zmiennych:&lt;br /&gt;&amp;gt; env&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Wyświetlenie pojedynczej zmiennej:&lt;br /&gt;&amp;gt; echo $JAVA_HOME&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Przyznanie zmiennej wartości:&lt;br /&gt;&amp;gt; ZMIENNA=wartość&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Export do innych powłok:&lt;br /&gt;&amp;gt; export $ZMIENNA&lt;br /&gt;&lt;br /&gt;chyba jeszcze:&lt;br /&gt;&amp;gt; export ZMIENNA&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Zapamiętanie zmiennej do powtórnego restartu komputera:&lt;br /&gt;&lt;br /&gt;umieścić w lokalnym pliku .profile&lt;br /&gt;albo dla wszystkich użytkowników w /etc/profile&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Usunięcie zmiennej:&lt;br /&gt;&amp;gt; unset ZMIENNA&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Szczegóły na:&lt;br /&gt;&lt;a href="http://jakilinux.org/konsola/zmienne-srodowiskowe/"&gt;http://jakilinux.org/konsola/zmienne-srodowiskowe/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2279511364950309088?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2279511364950309088/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/zmienne-srodowiskowe-w-linuksie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2279511364950309088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2279511364950309088'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/zmienne-srodowiskowe-w-linuksie.html' title='Zmienne środowiskowe w Linuksie'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-9001051097649859439</id><published>2011-03-02T04:10:00.001+01:00</published><updated>2011-03-02T04:12:40.132+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript - Jak ustawić kursor w pierwszym polu formularza na stronie www - focus()</title><content type='html'>Można to oczywiście sprytniej zrobic przy pomocy jQuery, ale to rozwiązanie ma tę zaletę, że nie potrzebuje żadnych dodatkowych starań. Czysty kod i już:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;function formfocus() {&lt;br /&gt;    if(document.forms.length &amp;gt; 0) {&lt;br /&gt;        var formElements = ["text", "checkbox", "radio", "select-one", "select-multiple", "textarea"];&lt;br /&gt;        var form = document.forms[document.forms.length-1];&lt;br /&gt;        for (var j = 0; j &amp;lt; form.elements.length; j++) { &lt;br /&gt;            var field = form.elements[j]; &lt;br /&gt;            for(var x = 0; x &amp;lt; formElements.length; x++) { &lt;br /&gt;            if (field.getAttribute("type") == formElements[x]) { &lt;br /&gt;                field.focus(); &lt;br /&gt;                return false; &lt;br /&gt;            } &lt;br /&gt;        } &lt;br /&gt;    } &lt;br /&gt;} &lt;br /&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A w definicji body strony należy wstawić: onload="formfocus();&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-9001051097649859439?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/9001051097649859439/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/javascript-jak-ustawic-kursor-w.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/9001051097649859439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/9001051097649859439'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/javascript-jak-ustawic-kursor-w.html' title='JavaScript - Jak ustawić kursor w pierwszym polu formularza na stronie www - focus()'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4240812108948169528</id><published>2011-03-02T03:59:00.001+01:00</published><updated>2011-03-02T04:00:48.532+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery - autocomplete wyzwalanie akcji</title><content type='html'>Ciężko tu zrozumieć co miałem na myśli osobom nie z branży, albo i nawet z branży.&lt;br /&gt;&lt;br /&gt;A problem jest taki, że autocomplete z frameworka jQuery w momencie wybrania w polu tekstowym właściwej opcji nie robi nic. A czasami fajnie by było aby po wybraniu dokonał akcji takiej jakby był wciśnięty klawiszy "submit" formularza.&lt;br /&gt;&lt;br /&gt;Można zrobić to tak:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;$('input#query').autocomplete('yoururl',{&lt;br /&gt;    .............&lt;br /&gt;    your options&lt;br /&gt;    .............&lt;br /&gt;}).result(function(event, item, formatted) {&lt;br /&gt;    $(this).parents().find('form:first').submit();&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4240812108948169528?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4240812108948169528/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/jquery-autocomplete-wyzwalanie-akcji.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4240812108948169528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4240812108948169528'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/03/jquery-autocomplete-wyzwalanie-akcji.html' title='jQuery - autocomplete wyzwalanie akcji'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4163928418400289282</id><published>2011-02-28T06:48:00.000+01:00</published><updated>2011-02-28T06:48:35.899+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>CSS 3 - automatyczny generator stylów</title><content type='html'>Gdy potrzebujemy zaawansowanego wyglądu elementów strony www to albo męczymy się z obrazeczkami, podłożami, gradientami, pikselami, rameczkami i innymi duperelami, albo szukamy prostych rozwiązań. Do owych prostych można by zaliczyć CSS 3. Bo na litość boską! Czy zaokrąglone rogi, albo cień to odkrywanie grobowca Tutenhamona (czy jak go tam zwą)? To są proste i durne elementy, które implementują miliony programistów każdego dnia. Jak czytasz te słowa to wyobraź sobie bandę programistów, która w tej chwili poci się nad ramką, zaokrąglonym rogiem i cieniem. Poniżające.&lt;br /&gt;Zamiast pracowicie szukać rozwiązań w necie można skorzystać z prostego generatora:&lt;br /&gt;&lt;a href="http://css3generator.com/"&gt;http://css3generator.com/&lt;/a&gt;&lt;br /&gt;Dużo rozwiązań podaje na tacy. Większość to oczywiście łapanie prawą nogą za lewe ucho.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4163928418400289282?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4163928418400289282/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/css-3-automatyczny-generator-stylow.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4163928418400289282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4163928418400289282'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/css-3-automatyczny-generator-stylow.html' title='CSS 3 - automatyczny generator stylów'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-736622486803543446</id><published>2011-02-25T15:37:00.003+01:00</published><updated>2011-03-01T12:11:35.974+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Jak w jQuery dodawać opcje do listy.</title><content type='html'>Czasami chcemy dynamicznie dodać opcje np.&lt;br /&gt;&lt;blockquote&gt;&amp;lt;option&amp;gt;Dodatkowa opcja&amp;lt;/option&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;do wysuwanej listy &amp;lt;select&amp;gt;&lt;br /&gt;&lt;br /&gt;Można zrobić to tak:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;$.each(selectValues, function(key, value){&lt;br /&gt;    $('#mySelect').&lt;br /&gt;    append($("").&lt;br /&gt;    attr("value",key).&lt;br /&gt;    text(value));&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;albo lepiej:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;var thisValue = 12;&lt;br /&gt;var thisText = 'December';&lt;br /&gt;var thisOpt = document.createElement('option');&lt;br /&gt;thisOpt.value = thisValue;&lt;br /&gt;thisOpt.appendChild(document.createTextNode(thisText));&lt;br /&gt;$("#name_select_field").append(thisOpt);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-736622486803543446?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/736622486803543446/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/jak-w-jquery-dodawac-opcje-do-listy.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/736622486803543446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/736622486803543446'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/jak-w-jquery-dodawac-opcje-do-listy.html' title='Jak w jQuery dodawać opcje do listy.'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2312054640214256128</id><published>2011-02-25T03:45:00.004+01:00</published><updated>2011-02-25T12:32:32.056+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Zmienne globalne w CodeIgniter</title><content type='html'>Ten sposób podobał mi się najbardziej:&lt;br /&gt;&lt;blockquote&gt;$data['user_name'] = "John Doe";&lt;br /&gt;$this-&amp;gt;load-&amp;gt;vars($data);&lt;/blockquote&gt;&lt;br /&gt;//somewhere in the view&lt;br /&gt;&lt;blockquote&gt;Hello &amp;lt;?php echo $user_name; ?&amp;gt; &amp;nbsp;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Tak też można używać właściwości gdy w głównym kontrolerze zdefiniuje się:&lt;br /&gt;&lt;blockquote&gt;$CI =get_instance();&lt;br /&gt;$CI-&amp;gt;foo = 12;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2312054640214256128?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2312054640214256128/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/zmienne-globalne-w-codeigniter.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2312054640214256128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2312054640214256128'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/zmienne-globalne-w-codeigniter.html' title='Zmienne globalne w CodeIgniter'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-8969924790486640251</id><published>2011-02-25T03:38:00.002+01:00</published><updated>2011-02-25T03:38:55.481+01:00</updated><title type='text'>System do rejestracji i edycji makro w Windows</title><content type='html'>Nie dość, że Open Source, to jeszcze bardzo rozbudowany:&lt;br /&gt;&lt;a href="http://www.autohotkey.com/"&gt;http://www.autohotkey.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-8969924790486640251?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/8969924790486640251/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/system-do-rejestracji-i-edycji-makro-w.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8969924790486640251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8969924790486640251'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/system-do-rejestracji-i-edycji-makro-w.html' title='System do rejestracji i edycji makro w Windows'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-932452651806269011</id><published>2011-02-25T03:36:00.001+01:00</published><updated>2011-02-25T03:47:39.911+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QT'/><title type='text'>Polskie litery w Ruby i Qt</title><content type='html'>wystarczy za deklaracją aplikacji wpisać:&lt;br /&gt;&lt;blockquote&gt;$KCODE = 'UTF8'&lt;/blockquote&gt;ot i wszystko :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-932452651806269011?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/932452651806269011/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/polskie-litery-w-ruby-i-qt.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/932452651806269011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/932452651806269011'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/polskie-litery-w-ruby-i-qt.html' title='Polskie litery w Ruby i Qt'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-3315091250625879447</id><published>2011-02-24T15:30:00.001+01:00</published><updated>2011-02-25T03:48:01.858+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Centrowanie pojemników w poziomie (CSS)</title><content type='html'>Niestety standardowy znacznik:&lt;br /&gt;&lt;blockquote&gt;text-align: center;&amp;nbsp;&lt;/blockquote&gt;nie działa. Działa tylko dla elementów liniowych, a nam chodzi o elementy blokowe.&lt;br /&gt;Zadziała zaś:&lt;br /&gt;&lt;blockquote&gt;div {&lt;br /&gt;&amp;nbsp; margin-left: auto;&lt;br /&gt;&amp;nbsp; margin-right: auto;&lt;br /&gt;}&lt;/blockquote&gt;No prawie zadziała... Wiadomo, że elementy blokowe w standardzie panoszą się na całą szerokość strony. Zapis powyższy nie ma więc czego tak naprawdę centrować, jeśli zaś wstawimy na przykład:&lt;br /&gt;&lt;blockquote&gt;div {&lt;br /&gt;&amp;nbsp; width: 60%;&lt;br /&gt;&amp;nbsp; margin-left: auto;&lt;br /&gt;&amp;nbsp; margin-right: auto;&lt;br /&gt;}&lt;/blockquote&gt;to już na pewno (hmm) zadziała.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-3315091250625879447?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/3315091250625879447/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/centrowanie-pojemnikow-w-poziomie-css.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/3315091250625879447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/3315091250625879447'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/centrowanie-pojemnikow-w-poziomie-css.html' title='Centrowanie pojemników w poziomie (CSS)'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-5384208745165357494</id><published>2011-02-24T12:13:00.006+01:00</published><updated>2011-04-26T17:18:58.256+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>Warte zapamiętania komendy edytora Vim</title><content type='html'>Podobno informatycy dzielą się na tych co używają &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs'a&lt;/a&gt;, na tych co używają &lt;a href="http://www.vim.org/"&gt;Vim'a&lt;/a&gt;, oraz na tych, którzy jeszcze nie poznali dobrego edytora tekstów, przez co używają kompletnie nieprzydatnych "rozwiązań" buraków z Richmond. Ten, kto nie wie o czym mowa niech nie czyta dalej. To nie dla niego.&lt;br /&gt;&lt;br /&gt;Osobiście preferuję Vim'a. Prędkość edycji tekstu w tym edytorze oszałamia. Jest kilka komend, które znacząco przyspieszają pracę. Wybrałem najczęściej używane przeze mnie.&lt;br /&gt;&lt;br /&gt;Rejestry&lt;br /&gt;&lt;b&gt;"ay&lt;/b&gt; zapis (yank) zaznaczonego tekstu do rejestru a (zamiast "a" można użyć dowolnej litery)&lt;br /&gt;&lt;b&gt;"Ay&lt;/b&gt; dopisanie do rejestru a zaznaczonego tekstu. Doładowanie go.&lt;br /&gt;&lt;b&gt;"ap&lt;/b&gt; wstawienie tekstu na miejsce kursora z rejestru a (zamiast "a" można użyć dowolnej litery)&lt;br /&gt;&lt;b&gt;"*&lt;/b&gt; register (rejestr) zawierający clipboard&lt;br /&gt;&lt;b&gt;"*y&lt;/b&gt; zapis zaznaczonego tekstu do clipboardu&lt;br /&gt;&lt;b&gt;"*p&lt;/b&gt; wklejenie z clipboardu w miejsce kursora&lt;br /&gt;&lt;br /&gt;Makra&lt;br /&gt;&lt;b&gt;qa&lt;/b&gt; start rejestracji makra w rejestrze a (zamiast "a" można użyć dowolnej litery)&lt;br /&gt;&lt;b&gt;q&lt;/b&gt; stop rejestracji makra (oczywiście nie w modzie edycji tylko w modzie komend)&lt;br /&gt;&lt;b&gt;@a&lt;/b&gt; uruchomienie makra z rejestru a (zamiast "a" można użyć dowolnej litery)&lt;br /&gt;&lt;br /&gt;Marki - rzecz zawodowa&lt;br /&gt;&lt;b&gt;``&lt;/b&gt; dwa apostrofki (pod tyldą) powrót do ostatniego postoju kursora&lt;br /&gt;ma markuje miejsce kursora znacznikiem "a" (zamiast "a" może być dowolna litera)&lt;br /&gt;&lt;b&gt;`a&lt;/b&gt; skok z miejsca aktualnego kursora da zamarkowanego wcześniej miejsca "a"&lt;br /&gt;&lt;b&gt;`[&lt;/b&gt; początek ostatnio edytowanego tekstu&lt;br /&gt;&lt;b&gt;`]&lt;/b&gt; koniec ostatnio edytowanego tekstu&lt;br /&gt;&lt;b&gt;:marks&lt;/b&gt; pokazuje wszystkie zamarkowane miejsca&lt;br /&gt;&lt;br /&gt;&lt;b&gt;%&lt;/b&gt; jeśli się stoi na nawiasach to skacze z początku na koniec i odwrotnie&lt;br /&gt;&lt;b&gt;*&lt;/b&gt; zaznacza słowo, na którym się stoi i wrzuca to do szukania (cudowne)&lt;br /&gt;&lt;br /&gt;fajne są komendy z literką &lt;b&gt;"z"&lt;/b&gt; do poruszania ekranu:&lt;br /&gt;&lt;b&gt;z&lt;/b&gt;&lt;enter&gt; linia z kursorem znajdzie się na górze&lt;br /&gt;&lt;b&gt; z.&lt;/b&gt; na środku&lt;br /&gt;&lt;b&gt; z-&lt;/b&gt; na dole&lt;br /&gt;analogicznie działają:&lt;br /&gt;&lt;b&gt; zt&lt;/b&gt; top&lt;br /&gt;&lt;b&gt; zz&lt;/b&gt; środek&lt;br /&gt;&lt;b&gt; zb&lt;/b&gt; bottom&lt;br /&gt;&lt;br /&gt;&lt;b&gt; :nohlsearch&lt;/b&gt; jeśli Cię wkurzaja podświetlenia ostatniego wyszukiwania (następne wyszukiwanie elegancko powraca do podświetlania)&lt;br /&gt;&lt;br /&gt;Gdy się jest w modzie Visual (literka "&lt;b&gt;v&lt;/b&gt;") to literki "&lt;b&gt;o&lt;/b&gt;" i "&lt;b&gt;O&lt;/b&gt;" skaczą na początek i na koniec zaznaczenia. Łatwo dzięki temu poszerzać zaznaczenie.&lt;br /&gt;&lt;br /&gt;Zmiana wielkości liter:&lt;br /&gt;&lt;b&gt; ~&lt;/b&gt; (tylda) zamienia małe na duże i odwrotnie&lt;br /&gt;&lt;b&gt;U&lt;/b&gt; na duże (tylko w zaznaczeniu)&lt;br /&gt;&lt;b&gt; u&lt;/b&gt; na małe (tylko w zaznaczeniu)&lt;br /&gt;&lt;b&gt; gu&lt;/b&gt;&lt;zakres&gt; na małe np. &lt;b&gt;guw&lt;/b&gt; zmieni na małe całe słowo&lt;br /&gt;&lt;b&gt; gU&lt;/b&gt;&lt;zakres&gt; na duże np. &lt;b&gt;gUw&lt;/b&gt; zmieni na DUŻE całe słowo&lt;br /&gt;&lt;b&gt; guu&lt;/b&gt; na małe całą linię&lt;br /&gt;&lt;b&gt; gUU&lt;/b&gt; na duże całą linię&lt;br /&gt;&lt;br /&gt;&lt;b&gt; &amp;gt;&lt;/b&gt; wcinka dla całego bloku tekstu (tylko w Block Visual "Ctrl-V")&lt;br /&gt;&lt;b&gt; &amp;lt;&lt;/b&gt; likwidacja wcinki dla całego bloku tekstu (tylko w Block Visual "Ctrl-V")&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;Zmiana tekstu w całym pliku:&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;b&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;%s/stary_tekst/nowy_tekst/g&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;Obsługa nie po polsku brzmiących foldów czyli składania i rozkładania kodu, żeby nie przeszkadzał w poruszaniu się po tekście&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;zf&lt;/b&gt; utworzenie folda z zaznaczonego tekstu&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;zj&lt;/b&gt; skok do następnego folda (jak ruch kursorem)&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;zk&lt;/b&gt; skok do poprzedniego folda (jak ruch kursorem)&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;zo&lt;/b&gt; otwiera (open) fold pod kursorem&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;zO&lt;/b&gt; otwiera wszystkie zaznaczone foldy&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;zc&lt;/b&gt; zamyka (close) fold&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;zd&lt;/b&gt; kasuje fold pod kursorem&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;:mkview&lt;/b&gt; zapisanie swoich foldów dotyczących tego pliku&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;:loadview&lt;/b&gt; odtworzenie zapisanych foldów&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;Arcyirytujące było dla mnie to, że kiedy wchodziłem w tryb edytora Ex (dla niewtajemniczonych dodam, że jest to mod po naciśnięciu "&lt;b&gt;:&lt;/b&gt;" dwukropka) to nie mogłem użyć zawartości bufora czyli wkleić tego co tam sobie siedziało.&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;Oczywiście jest to możliwe:&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;Ctrl-R-"&lt;/b&gt; wklejenie z domyślnego bufora&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;Ctrl-R-a&lt;/b&gt; wklejenie z bufora o nazwie a do linijki Ex&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;Kontynuując ten wątek to wszystkie problemy rozwiązuje wejście w tryb Command-line:&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;Ctrl-F&lt;/b&gt; - z trybu Command czyli juz po naciśnięciu:&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;q:&lt;/b&gt; - z trybu Normal (szczegóły na &lt;b&gt;:help q:&lt;/b&gt;)&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;:tabnew nazwa_pliku&lt;/b&gt; otwarcie pliku w nowej zakładce&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;:tabn&lt;/b&gt; następna zakładka&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;:tabp&lt;/b&gt; poprzednia zakładka&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;Reformatowanie kodu:&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;V&lt;/b&gt; zaznaczenie tekstu do reformatowania&amp;nbsp;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;&lt;b&gt;=&lt;/b&gt; reformatowanie (znaczek "równa się" :)&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;br /&gt;&lt;br /&gt;&lt;enter&gt;&lt;zakres&gt;&lt;zakres&gt;Lekki opis dla ludzi już coś wiedzących znajduje się na &lt;a href="http://pl.wikibooks.org/wiki/Vim/Wi%C4%99cej_ni%C5%BC_edytor" target="_blank"&gt;http://pl.wikibooks.org/wiki/Vim/Więcej_niż_edytor&lt;/a&gt;&lt;/zakres&gt;&lt;/zakres&gt;&lt;/enter&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-5384208745165357494?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/5384208745165357494/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/warte-zapamietania-komendy-dytora-vim.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5384208745165357494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5384208745165357494'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/warte-zapamietania-komendy-dytora-vim.html' title='Warte zapamiętania komendy edytora Vim'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-6869554568900975545</id><published>2011-02-23T14:44:00.001+01:00</published><updated>2011-02-25T03:48:38.562+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Cieniowanie pojemników w CSS</title><content type='html'>Od wersji 3.0 pojawiła się możliwość cieniowania pojemników (nareszcie!). No i co? No i nie działa! Mówi się, że na razie. Pożyjemy, zobaczymy. Na razie stosujemy więc durne sztuczki (jak zwykle!).&lt;br /&gt;&lt;br /&gt;Zakładam, że mamy pojemnik:&lt;br /&gt;&lt;blockquote&gt;&amp;lt;div class="shadow"&amp;gt;Tra ta ta!&amp;lt;/div&amp;gt;&lt;/blockquote&gt;Powinien dać się podcieniować przy pomocy:&lt;br /&gt;&lt;blockquote&gt;.shadow {&lt;br /&gt;&amp;nbsp; box-shadow: 2px 3px 5px gray;&lt;br /&gt;}&lt;/blockquote&gt;Oczywiście nigdzie to nie działa, mimo, że specyfikacja określa to w sposób jasny. Trzeba stosować sztuczki:&lt;br /&gt;&lt;blockquote&gt;.shadow {&lt;br /&gt;&amp;nbsp;&amp;nbsp;  -moz-box-shadow: 2px 3px 5px gray;&lt;br /&gt;&amp;nbsp; -webkit-box-shadow: 2px 3px 5px gray;&lt;br /&gt;&amp;nbsp; box-shadow: 2px 3px 5px gray;&lt;br /&gt;}&lt;/blockquote&gt;Bóg mi światkiem, że nie rozumiem dlaczego w Firefxie działa&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;  -moz-box-shadow: 2px 3px 5px gray;&lt;/blockquote&gt;a nie działa&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp; box-shadow: 2px 3px 5px gray;&lt;/blockquote&gt;Co za różnica we wpisywanych literkach? W każdym razie to zadziała.&lt;br /&gt;&lt;br /&gt;Jeszcze znaczenie poszczególnych pozycji:&lt;br /&gt;2px - przesunięcie w poziomie&lt;br /&gt;3px - przesunięcie w pionie&lt;br /&gt;5px - rozmycie&lt;br /&gt;gray - kolor cienia&lt;br /&gt;&lt;br /&gt;No i jeszcze uwaga. Głupi &lt;b&gt;Internet Explorer nie obsługuje niczego!&lt;/b&gt; Należy zapomnieć o naturalnym cieniowaniu. Nadal trzeba rysować szczątki cieni w Photoshopie, czy czymś takim...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-6869554568900975545?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/6869554568900975545/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/cieniowanie-pojemnikow-w-css.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6869554568900975545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6869554568900975545'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/cieniowanie-pojemnikow-w-css.html' title='Cieniowanie pojemników w CSS'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-1505297865503973568</id><published>2011-02-22T12:03:00.003+01:00</published><updated>2011-02-25T03:49:47.281+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Automatyczne rozbudowywanie kodu poprzez JavaScript</title><content type='html'>Pisząc kod stron, a szczególnie formularzy często pojawiają się standardowe elementy strony np.&lt;br /&gt;&lt;blockquote&gt;&amp;lt;input type="submit" value="Zatwierdź"/&amp;gt;&lt;/blockquote&gt;Nic wielkiego, ale grafik sobie zażyczył takiego:&lt;br /&gt;&lt;blockquote&gt;&amp;lt;div class="bt_submit"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;img src="images/bckg_submit_left.png" alt=""/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;span&amp;gt;Zatwierdź&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;img src="images/bckg_submit_right.png" alt=""/&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/blockquote&gt;Nie ma rady. Trzeba tak pisać. Po trzecim razie miałem dość. Bo gdzie jest zasada DRY (Dont Repeat Yurself?).&lt;br /&gt;Wymyśliłem tak: tam gdzie będzie potrzebny przycisk "Zatwierdź" w kodzie strony napiszę:&lt;br /&gt;&lt;blockquote&gt;&amp;lt;div class="bt"&amp;gt;Zatwierdź&amp;lt;/div&amp;gt;&lt;/blockquote&gt;a do tego napisałem trochę prostego kodu w JavaScripcie.&lt;br /&gt;Korzystam z frameworka jQuery więc by to wyglądało tak:&lt;br /&gt;&lt;blockquote&gt;jQuery(document).ready(function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var bt=jQuery('div.bt');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; makeBtSubmit(bt);&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function makeBtSubmit(bt) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var btText=bt.html();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var initialBtClassName='bt'; //umowna&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var targetBtClassName='bt_submit'; //umowna, ale posiadająca swój CSS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bt.removeClass(initialBtClassName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bt.addClass(targetBtClassName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var imageLeft='&amp;lt;img src="images/bckg_submit_left.png" alt=""/&amp;gt;';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var imageRight='&amp;lt;img src="images/bckg_submit_right.png" alt=""/&amp;gt;';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var spanInside='&amp;lt;span&amp;gt;'+btText+'&amp;lt;/span&amp;gt;';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var htmlInside=imageLeft+spanInside+imageRight;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bt.html(htmlInside);&lt;br /&gt;}&lt;/blockquote&gt;Teraz więc wszędzie gdzie wystapi mój kod&lt;br /&gt;&lt;blockquote&gt;&amp;lt;div class="bt"&amp;gt;Zatwierdź&amp;lt;/div&amp;gt;&lt;/blockquote&gt;zostanie automatycznie zamieniony na kod wymagany przez grafika.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-1505297865503973568?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/1505297865503973568/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/automatyczne-rozbudowywanie-kodu.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/1505297865503973568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/1505297865503973568'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/automatyczne-rozbudowywanie-kodu.html' title='Automatyczne rozbudowywanie kodu poprzez JavaScript'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-2105102887623667981</id><published>2011-02-21T12:36:00.001+01:00</published><updated>2011-02-25T03:50:21.463+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Wyśrodkowanie tekstu w pionie (CSS)</title><content type='html'>W specyfikacji CSS (jak na razie) nie ma bardzo ważnego zapisu dotyczącego środkowania tekstu&amp;nbsp; w pionie. Trudno to jakoś silnie uzasadnić. Trudno to w ogóle uzasadnić. Ostatnio w modzie jest używanie CSS. Uważany jest on jako panaceum na wszystko włącznie z modnym pisaniem kodu. Wystarczy jednak do niego siąść i gołym okiem widać kompletny bezsens tego potworka. Opisywany tutaj problem to zaledwie jeden z wielu. Wystarczy spróbować wycentrować jakiś blok, zrobić menu itp. itd. Potworek siedzi na karku potworka, a wszystko to ziejący ogniem potwór pogania. Składnia wygląda trochę jak kawałkowana Java z amputowaną logiką. Trochę tu dziedziczenia. Jedne elementy po sobie coś dziedziczą, inne zaś nie. Oczywiście bez żadnej logiki. Brak zmiennych przyprawia o ból głowy. Jeśli stosuję zaledwie kilka kolorów na stronie to bywa, że skaczę po pliku jak wariat, żeby sobie przypomnieć, gdzie ostatnio użyłem jasnozielonego i kopiuję, a potem odszukuję gdzie ostatnio pisałem i wklejam skopiowany kod. Trochę w tym pomaga IDE, ale to nie znaczy, że problem przestaje istnieć.&lt;br /&gt;Arcyirytującym oślarstwem jest zmiana znaczenia znaczników html przez CSS. Czytam cudzy kod strony w html'u i nic z niego nie da się zrozumieć. Wszędzie pełno &amp;lt;span&amp;gt; i &amp;lt;div&amp;gt;, znaczenia których nie można się w żadnym wypadku domyślić bez wertowania plików CSS i zgadywania co też autor miał na myśli w chwili artystycznego szału. Mickiewiczowskie "czterdzieści i cztery" to pestka przy tej zgaduj-zgaduli. Zwolennicy, czy wręcz prorocy i kapłani CSS jako główny atut przedstawiają czystość kodu przy stosowaniu CSS. O matyldo! Wczoraj czytałem kod strony, gdzie menu, przyciski, a nawet (winszuję) formularze oparte były o elementy &amp;lt;ul&amp;gt; i &amp;lt;li&amp;gt;. Kod był przemieszany zaangażowaniem kucharza z adhd mieszającego sałatkę warzywną. Twórca htmla by się, przysłowiowo, w grobie przewrócił. &lt;br /&gt;&lt;br /&gt;Przytaczam tu artykuł:&lt;br /&gt;&lt;a href="http://phrogz.net/css/vertical-align/index.html"&gt;http://phrogz.net/css/vertical-align/index.html&lt;/a&gt;&lt;br /&gt;który dość pełnie opisuje idiotyzmy i łapanie się prawą nogą za lewe ucho aby wyśrodkować element w pojemniku w pionie.&lt;br /&gt;Dowiadujemy się z niego UWAGA!, że aby wyśrodkować jedną linijkę w pionie należy linię tekstu pogrubić do rozmiaru pojemnika, w którym się ta linia znajduje. Innymi słowy jeśli pojemnik ma wysokość 500 pikseli, to i linia powinna mieć wysokość 500 pikseli. Oczywiście o ile znamy wysokość pojemnika. Przy pojemnikach o zmiennej wysokości to już nie działa. Czy to nie idiotyzm? Prorocy CSS co wy na to? Duże oczka? Zaskoczeni? A nie ma czym! Należy się nauczyć takich sztuczek jeśli inaczej się nie da. Musimy umieć stosować takie potworki bo twórcy CSS nie przewidzieli tego... tamtego... jeszcze tamtego... i jeszcze... i jeszcze... i trzy kropki. A pomyśleć, że dla komórki w tabeli się dało! Tam jest atrybut valign. Wystarczy wpisać valign=middle i gotowe! Jak widać w jednym miejscu się da, a w innym już nie. &lt;br /&gt;&lt;br /&gt;Oddzielnie opiszę centrowanie pojemników w poziomie, bo oczywiście tego też się nie dało. Jednak, jak w poprzednim przypadku, w tabelach się dało i to działa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-2105102887623667981?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/2105102887623667981/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/wysrodkowanie-tekstu-w-pionie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2105102887623667981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/2105102887623667981'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/wysrodkowanie-tekstu-w-pionie.html' title='Wyśrodkowanie tekstu w pionie (CSS)'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4475316809789428148</id><published>2011-02-19T10:44:00.001+01:00</published><updated>2011-02-25T03:50:43.209+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Zaokrąglone rogi w CSS</title><content type='html'>div {&lt;br /&gt;&amp;nbsp; border: 1px solid gray&lt;br /&gt;&amp;nbsp; -webkit-border-radius: 6px; /* Safari, Chrome */&lt;br /&gt;&amp;nbsp; -khtml-border-radius: 6px; /* Konqueror */&lt;br /&gt;&amp;nbsp; -moz-border-radius: 6px; /* Firefox */&lt;br /&gt;&amp;nbsp; border-radius: 6px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Powinno być tylko:&lt;br /&gt;&amp;nbsp; border-radius: 6px;&lt;br /&gt;ale, że jako na dzień dzisiejszy przeglądarki tego nie obsługują (nie wiedzieć czemu) trzeba stosować te łaty powyżej.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4475316809789428148?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4475316809789428148/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/zaokraglone-rogi-w-css.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4475316809789428148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4475316809789428148'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/zaokraglone-rogi-w-css.html' title='Zaokrąglone rogi w CSS'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-5060195842987418903</id><published>2011-02-17T16:39:00.001+01:00</published><updated>2011-02-25T03:51:27.245+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Co zrobić jeśli mimo instalacji gema wciąż nie działa MySQL w Ruby On Rails?</title><content type='html'>Powodem tego jest brak biblioteki "libmySQL.dll" w katalogu, do którego istnieje ścieżka dostępu. Wystarczy skopiować plik "libmySQL.dll" na przykład do katalogu /ruby/bin/ i wszystko zadziała.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-5060195842987418903?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/5060195842987418903/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/co-zrobic-jesli-mimo-instalacji-gema.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5060195842987418903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/5060195842987418903'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/co-zrobic-jesli-mimo-instalacji-gema.html' title='Co zrobić jeśli mimo instalacji gema wciąż nie działa MySQL w Ruby On Rails?'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-261459097438573509</id><published>2011-02-17T16:36:00.001+01:00</published><updated>2011-02-25T03:51:45.211+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Współistnienie kilku wersji Rails na jednym hoście</title><content type='html'>Na jednym hoście może współistnieć kilka wersji Ruby on Rails. Aby je zainstalować należy:&lt;br /&gt;&amp;gt; gem install rails //instaluje najnowszą wersję&lt;br /&gt;&amp;gt; gem install rails -v "2.3.10" //instaluje wersję 2.3.10&lt;br /&gt;&amp;gt; gem install rails -v "2.3.8" //instaluje wersję 2.3.8&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-261459097438573509?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/261459097438573509/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/wspoistnienie-kilku-wersji-rails-na.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/261459097438573509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/261459097438573509'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/wspoistnienie-kilku-wersji-rails-na.html' title='Współistnienie kilku wersji Rails na jednym hoście'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-6150587458201817506</id><published>2011-02-17T14:09:00.001+01:00</published><updated>2011-02-25T03:52:04.276+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Upgrade Ruby on Rails</title><content type='html'>Okazało się, że wygrzebanie tej informacji wcale nie jest takie oczywiste więc ją zamieszczam.&lt;br /&gt;Aby dokonać upgrade'u Ruby on Rails należy wydać komendę:&lt;br /&gt;&amp;gt; gem update rails&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-6150587458201817506?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/6150587458201817506/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/upgrade-ruby-on-rails.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6150587458201817506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/6150587458201817506'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/upgrade-ruby-on-rails.html' title='Upgrade Ruby on Rails'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-4127488821278265415</id><published>2011-02-16T12:45:00.003+01:00</published><updated>2011-02-25T15:47:35.915+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>CSS 3 i cienie tekstu</title><content type='html'>Cienie dla tekstu:&lt;br /&gt;&lt;pre class="skladnia"&gt;&lt;var&gt;selektor&lt;/var&gt; { text-shadow: &lt;var&gt;poziom pion rozmycie kolor&lt;/var&gt;,&lt;var&gt;...&lt;/var&gt; }&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;kbd&gt;poziom&lt;/kbd&gt; - przesunięcie cienia w prawo (ujemne wartości przesuwają w lewo)&lt;/li&gt;&lt;li&gt;&lt;kbd&gt;pion&lt;/kbd&gt; - przesunięcie cienia w dół (ujemne wartości przesuwają w górę)&lt;/li&gt;&lt;li&gt;&lt;kbd&gt;rozmycie&lt;/kbd&gt; - promień efektu rozmycia (opcjonalnie)&lt;/li&gt;&lt;li&gt;&lt;kbd&gt;kolor&lt;/kbd&gt; - &lt;a href="http://www.kurshtml.boo.pl/css/kolory.html"&gt;kolor&lt;/a&gt; bazowy efektu (opcjonalnie - jeśli go nie podamy, przyjmie kolor taki, jak sam element)&lt;/li&gt;&lt;/ul&gt;Na przykład:&lt;br /&gt;&lt;pre&gt;h3 { text-shadow: 0.2em 0.3em 10px red }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-4127488821278265415?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/4127488821278265415/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/css-3-i-cienie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4127488821278265415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/4127488821278265415'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/css-3-i-cienie.html' title='CSS 3 i cienie tekstu'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-123109697129123626</id><published>2011-02-16T11:36:00.001+01:00</published><updated>2011-02-25T03:54:04.842+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Jak automatycznie przenieść na inną stronę www</title><content type='html'>Za pomocą atrybutów &lt;b&gt;http-equiv&lt;/b&gt; oraz &lt;b&gt;content&lt;/b&gt; z odpowiednimi wartościami możemy ustawić automatyczne przekierowanie. Przykład poniżej.&lt;br /&gt;&lt;br /&gt;&lt;table border="0" style="width: 100%;"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&amp;lt;meta http-equiv="refresh" content="10; url=jakasstrona.html"&amp;gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;Tag &lt;b&gt;&amp;lt;meta&amp;gt;&lt;/b&gt; musi być zawarty w sekcji &amp;lt;&lt;b&gt;head&amp;gt;&lt;/b&gt;. Atrybut &lt;b&gt;content&lt;/b&gt;  będzie miał przypisane dwie wartości. Pierwsza oznacza liczbę sekund do  odświeżenia strony, a druga wartość to adres URL, pod który  przekierowujemy.&lt;br /&gt;Powyższy kod przekierowuje użytkownika do jakasstrona.html po 10 sekundach.&lt;br /&gt;&lt;br /&gt;Aby to samo osiągnąć przy pomocy php:&lt;br /&gt;&amp;lt;?php &lt;br /&gt;header("HTTP/1.1 301 Moved Permanently");&lt;br /&gt;header("Location: jakasstrona.html");&lt;br /&gt;exit;&lt;br /&gt;?&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-123109697129123626?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/123109697129123626/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/jak-automatycznie-przeniesc-na-inna.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/123109697129123626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/123109697129123626'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/jak-automatycznie-przeniesc-na-inna.html' title='Jak automatycznie przenieść na inną stronę www'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-8963856593396973845</id><published>2011-02-14T13:41:00.001+01:00</published><updated>2011-02-25T03:54:25.549+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Button designer - narzędzie do wizualnego projektowania przycisków button</title><content type='html'>&lt;a href="http://www.pagetutor.com/button_designer/index.html"&gt;http://www.pagetutor.com/button_designer/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-8963856593396973845?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/8963856593396973845/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/butto-designer-narzedzie-do-wizualnego.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8963856593396973845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/8963856593396973845'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/butto-designer-narzedzie-do-wizualnego.html' title='Button designer - narzędzie do wizualnego projektowania przycisków button'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3391942589902184482.post-52907100522126007</id><published>2011-02-14T13:10:00.001+01:00</published><updated>2011-02-25T03:54:42.860+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Nie powtarzaj się w stylach, czyli 5 wartych uwagi frameworków CSS</title><content type='html'>Ciekawy artykuł o frameworkach dla CSS:&lt;br /&gt;&lt;a href="http://webhosting.pl/Nie.powtarzaj.sie.w.stylach.czyli.5.wartych.uwagi.frameworkow.CSS"&gt;http://webhosting.pl/Nie.powtarzaj.sie.w.stylach.czyli.5.wartych.uwagi.frameworkow.CSS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Frameworki:&lt;br /&gt;xCSS: &lt;a href="http://xcss.antpaw.org/docs"&gt;http://xcss.antpaw.org/docs&lt;/a&gt;&lt;br /&gt;EMASTIC: &lt;a href="http://code.google.com/p/emastic/wiki/Tutorial"&gt;http://code.google.com/p/emastic/wiki/Tutorial&lt;/a&gt; &lt;br /&gt;Typogridphy: &lt;a href="http://csswizardry.com/typogridphy/"&gt;http://csswizardry.com/typogridphy/&lt;/a&gt;&lt;br /&gt;1Kb CSS Grid:&amp;nbsp; &lt;a href="http://www.1kbgrid.com/"&gt;http://www.1kbgrid.com/&lt;/a&gt;&lt;br /&gt;Baseline: &lt;a href="http://www.baselinecss.com/"&gt;http://www.baselinecss.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3391942589902184482-52907100522126007?l=pomoceprogramisty.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pomoceprogramisty.blogspot.com/feeds/52907100522126007/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/nie-powtarzaj-sie-w-stylach-czyli-5.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/52907100522126007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3391942589902184482/posts/default/52907100522126007'/><link rel='alternate' type='text/html' href='http://pomoceprogramisty.blogspot.com/2011/02/nie-powtarzaj-sie-w-stylach-czyli-5.html' title='Nie powtarzaj się w stylach, czyli 5 wartych uwagi frameworków CSS'/><author><name>Edwin Piekart</name><uri>http://www.blogger.com/profile/14163013952963558530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_4kV9aqw3JMI/Svghj0jbXWI/AAAAAAAAAJg/g6bnt4KR3yE/S220/edwin.png'/></author><thr:total>0</thr:total></entry></feed>
