środa, 21 lipca 2010

Optymalizacja LAMP

Świetny artykuł dla początkujących osób zmagających się z optymalizacją serwisów działających na serwerach Apache2.

http://onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html

Autor zwraca uwagę na zużycie pamięci procesów apache i podaje propozycje rozwiązania problemu.

środa, 19 sierpnia 2009

AdWords API v2009 w PHP5 - część 1

Od release nowej wersji API minęło już parę miesięcy. Dopiero niedawno miałem okazję bliżej się temu przyjrzeć i trochę pokodować.
Nowa wersja znacznie różni się od poprzednich. Wygląda na to, że będziemy mieli więcej serwisów, w każdym serwisie tylko 2 metody. Np CampaignService w wersji 13 udostępniał szereg metod:
  • addCampaign
  • addCampaignList
  • getCampaign
  • getCampaignList
  • getCampaignStats
  • updateCampaign
  • ...
W nowej wersji API V2009 wszystkie te metody zostały zastąpione dwoma - get i mutate.
Metoda get zastępuje w zasadzie wszystkie metody z wersji 13 zaczynające się od get.... Mutate zastępuje metody add oraz update.

Metodą get możemy pobrać zarówno dane kampanii jak i jej statystyki. Jako parametr metody podajemy CampaignSelector, w którym to możemy zdefiniować o jakie kampanie i jakie dane nam chodzi. Np wybieramy tylko kampanie o statusie "ACTIVE" albo ID mieszczącym się w zbiorze 1,2,3,4,5.

Zanim przejdziemy do przykładu, najpierw kilka rzeczy które musimy mieć aby skorzystać z API:
  1. Konto Google
  2. Auth Token (autoryzacja była inaczej rozwiązana w v13)
  3. Zainicjalizowane konto adwords sandbox
Przykłady zapytań do AdWords API v2009 możemy znaleźć na Google Code. Zawarte tam przykłady korzystają z biblioteki nusoap i są to raczej "klejone z ręki" xmle.
W moim przykładzie korzystam z rozszerzenia php5-soap.

Dane do nagłówka/autoryzacji:
$headers = array (
'authToken' => 'xxxxxxxxxxx',
'clientEmail' => 'client_1+webdevday.sandbox@gmail.com',
'userAgent' => 'webdevday',
'developerToken' => 'webdevday.sandbox@gmail.com++EUR',
'applicationToken' => 'token',
);
Inicjalizacja klienta i header:
$ns = 'https://adwords.google.com/api/adwords/cm/v200906';
$service = 'https://adwords-sandbox.google.com/api/adwords/cm/v200906/CampaignService';

$client = new SoapClient($service .'?wsdl', array('trace' => true, 'connection_timeout' => 60, 'exceptions' => 1));

$soapHeaders = array(new SOAPHeader($ns, 'RequestHeader', $headers));


Przykład zapytania - odpowiednik metody getAllAdWordsCampaigns() z wersji 13:

$selector = array('ids' => array());
$params = array('selector' => $selector);
$method = 'get';


try {
$response = $client->__soapCall($method, array($params), null, $soapHeaders);
} catch (Exception $e)
{
var_dump($e->getMessage());
var_dump($client->__getLastRequest());
var_dump($client->__getLastResponse());
}

var_dump($response);



wtorek, 23 czerwca 2009

Postgresql i unix time (epoch)

Funkcją abstime możemy w łatwy sposób przekonwertować datę w formacie unix time (epoch). Np.

db=# select abstime(1245535200);
abstime
------------------------
2009-06-21 00:00:00+02
(1 row)


Możemy też użyć nazwy kolumny;


db=# select abstime(time), * from events;
abstime | city
-------------------------|---------
2009-06-21 00:00:00+02 | krakow
(1 row)



W drugą stronę jest trochę więcej pisania:


db=# select extract(epoch from timestamp '2009-06-21');
date_part
------------
1245535200
(1 row)


Przy użyciu tych funkcji możemy manipulować danymi zmieniając unix time na datę i odwrotnie. Mam nadzieję, że komuś się przyda.

Funkcje date/time dla postgresqla są na http://www.postgresql.org/docs/8.3/interactive/functions-datetime.html

środa, 1 kwietnia 2009

Polak potrafi, adwords

Jak widać na poniższym obrazku, terms&conditions Google AdWords da się przeskoczyć. W każdym razie Polak potrafi.

środa, 25 lutego 2009

Staregacie.pl

Przy okazji jednej z głupkowatych rozmów na gg padło hasło zakupu domeny staregacie.pl. Po wpisaniu domeny w przeglądarkę poważnie się zdziwiłem. Oczywiście nie tym, że domena jest zajęta, spodziewałem się czegoś w rodzaju spierdalaj.pl lub jakiejś xxx strony dla fetyszów, ewentualnie sklepu z bielizną, ale to co zobaczyłem przebiło wszystko z czym miałem dotychczas do czynienia.
Spokojnie nie ma tam żadnych obrzydliwości, treści pornograficznych czy czegoś w tym rodzaju. Wręcz przeciwnie, domena przekierowuje na stronę firmy NIVEA do oferty produktów linii Energy Fresh.

No coż od dziasiaj możemy odwiedzać stronę nivea za pomocą http://staregacie.pl/

czwartek, 27 listopada 2008

Operatory post i pre-increment w PHP

Na pierwszy rzut oka prawie nie ma roznicy:
$i = 0;
while ($i < 1000000)
{
    $i++;
}



czy:

$i = 0;
while ($i < 1000000)
{
    ++$i;
}

W każdym razie wynik będzie ten sam. A jednak różnica w implementacji obu operatorów jest spora. W pierwszym przykładzie użyłem operatora post-increment, który dodaje do 1 do zmiennej $i po wykonaniu lini kodu. W drugim przypadku 1 jest dodawane przed wykonaniem lini kodu.
W większości zastosowań nie ma to znaczenia, jednak przy dużej ilości takich operacji może mieć znaczący wpływ na wydajność naszej aplikacji. A co za tym idzie, zużycie czasu procesora, energii, efekt cieplarniany ;)
Dzieje się tak, ponieważ aby wykonać $i++ jest konieczne wykonanie kopii zmiennej. Czyli w efekcie mamy "dwie" zmienne $i. Jedna przechowuje poprzednią wartość a druga przechowuje wartość po dodaniu jedynki.
Zrobiłem pare testów szybkości na powyższym kodzie. Czas wykonania pętli z zastosowaniem $i++ jest o 10% większy niż wykonanie tej samej pętli z zastosowaniem ++$i.
Warto na takie sprawy zwracać uwagę, szczególnie w projektach w których przetwarzamy duże ilości danych.

W następnych postach postaram się opisać trochę więcej zagadnień związanych z wydajnością oraz optymalizacją kodu.

poniedziałek, 3 listopada 2008

Continuous integration - Bitten

Pisanie testów (unit testów, testów funkcjonalnych, selenium) stało się integralną częścią większości projektów. Jednak uruchamianie dużej liczby testów może zajmować sporo czasu. Ponadto jeżeli nad projektem pracuje kilku programistów może pojawić się typowy problem, że u kogoś działa a u kogoś innego nie. Warto więc stworzyć środowisko testowe, na którym testy będą uruchamiane automatycznie.
Jeżeli korzystasz z Traca i Subversion możesz skorzystać z Bittena (http://bitten.edgewall.org/).
Poprzez zdefiniowane regułki Bitten aktualizuje kod w środowisku testowym (svn update), uruchomia skrypty migracji bazy, konfiguracji oraz uruchamia testy.
Procedura jest uruchamiana przy każdej zmianie kodu a raport jest dostępny poprzez Traca (http://bitten.edgewall.org/build/trunk)