Posts Tagged ‘žiniatinklis2.0’

Žiniatinklis3.0: viešo tinklo išsaugojimo konspiracija

Saturday, March 1st, 2008

Tokiu truputėlį iššaukiančiu, truputėlį neaiškiu pavadinimu prieš kelias savaites buvau priviliotas į Transmediale festivalio konferenciją apie internete lakstančios informacijos privatumą bei laisvę. Ne ne.. Konfa buvo ne apie kokius architektūrinius tinklo sprendimus, o apie pačią informaciją, jos keitimosi koncepciją bei sąlygas skirtingose šalyse. Tipo, kaip ir turėtų būti suprantama paprastam žmogui.

conspire.jpg

Į auditorijąPasaulio kultūrų centreakaNėščia austrė“ prigužėjo transvestitų, kompiuterastų ir kitokio plauko mianininkų.

Vaizdas. Scenoje ilgas kalbėtojų stalas ir pora ekranų. Viename ekrane bus rodomi pristatymai. O kitame nuolat realiu laiku vyksta čatas su pasauliu apie pačią konferenciją. Tarsi specialiai parodoma, kad informacija, kuri perduodama asmeniškai, tuo pačiu yra vieša ir visiems prieinama.

Visas veiksmas vyko anglų kalba. Visų pirma naujųjų medijų tyrėja ir organizatorė, šitos konferencijos moderatorė Olga Goriunova nedrąsiai, skubėdama ir juokingu rusišku akcentu nuo lapuko nuskaitė Web2.0 apžvalgą. Iš esmės, ji pateikė tą pačią informaciją, ką šiandien perskaičiau Pawkos bloge, kad Web2.0 – tai „kampazyšn“ iš techninių naujovių ir madų bei šiuo metu vykstančio socialinio-ekonominio reiškinio internete. Dar porą kažkokių istorinių faktų paminėjo bei citatų, bet toks vaizdas, kad pati nelabai suprato… Ir tada trumpai pristatė šalia sėdinčius kolegas.

Humboldto universiteto IS tyrimų asistentė Seda Gürses, savo kalbą pradėjo gykišku bajeriu, kad šita prezentacija ne apie Web 3.0, o apie Web 2.6 beta. O paskui aiškiai ir paprastai papasakojo apie informacijos privatumo stoką ir poreikį internete.
Yra keletas su asmens duomenimis susijusių terminų:

  • Panoptikono efektas. Panoptikonas yra kalėjimo pastato tipas, kuriame visos kameros išdėstytos ratu ir matomos iš centro. Ir nei vienas kalinys niekad nežino, ar tuo metu yra stebimas, ar ne. Panoptikono efektas pasireiškia internete rodymusi ne tokiu, koks esi iš tikrųjų, dirbtinio įvaizdžio kūrimu, nes tarsi tame kalėjime mes esam arba galime būti stebimi tų, kuriems nenorime rodytis.
  • Kvantifikavimas. Tai kaip ir žmogaus pojūčių skaitmenizavimas, kuo po to remiasi melo detektoriai ar emocijų detektoriai.
  • Duomenų kasimas. Tai dirbtinio intelekto duomenų rūšiavimo principas, kai iš gausybės duomenų atrenkama specifinė reikalinga informacija. Dažniausiai naudojama verslo tyrimams ir finansinei analizei.

Taigi internete kaip ir vyksta toks procesas: mes rodomės tokie, kokie norime atrodyti. Mus tiria ir analizuoja bei atpažįsta, kokie esame iš tikrųjų. Ir paskui pagal tai skirsto į klases ir naudoja savo tikslams, pavyzdžiui, įsiūlyti naują prekę.
Papasakojo kažkokio filosofo mintį, kurią dar ir animuotu filmuku pailiustravo, kad jeigu norėtume būti anonimai realiame gyvenime, tuomet visi turėtume būti apsigaubę vienodomis dėžėmis, vaikščiot į darbus vis kitu laiku ir kitais keliais, kad nebūtumėm susekti, kaitaliot savo gyvenamąją ir darbo vietas.
Buvo paminėtas pavyzdys, kad iš anoniminio JAV gyventojų ligų sąrašo, kuriame įrašyta gimimo data, lytis ir pašto indeksas, galima identifikuoti, kiekvieną žmogų ir jo ligą. Galbūt būtų nemalonu, jei sužinotume, kad naujas atsikraustęs kaimynas gretimam bute yra psichinis ligonis su agresijos priepoliais ar serga AIDS. O tai to kaimyno privatumo klausimas, ar jis nori, kad kiti žmonės apie jį susidarytų nepagrįstą neigiamą nuomonę. Kai patenkame į vieną ar kitą statistinę grupę, tuomet yra rizika, kad mums bus emociškai primesta ir realybės neatitinkanti etiketė.
Jei naudojamės internetu, net ir labai norėdami pasislėpti, galime būti susekti ir atpažinti. Jei ne kaip individai, tai kaip vartotojų grupės nariai. Šiuolaikinis folkloras, kaip kad grandininiai laiškai („persiųsk penkiems draugams, jei nori, kad aplankytų laimė arba neužkluptų bėdos“), melagingi pranešimai apie virusus, vikiai ir kt. informacija yra kaip ir anoniminė, bet vis vien galima atsekti kiekvieną autorių per serverių logus ir kitom priemonėm. Net jei naudoji proxy serverį naršymui, policija turi teisę ir yra galimybės susirast, kas tu per vienas.

Kita šnekėtoja – kanadietė menininkė, performansų kūrėja Michelle Teran pasakojo kažkokius neaiškius išsigalvojimus super aukštom materijom apie technologinių ir socialinių tinklų sankirtas… Ji lygino internetą su futbolu. Kad kaip futbole, taip ir internete yra žaidėjai, yra taisyklės, yra bio ryšiai tarp žaidėjų. Paskui parodė filmuką iš savo performansų. Tai buvo dokumentika apie lauko kiną, suorganizuotą ant savitarnos automobilių plovyklos sienos. Kine transliavo vaizdus iš neapsaugotų plovyklos bevielio ryšio apsaugos kamerų. Vieni žmonės gyveno savo eilinius gyvenimus, o kiti stebėjo šitą realybės šou. O į viską pažiūrėjus iš šono, patys žiūrovai irgi buvo stebimi viską registruojančios autorės vaizdo kameros akimi. Tuom ji norėjo pasakyt, kad žmonės turi galimybę stebėti asmeninę nuosavybę viešoje erdvėje. Kaip kad ir naudot daiktus ne pagal jų pirminę paskirtį.
Dar vienas pavyzdys buvo parodytas su svetainėm, kuriose galima valdyt parduotuvėje įrengtas video kameras ir naršyt prekes. Naudojant tos pačios svetainės funkcionalumus, taip pat galima pastebėti kada renkasi ir kaip gyvena darbuotojai, kokie žmonės praeina pro parduotuvę, visokius parduotuvės interjero trūkumus, kaip kad įskilusi siena. Visa tai kaip ir turėtų būti apsaugota.

Meksikietis programeris ir idėjinis aktyvistas Fran Ilich pasakojo apie kažkokias vidines Meksikos kovas, kažkokias pogrindžio grupes, valdžios prieštaravimus ir pasipriešinimo judėjimą. Jis prie to judėjimo prisidėjo informaciniu būdu bei per meną. Darė kažkokius fluxus gatvėse, įkūrė organizaciją „Fiction Department“, pradėjo leist žurnalą „Sabot” bei kūrė per pasaulį populiarumo susilaukusias politines telenoveles kaip „Ugly Betty“, o pastaruoju metu atidarė savo banką. Valdžia ten atseit riboja interneto prieigą ir neleidžia sklisti informacijai – uždarinėja ar blokuoja tam tikras svetaines ir pan. Tai dabar info skleisti bandys per P2P tinklus.

O multimedijos kūrėjas Felipe Fonseca iš Brazilijos savo kalbą pradėjo tuo, kad jo manymu, tokio dalyko kaip Web 2.0 nėra. Yra tiesiog internetas, o ta versija tėra išpūstas ekonominis burbulas. Web 2.0 yra tik mada, o esmės niekas nesupranta. Semantinis turinys ir švarus svetainės išeities tekstas nėra taip jau svarbu. Daug svarbiau komunikacija per P2P tinklus, duomenų dalinimasis bei RSS prenumeratos. Felipe guodėsi, kokie žinių neištroškę Brazilijos interneto naudotojai… Atseit anksčiau pagrindinai internas buvo naudojamas žaidimams ir pornui, paskui el. paštui, blogams ir vikiams, o dabar visi tik sulindę į Orkut socialinį tinklą ir nieko toliau jo nemato. Taip visiškai neskatinamas kūrybingumas.

Pabaigoje dar buvo dialogas su žiūrovais. Kas norėjo, galėjo ko nors paklaust. Štai dar keletas minčių iš įvykusių diskusijų bei nuomonių apsikeitimų:

  • IT dažnai kaltinama dėl problemų, kurios egzistavo metų metus. Už saugumą turėtų būti atsakingi ne technikai, o steikholderiai – valdančiosios šalys.
  • Yra du skirtingi dalykai: jaustis privačiu ir būti privačiu. Jeigu sistema suteikia saugumo jausmą, tai dar nereiškia, kad taip yra iš tiesų. Tai tik internetinės firmos politika suteikti tokį jausmą.
  • Duomenų privatumas – konkurencinis klausimas. Tam, kad prisitrauktų daugiau lankytojų, sukuriama labiau valdoma ir privatesnė sistema.
  • Viskas, kas skaitmenizuojama, jau tampa kopija. O kopija neatspindi originalo, nes ji nėra originalo kontekste.
  • Privatus ir autentikuotas – dvi viena kitai prieštaraujančios sąvokos, kurios turi būti suderintos interneto sistemose.

Ar buvo naudinga pasiklausyt? Tiesiogiai gal ir nelabai, bet šiaip įdomu akiratį praplėst. Na ką, eisiu jau miegot gal ar ką. Visgi šešios ryto.

Žaismingų svetainių pasiekiamumas: slapukai

Thursday, February 28th, 2008

Tavo interneto projektas spurda visokiais specialiaisiais efektais kaip kad google žemėlapiai, dinaminiai meniu ar automatinis įvedamo teksto siūlymas? Tada neišvengiamai vardan didesnio pasiekiamumo teks naudot įvairias alternatyvas lankytojams, naršantiems be Javascript. Tai reiškia, kad pilnavertiškai dinamišku atveju vienus objektus reiks slėpt, kitus – rodyt. Ir apskritai, Javascript’u varomose svetainėse dažnai tenka manipuliuot elementų slapstymusi. Šįkart mestelsiu keletą idėjų šitų slėpynių tema.

Gudrybė Nr.1. Pirmiausia reikia nuspręsti, kurie elementai ir efektai veiks tik tam tikrose naršyklėse. Pavyzdžiui, mandrą google žemėlapį rodysim ten, kur jis palaikomas. Kitiems tuo tarpu alternatyviai rodysim paprastą žemėlapio paveikslėlį. Kad susišnekėtume, pavadinkim tą spec. efektais praturtintą puslapį dinaminiu, o alternatyviąją versiją – statišku puslapiu. Statiško puslapio pranešimams apie pageidautinas naršykles ir jų nustatymus bei kitiems statiškiems elementams, kurie nebereikalingi dinaminėje versijoje, pridėkime CSS klasę to_hide. O tiems, kurie turi būti nematomi statiškoje versijoje, bet kurie draskysis puslapyje vos tik pajutę Javascript, pridėkime CSS klasę to_show. Šios klasės nurodo, ką reiks daryt skirptui dinaminiame puslapyje. Tuo tarpu CSS turi būti nurodyta:

.to_show {
    display: none;
}

Turbūt jau spėji, kad ruošiuosi pakeist elementų su CSS klasėmis .to_hide ir .to_show matomumą, puslapiui pasikrovus? Spėjimas beveik teisingas. Šitą pakeitimą reikia daryti ne puslapiui pasikrovus, o dar jam kraunantis. Antraip pasikrovimo pradžioje dinaminis puslapis sekundėlei mirktelės su statiniu turiniu, o tik paskui pasikeis. Puslapiui kraunantis, dar nėra aišku, kurie elementai turės tas klases, o kurie ne. Bet tai mums nesvarbu. Keisim aprašus CSS klasėms tiesiogiai. Pasinaudokim funkcija dyn_css_rule, kuri prideda CSS taisykles dinamiškai prie pirmojo pakrauto kaskadinių stilių failo. N.B. Kaskadiniai stiliai dokumento apraše turi būti nurodyti prieš visus Javascript.

function dyn_css_rule(sSelector, sCssText) {
    var oCss = document.styleSheets[0];
    if (oCss.insertRule) {
        oCss.insertRule(
            sSelector + " {" + sCssText + "}",
            oCss.cssRules.length
        );
    } else if (oCss.addRule) {
        oCss.addRule(sSelector, sCssText);
    }
    return sSelector + "{" + sCssText + "}";
};
dyn_css_rule("to_show", "display:block");
dyn_css_rule("to_hide", "display:none");

Taigi šiuo atveju, jei Javascript yra įjungtas, objektai su atitinkamom klasėm bus suformuoti kaip matomi ar nematomi dar puslapiui besikraunant.

Gudrybė Nr.2. Šitas triukas tai paprastas. Elementams, kurie turi būti slapstomi dinamiško puslapio naudojimo eigoje, pridėjinėsim CSS klasę hidden. Pavyzdžiui, navigacijos meniu antras lygmuo turi būti rodomas tik užvedus pele virš pirmojo lygmens nuorodos. Štai ekspromtu rašau pavyzdį mėgstamos karkasinės sistemos jQuery sintakse:

HTML:
<ul class="dyn_menu">
    <li>
        <a href="">Lietuva</a>
        <ul class="to_hide">
            <li><a href="">Vilnius</a></li>
            <li><a href="">Kaunas</a></li>
            <li><a href="">Klaipėda</a></li>
        </ul>
    </li>
    <li>
        <a href="">Deutschland</a>
        <ul class="to_hide">
            <li><a href="">Berlin</a></li>
            <li><a href="">Hamburg</a></li>
            <li><a href="">München</a></li>
        </ul>
    </li>
</ul>

CSS (žinoma, iš atskiro failo):
.hidden {
    display: none;
}

Javascript (iš atskiro failo):
$(document).ready(function() {
    $("ul.dyn_menu li").mouseover(function() {
        $(this).children("ul").removeClass("hidden to_hide");
    }).mouseout(function() {
        $(this).children("ul").addClass("hidden");
    });
});

Šitam pavyzdy, lankytojai statiškuose puslapiuose matys pilną navigaciją – valstybes su miestais, – o tuo tarpu dinamiškuose miestai standartiškai bus paslėpti. Užvedus pele virš „Lietuvos“, galvas iškiš mūsų sostinė, laikinoji sostinė ir uostamiestis. Pervedus pelę virš „Deutschland“, Lietuvos miestai iškeliaus išgert arbatos, vietą užleisdami didžiausiems Vokietijos miestams.

Gudrybė Nr.3. Jeigu dinaminiame puslapyje reikia vieno jungiklio aktyvavimu kaitalioti daugybės išsimėčiusių elementų matomumą, tuomet naudoti CSS klasę hidden nėra efektyvu. Vietoj to visiems išsimėčiusiems slapukams suteiksim CSS klasę hidable, kuri pati savaime neturės jokių stiliaus taisyklių. O tik kombinuojant kartu su kita klase collapse ji taps nematoma. Štai pavyzdėlis, kuriame priklausomai nuo žymimojo langelio būsenos, bus rodomi arba slepiami neprivalomi formos laukai.

HTML:
<form action="" method="post" id="game_options">
    <div class="to_show">
        <label for="hide_optional">Slėpti neprivalomus laukus</label>
        <input type="checkbox" id="hide_optional" />
    </div>
    <div>
        <label for="nickname">Žaidėjo vardas</label>
        <input type="text" id="nickname" name="nickname" />
    </div>
    <div class="hidable">
        <label for="avatar">Avataro URI</label>
        <input type="text" id="avatar" name="avatar" />
    </div>
    <div>
        <label for="level">Sunkumo lygis</label>
        <select id="level" name="level">
            <option value="easy">Lengvas</option>
            <option value="medium">Vidutinis</option>
            <option value="hard">Sunkus</option>
        </select>
    </div>
    <div class="hidable">
        <label for="skill">Super galia</label>
        <select id="skill" name="skill">
            <option value="flying">Skraidymas</option>
            <option value="invisibility">Nematomumas</option>
            <option value="digging">Rausimasis</option>
        </select>
    </div>
    <div><input type="submit" /></div>
</form>

CSS (iš atskiro failo):
.collapsed .hidable {
    display: none;
}

Javascript (iš atskiro failo):
$(document).ready(function() {
    $("#hide_optional").click(function() {
        if ($(this).attr("checked")) {
            $("#game_options").addClass("collapsed");
        } else {
            $("#game_options").removeClass("collapsed");
        }
    });
});

Pasikrovus statiškam puslapiui, pamatytume formą su visais įvesties laukais, išskyrus žymimąjį langelį, skirtą paslėpti neprivalomus laukus. Dinamiškame puslapyje šypsotųsi visi laukai tol, kol neužbrėžtume varnelės žymimajam langely. Varnelė paslėptų avataro ir super galios įvesties laukus.

Na ką gi. Susidomėjai, kaip matau? ;) Tai nebesislapstom, puolam prie darbo ir keliam interneto kokybę.

Web2.0: ko tu nori iš manęs!?

Tuesday, February 19th, 2008

Praėjusių metų pabaigoj vienas Vokietijos univieras susikooperavo su tokia UAB; ėmė ir ištyrė interneto bendruomenių narių norus ir įpročius, bei palygino su tuo, ką apie internautus galvoja bendruomeninių svetainių kūrėjai. El. žurnalas „Spiegel“ rašo, kad buvo apklausti beveik pusšimtis interneto bendruomenių (dar vadinamų socialiniais tinklais) moderatorių, trigubai daugiau internautų ir ištirta virš tuzino didžiausių Vokietijoje naudojamų socialinių tinklų, kaip kad MySpace, Facebook, StudiVZ ar Xing. Tyrimo rezultatai štai kokie…

Efektyviausia neinternetine žiniatinklio svetainės reklama laikoma ne kokie nors blizgučiai per TV ar paburbėjimai per radiją, tuolab ne šlamštas pašto dėžutėj. Netgi ne guerrilla marketingas, apie kurį verta parašyt atskirą įrašą. O rekomendacijos iš draugų ar kitų autoritetingų kontaktų, viešieji ryšiai (PR) (informacija tikslinei auditorijai) ir skrajutės (tikriausiai tos, kurios ramiai guli baruose ir laukia, kol jas pasiimsi, o ne tos, kurias įkyriai kiša gatvėj). Kitaip tariant, portalas kaip produktas turi pats kalbėt už save. Jei bus nepakankamai funkcionalus ar nestabiliai veiks, tuomet ir nesusilauks tinkamo dėmesio.

Internete, sako, kad efektyviausiai veikia ne kokie reklaminiai skydeliai, el. šlamštas pašto dėžutėj, ar įkyrus nesusijusios informacijos rašymas į forumus, bet registravimas paieškos sistemose, savanoriškai užsisakyti naujienlaiškiai, reklama paieškos sistemose susieta su tam tikrais raktiniais žodžiais, bei informacija bloguose. Kitaip tariant, reikia sudaryti salygas tikslinei auditorijai pačiai rasti informaciją, o ne brukti ją per prievartą. Beje tik trečdalis internautų pakibtų ant virusinių filmukų, kurie laikomi progresyvia reklamos forma.

Portaluose narių skaičius dažniausiai tiesiogiai proporcingas narių aktyvumui. Galima suprasti. Kuo daugiau narių – tuo daugiau turinio. Tuo daugiau yra, ką skaityti, ir tuo daugiau yra, dėl ko pildyti informaciją. Diskusijos, pokalbiai, bendraminčiai, saviraiška… Taip ir veikia bendruomenės.

Pagrindinis varikliukas išlaikyt lankytojų aktyvumui yra ne kokie prizai-siurprizai ar reputacijos taškai už veiksmus, o nemokama narystė. Interneto bendruomenių nariams labai svarbu nusistatyt savo profilį, nurodyt, ką kiti galės matyt, o ko ne; nurodyt savo dabartinę būseną, įkelt nuotraukų, ir – ko nesitikėjo internetinės kompanijos – blokuoti įkyrius ar nepatinkančius narius, kad šie neprieitų prie asmeninės informacijos. Internautams taip pat svarbi galimybė rašyt asmenines žinutes, matyti draugų sąrašą bei ryšius tarp kontaktų, formuoti grupes, bendrauti forumuose bei pokalbių kambariuose, gauti informacinius/priminimo laiškus, rašyti bei gauti atsiliepimus svečių knygoje. Socialinių tinklų nariams ypač svarbu paieška ir gimtadienių priminimai. Tačiau mažai kam rūpi visokios apdovanojimų sistemos, statistikos, blogai, naujienų prenumeratos ar valdikliai (widget). Statistinis socialinių tinklų naudotojas nėra toks robotžmogis, kaip aš :D

Dauguma internautų priklauso dviems-trims internetinėms bendruomenėms. Daugiau kaip du trečdaliai per internetą bendrauja daugiausiai su tais, kurie yra draugai ar pažįstami ir realiam gyvenime. Ypač daug džiaugsmo ir motyvacijos socialiniuose tinkluose suteikia senų kontaktų suradimas. Taip ir yra. Labai smagu kur nors LinkedIn, Klase.lt ar Frype susitikt žmogų, kurio nematei metų metus. Taip pat trečdalį džiugina didelės bendruomenės. Trečdaliui čia svarbu susirasti naujų draugų. Aš gi su tais internautais, kuriuos pažįstu tik per internetą, stengiuosi progai pasitaikius susitikt. Bendravimas yra svarbu. O va garbės ir reputacijos taškai ar kokios moderatoriaus teisės daugumai yra vienodai.

Įdomu būtų perskaityti panašių tyrimų rezultatų apie besimezgančių ar jau gerokai išsikerojusių Lietuvos internetinių bendruomenių norus ir tikslus, bet manau, kad rezultatai būtų panašūs.

Patarimai apie Javascript valdiklių pasiekiamumą

Monday, January 14th, 2008

Praturtintas GUI yra vienas iš šiuolaikiško žiniatinklio reikalavimų. Svetainių išvaizda ir valdymas artėja prie diegiamų taikomųjų programų išvaizdos ir valdymo. Valdikliai (angl. widgets) tampa vis intuityvesni. Bet interneto kūrėjai bei internetinių projektų užsakovai niekuomet neturėtų pamiršti pasiekiamumo ir semantikos. Žiniatinklis pirmiausia yra informacija, o tik tada įspūdis.

Kliento pusės technologijų sluoksniai: Javascript ir CSS virš XHTML.

Technologijos turėtų pasitarnauti realiam Pasauliui, o ne atvirkščiai. Todėl tau, kaip turinio savininkui, turėtų būti įdomu platinti informaciją visais įmanomais būdais. Turinys turi būti pasiekiamas tiek standartinėse moderniose naršyklėse, tiek naršyklėse su atjungtu Javaskriptu, skaitytuvuose balsu ar mažaekraniuose prietaisuose, kaip kad PDA ar mobiliuosiuose telefonuose. Atvaizdavimas (CSS) ir specialieji efektai (Javascript) turėtų papildyti bazinį turinį (XHTML). Šios dalys turėtų būti atskirtos skirtinguose failuose ir nemaišomos. Geros praktikos taisyklė sako, kad atjungus stilių, paveikslėlius, Javaskriptą ar viską kartu, lankytojui turėtų būti įmanoma vis vien skaityti turinį ir naršyti svetainėje. Įsivaizduok situaciją, kad atvažiuoji į koncertą svetimam mieste ir tau reikia susižinoti, kokie autobusai važiuoja koncertų salės link. Kągi. Per mobilų atsidarai vietinę viešojo transporto svetainę ir susižinai kelionės maršrutą. Tačiau, jei svetainė tavo mobiliaku nepasiekiama vien dėl privalomų specifinių Javaskriptinių valdiklių, tuomet tu greičiausiai pavėluosi į koncertą ir visa tavo diena bus sugadinta.

Semantinio žiniatinklio koncepcija apibrėžia taisykles informaciniams duomenims, kurios leidžia atvaizduoti, filtruoti ir redaguoti duomenis naudojant skirtingas technologijas. Vietoj nepatikimo teksto karpymo kad gautum specifinę puslapio informaciją, turėtų būti įmanoma išanalizuoti turinį, naudojant DOM, ir gauti viso puslapio struktūrą. Tai naudinga ne tik paieškos varikliams, ber ir trečių šalių žiniatinklio ir diegiamoms taikomosioms programoms, kurios išnaudotų tavo turinį skirtinguose taikomųjų programų hibriduose (angl. mashup). Pavyzdžiui, jei turi paprastą informacinę svetainę apie savo restoraną su jo adresu ir tikriausiai gražiu dinaminiu žemėlapiuku, tuomet kita kompanija gali turėti paieškos serverį, kuris renka informaciją apie įvairius restoranus, viešbučius ir parkus bei parodo juos visus viename žemėlapyje su kiekvienos vietos reitingais, komentarais ir rekomendacijomis. Jei tavo svetainės turinys nėra semantinis, tu vargiai gausi papildomo dėmesio iš trečių šalių projektų.

Koks bebūtų svetainės verslo modelis, jei kompanija yra orientuota į ateitį, struktūrinis svetainės turinys privalo būti atskirtas nuo atvaizdavimo ir logikos. Be to, turinys turi būti pasiekiamas ir naršytinas be Javaskripto ir CSS. Visi praturtinantys GUI efektai turėtų būti pridedami papildomai Javaskriptu, kai jis aktyvuotas. Pamiršk visas pamokėles ir pavyzdžius, kuriančius dinaminį turinį su document.write ar pridedančius įvykių apdorojimą HTML elementams tiesiai žymėse. Javaskriptas privalo būti pakrautas iš atskirų failų ir jis turėtų įtakot turinį, naudojant DOM, pasikrovus puslapiui. Ši koncepcija vadinama neįkyriuoju Javascript. Skirtingų sluoksnių atskyrimas taip pat reiškia greitesnį krovimąsi, kadangi Javascript ir CSS failai dažniausiai būna parsiunčiami vienąkart, o paskui tik pakraunami iš naršyklės sparčiosios atmintinės.

NEA:


XHTML:
<a href="http://aaiddennium.com/blog/"
onclick="window.open(this.href,'','width=800,height=600');return false">
Mano blogas
<script type="text/javascript">
/* <![CDATA[ */
document.write("(atsidaro naujam lange)");
/* ]]> */
</script>
</a>

VA TAIP:


XHTML:
<a href="http://aaiddennium.com/blog/" class="new_window">
Mano blogas
</a>

Javascript (įtrauktas iš atskiro failo):
window.onload = function() {
    var aElems = document.getElementsByTagName("a");
    for (i=0, iLen=aElems.length; i<iLen; i++) {
        var oEl = aElems[i];
        if (oEl.className.match(/\bnew_window\b/)) {
            var oT = document.createTextNode("(atsidaro naujam lange)");
            oEl.appendChild(oT);
            oEl.onclick = function(e) {
                if (!e) var e = window.event;
                var oLink = e.target || e.srcElement;
                window.open(oLink.href, "", "width=800,height=600");
                e.cancelBubble = true;
                e.returnValue = false;
                if (e.stopPropagation) e.stopPropagation();
                if (e.preventDefault) e.preventDefault();
            };
        }
    }
}

Žvelgiant toliau, galima sukurti pilnai funkcionuojančią svetainę be specialiųjų efektų, o paskui pridėti Javascript, kuris pakeistų visas standartines nuorodas į Ajax’inius turinio kroviklius. Šią koncepciją Jeremy Keithin savo knygoje Bulletproof Ajax pavadino Hijax. Kaip bebūtų, Hijax būdas turi ir savo trūkumų. Pavyzdžiui, kraunant duomenis per Ajax, standartinis naršyklės Atgal/Pirmyn funkcionalumas nebetenka prasmės. O be to gana brangu dublikuot visus funkcionalumus, kuriant vieną serverio pusei ir kitą kliento pusei.

Aš sakyčiau, kad daugumoj atvejų svetainėje turėtų būti naudojama įprasta navigacija, O Javascript turėtų būti pridėtas tik specifiniams valdikliams ar specifiniams puslapiams. Javascript gali perrašyt standartines funkcijas. Pavyzdžiui, išorinės nuorodos gali būti atidarinėjamos Javaskriptu iššokančiuose languose, arba kai kurie maži formuliarai gali būti atidaromi naujuose Ajax’iniuose dialogo languose. Originali nuoroda, paversta Ajax’inio funkcionalumo jungikliu, kai kuriais atvejais gali būti nukreipta į naują puslapį, aiškinantį, kaip aktyvuoti Javascript ar kur gauti modernią naršyklę. Arba tai gali būti lokali nuoroda į to paties puslapio vietą (#) su tam tikra informacija.

Kiekvienas puslapis turėtų pateikti informaciją, kad svetaine patogiausia naudotis ją lankant moderniom naršyklėm su aktyvuotu Javascript. Ši žinutė gali būti paslėpta dinamiškai Javaskriptu, pasikrovus puslapiui, arba dar geriau – ji galėtų būti įrašyta į <noscript> bloką kuris rodomas, kai Javaskriptas neveikia. Jei pasirinkai paslėpti žinutę Javaskriptu vos tik puslapiui pasikrovus, tau gali nepatikti vaizdo mirgtelėjimas: žinutė pasirodys ir po to dings. Kad išvengtum to mirgtelėjimo, display:none stilių priskirk ne elementui, kuriame yra žinutė, pagal id po puslapio pasikrovimo, o papildomai dinamiškai pridėtai CSS taisyklei su to id selektoriumi dar puslapiui kraunantis. HTML dokumento HEAD dalis įvykdoma visuomet prieš parodant BODY.

NEA:

window.onload = function() {
    document.getElementById("warning_js").style.display = "none";
}

VA TAIP:

function dyn_css_rule(sSelector, sCssText) {
    var oCss = document.styleSheets[0];
    if (oCss.insertRule) {
        oCss.insertRule(
            sSelector + " {" + sCssText + "}",
            oCss.cssRules.length
        );
    } else if (oCss.addRule) {
        oCss.addRule(sSelector, sCssText);
    }
    return sSelector + "{" + sCssText + "}";
};
dyn_css_rule("#warning_js", "display:none");

Be viso to, niekada nereikėtų dinamiškai modifikuot HTML elementų stiliaus tiesiogiai. CSS yra atvaizdavimo sluoksnio atsakomybė, o ne logikos sluoksnio. Javascript turėtų manipuliuot semantiškais klasių vardais. Tuomet atvaizdavimo sluoksnis nuspręs, ką daryt tarkim su nesvarbiais elementais: tiesiog paslėpti, pridėt jiems permatomumą, sumažinti šriftus, ar perkelti į kitą poziciją.

NEA:

function toggle_visibility(sId, bVisible) {
    document.getElementById(sId).style.display = bVisible? "block": "none";
}

VA TAIP:

function toggle_visibility(sId, bVisible) {
    var oEl = document.getElementById(sId);
    var sClasses = oEl.className.replace(/\s*hidden\s*/g, " ");
    if (bVisible) {
        sClasses = sClasses + " hidden";
    }
    oEl.className = sClasses;
}

Net jei tu profesionalus Javaskripto koderis, vietoj gryno Javascript naudinga naudoti Javascript karkasines sistemas. Tavo rašomas kodas bus švaresnis, kadangi patys nuobodžiausi baziniai darbai jau įgyvendinti karkasinėje sistemoje. Kai tik įprasi prie sistemos, projektų vystymas pagreitės. O produktas bus patikimesnis, kadangi karkasinės sistemos kodą jau pratestavo skirtingose naršyklėse didelės bendruomenės. Tavo pasirinkta karkasinė sistema turėtų palaikyti neįkyriojo Javascript metodą ir griežtąjį XHTML. Aš asmeniškai mėgstu jQuery, bet tu gali pasirinkti bet kurią kitą karkasinę sistemą, kuri tau atrodo lengvai išmokstama.

NEA:

var aElems = document.getElementsByTagName("div");
for (i=0, iLen=aElems.length; i<iLen; i++) {
    var oEl = aElems[i];
    if (oEl.className.match(/\bspecial\b/)) {
        oEl.onclick = special_function;
    }
}

VA TAIP:

$("div.special").click(special_function);

Dirbdamas su Ajax turėtum suprasti, kad interneto greitis nėra vienodas visiems lankytojams. Taigi net jei kokių JSONu formatuotų duomenų pakrovimas tau tetrunka sekundę, kitam naudotojui su lėėėėėtu internetu ta pati užklausa gali trukti net 15 sekundžių. Todėl svetainė turėtų rodyti skirtingus identifikatorius skirtingoms būsenoms: „pradinė būsena“, „kraunama“, „rezultatas“ ir „klaida“. Priešingu atveju lankytojas gali kelis kartus spaudinėt tą patį valdiklį, stengdamasis jį paveikti. O tai gali sąlygoti atsitiktinius duomenų dublikatus bei pasimetimą. Kartais taip pat gali būti naudinga rodyti mygtuką dabartinės užklausos atšaukimui.

Gali atrodyti keista, kad neparodžiau kaip pasidaryti nei vieno pilnaverčio valdiklio, kaip kad reitingai, automatinis atsakymų parinkimas ar koks kalendorius. Bet šito rašinio tikslas buvo supažindinimas su kokybiškesniu kliento pusės programavimu. Visa kita priklauso nuo tavo kūrybingumo ir verslo reikalavimų. Patirtis ateina besipraktikuojant.

Papildomi skaitinukai:

Paprasta JavaScript’o konsolė

Tuesday, October 2nd, 2007

Ko pasigendu debugindamas JavaScript skirtingose naršyklėse – tai paprasta į FireBug panaši JavaScript’o konsolė, kur galėtum vykdyti komandas tiesiogiai bet kuriam atverstam puslapiui ir iškart gauti rezultatus.

JavaScript'o konsolė

Pavyzdžiui:
>>> document.body.innerHTML
"<div class=\"navi\">..."
parodys sugeneruotą atverto puslapio HTML kuris gali skirtis nuo puslapio išeities tekstų, nes koks JavaScript’as jau gali būti juos modifikavęs.
O
>>> document.cookie="testinis_kukis=testine_reiksme"
nustatys dokumentui testinį sausainėlį.

Kaip ypač paprastą alternatyvą JavaScript’o konsolei, parašiau Bukmarkletą/Feivletą, kuris vykdo įvestą JavaScript’o komandą ir parodo rezultatą: Paprasta JavaScript’o konsolė. Diegimas paprastas – tiesiog pridėk nuorodą prie savo Bookmarks/Favorites.

Jei turi šiek tiek laiko, nori pasipraktikuoti JavaScript’ą ir padaryti Pasaulį geresne vieta gyventi, turiu užduotį būtent tau! Sukurk atvirojo kodo visose moderniose naršyklėse veikiančią JavaScript’o konsolę, kuri galėtų būti įterpta į bet kurį puslapį feivleto/bukmarkleto pagalba. Arba sukurk feivletą/bukmarkletą, kuris pakrauna ir įterpia egzistuojančią Ext Debug Console į bet kurį žiniatinklio puslapį.
Pagalbai, kaip pakrauti JavaScript failą iš bukmarkleto/feivleto, pasinaudok pasiekiamais spausdiniais, kuriuos sukūriau anksčiau. Konsolė turėtų visus rezultatus parodyti skaitomo formato. Visi objektai turėtų pasakyti, kokius jie turi atributus, visos kolekcijos ir masyvai turėtų išdėstyti savo turinį [narys1,narys2,narys3] formate.

Tavo kodas bus peržiūrėtas ir įvertintas. Pasiūlysiu patobulinimų. Tada paimsiu interviu ir išdidžiai pabloginsiu. :D

ATNAUJINTA! Čia mano paties anksčiau tau iškeltos užduoties sprendimas: Pakrauk Firebug Lite. Veikia moderniose naršyklėse, kuriose nėra įdiegtas Firebug.

Su didele valdžia ateina didelė atsakomybė

Tuesday, June 19th, 2007

Kai projektas pristatytas spaudai, Berlyno kultūrinis elitas valgo „subtilaus“ skonio :shock: sumuštinukus ir atsakinėja į paskutinius asmeniškai užklaustus žurnaliūgų klausimus, man mintyse kirba viena mintis: visa valdžia mano rankose – tik aš vienas žinau, ką pakrapštyti ir kur paspausti, kad tris mėnesius gaminta web2jinė svetainė pagal planą lygiai vidurdienį išvystų dienos šviesą.

CreativeCityBerlin
Berlyno menininkams. Kol kas tik vokiškai.

Sudėta daug žinių ir pastangų, įgyvendinant, bet žinoma, gali būt likę bagų. Apie visą kūrybinį procesą ir geras praktikas dar žadu parašyt vėliau. Darėm keliese ir buvo juokinga, kai paskutinėm parom dėl visokių netikslumų ir smulkių klaidelių kaltinom kits kitą, tik ne save. Dabar, kai svetainė jau publikuota, lankytojų skaičius maloniai auga. Dabar jau už viską galit kaltint mane :cool: Kritiką priimsiu su džiaugsmu. Tai ką – laukit tęsinio…

Web2.0

Tuesday, October 10th, 2006

CSS galvosūkis: turit pasiūlymų?

Friday, September 22nd, 2006

Try on top
Jau kurį laiką nerašiau į blogą, nes nusprendžiau, kad „mažiau kalbų, daugiau darbų“, ir panirau į internetinio Halmos žaidimo programavimą. Žinau žinau, jis per ilgai kuriamas. Man reikėtų daugiau ryžto ir valios prisėst prie jo laisvu metu, kas nėra paprasta, kai užsikabliuoji LOST’uose ir dar pradedi sportuoti (kad nesutrūnyčiau). Bet stengiuos. Ir štai priėjau liepto galą.

Animaciniai veikėjai moka iš mažo lagaminėlio išsitraukti didelį kūjį ar kitą daiktą. O aš moku tokį HTML ir CSS fokusą: mažame lentelės langelyje patalpinu didelį kvadratą. Mano problema ta, kad IE mano fokusą interpretuoja ne taip, kaip Firefox bei Opera. Man reikia, kad didelis kvadratas būtų pakilęs virš lentelės, kurioje jis yra, o IE jis uždengiamas iškart po jo einančių langelių kraštais.

HTML pavyzdys

Gal kas nors žino, kaip IE pasiekti tokį pat rezultatą kaip su Firefox ir Opera?

XHTML skamba gerai

Monday, June 12th, 2006

Visai neseniai rašiau apie Javascript tinkamumą internetiniams žaidimams. Vienas bičelis dig‘e paprieštaravo, argumentuodamas, kad Javascript’ui trūksta galimybės skleisti žaidimo garsus. Nenuleidau rankų ir pradėjau ieškoti esamų sprendimų. Radau nemažai pakvaišusių ir senovinių metodų, kaip naudoti garsus javaskriptiniame žaidime, tačiau žinojau, jog turi būti ir TEISINGAS BŪDAS — būdas, paklusnus standartams!

Jie siūlė man naudoti <bgsound> žymes, <embed> žymes, Java apletus, Flash’ą ir net <img> žymes, kad priversčiau kliento kompą grot ir dainuot. Bet šios technologijos — arba pernelyg sunkiasvorės, arba nesitaikstančios su žiniatinklio standartais.

Giliai smegenų ląstelėse žinojau, kad TEISINGAS sprendimas įtraukti mediją į tinklalapį yra <object> žymė. Ir tada visai netikėtai australų kūrėjas Karl Rudd tai nušvietė Drupal naujienų grupių gijoje.

Perrašiau jo pasiūlytą kodą iš Flash animacijos valdymo į garso valdymą. Pateiktas žymėjimas atitinka griežtą XHTML ir puikiai veikia populiariausiose standartus palaikančiose naršyklėse: IE, Firefox ir Opera).


<!--[if !IE]><-->
<object type="audio/x-wav" width="0" height="0" data="testas.wav" id="garsas">
<!--><![endif]-->
<!--[if IE]>
<object type="audio/x-wav" width="0" height="0" classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" id="garsas" class="iegarsas">
<![endif]-->
    <param name="src" value="testas.wav"></param>
    <param name="ShowAudioControls" value="false"></param>
    <param name="ShowControls" value="false"></param>
    <param name="AutoStart" value="true"></param>
    <param name="loop" value="false"></param>
    <p>Garso nėra.</p>
</object>

Reikia paaiškinimo? Še! Žymė <object> pasirodė žiniatinklio standartuose vėliau nei IE naršyklėje. IE objekto žymė laukia parametro classid (programos klasės id). Šis apibrėžia kokretų ActiveX valdiklį (pvz., Windows Media Player), kuris ir doros mediją. Pagal standartą naudojama objekto žymė tikisi parametro type (MIME tipas), kuris nurodo naršyklei naudotis įskiepiu, kuris kliento kompiuteryje susietas su tuo medijos tipu. Šį skirtumą apeiname, pasinaudami sąlyginiais komentarais. Sąlyginiai komentarai vykdo pasirinkimo logiką IE naršyklėje, tuo pat metu komentaruose (<!-- -->) paslėpdami neteisingą žymėjimą nuo kitų naršyklių ir tikrintuvų.

Naudodamas pateiktą kodą, gali į tinklalapį įterpti nesikartojantį foninį garsą. Tačiau tai dar neleidžia groti ir stabdyti garsus, esant tam tikriems įvykiams, kaip kad pelės užvedimas virš mygtuko. Metas žvilgtelt į Javascript.

Gražiausias būdas bendrauti su egzistuojančiu objektu būtų toks:


var oGarsas = document.getElementById("garsas");
oGarsas.Play();
/* Alternatyvos:
oGarsas.object.Play();
oGarsas.play();
oGarsas.object.play();
*/

Deja, tai veikia tik su tam tikrais konkrečiais per skriptą pasiekiamais įskiepiais arba ActiveX valdikliais (pvz., Windows Media Player IE naršyklėje). Kad turėtume tarpnaršyklinį ir tarpplatforminį sprendimą, naudosime „automaginį“ objekto žymės įterpimą ir ištrynimą, kur tik metodai play() ir stop() nėra palaikomi.


function stabdytiGarsa() {
    var oGarsas = document.getElementById('garsas');
    if (oGarsas && oGarsas.object) {
        oGarsas.stop();
    } else {
        oGarsas.parentNode.removeChild(oGarsas);
    }
}

function grotiGarsa() {
    var oGarsas = document.getElementById('garsas');
    if(oGarsas && oGarsas.object) {
        oGarsas.play();
    } else {
        if (oGarsas) {
            oGarsas.parentNode.removeChild(oGarsas);
        }
        var GARSO_FAILAS = 'testas.wav';
        oGarsas = document.createElement('object');
        oGarsas.setAttribute('id', 'sound');
        oGarsas.setAttribute('width', '0');
        oGarsas.setAttribute('height', '0');
        oGarsas.setAttribute('data', GARSO_FAILAS);
        oGarsas.setAttribute('type', 'audio/x-wav');
        var oParametras = document.createElement('param');
        oParametras.setAttribute('name', 'src');
        oParametras.setAttribute('value', GARSO_FAILAS);
        oGarsas.appendChild(oParametras);

        oParametras = document.createElement('param');
        oParametras.setAttribute('name', 'ShowAudioControls');
        oParametras.setAttribute('value', 'false');
        oGarsas.appendChild(oParametras);

        oParametras = document.createElement('param');
        oParametras.setAttribute('name', 'ShowControls');
        oParametras.setAttribute('value', 'false');
        oGarsas.appendChild(oParametras);

        oParametras = document.createElement('param');
        oParametras.setAttribute('name', 'AutoStart');
        oParametras.setAttribute('value', 'true');
        oGarsas.appendChild(oParametras);

        oParametras = document.createElement('param');
        oParametras.setAttribute('name', 'loop');
        oParametras.setAttribute('value', 'true');
        oGarsas.appendChild(oParametras);
        document.body.appendChild(oGarsas);
    }
}


< ![endif]-->

Garso nėra.

Pabandyk, kaip veikia skriptas, užvesdamas pelę virš šio teksto.

Taigi garsai visai kontroliuojami XHTML’e. Manau, vieną dieną reikės pažaisti su tuo daugiau.

CSS ir praturtinto teksto redaktoriai

Sunday, April 2nd, 2006

Dažniausiai svetainėse, valdomose turinio valdymo sistemomis, turinys dedamas ne iškart dokumento <body> bloke, o giliau atskirame <div> bloke (ar — vaje, kokia gėda — lentelėje <table>). Ir neretai to vidinio bloko stilius skiriasi nuo paties dokumento stiliaus. Jei turinio valdymo sistemoje integruotas praturtinto teksto redaktorius, gebantis naudoti svetainės stilių, susiduriame su problema — redaguojamas turinys neatitinka tos išvaizdos, kuri bus svetainėje. Šios problemos sprendimas šitame straipsnyje.

Skirtingose naršyklėse veikiantys praturinto teksto redaktoriai, kaip kad TinyMCE, naudoja įterptinius rėmelius <iframe> savo pagrindui. Įterptiniui rėmeliui aktyvuojama redaguojamumo savybė, o rėmelio šaltiniu tampa naujas dokumentas su redaguojamo lauko turiniu dokumento <body> bloke. Pakraunamas svetainės pakopinių stilių failas ir redaguojamas turinys įgyja <body> žymei nurodytą stilių.

Tarkime, turime svetainę, kurioje tamsiame margame fone centruotas vienspalvis šviesus turinio blokas su tamsiom raidėm. Kai turinį redaguosim, įterptiniame rėmėlyje matysime ne tamsias raides šviesiame fone, o tamsias raides tamsiame margame fone. Taip atsitiks todėl, kad dokumento <body> stilius skiriasi nuo turinio bloko stiliaus, o praturtinto teksto redaktorius turinį deda ne į turinio bloką kaip svetainėje, o tiesiai į <body>.

Vienas iš sprendimų būtų pasiredaguoti praturtinto teksto redaktorių, kad tas apgauptų turinį atitinkamu turinio bloku, tačiau šis sprendimas gali pasirodyti komplikuotas. Reiktų įsigilinti į redaktoriaus ir turinio valdymo sistemos architektūrą, ir rašyti hakus, kurie ypač pasunkintų praturtinto teksto redaktoriaus atnaujinimą ateityje.

Mano siūlomas sprendimas būtų atitinkamai paredaguoti pakopinių stilių failą ir vienu prisilietimu pakeisti svetainės šabloną. Štai žingsniai, kuriuos reiktų atlikti:

  1. Visą <body> žymei skirtą stilių priskirti tarkim CSS klasei „websiteBody“. Pavyzdžiui, tokį:
    
    body {
        color: black; /* tamsus tekstas */
        background: brown url("tamsus_margas.jpg"); /* tamsus margas fonas*/
    }
    

    perrašom taip:

    
    body {}
    .websiteBody {
        color: black; /* tamsus tekstas */
        background: brown url("tamsus_margas.jpg"); /* tamsus margas fonas*/
    }
    
  2. Visas <body> priklausomybes perrašyti CSS klasei „websiteBody“. Pavyzdžiui, tokį:
    
    body blockquote { /* visoms citatoms, kurios yra body dalyje */
        margin: 0px;
        margin-left: 30px;
    }
    

    perrašom taip:

    
    .websiteBody blockquote { /* visoms citatoms, kurios yra body dalyje */
        margin: 0px;
        margin-left: 30px;
    }
    
  3. Turinio bloko stilių nukopijuot į <body> aprašus, kurie būtų prieš „websiteBody“ klasės aprašus. Pavyzdžiui, taip:
    
    body {
        color: black; /* tamsus tekstas */
        background: yellow; /* šviesus vienspalvis fonas*/
    }
    .websiteBody {
        color: black; /* tamsus tekstas */
        background: brown url("tamsus_margas.jpg"); /* tamsus margas fonas*/
    }
    
  4. Galiausiai <body> žymei svetainės šablone priskirti CSS klasę „websiteBody“:
    <body class="websiteBody">

Kadangi turinio valdymo sistemose naudojami praturinto teksto redaktoriai <body> žymę dokumente sukurs be CSS klasės, tai visam redaguojamam turiniui bus nurodytas toks stilius, kaip ir svetainėje turinio bloke. Tuo tarpu, svetainėje <body> stiliaus taisyklės bus perrašytos „websiteBody“ klasėje nurodytomis taisyklėmis, nes priskiriant taisykles, klasės turi didesnio prioriteto svarbą.

Šita gudrybė sėkmingai panaudota ne vienam mano projekte ir aš savo patirtį be gailesčio perduodu Tau!