Test driven development for PostgreSQL

I have a mixed love/hate relationship with tests.

I hate writing them. I hate remembering to add them when I'm in the zone, and application code is flowing freely from the tips of my fingers.

But when I do add them, I absolutely love the ability to twist and replace the most core innards of application, and be able to tell that at least the sanity check of the code passes.

I love them even more when they prevent me for repeating some mistake/bug – i.e. when there is a bug, and I have tests (which clearly failed, as they didn't catch the bug), I add test for this specific bug, so I know that in future it will not happen again.

For a long time I've been fan of stored procedures (or functions) – of course not for everything, but where it makes sense.

Continue reading Test driven development for PostgreSQL

What mistakes you can avoid when looking for help on IRC?

Today, there was this one person on IRC, which asked question and provided some data. While working on helping him (her?), I noticed some things, that bugged me before in other cases, but this time i decided to write about it – it's kind of rant, and if you (the reader) are the person that I'm basing my example on – please do not feel “punished" – it just so happens, that you exhibited some things that make helping others more difficult than it could be – so: you're not special, although I would really prefer if you were 🙂

Continue reading What mistakes you can avoid when looking for help on IRC?

Waiting for 9.0 – pg_upgrade

On May, 12ve, Bruce Momjian committed new contrib module for 9.0 – pg_upgrage.

As I understand – this is what was available before as pg-migrator.

If you're not familiar with it – it's a tool that allows upgrade of $PGDATA from some version to some version. What's the use case? Let's assume you have this 200GB database working as 8.3, and you'd like to go to 8.4 (or 9.0). Normal way is pg_dump + pg_restore – which will take some time. With pg-migrate/pg_upgrade it should be faster, and easier. So, let's play with it.

Continue reading Waiting for 9.0 – pg_upgrade

Co mnie wkurza w serwisach WWW [polish only]

WWW powstało 20 lat temu. Od tamtej pory jest coraz więcej stron, e-commerce, web 2.0 i cokolwiek byś cobie nie wymarzył. Czemu więc jest tyle badziewia dookoła?

Stwierdziłem, że spiszę co mnie wkurza na webie (polskim) a potem za rok zobaczę czy coś się zmieniło.

  • Strony flash only.

    Przykład – strona sklepu!!! która nie jest dostępna jeśli nie mam Flasha.

    Kiedyś był to “mój" problem, bo używałem niszowego systemu i/lub nie chciałem mieć flasha. Ale teraz, z dobie gdy mamy iphone'y, ipady i masę innych rzeczy, czy naprawdę wymaga to takiej wielkiej roboty by zrobić serwis który da się obejrzeć?

    Czemu mnie to wkurza: bo nie mogę wejść z iphone'a jak jadę samochodem i sprawdzić czy jeszcze są czynni. Bo nie mogę zrobić copy/paste adresu email ze strony, bo adres email jest częścią aplikacji flash, a z niej nie mogę kopiować. Bo lubię działające przyciski forward/back w przeglądarce.

  • Sklepy wymagające zalogowania by coś kupić

    Tu przykładów nie będzie – wejdźcie gdziekolwiek i spróbujcie coś kupić bez zakładania kolejnego bezużytecznego konta.

    Nie chcę się rejestrować bo nie widzę potrzeby – płacę kartą i proszę o dostawę do domu. Czy muszą mieć mój email do tego? A do tego – jak często potrzebują też telefonu, komórki, itd? Po to by kupić książkę? Czy paczkę kawy?!

    Jeśli ktoś twierdzi, że to po to bym mógł sprawdzić status zamówienia – nie pierdziel! Można wygenerować unikatowy url z tokenem, który sobie zbookmarkuję i sprawdzę gdy będę chciał. Albo podać email do potwierdzeń bez żadnej rejestracji i haseł!

  • Ograniczenia na nazwy użytkowników, znaki w mailu, i haśle

    To dopiero paranoja. Mam podać maila, ale nie może zawierać znaku “+". A co jak chcę by zawierał by mieć np. filtrowanie w gmailu?

    Hitem dla mnie są tu jednak banki. Np. Citi. Na stronie jest napisane (mam citi w wersji angielskiej, ale site .pl):

    “8-character minimum with at least 1 capital letter, 1 lower case letter and 1 digit, Can't have 2 of the same characters in a row"

    Czyli hasło ‘Oto 1 Wiem, i pomnę doskona!e' jest ok. Tak? NIE!. Po próbie zmiany:

    “# The password you entered doesn't meet all criteria. It must be at least 8 characters long and cannot have more than 2 consecutive identical characters. In addition, a password shouldn't begin or end with a space, and it can't be the same as, or similar to, your User ID or answer to security questions." (nie, nie jest podobne)

    Przykład z BPH – hasło nie może zawierać 3 razy tego samego znaku – nawet nie pod rząd. Czyli odpada 99.9% bezpiecznych haseł bazujących na frazach, bo np. litera ‘a' w języku polskim występuje mocno często!

    Inną bajką są ograniczenia na długość hasła – jakiś czas temu (teraz nie, ale nie wiem kiedy zmienili) w mBanku był limit na maksymalną długość hasła. I to nie limit typu “1500 znaków", tylko: 20. Dwadzieścia. Ja wiem, że nie każdy używa takich haseł, ale większość haseł frazowych jest dłuższa.

  • Nie sprawdzane newslettery

    Standardem niestety są linki w stylu <a href="www.depesz.com">cokolwiek</a> – hint – bez http:// z przodu to nie zadziała poprawnie. Tu zwłaszcza “pozdrawiam" ekipę od newsletterów Blue City i ich alternatywną metodę popsucia linków:

    <a href="\&quot;http://www.summershoes.pl\&quot;">www.summershoes.pl</a>

    Już nie wspominając o tym, że w momencie jak ten newsletter dostałem ta strona nie istniała tylko pokazywała stronę jakiegoś providera hostingu.

  • Absurdalne limity na długości danych

    Tu nie mam pod ręką przykładu, ale spotkałem się wielokrotnie z tym, że nazwa firmy się nie mieści (34 znaki, i nie – to nie mój pomysł. Mój pomysł miał 15 znaków, ale prawo wymaga bym miał imię i nazwisko w nazwie firmy!).

    Pewnym przykładem jest Allegro które ma limit na długość tytułu. Niby OK – ja rozumiem, że mogą nie chcieć by ktoś rozjechał layout tytułem na 1000 znaków. Tylko czemu kurde mają limit na liczbę bajtów a nie znaków?! Cytat:

    Niektóre symbole liczą się jako więcej niż 1 znak. Tagi HTML nie są widoczne.

    Hint: te symbole to wszystko to co w UTF-8 korzysta z 2 bajtów. Np. polskie znaki.

    Co oznacza, de-facto premiowanie pisania bez polskich znaków. I ja rozumiem, że technicznie jest prościej zaimplementować byte_length() niż char_length() ale ten problem jest rozwiązywalny, są gotowe biblioteki i naprawdę, mamy 2010 i ktoś kto nie potrafi zrobić przechowywania/liczenia z polskimi znakami nie powinien zajmować się programowaniem.

Jeśli ktoś z was pracuje przy webserwisach – czy możecie podać jakiekolwiek uzasadnienie czemu tak a nie inaczej się robi?

Stupid tricks – hiding value of column in select *

One of the most common questions is “how do I get select * from table, but without one of the column".

Short answer is of course – name your columns, instead of using *. Or use a view.

But I decided to take a look at the problem.

Continue reading Stupid tricks – hiding value of column in select *

Getting unique elements

Let's assume you have some simple database with “articles" – each article can be in many “categories". And now you want to get list of all articles in given set of categories.

Standard approach:

SELECT
    a.*
FROM
    articles AS a
    JOIN articles_in_categories AS aic ON a.id = aic.article_id
WHERE
    aic.category_id IN (14,62,70,53,138)

Will return duplicated article data if given article is in more than one from listed categories. How to remove redundant rows?

Continue reading Getting unique elements