|
ot Andrei Hristov(31-03-2002)
reiting (28)
[ dobre ]
[ zle ]
Variant za otpechatvane
XML e ezik za opisanie, koito e podmnozhestvo na SGML. XML
mnogo prilicha po
vunshnost na HTML i tova e sledstvie ot tova, che i
HTML proizliza ot
SGML. V nachaloto HTML e bil ezik nai-obshto za vizulizirane
na informatsiia,
kato se ima v predvid, che dokumentut e imal struktura ot,
koiato mozhe da se
izvleche informatsiia. Pod natisk ot strana na razlichni golemi
firmi se dobaviat
novi i novi tagove i HTML se “izrazhda” v ezik za
vizualizatsiia. Ot edin suvremenen
HTML dokument na praktika ne mozhe da bude izvlechena nikakva
polezna informatsiia,
zashtoto informatsiiata ne e predstavena kato takava, a se tseli
neinoto prezentirane.
Tui kato ne e vuzmozhno HTML otnovo da se vkara v niakakvi
normalni ramki W3C(WWW
Consorcium) sustavia spetsifikatsiiata na nov ezik za opisanie
na danni. Ezikut
e triabvalo da bude takuv, che prilozheniia na vsiakakvi
platformi e triabvalo
da mogat burzo i lesno da izpolzvat tozi format.
XML kato tehnologiia ima nai-razlichni prilozheniia, kato
komunikatsiia v heterogenni
sistemi, suhranenie na danni i dr. Kogato se govori za XML
vsushtnost toi e
obediniavashtoto nazvanie na grupa ot tehnologii, koito
izpolzvat XML formata,
v razlichni nasoki. Primeri sa XSLT (eXtensible Stylesheet
Language Transofrmations),
XPath, XLink, XQuery i dr.
Primeren XML kod :
<?xml version="1.0"?>
<review>
<genre>Action</genre>
<title>X-Men</title>
<cast>
<person>Hugh
Jackman</person>
<person>Patrick
Stewart</person>
<person>Ian
McKellen</person>
<person>Famke
Janssen</person>
</cast>
<director>Bryan
Singer</director>
<duration>104</duration>
<year>2000</year>
<body>Every once in a
while,
Hollywood takes a comic-book hero, shoots him on celluloid,
slaps in a few
whiz-bang special effects and stands back to see the
reaction. Sometimes
the results are memorable
(<title>Superman</title>,
<title>Spiderman</title>,
<title>Flash Gordon</title>) and sometimes
disastrous (<title>Spawn</title>,
<title>The Avengers</title>). Luckily,
<title>X-Men</title>
falls into the former category - it's a clever,
well-directed film that should
please both comic-book aficionados and their less well-read
cousins.</body>
<rating>4</rating>
</review>
Edin XML dokument mozhe da e : dobre formatiran i pravilen.
Dobre formatiran
dokument e tozi, koito otgovaria na XML spetsifikatsiiata, za
tova kak se opisva.
Dopulnitelno za dokumenta mogat da se zadadat pravila,
izpolzvaiki koito
da se proveri dali toi e pravilen. Pravilata opisvat
podobie na kontekstno
svobodna gramatika za strukturata i dannite v tialoto na
dokumenta. Tezi pravila
se obediniavat pod nazvanieto document type definition (DTD)
ili XML Schema.
DTD e mnogo moshtno sredstvo kogato stava vupros za goliam
obem ot dokumenti
za dadena sistema. V tozi sluchai se izpolzva chesto.
Po-riadko se izpolzva,
kogato imame malko kolichestvo dokumenti ili proverkata e
iznesena v application
sloi otgore.
Vseki edin XML dokument triabva da zapochva sus slednata
deklaratsiia :
<?xml version="1.0"?>
Tazi deklaratsiia, mozhe da sudurzha informatsiia za document
encoding (primerno
UTF-8 ili UTF-16). Sled tazi deklaratsiia e vuzmozhno da ima i
drugi deklaratsii.
TSeliiat tozi blok napodobiava <head> taga ot HTML. DTD
deklaratsiia izglezhda
taka :
<!DOCTYPE rootElement DTDLocation
[
entityDeclarations
]
>
Primer :
<BLOCKQUOTE>1. <!DOCTYPE review SYSTEM "http://www.somedomain.com/review.dtd">
2. <!DOCTYPE review SYSTEM “http://www.somedomain.com/review.dtd”
[
<!ENTITY html "Hypertext Markup
Language">
<!ENTITY xml "Extensible Markup
Language">
]
></BLOCKQUOTE>
V purviiat primer ukazvame, che DTD na taga review (root) se
namira na adres
: http://www.somedomain.com/review.dtd
(chrez SYSTEM atributa). !ENTITY e
analog na #define html “Hypertext Markup Language” v ezika
C.
Sled poslednata deklaratsiia v prologa na dokumenta se namira
otvariasht tag.
Tozi tag e root tag-a(nivo 0). Na nivo 0 mozhe da ima samo
edin element. Strukturata
napodobiava *nix failovata sistema.
Element ima slednata struktura :
<element_name
[attr1=”1”,,,]>data</element_name>
data e niz, koito mozhe da susdurzha drugi elementi i/ili
tekst, i posledvashto
te(elementite) da sudurzhat drugi i t.n. Ako [data] e prazen
niz togava ima
sukraten sintaksis
<element_name [attr1=”1”,,,]/ >
Atributite sa ravnoznachni na tagove, primer :
<person>
<fname>John</fname>
<lname>Smith</lname>
</person>
e ravnoznachno na
<person fname=”John” lname=”Smith”/ >
Za programniiat interfeis te sa ednoznachni. Stoinostite na
atributite triabva
da sa zagradeni v kavichki(edinichni ili dvoini). Imenata sa
case-sensitive
: fname e razlichno ot Fname. Dvata stila mogat da se
smesvat i ot programista
zavisi, kakva shte e strukturat i kude e udachno da se
izpolzvat atributi i
kude vlozheni tagove.
Eto edin po-goliam primer :
<?xml version="1.0"?>
<recipe>
<name>Chicken Tikka</name>
<author>Anonymous</author>
<date>1 June 1999</date>
<ingredients>
<item>
<desc>Boneless
chicken breasts</desc>
<quantity>2</quantity>
</item>
<item>
<desc>Chopped
onions</desc>
<quantity>2</quantity>
</item>
<item>
<desc>Ginger</desc>
<quantity>1
tsp</quantity>
</item>
<item>
<desc>Garlic</desc>
<quantity>1
tsp</quantity>
</item>
<item>
<desc>Red
chili powder</desc>
<quantity>1
tsp</quantity>
</item>
<item>
<desc>Coriander
seeds</desc>
<quantity>1
tsp</quantity>
</item>
<item>
<desc>Lime
juice</desc>
<quantity>2
tbsp</quantity>
</item>
<item>
<desc>Butter</desc>
<quantity>1
tbsp</quantity>
</item>
</ingredients>
<servings>3</servings>
<process>
<step>Cut chicken into
cubes,
wash and apply lime juice and salt</step>
<step>Add ginger, garlic,
chili,
coriander and lime juice in a separate
bowl</step>
<step>Mix well, and add
chicken
to marinate for 3-4 hours</step>
<step>Place chicken
pieces on
skewers and barbeque</step>
<step>Remove, apply
butter, and
barbeque again until meat is tender</step>
<step>Garnish with lemon
and
chopped onions</step>
</process>
</recipe>
Poradi fakta,che vseki tag ima ime, koeto opisva dannite,
koito sudurzha v
sebe si, tova dava vuzmozhnost edin neorganiziran dokument
da bude bude prevurnat
v strukturiran ot atomarni chasti. V primera po-gore
<author>
ukazva, che dannite koito se sudurzhat v nego opisvat avtora
na retseptata,
dokato <desc> i <quantity> se izpolzvat za
sustavkite i respektivno
za tehnite kolichestva.
Teksta, koito se namira mezhdu otvariashtiia i zatvariashtiia tag se
naricha “character
data”. Vupreki, che CDATA mozhe da sudurzha bukvi i tsifri, na
niakoi simvoli
ot azbukata na XML triabva budat predstaveni po drug nachin.
Primerno znakut
ampersand (&) se zapisva s &, koeto kakto mozhe da se
zabelezhi
e !ENTITY. Ima nachin da se izbegne tova povedenie i da se
nakara XML parsera
da ne obrabotva teksta. Izpolzvat se t.nar. CDATA
blokove.
Za CDATA blokovete eksplitsitno se ukazvat, kato nesudurzhashti
markup. Tezi
sektsii, mogat da sudurzhat vsichko : nizove, chisla, simvoli,
dori ieroglifi,
vsichki te shte budat prenebregnati pri obrabotkata. CDATA
bloka zapochva taka
:
<![CDATA[
i zavurshva taka :
]]>
Dannite, na sektsiiata se namirat mezhdu tezi dve
posledovatelnosti ot simvoli.
Primer :
<?xml version="1.0"?>
<manual>
<function>split(str,
pattern)</function>
<description>Split a string
<param>str</param>
into component parts on the basis of
<param>pattern</param>
</description>
<example>
<![CDATA[
<? split("apple,
vanilla, orange",
","); ?>
]]>
</example>
</manual>
<? i ?> sa zapazeni za XML, no izpolzvaiki CDATA
sektsiia, mozhem da vgradim
dori pokazniiat po-gore PHP kod. Razbira se tozi maluk fail
mozhe da bude predaden
za izpulnenie na PHP intepretatora, tui kato <?xml e
nepoznat otvariasht
tag za nego. Ako se nalaga da v CDATA bloka da se poiaviava
nizut ]]>, toi
triabva da se zamesti s ]]>.
V dopulnenie na cdata, XML sushto pozvoliava avtorite na
dokumentite da vklyuchvat
spetsifichni instruktsii ili komandi, za obrabotvashtite
prilozheniia, v dokumentite.
Tezi instruktsii narichani oshte “processing instructions” ili
PI, ne sa chast
ot “character data”, vmesto tova, kogato XML parsera nameri
PI, go podava
na prilozhenieto grizheshto se za obrabotka na PI ot namereniia
klas(ako ima takova
asotsiirano, inache go prenebregva). Vsiaka PI sudurzha “tsel”
(“target”), koiato
ukazva, kum koe prilozhenie da se prenasochat dannite.
Kombinatsiiata ot “tsel”
i “danni” se obgrazhda s <? i ?> tagove, kakto e
pokazano na primera
:
<?xml version="1.0"?>
<directory>
<category>Online Shopping <?rating
popular?></category>
<url>http://www.amazon.com</url>
<desc>Amazon.com, the planet's foremost
e-tailer<?link_with_ad
?></desc> <url>http://www.cdnow.com</url>
<desc>CDNow.com, for all your
music</desc>
<url>http://www.bn.com</url>
<desc>Barnes & Noble's online
bookstore</desc>
</directory>
Tezi danni shte budat izpolzvani ot XML prilozhenie –
primerno, purvata PI shte
ukazva, che kategoriiata e populiarna, dokato vtorata PI shte
svurzhe opisanieto
s reklama. Kakto spomenah v nachaloto <?xml
version=”1.0”?> sushto e PI.
Ottuk pokazanoto se vizhda kak XML pozvoliava da se izpolzvat
opisatelni tagove
za “podchertavane” na tekst v dokument. Avtorite imat
pulnata svoboda da suzdavat
takiva tagove, kakvito sa im nuzhni. I dokato tova pokazva,
kolko guvkav kato
kontseptsiia e XML, okazva se che tova e nozh s dve ostrieta i
vnimatelno triabva
da se boravi. Interesen e vuprosut kakvo shte stanem ako v
razlichni dokumenti
imame tagove s ednakvi imena, no izpolzvani v razlichen
kontekst.
Za da bude po-iasno shte izpolzvam dva razlichni po struktura
XML dokumenta:
<?xml version="1.0"?>
<portfolio>
<stock>Cisco Systems</stock>
<stock>Nortel
Networks</stock>
<stock>eToys</stock>
<stock>IBM</stock>
</portfolio>
i
<?xml version="1.0"?>
<inventory>
<category>Mice</category>
<item>Mouse C106</item>
<vendor>Logitech</vendor>
<stock>100</stock>
<category>Handhelds</category>
<item>Visor Deluxe</item>
<vendor>HandSpring</vendor>
<stock>23</stock>
<category>MP3
players</category>
<item>Nomad</item>
<vendor>Creative</vendor>
<stock>2</stock>
</inventory>
Purviiat dokument opisva portfolioto(produkti na koi
proizvoditeli predlata)na
edna firma. Vtoriiat dokument sudurzha informatsiia za
nalichnostite v sklada
na firma za prodazhba na harduer. Ako se opitame da
kombinirame dvata dokumenta
shte nastupi oburkvane, zashtoto taga <stock> ima
razlichno znachenie v dvata
dokumenta. Za da se izbegne tozi problem v XML e vuvedeno
poniatieto “prostranstva
na imena”. Xorata zanimvali se s C++ mozhe da se se
sbluskvali s tozi problem
pri mnozhestveno naslediavane. Tam problema e reshim kato se
ukazhe implitsitno,
koia danna/koi metod na roditelia, se ima v predvid chrez
operator :: . V XML
se izpolzva : . Suzdavaneto na namespace e lesno.
Sintaksisa e :
<elementName xmlns:
prefix="namespaceURL">
V tozi sluchai, prefiksa e unikalen niz izpolzvan za da se
identifitsira “prostranstvoto”,
toe e link-nato za URL-a na prostranstvoto. “Prostranstvo”
obiknovenno se
deklarira, na nivoto na root elementa, no tova e
preporuchitelno, no ne zadulzhitelno.
Sled kato bude deklarirano edno “prostranstvo”, to mozhe da
bude izpolzvano,
kato pred vseki element ot nego se slaga prefiks –
unikalniiat identifikator.
Gornite dva dokumenta preobrazuvani taka, che da izpolzvat
tazi tehnika izglezhdat
taka :
<?xml version=”1.0”?>
<mytrades:portfolio
xmlns:mytrades="http://www.somedomain.com/namespaces/mytrades/">
<mytrades:stock>Cisco
Systems</mytrades:stock>
<mytrades:stock>Nortel
Networks</mytrades:stock>
<mytrades:stock>eToys</mytrades:stock>
<mytrades:stock>IBM</mytrades:stock>
</mytrades:portfolio>
i
<?xml version="1.0"?>
<toms_store:inventory xmlns:toms_store="http://www.toms_store.com/">
<toms_store:category>Mice</toms_store:category>
<toms_store:item>Mouse
C106</toms_store:item>
<toms_store:vendor>Logitech</toms_store:vendor>
<toms_store:stock>100</toms_store:stock>
<toms_store:category>Handhelds</toms_store:category>
<toms_store:item>Visor
Deluxe</toms_store:item>
<toms_store:vendor>HandSpring</toms_store:vendor>
<toms_store:stock>23</toms_store:stock>
<toms_store:category>MP3
players</toms_store:category>
<toms_store:item>Nomad</toms_store:item>
<toms_store:vendor>Creative</toms_store:vendor>
<toms_store:stock>2</toms_store:stock>
</toms_store:inventory>
URL-a na “prostranstvoto” se izpolzva za da se ukazhe
unikalnost i za nishto
drugo.
V sluchai, che edin dokument sudurzha dve ili poveche
“prostranstva”, dobavianeto
na novo i prefiksvaneto na vseki element s identifikator
pravi dokumenta
opredeleno truden za chetene.
Maluk primer :
<?xml version="1.0"?>
<me:person xmlns:me="http://www.mywebsite.com/">
My name is
<me:name>Huey</me:name>. I'm
<me:age>seven</me:age>
years old,and I live in
<me:address>Ducktown</me:address> with
<rel:relationships xmlns:rel="http://www.mywebsite.com/relationships/">my
brothers <rel:name>Dewey</rel:name> and
<rel:name>Louie</rel:name></rel:relationships>.
</me:person>
V situatsii, kato tazi XML pozvoliava da se ukazhe edno
prostranstvo, da bude
po podrazbirane. Taka pri 2 prostranstva, samo elementite
na ednoto shte budat
s prefiksi.
Sushto kakto HTML, XML pozvoliava vmukvaneto na komentari.
Komentarite se ignorirat
ot parsera i se izpolzvat za ulesniavane, prochitaneto da
dokumenta. Mogat
da se postaviat navsiakude v dokumenta, zaradi po-gore
spomenatata prichina.
Markerite, ukazvashti komentar sa ekvivalentni na tezi v
HTML. Te sa : <!--
i -->.
<B>Izpolzvane na XML zaedno s
PHP.</B>
XML dokumenti mogat da se izpolzvat v PHP skriptove, kato
se izpozva niakoi
ot dvete dostupni razshireniia na PHP : SAX(Simple API for
XML) i DOMXML. TSelta
e obshta, putishtata razlichni.
Purvo shte razgledam SAX, a sled tova i DOMXML.
SAX parsera raboti kato se dvizhi posledovatelno ot nachaloto
kum kraiat na
XML dokumenta i izvikva spetsifichni funktsii, kogato sreshtne
razlichni vidove
tagove. Primerno, da se izvika edna funktsiia, kogato se
sreshtne “starta” na
tag,druga pri “kraiat” mu i treta za obrabotka na
sudurzhanieto. Otgovornost
na parsera e da protsesira dokumenta i da izvika ukazanite
predi nachaloto
funktsii. Sled kato edin tag bude obraboten, parsera se
premestva na posledvashtiiat
go ako ima takuv ili priklyuchva rabota, ako niama drug. PHP
idva s parsera
expat.
Da predpolozhim, che ni se nalaga da obrabotim sledniiat XML
dokument, za da
izpolzvame zalozhenata v nego informatsiia :
<?xml version="1.0"?>
<library>
<book>
<title>Hannibal</title>
<author>Thomas
Harris</author>
<genre>Suspense</genre>
<pages>564</pages>
<price>8.99</price>
<rating>4</rating>
</book>
<book>
<title>Run</title>
<author>Douglas E.
Winter</author>
<genre>Thriller</genre>
<pages>390</pages>
<price>7.49</price>
<rating>5</rating>
</book>
<book>
<title>The Lord Of The
Rings</title>
<author>J. R. R.
Tolkien</author>
<genre>Fantasy</genre>
<pages>3489</pages>
<price>10.99</price>
<rating>5</rating>
</book>
</library>
SHTe izpolzvame sledniiat skript za obrabotkata :
<?php
// data file
$file = "library.xml"; // initialize parser
$xml_parser = xml_parser_create(); // set callback
functions
xml_set_element_handler($xml_parser,
"startElement", "endElement");
xml_set_character_data_handler($xml_parser,
"characterData"); // open XML
file
if (!($fp = fopen($file, "r"))){
die("Cannot locate XML data file:
$file");
} // read and parse data
while ($data = fread($fp, 4096)){
// error handler
if (!xml_parse($xml_parser, $data, feof($fp))){
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
} // clean up
xml_parser_free($xml_parser);
?>
<UL>
<LI>xml_parser_create() se izpolzva za
da se initsializira parser i da
se asotsiira s nego handle(resource), koito posledvashto da se
izpolzva pri
izvikvaneto da drugi funktsii (analogichno na handle-ite za
connection i db
v MySQL). Sled kato e initsializiran parsera triabva da
spetsifitsirame callback
funktsii za razlichnite vidove tagove.</LI>
<LI>xml_set_element_handler() se
izpolzva za da se zadade, koi shte sa
callback funtsiite, izvikvani pri nameren nachalen i kraen
tag. V primera po-gore
tova sa startElement() i "endElement().</LI>
</UL>
Sledvashtata stupka e da otvorim XML faila s ime ot $file, da
go prochetem i
protsesirame chrez xml_parse() funtskiiata. Poslednatashte izvika
nuzhnata za obrabotka
funktsiia vseki put, kogato otchete nalichieto na spetsifichen
tag. Sled kato dokumenta
e bil protsesiran napulno triabva da se izvika
xml_parser_free() za da se osvobodi
pametta zaemana ot parsera. Pri nalichie na greshka, mozhe da
se izpolzvat :
<UL>
<LI>xml_get_error_code()</LI>
<LI>xml_get_current_line_number()</LI>
<LI>xml_get_current_column_number()</LI>
<LI>xml_get_current_byte_index()</LI>
</UL>
za da imame poveche informatsiia otnosno vida i
miastopolzhenieto na greshkata
v dokumenta.
Eto i definitsiite na funktsiite startElement() i
endElement().
<?php
// use this to keep track of which tag the parser is
currently processing
$currentTag = "";
function startElement($parser, $name, $attrs) {
global $currentTag;
$currentTag = $name; // output opening HTML tags
switch ($name) {
case "BOOK": echo "<tr>";
break;
case "TITLE": echo "<td>"; break;
case "AUTHOR":echo "<td>"; break;
case "PRICE": echo "<td>"; break;
case "RATING": echo "<td>";
break;
default: break;
}
}
?>
<?php
function endElement($parser, $name) {
global $currentTag; // output closing HTML tags
switch ($name) {
case "BOOK": echo "</tr>";
break;
case "TITLE": echo "</td>";
break;
case "AUTHOR": echo "</td>";
break;
case "PRICE": echo "</td>";
break;
case "RATING": echo "</td>";
break;
default : break;
} // clear current tag variable
$currentTag = "";
}
?>
Vseki put, kogato parsera nameri otvariasht tag, toi izvikva
startElement()
s imeto na taga i atributite(ako ima takiva), kato
argumenti. Sled tova startElement()
obrabotva taga i otpechatva respektivniiat HTML.
<?
// process data between tags
function characterData($parser, $data) { global
$currentTag;
// text ratings
$ratings = array("Words fail me!",
"Terrible", "Bad",
"Indifferent", "Good",
"Excellent");
// format the data
switch ($currentTag) {
case "TITLE":// italics for title
echo "<i>$data</i>"; break;
case "AUTHOR": echo $data; break;
case "PRICE": // add currency symbol for
price
echo "$" . $data; break;
case "RATING": // get text rating
echo $ratings[$data]; break;
default: break;
}
}
?>
characterData() se izvikva, kogato parsera zabelezhi danni
mezhdu dvoikata
tagove. Triabva da se ima v predvid, che funktsiiata poluchava
kato argument samo
dannite, no ne i imeto na taga. Poradi tova v primera se
izpolzva globalnata
promenliva $currentTag. V zavisimost ot stoinostta
$currentTag.
<B>PHP s DOMXML</B>
Kakto i pri rabotata sus SAX, i pri DOM se nalaga da se
zaredi tseliait XML
dokument v pametta. PHP predlaga 3 funktsii za tazi tsel :
<UL>
<LI>xmldoc()</LI>
<LI>xmltree()</LI>
<LI>xmldocfile()</LI>
</UL>
Purvite 2 priemat kato argument niz sudurzhasht XML danni i
izgrazhdat durvovidnata
struktura ot tozi niz, dokato xmldocfile() priema ime na
fail kato argument.
<?php // create an XML-compliant string
$XMLDataString = ‘<?xml version="1.0"?’ .
‘>
<me><name>Joe
Cool</name><age>24</age><sex>male</sex></me>";
// create a document object
$XMLDoc = xmldoc($XMLDataString);
// create a tree object
$XMLTree = xmltree($XMLDataString);
?>
ili
<?php
// data file
$XMLFile = "me.xml";
// create a document object
$XMLDoc = xmldocfile($XMLFile);
?>
Sled kato dokumenta e bil zareden, mnozhestvo ot metodi
mogat da budat polzvani
za da se obhozhda durvoto. Ima dva nachina za izvikvane
: ediniiat e chrez
obekta vurnat ot xmldoc() i xmldocfile(), t.e. chrez
negovite metodi, a drugiiat
e chrez obiknovenni funktsii, na koito se podava kato
argument handle.
Primeri:
<?php
// data file
$file = "library.xml"; // create a document
object
$dom = xmldocfile($file); // echo these values to see the
object type
// get root node
$dom->root(); // get children under the root node as
array
$dom->children();
?>
<?php
// data file
$file = "library.xml";
// create a document object
$dom = xmldocfile($file); // get XML version
echo $dom->version; // get XML encoding
echo $dom->encoding; // get whether standalone file
echo $dom->standalone; // get XML URL
echo $dom->url; // get XML character set
echo $dom->charset;
?>
Kakto se vidia chrez izpolzvaneto na DOM ili SAX mogat da se
postignat ednakvi
rezultati. Razlikata se sustoi v tova,che DOM e po-baven
kato metod, poradi
fakta, che tsialoto durvo triabva da se postroi v nachaloto,
dokato SAX e po-burz,
zashtoto izvikva funktsiia vseki put, kogato nameri tag. Sushto
taka pri DOM dostupa
do elementi e priak, dokato pri SAX posledovatelen. Koi ot
dvata da se izpolzva
triabva da izbere programista, kato balansira mezhdu skorost
i vuzmozhnosti.
<< Programirane pod Linuks. Sredi za programirane | Mozilla >>
|
|