<?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-9181175094946909040</id><updated>2011-12-12T19:43:49.677+01:00</updated><category term='screen'/><category term='cel istnienia'/><category term='ssh'/><category term='sens życia'/><category term='nifty hacks'/><category term='except'/><category term='bash'/><category term='keyboard emulation'/><category term='autologon'/><category term='workarounds'/><title type='text'>Artur Gajowy - blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://arturgajowy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181175094946909040/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://arturgajowy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Artur Gajowy</name><uri>http://www.blogger.com/profile/07263590235259066152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9181175094946909040.post-334303451321851115</id><published>2009-08-02T17:01:00.015+02:00</published><updated>2010-10-18T00:57:18.713+02:00</updated><title type='text'>ReCaptcha w django w 10 minut</title><content type='html'>1. Ściągamy &lt;a href="http://code.google.com/p/recaptcha-django/source/checkout"&gt;recaptcha-django&lt;/a&gt; - bardzo małą i przyjemną aplikację, która udostępnia funkcjonalność ReCaptcha w sposób, jakiego nie powstydziliby się twórcy django:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash"&gt;svn checkout http://recaptcha-django.googlecode.com/svn/trunk/ recaptcha-django-read-only&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Przenosimy folder recaptcha_django do folderu z naszym projektem (niech to będzie mysite), dodajemy 'recaptcha_django' do INSTALLED_APPS w mysite/settings.py. Dodajemy także załączony middleware - do MIDDLEWARE_CLASSES w settings.py dopisujemy &lt;span style="font-weight:bold;"&gt;na końcu&lt;/span&gt; 'recaptcha_django.middleware.ReCaptchaMiddleware'. Ten mały middleware dodaje do POST-a odpowiednich żądań http informacje o ip klienta potrzebną recaptcha. Proponuję odpalić serwer deweloperski. Możesz mieć szczęście i zobaczyć, że brakuje jakiegoś modułu... Wtedy następny punkt jest dla Ciebie.&lt;br /&gt;&lt;br /&gt;3. Nie na każdym serwerze jest zainstalowany pythonowy moduł recaptcha-client. Dlatego &lt;a href="http://pypi.python.org/pypi/recaptcha-client"&gt;ściągamy go&lt;/a&gt;. Jedynym czego trzeba, by jakiś moduł był dostępny w pythonie, jest obecność tego modułu na ścieżce wyszukiwań modułów [wooow!...], która w przypadku django obejmuje główny katalog projektu (mysite/). Tak więc wrzucamy katalog recaptcha z rozpakowanego &lt;a href="http://pypi.python.org/packages/source/r/recaptcha-client/recaptcha-client-1.0.4.tar.gz#md5=b818290f0a489b9e45d3def91064e8a0"&gt;archiwum&lt;/a&gt; do mysite/.&lt;br /&gt;&lt;br /&gt;4. Jeszcze raz odpalamy serwer developerski. Tym razem powinien wstać. Zabieramy się do wzbogacenia naszego formularza (form):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;#mysite/forms.py&lt;br /&gt;from django import forms&lt;br /&gt;&lt;br /&gt;from recaptcha_django import *&lt;br /&gt;&lt;br /&gt;class PortalRegistrationForm(forms.Form):&lt;br /&gt;    #tu jakieś mało istotne pola&lt;br /&gt;    #...&lt;br /&gt;    recaptcha = ReCaptchaField()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Odpalamy serwer, wchodzimy na stronę z naszą formą i widzimy, że brakuje jakichś dziwnych ustawień (RECAPTCHA_PUBLIC_KEY i RECAPTCHA_PRIVATE_KEY). Wpadamy na pomysł, żeby zarejestrować się na &lt;a href="http://recaptcha.net/whyrecaptcha.html"&gt;ReCaptcha&lt;/a&gt;. W nagrodę dostaniemy upragnione wartości zmiennych RECAPTCHA_PUBLIC_KEY i RECAPTCHA_PRIVATE_KEY, które wpisujemy do mysite/settings.py.&lt;br /&gt;&lt;br /&gt;I tyle!&lt;br /&gt;&lt;br /&gt;Jeśli ktoś chce mieć mniej standardową ReCapchę i chciałby przy okazji poznać kawałek django, to może czytać dalej:&lt;br /&gt;&lt;br /&gt;[polecam aplikację &lt;a href="http://bitbucket.org/ubernostrum/django-registration/wiki/Home"&gt;django-regitration&lt;/a&gt; autorstwa James'a Bennett'a (a.k.a. ubernostrum)]&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;from registration.forms import RegistrationForm&lt;br /&gt;&lt;br /&gt;class PortalRegistrationForm(RegistrationForm):&lt;br /&gt;    recaptcha = ReCaptchaField(&lt;br /&gt;        label='''Prove that you're a human:''' &lt;br /&gt;        #tak oto w django definiuje się niestandardowy opis dla pola formularza&lt;br /&gt;&lt;br /&gt;        widget=ReCaptchaWidget(&lt;br /&gt;            attrs={'theme': 'blackglass'}),  #zmieniamy skórkę&lt;br /&gt;        # a tak podaje się atrybuty elementom HTMLa do których zostanie&lt;br /&gt;        # wyrenderowany formularz. Pisząc 'atrybuty' myślę tu [w przypadku&lt;br /&gt;        # standardowych Widget-ów django] o atrybutach HTML,&lt;br /&gt;        # np. rows dla textarea:&lt;br /&gt;    komentarz = forms.CharField(&lt;br /&gt;        widget=forms.Textarea(attrs={'rows': 3})) #krótki komentarz.&lt;br /&gt;    )&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Naturalnym pytaniem jest: jakie są inne skórki dla ReCaptcha? Odpowiedź &lt;a href="http://wiki.recaptcha.net/index.php/How_to_change_reCAPTCHA_colors"&gt;tutaj&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;EDIT:&lt;br /&gt;Niestety, RecaptchaField wyświetla ochydny error-code zamiast ładnego komunikatu o błędzie. Czytałem trochę ReCaptcha API, ale tam utrzymują, że kody błędów mogą się zmieniać i żeby się tego nie trzymać. Jako że domyślny widget captchy wyświetla komunikat o błędzie, starczy pozbyć się brzydkiego komunikatu o błędzie:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;class PortalRegistrationForm(RegistrationForm):&lt;br /&gt;    #...jak wyżej...&lt;br /&gt;&lt;br /&gt;    def clean(self):&lt;br /&gt;        cleaned_data = super(PortalRegistrationForm, self).clean()&lt;br /&gt;        if 'recaptcha' in self._errors:&lt;br /&gt;            self._errors['recaptcha'] = forms.util.ErrorList([])&lt;br /&gt;        return cleaned_data &lt;br /&gt;        #jak piszą w dokumentacji, "ALWAYS return the cleaned_data" :)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Przeciążamy tutaj metodę odpowiadającą za sprawdzanie poprawnośći formularza tak, by zrobiła to, co zrobiłaby normalnie [super()], a potem zastępujemy listę błędów dla pola 'recaptcha' listą pustą. Krótki, nieinwazyjny, ale dalej hack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181175094946909040-334303451321851115?l=arturgajowy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arturgajowy.blogspot.com/feeds/334303451321851115/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://arturgajowy.blogspot.com/2009/08/recaptcha-w-django-w-10-minut.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181175094946909040/posts/default/334303451321851115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181175094946909040/posts/default/334303451321851115'/><link rel='alternate' type='text/html' href='http://arturgajowy.blogspot.com/2009/08/recaptcha-w-django-w-10-minut.html' title='ReCaptcha w django w 10 minut'/><author><name>Artur Gajowy</name><uri>http://www.blogger.com/profile/07263590235259066152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181175094946909040.post-267997084358353706</id><published>2009-05-13T17:56:00.011+02:00</published><updated>2009-05-24T10:42:11.930+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='autologon'/><category scheme='http://www.blogger.com/atom/ns#' term='keyboard emulation'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='except'/><title type='text'>ssh - automatyczne logowanie - bez generowania kluczy! [linux]</title><content type='html'>Jak widać bardzo szybko zacząłem używać tego bloga także do innych celów niż wspomniane notkę niżej ;) Jak wpisać hasło bez wpisywania hasła? :) Zwłaszcza, gdy nie ma możliwości użycia &lt;span style="font-weight:bold;"&gt;klucza publicznego&lt;/span&gt;? A no tak: Będzie potrzebny program &lt;span style="font-weight: bold;"&gt;expect&lt;/span&gt;:&lt;br /&gt;&lt;blockquote&gt;sudo apt-get install expect&lt;/blockquote&gt;&lt;br /&gt;Jest to program (a właściwie język programowania...), który udaje przed innym programem (np. ssh) użytkownika wpisującego coś z klawiatury. Expect-a można używać tak jak innych języków skryptowych przy pomocy następującej magicznej pierwszej linijki:&lt;br /&gt;&lt;blockquote&gt;#!/usr/bin/expect -f&lt;/blockquote&gt;&lt;br /&gt;Całość skryptu wygląda tak:&lt;br /&gt;&lt;blockquote&gt;#!/usr/bin/expect -f&lt;br /&gt;&lt;br /&gt;#powiedzieliśmy jaki program ma być interpreterem poleceń dla tego skryptu&lt;br /&gt;&lt;br /&gt; spawn ssh twójLogin@twoj.serwer.do.zalogowania.org&lt;br /&gt; #expect uruchomi program do pogawędki&lt;br /&gt;&lt;br /&gt; sleep 2 &lt;br /&gt; #poczeka chwilkę&lt;br /&gt;&lt;br /&gt; send twojeHasło\r&lt;br /&gt; #"wpisze" hasło&lt;br /&gt;&lt;br /&gt; interact&lt;br /&gt; #przekaże sterowanie [klawiaturę] użytkownikowi &lt;/blockquote&gt;&lt;br /&gt;Ostatnia linijka jest potrzebna, żeby expect nie zakończył się po wykonaniu ostatniego polecenia (co spowodowałoby zamknięcie także naszego programu). Trzeba jeszcze tylko nadać uprawnienia uruchamiania (chmod u+x nazwa.skryptu) i można używać (wywołanie ./nazwa.skryptu zaloguje nas gdzie chcieliśmy).&lt;br /&gt;&lt;br /&gt;W moim przypadku motywacją do takiej "gimnastyki" było automatyczne zalogowanie na serwerze w celu uzyskania i utrzymania dostępu internetu (który ma się u nas tak długo, jak jest się zalogowanym na serwerze...). Poza tym serwer nie służy absolutnie do niczego i niczego więcej też nie umożliwia - stąd niespecjalnie zainteresowany byłem dalszą interakcją. Najchętniej zamknąłbym okienko konsoli, w którym wykonałem powyższy skrypt - albo przynajmniej gdzieś schował. Tu z pomocą przychodzi &lt;span style="font-weight: bold;"&gt;screen&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Screen to emulator konsoli (a.k.a. terminala). Najważniejsze jego funkcje to - jak dla mnie - uruchomienie jakiegoś programu w emulowanym okienku konsoli i ukrycie go - odłączenie (detatch). Wtedy emulowany ekran konsoli (screen) działa sobie w tle, a prawdziwą konsolę, z której screen-a uruchomiliśmy możemy nawet zamknąć.&lt;br /&gt;&lt;br /&gt;Grande finale: dodamy do &lt;s&gt;~/.bashrc&lt;/s&gt; ./bash_profile linijki, które automatycznie zalogują nas na serwerze po starcie systemu.&lt;br /&gt;&lt;blockquote&gt;#tego używałem do tej pory&lt;br /&gt;alias internet-recznie='ssh login@serwer'&lt;br /&gt;&lt;br /&gt;#a tego używam teraz&lt;br /&gt;alias internet='screen -S internet -d -m $HOME/.nazwa.skryptu'&lt;br /&gt;&lt;br /&gt;# -S internet - ustawia nazwę sesji screen na 'internet'. Nieobowiązkowe, dla porządku.&lt;br /&gt;# -d -m - utworzony screen jest od razu odłączany (detatched)&lt;br /&gt;# $HOME/.nazwa.skryptu - skrypt umieściłem w katalogu domowym (dostępnym pod $HOME) i uczyniłem plikiem ukrytym (. na początku nazwy)&lt;br /&gt;&lt;br /&gt;&lt;s&gt;# wywołanie całości machinerii&lt;br /&gt;internet&lt;/blockquote&gt;&lt;/s&gt;&lt;br /&gt;&lt;s&gt;Ponieważ .bashrc jest uruchamiane przy zalogowaniu (czyli najczęściej przy starcie systemu)&lt;/s&gt;, dobrze jest jeszcze dodać w skrypcie logującym odpowiednio długiego sleep-a, jeszcze przed "spawn ...".&lt;br /&gt;&lt;br /&gt;EDIT:&lt;br /&gt;Wbrew temu, co napisałem wcześniej, .bashrc jest uruchamiane w momencie otwarcie konsoli innej niż konsola logowania - czyli np. gdy otworzymy nowy terminal. Tak naprawdę chcielibyśmy wywołanie machinerii zrobić w jednym z plików: ~/.bash_profile, ~/.bash_login, ~/.profile - i to w tej kolejności. Gdy bash jest uruchamiany w konsoli logowania, wykona &lt;b&gt;jeden&lt;/b&gt; ze wspomnianych skryptów właśnie w tej kolejności.&lt;br /&gt;&lt;br /&gt;Jest jeszcze kilka rzeczy, które należy wiedzieć o screen: &lt;br /&gt; - powrót do odłączonego okienka: screen -d [numer / nazwa sesji, o ile jest więcej niż jedna]&lt;br /&gt; - odłączenie okienka [spoza lini komend]: [ctrl+a, d]&lt;br /&gt; - zamknięcie okienka: [ctrl+a, K]&lt;br /&gt;&lt;br /&gt;W następnej notce napiszę jak użyć ~/.bash_logout do wykonania jakiegoś polecenia w okienku podczas zamykania systemu :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181175094946909040-267997084358353706?l=arturgajowy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arturgajowy.blogspot.com/feeds/267997084358353706/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://arturgajowy.blogspot.com/2009/05/ssh-automatyczne-logowanie-bez.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181175094946909040/posts/default/267997084358353706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181175094946909040/posts/default/267997084358353706'/><link rel='alternate' type='text/html' href='http://arturgajowy.blogspot.com/2009/05/ssh-automatyczne-logowanie-bez.html' title='ssh - automatyczne logowanie - bez generowania kluczy! [linux]'/><author><name>Artur Gajowy</name><uri>http://www.blogger.com/profile/07263590235259066152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9181175094946909040.post-4506520076886176010</id><published>2009-05-11T15:37:00.001+02:00</published><updated>2009-05-13T07:49:34.264+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='workarounds'/><category scheme='http://www.blogger.com/atom/ns#' term='sens życia'/><category scheme='http://www.blogger.com/atom/ns#' term='nifty hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='cel istnienia'/><title type='text'>Cel istnienia tego bloga...</title><content type='html'>... to posiadanie &lt;a href="http://pl.wikipedia.org/wiki/Openid"&gt;OpenID&lt;/a&gt; z bloggera ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9181175094946909040-4506520076886176010?l=arturgajowy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arturgajowy.blogspot.com/feeds/4506520076886176010/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://arturgajowy.blogspot.com/2009/05/cel-istnienia-tego-bloga.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9181175094946909040/posts/default/4506520076886176010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9181175094946909040/posts/default/4506520076886176010'/><link rel='alternate' type='text/html' href='http://arturgajowy.blogspot.com/2009/05/cel-istnienia-tego-bloga.html' title='Cel istnienia tego bloga...'/><author><name>Artur Gajowy</name><uri>http://www.blogger.com/profile/07263590235259066152</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
