Archive for kwiecień, 2008

Wypełnianie formularzy PDF – forge_fdf w pythonie

Przytrafiło się ostatnio wypełnić przygotowany przez klienta formularz PDF. Ot, umieścić na gotowej formie klucz identyfikacyjny, dać odwiedzającemu PDFa, który to może go wypełnić i odesłać. Formularz jest identyfikowany bardzo łatwo dzięki rzeczonemu kluczowi. Pojawił się jednak jeden zasadniczy problem – jak? Nie chcieliśmy kupować rozwiązań komercyjnych, a poszukiwania w internecie na niewiele się zdały. Rozwiązań kilka znaleźliśmy, ale żadne nie chciało działać tak “out-of-box”. Stanęło w końcu na pdf toolkit (pdftk) i ręcznym generowaniu plików fdf (plików z informacją o zawartości pól w” formularzu PDF). Miało być łatwo i przyjemnie, a przynajmniej tak się wstępnie zapowiadało. Cóż, nie do końca. Łatwo znaleźć coś, co zwie się “forge_fdf” – biblioteka w PHP do tworzenia rzeczonych plików fdf. Jej port w Pythonie też łatwo via google wyklikać. Tu jest jednak jeden, tyci problemik – sportowana biblioteka nie działa. Czemu? Bo gdzieś po drodze zniknęły jej istotne fragmenty. Zmuszeni więc byliśmy przygotować wersję działającą (a przynajmniej spełniającą nasze wymagania):

forge_fdf

Continue reading ‘Wypełnianie formularzy PDF – forge_fdf w pythonie’

Logowanie zmian w PostgreSQL

Ostatnio klient zażyczył sobie logowania wszystkich zmian w bazie danych, co wprawiło nas w lekkie osłupienie. Ale zgodnie z zasadą klient nasz pan, zaczęliśmy wgryzać się w temat. Wstępnie kombinowaliśmy z własną bilioteką do łączenia sie z bazą, później z pisaniem rozszerzenia do Postgresa. Wszystko to było jednak zbyt czasochłonne, by można było sobie na to pozwolić. I przy okazji nauczka na przyszłość – zawsze dokładnie googlaj. Przypadkiem bowiem jeden z nas trafił na bibliotekę tablelog na PgFoundry. Cholerstwo jest prostym rozszerzeniem dla PostgreSQLa, które działając jako trigger dokładnie loguje wszelkie zmiany. Nie kto, gdzie, jak, ale z czego, na co, kiedy oraz jaki to był rodzaj zmiany. Poniżej krótki opis instalacji.

Continue reading ‘Logowanie zmian w PostgreSQL’

Instalacja Pylons pod Windows

Post poniższy już się kiedyś ukazał na ówczesnym blogu Pythonized, jednak nie udało się go odzyskać – w wyniku jakiegoś błędu w WordPressie post został zniszczony przez jakiegoś spammera. O samą instalacje wciąż mnie znajomi pytają, zdecydowałem się więc przywrócić “poradnik”.

Continue reading ‘Instalacja Pylons pod Windows’

Google algo update

Od jakiegos czasu Google intensywnie walczy z kupowaniem/sprzedawaniem linkow. Ostatnio przejawilo sie to nowa kara “-60 penalty”. Jak sama nazwa wskazuje, nasza strona leci na okolo 60 pozycje, a dostaje sie ja za podejrzenie inwestowania kasy w sponsorowanie theme’ow do wordpressa (linki w stopkach), theme’ow do stron proxy i innych podejrzanych wynalzkow. Matt Cutts na Google Groups radzi, by w sytuacji wpadniecia w ten filtr skontaktowac sie ze wszystkimi webmasterami blogow, z ktorych mamy linki (lol) a nastepnie zglosic “reinclusion request” w google webmaster central . Zauwazylem rowniez, ze google wieksza wage zaczelo przywiazywac do nazwy domeny. Coz, ciekawe jakie rewolucje czekaja nas z kolejnym updatem…

/dev/random w Windowsie

Ostatnio musiałem skorzystać z możliwości “nieograniczonej” generacji ciągów pseudolosowych. W Linuxie sprawa jest prosta – otwieramy /dev/random i cytamy zeń wymaganą licznę znaków. Gorzej z tym pod Windowsem, który mimo, że podobne wirtualne urządzenie posiada, to nie umożliwia adekwatnego skorzystania z niego. Efekt podobny można jednak uzyskać – np. przez wywołanie, np przez win32com, funkcji CryptGenRandom z Advapi32.dll (msdn). Lub jeszcze prościej – skorzystać z random.SystemRandom. Z tym ostatnim jest jednak jeden problem – generuje n-bitowe liczby długie. Poniżej przykładowe zastosowanie z jednoczesną konwersją na ciąg znaków (coby lepiej /dev/random emulować ;)):

?View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
nbit = 1024
r = random.SystemRandom().getrandbits(nbit)
devrandom = ""
char = 0
for c in xrange(1,nbit+1):
char |= r & 1
r >>= 1
if c % 8 == 0:
devrandom += chr(char)
char = 0
else:
char <<= 1

Po zakończeniu pętli w zmiennej devrandom znajdzie się (nbit/8) bajtowy ciąg losowych znaków.