Aug 07 2008

Alternatywa dla sIFRa?

Tag: JavaScriptdooshek @ 10:46

Znamy już w miarę dobrze
sIFRa używaliśmy go przy okazji np. strony
GetZZZ. Dzisiaj znalazłem podobne
rozwiązanie które nazywa się FaceLift.

Generuje on obrazki z różnymi czcionkami w locie po stronie serwera czyli PHP + GD a nie jak sIFR po stronie przeglądarki (Flash). Na pewno jest łatwiejszy w implementacji jednak nigdzie nie doczytałem informacji o obsłudze UTFa. Jakiś czas temu próbowałem za pomocą GD zrobić parę polskich “krzaków” ale niestety nie wyszło mi to :(

Być może było to winą niepoprawnej czcionki (która nie miała w sobie znaków z puli UTF8) -  nie badałem tego tak dokładnie. Innym problemem z generowaniem obrazków po stronie serwera jest jego obciążenie. Oczywiście wygenerowany obrazek jest cachowany po stronie serwera (a więc napis jest generowany tylko raz) pozostaje jednak problem, że nadal wszystkie takie obrazki są przetwarzane przez PHP.

W przypadku “zwykłego” pobierania obrazków jest on serwowany bezpośrednio przez Apache’a, w przypadku generowanego niestety zawsze uruchamiany jest PHP co dodatkowo obciąża serwer (niewiele ale jednak). Rozwiązaniem jest nasz pomysł z wcześniejszym sprawdzaniem (przed wygenerowaniem strony) czy dany obrazek znajduje sie w cache’u i wygenerowanie URLa bezpośrednio do obrazka zanjdującego sie w cacheu.


Aug 07 2008

Zagrożenia związane z używaniem UTFa w PHP

Tag: PHPdooshek @ 10:33

Natknąłem się na fajną
stronkę która opisuje problemy i ryzyka związane z używaniem UTFa w PHP - wyszczególnione są różne phpowe funkcje - moim zdaniem “must have” dla każdego programisty PHP.


Jul 10 2008

Presja czasu czyli złośliwości timestampa w MySQL

Tag: MySQLmyszaq @ 09:07

Niedawno natrafiłem na dosyć osobliwy problem podczas definiowania kolumn w jednej z tabeli. Okazuje się, że wszystkim dobrze znany (mam taką nadzieję:)) typ TIMESTAMP rządzi się swoimi własnymi prawami i potrafi w pewnych sytuacjach namieszać dość konkretnie. O co chodzi? Wyobraźmy sobie, że chcemy stworzyć w tabeli ‘czasy’ 2 pola:

updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
edited_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

Niby wszystko jest w porządku, jednak pojawia się komunikat:

Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.

Niestety twórcy MySQL, chociaż opisali taką sytuację, nie raczyli napisać dlaczego tak się dzieje. Próba zastąpienia CURRENT_TIMESTAMP przez NOW() tudzież LOCALTIME() też nic nie daje, jako że są to wartości równoznaczne tej pierwszej. Warto przy tym wspomnieć, że typ TIMESTAMP daje dość duże możliwości, jeżeli chcemy dać polu wartość domyślną i/lub automatycznie uaktualniać przy użyciu nieszczęsnego CURRENT_TIMESTAMP. Możemy użyć go np. do czegoś takiego:
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
lub
updated_at TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP.

Wspaniale, tylko że dotyczy to pierwszej kolumny. Próba użycia CURRENT_TIMESTAMP w kolejnej kolumnie zakończy się powyższym błędem.
Co więc zrobić, gdy chcemy koniecznie mieć możliwość zdefiniowania defaultowej wartości dla obu takich pól czasowych (o aktualizacji nie wspominając)? Możemy zdefiniować pola następująco:

updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
edited_at TIMESTAMP NOT NULL DEFAULT '2008-01-01 00:00:00'

Zamiast jakiejś daty w polu DEFAULT możemy umieścić 0 lub nawet NULL, ale w tym ostatnim przypadku trzeba również pamiętać o zadeklarowaniu pola jako NULL. Takie pośrednie rozwiązania zapewne jednak nas nie satysfakcjonują - data w drugim polu stanie się szybko przestarzała a wartość zerowa do niczego się raczej nie przyda. Niestety tylko takie wyjście proponuje
manual.
Najlepiej jest zatem zapewnić samemu wstawianie odpowiednich wartości. I tu można się bardzo zdziwić - nie trzeba bowiem pisać
INSERT INTO czasy VALUES (NOW(), CURRENT_TIMESTAMP);

Jak to? Definiujemy tabelę ‘czasy’ w ten sposób:
create table czasy (
created_at timestamp NOT NULL default '0000-00-00 00:00:00',
updated_at timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
);

Następnie wykonujemy zapytanie
INSERT INTO czasy(created_at,updated_at) VALUES (NULL,NULL);

Jaki będzie efekt? Obie kolumny będą zawierać tą samą wartość - CURRENT_TIMESTAMP :) Dzieje się tak dlatego, że przypisanie kolumnie zdefiniowanej jako NOT NULL wartości NULL zamieni ją na aktualny czas.
A powiadają, że szczęśliwi czasu nie liczą…


Jul 09 2008

Nowy Fireshot

Tag: Programy, Przeglądarkiradmen @ 08:41
fireshot.png

Niedawno ukazała się nowa wersja rozszerzenia
FireShot. FireShot służy do robienia zrzutów ekranu przeglądanej strony. Rozszerzenie udostępnia sporo możliwości. Poza dodawaniem tekstu, możemy oznaczyć jakiś element strzałką, lub nawet zaznaczyć cały blok i go opisać. Jeśli tego nam mało to możemy pobawić się prostymi efektami graficznymi.

Dawniej FireShot był rozszerzeniem tylko dla
Firefoksa. Wraz z nową wersją mamy możliwość korzystać z tego programu jako rozszerzenie dla IE. Jest to o tyle przydatne, że nie musimy się bawić w robienie zrzutu, wrzucanie go do edytora i zapisywanie. Teraz, dzięki FireShot, możemy bez problemu zaznaczyć to co się krzaczy pod IE, szybko i bezboleśnie :)


Jun 30 2008

Mały ficzer FireBuga

Tag: HTML, JavaScript, PHP, Przeglądarkibuka @ 02:25

Podejrzewam, że nie wszyscy wiedzą, że Firebug ma małą pomocną funkcjonalność “poboczną”, którą niedawno przypadkiem odkryłem. Jak wiadomo, gdyby nie Firebug to debugowanie zapytań ajaxowych byłoby w ogóle masakrą. Dzięki FB jakoś dajemy radę. Można sobie w funkcji zrobić var_dump’a, albo print_r’a i w konsoli FB wyłuskać wynik. Ale ze względu na wyświetlenie w konsoli html’a jako tekstu, var_dump praktycznie odpadał. Ale jeżeli ktoś czuje się bardziej związany emocjonalnie z var_dump’em ;) to w końcu dochodzimy do tego co znalazłem - jeżeli w odpowiedzi na zapytanie w konsoli FB mamy wysyp kodu html, można na nim kliknąć MMB/wałkiem, a Firefox otworzy nam go w nowej karcie, zinterpretowanego i pokolorowanego :)firebug_mmb.png

That’s all, folks :) Mała rzecz, a cieszy ;)

ps. Tylko że nie zawsze to działa… ;P


Jun 19 2008

Wykorzystanie ceny brutto w rachunkach aplikacji

Tag: MySQL, PHPbirkin @ 01:24

W naszych serwisach bardzo często pojawia się zarządzanie cenami różnych produktów (wyliczanie cen, stawek VAT oraz innych skomplikowanych obliczeń). W większości przypadków podstawą jest cena netto, natomiast problem pojawia się, kiedy klient zażyczy aby podstawą była cena brutto!
Continue reading “Wykorzystanie ceny brutto w rachunkach aplikacji”


Jun 18 2008

FirePHP

Tag: JavaScriptskowron @ 09:11

Dzisiaj z rana znaleźliśmy fajny sposób na debugowanie kodu w php. Instaluje się jako dodatek do firebuga, dzięki czemu można wyświetlić zawartość zmiennej czy tablicy bez ingerencji w układ strony i otwierania popupów. Bibliotekę można znaleźć na
http://www.firephp.org.

Składa się ona z 2 modułów:

  • wtyczki do firefoxa, integrującej się z
    firebugiem,
  • funkcji / klasy napisanej w php którą trzeba podłączyć do swojego kodu php

potem wystarczy już tylko:

i już w zakładce console wyświetli się odpowiedni string :)

dokładny opis i możliwości znajdziecie bezpośrednio na
stronie wtyczki


Jun 16 2008

Adobe onAIR

Tag: JavaScriptskowron @ 07:55

onAir logoPonad tydzień temu 6 czerwca w stolicy gościliśmy pracowników Adobe, którzy przybyli do Nas szerzyć swoją “nową, rewolucyjną” technologię. Miałem przyjemność uczestniczenia w tej konferencji, którą oceniam jako na prawdę udaną!

Przede wszystkim należy docenić Ewangelistów z Adobe, którzy wkładają w to co robią bardzo dużo serca. Byli świetnie przygotowani, potrafili przedstawić prezentowany temat w bardzo przystępny, nie rzadko zabawny sposób. Po każdej z 2 - 3 prezentacji odbywała się krótka przerwa podczas której można było wrzucić coś do żołądka, wchłonąć trochę kofeiny z redbulla, pograć na Xboxie lub Wii, czy też co uważam za najcenniejsze porozmawiać z prelegentami z Adobe na osobności.

I tak dzięki temu udało mi się wyciągnąć nieco informacji:

  • jeszcze w tym roku powinniśmy spodziewać się wersji stabilnej środowiska w wersji dla Linuxa,
  • podobnie możemy oczekiwać aktualizacji używanej w środowisku wersji Webkita,
  • developerzy usilnie myślą nad możliwością uruchamiania innych programów z poziomu aplikacji AIR

Każdy do którego się zwróciłem starał się pomóc. Jeżeli nie znał odpowiedzi na zadane pytanie, wskazywał odpowiednią osobę do której mogłem się zwrócić.

Osobiście najbardziej zainteresował mnie sam Flex. Postanowiłem sobie że poznam go bliżej, co powinno być łatwiejsze dzięki gadżetom który otrzymał każdy z przybyłych. W których znalazła się między innymi ściągawka z API Flexowego. Każdy miał również możliwość wygrania Flex Builder 3 Professional i innych cennych fantów. Mi niestety zabrakło szczęścia :)

Każdy z ewangelistów posiada swojego bloga. Myślę że warto je na bieżąco śledzić. Ich adresy można znaleźć na stronach
onAIR. Dokładny zapis wideo, ma być dostępny na
http://onair.adobe.com/ w ciągu 2 tygodni. Za to już teraz można oglądać
zdjęcia umieszczone przez Mike’a Chambersa.

dokładną relację z konferencji można przeczytać na blogu
http://adobers.org/spotkania/adobe-on-air-tour-warsaw-2008


Apr 30 2008

MySQL i kolumny typu SET

Tag: MySQLbuka @ 11:25

Wszyscy znamy sql’owy SET jako np. określenie zestawu danych wrzucanych w odpowiednie kolumny. Ale SET jako typ kolumny, okazuje się nie wszystkim jest znany. Najprościej mówiąc jest to “trochę inny ENUM” :) A czym się różni i do czego go stosować możecie przeczytać dalej…
Continue reading “MySQL i kolumny typu SET”


Apr 23 2008

Commit MySQLowych transakcji

Tag: MySQLdooshek @ 12:54

Jak dobrze wiemy transakcje czasami się przydają. Wprawdzie używamy ich rzadko ale niekiedy są idealnym rozwiązaniem służącym głównie upraszczaniu kodu (nie musimy stosować wielu warunków) i zapewnienia integralności zapisywanych do bazy danych.

Kilkukrotnie jednak mieliśmy problem ze stwierdzeniem co dzieje się jeśli program zakończy swoje działanie po wykonaniu SQLa BEGIN (czy też START TRANSACTION). Przeprowadziłem mały inwestygejszyn i chciałbym to tutaj raz na zawsze wyjaśnić :)

Wygląda to tak, że dopóki nie wykonamy SQLa COMMIT dopóty zmiany nie zostaną zachowane w bazie. W praktyce nie trzeba nawet robić ROLLBACK - jeśli do końca danego połączenia nie wykonamy komita, to dane się nie zapiszą.

Poniżej przykład:

Wykonanie tego przykładu i zakończenie połączenia nie spowoduje wstawienia rekordu do tabeli sessions.

natomiast to jak najbardziej zadziała :) Być może są jakieś wyjątki od tych reguł - ja ich nie znalazłem.

Uwaga! W ramach tego samego połączenia - jeśli nie zrobimy ROLLBACK to dane będą “dostępne” czyli wykonanie:

spowoduje zwrócenie wstawionego wcześniej rekordu! Żeby tego uniknąć należy wykonać ROLLBACK (np. w przypadku kiedy jednak nie chcemy aby dane te zostały zapisane do bazy)

Uwaga! Zakończenie połączenia następuje również wtedy kiedy pojawi się jakiś błąd SQL (nasz framework w takim momencie kończy działanie z błędem lub pokazuje stosowny komunikat) więc w przypadku błędu SQL dane pomiędzy BEGIN…COMMIT nie zostaną zapisane (bo zabraknie COMMIT)


« Previous PageNext Page »