własne operatory upraszczające życie

na jednej z list postgresowych jakiś koleś zamarudził, że o ile warunek:

where pole!=3

działa poprawnie, to już

where pole!=-3 nie działa poprawnie.

wiele osób mu wyjaśniło, że:

  • standard sql nie oferuje operatora != w ogóle. do tego jest <>
  • != w postgresie to dodatek. takie “nice to have"
  • gdy doda się spację między “!=" a “-3" to działa ok (where pole!= -3)
  • całość działa tak dlatego, że system nie ma jak rozróżnić czy chodzi o “pole" “!=" “-3" czy może “pole" “!=-" “3", a to drugie jest w pełni legalną nazwę operatora – którego domyślnie nie ma, ale może być – w końcy postgres ma architekturę mocno otwartą i można sobie dodefiniować własne operatory czy cokolwiek.

facet oczywiście marudził dalej, że powinno działa.

postanowiłem pomóc. jak? dopisać operator !=- który zadziała tak jak facet chce.

najpierw potrzebna była funkcja. 30 sekund później miałem:

CREATE FUNCTION not_equals_minus(int8, int8) RETURNS bool AS $BODY$
SELECT $1 <> -$2;
$BODY$ LANGUAGE SQL IMMUTABLE STRICT;

proste i szybkie. działa dla liczb typu int8 (bigint), ale przerobienie do innych typów to trywiał.

to teraz definiojemy operator. jak? nie pamiętam. ale szybki search w manualu dał mi odpowiednią stronę, z jej pomocą napisałem:

CREATE OPERATOR !=- (
leftarg = int8,
rightarg = int8,
procedure = not_equals_minus,
commutator = !=-
);

efekt? działa. można teraz zrobić WHERE pole <> -3, WHERE pole != -3, lub WHERE pole!=-3. kocham postgresa 🙂

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.