<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>FLLOG &#187; programowanie</title> <atom:link href="http://www.michalklich.com/category/programowanie/feed/" rel="self" type="application/rss+xml" /><link>http://www.michalklich.com</link> <description>Fedora Linux Blog</description> <lastBuildDate>Wed, 01 Jun 2011 18:44:40 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.0.4</generator> <item><title>Py4A &#8211; Python w Androidzie</title><link>http://www.michalklich.com/2011/05/25/py4a-python-w-androidzie/</link> <comments>http://www.michalklich.com/2011/05/25/py4a-python-w-androidzie/#comments</comments> <pubDate>Wed, 25 May 2011 19:04:28 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[android]]></category> <category><![CDATA[programowanie]]></category> <category><![CDATA[python]]></category> <category><![CDATA[py4a]]></category> <category><![CDATA[sl4a]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=1061</guid> <description><![CDATA[A więc kupiłeś telefon z androidem. Pierwsze dni byłeś ostrożny, tylko instalacja aplikacji i ustawianie telefonu. A potem rootujesz telefon i pierwsze mody. Po paru modach zaczyna się robić nudno trochę bo ile można brać a nic nie dawać w zamian. Znasz pythona i postanawiasz stworzyć coś swojego na telefon. I w tym miejscu przydaje [...]<p><a
href="http://www.michalklich.com/2011/05/25/py4a-python-w-androidzie/">Py4A &#8211; Python w Androidzie</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>A więc kupiłeś telefon z androidem. Pierwsze dni byłeś ostrożny, tylko instalacja aplikacji i ustawianie telefonu. A potem rootujesz telefon i pierwsze mody. Po paru modach zaczyna się robić nudno trochę bo ile można brać a nic nie dawać w zamian. Znasz pythona i postanawiasz stworzyć coś swojego na telefon. I w tym miejscu przydaje się ten krótki artykuł.<br
/> <span
id="more-1061"></span><br
/> Opiszę tutaj w jaki sposób zainstalować niezbędne programy na telefonie aby można było pisać aplikacje w pythonie. Sprawa jest banalnie prosta. Jedyne co potrzeba to telefon z androidem oraz dostęp do internetu na telefonie (najlepiej poprzez wifi, chyba że masz duże limity u operatora komórkowego) lub komputerze. Wygodniej jest użyć telefonu do pobrania aplikacji, oszczędzisz sobie kopiowania plików poprzez kabel lub bluetooth. Ok, masz wszystko? Zaczynamy.<br
/> <strong>Zanim zaczniesz instalować soft przejdź do ustawień w telefonie, do części odpowiedzialnej za aplikacje i włącz instalację programów z nieznanych źródeł.</strong><br
/> Pierwsze co jest potrzebne to SL4A (Scripting Layer for Android) czyli program który umożliwi odpalanie programów napisanych w pythonie (i nie tylko. Perl, JRuby, Lua, BeanShell, JavaScript, Tcl, oraz shelle. Autorzy planują dodać inne języki.). Otwórz <a
href="http://code.google.com/p/android-scripting/">http://code.google.com/p/android-scripting/</a> w telefonie i kliknij w w kod QR, jest duży i łatwiejszy do trafienia niż linki po lewej stronie. Plik który instalujesz to <em>sl4a_r4.apk</em>. Po instalacji w menu pojawi się SL4A ale po uruchomieniu jest pusty.<br
/> Następny krok to instalacja pythona czyli Py4A (Python for Android). Są dwie możliwości: instalacja ze strony SL4A lub ze strony Py4A gdzie umieszczona jest nowsza wersja. Jeśli wybrałeś pierwszą opcję to po lewej stronie w menu Downloads kliknij na <em>PythonForAndroid_r4.apk</em> i zainstaluj. W drugim wypadku przejdź na <a
href="http://code.google.com/p/python-for-android/">http://code.google.com/p/python-for-android/</a> i analogicznie w sekcji Downloads kliknij na <em>PythonForAndroid_r5.apk</em>.<br
/> Następny krok jest taki sam, niezależnie od wybranej wersji. W menu telefonu znajdź i odpal Python For Android, z pewnością poznasz ikonkę. Na ekranie zobaczysz wersje pythona oraz dodatków które masz zainstalowane. W tej chwili nie powinieneś mieć żadnych numerów więc trzeba wcisnąć Install i poczekać aż aplikacja pobierze i rozpakuje wszystko. Po tej operacji w SL4A w menu Scripts będą widoczne przykładowe skrypty pythonowe. Polecam odpalić parę, klikając na wybranym i wybierając ikonę terminala a następnie obejrzeć kod wybierając ikonę ołówka.<br
/> To wszystko, w następnych artykułach postaram opisać jak napisać aplikację a także jak zbudować paczkę apk. Dla niecierpliwych parę stron lektury: <a
href="http://code.google.com/p/android-scripting/wiki/AndroidFacadeAPI">opis API</a> oraz <a
href="http://code.google.com/p/android-scripting/wiki/ApiReference">lista metod API</a>.</p><p><a
href="http://www.michalklich.com/2011/05/25/py4a-python-w-androidzie/">Py4A &#8211; Python w Androidzie</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2011/05/25/py4a-python-w-androidzie/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Przedszkole w edytorze</title><link>http://www.michalklich.com/2011/05/02/przedszkole-w-edytorze/</link> <comments>http://www.michalklich.com/2011/05/02/przedszkole-w-edytorze/#comments</comments> <pubDate>Mon, 02 May 2011 09:16:39 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[programowanie]]></category> <category><![CDATA[python]]></category> <category><![CDATA[formatowanie]]></category> <category><![CDATA[pep8]]></category> <category><![CDATA[pylint]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=1030</guid> <description><![CDATA[Formatowanie kodu jest ważne. To jest fakt. Ostatnio zetknąłem się z ciekawymi próbami sprawienia aby kod był bardziej czytelny, niestety nie udało mi się opisać tego przed moim znajomym. Polecam lekturę pod którą podpisuję się obiema rękami. Ze swojej strony pragnę dodać tylko bardzo &#8222;ciekawy&#8221; sposób definiowania zmiennych albo słowników. Za pewne można użyć go [...]<p><a
href="http://www.michalklich.com/2011/05/02/przedszkole-w-edytorze/">Przedszkole w edytorze</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>Formatowanie kodu jest ważne. To jest fakt. Ostatnio zetknąłem się z ciekawymi próbami sprawienia aby kod był bardziej czytelny, niestety nie udało mi się opisać tego przed <a
href="http://rdobosz.blogspot.com/2011/04/dlaczego-ludzie-formatuja-kod.html">moim znajomym</a>. Polecam lekturę pod którą podpisuję się obiema rękami. Ze swojej strony pragnę dodać tylko bardzo &#8222;ciekawy&#8221; sposób definiowania zmiennych albo słowników. Za pewne można użyć go w innych przypadkach ale nie mam zamiaru marnować czasu na wymyślanie takich bzdur.<br
/> <span
id="more-1030"></span><br
/> Jeśli piszesz w taki sposób to robisz to źle.</p><pre class="brush: python; title: ; notranslate">
pierwsza_zmienna_od_długiej_nazwie                = 1
druga                                             = 2
trzecia_zmienna                                   = 3
czwarta_zmienna_o_długiej_nazwie_i_jeszcze_trochę = 4
</pre><p>Piękne, prawda? Ostatnią dodałem specjalnie najdłuższą aby pokazać bzdurność takiej konstrukcji. Po jej dodaniu musiałem przesunąć inne znaki przypisania w zmiennych wpisanych wcześniej!! Cóż za prostota rozwiązania.</p><pre class="brush: python; title: ; notranslate">
dict = {
'pierwsza'                                          : 1,
'druga'                                             : 2,
'trzecia_zmienna'                                   : 3,
'czwarta_zmienna_o_długiej_nazwie_i_jeszcze_trochę' : 4
}
</pre><p>Kolejny cudowny przykład.<br
/> Uważam to za błąd w każdym języku ponieważ to zaciemnia tylko kod i wymusza liczenie spacji a potem przerabianie całej konstrukcji w wypadku gdy dodaje się zmienną o dłuższej nazwie. Taka metoda musi być popularna wśród szachistów gdzie ruchy należy planować odpowiednio przed.<br
/> Proszę nie piszcie tak. Szachiści również.</p><p><a
href="http://www.michalklich.com/2011/05/02/przedszkole-w-edytorze/">Przedszkole w edytorze</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2011/05/02/przedszkole-w-edytorze/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>devs y u no pep8 in Emacs</title><link>http://www.michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/</link> <comments>http://www.michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/#comments</comments> <pubDate>Wed, 16 Feb 2011 20:19:15 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[emacs]]></category> <category><![CDATA[programowanie]]></category> <category><![CDATA[python]]></category> <category><![CDATA[pep8]]></category> <category><![CDATA[pyflakes]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=1004</guid> <description><![CDATA[Tytuł dosyć niezrozumiały ale w luźnym tłumaczeniu jest to pytanie &#8222;dlaczego nie używasz pep8 w Emacsie?&#8221;. Czym jest pep8? Jest to lista zaleceń odnośnie stylu kodowania. Tak, zgadza się, są to zalecenia więc nie są przymusowe ale na tyle logiczne oraz przemyślane, że warto je stosować. W końcu standaryzacja to nie jest nic złego jeśli [...]<p><a
href="http://www.michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/">devs y u no pep8 in Emacs</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>Tytuł dosyć niezrozumiały ale w luźnym tłumaczeniu jest to pytanie &#8222;dlaczego nie używasz pep8 w Emacsie?&#8221;. Czym jest pep8? Jest to <a
href="http://www.python.org/dev/peps/pep-0008/">lista zaleceń</a> odnośnie stylu kodowania. Tak, zgadza się, są to zalecenia więc nie są przymusowe ale na tyle logiczne oraz przemyślane, że warto je stosować. W końcu standaryzacja to nie jest nic złego jeśli jest stosowana z umiarem oraz w odpowiednim miejscu. Jeśli interesuje Cię implementacja sprawdzania składni pod kątem pep8 w locie w Emacsie to czytaj dalej.<span
id="more-1004"></span><br
/> Wpis ten nie powstałby gdybym nie zmobilizował się lub nie został zmobilizowany do ustawienia sobie emacsa pod pep8. Aby ułatwić innym (oraz sobie bo mam tendencję do zapominania, potem sięgam do swojego bloga i voila) opiszę co trzeba zrobić aby cieszyć się pięknym kodem. Dla ludzi którzy wolą jednak nabywać wiedzę w tradycyjny sposób i reguły stosować klasycznie polecam <a
href="wwd.ca/stuff/pep8_cheat.pdf">ściągawkę</a> do wydrukowania. Przejdę do rzeczy. Potrzebujesz Emacsa a do niego pep8, pyflakes oraz flymake-cursor (to modyfikacja aby informacja o błędzie pojawiała się w minibuforze). Narzędzia pep8 oraz pyflakes łatwo zainstalować przy użyciu pipy.</p><pre class="brush: bash; title: ; notranslate">pip install pep8 pyflakes</pre><p>Natomiast <a
href="http://richardriley.net/projects/emacs/dotprogramming#sec-1.5.4">flymake-cursor</a> już trzeba ręcznie skopiować i zapisać jako flymake-cursor.el na ścieżce z plikami el. Ja zapisałem w /usr/share/emacs/site-lisp. Kolejny krok to modyfikacja pliku konfiguracyjnego .emacs. Należy dokleić do niego poniższy kod.</p><pre class="brush: plain; title: ; notranslate">(add-hook 'find-file-hook 'flymake-find-file-hook)
(when (load &quot;flymake&quot; t)
  (defun flymake-pyflakes-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
               'flymake-create-temp-inplace))
       (local-file (file-relative-name
            temp-file
            (file-name-directory buffer-file-name))))
      (list &quot;pycheckers&quot;  (list local-file))))
   (add-to-list 'flymake-allowed-file-name-masks
             '(&quot;\\.py\\'&quot; flymake-pyflakes-init)))
(load-library &quot;flymake-cursor&quot;)
(global-set-key [f10] 'flymake-goto-prev-error)
(global-set-key [f11] 'flymake-goto-next-error)</pre><p>Ostatni krok to stworzyć plik o nazwie pycheckers gdzieś w PATH oraz ustawić go jako wykonywalny. W tym miejscu można skonfigurować sobie pep8, przydatne gdy wcięcia kodu nie są wielokrotnością 4.</p><pre class="brush: bash; title: ; notranslate">#!/bin/bash

pyflakes &quot;$1&quot;
pep8 --ignore=E221,E701,E202 --repeat &quot;$1&quot;
true</pre><p>Tyle wystarczy, pozostaje restart Emacsa lub M-x eval-buffer w otwartym buforze z plikiem .emacs i już można korzystać.<br
/> Całość to właściwie opis ze strony <a
href="http://www.saltycrane.com/blog/2010/05/my-emacs-python-environment/">http://www.saltycrane.com/blog/2010/05/my-emacs-python-environment/</a> i polecam zajrzeć do źródła gdzie można znaleźć parę innych smaczków do emacsa.</p><p><a
href="http://www.michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/">devs y u no pep8 in Emacs</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2011/02/16/devs-y-u-no-pep8-in-emacs/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>django: unittest</title><link>http://www.michalklich.com/2010/08/24/django-unittest/</link> <comments>http://www.michalklich.com/2010/08/24/django-unittest/#comments</comments> <pubDate>Tue, 24 Aug 2010 08:50:25 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[programowanie]]></category> <category><![CDATA[django]]></category> <category><![CDATA[python]]></category> <category><![CDATA[unittest]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=873</guid> <description><![CDATA[Django jest pisane w pythonie, python jak każdy porządny język obsługuje testy jednostkowe. A więc Django również. Dzisiaj przedstawię po krótce jak wygląda sprawa z testami w Django. Rozprawkę oprę o unittesty z tego prostego powodu, że podobają mi się bardziej niż doctesty. Nie znaczy to, że są lepsze po prostu służą do testowania innych [...]<p><a
href="http://www.michalklich.com/2010/08/24/django-unittest/">django: unittest</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>Django jest pisane w pythonie, python jak każdy porządny język obsługuje testy jednostkowe. A więc Django również. Dzisiaj przedstawię po krótce jak wygląda sprawa z testami w Django. Rozprawkę oprę o unittesty z tego prostego powodu, że podobają mi się bardziej niż doctesty. Nie znaczy to, że są lepsze po prostu służą do testowania innych przypadków, nie są pythonic ale ładnie obiektowe i ja je wolę po prostu.<br
/> <span
id="more-873"></span><br
/> Załóżmy, że masz model reprezentujący wyniki rzutów kostką do gry, do modelu jest dodana metoda sprawdzająca czy wynik jest parzysty czy nie.</p><pre class="brush: python; title: ; notranslate">
from django.db import models

class Kostka(models.Model):
    wynik = models.IntegerField()
    osoba = models.CharField(max_length = 10, default = 'Anonim')

    def _sprawdz_liczbe(self):
        if (wynik % 2):
            return 'Parzysta'
        else:
            return 'Nieparzysta'

    test_wyniku = property(_sprawdz_liczbe)
</pre><p>Na tym modelu chcemy wykonać następujące testy:</p><ul><li>Tworzenie obiektu (pole &#8216;wynik&#8217; nie posiada wartości domyślnych)</li><li>Tworzenie obiektu z wartością domyślną</li><li>Test parzystości wyniku</li></ul><p>Wszystkie testy dobrze trzymać w osobnym pliku, który nota bene jest tworzony wraz z projektem, plik <em>tests.py</em> znajduje się w katalogu aplikacji. Jest to wygodne i pozwala w łatwy sposób odnaleźć wszystkie testy w danej aplikacji. Zaczynamy od importów oraz stworzenia klasy testu.</p><pre class="brush: python; title: ; notranslate">
import unittest
from aplikacja.app.models import Kostka

class KostkaTestCase(unittest.TestCase):
</pre><p>Następnym krokiem jest przeładowanie metody <em>setUp()</em> w celu stworzenia zmiennych lub obiektów odpowiadających naszym wymaganiom. Jak w pythonie i tutaj możliwe jest przeładowanie metod <em>tearDown()</em>, <em>runTest()</em> i <em>suite()</em> ale nie jest to konieczne. W opisywanym przypadku tworzone są trzy właściwości które posłużą później do tworzenia obiektów; rzutu parzystego, nieparzystego, zwykłego rzutu oraz anonimowego rzutu testującego wartość domyślną.</p><pre class="brush: python; title: ; notranslate">
class KostkaTestCase(unittest.TestCase):
    def setUp(self):
        self.osoba = 'Michal'
        self.liczba_parzysta = 4
        self.liczba_nieparzysta = 5
</pre><p>Teraz czas na przygotowanie testów. Na pierwszy ogień idzie test tworzenia obiektu z podanymi obiema wartościami: <em>osoba</em> i <em>wynik</em>. Test powinien przejść bez żadnych problemów.</p><pre class="brush: python; title: ; notranslate">
class KostkaTestCase(unittest.TestCase):
...
    def test_tworzenie_obiektu(self):
        rzut = Kostka.objects.create(self.liczba_parzysta, self.osoba)
        self.assertTrue(rzut)
        self.assertEqual(rzut.wynik, 4)
        self.assertEqual(rzut.osoba, 'Michal')
</pre><p>Następny test to sprawdzenie czy pole osoba przyjmuje wartość domyślną.</p><pre class="brush: python; title: ; notranslate">
class KostkaTestCase(unittest.TestCase):
...
    def test_wartosci_domyslnej(self):
        rzut_anonim = Kostka.objects.create(self.liczba_parzysta)
        self.assertTrue(rzut_anonim)
        self.assertEqual(rzut_anonim.osoba, 'Anonim')
</pre><p>Kolejny test i ostatni, którego kod zaprezentuję to test parzystości. Drugi test jest analogiczny i nie widzę potrzeby umieszczania kodu. W tym przypadku nie testujemy czy obiekt został stworzony ponieważ jest to w poprzednich testach.</p><pre class="brush: python; title: ; notranslate">
class KostkaTestCase(unittest.TestCase):
...
    def test_parzystosci(self):
        rzut_parzysty = Kostka.objects.create(self.liczba_parzysta)
        self.assertEqual(rzut_parzysty.test_wyniku, 'Parzysty')
</pre><p>To wszystkie potrzebne testy, w tym momencie można je uruchomić i sprawdzić czy nasze testy lub model są poprawne. Do wykonania tego służy znany wszystkim <em>manage.py</em>.</p><pre class="brush: bash; title: ; notranslate">
./manage.py test app
</pre><p>Jeśli wszystko pójdzie dobrze to powinien ukazać się następujący listing, jeśli nie to opis błędu jest na tyle jasny (czasem stworzony przez nas), że szybko można poprawić test lub model.</p><pre class="brush: bash; title: ; notranslate">
----------------------------------------------------------------------
Ran 4 tests in 0.009s

OK
Destroying test database 'default'...
</pre><p>Jak widać jest to łatwe i przyjemne oraz w pełni zgodne z Pythonem. Koniec, wszystkim życzę 100% skuteczności wykonywanych testów.</p><p><a
href="http://www.michalklich.com/2010/08/24/django-unittest/">django: unittest</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2010/08/24/django-unittest/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>django: settings.py aplikacji w trybie devel i production</title><link>http://www.michalklich.com/2010/08/17/django-settings-py-aplikacji-w-trybie-devel-i-production/</link> <comments>http://www.michalklich.com/2010/08/17/django-settings-py-aplikacji-w-trybie-devel-i-production/#comments</comments> <pubDate>Tue, 17 Aug 2010 10:14:08 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[programowanie]]></category> <category><![CDATA[django]]></category> <category><![CDATA[settings.py]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=851</guid> <description><![CDATA[Piszesz aplikację w django, wysyłasz na serwer i musisz zmienić settings.py aby dostosowane były do wersji produkcyjnej. I tak za każdym razem, kiedy coś zmieniasz. Dodatkowo kod utrzymywany jest w systemie kontroli wersji i nie chcesz aby hasła były dostępne publicznie. Sprawa wydaje się skomplikowana ale tylko wydaje a rozwiązań jest sporo. Ja zaprezentuję to [...]<p><a
href="http://www.michalklich.com/2010/08/17/django-settings-py-aplikacji-w-trybie-devel-i-production/">django: settings.py aplikacji w trybie devel i production</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>Piszesz aplikację w django, wysyłasz na serwer i musisz zmienić settings.py aby dostosowane były do wersji produkcyjnej. I tak za każdym razem, kiedy coś zmieniasz. Dodatkowo kod utrzymywany jest w systemie kontroli wersji i nie chcesz aby hasła były dostępne publicznie. Sprawa wydaje się skomplikowana ale tylko wydaje a rozwiązań jest sporo. Ja zaprezentuję to które ja wybrałem, a może nawet wymyśliłem, bo jest ono sumą paru rozwiązań. Przyznaję, że nie jest doskonałe ale przynajmniej nie muszę ręcznie zmieniać ścieżek ani danych dostępowych do bazy danych.<br
/> <span
id="more-851"></span><br
/> Załóżmy hipotetycznie, że posiadasz dwie wersje: lokalną (deweloperską) i zdalną (produkcyjną). Lokalna używa django do serwowania plików a zdalna apacha czy nginxa lub czegoś innego. Mało ważne czego, istotną sprawą jest to, że pliki settings.py się różnią (urls.py również ale do tego wrócę pod koniec artykułu). Jest parę podejść które można sobie podejrzeć na <a
href="http://code.djangoproject.com/wiki/SplitSettings">wiki</a>. W moim przypadku zastosowałem import wielu plików settings, w zależności od wersji aplikacji. Jeśli w drodze ewolucji programistycznej zmienię sposób to nie omieszkam tego opisać (Omieszkam &#8211; trudne słowo, podobno nastolatki zbyt namiętnie używające komunikacji internetowej korzystają średnio z 800 słów. Całe szczęście nie jestem jednym ani drugim).<br
/> Posiadając dwie wersje dobrze stworzyć dwa dodatkowe pliki settings.py, powiedzmy, że będzie to settings_devel.py oraz settings_prod.py. Pamiętaj, że chcesz również ukryć hasła przed wścibskimi oczami ludźmi przeglądających Twój kod na Launchpadzie czy innym Gicie. Z pliku settings.py usuwasz dane które chcesz ukryć oraz ustawienia specyficzne dla rodzaju instalacji, np: hasła do bazy danych i flagę DEBUG. Kiedy masz już gotowe oba pliki, koniecznie <strong>usuwasz je ze swojego systemu kontroli wersji</strong> aby przypadkiem nie udostępnić ich publicznie. Należy teraz podrasować swój plik settings.py, względna ścieżka TEMPLATE_DIRS od katalogu aplikacji jest zazwyczaj taka sama więc do generowania jej możesz użyć poniższego kodu:</p><pre class="brush: python; title: ; notranslate">
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
....
TEMPLATE_DIRS = (
    BASE_DIR + '/templates/'
)
</pre><p>Dzięki temu niezależnie od wersji aplikacji ścieżka do <em>templates</em> będzie poprawna. Teraz czas na ładowanie haseł oraz innych ścieżek. To wygląda mniej przyjemnie z punktu widzenia urody kodu. Chociaż ostatni przykład do najpiękniejszych również nie należy.<br
/> Ja użyłem następującego rozwiązania. Do pliku settings.py dodałem zmienną, której wartość określa jaki plik ma zostać zaimportowany.</p><pre class="brush: python; title: ; notranslate">MODE = 'DEVEL'</pre><p>A następnie kod, który załaduje odpowiedni plik.</p><pre class="brush: python; title: ; notranslate">
if MODE == 'PROD':
    try:
        from settings_prod import *
    except:
        pass
else:
    try:
        from settings_devel import *
    except:
        pass
</pre><p>Użycie komendy else spowoduje załadowanie ustawień deweloperskich w wypadku braku MODE lub literówki, przydatne gdy masz dostęp z jednej maszyny do obu baz danych i jesteś zapominalski. Teraz pliki settings ładujesz do aplikacji i zmieniasz MODE w zależności od trybu pracy.<br
/> Wracając do pliku urls.py, a dokładnie chodzi mi o wpis</p><pre class="brush: python; title: ; notranslate">
(r'^templates/static/(?P&lt;path&gt;.*)$',
'django.views.static.serve',
{'document_root': os.path.join(os.path.dirname(__file__), '/home/michal/Projects/django/gdzie_byl_kaziu/templates/static')}),
</pre><p>W wersji produkcyjnej za serwowanie plików statycznych jest odpowiedzialny serwer www ale to też można zmodyfikować jeśli będzie taka potrzeba. Urlpatterns można rozszerzać, na przykład</p><pre class="brush: python; title: ; notranslate">
if settings.MODE == 'LOCAL':
    urlpatterns += patterns('',
                            (r'^templates/static/(?P&lt;path&gt;.*)$',
                             'django.views.static.serve',
                             {'document_root': os.path.join(os.path.dirname(__file__), '/home/user/projects/templates/static')}))
</pre><p>Zaprezentowane rozwiązanie nie jest idealne ponieważ nadal trzeba pilnować jaki tryb jest włączony ale dużo bardziej wygodne niż komentowanie całych linijek w settings.py. Z miłą chęcią przeczytam o innych sposobach rozdzielania ustawień.</p><p><a
href="http://www.michalklich.com/2010/08/17/django-settings-py-aplikacji-w-trybie-devel-i-production/">django: settings.py aplikacji w trybie devel i production</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2010/08/17/django-settings-py-aplikacji-w-trybie-devel-i-production/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Z warsztatu kodera: po co te hasła?</title><link>http://www.michalklich.com/2010/08/15/z-warsztatu-kodera-po-co-te-hasla/</link> <comments>http://www.michalklich.com/2010/08/15/z-warsztatu-kodera-po-co-te-hasla/#comments</comments> <pubDate>Sun, 15 Aug 2010 17:00:53 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[programowanie]]></category> <category><![CDATA[bazaar]]></category> <category><![CDATA[bzr]]></category> <category><![CDATA[ssh]]></category> <category><![CDATA[sshfs]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=841</guid> <description><![CDATA[Więc używasz systemu kontroli wersji, wysyłasz zmiany na serwer, pobierasz poprawki, inne branche, a wszystko to z podaniem hasła. I wreszcie trafia Cię szlag. Pomimo tego, że wpisanie hasła (po 10000 prób) zajmuje Ci mniej niż 1s jest to zmarnowana sekunda. Skoro używasz vcs czy dvcs to znaczy, że szanujesz swój czas a wpisywanie hasła [...]<p><a
href="http://www.michalklich.com/2010/08/15/z-warsztatu-kodera-po-co-te-hasla/">Z warsztatu kodera: po co te hasła?</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>Więc używasz systemu kontroli wersji, wysyłasz zmiany na serwer, pobierasz poprawki, inne branche, a wszystko to z podaniem hasła. I wreszcie trafia Cię szlag. Pomimo tego, że wpisanie hasła (po 10000 prób) zajmuje Ci mniej niż 1s jest to zmarnowana sekunda. Skoro używasz vcs czy dvcs to znaczy, że szanujesz swój czas a wpisywanie hasła w takich ilościach jest nieekonomiczne i należy to zmienić.<br
/> <span
id="more-841"></span><br
/> Jest parę sposobów aby to osiągnąć. Z powodów bezpieczeństwa pominę jeden który polega na umieszczeniu hasła jawnym tekstem w URlu. Nie uznaję tego nawet jako ostatecznej deski ratunku, no może gdybym miał problemy z nadgarstkami i chciał zmniejszyć mój przebieg na klawiaturze. Przejdźmy do sedna.</p><ul><li>ssh</li><p>To naprawdę proste, wymieniamy się po prostu kluczami z serwerem gdzie leży nasz cenny kod. Pierwsze czego potrzeba to para kluczy publiczny/prywatny. Można je wygenerować poleceniem</p><pre class="brush: plain; title: ; notranslate">ssh-keygen -t rsa</pre><p>Następnie kod publiczny należy dołączyć do pliku <em>authorized_keys</em> na serwerze. Napisałem &#8222;dołączyć&#8221; bo mogą tam być już inne klucze.</p><pre class="brush: bash; title: ; notranslate">cat ~/.ssh/id_rsa.pub | ssh login@serwer 'cat - &gt;&gt; ~/.ssh/authorized_keys'</pre><p>Po tej operacji wystarczy sprawdzić czy operacja się udała i zalogować się</p><pre class="brush: plain; title: ; notranslate">ssh login@serwer</pre><li>sshfs</li><p>Kolejny sposób to zamontowanie zdalnego folderu u siebie, można to osiągnąć poprzez sshfs. Nie wygląda jakby ten pakiet był instalowany domyślnie, a dokładniej to ja go nie miałem. Znajduje się on w paczce o nazwie fuse-sshfs. Po instalacji wystarczy zamontować zdalny zasób poleceniem.</p><pre class="brush: bash; title: ; notranslate">sshfs -oworkaround=rename,follow_symlinks login@serwer:/zdalna/sciezka/ /lokalna/sciezka</pre><p>Użyłem follow_symlinks na wpadek gdyby w zamontowanym folderze były jakieś linki, nie powinno się to zdarzyć jeśli linkujesz do kodu, ale na wszelki wypadek. Ta metoda pyta o hasło tylko raz. Następnie można już używać <em>bzr</em> na tym zamontowanym zasobie.</p><pre class="brush: bash; title: ; notranslate">
bzr pull /lokalna/sciezka
bzr push /lokalna/sciezka
</pre><p>Odmontowanie zasobu nastąpi po wykonaniu</p><pre class="brush: bash; title: ; notranslate">
fusermount -u /sciezka/lokalna
</pre><p>lub</p><pre class="brush: bash; title: ; notranslate">
umount /sciezka/lokalna
</pre></ul><p>Mam nadzieję, że ułatwi to życie tym, którzy mają po dziurki w nosie wpisywania swojego hasła.<br
/> P.S.<br
/> Tak, trafił mnie szlag więc napisałem żeby innym oszczędzić nerwów.</p><p><a
href="http://www.michalklich.com/2010/08/15/z-warsztatu-kodera-po-co-te-hasla/">Z warsztatu kodera: po co te hasła?</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2010/08/15/z-warsztatu-kodera-po-co-te-hasla/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Z warsztatu kodera: bzr push-and-update</title><link>http://www.michalklich.com/2010/08/14/z-warsztatu-kodera-bzr-push-and-update/</link> <comments>http://www.michalklich.com/2010/08/14/z-warsztatu-kodera-bzr-push-and-update/#comments</comments> <pubDate>Sat, 14 Aug 2010 22:36:17 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[programowanie]]></category> <category><![CDATA[bazaar]]></category> <category><![CDATA[bzr]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=831</guid> <description><![CDATA[Bazaar jest w porządku, a skoro jest to należy go używać. Nie musi to być super przyjemne jeśli masz swój kod na serwerze i tam wysyłasz zmiany. Nie piszę o Launchpadzie tylko o własnym serwerze np: z dostępem ftp. Uciążliwym jest po każdym commicie logowanie przez ssh i odpalanie bzr up. Już pisałem jaki fajny [...]<p><a
href="http://www.michalklich.com/2010/08/14/z-warsztatu-kodera-bzr-push-and-update/">Z warsztatu kodera: bzr push-and-update</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>Bazaar jest w porządku, a skoro jest to należy go używać. Nie musi to być super przyjemne jeśli masz swój kod na serwerze i tam wysyłasz zmiany. Nie piszę o Launchpadzie tylko o własnym serwerze np: z dostępem ftp. Uciążliwym jest po każdym commicie logowanie przez ssh i odpalanie <em>bzr up</em>. Już pisałem jaki fajny jest bazaar? A to dlatego, że posiada pluginy. Z odsieczą programistom idzie plugin, którego nazwa jest w tytule posta a mianowicie <a
href="http://doc.bazaar.canonical.com/plugins/en/push-and-update-plugin.html">push-and-update</a>. Jak działa? Po każdym poleceniu push, sprawdza czy na serwerze znajduje się branch wymagający wykonania polecenia <em>bzr up</em> i jeśli tak to loguje się przez ssh aby je wykonać. Proste i skuteczne. Instalacja jest równie prosta, wszystkie informacje można znaleźć <a
href="http://doc.bazaar.canonical.com/plugins/en/plugin-installation.html">tutaj</a>, a dla leniwych poniżej podaję przepis na instalację na koncie użytkownika.</p><pre class="brush: bash; title: ; notranslate">bzr branch lp:bzr-push-and-update ~/.bazaar/plugins/push_and_update</pre><p>Po commicie wystarczy <em>bzr push</em>. Uciążliwe może się stać wklepywanie haseł, ale jest to lepsze niż przeglądanie historii poleceń konsoli lub wpisywanie litanii <em>ssh looser@serwer&#8230;</em> od nowa.</p><p><a
href="http://www.michalklich.com/2010/08/14/z-warsztatu-kodera-bzr-push-and-update/">Z warsztatu kodera: bzr push-and-update</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2010/08/14/z-warsztatu-kodera-bzr-push-and-update/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>django-extensions w repo devilish</title><link>http://www.michalklich.com/2010/08/06/django-extensions-w-repo-devilish/</link> <comments>http://www.michalklich.com/2010/08/06/django-extensions-w-repo-devilish/#comments</comments> <pubDate>Fri, 06 Aug 2010 11:35:21 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[open source]]></category> <category><![CDATA[programowanie]]></category> <category><![CDATA[django]]></category> <category><![CDATA[django-extensions]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=786</guid> <description><![CDATA[Zapewne słyszeliście o django-extensions, jeśli nie to możecie przeczytać a nawet usłyszeć i obejrzeć co nie co: tutaj po polsku, tutaj po angielsku (stara strona, aktualnie kod na github, ale przynajmniej jest tutaj treść w postaci html. Github posiada tylko pliki z dokumentacją) a w tym miejscu screencast po angielsku. Ja szczerze mówiąc o aplikacji [...]<p><a
href="http://www.michalklich.com/2010/08/06/django-extensions-w-repo-devilish/">django-extensions w repo devilish</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>Zapewne słyszeliście o django-extensions, jeśli nie to możecie przeczytać a nawet usłyszeć i obejrzeć co nie co: <a
href="http://www.forgottenlabs.com/2010/03/wtyczki-pluginy-kompontenty-%e2%80%93-czyli-aplikacje-wielokrotnego-uzytku-w-django-odcinek-1-django_extensions/">tutaj po polsku</a>, <a
href="http://code.google.com/p/django-command-extensions/">tutaj po angielsku</a> (stara strona, aktualnie kod na github, ale przynajmniej jest tutaj treść w postaci html. Github posiada tylko pliki z dokumentacją) a w tym miejscu <a
href="http://ericholscher.com/blog/2008/sep/12/screencast-django-command-extensions/">screencast po angielsku</a>. Ja szczerze mówiąc o aplikacji dowiedziałem się niedawno i po prostu nie mogę uwierzyć jak ja mogłem bez tego żyć! Teraz nie mogę.<br
/> Wspominam o samym django-extensions z jednego powodu, nie po to aby się pochwalić, ale aby poinformować, że od dzisiaj paczka rpm jest w zewnętrznym repo <a
href="http://baseroot.info/">http://baseroot.info/</a>. Kod jest świeży, prosto z github`a. Repo instalujemy</p><pre class="brush: bash; title: ; notranslate">su -c 'cd /etc/yum.repos.d/ &amp;&amp; wget baseroot.info/devilish.repo'</pre><p>A potem już tradycyjnie</p><pre class="brush: bash; title: ; notranslate">sudo yum install django-extensions</pre><p>.<br
/> Następnie dodajemy django-extensions do pliku settings i jazda. Podpowiem jedną komendę</p><pre class="brush: python; title: ; notranslate">./manage.py shell_plus</pre><p>Resztę można odnaleźć w dokumentacji, do której odsyłam.<br
/> Pokój.</p><p><a
href="http://www.michalklich.com/2010/08/06/django-extensions-w-repo-devilish/">django-extensions w repo devilish</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2010/08/06/django-extensions-w-repo-devilish/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Dajax odpicuje Django!</title><link>http://www.michalklich.com/2010/08/05/dajax-odpicuje-django/</link> <comments>http://www.michalklich.com/2010/08/05/dajax-odpicuje-django/#comments</comments> <pubDate>Thu, 05 Aug 2010 19:28:44 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[programowanie]]></category> <category><![CDATA[dajax]]></category> <category><![CDATA[django]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=768</guid> <description><![CDATA[Jestem fanem Django. Obiecałem, że opiszę jak odpicować aplikację zrobioną przy użyciu Django. Dzisiaj opiszę jak zaimplementować ajax przy użyciu Dajax (abstrahując to ich logo jest naprawdę dobre). Przechodzimy do rzeczy, opisane krok po kroku jak zainstalować i zaimplementować. Ja kod dodatkowych aplikacji trzymam w katalogu projektu zamiast je instalować i mogę się do nich [...]<p><a
href="http://www.michalklich.com/2010/08/05/dajax-odpicuje-django/">Dajax odpicuje Django!</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p><strong>Jestem fanem Django</strong>. Obiecałem, że opiszę jak odpicować aplikację zrobioną przy użyciu <a
href="http://www.djangoproject.com/">Django</a>. Dzisiaj opiszę jak zaimplementować ajax przy użyciu <a
href="http://dajaxproject.com/">Dajax</a> (abstrahując to ich logo jest naprawdę dobre). Przechodzimy do rzeczy, opisane krok po kroku jak zainstalować i zaimplementować.<span
id="more-768"></span><br
/> Ja kod dodatkowych aplikacji trzymam w katalogu projektu zamiast je instalować i mogę się do nich odwoływać w settings.py tak samo jakby były zainstalowane. Jest to dla mnie wygodniejsze bo mogę je po prostu przenieść na serwer bez uprzedniej instalacji i tak w tym tutorialu postąpię. Z miłą chęcią posłucham uwag jeśli ktoś robi inaczej bo człowiek całe życie się uczy.</p><ol><li>Instalacja Dajaxice</li><p>Pobieramy kod ze strony <a
href="http://github.com/jorgebastida/django-dajaxice/downloads">http://github.com/jorgebastida/django-dajaxice/downloads</a> i rozpakowujemy do katalogu z aplikacją. Następnie edytujemy plik settings.py naszego projektu i dodajemy dajaxice do listy aplikacji.</p><pre class="brush: python; title: ; notranslate">INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'dajaxice',
...)</pre><p>Następnie upewniamy się, że TEMPLATE_LOADERS w tym samym pliku wygląda tak</p><pre class="brush: python; title: ; notranslate">TEMPLATE_LOADERS = (
	'django.template.loaders.filesystem.load_template_source',
	'django.template.loaders.app_directories.load_template_source',
	'django.template.loaders.eggs.load_template_source',
)</pre><p>Ostatni wpis w pliku settings.py wygląda tak</p><pre class="brush: python; title: ; notranslate">DAJAXICE_MEDIA_PREFIX=&quot;dajaxice&quot;</pre><p>Co stworzy nam adres o postaci http://www.domena.pl/dajaxice. Zostawiamy ten plik i przechodzimy do urls.py. Ten wpis nie jest do końca potrzebny, ja go nie posiadam i u mnie działa to bezbłędnie.</p><pre class="brush: python; title: ; notranslate">
from dajaxice.core import dajaxice_autodiscover
dajaxice_autodiscover()
</pre><p>Dodajemy linijkę do listy urli aby to mogło zadziałać</p><pre class="brush: python; title: ; notranslate">(r'^%s/' % settings.DAJAXICE_MEDIA_PREFIX, include('dajaxice.urls')),</pre><p>oraz import</p><pre class="brush: python; title: ; notranslate">
from django.conf import settings
</pre><p>Koniec instalacji dajaxice. Kolejny element do dajax.</p><li>Instalacja Dajax</li><p>Kod jest do pobrania ze strony <a
href="http://github.com/jorgebastida/django-dajax/downloads">http://github.com/jorgebastida/django-dajax/downloads</a>. Rozpakowujemy i dorzucamy wpis do settings.py.</p><pre class="brush: python; title: ; notranslate">INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'dajaxice',
    'dajax',
    ...
)</pre><p>Koniec instalacji, teraz przechodzimy do mięsa czyli jak to wszystko zakodować.</p><li>KOD</li><p>Zakładam, że posiadasz jakąś aplikację w której chcesz dołożyć dajax. W swoim pliku bazowym, tym którego używasz w tagu {%extends%} dołóż dwa dodatkowe tagi (oczywiście, jeśli chcesz korzystać z dobrodziejstw Dajax na wszystkich swoich podstronach)</p><pre class="brush: python; title: ; notranslate">{% load dajaxice_templatetags %}</pre><p>oraz w <em>head</em></p><pre class="brush: python; title: ; notranslate">{% dajaxice_js_import %}</pre><p>a także import wybranego przez Ciebie pliku, w zależności od używanego frameworka js. Może to być jQuery, Prototype, MooTools lub Dojo.<br
/> Import oczywiście należy wsadzić do <em>head</em>. Ja wybrałem jQuery.</p><pre class="brush: xml; title: ; notranslate">&lt;script src=&quot;{{ MEDIA_URL }}/js/jquery.dajax.core.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;</pre><p> Powyższy plik znajduje się w katalogu z instalacją dajax i należy go skopiować do swojego katalogu site_media.<br
/> Już prawie koniec, jedyna rzecz jaka pozostała to napisać trochę kodu pythona odpowiedzialnego za ajax. Autorzy i ja się dołączam do nich radzą cały kod umieszczać w pliku ajax.py. Podam przykład funkcji dodającej dwie liczby, oczywiście możliwości są nieskończone.</p><pre class="brush: python; title: ; notranslate">
def dodawanie(request, a, b):
    dajax = Dajax()
    result = int(a) + int(b)
    dajax.assign('#koniec','value',str(result))
    return dajax.json()</pre><p>dajax.assign przypisze do obiektu DOM o id równym wynik wartość zmiennej result która jest wynikiem funkcji dodawanie. <em>Zachęcam do obejrzenia pliku dajax.core.js, odpowiedniego dla wybranego frameworka aby dowiedzieć się jakie jeszcze funkcje są dostępne.</em><br
/> Funkcję wywołujemy z poziomu javascript wpisując po prostu</p><pre class="brush: jscript; title: ; notranslate">Dajaxice.aplikacja.funkcja('Dajax.process', {'a': wartosc1, 'b': wartosc2})</pre><p>Każda funkcja stworzona przez nas w ajax.py musi znaleźć się w pliku settings.py. W tym wypadku będzie to wyglądać tak:</p><pre class="brush: python; title: ; notranslate">
DAJAXICE_FUNCTIONS = (
    'aplikacja.ajax.nazwa_funkcji'
)
</pre></ol><p>Koniec. W tym momencie powinieneś wiedzieć jak zaimplementować Dajax i cieszyć się odpicowanym Django. Jeśli nie rozumiesz to ja się nie zdziwię bo kiepski ze mnie nauczyciel. Wszelkie pytania proszę zamieszczać w komentarzach, postaram się na nie odpowiedzieć w miarę moich skromnych możliwości.<br
/> Pokój</p><p><a
href="http://www.michalklich.com/2010/08/05/dajax-odpicuje-django/">Dajax odpicuje Django!</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2010/08/05/dajax-odpicuje-django/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Dajax i jquery 1.4.2</title><link>http://www.michalklich.com/2010/07/05/dajax-i-jquery-1-4-2/</link> <comments>http://www.michalklich.com/2010/07/05/dajax-i-jquery-1-4-2/#comments</comments> <pubDate>Mon, 05 Jul 2010 21:28:11 +0000</pubDate> <dc:creator>Michał</dc:creator> <category><![CDATA[fedora]]></category> <category><![CDATA[programowanie]]></category> <category><![CDATA[dajax]]></category> <category><![CDATA[django]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[jquery]]></category> <category><![CDATA[python]]></category><guid
isPermaLink="false">http://www.michalklich.com/?p=751</guid> <description><![CDATA[Siedzę nad dużą aktualizacją mojego amatorskiego projektu www.gdziebylkaziu.pl i zaplanowałem sobie dorzucić trochę ajaxa do map google. Szperając po internecie znalazłem http://dajaxproject.com i zakochałem się, dzięki temu mogę wszystkie proste funkcjonalności ajax napisać w &#8230; pythonie! Cieszę się ponieważ pomimo tego, że javascript jest ok to wolę pythona, oj wolę. Przechodzimy do rzeczy. Ostrzegam rozwiązanie [...]<p><a
href="http://www.michalklich.com/2010/07/05/dajax-i-jquery-1-4-2/">Dajax i jquery 1.4.2</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></description> <content:encoded><![CDATA[<p>Siedzę nad dużą aktualizacją mojego amatorskiego projektu <a
href="http://www.gdziebylkaziu.pl" target="_self">www.gdziebylkaziu.pl</a> i zaplanowałem sobie dorzucić trochę ajaxa do map google. Szperając po internecie znalazłem <a
href="http://dajaxproject.com/">http://dajaxproject.com</a> i zakochałem się, dzięki temu mogę wszystkie proste funkcjonalności ajax napisać w &#8230; pythonie! <img
src='http://www.michalklich.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Cieszę się ponieważ pomimo tego, że javascript jest ok to wolę pythona, oj wolę. Przechodzimy do rzeczy. Ostrzegam rozwiązanie jest banalne i pewnie wiele osób na to wpadło.<span
id="more-751"></span>Na stronie <a
href="http://wiki.github.com/jorgebastida/django-dajax/" target="_self">dajaxproject</a> jak byk stoi, że wspierane są biblioteki jQuery 1.3.2 ale ja jestem niedowiarkiem, po prostu uważałem, że zmiany w stosunku do wersji 1.4.2 nie są aż tak duże. No ale się pomyliłem bo nie chciało działać. Funkcje jQuery <em>addClass()</em> lub <em>removeClass()</em> były wykonywane ale z parametrem którego nie akceptowały (zbadałem i wersja 1.3.2 nie ma takiego problemu). Rozwiązanie było proste jak drut a mianowicie skonwertować obiekty do łańcucha znaków czyli <em>toString()</em>. A teraz gdzie to zmieniamy, kod znajduje się w pliku <em>jquery.dajax.core.js</em>. Szukamy linijek</p><pre class="brush: jscript; title: ; notranslate">case 'addcc':
case 'remcc':
</pre><p>I do wywołań funkcji <em>addClass()</em> oraz <em>removeClass()</em> dodajemy <em>toString()</em></p><pre class="brush: jscript; title: ; notranslate">
case 'addcc':
jQuery.each(elem.val,function(){
$(elem.id).addClass(this.toString());
});
break;

case 'remcc':
jQuery.each(elem.val,function(){
$(elem.id).removeClass(this.toString());
});
break;
</pre><p>Prawda, że banalne. Następnie opiszę w jaki sposób używać dajax, jest to równie proste jak ten fix.</p><p><a
href="http://www.michalklich.com/2010/07/05/dajax-i-jquery-1-4-2/">Dajax i jquery 1.4.2</a> to wpis z <a
href="http://www.michalklich.com">FLLOGa</a></p> ]]></content:encoded> <wfw:commentRss>http://www.michalklich.com/2010/07/05/dajax-i-jquery-1-4-2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Served from: www.michalklich.com @ 2012-02-08 11:37:21 by W3 Total Cache -->
