Głupie zachowanie MySQL

Opublikowane przez Jarosław Zabiełło Sun, 31 Dec 2006 04:16:00 GMT

Jak ktoś chce się pośmiać z MySQL, to niech zajrzy tutaj. Sprawdzałem nawet na najnowszym stabilnym MySQL 5.0.27. Czasem można dodać rekord o tym samym kluczu głównym, a czasem nie można. Po prostu obciach.

Tagi  | 10 comments

Pylons 0.9.4

Opublikowane przez Jarosław Zabiełło Sun, 31 Dec 2006 01:40:00 GMT

Wyszła nowa wersja pythonowego megaframeworka (korzysta z zewn., już istniejących bibliotek) do szybkiego budowania aplikacji webowych – Pylons. W wersji 0.9.4 dodano trochę poprawek i ulepszeń. M.in. jest nowy Routes 1.6.1, ulepszono introspekcję dla XML-RPC,Akcje kontrolerów są teraz generatorami a helpery oraz metoda _ (z gettext) generują teraz obiekty Unicodowe zamiast stringów UTF-8. Znowu Pylons znacznie wyprzedza, to co dopiero jest w powijakach dla Django.

SQLAlchemy

Coraz bardziej zaznacza się tendencja w używanych pod Pythonem ORM’ach (Pylons może korzystać z dowolnych) aby zamiast SQLObject wybierać raczej SQLAlchemy. Ten drugi jest uważany za znacznie bardziej wyrafinowany i o większych możliwościach. Na liście dyskusyjnej Pylonsów Ben Bangert pokazał jak w praktyce można używać SQLAlchemy.

Szablony

Pylons potrafi korzystać z dowolnych systemów szablonów dostępnych dla Pythona. Generalnie, popularne są dwa podejścia. Szablony pisane pod propgramistów lub pod webmasterów/designerów, którzy zajmują się samą kwestią prezentacji, wizualizacji i pracują najczęściej ze “wspomagaczami” takimi jak edytor Dreamweaver.

Dla tych drugich, polecane jest podejście albo takie jak promuje Django, czyli specjalnie uproszczony język szablonów umożliwiającym generowanie zaróno HTML jak i CSS, czy innej dowolnej treści.

Albo podejście jeszcze bardziej uproszczone (dla designerów, nie dla programistów), czyli koncepcja, jaką promują twórcy frameworka Zope. Chodzi o szablony ZPT, Kid czy Genshi gdzie logika szablonów jest dodana do atrybutów. Dzięki temu są one przezroczyste dla edytorów takich jak Dreamweaver i jeśli wymagana jest częsta konsultacja z designerami to takie podejście oszczędza ponownego, ręcznego dodawania logiki dla programistów.

Nadchodzi Mako

Moim zdaniem, znacznie lepszym podejściem jest podejście jakie oferują szablony Cheetah czy Myghty. Te drugie, są aktualnie najpoteżniejsze. Mają nie tylko duża szybkość, ale bardzo dobrze działający (lepszy od Cheetah) cache oraz łatwość do tworzenia komponentów, klocków wielokrotnego użycia.

Nadchodzi jednak coś jeszcze lepszego. Developerzy Pylonsów szykują zupełnie nowy system szablonów zwany Mako (http://makotemplates.org). Jest on wzorowany na najlepszych funkcjach jakie oferują Myghty, Cheetah, Genshi i Django. Jest też bardzo szybki.

Mako oferują wielostrefowe dziedziczenie (podobnie jak Cheetah i Django). Nie jest też wymagane tak jak w Myghty, aby wstawki Pythona (zaczynające się w szablonach Myghty od znaku procenta) zaczynały wiersz. Można wstawiać je w środku tekstu lub gdziekolwiek w ramach tagów <% kod Pythona %>.

<%inherit file="base.html"/>
<%
    rows = [[v for v in range(0,10)] for row in range(0,10)]
%>
<table>
    % for row in rows:
        ${makerow(row)}
    % endfor
</table>

<%def name="makerow(row)">
    <tr>
    % for name in row:
        <td>${name}</td>\
    % endfor
    </tr>
</%def>

Unikalne dziedziczenie dynamiczne (zmienna może określać które szablony mają być bazowymi dla innych). Szablony mogą być też buforowane. Można wygodnie filtrować dane w stylu Django (Python) czy Smarty (PHP).

<%!
    def myescape(text):
        return "<TAG>" + text + "</TAG>"
%>

Heres some tagged text: ${"text" | myescape}

Oczywiście można dowolny element szablonów keszować na wiele sposobów.

<%def name="mycomp" cache="true" cache_timeout="30" cache_type="memory">
    other text
</%def>

Pylons 0.9.4 ma już wbudowaną obsługę dla Mako. Wystarczy je ściągnąć z SVN:

svn co http://svn.makotemplates.org/mako/trunk mako

Po zainstalowaniu, jedyne co trzeba, to dodać opcję

template_engine='mako' 

do wywołania config.init_app w middleware.py.

Posted in  | Tagi , , ,  | 1 comment

Google AdSense sucks

Opublikowane przez Jarosław Zabiełło Tue, 26 Dec 2006 22:26:00 GMT

Firma Google zaczyna obrastać w arogancję typową dla mentalności monopolistów. Myślałem że to może ja mam pecha, ale okazuje się że takich osób jest dużo więcej.

Otóż Google banuje znienacka konta AdSense bez żadnych ostrzeżeń i bez najmniejszych szans na uzyskanie konkretnych wyjaśnień. Po prostu, nagle, z dnia na dzień, konto AdSense jest zablokowane. Wielkie G* ogóle nie wysyła wcześniej żadnych ostrzeżeń. Nie podaje też żadnych konkretów. Nawet nie raczą wyjaśnić o jaki serwis chodzi. Oczywiście możesz wysłać reklamację, ale to strata czasu, bo i tak cię zignorują. Zresztą trudno jest udowodnić, że nie jest się wielbłądem, prawda? A Google najwyraźniej tego się domaga. Żałosne.

Dowiesz się co najwyżej z automatycznie generowanego maila że “na twoim serwisie miały miejsce nieważne kliknięcia”. Żeby było bardziej idiotycznie, nie mają najmniejszej ochoty aby wyjaśnić o jaki serwis im chodzi. W wypadku jak podpinałeś AdSense do kilku serwisów to nawet nie wiesz o jaki serwis im chodzi. Nie dają ci żadnych szans obrony. A konto blokują permanentnie, bez możliwości założenia nowego, bez ostrzeżeń, bez konkretnych wyjaśnień. Po prostu mentalność buca.

Dlatego może warto zrobić użytek z pluginu AdBlock jaki jest dostępny dla przeglądarki Firefox. Plugin ten ślicznie filtruje wszystkie reklamowe śmieci. Googlowy AdSense wyfiltrujemy najlepiej dodając całą domenę (ze znakiem gwiazdki na końcu który oznacza dowolne znaki dalej):

pagead2.googlesyndication.com*

Niech sobie szukają gdzie indziej frajerów. Dla mnie AdSense już więcej nie istnieje.

Aktualizacja 2009-08-06. Można wyłaczyć reklamy AdSense w GMailu za pomocą sentencji I enjoy the massacre of ads. This sentence will slaughter ads without a messy bloodbath. (źródło)

Tagi ,  | 11 comments

Python 2.5 - mod_python, MySQLdb i PythonWin

Opublikowane przez Jarosław Zabiełło Tue, 26 Dec 2006 03:55:00 GMT

W końcu nie ma już chyba powodu aby nie używać nowego Pythona 2.5 pod windowsami. Od niedawna jest dostępna binarna instalka mod_pythona dla Apache 2.2. Jest też binarna instalka MySQLdb. Mimo że firma ActiveState coś zasnęła i zatrzymała się na razie na Pythonie 2.4.3, można sobie ściągnąć oddzielnie edytor PythonWin. Jest bardzo szybki i wygodny.

Posted in  | Tagi  | brak comments

Unikanie niebezpiecznych danych w szablonach RHTML

Opublikowane przez Jarosław Zabiełło Mon, 25 Dec 2006 00:14:00 GMT

W wypadku treści wyświetlanych w szablonach najlepiej zachować zasadę ograniczonego zaufania. Np. jeśli wyświetlamy zawartość komentarzy które ktoś wysłał z formularza, to przy odrobinie złośliwości i/lub głupoty taki użyszkodnik może nam wysłać kod HTML lub JavaScript, który popsuje spójność naszej strony. Generalnie istnieje kilka metod aby się przed tym zabezpieczyć.

  • Wszelkie treści podejrzane o możliwość wysłania kodu HTML wyświetlaj przez funkcję filtrującą html_escape() (lub w skrócie: h) Czyli zamiast <= jakies_dane %> należy używać <=h jakies_dane %> i dobrze aby ten zwyczaj wszedł nam w krew. Dzięki temu helperowi wszelkie dane zawierające znaczniki zostaną wymienione na encje HTML (np. zamiast < będzie &lt; co w efekcie uniemożliwi interpretację takich znaków jako tagów HTML)]
  • W wypadku kiedy potrzebujemy kodu HTML, ale nie chcemy aby zawierał ukryte wstawki w języku JavaScript, dane filtrujemy przez funkcję sanitize(). Wszystkie akcje onXXX oraz linki zaczynające się od javascript: powinny zostać usunięte.
  • W wypadku kiedy chcemy udostępnić użyszkodnikom możliwość wprowadzania treści z możliwością formatowania tekstu, zamiast HTML można udostępnić im możliwość wprowadzania tekstu w formacie Markdown (BlueCloth) lub Textile (RedCloth). To specjalny, uproszczony sposób formatowania tekstu, który jest zamieniany na bezpieczny i dobrze sformułowany kod HTML. Rails posiada wbudowane helpery do ich obsługi (są zdefiniowane w module ActionView::Helpers::TextHelper)
  • Ostatecznie można wyciąć wszystkie znaczniki HTML za pomocą helpera strip_tags().

Aby Rails mógł używać helpery textilize() i markdown() trzeba je doinstalować

gem install RedCloth
gem install BlueCloth

Następnie w pliku config/environment.rb dodać kod:

  require_gem 'RedCloth' 
  require_gem 'BlueCloth'

Przykład użycia:

<%= textilize '"Polskie forum":http://forum.rubyonrails.pl dla RoR.' %>
<%= markdown 'Strona Rubiego [po polsku](http://ruby-lang.org/pl).' %>

Wygenerowany kod HTML:

<p><a href="http://forum.rubyonrails.pl">Polskie forum</a> dla RoR.</p> 
<p>Strona Rubiego <a href="http://ruby-lang.org/pl">po polsku</a>.</p>

Posted in  | Tagi  | 1 comment

Własne konfiguracje w Rails

Opublikowane przez Jarosław Zabiełło Sun, 24 Dec 2006 01:51:00 GMT

W Rails domyślnym miejscem do ustawienia swoich dodatkowych konfiguracji jest plik conf/environment.rb. Jednak wygodniejszym sposobem jest użycie formatu YAML. Np. załóżmy, że pliku config/defaults.yml mamy następujące ustawienia:

default: &defaults
  paging: 10

development:
  show_debugs: true
  paging: 20
  <<: *defaults

production:
  show_debugs: false
  <<: *defaults

Wykorzystałem tu zasadę DRY (unikania powtarzania kodu) stąd sekcja ‘default’ która zawiera wspólne ustawienia dla Railsów pracujących zarówno w trybie roboczym (developerskim) jak i produkcyjnym. Aby ten plik był wciągany i to zgodnie z bieżącym trybem pracy Railsów, do pliku config/environment.rb należy dodać:

require 'ostruct'
yml = YAML.load_file RAILS_ROOT + '/config/defaults.yml'
$defaults = OpenStruct.new(yml).send RAILS_ENV

Do naszej aplikacji RoR zostanie dodana zmienna globalna $defaults, W wypadku pracy w trybie produkcyjnym, zmienna $defaults zawiera hasz z wartościami:

{"paging"=>10, "show_debugs"=>false}

Zamiast użycia zmiennej globalnej, można użyć

::AppConfig = OpenStruct.new(yml).send RAILS_ENV

dzięki temu mamy dostęp do poszczególnych parametrów za pomocą notacji kropkowej:

puts AppConfig.paging # => 10

Posted in  | Tagi  | brak comments

Skype3 i polski czat dla Railsów, Django i Pylonsa

Opublikowane przez Jarosław Zabiełło Thu, 14 Dec 2006 23:48:00 GMT

Nowy Skype 3 wprowadza małą rewolucję w stos. do poprzedniej wersji. Można nie tylko rozmawiać, ale pograć w szachy, kółko i krzyżyk i inne gry (są b. ładnie zrobione we Flashu 9). Można nagrywać rozmowy na dysk. Można tworzyć publiczne czaty. I właśnie w tej sprawie piszę ten tekst bo stworzyłem polski czat dla miłośników frameworków Ruby on Rails, Django i Pylons. Wygodniej jest czasem skonsultować coś w czasie rzeczywistym niż na grupie czy forum dyskusyjnym.

Posted in , , , , ,  | Tagi , ,  | 17 comments

Ruby on Rails w W-wie

Opublikowane przez Jarosław Zabiełło Fri, 01 Dec 2006 16:17:00 GMT

11 grudnia w Warszawie odbędzie się kolejne spotkanie dla osób zainteresowanych Ruby on Rails, rozwojem internetu i e-biznesem. Szczegóły tutaj.

Posted in  | Tagi ,  | brak comments

PickAxe2 po polsku

Opublikowane przez Jarosław Zabiełło Fri, 01 Dec 2006 00:47:00 GMT

Mimo że o języku Ruby mówi się szerzej raczej od niedawna, ilość książek i dokumentacji dostępnej do Rubiego zdążyły już pobić to, co zostało napisane dla języka Python i stale się powiększa. Trudno aby taką sytuację nie wykorzystały polskie firmy wydawnicze.

Jeszcze w grudniu 2006 powinna pojawić się w księgarniach polska wersja kultowej książki na temat Rubiego – tzw. PickAxe21 czyli Programming Ruby: The Pragmatic Programmers. Pierwsze wydanie tej książki przyczyniło się w znacznej mierze do popularyzacji języka poza Japonią. Jest ono dostępne darmo w internecie. Część druga, poza tym, że jest znacznie obszerniejsza, i uwzględnia nowości w języku w stos. do starego wydania z 1993 roku.

1 Nazwa PickAxe pochodzi od charakterystycznej okładki z kilofem (ang. pick axe) Dwójka oznacza drugie wydanie.

Posted in  | Tagi  | 1 comment