Stored procedures czasem sie przydają

Podczas konwersji bazy danych serwisu Poema napotkałem pewien problem. Otóż dane dotyczące przypisania użytkownika do grup dostępu nie były zapisywane w osobnej tabeli jako indywidualne rekordy, lecz w rekordzie użytkownika, w pojedynczym polu o nazwie GID,  jako identyfikatory grup oddzielanych przecinkami, np. '1,3,19,3' lub pojedyncze wartości '8'. Z oczywistych względów dane takie są mało użyteczne. Zatem trzeba je przenieść do osobnej tabeli i powkładać w indywidualne rekordy. Na pierwszy rzut oka MySQL sobie nie poradzi. No to skrypt PHP, ale... leniwy jestem - nie chce mi się pisać skryptu, może zatem jednak MySQL. Rozwiązaniem jest napisanie własnej funkcji. Wygląda ona mniej więcej tak:

delimiter //
CREATE FUNCTION create_records_in_poema_uid_group(p_id INT)
RETURNS INT
BEGIN
  DECLARE gid_set VARCHAR(255) DEFAULT '';
  DECLARE gid INT;
  DECLARE pos INT;
 
  SET @done = 0;
  SET @num = 0;
 
  -- Pobieramy wartość pola do zmiennej gid_set, pole może wyglądać
  -- '1,5,12,16' lub być pojedyncza wartością '10'
  -- dodatkowy warunek w WHERE zapobiega duplikatom
     SELECT u.GID
       INTO gid_set
       FROM poema_users u
  LEFT JOIN poema_uid_group g ON (g.intUid = u.ID)
      WHERE u.ID = p_id
        AND g.intUidGroupId IS NULL;
 
  IF gid_set <> '' THEN
    REPEAT
 
      -- Ustalamy pozycję znaku przecinka
      SELECT LOCATE(',', gid_set) INTO pos;
 
      IF pos > 0 THEN
        -- jest przecinek, odetnij pierwszą wartość, i usuń ją ze zmiennej gid_set
        SELECT CAST(SUBSTR(gid_set, 1, pos) AS UNSIGNED) INTO gid;
        SELECT SUBSTR(gid_set, pos + 1) INTO gid_set;
      ELSE
        -- nie znaleziono przecinka, gid_set zawiera wyłącznie cyfrę,
        -- zzutuj ją do zmiennej gid jako
        -- INT i ustaw flagę zakończenia pętli
        SELECT CAST(gid_set AS UNSIGNED) INTO gid;
        SET @done = 1;
      END IF;
 
      -- Można dodać rekord do bazy
      INSERT INTO poema_uid_group (intUid, intGid, intGrantorUid, dtmGranted)
      VALUES (p_id, gid, 1, NOW());
      SET @num = @num + 1;
 
    UNTIL @done END REPEAT;
  END IF;
 
  -- Zwróć ilość dodanych rekordów
  RETURN @num;
END;
//
delimiter ;

Ok, funkcja dodana, teraz wystarczy wywołać ją dla każdego ID użytkownika:

SELECT create_records_in_poema_uid_group(ID) FROM poema_users;

Przy odrobinie inwencji będziesz w stanie wykorzystać funkcję do rozwiązania podobnego problemu w Twojej bazie danych.

Małe a cieszy: Postfix + SASL + Dovecot

Podręcznikowa konfiguracja Postfixa z uwierzytelnianiem SASL opiera się na Cyrus SASL. Nie znalazłem nigdzie innego przykładu. A tymczasem można inaczej! Cyrus ma to do siebie, że jeśli chce się go zmusić do używania bazy SQL i do tego jeszcze szyfrowanych haseł, posługiwać się trzeba w celu rozwiązania tego problemu mechanizmem PAM, a dokładnie pam_mysql. Rozwiązanie podręcznikowe, ale jak dla mnie niezbyt dobre. Sam Cyrus co prawda potrafi przy pomocy pluginów autoryzować się w bazie SQL, ale jeśli hasło użytkownika jest szyfrowane, jest problem. Tutaj z pomocą przychodzi Dovecot, najczęściej stosowany serwer POP3/IMAP. Otóż zmuszenie go do współpracy z MySQL jest banalnie proste, a dodatkowo, o czym dowiedziałem się dziś zupełnie przypadkowo udostępnia własny mechanizm autoryzacji SASL. Konfiguracja to parę linijek w dovecot.conf i konfigach Postfixa. Małe a cieszy :)

Linki:

Konfiguracja łącza światłowodowego ATM POLPAK pod Linux PLD

Firma ISP dla której od czasu do czasu świadczę usługi postanowiła wykupić nieco szybsze łącze i z uwagi na w sumie niewielki, a właściwie żaden :P wybór - padło na Telekomunikację Polską. Interesującą okazała się usługa ATM/Frame relay. Z uwagi na zastosowaną technologie jak i wymagania co do transferu łącze zakończone zostało światłowodem.

Jako zakończenie klienckie użyta została karta PROATM-V155FM firmy Prosum. Jest to doskonała alternatywa do zastosowań sprzetowych typu Cisco, Nortel, etc, szczególnie jeśli chodzi o cenę. W Polsce koszt zakupu tej karty na chwilę obecną to około 2.500 zł. Tak więc przy koszcie ~3k, bazuąc na Linuxie można uruchomić w pełni funkcjonalny punkt dostępowy obsługujący interfejs ATM, routing, firewall, QOS oraz dodatkowe, przydatne usługi takie jak DHCP, lokalny DNS.

Zasadniczo karta ma wsparcie w postaci natywnie dostarczanych wraz z kernelem sterowników - konfiguracja samego ATM jest wspierana przez kernel i oprogramowanie linux-atm - w PLD, którego użyłem jako systemu bazowego - dostępne są nawet rc-scripts które w ładny sposób pozwalają skonfigurować interfejs i resztę rzeczy.

Sama konfiguracja poszła szybko i bezproblemowo - sterownik wykrył kartę bez problemu - skrypty podniosły interfejs - pozostało czekać jedynie na zestawienie łącza.

Niestety po uruchomieniu usługi przez TP sprawa się nieco skomplikowała. Otóż okazało się że całość po prostu nie działa. Po ponad 2 dniowych rozmowach z działem reklamacyjnym POLPAKu skierowano mnie wreszcie do kompetentnej (dziękuję Panie Grzegorzu za okazaną pomoc) osoby, która była mi stanie wyjaśnić mi na czym dokładnie polega problem.

Otóż TP podłącza klientów do dwóch rodzajów przełączników ATM, o ile przełączniki Nortel Passport 4860 nie sprawiają większych problemów, o tyle Nortel Passport 15000/20000 wymagają komunikacji z użyciem protokołu strict SDH.

Read the rest of this entry »

Kocham iTVP

creappy-itvp-via-opera-enjoy.JPG Jako iż siłą rzeczy przebywam aktualnie za granicą, jedynym kontaktem z informacjami z Polski jest dla mnie Internet. Oczywiście serwisy informacyjne bywają nieocenione - ale czasem człowiek ma ochotę obejrzeć i również nieco ruchomych obrazków w postaci naszych reżymowych wiadomości telewizyjnych. I oto na przeciw wychodzi nam dotowana z naszych publicznych pieniędzy, abonamentu i tak dalej TVP, która prowadzi serwis iTVP. Serwis byłby nawet ciekawy, o ile dało by się go oglądać - otóż z niewiadomych przyczyn, choć być może i wiadomych, TVP silnie wspiera poprzez technologie i sposób wykonania monopol firmy Microsoft. Próbując obejrzeć serwis serwis pod przeglądarką Opera otrzymujemy całkowicie zdeformowany i bezużyteczny kawałek czegoś. Dzięki temu niestety ludze używający na co dzień wyłącznie Opery nie są w stanie uzyskać dostępu do tegoż wspaniałego serwisu.

Oczywiście postanowiłem sprawę w iTVP wyjaśnić - czasem zdarza się jakieś niedopatrzenie podczas zmiany designu. Sam jestem programistą, wiem jak jest. Korzystając zatem z formularza kontaktowego napisałem co następuje:

Bosz - patrzal ktos na te strone pod Opera? Jak nie to sprawdzcie ja prosze. Ja wiem ze nei mozna wymagac wodotryskow ktore zapewni jedynie sluszna przegladarka - ale zeby choc sie pod opera cokolwiek pokazywalo i w jakis link dalo sie kliknac to bylo by super.

Ku mojej uciesze otrzymałem nawet po 24h odpowiedź, niestety po jej przeczytaniu mina mi lekko zrzedła, oto ona:

Witamy Nie sprawdzamy ani nie ustawiamy strony pod Operę. Oprócz "jedynej słusznej przeglądarki" strona świetnie działa także pod Firefoxem.

Czy drodzy Państwo mamy przez to rozumieć, iż dotowana z publicznych pieniędzy iTVP ma w głębokim poważaniu kilkanaście tysięcy użytkowników opery? Czy wreszcie nie świadczy to o 'profesjonalizmie' ekipy tworzącej iTVP? Nie mam pojęcia jak to rozumieć - może następna odpowiedź rozwieje moje wątpliwości - o ile następna odpowiedź się pojawi.

Nie pracuj dla korporacji.

Powszechnie sądzi się, że praca programisty jest pracą twórczą. Pracą na miarę artysty-demiurga, z zamysłem, który oczami wyobraźni widzi i wskazuje palcem co i gdzie. Niestety jest to tylko poniekąd zgodne z prawdą. Programista pracujący na usługach korporacji - z działami analityków biznesowych, z ustalonymi wzorcami, ustabilizowaną platformą softwareową jest tylko wyrobnikiem.

Praca w środowiskach korporacyjnych ma coś z układania klocków z obrazkami. Dostaje się wielką listę klocków, z których można korzystać, obrazek jak nasza konstrukcja ma wyglądać, czas w którym mamy się zmieścić z zakończeniem prac i zaczyna się zabawę. Przy czym jest tu jeden problem. O ile każdy klocki odpowiadają rysunkowi który mamy, sprawa jest prosta - jeśli jednak nie to mamy dylemat. Można wówczas problem brakującego klocka rozwiązać na dwa sposoby. Zrobić sobie taki klocek, lub wziąć najbardziej podobny do tego z obrazka i tak przerobić aby pasował do całości.

O ile zrobienie nowego klocka, idealnie spełniającego nasze oczekiwania wydaje się rzeczą naturalną, o tyle w przypadku pracy korporacyjnej tak naturalną rzeczą już nie jest. Otóż zrobienie nowego klocka to praca czasochłonna - a tego korporacje nie lubią. Dla tego najczęściej wybiera się opcję drugą.

Przejdźmy do przykładów - otóż załóżmy, że potrzebujemy klocek z obrazkiem portowego nabrzeża. Tymczasem po kilkugodzinnym grzebaniu w pudełku znajdujemy jedynie taki z hawajską plażą. Zgodnie zatem z wytycznymi biznesu przerabiamy go. I tu pojawia się następny problem - otóż klocek z plażą używany jest w dwudziestu innych miejscach i nie może zmienić swojego charakteru. Stawiamy zatem na owej plaży, w sobie tylko znanym miejscu dźwigi portowe i skrupulatnie maskujemy je bambusem i palmami.

I tak oto stajemy się jednym z trybów korporacyjnej maszyny, skierowanej na odtwórczą pracę. Praca w korporacjach Proszę Państwa daje zarobki, praca w korporacjach daje uznanie w oczach innych bo nakierowana jest na interpersonalno-socjalne stosunki. Ale praca w korporacjach dla programisty chcącego się rozwijać nie da satysfakcji. Praca taka to niekończące się pasmo grzebania w pudle z klockami i nieustannego potykania się w najmniej oczekiwanych miejscach o jakieś cholerne żelastwo zamaskowane liśćmi palmowymi.

Nie dziwić się należy zatem, że najlepsi programiści inwestują swój czas w projekty open source które pozwalają się im właściwie rozwijać.

Drugim dnem tego postu jest sprawa architektury platformy w której przyszło nam pracować. Używanie frameworku (to słowo elektryzuje korporacyjnych managerów, gdyż od razu przed oczami mają ilość zaoszczędzonego czasu) ma sens tylko wtedy, jeśli jest on zaprojektowany w sposób na tyle elastyczny, że pozwala na zbudowanie własnej aplikacji bez konieczności modyfikacji samego kodu frameworka. No niestety rzadkość - bo tego typu rzeczy buduje się na zasadzie - co potrzebujemy to wkładamy.