TechLife devBlog

Listopad 2009

Sumowanie statystyk Google Analytics

Kodowanie, Python, Techblog 20 listopada 2009 23:30

Zawsze mnie ciekawiło jaki jest ruch na naszym firmowym serwerze ale nie chciałem obciążać maszyny dodatkowym oprogramowaniem, które by to zliczało. Zwłaszcza że każda hostowana przez nas strona jest podpięta pod Google Analytics. Nie znalazłem jednak sposobu aby w panelu statystyk wyświetlić sumę odwiedzin z kilku kont. Na szczęście Analytics podobnie jak większość usług Googla ma swoje API. Wystarczyło więc zaprząc do pracy Pythona oraz bibliotekę gdata.

Użytkownikom ArchLinuksa polecam paczkę python-gdata-svn

yaourt -S python-gdata-svn

Skrypt jest dość prosty i działa w konsoli:

#!/usr/bin/python

import datetime import sys

import gdata.analytics import gdata.analytics.service

def main(argv):

GOOGLE_ANALYTICS_LOGIN = 'TWOJE@KONTO'
GOOGLE_ANALYTICS_PASSWORD = 'TAJNE_HASLO'

if len(argv) > 1:
    d = argv[1].split('-')
    data = datetime.date(int(d[0]), int(d[1]), int(d[2]))
else:
    data = datetime.datetime.now()

print "\ndata: %d-%d-%d" % (data.year, data.month, data.day)
print "\nodw\tods\tdomena"
print "--------------------------"

dc = gdata.analytics.service.AnalyticsDataService()
dc.ClientLogin(GOOGLE_ANALYTICS_LOGIN, GOOGLE_ANALYTICS_PASSWORD, account_type='GOOGLE')
a = dc.GetAccountList()

odwiedziny, odslony = [], []

for b in a.entry:
    tid = b.id.text.replace('http://www.google.com/analytics/feeds/accounts/','')
    query = dc.GetData(
        ids=tid, 
        start_date='%.4d-%.2d-%.2d' % (data.year, data.month, data.day), 
        end_date='%.4d-%.2d-%.2d' % (data.year, data.month, data.day), 
        metrics='ga:visitors,ga:pageviews',
        dimensions='ga:day'
    )
    odw = int(query.entry[0].visitors.value)
    ods = int(query.entry[0].pageviews.value)
    odwiedziny.append(odw)
    odslony.append(ods)
    print "\033[1;31m%d\t%d\033[0m\t\033[33m%s\033[0m" % (odw, ods, b.title.text)

print "--------------------------"
print "%d\t%d\tRazem" % (sum(odwiedziny),sum(odslony))

if name == "main": sys.exit(main(sys.argv))

Jeżeli wywoła się go bez parametrów wówczas pokaże statystyki dla dnia dzisiejszego. Można też podać mu jako parametr datę, np:

python stats.py 2012-12-21

Przykładowy wynik działania wygląda tak:
Przykład działania

Kto zabił elektryczny samochód?

Inne 17 listopada 2009 21:42

Dziś z pompą i paradą otwarto pierwszy w Polsce punkt ładowania samochodów elektrycznych. Na uroczystości nie mogło zabraknąć oczywiście elektrycznych samochodów. Takie rzecz jasna się zjawiły, niestety sztuk 2 (słownie: dwie).

Ktoś może spytać po co otwierać taki punkt dla dwóch samochodów? Oczywiście chodzi o promocję. Do połowy 2010 roku ma powstać 130 takich punktów (w tym 30 do końca grudnia). Jednak dlaczego do końca grudnia punktów ładowania ma być 15 razy więcej niż samochodów? Dlaczego nie mamy elektrycznych samochodów?

Od razu przypomniał mi się film, który oglądałem jakiś czas temu. Jego oryginalny tytuł brzmi Who Killed the Electric Car?. Autorzy filmu przedstawiają przerażającą historię, która doskonale wyjaśnia dlaczego nie jeździmy obecnie elektrycznymi autami, ciesząc się ich prostotą budowy/działania, ekologicznością, oszczędzając przy tym znaczne sumy pieniędzy. Kolejna teoria spiskowa? Warto obejrzeć, choćby dla Mela Gibsona ;-)

Jeżeli przeszkadzają komuś holenderskie napisy to możecie obejrzeć na youku.

Definiowanie własnych atrybutów w HTML-u

Kodowanie, Techblog 5 listopada 2009 23:31

Obecnie w czasach interfejsów napędzanych JavaScriptem coraz widoczniejszy staje się problem składowania danych w HTML-u. Prosty przykład: mamy generowany formularz, który chcemy zweryfikować za pomocą JavaScriptu. Przy generowaniu formularza posiadamy dla każdego pola zmienną mówiącą nam o tym czy to pole jest wymagane czy nie. I tu pojawia się problem, jak oznaczyć np. inputa jako pole wymagane? Struktura formularza nie daje nam miejsca na składowanie takich danych. Można kombinować z wrzuceniem jakiegoś słowa kluczowego do id. np:

id="required"

No ale id musi być niepowtarzalne, więc może klasa...

class="required"

Może, ale w sumie mam już tam kilka innych klas

class="specjalne kontrast required"

A więc czy klasa to na pewno dobre miejsce? Jasne że nie, klasa jest dla styli. No więc jak? Trzeba stworzyć własny atrybut! Niby jasne, ale przecież validator nie uznaje własnych atrybutów...

Otóż uznaje. Trzeba je tylko zadeklarować w definicji dokumentu - DTD (Document Type Definition). Załóżmy że chcemy wzbogacić nasz input w atrybut required. Wystarczy więc taka konstrukcja DTD:


]>

Ta dekladacja zezwala atrybutowi required posiadać dowolną wartość znakową. Jeżeli chcielibyśmy ograniczyć wartość jedynie do dwóch pozycji wystarczy zastosować coś takiego:


]>

Ogólny schemat jest taki:

ATTLIST element atrybut typ opcjnonalnyStatus

No i gotowe. Teraz możemy zaprząc JavaScript do podjęcia odpowiednich działań na podstawie struktury dokumentu. Czyli np. w jQuery:

$('input[required='true']').PrzypilnujInteresu();

Prosto czysto i funkcjonalnie.

Materiał źródłowy:
http://www.alistapart.com/articles/customdtd/

PS. Remember remember the fifth of november...