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

Tips n’ Tricks – using “wrong” index

More than once I've seen situation when there is a table, with serial primary key, and rows contain also some kind of creation timestamp, which is usually monotonic, or close to monotonic.

Example of such case are for example comments or posts in forums – each get it's ID, but they also have creation timestamp. And it usually is so that higher ids were added later than the lower ids.

So, let's assume you have such table, and somebody asks you to make a report on data from last month. How?

Continue reading Tips n' Tricks – using “wrong" index

How to remove backups?

Question from title sounds weird to you? It's just a ‘rm backup_filename'? Well. I really wish it was so simple in some cases.

One of the servers I'm looking into, there is interesting situation:

  • quite busy database server (2k tps is the low point of the day)
  • very beefy hardware
  • daily backups, each sized at about 100GB
  • backups stored on ext3 filesystem with default options
  • before launching daily backup, script removes oldest backup (we keep 3 days of backups on this machine)

Continue reading How to remove backups?

Profiling stored procedures/functions

One database that I am monitoring uses a lot of stored procedures. Some of them are fast, some of them are not so fast. I thought – is there a sensible way to diagnose which part of stored procedure take the most time?

I mean – I could just put the logic into application, and then every query would have it's own timing in Pg logs, but this is not practical. And I also believe that using stored procedures/functions is way better than using plain SQL due to a number of reasons.

So, I'm back to question – how to check which part of function takes most of the time?

Continue reading Profiling stored procedures/functions

Setting WAL Replication

There are several approaches on replication/failover – you might have heard of Slony, Londiste, pgPool and some other tools.

WAL Replication is different from all of them in one aspect – it doesn't let you query slave database (until 9.0, in which you actually can run read only queries on slave.

Since you can't run queries on slave, what is it good for? Well. It's good, and great in 1 very important aspect – all things that happen in database are replicated. Schema changes. Sequence modifications. Everything.

There is also drawback – you can't (as of now) replicate just one database. You replicate whole cluster (I don't like this word in this context – let's say: whole installation) of PostgreSQL. All databases that reside in given DATA directory.

So, the question is – how to set it up?

Continue reading Setting WAL Replication