wyszukiwanie w/g nipu

część z was pewnie kiedyś zaprojektowała system gdzie był przechowywany numer nip.
numer nip jaki jest każdy wie – 10 cyfr, rozdzielonych myślnikami. zasadniczo – myślniki są nieważne. ale czasem ktoś (klient, urząd skarbowy, ktokolwiek) czepia się jak mu się np. nip zmieni z 522-186-96-44 na 522-18-69-644. niby ten sam. ale nie taki sam.
z tego powodu nip powinno się przechowywać w postaci takiej jak user podał.
ale – czy wyszukując nip mamy pewność, że wiemy w jakiej postaci "myślnikowej" dane są wpisane? a co jeśli mamy wpisane "522-186-96-44", a szukamy "522-18-69-644"?
czyli do wyszukiwania przydałoby się aby pamiętać bez myślników.
najprostszą wersją jest zrobienie dwóch kolumn: nip_original, nip_search. ale to jest brzydkie.
ładniej można zrobić to poprzez np. coś takiego:
mamy tabelkę:

create table test (id serial primary key, nip text not null, nazwa text not null);

i na niej zakładamy indeks w ten sposób:

create unique index test_idx on test (regexp_replace(nip, '[^0-9]', '', 'g'));

po czym sprawdzamy:

# explain analyze select * from test where regexp_replace(nip, '[^0-9]', '', 'g') = '1234567890';
                                                   QUERY PLAN
----------------------------------------------------------------------------------------------------------------
 Index Scan using test_idx on test  (cost=0.00..8.29 rows=1 width=54) (actual time=0.167..0.167 rows=0 loops=1)
   Index Cond: (regexp_replace(nip, '[^0-9]'::text, ''::text, 'g'::text) = '1234567890'::text)
 Total runtime: 0.261 ms
(3 rows)

super.
teraz .. dobrze by było jakby dało się wyszukiwać prefixowo – aby np. w aplikacji się "podpowiadało" samo – po wpisaniu kolejnych cyfr.
aby to zrobić musimy sięgnąć po tzw. index opclass (uwaga – to jest konieczne tylko jeśli wasze locale jest inne niż C – ale pewnie jest inne):

drop index test_idx;
create unique index test_idx on test (regexp_replace(nip, '[^0-9]', '', 'g') text_pattern_ops);

no i test:

# explain analyze select * from test where regexp_replace(nip, '[^0-9]', '', 'g') like '1234%';
                                                                                     QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=13.40..922.28 rows=500 width=54) (actual time=0.240..0.457 rows=7 loops=1)
   Filter: (regexp_replace(nip, '[^0-9]'::text, ''::text, 'g'::text) ~~ '1234%'::text)
   ->  Bitmap Index Scan on test_idx  (cost=0.00..13.27 rows=500 width=0) (actual time=0.162..0.162 rows=7 oops=1)
         Index Cond: ((regexp_replace(nip, '[^0-9]'::text, ''::text, 'g'::text) ~>=~ 1234'::text) AND (regexp_replace(nip, '[^0-9]'::text, ''::text, 'g'::text) ~<~ '1235'::text))
 Total runtime: 0.593 ms
(5 rows)

wow.
co prawda trzeba za każdym razem pisać tego regexp_replace'a.
czy na pewno trzeba? nie. wystarczy zrobić wrappera widokiem:

# create view test_view as select *, regexp_replace(nip, '[^0-9]', '', 'g') as search_nip from test;

i potem:

# explain analyze select * from test_view where search_nip like '123%';
                                                                                    QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=13.40..923.53 rows=500 width=54) (actual time=0.375..7.384 rows=96 loops=1)
   Filter: (regexp_replace(nip, '[^0-9]'::text, ''::text, 'g'::text) ~~ '123%'::text)
   ->  Bitmap Index Scan on test_idx  (cost=0.00..13.27 rows=500 width=0) (actual time=0.199..0.199 rows=96 loops=1)
         Index Cond: ((regexp_replace(nip, '[^0-9]'::text, ''::text, 'g'::text) ~>=~ '123'::text) AND (regexp_replace(nip, '[^0-9]'::text, ''::text, 'g'::text) ~<~ '124'::text))
 Total runtime: 88.251 ms

super. działa. wyszukuje niezależnie od minusów, dane trzymamy tylko raz, mamy searcha prefixowego. czego chcieć więcej?

patent na … DRM

drm – digital rights management.
ogólna nazwa tycząca się jakichkolwiek metod służących ochronie praw autorskich lub intelektualnych do utworów, tekstów oraz innych "obiektów" zapisanych w postaci cyfrowej.
najsłynniejsze przypadki do css (dvd-css) – system zabezpieczeń dvd, różnego rodzaju drm'y w sklepach z mp3 (np. w itunes) czy software do drm od sony który instalował w systemie rootkita i który kosztował sony ponad 15 milionów dolarów w odszkodowaniach.
czemu o tym piszę? bo alan cox – osoba dosyć znana wszystkim zainteresowanym rozwojem linuksa – jako jądra systemu, zgłosił drm jako technikę którą chce opatentować. oficjalny wniosek został złożony, czekamy na to czy patent zostanie przyznany.
po co patent? dzięki temu alan będzie mógł trzymać "w szachu" wszelkiego rodzaju firmy (riaa/mpaa/…) które chciałyby kiedykolwiek wykorzystać jakieś patenty przeciwko linuksowi.

recenzja wii

w serwisie rev.pl pojawiła się recenzja wii. może nie czytam tego co trzeba, ale wydaje mi się, że jest to pierwsza dłuższa recenzja wii po polsku.
jeśli nie wiecie co to wii, bądź wiecie, ale nie wiecie o co ten szum. bądź chcecie sie upewnić czy zamiar kupna jest ok – polecam przeczytanie. kilka wątpliwości rozwieje 😉

dziwne ostrzeżenia

pewnie większość z was słyszała legendy o ostrzeżeniach typu "uwaga, może zawierać orzeszki" – na pudełku orzeszków ziemnych, czy "nie zatrzymywać przy pomocy genitaliów" na pile mechanicznej.
okazuje się, że jest organizowany coroczny konkurs na najdziwniejsze ostrzeżenia, i ostatnio odbył po raz dziesiąty.
trzecie miejsce zajęły ex-aequo:

  • "nie prasować" na kuponie lotto
  • "nie suszyć telefonu w kuchence mikrofalowej" – na telefonie komórkowym

drugie miejsce:

  • "nie używać zapalonej zapałki albo otwartego ognia do sprawdzania poziomu paliwa" – na motorówce

pierwsze miejsce!:

  • "nie wkładać ludzi do pralki" – na pralce

i do tego honorowe wyróżnienie dla:

  • "prosimy o nie używanie tego spisu w trakcie prowadzenia pojazdu" – na książce telefonicznej

błękitne światło pozwala dłużej pracować

nie jest to news, ale jakoś wcześniej przegapiłem.
w numerze pisma "sleep" z lutego 2006 były wyniki badań na małej grupie ochotników (16 osób). w wyniku tych badań naukowcy doszli do wniosku, że niebieskie światło pozwala dłużej zachować koncentrację i powstrzymać zmęczenie – w nocy.
oczywiście nie jest to recepta na brak snu. po prostu, przez 6.5 godziny – czas jaki trwał test – osoby pracujące w miejscu oświetlonym na niebiesko zachowały podwyższoną koncentrację i zmniejszoną senność. jak dla mnie czad – kawy jakoś nigdy nie polubiłem, a niebieskie żarówki kupić to nie problem.

pierwszy komercyjny nośnik holograficzny

technologia nośników holograficznych jest marzeniem, przedmiotem badań, spekulacji i ogólnie szumu od około 40 lat! wiele było o tym mówione. fenomenalne prędkości, niesamowite pojemności.
tylko nikt tego nigdy do końca nie zrobił – a przynajmniej nie tak, że można by pójść do sklepu i kupić napęd i nośniki.
do teraz.
firma inphase w pierwszej połowie tego roku sprzeda pierwsze sztuki a do końca roku rozwinie produkcję i sprzedaż na dużą skalę pierwszych komercyjnych nośników holograficznych.
na razie parametry nie powalają – dysk o wielkości 5¼ cala będzie miał 300 giga pojemności i transfer na poziomie 20 megabajtów.
bez rewelacji. ale inphase już teraz obiecuje, że za kilka lat dostarczą nośniki po pojemności 1.6tera!.
co z tego wyjdzie – zobaczymy. mnie osobiście cieszy fakt, że coś się w tym temacie ruszyło – 40 lat researchu to jednak trochę za dużo.

podstawy bezpieczeństwa – w/g nsa

nsa, znana kiedyś jako "no such agency", a ostatnio z aktywnego współudziału w rozwoju linuksa opublikowała pdf'a zatytułowanego "The 60 Minute Network Security Guide (First Steps Towards a Secure Network Environment)".
całość jest dosyć spójna, tyczy się windowsów i unixów. warto przeczytać choćby po to by sprawdzić czy na pewno wszystko z tego się zrobiło.

nowe ściany

najpierw zagadka.
poniżej są zdjęcia ścian (zewnętrznych) domu. z jakiego są materiału?


i co? wiecie? to jest beton.
a dokładniej – beton który "przewodzi" światło.
ten materiał powstał poprzez zrobienie "matrycy" z światłowodów, która następnie jest zalewana betonem. co ciekawe – nie wpływa to ujemnie na walory konstrukcyjne betonu – wręcz przeciwnie – powstały materiał jest odporniejszy od standardowego betonu. i lepiej wygląda!
materiał ten robi węgierska firma litracon – na ich stronach można np. zobaczyć krótki filmik pokazujący jak to wygląda przy ruchomym obiekcie po drugiej stronie ściany.

dwustronny wyświetlacz do komórek

samsung ogłosił, że wyprodukował pierwszy prawdziwie dwustronny wyświetlacz lcd. do tej pory obraz z dwóch stron (jak ma np. motorola v3 razr) był uzyskiwany przez instalację 2 niezależnych wyświetlaczy.
możliwość zastosowania pojedynczego wyświetlacza na pewno wpłynie na rozmiary komórek – będą mogły być jeszcze mniejsze.
dodatkowo – technologia ta miała by pewne zastosowania poza komórkami – można by jej używać do małych pokazów / prezentacji – bez rzutnika, po prostu na laptopie – na stronie od klawiatury notatki, podgląd i kontrola prezentacji – a po drugiej stronie – sama prezentacja.
technologia jest ciekawa i bardzo nowa. na pierwsze telefony z tym pewnie chwilę poczekamy.
jak na razie demo ma 2.2 cala przekątnej, rozdzielczość 240×320 pikseli. z tym, że jedna ze stron – tylna, jest ciemniejsza.