W ramach treningu o zabawy, w wyniku pewnego zapytania napisałem takie coś – może się komuś przyda. Jako parametr należy podać nazwy plików html w których należy uzupełnić tagi <img /> o wymiary obrazków.

#!/usr/bin/env python
# -*- coding: iso-8859-2 -*-
import os.path
import re
import Image
import sys

if len(sys.argv) == 1:
  print 'Podaj nazwy plików'

def replace(html):
  rx = r'''(?im)(<\\s*img\\s*src=(["'])(?P.*?)\\2.*?/>)'''
  imgs = re.findall(rx, html) #, re.I|re.M)
  if imgs:
    for imgtag, tmp, fname in imgs:
      if imgtag.find('width=') == -1 and\\
          imgtag.find('height=') == -1 and\\
          os.path.isfile(fname):
        intag = 'width="%dpx" height="%dpx"' % Image.open(fname).size
        ntag = imgtag[:-2] + intag + ' />'
        html = html.replace(imgtag, ntag)
  return html

files = sys.argv[1:]
for f in files:
  if not os.path.isfile(f):
    print 'Nie znaleziono:', f
    continue
  html = replace(open(f).read())
  open(f, 'w').write(html)

Wymagany jest moduł PIL.

Oczywiście jest to mocno niedopracowane, ale napisanie tego to było dosłownie kilka minut, dla zabawy, a jako że to jest python, to łatwo samemu to dopracować i poprawić :) Ważne, że działa jak powinno…


Kolejny mały urywek kodu, ten dotyczy wykrywania roku przestępnego.

Python:

def isleapyear(year):
  return (not year%4 and year%100 or not year%400)

PHP:

function is_leapYear($year)
{
  return (!($year%4) && ($year%100) || !($year%400));
}

C++:

bool isleapyear(int year)
{
  return (!(year%4) && (year%100) || !(year%400));
}


Gdyby ktoś potrzebował, to poniżej są przykłady sprawdzanie numerów PESEL, REGON i NIP zaimplementowane w Pythonie:

PESEL
def check_pesel(pesel):
  sum, ct = 0, [1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1]
  for i in range(11):
    sum += (int(P[i]) * ct[i])
  return (str(sum)[-1] == '0')
REGON
def check_regon(regon):
  sum = 0
  w = [8, 9, 2, 3, 4, 5, 6, 7]
  if len(regon) == 7:
    w = w[2:]
  elif len(regon) == 14:
    # ciężko znaleźć algorytm (wagi) do sprawdzenia ostatnich
    # pięciu cyfr, więc olewamy
    regon = regon[:9]

  ct = int(regon[-1])

  for i in range(len(w)):
    sum += (int(R[i]) * w[i])
  mod = sum%11
  if (mod == ct) or (mod == 10 and ct == 0):
    return True
  return False
NIP
def check_nip(nip):
  sum, ct = 0, [6, 5, 7, 2, 3, 4, 5, 6, 7]
  for i in range(9):
    sum += (int(N[i]) * ct[i])
  return ((sum%11) == int(nip[-1]))

Sumy kontrolne są liczone według wzorów dostarczonych przez Wikipedię: PESEL, REGON, NIP.

Oczywiście powyższe funkcje zakładają że dostają poprawny numer, walidację tego pozostaje zrobić we własnym zakresie…

UPDATE

Poprawiłem nieco funkcję sprawdzającą REGON – uwzględnia ona teraz REGONy zarówno 7 (stare), jak i 9 czy 14 cyfrowe (te ostatnie, to “zwykły” REGON wraz z 5 cyframi lokalizacyjnymi – więcej: wipos.p.lodz.pl/zylla/ut/nip-rego.html).


Zgodnie z obietnicą, udostępniam światu trzecią część tłumaczenia tutoriala Django. Za czas jakiś część czwarta :)

W tej chwili zarówno w części drugiej, jak i trzeciej, jest kilka miejsc oznaczonych oczojebnym kolorkiem, co do których nie mam pomysłu jak je przetłumaczyć. Ma ktoś sensowny pomysł? :)

AKTUALIZACJA
Zmienione zostały adresy do poszczególnych części tłumaczenia.

UPDATE: aktualna wersja tłumaczenia znajduje się na serwerze django.pl: http://django.pl/documentation/tutorial03/


Tłumaczenie drugiej części tutoriala Django jest pod adresem: urzenia.net/251/django-tutorial-czesc-2. Miłego czytania :)

AKTUZALIZACJA
Został zmieniony adres tłumaczenia.

UPDATE: aktualna wersja tłumaczenia znajduje się na serwerze django.pl: http://django.pl/documentation/tutorial02/


Niedawno stwierdziłem, że czas coś zacząć robić w sprawie różnych frameworków. Jako, że chciałbym się przestawić z PHP na Pythona, tako też zainteresowałem się czymś Pythonowym. Konkretnie Django. Framework jest zrobiony całkiem elastycznie, przynajmniej dopóki znam go na takim etapie jakim znam… :) Czyli na razie podstawy niewiele wykraczające za tutorial.

W ramach nauki i poznawania Django, stwierdziłem, że przetłumaczę tenże, wspomniany przeze mnie przed chwilą, tutorial. Bardzo proszę o opinie nt tłumaczenia, poprawki jeśli coś przekręciłem, ewentualnie lepsze sformułowania niż użyte przeze mnie. Będę się starał mniej więcej na bieżąco przeglądać i poprawiać to co jest nie tak jak być powinno :)

Nie za długo też powinny się pojawić pozostałe trzy części tutoriala, wszystko zależy od tego, jak tam moje więzienie będzie mi czasu udostępniać :) O kolejnych częściach dam znać na tymże moim blogu… :)

Acha, zapomniałbym. Tutorial znajduje się pod tym adresem: urzenia.net/250/django-tutorial-czesc-1.

AKTUALIZACJA
Zmieniony został adres tłumaczenia.

UPDATE: aktualna wersja tłumaczenia znajduje się na serwerze django.pl: http://django.pl/documentation/tutorial01/


jakis czas temu stworzylem na berlios projekt dla note. dali mi miejsce na serwerze (potrzebuje na ta chwile tylko kilka kilobajtow ;) ), subversion, cvs (z ktorego, jak i z kilku innych rzeczy, nie korzystam), mailliste i rozne takie. zrobilem to m.in. dla ‘reklamy’, zeby gdzies to pokazac ;) ciekawilo mnie, czy ktos sie tym zainteresuje. i w sumie dalej mnie to interesuje, ale chyba nie jest nikomu potrzebny taki skrypt ;) zlew. tak naprawde, to motywy mialem nieco inne: chcialem zobaczyc co i jak tam dziala, z mysla o przeniesieniu core do nich. obejrzalem, potestowalem… core tez jest tam zarejestrowane od jakiegos czasu. choc nic wiecej poza rejestracja z tego na razie nie wyniklo, jako ze dosc mocno rozgrzebalem core, na tyle ze czesciowo przystopowalem larka, i na razie tak zostalo, nie dokonczone… ;)

w kazdym badz razie, note dostalo dzis prosta stronke opisujaca go, wraz z dokumentacja. i tak juz pewnie zostanie ;)


dzieki sponsoringowi (;) ) sadu, uaktualnilem, a wrecz przepisalem skrypta perms. z nowych rzeczy: przelaczniki ‘-d’ i ‘-f’ mozna stosowac oddzielnie. jesli ktorys z nich nie zostanie podany, to prawa dla danej rzeczy nie zostana zmienione.
dodalem tez przelaczniki ‘-o’, ‘-a’, ‘-g’, ‘-b’, ktore odpowiadaja za zmiane wlasciciela i grupy pliku/katalogu. mozna tez ustalac, czy np. zmiana wlasciciela ma byc tylko dla plikow, tylko dla katalogow czy tez i dla plikow i dla katalogow.

dokladniejszy opis

na ta chwile wyszlo mi z tego fajne narzadko (imo of koz ;) ). dziala ladnie i sprawnie, ale oczywiscie wymaga jeszcze przetestowania w wiekszych warunkach bojowych ;) w czasie moich testow sprawdzalo sie ok.

najbardziej zadowolony jestem z tego, ze napisalem go zupelnie na sucho – tj. bez mozliwosci sprawdzania w trakcie czy dziala. w sadzie mam tylko windowsa, gdzie zmiana praw i wlasciciela niespecjalnie dziala. przetestowalem dopiero po powrocie do domu ;) i poza dwoma banalami (w sumie nie wiedzialem wczesniej, ze sys.exc_info()[1] zwraca obiekt, a nie tresc wyjatku). wiec styklo dodac str() i poszlo :) jestem z siebie dumny :P