ManoKnyga.lt

Po tūkstančių darbo valandų, įvairiausių derinimų, taisymų ir optimizavimų, šiandien mes pristatome pirmąjį savo projektą ManoKnyga.lt elektroninį knygyną. Apsilankykite, įvertinkite ir pasidalinkite savo mintimis - į viską atsižvelgsime ir panaudosime siekiant užtikrinti maksimalų patogumą vartotojui. Mes savo ruožtu įvertinome kitų svetainių trūkumus ir klaidas ir pristatėme tikrai šaunų projektą. Štai keletas svarbiausių jo privalumų:

  1. Knygas tiekiame/tieksime iš visų leidyklų (Alma littera, Baltos lankos ir t.t.)
  2. Jei norite padovanoti knygą, bet nežinote kokią, tai galite padovanoti dovanų kuponą arba pasisemti idėjų dovanoms
  3. Registruotis prie svetainės reikia tik prieš pildant užsakymą, o krepšelį susikrauti galite ir be registracijos (krepšelio turinys bet kokiu atveju išliks apsilankius kitą kartą)
  4. Siekdami suteikti daugiau informacijos apie knygas pateikiame knygų ištraukas, nuorodas į recenzijas ir kitų vartotojų komentarus

Kadangi tai neturėtų būti vien tik reklama ir visgi tai yra mano asmeninis tinklaraštis, tai papasakosiu apie mano nuveiktus darbus, indėlį į šį projektą ir jo naudą man. Ne paslaptis, kad jam skirdavau daugybę laiko, kuris natūraliai turėjo tekti mokslams ir kitam laisvalaikiui bei projektams (pvz.: BlogAds.lt).

Aš esu programuotojas (taip, oficialiai juo dirbu). Natūralu, kad pagrindinė mano veikla manoknygoje buvo sistemos programavimas. Juokinga, kai visą nuveiktą darbą galima apibūdinti vienu žodžiu („programavau“), nes iš programavimo pusės šis projektas išspaudė iš manęs viską - tiek daug skirtingų užduočių dar niekada neteko atlikti. Viskas be abejo prasidėjo nuo kelių A4 lapų su trumpai Vidmanto aprašyta užduotimi, tačiau jau kuriant sprendimą viskas daug kartų keitėsi, atsirado naujų reikalavimų ir t.t. Pradžioje projektas tikrai neatrodė sudėtingas, bet kai atsirado darbas su nutolusiais serveriais, konkurentų/tiekėjų svetainių automatinis apdorojimas, logiškų sprendimų priėmimas, tai visas PHP projektams būdingas nuobodumas labai labai greitai išgaravo.

Visgi turbūt dar ilgai (mažiausiai pusei metų) nuo tokio dydžio darbų stengsiuosi pailsėti - vienam žmogui sukurti tokią didelę sistemą (apie 20′000 kodo eilučių (neskaičiuojant tuščių eilučių)) yra tikrai sudėtinga tiek fiziškai tiek morališkai. Nežinau kaip aprašyti savo nuveiktą darbą taip, kad tai nenuskambėtų kaip pagyros, tačiau šiuo darbu aš didžiuojuosi taip, kaip nei vienu kitu. Jau miesteliai.lt buvo padarytas labai gerai, tačiau šis projektas padarytas dar geriau, žymiai geriau. Žinoma, man sunku žodžiais apibūdinti tą „gerumą“, kai negaliu parodyti programinio kodo, bet ir iš vartotojo dalies tai puikiai jaučiasi: vien tik „gražios“ nuorodos, didelė sparta ir protingai naudojamas AJAX yra puikūs to atspindžiai.

Kodėl šis projektas yra toks svarbus man? Nes tai vienas iš tokių darbų, kuriuos atlikau taip, kaip man (mums) atrodė geriausia ir juo man ne gėda girtis. Šį projektą būtinai paminėsiu savo CV - jis puikiai įrodo ką moku ir ką galiu. Kol kas jis veikia vos pora dienelių, tai apie pelną kalbėti dar tikrai anksti, bet labai naiviai tikiu, kad jis bus ir visas mūsų darbas nenueis vėjais - įvertinkite ir jūs!

Robotas

Vakar pradėjome pažintį su vartotojų sekimu internete. Kol kas vis dar neprieisime prie konkrečių kodo pavyzdžių, nes iki galo visko neišsiaiškinus kodas gali likti neaiškus, o jei jau aš juo noriu pasidalinti su kitais, tai tegu jis turės subjektyviai padorų pagrindimą ir paaiškinimą. Šiandien plačiau nagrinėsime svetainės veiksmų saugojimą ir reitingavimą - vis dar formuosime mūsų duomenų struktūrą, kurią vėliau bus galima efektyviai panaudoti vartotojo pomėgių identifikavimui. Taip pat norėčiau nuraminti visus skaitytojus, kad tokios sistemos dažniausiai kuriamos ne kenkti vartotojams, o svetainėms suteikti interaktyvumo ir vartotojo naršymą padaryti kuo labiau naudingą jam pačiam.

Jei robotą jau apsibrėžėme kaip visiškai nuo konkrečios svetainės atskirtą servisą, tai kaip suderinsime jų veiksmus? Mano pasiūlymas ir pasirinkimas - naudoti svetainių profilius arba kitaip aprašus. Aprašas yra naudingas tuo, kad vienas robotas galės dirbti su keliomis svetainėmis vienu metu, taip pat bus galima lengvai naudoti kelių svetainių sukauptus duomenis, kas automatiškai padidina efektyvumą. Iš esmės aprašas gali būti suformuotas labai įvairiais būdais, tačiau paprasčiausia jį padaryti hierarchinės duomenų struktūros principu arba tiesiog elementariu n-mačiu masyvu. Šiame įraše aprašymą mes naudosime svetainės veiksmų reitingavimui, o tolesnėse dalyse jį praplėsime taip, kad jis galėtų jungti svetaines ir pan.

Vakar nagrinėjome vieną elektroninės parduotuvės nuorodą, todėl ir šį kartą likime prie tos pačios parduotuvės. Paprasčiausia ir efektyviausia yra apsirašyti tik tas svetainės vietas, kurios yra realiai naudingos analizuoti - tai prekių katalogas ir prekės. Pagalbos tekstai, užsakymo apmokėjimas ir panašūs puslapiai yra neverti analizės, nes šie veiksmai nenurodo pirkėjo pomėgių ir interesų. O analizuodami vartotojo veiksmus prekių kataloge ir konkrečiose prekėse mes galime gana nesunkiai nustatyti žmogaus mėgstamas prekes ir net jį dominantį kainų spektrą ar pan. Taigi mūsų testinėje parduotuvėje verta sukurti visų esančių kategorijų ir kainų grupių sąrašus ir juos patalpinti į svetainės aprašą roboto sistemoje.

Aprašo naudojimas mums padės susikurti jau anksčiau minėtą svetainės vietos objekto aprašą. Kaip tai padaroma? Susiejant vartotojo naršomą nuorodą ar atliekamą veiksmą su aprašo dalimis arba tiesiog sudėliojant žymas (angl. tags). Nuorodą http://www.manoparduotuve.lt/index.php?action=category&cat_id=41242 pažymime kaip „kategorija.41242“, o http://www.manoparduotuve.lt/index.php?action=product&cat_id=143 - su „kaina.>100“ ir „kategorija.43565“ žymėmis. Matome, kad antroji nuoroda savyje talpina ne tik produkto informaciją, bet ir loginį sąryšį su kategorija. Mums toks susižymėjimas naudingas tuo, kad norėdami nuspręsti kokio tipo prekės patinka vartotojui mes žiūrėsime ne į lankytas kategorijas, o į visus veiksmus, kurie turi kategorijų žymas.

Toks požymių žymėjimas yra šiek tiek neoptimalus - juk vienas požymis yra vertingesnis už kitą. Siekdami įvesti šiek tiek tvarkos ir efektyvumo, mes suteiksime sąryšiui „svorio“ vertę - kuo didesnė svorio reikšmė, tuo šis sąryšis yra vertingesnis. Vartotojui peržiūrint prekę kategorija yra svarbi, tačiau ne tokia svarbi kaip pati prekės informacija, todėl kategorijos žymai suteikime mažesnę „svorio“ reikšmę nei prekės kainos požymiui. Paprasčiausia „svoriui“ naudoti reikšmes nuo 0 iki 1, kur 1 žymėtų maksimalų atitikimą, o 0 - visišką neatitikimą (nors 0 mes niekada nenaudosime, nes toks požymis yra vertingas tiek pat, kiek ir požymio nebuvimas). Žinoma, tokiam žymėjimui reikia nusistatyti savo vertas įvertinus kiekvieno požymio svarbą jūsų svetainei - laisvė jūsų vaizduotei.

Deja, bet ir požymių „svorio“ pridėjimas nėra efektyvus, nes vienos aplankytos puslapio vietos yra svarbesnės už kitas - nupirkta prekė pasako žymiai daugiau informacijos apie vartotoją, nei jo naršymas. Naršoma yra daug, o nusiperkama vis tiek tik tai, kas iš tikrųjų domina. Todėl svetainės aprašyme sukursime ir specialias konstantas žyminčias svetainės vietų vertę - prekės peržiūrėjimas vertinamas mažiau nei prekės įsidėjimas į krepšelį, kuris tuo tarpu yra vertinamas mažiau nei prekės įsigijimas - tas pats požymis bus skirtingų „svorių“. Akivaizdu, kad atsiranda gana daug niuansų, nes reikia iš anksto numatyti kas yra vertinga, o kas yra ne, tačiau visus veiksmus žymint vienodai bus sunkiau atsirinkti, kurie yra naudingi, o kurie - ne.

Tačiau vertėtų nepamiršti, kad teisingas išvadas galime padaryti tik surinkę daug (labai daug) duomenų, taigi jei vartotojas aplanko vos kelis puslapius per dieną, tai teisingai nuspėti jo norus bus pernelyg sudėtinga. Kaip duomenis apdoroti neprarandant efektyvumo? Būtina nusistatyti ribą, ties kuria vartotojo veikla svetainėje gali būti efektyviai apdorojama. Ribai skaičiuoti mums pravers ir anksčiau apibrėžtas „svoris“ - sudėkime visus vartotojo veiklos svorius ir jei gautoji reikšmė yra didesnė arba lygi nustatytajai - galime pradėti analizę. Kadangi kai kurie veiksmai turės kelis požymis, tai ir jų turima didesnė informacija bus automatiškai įvertinama - juk kiekvienas požymis turės po „svorį“, kuriuos sudėjus gausime didesnę vertę, nei kad vieną požymį teturintis veiksmas.

Šiame straipsnyje pradėjome analizuoti jau nebe nuorodas, o vartotojo veiksmus - mūsų robotas žymėsis ne nuorodas, kurias aplanko vartotojas, o veiksmus kuriuos jis atlieka - peržiūri prekę, ją įsigyja ir t.t. Tokia informacija yra žymiai naudingesnė ir plačiau panaudojama nes kartu su „svorio“ koeficientais ji aprašo veiksmus, kuriuos atlieka vartotojas ir jų loginę reikšmę nustatant vartotojo poreikius. Tolesniuose įrašuose pabandysime sudaryti keletą pavyzdinių duomenų grupių ir atlikti jų analizę, o užbaigsiu pažymėdamas, kad ši straipsnių serija yra daugiau teorino pobūdžio ir aprašytas būdas tikriausiai nebus pats efektyviausias.

Robotas

Kadangi programuoju elektroninę parduotuvę, tai be abejo mano tikslas yra užtikrinti kuo didesnę apyvartą. Vienas įdomiausių ir mistiškiausių būdų yra svetainės interaktyvumo sukūrimas - kaip priversti svetainę reaguoti į vartotojo pomėgius ir siūlyti jam tik tai, kas jam tikėtina, kad patinka? į šį klausimą atsakyti nėra lengva ir tai vis dar labai retai naudojama technologija ypač Lietuvoje, tačiau aš jums pabandysiu papasakoti kaip aš esu suplanavęs vartotojų sekimą (jis dar nėra padarytas, kol kas jį brandinu teoriniame lygmenyje) ir kaip jį gali pabandyti pasidaryti kiekvienas. Šį straipsnį suskaidžiau į keletą dalių, nes vienu ypu viską aprėpti gana sudėtinga - viename įraše apžvelgsiu vis kitą aspektą, kol paskutiniame straipsnyje prieisiu prie konkrečių veikiančių pavyzdžių.

Kas yra vartotojų sekimas? Labai plati frazė, tačiau paprasčiausiai tai suvokti kaip procesą, kurio metu visi vartotojo veiksmai yra išsaugomi ir pagal juos daromos išvados, bei siekiama įtikti vartotojui. Vartotojų seklį pavadinkime robotu, tai leis aiškiau suvokti jo paskirtį - nepastebimai sekti vartotoją ir daryti išvadas vadovaujantis kompiuterio protu. Nors robotas gali skambėti šiek tiek atgrasančiai, tačiau juk pats sekimas ir yra toks procesas - gana iškrypėliškas noras stebėti žmones jiems apie tai nežinant.Be to, robotai tam netgi labiau tinka, nes žmonės jaučiasi laisviau, kai juos stebi ne žmonės - juk prieš kompiuterį žmonės daro viską be jokių kompleksų net nežinodami, kad jie tikrai yra stebimi.

Pirmiausia reikia suvokti, kad mūsų robotas turi veikti visiškai atskirai nuo bet kokios svetainės - jis neturi būti įprogramuotas į svetainę ar elektroninę parduotuvę, nes roboto veikla turi priklausyti tik nuo vartotojo naršymo kitimų ir jo atliekamų veiksmų. Tuo labiau šie dalykai negali dalintis viena duomenų baze, nes ne vien skirtingųjų dalių apkrova bus labai skirtinga, bet ir bus prarandama loginė tvarka. Paprasčiausia tai suvokti kaip du atskirus serverius iš kurių vienas atsakingas už svetainės turinio generavimą, o kitas - už vartotojo veiksmų sekimą. Bet koks roboto tiesioginis surišimas su svetaine nebus naudingas - robotas neturi veikti priklausomai nuo svetainės vidinės struktūros, o sprendimai neturi būti priimami pagal vidinę struktūra - visas procesas turi vykti tik bendraujant tarpusavyje.

Kadangi tokiose kalbose kaip PHP nėra tokio dalyko kaip nuolatos veikiantys serveriai, todėl robotas tebūnie būna servisas. Servisas apibūdins robotą kaip loginį daiktą, kuris pasiekiamas specialiu adresu ir bendrauja jo nustatytomis taisyklėmis. Bendravimui aš rinkčiausi vieną iš XML pagrindų veikiančių protokolų (XMLRPC, SOAP ar pan.), nes jų užklausas ir atsakymus galima labai lengvai apdoroti bet kurioje kalboje ir aplinkoje, be to jie yra lengvai tvarkomi, nes siunčiami pranešimai yra suprantami net žmogui. Plačiau bendravimo nenagrinėsiu nes tai kol kas nėra lemiamas dalykas. Pasiruošimo darbai beveik baigti - dabar atėjo laikas pasižiūrėti kaip patogiai ir gerai dirbti su duomenis.

Jei svetainė suprogramuota teisingai tai ji naudoja Front Controller komponentą, kuris apdoroja visas vartotojo užklausas. Centralizuotas užklausų apdorojimas leidžia lengviau dirbti su vartotojo sekimu, nes darbą su robotu užtenka apsirašyti vos vienoje vietoje ir jis gali būti lengviau kontroliuojamas. Kaip sekti vartotojo veiksmus internete? Išsaugant vartotojo įvedamus duomenis GET ir POST tipuose. Tai galima padaryti labai įvairiais būdais, tačiau ne visi jie yra tinkami. Čia iškart galiu perspėti, kad tokių būdų galima surasti labai įvairių, tačiau aprašysiu tuos, kuriuos mano manymu yra labiausiai tikėtina ir naudinga pasirinkti.

Paprasčiausias būdas yra tiesiog saugoti vartotojo ID, aplankytą nuorodą ir aplankymo datą. Deja, bet tai yra gana prastas sprendimas, nes norint iš išsaugotų duomenų ištraukti bent šiek tiek informacijos juos reikės gana ilgai analizuoti - nuoroda nėra informacijos objektas, nes ją dar reikia paversti į informacijos atitikmenį. Tarkime turime nuorodą http://www.manoparduotuve.lt/index.php?action=category&cat_id=41242, kuri iš pirmo žvilgsnio atrodo aiški, tačiau yra visiškai netinkama analizei, nes neišskaidžius jos į atitinkamus komponentus (['action' => category, 'category_id' => 41242] bus neįmanoma padaryti išvadas apie vartotojo poreikius.

Žymiai geresnis būdas yra saugoti konkretų svetainės vietos atitikmenį arba tiesiog svetainės objekto aprašymą. Duomenų struktūra automatiškai tampa sudėtingesnė, tačiau darbas su jais be galo supaprastėja. Tarkime turime tą pačią nuorodą, kurią minėjau anksčiau, tačiau vietoje jos išsaugome informaciją “Pliušinių meškiukų kategorija” (programiškai tai be abejo būtų aprašyta kaip kažkokia duomenų struktūra ar pan.). Dabar jau net nebereikia analizuoti išsaugotų duomenų - juos apdoroti galime tiesiogiai. Pačios duomenų struktūros irgi dar neaprašinėsiu nes be pilno programos kodo ji būtų bevertė, tačiau galite įsivaizduoti, kad saugoma ne nuoroda, o kompiuteriui suprantamu stiliumi aprašytas svetainės vietos aprašymas.

Šį kartą nusistatėme pradines ribas - loginis roboto atskyrimas nuo svetainės ir duomenų saugojimo būdai. Nors tai dar tik labai mažai informacijos, tačiau to turėtų užtekti susidaryti pradinei nuomonei apie sekimo procesą - tai nėra vien programavimas, o ir teorinis užduoties supratimas. Kaip jau minėjau - pats dar nespėjau visko iki galo įgyvendinti, bet tikriausiai jau kelių mėnesių bėgyje spėsiu išbandyti tokį dalyką realiai ir įsitikinti jo žadama nauda. O jūs ar neišsigandote, kai sužinojote jog internete jus stebi ne tik Google, bet ir kita galybė svetainių?

Žaidimas

Nėra didelė paslaptis, kad aš esu įmonės UAB „Barzda“ akcininkas ir darbuotojas, taigi jau pats laikas papasakoti kaip mes iš mėgėjiškų pomėgių sukūrėme rimtą įmonę. Nors skaičiuojame tik pirmuosius veiklos mėnesius - kol kas verslas man vis dar panašus į šiokį tokį žaidimą. Jau gana ilgą laiką dirbame ties elektroninio knygyno projektu, apie kurį jau esu daugybę kartų rašęs. Projektas bus jau gana greitai baigtas, tačiau šį kartą papasakosiu ne apie jį - šiandien šnekėsiu apie programinę įrangą, kurią mes naudojame/naudosime darbui su klientais ir projektais ir kaip mes siekiame savo užsibrėžtų tikslų.

Mūsų įmonės išskirtinis bruožas - neturime ofiso. Žinoma, tai yra neigiamas bruožas, nes koordinuoti įmonės veiklą tenka telefonu ar elektroniniu paštu, tačiau tai nėra taip blogai kaip gali pasirodyti. Tai nėra blogai, nes mūsų komanda yra labai aiškiai pasiskirsčiusi darbais - aš programuoju, kažkas užsiima pardavimais ir t.t. Toks darbų pasiskirstymas ir kol kas mažas darbuotojų skaičius gelbsti mus nuo papildomų išlaidų ofiso patalpoms, kurios kol kas mus ir taip smarkiai riboja. Ofiso nėra, visi žmonės dirba namuose, todėl labai svarbu, kad visi darbuotojai galėtų dirbti nuotoliniu būdu - internetu. Darbas internetu yra greitas tik tuo atveju, kai internetu yra pasiekiami visi įmonės įrankiai - sąskaitų, darbų paskirstymo (arba TODO) ir bendravimo su klientais sistemos. Pradėti dirbti be jų būtų sudėtinga, nes būtų labai sunku sukontroliuoti įmonės finansus ir atliekamus darbus.

Įdomiausia, kad beveik visus šiuos įrankius mes pasidarėme patys: sąskaitų ir darbų paskirstymo sistemą susiprogramavome, o bendravimui su klientais panaudojome nemokamą įrankį ir jį pritaikėme savo poreikiams. Be abejo, įmonė turi turėti bent vieną gerą programuotoją, kad tokią infrastruktūrą susikurtų pati, tačiau tikrai neverta švaistyti didžiulių sumų super galingoms ir funkcionalioms sistemoms - pradžioje užtenka gana elementarių įrankių, o visą kapitalą galima panaudoti ir svarbesniems dalykams. Tikrai nėra prasmės investuoti į sistemas jei nėra jokio garanto, kad jos pasiteisins - juk darbuotojai turi ir matyti prasmę jomis naudotis. Mes pasidarėme šaunias sistemas ir esame be galo patenkinti, nes dar rimtai nepradėję didelių komercinių projektų jau turime puikią programinės įrangos infrastruktūrą tolimesniems darbams, o ką jau kalbėti apie tai, kad mums tai beveik nekainavo.

Turbūt svarbiausia iš visų sistemų yra sąskaitų sistema. Ją mes pasidarėme gana apgalvotai, nes iš anksto numatėme, kad turėsime ne vieną projektą ir jiems būtinai reikės išrašinėti sąskaitas. Dėl šios priežasties mūsų sąskaitų sistema gali dirbti su neribotu kiekiu projektų vienu metu (užklausų kiekis neturi būti pernelyg didelis), nes yra sukurtas XML-RPC tunelis, kuriuo prie jos gali prisijungti svetainės ir išrašyti, bei kitaip dirbti su sąskaitomis. Be abejo, tunelis yra viešai nepastebimas ir maksimaliai apsaugotas, todėl niekas iš išorės tikriausiai net nesuras kur jis yra - sąskaitos yra tai, kas turėtų būti prieinama tik tiems kas ją išrašė ir tam kam išrašė. Svarbu ir tai, kad tinkamai pasidarius sąskaitų sistemą žymiai supaprastėja ir buhalterinis darbas, nes daugelis veiksmų jau yra optimizuota ir paruošta naudoti. Be to, juk sąskaitos, tai pagrindinė įmonės „valiuta“.

Galimybė iš bet kur dirbti yra tiesiog nuostabi, nes mes nesame prirakinti prie savo darbo vietos, o įgavę šiokį tokį finansinį stabilumą galėsime nesunkiai migruoti į dar rimtesnius įrankius. Žinoma, galima labai daug dalykų palikti tvarkyti žmonėms, bet kam tai daryti jei tam yra kompiuteriai? Mūsų elektroninis knygynas daugybę sprendimų ir veiksmų atliks pats atsižvelgdamas į pirkėjo veiksmus ir jo norus, o mums nereikės įsitempus stebėti ateinančius užsakymus ir skubėti kažką iš kart keisti - viskas vyks dinamiškai ir automatizuotai, todėl įdėjus dar šiek tiek darbo (pradžioje ne viską įjungsime) sistemą galėsime palikti veikti visiškai autonomiškai. Gana keista, kad tokį stambų ir gana sudėtingą projektą mes darome vien nuotoliniu būdu, tačiau tai tik įrodo, kad ir turint mažą pradinį kapitalą galima pasiekti puikių rezultatų.

Šiuo straipsniu aš tikrai neskatinu jūsų pulti kurti įmones, tačiau jei apie tai galvojate, tai nemanykite, kad įmonei būtinas didelis pradinis kapitalas. Taip, pradinis finansinis pagrindas tikrai suteikia laisvės ir jėgos dirbti, tačiau ir neturint didelių pinigų ar tik pereinant nuo mėgėjiškumo iki sąlyginio profesionalumo galima pasiekti tikrai daug. Jei norite, mus galite laikyti kaip „pavyzdį“ - dirbame nuotoliniu būdu, patys pasidarome visus reikalingus įrankius ir puikiai plėtojame pradėtus darbus, ko dar reikia? Žinoma, turėdami didesnį kapitalą darbus galbūt jau būtume baigę, tačiau kuriant savo pirmąjį verslą tikrai įdomu viską išbandyti ir susidėlioti taip, kaip tau patinka. O svarbiausia yra turėti tikslą - nekurkite įmonės tiksliai nežinodami ko siekiate, nes plaukimas pasroviui versle retai būna sėkmingas.

Nežinau ar man pavyko padaryti kažkokią įtaką ir parodyti, kad verslui pradėti nebūtinai reikia daug pinigų. Mano manymu, bet koks informatikos studentas su ekonomikos studento pagalba gali gana sėkmingai susikurti IT įmonės pagrindą. Be abejo, pelnas dar nėra garantuotas, tačiau turint gerus specialistus tikrai galima išsilaikyti rinkoje ir net pasiekti kažko daugiau. Jei jūsų svajonė dirbti sau, kodėl nepabandyti? Mes bandome ir gal net žaidžiame, bet esame tuo patenkinti, nes kol kas viskas juda labai teisinga linkme ir jau kažkur toli toli žybsi sėkmės švieselė. Live the dream sušunku ir linkiu sėkmės, svarbiausia nenustokite tikėję!

Voras

Vienas projektas nenumaldomai artėja prie pabaigos, tačiau iki šiol vis dar atsiranda darbų, taigi iki normalaus testavimo dar liko šiek tiek laiko. Visai neseniai sužinojau, kad turi būti galimybė importuoti duomenis iš teikėjų sandėlio turinio sąrašo į mūsų sistemos duomenų bazę. Atrodytų viskas paprasta, tačiau kaip parodė vėlesni bandymai - netvarkingi duomenys sudaro tiek daug problemų, kad be žmogaus patikros su jais dirbti beveik neįmanoma. Kadangi pradinių duomenų kiekis buvo gana didelis, tai pasitelkti žmogiškaisiais ištekliais nebūtų visiškai protinga, todėl nusprendžiau dalį žmogaus darbo perkelti kompiuteriui.

Pradėjau nuo to, kad gavau Excel rinkmeną su 1000 įrašų - gana įspūdingas skaičius, nes visą 1000 prekių reikia įkelti. Blogiausia, kad prekių sąrašas yra sudarytas be jokios padorios tvarkos - panašūs pavadinimai skiriasi tik tarpu, informacijos pateikimo forma ne visada vienoda ir pan. Žinoma, tiekėjai neturi noro surašyti visus prekės parametrus, todėl pateikė tik pavadinimus ir kažkokius neaiškius prekių kodus, kurie beveik neatitiko realybės. Kadangi tiek duomenų yra žymiai per mažai išsamiam prekės aprašymui, tai teko ieškoti būdų kaip gauti papildomos informacijos apie prekes. Vienintelis įmanomas variantas - internetas. Pateiktieji priekių kodai neatitiko jokių duomenų internete, todėl teko pasikliauti prekės pavadinimu. Paieškos sistemoje Google tikrai būtų galima susirasti pačios įvairiausios informacijos apie bet kokią prekę, tačiau informacijos ieškojimas negalėtų būti pavestas kompiuteriui, nes aprašyti reikalingos informacijos ieškojimą svetainės turinyje būtų gana sudėtinga. Labai gerai būtų tam panaudoti žmones(!), tačiau internete surasti 1000 prekių tikriausiai užtruktų keletą savaičių. Nieko kito nebeliko, kaip bandyti panaudoti netikėtai atrastą tiekėjo svetainę. Gaila, tačiau svetainė neturi jokios normalaus katalogo, todėl teko programiškai aprašyti tokią veiksmų seką, kuri žinant prekės pavadinimą suranda išsamesnę informaciją:

  1. Prisijungiame prie tiekėjo svetainės paieškos puslapio
  2. Į paieškos laukelį įvedame prekės pavadinimą
  3. Rezultatuose surandame patį pirmą įrašą (labiausiai tikėtina, kad visada bus tik vienas rezultatas)
  4. Pereiname į įrašo puslapį ir nuskaitome dominančią informaciją

Veiksmai neatrodo sudėtingi, tačiau tai yra gana problematiškas procesas, nes ne tik, kad prireiks 2000 prisijungimų į tiekėjų serverį, tačiau ir įrašo puslapyje reikės tinkamai atsirinkti naudingą informaciją. Kadangi svetainė yra parašyta nesilaikant W3C reikalavimų, tai pasinaudoti DOM galimybėmis tikriausiai nebūtų pavykę, o gaišti laiką bandymams nelabai norėjau. Realiausia buvo kuo daugiau atkurti žmogaus informacijos ieškojimo principą, kuris remiasi tuo, kad informacija randama pagal ją supančius duomenis. Taigi turbūt vienintelis įmanomas variantas - informaciją ieškoti pagal įvairiausius parametrus pačiame html kode. Pavyzdžiui: prekės kainą randame prie „Kaina: X.X Lt.“, prekės nuotrauką randame pagal nuorodos adresą ir t.t. Tiesiog pagrindinis dalykas norint programiškai apdoroti bet kokį dokumentą ar internetinį puslapį - būtinai reikia išsamiai išanalizuoti jo turinį ir atrasti vietas, už kurių galėtų „užsikabinti“ informacijos ieškojimo ciklas. Be to, labai svarbu rasti išskirtinius atvejus, kai standartinėje informacijos pateikimo formoje atsiranda papildomi duomenis, kurie gali iškreipti rezultatus, todėl būtina prieš analizuojant informaciją įvertinti ir jos padėti dokumente. O liūdniausia, kad atakuojamos svetainės autoriai bet kada gali pakeisti svetainės struktūrą ir informacijos ieškojimas nustos veikti.

Tai yra viena įdomiausių paskutiniuoju metu daromų užduočių, nes tiesiog nėra pasirinkimo daryti taip, kaip būtų geriausia ir optimaliausią - tiesiog reikia naudoti tą informaciją, kuri yra pasiekiama, o daugiau informacijos ieškoti itin įdomiais būdais. Nenoriu atskleisti mano „taikinio“ pavadinimo, nes pyktelėję darbuotojai gali užblokuoti mano įrankius ir viską reikėtų daryti iš naujo. Sunku net pasakyti kokia šio įrašo prasmė - galbūt tai vienas iš tų įrašų, kai dalinamasi nestandartine ir galbūt kitiems įdomia asmenine patirtimi. Tikiuosi atradote ką nors naudingo!

Lėtai

Šiandien galų gale gavome priėjimą prie hanza.net elektroninės bankininkystės testavimo sistemos. Prieš šiek tiek mažiau nei mėnesį skundžiausi, jog prieš Kalėdas ir per jas niekas nedirba, tačiau nedirbo ir po jų. Ilgai kankinome Hansabanko vyrukus, kol jie galų gale prisiruošė suteikti priėjimą prie šios sistemos. Neanalizuosiu kodėl jie taip ilgai užtruko (viską pradėjome 2007 Gruodžio pradžioje), tačiau pasidžiaugsiu, kad taip ilgai lauktas dalykas iš tiesų nesukėlė jokių problemų.

Turbūt svarbiausias dalykas - bendravimas su bankininkystės sistemomis vyksta šifruotai, naudojant jūsų ir banko viešo ir privataus rakto poras. Svarbiausias, nes šifruojant duomenis yra svarbus kiekvienas pradinių duomenų bitas, nes gautas rezultatas yra visiškai neatitinkantis pradinių duomenų ir vienu bitu besiskiriančios eilutės užkoduotos gali atrodyti visiškai kitaip. Kadangi reikalingas šifravimo algoritmas aprašytas tik teoriniu aprašu ir jokių veikiančių pavyzdžių bankas nepateikia, tai teko jų ieškoti kitais keliais. Pasitelkus Google į pagalbą internete susiradau jau veikiantį kodą ir jį tik šiek tiek modifikavęs, buvau visiškai įsitikinęs, kad nekils jokių problemų. Taip ir atsitiko - šiandien gavęs patvirtinimą, jog galiu pradėti testavimą iš kart atlikau pirmąjį sėkmingą mokėjimą - sistema suveikė iš pirmo karto. Tai yra tikrai šaunu, nes labai bijojau problemos dėl koduočių (bankas naudoja windows-1257, o aš - UTF-8) ir šifravimo raktų. Tačiau blogiausia neatsitiko ir sistema jau puikiai veikia.

Kaip matote - per ilgą laukimo laiką pasiruošiau taip, kad atėjus darbo metui jau nebebuvo ką dirbti. Keista, tačiau taip jau yra, jog kartais įmanoma programavimo užduotis labai šauniai atlikti ir teoriniame lygmenyje, nes labai dažnas programuotojas rašo kodą taip, kad jis tik veiktų, bet ne taip, kad jis veiktų visada ir su visais duomenimis. Beliko SEB


© 2008 Juozo Kaziukėno blogas | TextNData dizainas | Wordpress variklis