chory regexp do dat

tak się złożyło, że brałem udział w projekcie którego częścią miało być przygotowanie formatu wymiany danych opartego na xml'u, a także przygotowanie do tego schemy walidującej.

trywiał.

zrobiłem xml'a, wszystko fajnie. w kilku miejscach trzeba było podać datę i godzinę.

klient chciał by było human-readable, więc wyspecifikowałem coś takiego:

format jasny i prosty. okazało się, że nie. xml schema aby móc walidować datę musi mieć ją podaną tak: 2006-07-13T20:47:00 (a przynajmniej tak mówi nasz firmowy magik od schemy).

jak format jest inny to można walidować regexp'em.

oops. myślę sobie.

walidacja miała być mocna więc te daty i godziny trzeba by jakoś dobrze sprawdzać.

formatu zmienić nie mogę bo zatwierdzony przez komisję w skład której wchodzili ludzie z 4 krajów (taki trochę międzynarodowy projekt).

no to kombinujemy z regexpem.

godzina była relatywnie prosta:

  • sekundy i minuty są z zakresu 00 do 59. więc najprostszy regexp na nie: [0-5]\d (używam tu notacji perlowej bo w perlu tego regexpa testowaliśmy, ale finalnie został przerobiony na xml-schemowego regexpa przez zamianę \d na [0-9]).
  • godziny – no tu trudniej od 00 do 19 to nie problem. potem jeszcze 20-23. da się: ( [01]\d | 2[0-3] ) (używam notacji regexpów perla z rozszerzeniem /x dzięki czemu jest to trochę czytelniejsze.
  • cały regexp na godzinę: ( [01]\d | 2[0-3] ) : [0-5]\d : [0-5]\d . tak. wiem, że mogłem na końcu dać: ( : [0-5]\d){2}, ale wiedziałem, że będę to potem konwertował do regexpów ze schemy, więc wolałem nie przeginać z “cudami".

data. no to jest trudniejsze. haczyk tkwi w latach przestępnych. w dodatku na przestępność są 3 reguły: %4, %100 i %400.

nic to. twardym trzeba być, nie miętkim.

stwierdziłem, że zrobię tego regexpa bazując na ciągu wielu alternatyw:

  • dla dowolnego roku, część miesięcy (01, 03, 05, 07, 08, 10, 12) ma 31 dni, więc można użyć: \d\d\d\d – (0[13578]|1[02]) – ([012]\d|3[01])
  • dla dowolnego roku, część miesięcy (04, 05, 09, 11) ma 30 dni, więc używam: \d\d\d\d – (0[469]|11) – ([012]\d|30)
  • w każdym roku luty ma co najmniej 28 dni: \d\d\d\d – 02 – ([01]\d|2[0-8])

no i teraz zaczynają się schody.

zacznijmy od prostszego – przestępne są te lata które są podzielne przez 4, ale nie przez 100.

ponieważ 100 jest podzielne przez 4, to znaczy, że:

  • pierwsze dwie cyfry roku są nieistotne
  • ostatnie dwie – nie mogą być 00 (bo wtedy rok jest podzielny przez 100)
  • ostatnie dwie muszą być podzielne przez 4

no to już mamy pewne zręby. w jaki sposób regexpem poznać czy liczba jest podzielna przez 4?

zobaczmy jakie to liczby. $ perl -e ‘$_%4||printf “%02u, “, $_ for 0..99'

00, 04, 08, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96

co tu widać? niewiele. ale może jakbym tak zapisał to w ten sposób:

00, 04, 08, 12, 16,

20, 24, 28, 32, 36,

40, 44, 48, 52, 56,

60, 64, 68, 72, 76,

80, 84, 88, 92, 96

WOW! mam regułkę. jeśli pierwsza cyfra jest parzysta, to druga musi być jedną z 0, 4, 8. a jeśli nieparzysta, to druga musi być równa 2 lub 6.

zapis regexpowy: ( [02468][048] | [13579][26] )

no tak. ale na to trzeba nałożyć warunek, że te cyfry to nie może być 00. to powoduje, że jeśli pierwszą cyfrą (z dwóch) jest 0, to druga może być tylko 4 lub 8. tak więc regexp na liczbę 2 cyfrową podzielną przez 4, różną od 00 jest:

( 0[48] | [2468][048] | [13579][26]

tak więc pierwszy warunek na rok przestępny – podzielny przez 4, ale niepodzielny przez 100 wygląda tak:

\d\d ( 0[48] | [2468][048] | [13579][26] ) – 02 – [012]\d

ok. pozostało wziąć warunek na lata podzielne przez 100, ale podzielne też przez 400. i to sie okazuje trywialne. po tak jak przed chwilą liczyłem lata podzielne przez 4, tak lata podzielne przez 400 liczy się tak samo:

( 0[48] | [2468][048] | [13579][26] ) 00 – 02 – [012]\d
finalny regexp walidujący datę:

(
\d\d\d\d – (0[13578]|1[02]) – ([012]\d|3[01])
|
\d\d\d\d – (0[469]|11) – ([012]\d|30)
|
\d\d\d\d – 02 – ([01]\d|2[0-8])
|
\d\d ( 0[48] | [2468][048] | [13579][26] ) – 02 – [012]\d
|
( 0[48] | [2468][048] | [13579][26] ) 00 – 02 – [012]\d
)
dodać do tego godzinę i już 🙂 super.

najzabawniejsze w tym, że przeprowadzony przeze mnie test pokazał, że ten regexp jest szybszy niż walidowanie bazujące na porównywaniu liczb!

zrobiłem testowy program. odpaliłem i dostałem taki wynik:

  • function  5348/s
  • regexp   14045/s

dziwne.

oczywiście nie polecam walidowania daty regexpami. czytelniejsze są normalne funkcje. a prędkość 5300/s to i tak aż za dużo.

nowy browser – z mocno ukierunkowanym zastosowaniem

na rynku pojawiła się nowa przeglądarka www. zasadniczo – po co komu kolejna?

ale tak jak flock jest ukierunkowany na “social networks", tak heatseek jest przeglądarką ukierunkowaną na pornografię.

działa tylko pod windows i bazuje na silniku renderującym explorera – czyli większość stron xxx będzie się wyświetlała dobrze.

a co takiego eXXXtra ma heatseek?

  • aby uruchomić program trzeba podać hasło. wszystkie ściągnięte pliki (obrazki, filmy) są automatycznie szyfrowane, i ich oglądanie jest możliwe jedynie poprzez heatseek. koniec z przypadkowym odkryciem twojej kolekcji przez żonę/dziewczynę/rodziców.
  • eliminują spyware, wirusy i popupy. pewnie nie wszystkie, bo technologie się zmieniają, ale przynajmniej walczą.
  • wygoda użytkowania – ściąganie plików/filmów inicjalizuje się jednym kliknięciem. po ściągnięciu można tworzyć playlisty czy grupować materiał w dowolny sposób
  • przy odtwarzaniu filmów przeglądarka obsługuje bookmarkowanie – dzięki czemu można szybko skoczyć do ulubionej sceny
  • “panic button" – jeden klik i aplikacja się zamyka. bez pytania, czy czegokolwiek innego

wersja podstawowa przeglądarki jest za darmo. wersja premium kosztuje jednorazowo $20, i daje kilka dodatkowych funkcji z których najważniejszą jest możliwość odszyfrowania ściągniętych plików i zapisania w dowolnym miejscu aby móc np. odtwarzać czymś innym nić heatseek.

pozostaje jedynie postawić sobie gdzieś windows 🙂

używasz linuksa z kde, ale z zazdrością patrzysz na wygląd macosx?

do kde jest moduł, nazywający się baghira, który udostępnia odpowiednie wyglądy widgetów, okien itd.

biorąc go, niestandardowy zestaw ikon można spowodować, że kde będzie wyglądało tak:

OS_Clone30.jpg

OS_Clone31.jpg

jak to zrobić? dokładne howto możesz przeczytać tutaj. howto omawia wszystkie kroki od instalacji custom-widgetów, przez ikony, fonty, sidebar konquerora itd.

wreszcie da się używać tego (nie ma co ukrywać) miłego interfejsu bez kupowania przegrzewających się, odbarwiających czy szpiegujących użytkownika mac'ów.

jedyny fajny mercedes stał się … lepszy

nie lubię mercedesów. zdarzyło mi się tym jeździć i uważam, że są:

  • przereklamowane
  • za drogie
  • niewygodne

ale. jest 1 mercedes który mi się podoba. mercedes slr mclaren.

drugi owoc współpracy mercedes-benza z mclarenem (pierwszy, mercedes mclaren f1 był szybki i imponujący, ale brzydki)  jest po prostu śliczny:

slrmclaren04.jpg
taki powstał, był i był cudowny.

jeśli ktoś nie wie – slr jest to wskrzeszona nazwa – slr'y powstawały w latach 50 i były to bardzo szybkie samochody wyścigowe.

jednym z najsłynniejszych, był mercedes slr, który w 1955 wygrał wyświg mille miglia. miał wtedy numer 722.

na pamiątkę tego egzemplarza i wspaniałego zwycięstwa, merceder wypuścił drugiego nowego slr'a: mercedes slr 722 edition.

wygląda groźniej:

slr72207.jpg

a co potrafi? z tego samego silnika co w slr'rze z 2004, wyciągnięto więcej koni: 650 zamiast 617.

efekt? 62 mile na godzinę (coś koło 100km/h) już po 3.6 sekundy! (poprzedni slr był gorszy o 0.2 sekundy). 124 mile (200km) “wyciąga" już po 10.4 sekundy!
prędkość maksymalna: 337 km/h.

cechą charakterystyczną poprzedniego slr'a było (poza fenomenalnym przyspieszaniem) świetne hamowanie.

w 722 jeszcze to poprawiono instalując nowe, większe tarcze. nie mam dokładnych danych o hamowaniu 722, ale poprzedni slr potrafił zahamować z  62 mil na godzinę na dystansie niecałych 35 metrów, generując opóźnienie 1.3g (jeśli wartość nic wam nie mówi – pojazd przyspieszający z 1.3g osiągnąłby 100km/h w ciągu 2.8 sekundy!

samochód – śliczny, sporo potrafi i jest podobno miły w użyciu. jedyny minus – cena. za nowe 722 trzeba dać 650 tysięcy euro. po 1000 euro za każdego konika pod maską 🙂

nowe serwery suna

sun zaoferował 3 nowe serwery.

po pierwsze – sun fire x4600. piękna maszynka mająca do 8 gniazd na procesory amd opteron, przystosowana nie tylko do obecnych, ale także zapowiedzianych dopiero 4-core'owych chipów. to by dało 32 core'y w relatywnie małej maszynce. great:)

po drugie – interesująca maszynka – sun fire x4500.

procesorowo – cieniutko. 2 opterony. a maszynka jest spora – 4U. co zajmuje miejsce? 48 dysków sata, dających łączną pojemność do 24 terabajtów! plus zasilanie całości (oczywiście redundantne).

ostatnia nowość – dosyć dziwny pomysł.

system blade-owy sun blade 8000. do środka wchodzi 10 blade'ów (i tu ciekawostka, mają być obsługiwane zarówno blade'y opteronowe jak i sparcowe.

co więc dziwnego? chasis ma 19U!. w tej samej wysokości konkurenci (hp czy ibm) są w stanie wstawić 2 “pudełka". sun twierdzi, że wielkosć jest przewidzana na przyszłe potrzeby. ale nie da się wstawić więcej blade'ów, bo miejsce jest zajęte zasilaczami i innym “złomem".

o ile widzę przyszłośc przed pierwszymi 2 maszynkami (x4600 był dostępny dla niektórych klientów już od jakiegoś czasu, zdobył nawet 7 miejsce w ostatnim top500 superkomputerów, oczywiście nie pojedyncza maszyna tylko klaster), o tyle blade 8000 wydaje mi się mocno przesadzony. w 19U można upchnąć do 40 procesorów (10 blade'ów 4 procesorowych). używając x4600 tę samą ilość procesorów można upchnąć na 20U – a różnica 1U to zdecydowanie (w/g mnie) za mało. ale – czas pokaze.

piraci z karaibów – największy dzień otwarcia w historii!

druga część filmu z johnym depp'em pobiła wcześniejszy rekord star wars – revenge of the sith's.

pierwszego dnia wyświetlania zemsta sithów zarobiła 50 milionów dolarów, natomiast skrzynia umarlaka – 55.1 miliona!

cieszy mnie to niezmiernie bo pierwsza część mi się podobała i na drugą z pewnością, z przyjemnością pójdę.

chcesz być sławny? opisany w książce?

odbywa się właśnie aukcja (kończy się w środę, 12 lipca o 18:15) zwycięzca której zostanie uhonorowany w specyficzny sposób – jego imię stanie się imieniem głównego bad-guya w nowej książce andrzeja pilipiuka o niejakim wędrowyczu 🙂

to byłoby dosyć interesujące gdyby nie to, że już teraz kwota licytacji przekroczyła 1000 pln, a na tyle mnie chwilowo nie stać 🙂 ale pomysł świetny.

postgresql summit – nowości

10 lat temu, na małym webserwerze w kanadzie został wystawiony w internecie – po raz pierwszy – projekt postgresql.

aby uczcić tę rocznicę, a także by dać developerom możliwość spotkania się osobiście (i pewnie uroślinnienia :), została przygotowana mała, 2 dniowa, konferencja – postgresql summit.

są na niej przedstawiciele z praktycznie wszystkich liczących się firm około postgresowych: afilias, enterprisedb, greenplum, command prompt, sra, sun, pervasive i inni.

pierwszego dnia (wczoraj) było kilka interesujących wystąpień.

jednym z najważniejszych technologicznie (w/g mnie) był pokaz przygotowany przez korry'ego douglasa (autora niezłej książki o postgresie, aktualnie pracującego w enterprise db). korry pokazywał przygotowany przez enterprisedb mechanizm pozwalający na np. debugowanie funkcji plpgsql'owych.

całość podobno ma około 10 linii kodu, dzięki czemu wpływ tego kodu w momencie gdy nie korzystamy z niego jest minimalny.

a dodatkowo całość nie została zrobiona jako debugger, tylko zestaw hook'ów w backendzie postgresql'a. dzięki czemu w oparciu o ten sam mechanizm będzie można budować profilery, optymalizatory czy tracery.

wstępne szacunki mówią, że kod zostanie włączony do źródeł postgresa przed wydaniem 8.2, więc jest spora szansa, że w 8.2 będzie już debugger z prawdziwego zdarzenia (z breakpointami, wykonywaniem krokowym, inspekcją zmiennych itd.).

interesujące jest to, że kod został przygotowany w taki sposób by dało się do niego (jako interfejs) dopiąć cokolwiek – w sensie, nie jest to monolityczne rozwiązanie, interfejsy będzie można mieć różne. np. phpmyadmin, czy dowolny inny program tego typu.

pozostaje czekać kiedy 8.2 się ukaże 🙂