Professional Documents
Culture Documents
Diplomska Naloga - Matjaz Pecan
Diplomska Naloga - Matjaz Pecan
V
LJUBLJANI
Fakulteta
za
elektrotehniko
Matjaž
Pečan
Zahvala
Zahvaljujem
se
mentorju
doc.
dr.
Boštjanu
Murovcu
za
pomoč,
podporo
in
potrpežljivost
med
pisanjem
diplomskega
dela.
Prav
tako
se
zahvaljujem
tudi
svojim
staršem,
ki
sta
me
podpirala
med
dolgim
študijem
in
nikoli
nista
izgubila
upanja.
Zahvala
gre
tudi
vsem
mojim
prijateljem
in
prijateljicam,
ki
so
mi
v
času
študija
dajali
nasvete
in
mi
pomagali.
Povzetek
Diplomsko
delo
opisuje
razvoj
spletnega
servisa
za
sinhronizacijo
kontaktov
med
spletno
storitvijo
Google
Kontakti
in
socialnim
omrežjem
Facebook.
Storitev
samostojno
povezuje
uporabnikove
kontakte
in
prijatelje
na
Facebooku,
zatem
pa
sinhronizira
dostopne
kontaktne
podatke.
V
prvem
delu
je
podan
koncept
rešitve,
kjer
so
predstavljene
osnovne
ideje,
arhitektura
in
utemeljitev
načina
povezovanja
kontaktov
s
prijatelji.
V
nadaljevanju
je
opisana
platforma
Google
App
Engine,
na
kateri
je
bil
razvit
spletni
servis,
opisan
je
način
dostopa
do
uporabnikovih
podatkov
s
protokolom
OAuth
in
uporabljene
knjižnice.
V
drugem
delu
je
prikazana
struktura
baze
podatkov
in
njena
izvedba,
zatem
pa
je
opisana
tudi
izvedba
servisa
z
strukturo
in
optimizacija
le-‐tega.
Na
koncu
je
prikazana
še
analiza
stroškov
povezanih
z
vzdrževanjem
storitve.
Ključne
besede:
spletni
servis,
sinhronizacija,
Google
App
Engine,
avtorizacija,
OAuth,
Google
Kontakti,
Facebook,
Java
Abstract
The
thesis
describes
the
development
of
a
web
service
for
the
syncronization
of
contact
data
between
the
web
service
Google
Contacts
and
the
Facebook
social
network.
The
service
automatically
matches
the
user's
contacts
with
his
friends
on
Facebook
and
syncronizes
the
available
data.
The
first
part
describes
the
conceptual
idea
of
the
service,
its
architecture
and
details
the
way
contacts
and
friends
are
matched.
It
also
describes
the
Google
App
Engine
platform,
on
which
the
service
was
created,
the
way
that
user
data
is
accessed,
the
use
of
OAuth
and
the
libraries
used
in
the
service.
The
second
part
details
the
structure
of
the
database
and
its
implementation,
the
structure
of
the
service
itself
and
the
optimization
process.
In
the
end
a
cost
analysis
is
made.
Keywords:
web
service,
syncronization,
Google
App
Engine,
authorization,
OAuth,
Google
Contacts,
Facebook,
Java
Kazalo
1. UVOD ........................................................................................................................................... 1
I
4.3.2.
Zahteve
in
branje
podatkov
...................................................................................................
25
4.3.3.
FQL
zahteve
..................................................................................................................................
25
4.3.4.
Iskanje
.............................................................................................................................................
26
II
Kazalo
slik
Slika
2.1
-‐
Prikaz
medsebojnih
povezav
procesov
v
spletnem
storitvi
.......................................
3
Slika
2.2
–
Potek
avtentikacije
in
avtorizacije
........................................................................................
5
Slika
2.3
-‐
Shema
procesa
pridobivanja
kontaktnih
podatkov
.......................................................
6
Slika
2.4
–
Shema
procesa
povezovanja
kontaktov
in
uporabnikovih
prijateljev
..................
7
Slika
2.5
-‐
Shema
procesa
sinhronizacije
...............................................................................................
11
Slika
4.1
-‐
prikaz
poteka
OAuth
avtorizacije
........................................................................................
19
Slika
5.1
-‐
Struktura
baze
podatkov
.........................................................................................................
27
Slika
6.1
-‐
Struktura
paketov
client
in
server
......................................................................................
34
Slika
6.2
-‐
Proces
dodajanja
opravil
za
sinhronizacijo
.....................................................................
35
Slika
6.3
-‐
Časovni
in
zmogljivostni
potek
procesa
povezovanja
kontakta
.............................
40
Slika
6.4
-‐
Časovni
in
zmogljivostni
potek
procesa
povezovanja
kontaktov
(100
kontaktov)
.................................................................................................................................................
41
III
Kazalo
tabel
Tabela
6.1
-‐
Cenik
storitev
Google
App
Engine
...................................................................................
42
Tabela
6.2
-‐
Podatki
testnih
uporabnikov
storitve
...........................................................................
42
Tabela
6.3
-‐
Projekcija
stroškov
vzdrževanja
storitve
.....................................................................
44
IV
Seznam
uporabljenih
kratic
in
simbolov
API
–
Aplikacijski
programski
vmesnik.
GAE
–
Google
App
Engine,
aplikacijski
strežnik,
ki
ga
oskrbuje
podjetje
Google.
HTML
–
HyperText
Markup
Language,
jezik
za
določitev
strukture
dokumentov,
ki
se
prenašajo
po
spletu
in
pregledujejo
s
spletnimi
brskalniki.
JSON
–
JavaScript
Object
Notation,
format
izmenjave
podatkov.
Memcache
–
Mehanizem
za
pospešitev
izvajanja
programa
z
uporabo
dinamičnega
pomnilnika.
RPC
–
Remote
procedure
call,
klic
oddaljene
procedure.
URL
–
Uniform
Resource
Locator,
internetni
naslov,
na
katerem
se
nahaja
vsebina.
V
VI
1. Uvod
Živimo
v
času
mobilnih
naprav
in
komunikacij.
Na
razpolago
imamo
veliko
število
naprav,
ki
nam
omogočajo
hiter
dostop
do
interneta
na
poti
in
doma.
Istočasno
ima
čedalje
več
uporabnikov
večje
število
takih
naprav.
Vsaka
od
njih
se
povezuje
na
svetovni
splet
in
izvaja
sinhronizacijo
z
strežniki
za
razne
namene,
naj
bo
to
e-‐pošta,
kontakti
ali
pa
koledar.
Po
mnenju
uporabnikov
mobilnih
naprav,
je
med
najpomembnejšimi
lastnostmi
naprave
čas
mobilnega
delovanja
[1],
torej
čas,
ko
je
naprava
v
delovanju
brez
zunanjega
napajanja.
Sinhronizacija
z
različnimi
servisi
pomeni
izgubo
energije,
kar
morda
lahko
upravičimo
pri
enem
servisu,
v
primeru,
da
jih
uporabljamo
več,
je
potrebna
sinhronizacija
za
vsak
servis
posebej.
Pri
tem
ne
gre
le
za
podvajanje
podatkov,
težava
je
v
dodatnih
podatkih
(ang.
overhead),
ki
so
potrebni
za
sinhronizacijo
zaradi
protokolov
in
usklajevanja
aplikacij.
Ti
podatki
pomenijo
dodatno
obremenitev
procesorja
in
komunikacijske
poti
z
zunanjim
svetom,
kar
vodi
v
izgubo
časa
delovanja
zaradi
nepotrebne
porabe
energije.
Sinhronizacijo
je
mogoče
izvrševati
v
oblaku
(ang.
cloud),
saj
so
storitve
v
oblaku
danes
poceni.
Omogočajo
uporabo
strežniških
sistemov,
ki
so
sestavljeni
iz
tisočev
posameznih
strežnikov
in
so
zaradi
tega
zmožni
obdelati
velike
količine
podatkov.
Sinhronizacija,
ki
se
na
mobilni
napravi
izvaja
več
minut,
je
v
oblaku
opravljena
v
sekundah,
hkrati
mobilna
naprava
prihrani
skoraj
toliko
minut
delovanja,
saj
je
ta
čas
v
mirovanju.
Računalništvo
v
oblaku
je
internetna
tehnologija,
za
katero
je
značilno
deljenje
sredstev,
programske
opreme
in
informacij
med
več
spletnimi
storitvami
[2].
Uporaba
naprav
in
programske
opreme
se
v
oblaku
izvaja
na
zahtevo,
torej
ni
potrebno
imeti
zakupljenih
zmogljivosti,
obračunajo
se
le
opravljene
storitve.
Ko
razvijamo
aplikacije
za
oblak,
se
nam
ni
potrebno
ukvarjati
s
tehničnimi
podrobnostmi
storitev,
saj
so
le-‐te
skrite
za
oblaki.
1
V
diplomskem
delu
prikazujemo
razvoj
sinhronizacijskega
sistema,
ki
povezuje
servis
Google
Kontakti
[3]
in
socialno
omrežje
Facebook
[4].
Sistem
je
sestavljen
modularno
in
vsebuje
dva
poglavitna
modula.
Prvi
modul
ugotavlja
povezave
med
razpoložljivimi
kontakti
in
Facebook
prijatelji,
drugi
modul
pa
izvaja
sinhronizacijo.
Zaradi
omejitev,
ki
jih
Facebook
uveljavlja
nad
uporabniškimi
podatki,
je
žal
mogoče
sinhronizirati
le
rojstni
datum,
ime,
priimek
in
fotografijo,
a
sistem
bo
z
manjšimi
spremembami
omogočal
sinhronizacijo
vseh
razpoložljivih
podatkov
v
trenutku,
ko
bo
Facebook
omogočil
dostop
do
njih.
Pri
izvedbi
smo
se
zaradi
cenovne
ugodnosti
in
visoke
zmogljivosti
odločili
za
uporabo
servisa
Google
App
Engine
[5]
(v
nadaljevanju
GAE).
2
2. Idejna
zasnova
storitve
V
sistemu
želimo
sinhronizirati
podatke
med
dvema
spletnima
servisoma,
spletnim
omrežjem
Facebook
in
Google
Kontakti.
Na
sliki
2.1
so
prikazane
povezave
med
procesi,
ki
se
izvajajo
v
spletni
storitvi.
Vrstni
red
izvajanja
procesov
je
ponazorjen
z
številkami
od
1
do
4.
Proces
3
se
ne
more
izvesti
v
primeru,
da
se
še
nista
izvedla
procesa
1
in
2.
Na
sliki
so
s
črtkano
črto
obkroženi
procesi,
ki
se
izvajajo
na
oddaljenih
strežnikih
in
nad
njimi
nimamo
nadzora.
Polne
puščice
predstavljajo
prenos
oz.
zapisovanje
podatkov,
medtem
ko
prazne
puščice
predstavljajo
izključno
prenos
podatkov,
potrebnih
za
avtentikacijo.
Slika
2.1
-‐
Prikaz
medsebojnih
povezav
procesov
v
spletnem
storitvi
3
Ko
je
uporabnikova
istovetnost
preverjena
in
je
le-‐ta
storitvi
dodelil
dostop
do
podatkov,
se
prične
pridobivanje
podatkov,
ki
so
potrebni
za
nadaljne
izvajanje
storitve.
Glavni
vir
podatkov
za
spletno
storitev
predstavljajo
kontaktni
podatki,
ki
jih
ima
uporabnik
shranjene
v
spletni
storitvi
Google
Kontakti,
zato
storitev
le-‐te
prenese
v
lokalno
bazo
podatkov,
tako
da
so
potem
na
razpolago
za
nadaljnjo
obdelavo.
Pri
tem
se
zavoljo
varovanja
podatkov
in
zmanjševanja
porabe
plačljivih
zmogljivosti
izpusti
podatke,
ki
jih
spletna
storitev
ne
potrebuje
za
delovanje.
Sistem
naj
bo
postavljen
tako,
da
se
podatki
po
prvem
prenosu
le
osvežujejo.
Po
pridobitvi
podatkov
se
prične
povezovanje
uporabnikovih
kontaktov
z
uporabnikovimi
prijatelji
(povezavami)
na
Facebooku.
Zato
so
potrebni
kriteriji,
ki
povezovanje
omogočajo.
E-‐poštni
naslov
vsakega
kontakta
je
edinstven,
kar
pomeni,
da
je
le-‐ta
z
njim
v
celoti
definiran.
V
primeru,
da
kontakt
ne
vsebuje
e-‐poštnega
naslova,
ali
z
naslovom
ni
mogoče
najti
kontakta
v
socialnem
omrežju
Facebook,
to
predstavlja
problem
povezovanja
zapisov
(ang.
record
linkage)
[6].
Ko
so
povezave
vzpostavljene
in
zapisane,
se
tisti
kontakti,
ki
so
zanesljivo
povezani,
posodobijo
s
podatki,
ki
so
razpoložljivi
na
Facebooku.
Ker
na
omrežje
samo
ni
mogoče
zapisovati
dodatnih
podatkov,
je
postopek
enosmeren.
4
2.1. Avtentikacija
in
avtorizacija
Postopek
se
prične,
ko
uporabnik
naloži
stran
spletne
storitve.
Potrebno
je
ugotoviti
istovetnost
uporabnika
in
v
primeru,
da
še
ni
prijavjen
v
storitev,
tudi
vpisati
v
bazo
uporabnikov.
Na
sliki
2.2
je
prikazan
diagram
poteka
avtorizacije
in
avtentikacije.
Procesi,
ki
so
obkroženi
s
prekinjeno
črto,
potekajo
na
oddaljenih
strežnikih
in
nad
njimi
nimamo
nadzora.
Ko
je
istovetnost
uporabnika
uspešno
ugotovljena
(1),
se
preveri
(2),
ali
je
le-‐ta
storitvi
dodelil
dostop
do
podatkov
pri
Google
Kontaktih
in
pri
Facebooku.
Če
uporabnik
tega
še
ni
opravil,
ga
storitev
napoti
na
avtorizacijo
(3),
ki
se
izvede
na
oddaljenem
strežniku.
V
primeru
uspešne
avtorizacije
(4)
se
zapišejo
podatki,
potrebni
za
dostop,
nakar
se
ponovno
preveri
stanje
avtorizacije.
V
primeru
veljavne
avtorizacije
se
proces
zaključi
in
uporabniku
servis
prikaže
stran,
ki
potrjuje,
da
je
uspešno
zaključil
nastavitev
storitve.
Slika
2.2
–
Potek
avtentikacije
in
avtorizacije
5
2.2. Pridobivanje
in
shranjevanje
podatkov
Podatki,
brez
katerih
ni
mogoče
povezati
kontaktov
z
njihovimi
profili
na
Facebooku,
so
e-‐poštni
naslovi,
imena
in
priimki.
Zaradi
tega
se
ti
podatki
prenesejo
iz
Google
Kontaktov
in
se
shranijo
v
bazo
podatkov.
Hkrati
se
shrani
tudi
podatek,
ki
kontakte
enoznačno
definira,
v
tem
primeru
je
to
identifikacijski
naslov
kontakta
v
Google
Kontakih.
Shema
procesa
je
prikazana
na
sliki
2.3.
Proces
se
prične
s
sestavo
zahteve
(1),
ki
bo
poslana
(2)
na
oddaljeni
strežnik.
V
primeru,
da
zahteva
vključuje
primerne
podatke
za
dostop,
oddaljeni
strežnik
lokalnemu
strežniku
vrne
(3)
zahtevane
podatke,
v
nasprotnem
primeru
lokalnemu
strežniku
javi
napako
avtorizacije
(4).
Podatki
se
na
lokalnem
strežniku
obdelajo
(5)
in
shranijo
v
bazo
kontaktov
(6).
Slika
2.3
-‐
Shema
procesa
pridobivanja
kontaktnih
podatkov
6
2.3. Povezovanje
kontaktov
in
prijateljev
S
podatki,
ki
so
na
rapolago,
servis
prične
postopek
povezovanja
kontaktov
in
uporabnikovih
prijateljev
na
Facebooku.
Shema
procesa
je
predstavljena
na
sliki
2.4.
Proces
se
prične
z
branjem
kontakta
(1),
katerega
je
potrebno
povezati,
iz
baze
kontaktov.
S
podatki
se
pripravi
zahteva
(2),
ki
se
pošlje
na
oddaljeni
strežnik.
Na
strežniku
se
preveri
veljavnost
avtorizacije
(3).
Podatki,
prejeti
z
oddaljenega
stežnika,
se
obdelajo
v
algoritmu
za
povezovanje
(4).
V
primeru
uspeha
pri
iskanju
povezave
(5),
se
kontakt
z
informacijo
o
povezavi
zapiše
(6)
v
bazo
kontaktov,
v
nasprotnem
primeru
se
proces
neuspešno
zaključi
(7)
in
ne
zapiše
nobenih
podatkov.
Slika
2.4
–
Shema
procesa
povezovanja
kontaktov
in
uporabnikovih
prijateljev
7
naslov
ni
na
voljo,
ali
le-‐ta
ne
predstavlja
povezave
med
kontaktom
in
oddaljenim
računom,
moramo
poskusiti
najti
povezavo
na
drugačen
način.
Kjer
l
predstavlja
število
let,
ki
jih
privzamemo
kot
okvir
pri
izračunu.
Sedaj
moramo
ugotoviti
še
število
oseb
n,
ki
jih
obravnavamo
v
povezavi
z
našim
problemom.
Predpostavimo,
da
so
imena
in
priimki
nepovezane
spremenljivke,
zato
lahko
iz
podatkov
[8]
Statističnega
Urada
Republike
Slovenije
za
najpogostejša
imena
in
priimke
razberemo,
da
je
najpogostejše
ime
Marija,
s
69.314
ponovitvami.
Najpogostejši
priimek
pa
je
Novak,
z
11.311
ponovitvami.
Predpostavimo,
da
je
pogostost
imena
Marija
med
ljudmi
s
priimkom
Novak
enaka
kot
za
celotno
prebivalstvo
Republike
Slovenije.
Potemtakem
je:
69.314
! = 11.311× = 385,76 ≅ 386
2.032.362
V
primeru,
da
to
uporabimo
v
enačbi
in
privzamemo
časovni
okvir
10
let,
dobimo
verjetnost:
8
!!" 386 ≅ 0,9999 = 99,99%
Če
privzamemo
časovni
okvir
100
let
je
rezultat:
!!"" 386 ≅ 0,8694 = 86,94%
Zaključimo,
da
je
verjetnost
enakosti
vseh
treh
podatkov,
v
primeru
Marije
Novak,
zelo
visoka,
zaradi
česar
ti
podatki
niso
zadostni
za
enoznačno
določitev
osebe
v
Sloveniji.
Ta
obravnava
sicer
predstavlja
najslabši
možni
izid,
ki
pa
je
v
našem
primeru
najpomembnejši,
saj
moramo
biti
prepričani,
da
kontakt
in
povezava
na
socialnem
omrežju
Facebook
predstavljata
isto
osebo.
1
!(!; 365×!) ≈ 2×365×!× ln
1−!
Kjer
n
predstavlja
število
ljudi,
l
predstavlja
letni
okvir,
p
pa
predstavlja
verjetnost.
V
primeru
p=0,1%
je:
9
! 0,001; 365×10 ≈ 2.7
Torej
moramo
v
primeru
časovnega
okvira
10
let,
v
katerem
se
pojavljajo
rojstni
dnevi
prijateljev,
imeti
skoraj
tri
prijatelje
z
enakim
imenom
in
priimkom,
zato
da
bi
bila
verjetnost
enakosti
njihovih
podatkov
0,1%.
Ker
menimo,
da
to
predstavlja
dovolj
majhno
verjetnost
ponovitve
pri
določanju
povezav
med
kontakti
in
prijatelji
na
socialnem
omrežju
Facebook,
bomo
ta
princip
uporabili
tudi
v
našem
servisu.
10
2.4. Sinhronizacija
Ko
je
povezovanje
kontaktov
zaključeno,
se
lahko
prične
sinhronizacija.
Le-‐ta
je
enosmerna,
saj
podatkov
prijateljev
na
Facebooku
ni
mogoče
spreminjati.
Med
sinhronizacijo
se
pridobijo
podatki
iz
Google
Kontaktov
in
iz
Facebooka.
Postopek
je
prikazan
na
sliki
2.5.
Najprej
se
pripravita
podatkovni
zahtevi
(1)
za
oba
spletni
storitvi.
Oddaljena
strežnika
preverita
istovetnost
zahtev
(2)
in
v
primeru,
da
so
zahteve
istovetne,
vrneta
zahtevane
podatke
(3).
Preneseni
podatki
se
primerjajo
(4)
in
po
potrebi
se
sproži
postopek
posodobitve.
V
okviru
postopka
posodobitve
se
pripravi
zahteva
za
posodobitev
(5),
ki
se
pošlje
na
oddaljeni
strežnik
storitve
Google
Kontakti.
Ta
potrdi
spremembo
(6)
in
proces
sinhronizacije
se
uspešno
zaključi.
Slika
2.5
-‐
Shema
procesa
sinhronizacije
11
12
3. Google
App
Engine
Google
App
Engine
omogoča
pogon
spletnih
storitev
na
Google
infrastrukturi
[5].
Storitve
je
mogoče
napisati
v
več
programskih
jezikih,
izmed
katerih
sta
najbolje
podprta
Java
in
Python.
Z
uporabo
prevajalnikov
ali
interpreterjev,
ki
podpirajo
izvajanje
na
JVM
(Java
Virtual
Machine)
[10],
je
mogoče
uporabiti
tudi
druge
jezike,
ki
se
uporabljajo
za
razvijanje
spletnih
aplikacij:
JavaScript,
Ruby
ali
Scala.
GAE
je
še
posebej
zanimiv
zaradi
nizkih
vstopnih
stroškov,
saj
so
osnovne
storitve
na
razpolago
brezplačno
in
je
zaradi
tega
primeren
za
projekte
z
omejenimi
finančnimi
sredstvi.
Glavne
prvine
okolja
GAE
so:
• dinamične
spletne
vsebine
s
podporo
za
večino
spletnih
tehnologij,
• trajna
hramba
podatkov
s
poizvedbami,
razvrščanjem
in
transakcijami,
• avtomatsko
skaliranje
sistema
in
prerazporeditev
obremenitev,
• APIji
za
avtentikacijo
uporabnikov
z
uporabo
Google
računov
ter
pošiljanje
e-‐
pošte,
• lokalno
razvojno
okolje
za
simulacijo
GAE
na
osebnem
računalniku,
• čakalne
vrste
opravil
(ang.
task
queues),
ki
omogočajo
izvajanje
opravkov
neodvisno
od
spletnih
zahtevkov,
• nastavljanje
ponavljajočih
se
opravil
(ang.
cronjobs),
ki
se
izvajajo
ob
želenih
trenutkih.
13
Tak
način
delovanja
prinaša
tudi
omejitve:
• aplikacije
ne
morejo
neposredno
dostopati
do
podatkov
na
drugih
internetnih
straneh,
temveč
so
primorane
za
to
uporabiti
APIje,
ki
so
na
razpolago
v
okolju
GAE
(primer:
pridobivanje
podatkov
na
internetu
ter
pošiljanje
e-‐pošte),
• aplikacije
ne
morejo
zapisovati
podatkov
v
datotečni
sistem;
namesto
tega
lahko
uporabljajo
storitev
za
zapis
podatkov
(datastore)
• aplikacije
lahko
tečejo
samo
kot
odziv
na
spletno
zahtevo,
kot
opravilo
v
vrsti
ali
pa
ponavljajoče
se
opravilo.
V
primeru
spletne
zahteve
se
mora
aplikacija
s
podatki
odzvati
najkasneje
v
30
s,
medtem
ko
je
v
primeru
ostalih
opravil
(opravila
iz
čakalnih
vrst
ter
ponavljajoča
opravila)
ta
omejitev
10
min
[11].
14
shranjevanju
podatkov
niso
pri
vseh
projektih
enake,
sta
omogočena
dva
principa
shranjevanja
podatkov
[12]:
• sistem
gospodar
/
suženj
(ang.
Master/Slave):
poudarek
je
na
razpoložljivosti
podatkov,
do
njih
dostopamo
hitreje,
vse
to
pa
na
račun
zanesljivosti,
• sistem
z
visoko
stopnjo
podvajanja
(ang.
high
replication
datastore):
poudarek
je
na
zanesljivosti
hrambe
podatkov,
podatki
so
na
razpolago
tudi
med
izjemnimi
razmerami,
a
je
ta
sistem
dražji
in
v
določenih
primerih
se
zahteve
počasneje
izvajajo.
Hramba
podatkov
je
izjemno
konsistentna
in
deluje
vzporedno,
pri
tem
pa
se
konflikti
v
primeru
zapisa
v
isto
celico
rešujejo
z
optimističnim
nadzorom
večopravilnosti
[13]
(ang.:
optimistic
concurrency
control
-‐
OCC).
Pri
OCC
predpostavljamo,
da
bo
pogostost
hkratnega
dostopa
do
podatkov
in
spreminjanja
le-‐teh
s
strani
večih
uporabnikov
majhna.
Zato
dostopa
do
podatkov
ne
zaklepamo
in
omogočamo
vzporeden
dostop.
Zaradi
ohranjanja
konsistence
podatkov
smo
primorani
zavrniti
zahtevo
po
zapisu
podatkov
s
strani
uporabnika,
če
je
bil
podatek
spremenjen
med
časom,
ko
je
uporabnik
podatek
prebral,
in
časom,
ko
ga
poskuša
zapisati.
To
je
največkrat
izvedeno
tako,
da
imamo
poleg
podatka
samega
še
ključ,
ki
predstavlja
verzijo
podatka
in
ob
zapisu
preverimo
verzijo
podatka
ter
zavrnemo
zapis
v
primeru,
da
obstaja
novejši
podatek.
15
3.4.2. Memchache
API
Memcache
API
[15]
omogoča
shranjevanje
podatkov
v
delovni
pomnilnik,
kar
omogoča
hitrejši
dostop
do
podatkov.
Memcache
je
v
Google
App
Engine
izveden
v
skladu
s
specifikacijo
JSR
107
[16],
dostop
do
APIja
pa
je
mogoč
z
uporabo
knjižnice
net.sf.jsr107cache.
V
našem
projektu
je
dostop
do
Memcache
APIja
še
posebej
pomemben,
ker
v
njem
uporabljamo
veliko
podatkov,
ki
so
shranjeni
v
trajnem
pomnilniku,
do
katerega
so
dostopi
časovno
in
zmogljivostno
zahtevni,
z
uporabo
Memchache
funkcije
pa
zmanjšamo
število
klicev
branja
trajnega
pomnilnika
tako,
da
podatke
preberemo
enkrat
in
jih
shranimo
v
delovni
pomnilnik
za
kasnejši
dostop.
Dinamični
pomnilnik
je
izveden
tako,
da
shranjeni
podatki
ostanejo
v
njem
dokler
je
to
mogoče,
oz.
dokler
ne
prične
zmanjkovati
prostora
in
se
podatki
pričnejo
izločati
iz
njega.
Zato
moramo
pred
vsakim
prevzemom
podatka
iz
dinamičnega
pomnilnika
preveriti,
ali
podatek
še
vedno
obstaja.
V
nasprotnem
primeru
bomo
prisiljeni
podatek
prebrati
iz
trajnega
pomnilnika.
16
4. Dostop
do
podatkov
Za
dostop
do
uporabnikovih
podatkov,
v
tem
primeru
so
to
podatki
Google
Kontaktov
in
Facebooka,
je
potrebno
spletni
servis
pooblastiti
za
dostop.
To
je
mogoče
izvesti
z
direktno
avtentikacijo
uporabnika
z
njegovim
uporabniškim
imenom
in
geslom,
ki
ju
shranimo
v
svojo
bazo
podatkov.
Bolje
je,
če
uporabimo
avtentikacijo
preko
protokola
OAuth
[19],
ki
nam
omogoča
dostop
do
podatkov
uporabnika
brez
njegovega
gesla,
hkrati
pa
ima
uporabnik
vedno
možnost
ta
dostop
preklicati,
ne
da
bi
zaradi
tega
bil
primoran
spremeniti
geslo
za
dostop
do
zunanje
storitve.
17
Aplikacija
do
podatkov
uporabnika
ne
dostopa
z
geslom,
temveč
za
ta
dostop
zaprosi
avtorizacijski
strežnik
za
žeton
za
dostop
(ang.
access
token),
v
obliki
tekstovnega
zapisa,
v
katerem
so
zapisani
trajanje
veljavnosti
žetona,
njegov
namen
in
drugi
dostopni
podatki.
Izdajo
tega
žetona
uporabnik
potrdi
in
na
ta
način
aplikaciji
omogoči
dostop
do
zahtevanih
podatkov.
4.1.1.
Vloge
Protokol
OAuth
vpeljuje
štiri
vloge,
ki
skupaj
omogočajo
dostop
do
zaščitenih
podatkov,
ki
zahtevajo
avtorizacijo
za
dostop:
• lastnik
podatkov:
subjekt,
ki
ima
pravico
dodeliti
dostop
do
zaščitenih
podatkov,
• podatkovni
strežnik:
strežnik,
ki
hrani
zaščitene
podatke,
• odjemalec:
aplikacija
ali
storitev,
ki
zahteva
zaščitene
podatke
v
imenu
uporabnika,
• avtorizacijski
strežnik:
strežnik,
ki
dodeli
odjemalcu
žeton
za
dostop
po
uspešni
avtentikaciji
lastnika
podatkov
in
avtorizaciji
dostopa.
18
f) podatkovni
strežnik
preveri
istovetnost
žetona
za
dostop
in
v
primeru,
da
je
le-‐ta
veljaven,
dovoli
dostop
do
podakov.
potrditev
avtorizacije
(c)
avtorizacijski
odjemalec
in
podatki
odjemalca
(d)
žeton
za
dostop
strežnik
19
4.1.3. Različice
Protokol
OAuth
je
specifikacija,
ki
jo
razvija
IETF
(Internet
Engineering
Task
Force)
[20]
(v
okviru
Internet
Society
[21]).
Specifikacija
še
ni
dokončna,
v
času
pisanja
tega
dela
se
nahaja
v
13.
verziji
[19]
(izdani
16
februarja
2011).
Tudi
zato
se
izvedenke,
ki
se
pojavljajo
v
uporabi,
med
seboj
razlikujejo.
Izvedenki,
ki
ju
uporabljata
Google
in
Facebook,
temeljita
na
10.
verziji
specifikacije.
Obe
izvedbi
imata
dobro
dokumentacijo,
pri
Google
izvedbi
pa
je
na
razpolago
obširen
API,
kar
zelo
poenostavi
izvedbo.
Facebook
je
prenehal
s
podporo
svojemu
Java
APIju
maja
2008,
zaradi
tega
smo
OAuth
avtentikacijo
morali
izvesti
sami.
§ offline_access: pravica do dostopa do podatkov tudi ko uporabnik ni
vpisan
v
Facebook,
§ friends_birthday:
pravica
do
dostopa
do
datumov
rojstnih
dni
prijateljev.
20
Naslednji
korak
je,
da
Facebook
preusmeri
uporabnika
na
naslov,
ki
je
bil
podan
v
zahtevi.
V
primeru,
da
je
uporabnik
zahtevo
potrdil,
na
konec
naslova
doda
še
zahtevo,
ki
se
glasi
?code=KODA_GENERIRANA_NA_STREŽNIKU.
Če
uporabnik
zahteve
ne
potrdi,
se
odgovor
konča
z
?error_reason=user_denied&error=access_denied&error_description=The+user+de
nied+your+request, v
tem
primeru
se
postopek
zaključi
neuspešno.
Kodo,
ki
nam
jo
strežnik
vrne,
v
primeru
potrditve
avtorizacije
s
strani
uporabnika,
uporabimo
v
zahtevi
naslovljeni
na:
https://graph.facebook.com/oauth/access_token?client_id=154494971275090&red
irect_uri= http://symple-sync.appspot.com/facebookCallback
&client_secret=SKRIVNA_KODA&code=KODA_GENERIRANA_NA_STREŽNIKU
Strežnik
nam
v
primeru,
da
je
naša
SKRIVNA_KODA
pravilna,
vrne
žeton
za
dostop,
v
primeru
da
je
prišlo
do
napake,
pa
vrne
HTTP
kodo
400
in
odgovor
v
obliki:
{"error": {"type": "OAuthException", "message": "Error validating
verification code."}}
Ko
uspešno
pridobimo
žeton,
nadaljujemo
s
korakoma
E
in
F,
ki
pa
ju
izvedemo
vsakokrat,
ko
želimo
pridobiti
podatke.
Ker
smo
ob
začetku
avtorizacije
zahtevali
pravico
do
dostopa,
ko
uporabnik
ni
prijavljen,
naš
žeton
velja
do
preklica
s
strani
uporabnika
ali
do
trenutka,
ko
uporabnik
spremeni
geslo.
V
nasprotnem
primeru
bi
naš
žeton
prenehal
veljati
po
kratkem
časovnem
intervalu.
21
4.2. Google
Contacts
Data
API
Z
avtorizacijo
preko
OAuth
smo
pridobili
žeton
za
dostop,
ki
nam
omogoča
dostop
do
podatkov,
ki
so
na
razpolago
v
spletnem
servisu
Google
Kontakti.
Do
servisa
smo
dostopali
preko
Google
Contacts
Data
API
[27].
Vsa
komunikacija
z
Google
servisi
poteka
preko
formata
Atom
(Atom
Syndication
Format).
Format
Atom
definira
obliko
XML
dokumentov,
ki
se
uporabljajo
kot
viri
v
komunikaciji
z
različnimi
storitvami.
Ti
dokumenti
imajo
strukturo,
določeno
s
standardom
RFC
4287
[28],
standard
pa
omogoča
tudi
razširitve,
ki
jih
lahko
servis
doda.
Zato
se
format
Atom
uporablja
za
strukturiranje
širokega
spektra
podatkov,
od
novic
na
internetnih
straneh
do
podatkov,
ki
jih
shranjujemo
na
osebnih
računalnikih.
22
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(“KLJUČ_SERVISA”);
oauthParameters.setOAuthConsumerSecret(“SKRIVNA_KODA_SERVISA”);
oauthParameters.setOAuthToken(“UPORABNIKOV_ŽETON”);
mySigner = new OAuthRsaSha1Signer(ZASEBNI_KLJUČ_SERVISA);
myService.setOAuthCredentials(oauthParameters, mySigner);
23
resultFeed = myService.getFeed(myQuery, ContactFeed.class);
List<ContactEntry> contactList = resultFeed.getEntries();
V
nadaljevanju
se
podatki
obdelajo.
Pri
tem
se
preveri
ali
vsi
podatki
sploh
obstajajo,
kar
je
mogoče
opraviti
z
uporabo
lastnosti
ContactEntry
objekta,
ki
se
začnejo
z
has,
npr.
hasName(),
hasEmailAddresses()
in
hasBirthday(),
tu
so
navedene
tiste
lastnosti,
ki
so
uporabljene
v
našem
servisu.
24
Objekt
za
komunikacijo
s
Facebookom
je
tipa
FacebookClient,
ki
ob
inicializaciji
sprejme
vrednost
žetona
za
dostop
kot
argument:
Objekt
User
je
predefiniran
v
knjižnici
in
predstavlja
dekodirano
obliko
objekta
JSON,
ki
ga
prejme
knjižnica
kot
odgovor
na
zahtevo.
Objekte
lahko
definiramo
tudi
sami
in
tako
vežemo
podatke
direktno
na
objekte,
ki
jih
že
uporabljamo.
To
izvedemo
z
označbami,
ki
predpisujejo,
katera
polja
objekta
odgovarjajo
poljem
v
objektu
JSON.
Označbe
so
oblike:
@Facebook(“ime_polja”).
25
predstavlja
pogoje,
katerim
morajo
objekti
ustrezati.
V
našem
primeru
želimo,
da
so
to
User
objekti,
ki
so
povezani
z
našim
uporabnikom.
4.3.4. Iskanje
Z
knjižnico
restFB
nam
je
preprosto
omogočeno
tudi
iskanje
po
socialnem
omrežju
Facebook.
Iskalne
zahteve
sestavimo
in
izvedemo
s
pomočjo
metode
fetchConnection
(del
objekta
FacebookClient).
Metodi
kot
prva
dva
parametra
podamo
tip
iskanja
in
tip
izhodnega
objekta,
zatem
pa
lahko
dodamo
poljubno
količino
paramerov,
ki
jih
sestavimo
z
metodo
Parameter.with(arg1,
arg2).
Primer
takega
iskanja
v
našem
servisu,
ki
poskuša
poiskati
uporabnika
z
danim
e-‐poštnim
naslovom:
26
5. Baza
podatkov
5.1. Struktura
Bazo
podatkov
strukturiramo
na
osnovi
dveh
glavnih
zahtev:
• shranjevanje
najmanjše
možne
količine
osebnih
podatkov,
ki
še
vedno
omogočajo
brezhibno
delovanje
storitve,
• vsebovanje
čim
manjše
količini
vezanih
podatkov,
da
jih
ni
potrebno
nalagati.
Baza
je
sestavljena
iz
dveh
poglavitnih
objektov.
Struktura
objektov
je
vidna
na
sliki
5.1.
Poglavitna
objekta
predstavljata
uporabniške
podatke
(UserData)
in
zbirko
kontaktov
(ContactList).
Primarni
ključ
je
pri
obeh
enak,
vrednost
tega
je
edinstvena
identifikacijska
številka
uporabnika
iz
sistema
Google
Računov.
Slika
5.1
-‐
Struktura
baze
podatkov
27
Na
ta
način
smo
omogočili
nalaganje
uporabniških
podatkov,
ne
da
bi
nalagali
tudi
vse
vezane
kontakte.
Sicer
nam
to
oteži
dostop
do
podatkov,
saj
moramo
vezavo
objektov
izvesti
sami,
a
s
tem
prihranimo
veliko
časa
in
plačljivih
zmogljivosti.
28
5.3. Twig-‐persist
Twig-‐persist
[26]
je
vmesnik
za
trajno
shranjevanje
objektov,
zgrajen
z
osnovnimi
funkcijami
GAE
Datastore
API,
ki
nima
mnogih
omejitev,
ki
so
prisotne
v
JDO/JPA-‐GAE
implementaciji
trajnega
shranjevanja.
Twig-‐persist
omogoča:
• paralelne
asinhrone
klice,
• združevanje
večih
poizvedb,
• modele
Java
objektov,
ki
niso
odvisni
od
datastore
storitve.
package com.nemesis.symple_sync.data;
…
import com.google.code.twig.annotation.*;
29
Najprej
uvozimo
vse
razrede,
ki
opisujejo
uporabljene
označbe.
Ti
razredi
se
nahajajo
v
knjižnici
com.google.code.twig.annotation.
vsak
objekt
našega
razreda,
lahko
pa
se
ponovi
v
drugih
razredih,
• @Child:
spisek
podrejenih
objektov,
posamična
entiteta,
• @Activate(2):
predpis,
v
katerih
nivojih
naj
se
podrejeni
objekt
aktivira,
oziroma,
kdaj
naj
se
podrejeni
objekt
naloži
iz
baze
podatkov.
V
našem
primeru
se
objekt
aktivira
samo,
če
izberemo
aktivacijski
nivo
višji
ali
enak
2.
Na
ta
način
lahko
prevzamemo
objekte,
ki
imajo
nase
vezane
velike
količine
drugih
objektov,
ne
da
bi
podrejene
objekte
naložili,
• @Index:
predpis
indeksiranja
za
polje,
ki
ga
označuje.
Poleg
naštetih
označb
je
potrebno
omeniti
še
označbo @Parent,
ki
predstavlja
nadrejeni
objekt.
Uporaba
te
označbe
sicer
ni
nujna,
a
si
zaradi
nje
laže
predstavljamo
strukturo
naših
podatkov.
AnnotationObjectDatastore dataStore =
new AnnotationObjectDatastore(false);
Konstruktorju
dodamo
parameter
false,
kar
povzroči,
da
podatkovna
hramba
indeksira
samo
tista
polja,
ki
so
označena
z
označbo
@Index.
Na
ta
način
prihranimo
veliko
količino
zmogljivosti.
30
Objekte
shranjujemo
ali
prepisujemo
z
ukazoma
Tu
se
obstoječi
objekt
currentData
tipa
UserData
nadomesti
z
objektom,
ki
se
naloži
iz
baze
podatkov,
katerega
primarni
ključ
je
enak
vrednosti
userID.
V
veliko
primerih
je
treba
najti
objekte,
ki
ustrezajo
določenim
zahtevam.
Uporabo
prikazuje
naslednji
primer
iz
servisa:
31
•
5.3.1.4. Učinkovitost
Pri
uporabi
twig-‐persist
in
drugih
implementacij
vmesnikov
s
hrambo
podatkov
v
GAE
moramo
biti
zelo
pozorni
na
učinkovitost
operacij.
Stremeti
moramo
k
najmanjšemu
možnemu
številu
klicev
DataStore
APIja,
saj
so
ti
zahtevni
in
počasni.
Prav
tako
moramo
zaradi
načina
shranjevanja
podatkov
v
bazo
podatkov
v
svoji
aplikaciji
preprečevati
hkratno
pisanje
v
isto
polje,
saj
v
nasprotnem
primeru
lahko
prihaja
do
neuspešnih
operacij,
ker
je
bil
DataStore
prisiljen
v
zavrnitev
vpisa
zavoljo
vzdrževanja
konsistence
podatkov.
32
6. Izvedba
servisa
Storitev
je
izvedena
v
jeziku
Java,
s
specifičnimi
rešitvami,
ki
jih
omogoča
Google
App
Engine.
Storitev
je
zato
sestavljena
iz
mnogih
servlet-‐ov
[38],
objektov
programskega
jezika
Java,
ki
omogočajo
odgovarjanje
na
HTTP
zahteve
in
obdelovanje
le-‐teh.
33
Slika
6.1
-‐
Struktura
paketov
client
in
server
V
primeru
uspešne
prijave
sta
med
podatki,
ki
jih
strežnik
vrne
uporabniškemu
vmesniku
tudi
podatka
o
veljavnosti
avtorizacij
za
Google
Kontakte
in
Facebook.
Če
avtorizaciji
nista
veljavni,
vmesnik
uporabniku
prikaže
povezavo,
s
katero
se
prične
postopek
za
avtorizacijo.
V
primeru,
da
sta
obe
avtorizaciji
veljavni,
vmesnik
prikaže
zahvalno
sporočilo.
Preostali
del
uporabniškega
vmesnika
je
namenjem
administratorju
in
prikazuje
uporabnike
in
statistiko
ter
omogoča
brisanje
uporabnikov
ali
uporabniških
podatkov.
Te
operacije
so
izvedene
s
pomočjo
razreda
AdminServiceImpl.
34
• StatisticsCron:
opravilo
vodi
dnevno
statistiko
o
uporabnikih,
beleži
število
kontaktov,
število
prijateljev,
število
povezanih
kontaktov
in
število
možnih
dodatnih
povezav
Z
izjemo
razreda
StatisticsCron
ti
razredi
ne
opravljajo
obdelave
podatkov,
temveč
le
predpišejo
obdelavo
opravilom
iz
Java
razredov
v
paketu
tasks.
Primer
takega
delovanja
si
lahko
ogledamo
na
sliki
6.2.
Ponavljajoče
opravilo
sinhronizacije
(ContactsSync)
postavi
v
čakalno
vrsto
n
opravil
za
polnjenje
čakalne
vrste
(SyncQueuer),
kjer
n
predstavlja
število
uporabnikov.
Slika
6.2
-‐
Proces
dodajanja
opravil
za
sinhronizacijo
! = !!
!!!
35
Poenostavljena
izvedba
opravila
razreda
ContactSync
v
izvorni
kodi:
36
Poenostavljena
izvedba
opravila
razreda
SyncQueuer
v
izvorni
kodi:
37
6.2. Uporabniški
vmesnik
Uporabniški
vmesnik
je
v
primeru
spletnega
servisa
spletna
stran,
ki
jo
prikažemo
v
uporabnikovem
brskalniku.
Ker
v
našem
primeru
uporabljamo
v
ozadju
programski
jezik
Java,
smo
se
odločili
za
uporabo
le-‐tega
tudi
v
uporabniškem
vmesniku.
Za
to
imamo
na
razpolago
veliko
število
ogrodij
AJAX
(Asynchronous
JavaScript
And
XML
[35]),
med
drugimi
GWT
(Google
Web
Toolkit
[36]).
Ogrodja
AJAX
omogočajo
prilagajanje
uporabniškega
vmesnika
brez
ponovnega
prevzemanja
celotne
spletne
strani
s
strani
uporabnika.
Statični
del
strani
ostaja
enak,
medtem
ko
se
dinamični
deli
prosto
spreminjajo
in
prilagajajo
trenutnim
podatkom
in
zahtevam.
38
uporabniškemu
vmesniku,
ki
rezultat
prikaže
uporabniku.
V
tem
času
ima
uporabnik
na
razpolago
odziven
vmesnik,
kljub
izvajanju
zahteve.
39
6.3. Optimizacija
servisa
V
GAE
je
potrebno
plačevati
za
prenos
podatkov,
procesorski
čas
in
shranjevanje
podatkov.
V
našem
primeru
sta
najbolj
kritična
procesorski
čas
in
prenos
podatkov,
saj
je
količina
shranjenih
podatkov
na
uporabnika
minimalna.
Sistem
GAE
nam
javlja
porabo
procesorskega
časa
v
milisekundah,
ki
predstavlja
ekvivalent
računskih
ciklov,
ki
jih
v
tem
času
opravi
procesor
1,2
GHz
Intel
x86.
Prve
izvedbe
servisa
so
uporabljale
opravilne
vrste
za
vse
procese
tako,
da
se
je
vsak
del
procesa
razbil
na
najmanjšo
možno
enoto
in
se
izvedel
v
svojem
opravilu.
Tako
se
je
v
primeru
povezovanja
kontaktov
za
vsak
kontakt
posebej
ustvarilo
po
eno
opravilo.
Proces
je
bil
zelo
počasen,
hkrati
je
bilo
v
administratorskem
vmesniku
GAE
aplikacije
videti,
da
servis
zahteva
velike
količine
plačljivih
zmogljivosti
že
v
primeru
enega
samega
uporabnika.
Z
uporabo
AppStats
[39]
za
GAE,
smo
ugotovili
kateri
del
procesa
je
najpočasnejši.
Posnetek
poteka
enega
opravila,
ki
poskuša
povezati
en
kontakt,
lahko
vidimo
na
sliki
6.3.
Modri
pravokotniki
predstavljajo
čas,
ki
ga
zahteva
porabi
za
izvedbo,
medtem
ko
rdeči
pravokotniki
predstavljajo
uporabljene
plačljive
zmogljivosti
(procesorski
čas).
Kot
vidimo
se
proces
v
realnem
času
hitro
izvede,
a
se
pri
tem
porabi
velika
količina
plačljivih
zmogljivosti.
Prav
tako
vidimo,
da
je
največja
poraba
pri
dostopu
do
baze
podatkov
(klici
datastore_v3.Get).
Slika
6.3
-‐
Časovni
in
zmogljivostni
potek
procesa
povezovanja
kontakta
40
Opravilo
smo
zato
preuredili
tako,
da
hkrati
povezuje
po
100
kontaktov.
Število
kontaktov
smo
morali
omejiti,
saj
se
lahko
v
nasprotnem
primeru
dogodi,
da
dosežemo
omejitev
dolžine
izvajanja
procesa
(10
min).
Dostop
do
baze
podatkov
v
tem
primeru
zahteva
približno
150%
plačljivih
zmogljivosti,
s
tem
da
smo
obdelali
100
kontaktov
in
ne
enega,
kar
je
razvidno
iz
slike
6.4.
Slika
predstavlja
potek
opravila
pri
povezovanju
100
kontaktov,
potrebno
pa
je
poudariti,
da
je
vmesni
del
poteka
zaradi
nazornosti
izpuščen.
Ponovno
predstavljajo
modri
pravokotniki
realni
čas,
porabljen
za
izvedbo
opravila,
rdeči
pravokotniki
pa
predstavljajo
porabo
plačljivih
zmogljivosti.
Iz
slike
je
razvidno,
da
je
dostop
do
podatkov
pri
enem
kontaktu
približno
tako
zahteven
kot
pri
stotih.
Slika
6.4
-‐
Časovni
in
zmogljivostni
potek
procesa
povezovanja
kontaktov
(100
kontaktov)
Podobno
težavo
smo
imeli
pri
sinhronizacijskem
opravilu,
saj
je
dostopalo
do
vsakega
podatka
posebej
in
tako
uporabljalo
velike
količine
plačljivih
zmogljivosti.
Opravilo
smo
optimizirali
tako,
da
smo
ob
klicu
opravila
SyncQueuer,
ki
vstavlja
opravila
za
sinhronizacijo
v
vrsto,
v
dinamični
pomnilnik
vstavili
objekt,
ki
predstavlja
kontakt.
Na
ta
način
podatek
preberemo
iz
baze
podatkov
le
enkrat,
kasnejši
dostopi
pa
uporabijo
podatke,
ki
so
shranjeni
v
dinamičnem
pomnilniku.
To
smo
lahko
izvedli
tako,
ker
pri
sinhronizaciji
kontakta
ne
zapisujemo
nobenih
podatkov
v
bazo.
41
6.4. Analiza
stroškov
Če
bi
želeli
spletni
servis
tržiti,
bi
morali
najprej
vedeti,
kakšen
je
strošek
le-‐tega
na
enega
uporabnika.
Sicer
nam
Google
pri
uporabi
GAE
podaja
brezplačne
kvote,
a
so
te
za
upravljalca
v
primeru
velike
količine
uporabnikov
zanemarljive.
Trenutno
veljavni
cenik
(uveljavljen
24
februarja
2009
[40])
vsebuje
naslednje
cene
(vrednosti
v
€
prepračunane
po
tečajni
listi
Banke
Slovenije
dne
29.04.2011
[41])
:
Plačljiva
zmogljivost
Enota
Cena
enote
Brezplačna
kvota
Odhodni
prenos
podatkov
gigazlog
0,08
€
(0,12
$)
1
GB
/
dan
Dohodni
prenos
podatkov
gigazlog
0,067
€
1
GB
/
dan
(0,10
$)
Procesorski
čas
ura
0,067
€
6,5
ur
/
dan
(0,10
$)
Shranjeni
podatki
gigazlog
/
mesec
0,10
€
1
GB
(0,15
$)
Tabela
6.1
-‐
Cenik
storitev
Google
App
Engine
Naši
uporabniki
imajo
od
200
do
preko
1000
kontaktov
in
od
130
do
700
prijateljev
na
Facebooku.
Za
izračune
privzamemo,
da
povprečne
vrednosti
naših
uporabnikov
predstavljajo
povprečnega
uporabnika
in
izračunamo
približen
strošek
na
uporabnika.
42
43
Sinhronizacija
zahteva
v
povprečju
80
ms
na
kontakt
za
sinhronizacijo.
V
povprečju
ima
uporabnik
162,5
povezanih
kontaktov
in
je
torej
zahtevana
količina
procesorskega
časa,
pri
šestih
sinhronizacijah
na
dan:
0,08 s × 162,5 × 6 = 78 s = 0,0216 h
Skupno
torej
potrebujemo
mesečno
na
uporabnika:
€
0,0125 h + 0,0216 h × 0,067 × 30 = 0,0687 €
h
44
7. Zaključek
V
okviru
spletnega
servisa
smo
izpolnili
vse
zahteve,
ki
so
bile
postavljene
v
okviru
naloge.
Servis
samostojno
ugotavlja
povezave
med
uporabnikovimi
kontakti
in
prijatelji
na
Facebooku,
povezane
kontakte
pa
tudi
uspešno
sinhronizira.
Sinhronizirajo
se
kontaktni
podatki,
do
katerih
je
mogoče
dostopati
v
okviru
Facebooka,
servis
je
izveden
tako,
da
bo
v
prihodnosti
mogoče
omogočiti
sinhronizacijo
dodatnih
podatkov,
do
katerih
bi
bil
kasneje
omogočen
dostop.
Ocena
mesečnih
stroškov
na
uporabnika
v
okviru
storitve
kaže,
da
bi
bili
stroški
v
primeru
javne
dostopnosti
servisa
sprejemljivi
in
bi
bilo
mogoče
storitev
za
veliko
število
uporabnikov
vzdrževati
z
minimalnimi
stroški.
Prav
tako
bi
bilo
mogoče
v
primeru
večjega
števila
uporabnikov
optimizirati
algoritem
za
povezovanje
kontaktov,
kjer
bi
lahko
povezave,
ki
bi
jih
ugotovili,
shranili
v
bazo
in
jih
uporabili
pri
več
uporabnikih.
Pri
testnih
uporabnikih
in
v
sedanji
izvedbi
spletna
storitev
samostojno
poveže
25%
uporabnikovih
kontaktov
s
prijatelji
na
Facebooku,
hkrati
pa
najde
možne
povezave
še
za
20%
kontaktov.
Največje
težave
se
pojavljajo
pri
dostopanju
in
iskanju
podatkov
v
okviru
Facebooka,
saj
se
vmesniki
za
dostop
do
podatkov
spreminjajo
večkrat
letno,
praviloma
tako,
da
programska
oprema
brez
sprememb
v
izvorni
kodi
po
spremembi
preneha
delovati.
Prav
tako
je
problem
v
pridobivanju
podatkov,
saj
so
pravila,
ki
jih
postavlja
Facebook,
praviloma
nedorečena
in
v
večini
primerov
ne
veljajo
za
vse
aplikacije.
Spletno
storitev
je
mogoče
izboljšati
z
dodatkom
uporabniškega
vmesnika
za
ročno
povezovanje
kontaktov.
Izboljšave
so
še
vedno
možne
tudi
na
področju
optimizacije,
kjer
bi
lahko
z
bolj
agresivnim
shranjevanjem
podatkov
v
dinamični
pomnilnik
prihranili
dodatna
sredstva
in
servis
tudi
pospešili.
Sinhronizacija,
ki
se
sedaj
izvaja
za
vse
kontakte
ob
vsakem
klicu,
bi
se
lahko
izvajala
samo
za
spremenjene
kontakte,
prav
tako
bi
lahko
ustvarili
sistem,
ki
bi
sinhronizacijo
izvajal
odzivno,
t.j.
kot
odziv
na
spremembo
namesto,
da
se
izvaja
sinhronizacija
ob
določenih
časovnih
terminih.
Izboljšave
bi
bile
možne
tudi
z
dodajanjem
drugih
spletnih
storitev
v
sinhronizacijo,
vstavljanje
rojstnih
dni
v
koledar,
sinhronizacija
z
drugimi
socialnimi
omrežji.
45
46
Literatura
[1]
Matti
Haverila,
What
do
we
want
specifically
from
the
cell
phone?
An
age
related
study,
Telematics
and
Informatics,
vol.
In
Press,
Corrected
Proof.
[2]
Jure
Vrščaj,
Razvoj
aplikacij
na
platformi
Google
App
Engine,
Diplomska
naloga,
2011.
[3]
Google
Inc.,
Google
Contacts
,
http://www.google.com/contacts/,
8.
april
2011.
[4]
Facebook
,
https://www.facebook.com/,
8.
april
2011.
[5]
Google
App
Engine
-‐
Google
Code
,
http://code.google.com/appengine/,
8.
april
2011.
[6]
Daniele
Perito,
Claude
Castelluccia,
Mohamed
Ali
Kaafar,
in
Pere
Manils,
How
Unique
and
Traceable
are
Usernames?,
1101.5578,
jan.
2011.
[7]
Birthday
problem
-‐
Wikipedia,
the
free
encyclopedia
,
http://en.wikipedia.org/wiki/Birthday_problem,
9.
april
2011.
[8]
Statistični
urad
RS
-‐
Prebivalstvo,
Slovenija,
1.
januar
2010
,
http://www.stat.si/novica_prikazi.aspx?id=3088,
9.
april
2011.
[9]
Inc.,
Maintained
Relationships
on
Facebook
,
http://www.facebook.com/note.php?note_id=55257228858&ref=mf,
9.
april
2011.
[10]
Tim
Lindholm
in
Frank
Yellin,
Java(TM)
Virtual
Machine
Specification,
2.
izd.,
Prentice
Hall,
1999.
[11]
Google
App
Engine
Blog:
App
Engine
team
appearances
Winter
2011
,
http://googleappengine.blogspot.com/2011/01/app-‐engine-‐team-‐appearances-‐
winter-‐2011.html,
9.
april
2011.
[12]
Choosing
a
Datastore
(Java)
-‐
Google
App
Engine
-‐
Google
Code
,
http://code.google.com/appengine/docs/java/datastore/hr/,
8.
april
2011.
[13]
Rod
Johnson,
Expert
one-‐on-‐one
J2EE
design
and
development,
Indianapolis
IN:
Wrox,
2003.
[14]
Users
Java
API
Overview
-‐
Google
App
Engine
-‐
Google
Code
,
http://code.google.com/appengine/docs/java/users/overview.html,
9.
april
2011.
[15]
Memcache
Java
API
Overview
-‐
Google
App
Engine
-‐
Google
Code
,
http://code.google.com/appengine/docs/java/memcache/overview.html,
8.
april
2011.
[16]
The
Java
Community
Process(SM)
Program
-‐
JSRs:
Java
Specification
Requests
-‐
detail
JSR#
107
,
http://jcp.org/en/jsr/detail?id=107,
9.
april
2011.
[17]
URL
Fetch
Java
API
Overview
-‐
Google
App
Engine
-‐
Google
Code
,
http://code.google.com/appengine/docs/java/urlfetch/overview.html,
9.
april
2011.
[18]
HTTP/1.1:
Status
Code
Definitions
,
http://www.w3.org/Protocols/rfc2616/rfc2616-‐sec10.html,
8.
april
2011.
[19]
Network
Working
Group,
draft-‐ietf-‐oauth-‐v2-‐13
-‐
The
OAuth
2.0
Authorization
Protocol
,
http://tools.ietf.org/html/draft-‐ietf-‐oauth-‐v2-‐13,
8.
april
2011.
[20]
IETF,
Internet
Engineering
Task
Force
,
http://www.ietf.org/,
8.
april
2011.
[21]
Internet
Society
(ISOC)
,
http://www.isoc.org/,
9.
april
2011.
[22]
Facebook,
Authentication
-‐
Facebook
Developers
,
https://developers.facebook.com/docs/authentication/,
8.
april
2011.
[23]
Permissions
-‐
Facebook
Developers
,
https://developers.facebook.com/docs/authentication/permissions/,
8.
april
2011.
[24]
Java
Data
Objects
(JDO)
-‐
Home
,
http://db.apache.org/jdo/,
14.
april
2011.
47
[25]
The
Java
Persistence
API
-‐
A
Simpler
Programming
Model
for
Entity
Persistence
,
http://www.oracle.com/technetwork/articles/javaee/jpa-‐137156.html,
14.
april
2011.
[26]
twig-‐persist
-‐
Object
Datastore
for
Google
App
Engine
-‐
Google
Project
Hosting
,
http://code.google.com/p/twig-‐persist/,
9.
april
2011.
[27]
Google
Contacts
Data
API
-‐
Google
Code
,
http://code.google.com/apis/contacts/,
10.
april
2011.
[28]
Network
Working
Group,
M.
Nottingham,
Ed.,
in
R.
Sayre,
Ed.,
RFC
4287
-‐
The
Atom
Syndication
Format
,
http://tools.ietf.org/html/rfc4287,
8.
april
2011.
[29]
OAuth
in
the
Google
Data
Protocol
Client
Libraries
-‐
Google
Data
Protocol
-‐
Google
Code
,
http://code.google.com/apis/gdata/docs/auth/oauth.html,
8.
april
2011.
[30]
Hugo
Krawczyk,
Ran
Canetti,
in
Mihir
Bellare,
HMAC:
Keyed-‐Hashing
for
Message
Authentication
,
http://tools.ietf.org/html/rfc2104,
3.
maj
2011.
[31]
A.
Shamir
in
L.
Adleman,
A
method
for
obtaining
digital
signatures
and
public-‐key
cryptosystems,
Communications
of
the
ACM,
vol.
21,
1978,
str.
120–126.
[32]
Developer’s
Guide:
Java
-‐
Google
Contacts
Data
API
-‐
Google
Code
,
http://code.google.com/apis/contacts/docs/3.0/developers_guide_java.html,
9.
april
2011.
[33]
RestFB
-‐
A
Lightweight
Java
Facebook
Graph
API
and
Old
REST
API
Client
,
http://restfb.com/,
13.
april
2011.
[34]
Facebook
Query
Language
(FQL)
-‐
Facebook
Developers
,
http://developers.facebook.com/docs/reference/fql/,
13.
april
2011.
[35]
Java
Ajax
Frameworks
-‐
Ajax
Patterns
,
http://ajaxpatterns.org/Java_Ajax_Frameworks,
1.
maj
2011.
[36]
Google
Web
Toolkit
-‐
Google
Code
,
http://code.google.com/webtoolkit/,
1.
maj
2011.
[37]
Robert
Thurlow,
RPC:
Remote
Procedure
Call
Protocol
Specification
Version
2
,
http://tools.ietf.org/html/rfc5531,
1.
maj
2011.
[38]
Rajiv
Mordani,
Sun
Microsystems
Inc.
Java
Transaction
API
(JTA),
dec.
2009.
[39]
Appstats
for
Java
-‐
Google
App
Engine
-‐
Google
Code
,
http://code.google.com/appengine/docs/java/tools/appstats.html,
1.
maj
2011.
[40]
Google
App
Engine
Blog:
New!
Grow
your
app
beyond
the
free
quotas!
,
http://googleappengine.blogspot.com/2009/02/new-‐grow-‐your-‐app-‐beyond-‐free-‐
quotas.html,
1.
maj
2011.
[41]
Tečajnica
Banke
Slovenije
-‐
referenčni
tečaji
ECB
-‐
Banka
Slovenije
,
http://www.bsi.si/podatki/tec-‐bs.asp,
1.
maj
2011.
48
49
50
Izjava
Izjavljam,
da
sem
diplomsko
delo
izdelal
samostojno
pod
vodstvom
mentorja
doc.
dr.
Boštjana
Murovca,
univ.
dipl.
inž.
el.
Izkazano
pomoč
drugih
sodelavcev
sem
v
celoti
navedel
v
zahvali.
Matjaž
Pečan
51