kolmapäev, 24. märts 2010

Sattusin maksutõusu ohvriks

Tellisin eBayst Roomba varuosi $69 eest ning ebameeldiva üllatusena lisandus sellele summale veel 200 krooni impordimaksu ning 100 krooni vormistamise teenustasu. Samas kui eelmine aasta tellisin korduvalt $100 hinnaklassis tooteid ning kunagi ei pidanud mingeid makse maksma.


Paki hind oli 69 dollarit millele lisandus 21 dollarit postikulu. Mina aga maksin makse mitte kauba hinna järgi 69 dollarit, vaid 69+21 = 90 dollari (1000 krooni) eest. Nimelt uue korra järgi arvutatakse postikulu samuti toote hinna sisse.

Ma saan sellest aru, et riik langetab maksuvabu määri, kuid üks asi millele ma kuidagi pihta ei saa, on transpordikulu lisamine toote hinnale ja minu arust on see täiesti ajuvaba. Kuidas on postikulu seotud impordiga? Kasvõi selles mõttes, et suur osa "makstud postiteenusest" sooritatakse väljaspool Euroopa Liitu, kuna postikulu sisaldab muu hulgas nii USA sisest transporti kui ka Atlandi ületamist. Kuidas saab Eesti Vabariik küsida maksu Atlandi ületamise teenustasu pealt?

---

Selle aasta maksumäärad on siis järgmised - alla 22 euro (sh. postikulu) on maksuvaba, alla 150 euro (sh. postikulu) tuleb tasuda käibemaks (impordimaks) ning paberite vormistamise eest Eesti Postile teenustasu. Üle 150 eurose paki eest tuleb tasuta nii käibemaks kui tollimaks.

Alternatiivne võimalus on muidugi tellida asju ainult Hiinast (sh. Hong Kong jms.), kuna seal kiputakse deklareerima kõike väljuvat kui "Gift, $10". Kusjuures seda isegi juhul mil kauba reaalne väärtus on väiksem kui $10. Kui tegu on väikese asjaga, millele suurt postikulu ei lisandu, saab mahtuda lubatud 22 euro piiridesse ja makse seega maksma ei pea.

Selline oli siis minu tänane maksude-optimiseerimise rubriik.

reede, 19. märts 2010

jStorage plugin JavaScriptis andmete lokaalseks salvestamiseks

Hakkasin hiljuti oma DOMCached teeki ümber kirjutama ning kuna see muutus suhteliselt palju ning ei ole suures ulatuses tagasiulatuv, siis vormindasin selle ümber täiesti uueks projektiks, mille nimeks sa jStorage www.jstorage.info.

Plugin vajab töötamiseks kas Prototype või jQuery teeki ning suudab salvestada infot brauseris.


neljapäev, 18. märts 2010

Kuidas võtta vastu Fortumo SMS sõnumeid Google App Engine rakenduses?

Fortumo pakub väga mugavat võimalust luua erinevaid SMS põhiseid tasulisi rakendusi - selle jaoks on olemas Fortumo Dünaamiline SMS-teenus. Paraku on kõik juhendid Fortumo lehel ainult PHP jaoks, seega Google App Engines jooksva Pythoni jaoks on vaja ise leiutada.

Probleemi lahendamiseks lõin lihtsa näidisrakenduse, mis oskab Fortumo poolt saadetud SMS sõnumite infot vastu võtta ning andmebaasi salvestada. Rakendus võtab sõnumi vastu ning salvestab selle andmebaasi. Rakenduse esileht kuvab andmebaasist kuni 100 viimast sõnumit uuemad eespool. Kõike keerulisemat saab juba sellele põhjale ise ehitada.

Näidisrakenduse info ning viited lähtekoodi juurde leiab siit.

teisipäev, 16. märts 2010

Kuidas vabaneda lärakast Äripäeva bännerist?

Äripäev on tore leht ja seda tasub kindlasti vaadata. Samas püsilugejal (eriti widescreen ekraaniga, kus ekraan on küll lai, aga mitte eriti kõrge), kes on muidu tubli ja AdBlock'i ei kasuta, on kindlasti too Äripäeva tobe lärakas päisebänner pinnuks silmas. Iphone brauseriga vaadates scrollib bänner muu lehega kaasa, minnes artikli edenedes ilusti serva taha, aga tavabrauseriga on bänner fixed positsiooniga, mis teeb ta üsna ebameeldivaks kui mitte öelda lausa häirivaks.

Õnneks saab selle läraka suhteliselt kerge vaevaga eemaldatud. Selle jaoks pole vaja teha muud kui lisada brauseri URL reale järgmine rida ja vajutada Enter klahvi.

javascript:void($("#siteHeaderContainer").remove())

Peale seda peaks bänner imeväel ekraanilt kaduma. Veel mugavam on teha uus järjehoidja brauseri järjehoidjaribale, niiöelda bookmarklet'ina. Selle jaoks tee sellel lingil parem hiireklõps, vali "Lisa järjehoidja" ning asukohaks määra järjehoidjariba. Kui nüüd Äripäeva vaadata ja klõpsata järjehoidjaribal uut järjehoidjat, kaob bänner ära.

Aga miks see järjehoidja või URL niiviisi töötab?

Brauseri URL riba on seotud hetkel brauseri poolt avatud dokumendiga - tegu oleks nagu millegi lingi laadsega, kus pead klikkimise asemel lingi aadressi ise kirjutama. Linke aga on mitmesuguseid - on http protokolli suunas minevaid linke, on https protokolli suunas minevaid, on ka ftp ja maili saatmiseks mailto lingid, kuid lisaks on veel olemas javascript link, mille järel oleva "aadress" käivitatakse tavalise JavaScriptina nagu see käivituks eesoleva lehe enda seest.

Kuna URL riba on mõeldud siiski lehelt minema navigeerimiseks, üritab brauser seda teha ka javascript: URL'i puhul. Juhul kui käivitatud JavaScript tagastab mingi väärtuse (kusjuures false on ka väärtus!!!), üritab JavaScript seda väärtust lehel "avada". Antud väärtus teisendatakse tekstikujule ning seatakse eesoleva brauseri sisuks (valge leht, kus on rida teksti). Kirjuta URL-i ribale näiteks

javascript:1+1

ja vajuta Enterit. Tulemuseks on valge taustaga leht, kus on kiri 2.

Bänneri eemaldamisel selline tulemus muidugi ei rahulda - kui bänner on ära koristatud, peaks õige leht siiski ette jääma. Aga kuidas mitte tagastada väärtust, kui isegi false on väärtus? Point on selles, et JavaScriptis on olemas ka mitte-väärtus, milleks on undefined. Kui tagastadagi undefined, siis ei oska brauser kuhugi minna ning olemasolev leht jääbki ette. Seega tuleks JavaScript käsk lõpetada undefined väärtuse tagastamisega.

undefined väärtust saab esile manada mitmeti. Kõige lihtsam oleks see kirjutada lihtsalt avaldise lõppu - tagastusväärtuseks on viimase käsu tulemus. Kuna viimane käsk on undefined, siis on ka selle tagastus undefined. Teine võimalus on sisestada käivitatav kood mõne funktsiooni parameetriks, millel enda tagastusväärtus puudub. Eriti hästi sobib selle jaoks void (pole tehniliselt võttes küll mitte funktsioon, vaid operaator), kuna see ei tee üldse mitte midagi.

javascript:1+1;undefined
javascript:void(1+1)

Mõlemal juhul käivitatakse avaldis 1+1, kuid lehelt ära ei navigeerita.

Järgmiseks tuleb tegeleda bänneri eemaldamisega. Kuna Äripäev kasutab jQuery teeki, saab bänneri DOM elemendi mugavalt $ funktsiooniga kätte. Vastasel korral tuleks kasutada pikemat ja kohmakamat document.getElementById("id") vormi (vs. lühike $("#id"))). Kui viide bänneri DOM elemendi juurde on olemas, tuleb see DOM puust eemaldada. "Normaalsetes" oludes tuleks seda teha käsuga dom_element.parentNode.removeChild(dom_element), aga jQuery pakub õnneks tunduvalt mugavamat ja kiiremat varianti - DOM elemendi meetodit remove.

Kui nüüd Äripäeva HTML lähtekoodist järgi vaadata, on bänneri elemendi id väärtuseks siteHeaderContainer. Pannes selle kokku saadud teadmistega, tuleb välja, et bänneri kustutamiseks tuleb käivitada käsklus

$("#siteHeaderContainer").remove()

JavaScripti käivitamiseks paneme saadud käskluse void parameetriks ja moodustame sellest javascript: URL'i ning saamegi kokku vajaliku rea:

javascript:void($("#siteHeaderContainer").remove())

Nii, et ei midagi keerulist!

kolmapäev, 3. märts 2010

Google App Engine kasutamise juhend

Kirjutasin aine Veebiprogrammeerimine raames Google App Engine kasutamise juhendi, mida saab lugeda siit (täismahus PDF kujul saab otse laadida siit).

Google App Engine'ga tegelemise suureks plussiks on lihtne tõik, et alustada saab selles tasuta. Ja tegu pole mingi trial'iga, mis mingi aja pärast otsa saab, vaid kogu teenus ongi määratud limiitide ületamiseni tasuta.

Limiidid aga on loodud USA, mitte Eesti turgu silmas pidades - tõenäoliselt saaks suurema osa Eesti jaoks loodud asju majutada Google App Engine platvormil niimodi ära, et ei peaks kunagi sentigi majutuse eest maksma. Ainus reaalne tasuta kasutamise piirang, millest võib kergelt üle minna, on kuni 1GB kettapinda, aga ka sellele pinnale mahutab juba nii mõndagi.

Suurimaks miinuseks on uue programmeerimiskeele (Python) selgeksõppimine, kuna PHP, mida enamus veebitegijaid kasutab seal ei tööta. Samuti on pakutav andmebaas suhteliselt piirav võrrelduna näiteks MySQL'iga, aga see tuleb erinevatest eesmärkides. Google App Engine andmebaasi esimene ja kõige tähtsam ülesanne on olla ligipääsetav võimalikult paljudele kasutajatele võimalikult rohke kasutamise korral. Ehk et lugemine on ka väga suure koormuse all kiire, kirjutamine aga on aeglane ka juhul kui on ainult üks kasutaja.

Seega ajalehe veebi jaoks, kus andmebaasi lisatakse päevas mingi suhteliselt väike arv uusi artikleid, aga kust päritakse neid artikleid sadu tuhandeid kui mitte miljoneid kordi päevas, sobib antud platvorm ideaalselt. Andmebaasiteenuseks kus on vaja muuta korraga suures koguses kirjeid ning teha nende kirjete hulgas väga keerulisi otsinguid, see jälle niiväga ei sobi.

esmaspäev, 1. märts 2010

Tegin endale WIKI

Tegin endale WIKI programmeerimisalase info jaoks aadressile www.tahvel.info. Kirjutan ise, aga lugeda saavad kõik, samuti on võimalik kõike kirjutatut eksportida OpenOffice ning PDF formaadis (kuigi PDF eksportija on veidi katki).

Kolisin sinna ka oma JavaScripti alased materjalid ning kirjutasin juurde Google App Engine kasutamise õpetuse.