On 15th of October Peter Eisentraut committed patch (his own) which adds:
Support host names in pg_hba.conf Peter Eisentraut, reviewed by KaiGai Kohei and Tom Lane
On 15th of October Peter Eisentraut committed patch (his own) which adds:
Support host names in pg_hba.conf Peter Eisentraut, reviewed by KaiGai Kohei and Tom Lane
On 10th of October, Tom Lane committed patch by Deal Rasheed, which adds triggers on views:
Support triggers ON views. This patch adds the SQL-standard concept OF an INSTEAD OF TRIGGER, which IS fired instead OF performing a physical INSERT/UPDATE/DELETE. The TRIGGER FUNCTION IS passed the entire OLD AND/OR NEW ROWS OF the VIEW, AND must figure OUT what TO do TO the underlying TABLES TO implement the UPDATE. So this feature can be used TO implement updatable views USING TRIGGER programming STYLE rather than rule hacking. IN passing, this patch corrects the names OF SOME COLUMNS IN the information_schema.triggers VIEW. It seems the SQL committee renamed them somewhere BETWEEN SQL:99 AND SQL:2003. Dean Rasheed, reviewed BY Bernd Helmle; SOME additional hacking BY me.
On 26th of September, Peter Eisentraut committed patch which adds:
ADD ALTER TYPE ... ADD/DROP/ALTER/RENAME ATTRIBUTE LIKE WITH TABLES, this also requires allowing the existence OF composite types WITH zero attributes. reviewed BY KaiGai Kohei
Ostatnio dostałem linka do prostej “info-grafiki" pokazującej jakie są przyczyny utraty klientów.
Najważniejszą jest: obsługa klienta. W/g wspomnianej grafiki, obsługa klienta odpowiada za 68% przypadków gdy tracisz klienta. WOW. To sporo. Zacząłem się nad tym trochę zastanawiać.
W różnych badaniach wychodzi, że jednym z kryteriów wyboru jest cena. Ważnym. Więc może cena odpowiada za utratę klienta? Niespecjalnie. Klienci zwabieni najniższą ceną zostawią cię natychmiast gdy ktoś zaoferuje im cenę o 1 grosz niższą, więc jako tacy non stop migrują. A klient którego tracisz to taki klient którego wcześniej miałeś.
Pomyślałem o tym trochę i przyznałem temu 100% racji. W różnych sytuacjach korzystam z rożnych firm/usług, i zazwyczaj jeśli coś mnie odrzuca to właśnie obsługa klienta (lub jej brak). Jeśli jestem zadowolony z obsługi to jestem gotów na pewne niewygody czy wyższe koszty – tylko i wyłącznie dzięki temu, że “po drugiej stronie" ktoś się uśmiechnął czy powiedział coś fajnego. Czy wyszedł na moment ze swojej roli i pomyślał jak mi faktycznie pomóc.
Trzy przykłady z mojego podwórka, dwa negatywne i jeden pozytywny.
Jak większość znających mnie wie, lubię samochody Mitsubishi. Miałem już 3 (z czego 2 nadal mam), poniekąd “przeze" mnie, znajomy kupił, i ogólnie co jakiś czas im jakiś “PR" robię.
Ostatnio znajoma (no, rodzinno-znajoma) firma, szukała samochodów. Nigdy “miśków" nie używali, ale stwierdzili, że zobaczą. Pojechali do Mitcaru. Pogadali na miejscu. Poprosili o wysłanie oferty na 3 samochody (łącznie około 200k pln). To było jakoś tak w ostatnim tygodniu września.
W poniedziałek pogadałem z nimi, i stwierdzili, że miśka nie kupią, bo nikt im nie odpowiedział. No cóż. Ja wiem, że Mitcar jest niekontaktowy (nie odpisali na zapytanie o Colta, którego kupiłem potem gdzie indziej, ani o Grandisa, ani o przemalowanie samochodu. Tak jakby nie czytali maili.), więc w ich imieniu skontaktowałem się z AutoGT. I tu zobaczyłem obsługę. W ciągu godziny miałem informację co, jak, co muszę powiedzieć, z czego i co mogę wybrać. Do końca dnia (mail przyszedł o 18:02!) dostałem ofertę wariantową, z warunkami cenowymi. Następnego dnia – opcje leasingu.
I życie stało się prostsze. Mitcar nie chciał sprzedać ( chciałbym móc powiedzieć, że pewnie mają tyle klientów, że te dodatkowe 200k im “wisi", ale jakoś nie sądzę by to była prawda), więc sprzedaż zaliczy AutoGT.
Inny przykład na obsługę. Od bardzo dawana lubiłem, ceniłem i polecałem wszystkim dookoła “Supermarket EMMA" w Ursusie. Olbrzymi wybór, miła atmosfera. Robiłem tam non stop zakupy, mimo, że ceny były dużo wyższe (przykład: bułeczka typu mikro-paluch, długości 10-15cm, za 99 groszy, gdzie indziej podobna kosztowała powiedzmy połowę tego).
Potem kilka razy zdarzyło się im sprzedać nieświeżą (mocno nieświeżą) rybę i wędliny. I tak się skończyło. Przerzuciłem się na Piotra i Pawła i/lub Almę. Ale niesmak pozostał.
Zastanawiałem się: skąd się to bierze. Czemu firma “x" olewa klienta – np. nie odpowiadając na maile i nie wysyłając swoich, 2 miesiące po wzięci zaliczki za coś co miało być zrobione z 6 tygodni? I znalazłem odpowiedź. Prostą. To nasza wina. Nasza – konsumentów. Kupujących, korzystających z usług. Godzimy się na to “no bo w końcu to dostanę", albo “no to kupię inny samochód" czy “zadzwonię i się dopytam czemu nie ma".
Tak nie może być. Oczywiście liczenie na jakieś federacje klientów czy tego podobne bzdury nie zadziała. Ale – skoro mamy praktycznie wszyscy dostęp do sieci – to może zacznijmy pisać o takich sytuacjach na blogach/blipie, itd.
Bo nawet jeśli akurat Twojego “nikt" nie czyta, to zawsze czyta go Google. I następnym razem jak ktoś wpisze w google'a hasło będącą nazwą firmy, niech ma szanse się dowiedzieć, że firma: “nie odpowiada na maile, nie podaje działającego telefonu, nie wysyła zamówionych ofert, zatrudnia ludzi którzy starają się kantować klientów" i tym podobne.
Każdy głos z osobna nie znaczy wiele. Ale może za jakiś czas, łączna suma tych postów spowoduje zmiany. Może nasze dzieci nie będą musiały kombinować by dostać wycenę samochodu, czy pójdą do sklepu bez obaw o to, że sprzedawca wciśnie im nieświeżą rybę.
Ostatnie ale – pisząc – podawajcie nazwy firm. Spotkałem się z sytuacjami, że ktoś opisując tragiczną obsługę nie podawał nazwy firmy by “nie robić im reklamy". To bardzo złe. Bez nazwania ich po imieniu, o tym kogo problem dotyczy będzie wiedziało bardzo małe grono osób. A zależy nam o tym by dowiedziało się jak najwięcej – jeśli dane firma odczuje “w portfelu", że coś jest źle, to może zmieni odpowiednich ludzi i przestanie być złym przykładem.
Oczywiście pozytywne przykłady też powinny być opisywane – choćby po to by w Google'u mieć “przegląd sytuacji", a nie same negatywy.
Foreign keys are known for couple of things, but speeding up your system is not one of them. But sometimes, having them in place lets you make queries significantly faster.
How? Let me show you example I have seen lately (well, it's simplified example based on something much more convoluted, and definitely longer):
I have an unusual mail setup.
My company mails are handled by gmail, and on my account there, I setup forwarding to my own mail account on my own server. Where I read the mails, and respond.
So, when someone (let's say “president@whitehouse.gov") sends me an email to my company email (let's say “depesz@company.example.com"), it arrives to gmail, where it gets forwarded to my real account ( let's say “real@depesz.com" ).
So far so good. The problem is that gmail, when forwarding mail modifies return-path, and thus my local SMTP server changes “From " pseudo-header from normal “From president@whitehouse.gov some date" to “From depesz+some_bullshit_gmail_info@company.example.com some date".
This is bad, because it destroys procmail logs, which use value from “From " to log information about who sent the email, and instead of nice and readable:
From president@whitehouse.gov Wed Sep 22 00:10:36 2010 Subject: test Wed Sep 22 00:10:30 CEST 2010 Folder: /somewhere/not/important/new/23423 4870
I get utterly useless:
From depesz+some_bullshit_gmail_info@company.example.com Wed Sep 22 00:10:36 2010 Subject: test Wed Sep 22 00:10:30 CEST 2010 Folder: /somewhere/not/important/new/23423 4870
I tried to fix the problem using formail, but apparently, when you do something like this:
:0 fhw | formail -I "From $REAL_EMAIL"
in procmail.rc – it all works fine, but the “From " line is generated at the end of headers, which is pretty dumb, as it should be leading header.
Tried various stuff to solve the problem, but finally found one that really works. Here it goes in case someone in future will need it:
ENVELOPE_FROM=`formail "-xFrom "` :0 * ENVELOPE_FROM ?? ^depesz\+.*@company.example.com { MAIL_FROM=`formail -xFrom: | perl -pe 's/.*?(\\S+@\\S+).*/\$1/;s/^<//;s/>\$//'` RESTORED_FROM=`echo "From $MAIL_FROM $( echo "$ENVELOPE_FROM" | sed 's/^[^[:space:]]* //' )"` :0 fhw | ( echo "$RESTORED_FROM"; formail -R "From " "X-Old_From_:" ) }
Important – this is at the beginning of procmailrc!
What it does?
First line: ENVELOPE_FROM=`formail "-xFrom "` gets current value of “From " header, and puts it to ENVELOPE_FROM variable.
Now, with:
:0 * ENVELOPE_FROM ?? ^depesz\+.*@company.example.com { ... }
I check if the ENVELOPE_FROM is the one that is broken (after all, someone else might mail me directly), and if yes – I run what's in side of the { block }.
Inside, I get value of From: (with colon) header, and extract from it email.
After running this line:
MAIL_FROM=`formail -xFrom: | perl -pe 's/.*?(\\S+@\\S+).*/\$1/;s/^<//;s/>\$//'`
Assuming mail had line like From: “Some important guy" <president@whitehouse.gov>, MAIL_FROM will contain “president@whitehouse.gov".
Next line:
RESTORED_FROM=`echo "From $MAIL_FROM $( echo "$ENVELOPE_FROM" | sed 's/^[^[:space:]]* //' )"`
builds new value of “From " header, using extracted email, and timestamp (after first space) from original “From “.
So, to wrap with example. Assuming we have email with headers like:
From depesz+some_bullshit_gmail_info@company.example.com Wed Sep 22 00:10:36 2010 Subject: test Wed Sep 22 00:10:30 CEST 2010 From: "Some important guy" <president@whitehouse.gov>
After the RESTORED_FROM line, we will have following values in variables:
ENVELOPE_FROM="depesz+some_bullshit_gmail_info@company.example.com Wed Sep 22 00:10:36 2010" MAIL_FROM="president@whitehouse.gov" RESTORED_FROM="From president@whitehouse.gov Wed Sep 22 00:10:36 2010"
Then goes last part:
:0 fhw | ( echo "$RESTORED_FROM"; formail -R "From " "X-Old_From_:" )
Which, passed mail headers to command, and treats it as filter.
The command does:
The trick is that the print happens before formail even will get the headers, so the new, fixed “From " will be returned to procmail before rest of headers, as returned by formail.
Effect: everything works, and logged From is now much more sensible.
It would be even better if gmail would include original envelope from in the headers, but it doesn't, so I have to take the address from “From:" (which not always is good idea, but at the very least – it's much better than getting all mails with the same “From “.
Anyone knows better/easier approach?
My jabber server had the feature, that it logs all messages that got sent through it.
This is pretty cool, and useful. And now, i got asked to use it to create list of conversations.
What exactly is this? Whenever I send (or receive) something there is record in database with information about which local user, communication type (send/recv), correspondent, when it happened, and what is the body of message.
And based on this, we want to list messages into chats. How?
This question (and its variants) show quite often on #postgresql on IRC. People get sequential scans, and are worried that it's slow and bad.
So, I hope that this blogpost will shed some light on the subject why indexes are being chosen to be used, or not.
I'm quite often doing stuff on remote machines, and quite frequently I start some long-running job, when I remember that I didn't ran it via screen – so it will break, if my network connection will die.
Is there any sane way to start screen automatically? YES.
On 24th of August, Takahiro Itagaki committed patch:
Log Message: ----------- Add string functions: concat(), concat_ws(), left(), right(), and reverse(). Pavel Stehule, reviewed by me.
Continue reading Waiting for 9.1 – concat, concat_ws, right, left, reverse