unikatowość nazw użytkowników

na potrzeby jednego z projektów miałem zaprojektować bazę. jednym z elementów bazy była tabelka z danymi użytkowników. ponieważ zbiór danych był spory i do tego zmienny, tabelka z użytkownikami została mocno uproszczona, ale za to zostały dodane tabelki na dane dodatkowe.

finalnie – tabelka z użytkownikami wyglądała mniej więcej tak:

CREATE TABLE users (
id         BIGSERIAL  ,
username   TEXT        NOT NULL DEFAULT '',
password   TEXT       ,
registered TIMESTAMPTZ NOT NULL DEFAULT now(),
active     BOOL        NOT NULL DEFAULT 'true',
PRIMARY KEY (id)
);
CREATE UNIQUE INDEX ui_users_username ON users (username);

małe, proste i łatwe. było. ale potem pojawiły się zmiany.

zmiana numer 1: klient którego konto zostanie wyłączone może założyć nowe konto o identycznej nazwie.

oops. username przestanie być unikalny? a może robić tabelę na dane archiwalne/usunięte? niestety – danych jako takich nie mogę kasować – muszą zostać w bazie.

krótki research pokazał, że przenoszenie danych do innych tabel (archiwum) nie wchodzi w grę – musiałbym zrobić kopię całej bazy jako archiwum. za dużo roboty. może coś prostszego?

pokombinowałem, przypomniałem sobie rozmaite rzeczy i zrobiłem:

DROP INDEX ui_users_username;
CREATE UNIQUE INDEX ui_users_username ON users (username) WHERE active = true;

co to robi? to proste – nadal mam indeks unikalny, ale tylko aktywnych kont. konta nieaktywne nie są indeksowane w ogóle, więc także nie są objęte limitem unikalności. całość działa ładne. do czasu.

zmiana numer 2: nazwy kont (ich unikalność) powinny nie pozwalać na dwa konta – typu “depesz" i “Depesz".

no, to to trywiał – mały trigger “BEFORE INSERT OR UPDATE" który mi username lowercase'uje i po sprawie. a jednak nie. nazwa użytkownika ma się wyświetlać tak jak on sobie zażyczył. jak sobie przy rejestracji wpisał “Depesz" to ma mu się tak wyświetlać. ale nie powinnismy dopuścić do rejestracji “depesz"‘a. oraz powinniśmy umożliwić mu zalogowanie sie zarówno jako “Depesz" jak i “depesz".

oops część 2. kombinuję. krok numer 1 – dodatkowe pole które trzyma nazwę konta w postaci “tak jak user podał", a username będę triggerował do lowercase'a. ale to jest brzydkie. i duplikuje mi dane. myślałem nad tym jakiś czas gdy nagle mnie olśniło: indeksy funkcyjne. wystarczy:

DROP INDEX ui_users_username;
CREATE UNIQUE INDEX ui_users_username ON users ( lower(username) ) WHERE active = true;

i po sprawie:

# insert into users (username) values ('depesz');
INSERT 0 1
 
# insert into users (username) values ('Hubert Lubaczewski');
INSERT 0 1
 
# insert into users (username) values ('hubert lubaczewski');
ERROR:  duplicate key violates unique constraint "ui_users_username"
 
# select * from users;
id |      username      | password |          registered           | active
----+--------------------+----------+-------------------------------+--------
1 | depesz             | [null]   | 2006-12-05 23:16:52.52406+01  | t
2 | Hubert Lubaczewski | [null]   | 2006-12-05 23:16:58.370124+01 | t
(2 rows)

podsumowując – mam tabelkę która trzyma bazowe informacje o użytkownikach, pilnując tego by mógł być tylko 1 aktywny o tej samej nazwie – gdzie “ta sama" jest sprawdzanie niezależnie od wielkości liter. i do tego nie zmieniamy danych wpisanych przez usera – i jeśli zażyczy sobie (rejestrując się) jakichś różnych wielkości liter – tak też to zrobimy i tak mu wyświetlimy. życie jest piękne.

osdl zwalnia pracowników?

osdl – open source development labs – konsorcjum dużych firm wspierających linuksa – podobno zwalnia właśnie dużą część swoich pracowników – praktycznie eliminując zatrudnienie w swoich biurach w oregonie.

dla przypomnienia – osdl jest miejscem pracy (i płacy) linusa torvaldsa – twórcy systemu linux.

informacja ta nie została w żaden sposób oficjalnie potwierdzona, ale gdyby okazała się prawdą mogłoby to stawiać pod znakiem zapytania ciągłość pracy linusa nad rozwojem linuksa.

gadżety, sprzęt, dodatki – jakie, czemu?

pismo wired co roku publikuje dodatkowy numer pod nazwą wired test. w tym numerze są testy i opinie redaktorów pisma nt. olbrzymiej ilości gadżetów, sprzętu – od laptopów po słuchawki bezprzewodowe do komórek.
wiadomo co jest lepsze od czego i czemu.

oczywiście – ich opinie nie muszą być w 100% obiektywne, jednakże biorąc pod uwagę renomę pisma, oraz doświadczenie redaktorów – można temu raczej zaufać.

w tym roku po raz pierwszy zrobili internetowe wydaje tej     . a na niej mamy takich zwycięzców:

  • telefony komórkowe: motorola q – ichniejszy odpowiednik blackberry (nota bene – blackberry pearl ma miejsce drugie)
  • cyfrowe aparaty fotograficzne: pentax k100d
  • kamery: canon hv10
  • telewizory: sony tav-l1
  • sprzęt video: tivo series3 (rany, dlaczego tego nie ma w polsce!)
  • przenośne odtwarzacze audio: toshiba gigabeat mes30vw (szok – wreszcie pojawiło się coś lepszego od ipoda!)
  • domowe audio: tivoli audio music system
  • agd: black & decker inrawave speed owen
  • laptop: apple macbook pro 15″
  • sprzęt do gier: nintendo wii (YEAH!)
  • samochody: lexus gs 450h

a to dopiero szczyt góry lodowej. w każdej kategorii są podkategorie – w każdej z nich inne przedmioty.

lista się przyda – niedługo gwiazdka 🙂

stylowy dom. od klamek po meble

jak widać ostatnio patrzę na różne dodatki domowe.

teraz trafiłem na stronę firmy która robi sporo rzeczy:

  • klamki (zwykłe, kulkowe, uchwyty do otwierania drzwi bezzamkowych)
  • krzesła
  • fotele
  • sofy
  • parawany
  • lampy
  • stoły
  • łóżka
  • szafy
  • lustra
  • skrzynie
  • taborety

i pewnie jeszcze inne rzeczy.

co z tego? otóż robią rzeczy piękne! ich wzory klamek są niesamowite. w życiu bym nie przypuszczał, że będę się zachwycał tym jak wygląda uchwyt do otwierania drzwi – ale to co oni robią jest ekstra.

zdjęć nie pokażę – strona jest we flashu i nie mam jak ściągnąć obrazków. ale polecam obejrzeć. aha – tylko uważajcie na portfele. to co tam jest – jest piękne. funkcjonalne. cudowne. jedyne w swoim rodzaju. i przerażająco drogie.

nieprzeciętna wanna

było o lodówkach. było o kaloryferach. to teraz pora na wannę.

firm kohler zrobiła wannę. nie jedną  🙂 ta o której piszę jest inna niż wszystko co do tej pory widziałem.

jak powiem, że jest poświetlana, czy, że jest zaprojektowana tak by woda się z niej bezpieczne wylewała – to w ogóle nie odda idei, sensu i piękna tego urządzenia.

to może pokażę:

sok_tub_woman.jpg

podoba się? na stronie producenta jest też filmik pokazujący jak to działa – w tym dosyć (heh) nowatorski sposób nalewania wody – niby nic, ale ma więcej stylu niż wszystko co w castoramie czy innym leroy'u razem wzięte.

skype bez komputera

od jakiegoś czasu można już kupić telefony obsługujące skype'a – bez konieczności używania komputera.

tylko który kupić? serwis wired zrobił małe podsumowanie dostępnych opcji. z ich testu wynika, że najlepszy telefon to model albo netgeara albo smc. ale są też inne opcje.

co ciekawe – telefon smc można kupić w sklepie skype'a dostając dodatkowo 500 minut darmowych rozmów skypeout.

w chwili obecnej uważam już skype'a za bardzo interesującą opcję – rozmowy w kraju na komórki i stacjonarne po cenie rozmowy lokalnej w tepsie. rozmowy na zachód jeszcze tańsze. ogólnie wszystkie połączenia bardzo tanie lub wręcz darmowe. pozostaje kupić telefon, numer(y) skypein i korzystać 🙂