<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://www.lambda.ee/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Priit</id>
	<title>Lambda - Kasutaja kaastöö [et]</title>
	<link rel="self" type="application/atom+xml" href="http://www.lambda.ee/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Priit"/>
	<link rel="alternate" type="text/html" href="http://www.lambda.ee/wiki/Eri:Kaast%C3%B6%C3%B6/Priit"/>
	<updated>2026-10-28T15:20:44Z</updated>
	<subtitle>Kasutaja kaastöö</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=V%C3%B5rgurakendused_II&amp;diff=12065</id>
		<title>Võrgurakendused II</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=V%C3%B5rgurakendused_II&amp;diff=12065"/>
		<updated>2014-12-01T17:38:13Z</updated>

		<summary type="html">&lt;p&gt;Priit: /* Praktilised tööd ja tähtajad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
[[Pilt:Revolution_small.jpg|left|revolutsioon]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Ainekood: ITV0120&amp;lt;br&amp;gt;&lt;br /&gt;
Täielik nimi: Võrgurakendused II - hajussüsteemide tehnoloogia&amp;lt;br&amp;gt;&lt;br /&gt;
Link:  http://www.lambda.ee/index.php/V%C3%B5rgurakendused_II&amp;lt;br&amp;gt;&lt;br /&gt;
Punkte: 2.5 AP ehk 4 EAP&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Lektor: Tanel Tammet&amp;lt;br&amp;gt;&lt;br /&gt;
Kontakt: tanel.tammet@ttu.ee, 6203457&amp;lt;br&amp;gt;&lt;br /&gt;
Olemas on ka [[itv0040 2013 |2013 aasta materjalide arhiiv]].&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NB! Uus aine&amp;lt;/font&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Sellest sügisest käivitus uus aine, mida saab hetkel deklareerida ja mis kehtib valikainena moodulis &amp;quot;Eriala valikud&amp;quot;: &lt;br /&gt;
teda arvestatakse kõigil reaalselt kui selle bloki valikainet, kuigi ta ei ole (vanemates) &lt;br /&gt;
õppekavaversioonides nähtavalt sees. &lt;br /&gt;
&lt;br /&gt;
Vaata lähemalt http://lambda.ee/wiki/Tarkvaraarenduse_meeskonnaprojekt&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== Aeg, koht ==&lt;br /&gt;
&lt;br /&gt;
Semester: sügis&amp;lt;br&amp;gt;&lt;br /&gt;
Tulemus: eksam&amp;lt;br&amp;gt;&lt;br /&gt;
Hindamise meetod: praktikumide tulemused (pool) pluss eksam (teine pool)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loeng: kolmapäeval 16:00-17:30 ruumis CYB-VEENUS&amp;lt;br&amp;gt;&lt;br /&gt;
Praktikum: neljapäeval 17:45-19:15  arvutiklassis ICT-501 (praktikumijuhendaja Priit Järv)&lt;br /&gt;
&lt;br /&gt;
== Praktilised tööd ja tähtajad ==&lt;br /&gt;
&lt;br /&gt;
Töid võib teha 1-3 inimesest grupina.&lt;br /&gt;
&lt;br /&gt;
Kokku on töid 2. Kumbki praktikum täismahus tehtuna annab 25 punkti, sellele võivad lisanduda ekstrapunktid. Puudulikult tehtud töö punktiarv jääb alla 25 punkti. Hilinenud kodutöö eest saab pooled muidu saadaolevad punktid. Töid tuleb esitada praktikumi ajal, projektori abil, väikese ülevaatena kõigile tudengitele.&lt;br /&gt;
&lt;br /&gt;
* 1. Tähtaeg 23. oktoober. Kaks alternatiivi, mille vahel võid ise valida:&lt;br /&gt;
** [[Vorgurakendused 2 prax 1 2014 | 1 praks]]&lt;br /&gt;
** Teha ise katseid või rakendus õppejõuga eelnevalt kokku lepitud teemal (apid, protokollid) ja teha väike loeng/ülevaade katsetest/rakendusest.&lt;br /&gt;
&lt;br /&gt;
* 2. Tähtaeg 18. detsember. Kaks alternatiivi:&lt;br /&gt;
** [[Vorgurakendused 2 prax 2 2014| 2 praks: android ja google app engine]]&lt;br /&gt;
** Teha ise katseid või rakendus õppejõuga eelnevalt kokku lepitud teemal (mobiilirakendused ja pilvekeskkonnad) ja teha väike loeng/ülevaade katsetest/rakendusest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NB!&amp;lt;/font&amp;gt; Novembris ja detsembris saab esimest praktikumi (hilinemisega) esitada: praksi võtab vastu Priit. Esialgu on selleks planeeritud kaks võimalust: 6 novembri praksis ja &#039;&#039;&#039;11 detsembri praksis&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Kursus varasematel aastatel ==&lt;br /&gt;
&lt;br /&gt;
* I periood: Tammet (hajutatud failisüst, dns, p2p, ...) http://deepthought.ttu.ee/it/vorgutarkvara/wav4101/&lt;br /&gt;
* II periood: Grauen (eelmise jätk) http://cs.ttu.ee/kursused/itv0040/&lt;br /&gt;
* III periood: Kadastik (sõnumivahetus) http://cs.ttu.ee/tiki-index.php?page=ITV0040-2008&lt;br /&gt;
* IV periood: Tammet http://www.lambda.ee/index/itv0040&lt;br /&gt;
&lt;br /&gt;
== Esialgne loengukava ==&lt;br /&gt;
&lt;br /&gt;
Kursus jaguneb laias laastus neljaks teemaks: &lt;br /&gt;
&lt;br /&gt;
* Protokollid, P2P, andme-apid võrgus (neil teemadel esimene praks, autentimine&lt;br /&gt;
* Mobiilirakendused ja pilvekeskkonnad (neil teemadel teine praks)&lt;br /&gt;
* Paralleelrehkendused&lt;br /&gt;
* Andmete hajutamine ja hajutatud andmete koondamine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Loengute esialgne plaan:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Detailsem ülevaade kursuse sisust, sissejuhatus 1. praktikumi, protokollide algus, http, json ===&lt;br /&gt;
&amp;lt;!-- :[[Media:Protocols.ppt|Loengu raampresentatsioon]] --&amp;gt;&lt;br /&gt;
:&amp;lt;b&amp;gt;Http ja json&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 1]]&lt;br /&gt;
:Üldist materjali ja kursusi mujalt:&lt;br /&gt;
:http://en.wikipedia.org/wiki/Distributed_computing&lt;br /&gt;
:http://dcg.ethz.ch/lectures/podc_allstars/index.html&lt;br /&gt;
:http://www.eecs.harvard.edu/cs262/&lt;br /&gt;
:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-824-distributed-computer-systems-engineering-spring-2006/index.htm&lt;br /&gt;
:http://www.stanford.edu/class/cs244b/&lt;br /&gt;
&lt;br /&gt;
===  Praktikumi lisadetaile, protokollide jätk, xml ja xml põhised protokollid xml-rpc ja soap === &lt;br /&gt;
:&amp;lt;b&amp;gt;xml protokollid xml-rpc, soap ja seotud tehnoloogiad&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 2]]&lt;br /&gt;
:Probleemidest: [[veebiteenuste võlu ja valu]] ja [http://harmful.cat-v.org/software/xml/soap/simple s stands for simple]&lt;br /&gt;
&lt;br /&gt;
===  Protokollide jätk ja P2P sissejuhatus === &lt;br /&gt;
: &amp;lt;b&amp;gt;REST, binary protokollid, XMPP&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 3]]&lt;br /&gt;
:P2P sissejuhatus:&lt;br /&gt;
:[http://en.wikipedia.org/wiki/Peer-to-peer vikipeedia ülevaade]&lt;br /&gt;
&amp;lt;!-- :[http://www.srdc.metu.edu.tr/webpage/seminars/p2p/P2P.ppt hea paraja detailsusega sissejuhatus] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[http://www.cs.ucy.ac.cy/courses/EPL420/Slides/Chapter2_4ed-P2P.ppt ülevaatepresentatsioon] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[http://www.it.lut.fi/comlab/ssotc/ssotc08/presentations/Lappeenranta_summer_school_Jukka_K_Nurminen.ppt alternatiivne ülevaatepresentatsioon] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[http://www14.in.tum.de/personen/schmiste/dynamo08.ppt hea detailne ülevaade eri P2P tehnoloogiatest] --&amp;gt;&lt;br /&gt;
: [[Media:P2p_overview.ppt|ülevaade eri P2P tehnoloogiatest]]&lt;br /&gt;
&lt;br /&gt;
===  P2P jätk: DHT (distributed hash tables) ja bittorrent ===&lt;br /&gt;
:[http://en.wikipedia.org/wiki/Distributed_hash_table ülevaade wikipedias]&lt;br /&gt;
:Chord:&lt;br /&gt;
:Põhimaterjal - [http://pdos.csail.mit.edu/rtm/slides/harvard02.ppt Chordi põhimõtted] - lugeda kuni Ivy osani (Ivy on antud juhul teemaväline)&lt;br /&gt;
&amp;lt;!-- :Täiendavalt vaata [http://www.cs.berkeley.edu/~kubitron/courses/cs294-4.../lec03-chord.ppt seda presentatsiooni] visualiseeritud algoritmidega (ppt presentatsioonirezhiimis!) &lt;br /&gt;
:Täiendavalt juurde lugeda [http://www.ece.utexas.edu/~garg/f04/dist2/papers/chord.ppt chordi ülevaadet algoritmide skeemi] ja põhiteoreemidega (ilma tõestusteta) --&amp;gt;&lt;br /&gt;
:Lisaks tasuks veidi uurida artikleid [http://en.wikipedia.org/wiki/Chord_%28peer-to-peer%29 wikipedia] sissekande lõpus (external links)&lt;br /&gt;
:Kademlia:&lt;br /&gt;
:Põhimaterjal [http://www.cs.uiowa.edu/~ghosh/kademlia.ppt presentatsioon autoritelt]&lt;br /&gt;
:Täiendavalt [http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf autorite artikkel]&lt;br /&gt;
:Bittorrent:&lt;br /&gt;
:[http://www.cs.uiowa.edu/~ghosh/bittorrent.ppt bittorrenti protokoll ja ülevaade]&lt;br /&gt;
:[http://en.wikipedia.org/wiki/BitTorrent_%28protocol%29 täiendavalt wikipediast]&lt;br /&gt;
:TOR:&lt;br /&gt;
:[http://en.wikipedia.org/wiki/Tor_%28anonymity_network%29 TOR wikipedias]&lt;br /&gt;
&lt;br /&gt;
===  Suured avalikud andme-apid. === &lt;br /&gt;
: [[Andme-apide märkmed loengust]]&lt;br /&gt;
&lt;br /&gt;
===  Autentimine: facebook, google, id-kaart. ===&lt;br /&gt;
&lt;br /&gt;
:[[Autentimise märkmed: facebook ja google]]&lt;br /&gt;
&lt;br /&gt;
=== Pilvekeskkonnad, eriti: Google appengine, database api, google bigtable and file system stack === &lt;br /&gt;
:[[Hajutatud failisüsteemide märkmed loengust]]&lt;br /&gt;
:http://code.google.com/appengine/&lt;br /&gt;
&lt;br /&gt;
===  Sissejuhatus 2. praktikumi === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Mobiilirakenduste tegemine === &lt;br /&gt;
&lt;br /&gt;
:http://developer.android.com/index.html&lt;br /&gt;
:Mobi [[Media:Mobi android lecture.pdf|loengu pdf]]&lt;br /&gt;
:Mobi [https://github.com/madisp/PostimeesRss loengu koodi link]&lt;br /&gt;
&lt;br /&gt;
=== Paralleelrehkendused. Andmebaasid, lukustamine ja transaktsioonid. ===&lt;br /&gt;
:Paralleelsus andmebaasides, [[Media:na2_ccdb.pdf|konspekt]] ja [[Media:na2_ccdb_slides.pdf|slaidid]]&lt;br /&gt;
:Transaktsioonide sissejuhatuse [[Media:11-transactions.pdf|alternatiivsed slaidid]]&lt;br /&gt;
&lt;br /&gt;
=== Paralleelrehkendused jätkuvad. ===&lt;br /&gt;
:Sünkroniseerimisprimitiivid, [[Media:na2_sync.pdf|konspekt]] ja [[Media:na2_sync_slides.pdf|slaidid]]&lt;br /&gt;
:Lisaks [[Media:Locking_v2.ppt|T.Tammeti slaidid]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Paralleliseerimine ja efektiivsus: ip/tcp, socketid, http jne ===&lt;br /&gt;
: http näited &lt;br /&gt;
&lt;br /&gt;
=== Mapreduce framework for automating app parallelization + memcached ===&lt;br /&gt;
:Hea [http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;cd=2&amp;amp;ved=0CBkQxQEwAQ&amp;amp;url=http%3A%2F%2Fdocs.google.com%2Fviewer%3Fa%3Dv%26q%3Dcache%3AziVIMWHr2GsJ%3Anet.pku.edu.cn%2F~course%2Fcs501%2F2008%2Fresource%2Fmapreduce_in_a_week%2Fllm3-mapreduce.ppt%2Bgoogle%2Bmapreduce%2Btheory%2Band%2Bimplementation%2BChristophe%2BBisciglia%2C%2BAaron%2BKimball%2Bllm3%26hl%3Den%26pid%3Dbl%26srcid%3DADGEESiMwU-9htEZEAthU5bRtGGBQgkzwUf5vM549R-6QBooeBv10FFd-GLvrklDHx-RhI3OehhNio1E7m5GvwKyKK9ndM6oNbDO3LERl8M8YSZ5tdO4bRQ3PEs8sQ6_sdJVIF_Splx7%26sig%3DAHIEtbQVGyhnhEx0aTA0W7okwP8KdVqG1w&amp;amp;rct=j&amp;amp;q=google%20mapreduce%20theory%20and%20implementation%20Christophe%20Bisciglia%2C%20Aaron%20Kimball%20llm3&amp;amp;ei=plH_TPWOI4ay8gPVss2MCw&amp;amp;usg=AFQjCNE9y0GiXVo_hNWPmywfUjt_3ZhQqg&amp;amp;cad=rja Mapreduce sissejuhatus] &lt;br /&gt;
:Mapreduce [http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/en//papers/mapreduce-osdi04.pdf klassikaline põhiartikkel]&lt;br /&gt;
:[http://www.majordojo.com/2007/03/memcached-howto.php memcached ülevaade]&lt;br /&gt;
&lt;br /&gt;
=== Andmelaod. ===&lt;br /&gt;
&lt;br /&gt;
=== Hajutatud andmekogude integreerimine. Vaata ka linke: ===&lt;br /&gt;
&lt;br /&gt;
: [http://momjian.us/main/writings/pgsql/replication.pdf Postgres replication intro]&lt;br /&gt;
: [http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling Postgres clustering and replication]&lt;br /&gt;
: [http://www.postgresql.org/docs/current/interactive/high-availability.html Postgres high availability]&lt;br /&gt;
: [http://goanna.cs.rmit.edu.au/~e76763/tiger_ref/lkmt10-dnis.pdf Integrating distributed sem web data]&lt;br /&gt;
: [http://docs.oracle.com/cd/B28359_01/server.111/b28318/integrat.htm Oracle information integration]&lt;br /&gt;
&lt;br /&gt;
== Lisamaterjalid ==&lt;br /&gt;
&lt;br /&gt;
* [[võrgurakendused 2: täiendavad lingid]]&lt;br /&gt;
* [[Sehke speci draft]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Kursus]]&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=V%C3%B5rgurakendused_I_2018&amp;diff=12062</id>
		<title>Võrgurakendused I 2018</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=V%C3%B5rgurakendused_I_2018&amp;diff=12062"/>
		<updated>2014-11-28T22:07:36Z</updated>

		<summary type="html">&lt;p&gt;Priit: /* Praktilised tööd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
[[Pilt:Engine.jpg|left|mootor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Ainekood: ITV0110&amp;lt;br&amp;gt;&lt;br /&gt;
Link: http://www.lambda.ee/index.php/V%C3%B5rgurakendused_I ehk http://www.lambda.ee/index/itv0110&amp;lt;br&amp;gt;&lt;br /&gt;
Punkte: 3.5 AP ehk 5 EAP&amp;lt;br&amp;gt;&lt;br /&gt;
Lektor: [http://www.facebook.com/tanel.tammet Tanel Tammet]&amp;lt;br&amp;gt;&lt;br /&gt;
Kontakt: tanel.tammet@ttu.ee, 6203457&amp;lt;br&amp;gt;&lt;br /&gt;
olemas on ka [[Võrgurakendused_I 2013| 2013 aasta arhiiv]] koos kõigi eelmise aasta materjalidega.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aeg, koht, tulemus ==&lt;br /&gt;
&lt;br /&gt;
Loenguid nädalas: 2 tundi (üks loeng) teisipäeviti 10:00-11:30 ruumis CYB - VEENUS &lt;br /&gt;
&lt;br /&gt;
Praktikume nädalas: 2 tundi (üks praktikum). Praktikume juhendab Roger Kerse. Kui pole teisiti märgitud, toimuvad praktikumid:&lt;br /&gt;
* esmaspäeval 08:00-09:30 ruumis ICT-401 rühmadele   IABB31,  IABB32,  IABB33&lt;br /&gt;
* teisipäeval 16:00-17:30 ruumis ICT-501 rühmadele IABB37,  IAPB37,  IATM11&lt;br /&gt;
* neljapäeval 10:00-11:30 ruumis ICT-501 rühmadele  IAPB31,  IAPB32&lt;br /&gt;
* reedel 08:00-09:30 ruumis ICT-501 rühmadele  IAPB33,  IAPB34,  IAPB35&lt;br /&gt;
&lt;br /&gt;
Kursus lõpeb hindelise arvestusega. Hinne sõltub kursuse jooksul tehtud praktikumide tulemustest (60%) pluss kursuse lõpus toimuva kontrolltöö tulemustest (40%).&lt;br /&gt;
&lt;br /&gt;
== Kursuse eesmärk ==&lt;br /&gt;
&lt;br /&gt;
Lihtsamate veebirakenduste põhimõtted ja nende kirjutamise oskus nii brauseri kui serveri poolel. Konkreetsemalt: &lt;br /&gt;
* html-i kirjutamise oskus, esmane tutvus CSS-i ja javascriptiga. &lt;br /&gt;
* serveripoolse rakenduse kirjutamise põhimõtted, &lt;br /&gt;
* node.js kasutamise sissejuhatus serverirakendustes.&lt;br /&gt;
* cgi protokoll, erinevate keelte (sh shell, C, php, python, java, javascript) kasutamise sissejuhatus serverirakendustes&lt;br /&gt;
* pythoni ja php kasutamise esmased oskused.&lt;br /&gt;
* lihtsamad SQLi kasutamise oskused.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kursusel eeldatakse elementaarsete programmeerimisoskuste olemasolu. Kes programmeerimisega üldse kokku puutunud ei ole või seda paralleelselt ei õpi, ei suuda kursust läbida.&lt;br /&gt;
&lt;br /&gt;
== Praktilised tööd ==&lt;br /&gt;
&lt;br /&gt;
Kursusel on neli kohustuslikku praktilist ẗööd ja üks mittekohustuslik praktiline töö. Iga töö (sh mittekohustuslik töö) annab 0-12 punkti. &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Hilinenud tööd annavad poole punktidest.&amp;lt;/font&amp;gt; Töid võib (ja on soovitav) esitada enne tähtaega. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NB!&amp;lt;/font&amp;gt; &lt;br /&gt;
* Kui sinu praktikum on õigeaegselt arvestatud, siis saad esitada täiendusi (näiteks kolmanda praksi teist poolt) ka hiljem, ilma pooli punkte kaotamata.&lt;br /&gt;
* Esimest ja teist praksi saab esitada veel &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;novembris&amp;lt;/font&amp;gt;, aga detsembris neid enam vastu ei võeta. Kaugõppe tudengid saavad erandina esitada ka neid prakse detsembris.&lt;br /&gt;
* Alates kolmandast praksist saad oma tööd esitada &amp;lt;b&amp;gt;ainult&amp;lt;/b&amp;gt; oma rühma praksi ajal. Kui sa ei ole üheski rühmas, siis on aeg vaba. Lihtsalt nõu ja abi saad küsida ka teistel aegadel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kõik tööd tuleb esitada ise TTÜ arvutiklassis: emailiga saadetud töid ei arvestata. Kasutada võib nii klassi arvuteid kui oma arvutit, brauser ja operatsioonisüsteem on vabalt valitavad. Serverirakenduste tööde presenteerimiseks tuleb kasutada ülikooli serverit dijkstra.&lt;br /&gt;
&lt;br /&gt;
Ülesanded:&lt;br /&gt;
&lt;br /&gt;
* [[ITV0110 1. töö: Html põhioskused|Html põhioskused]]. Tähtaeg 15-19 septembri nädal, vastavalt sinu praktikumirühmale. Detsembris seda praksi enam esitada ei saa. Kaugõppe tähtaeg 20. sept.&lt;br /&gt;
* [[ITV0110 2. töö 2014: CSS, javascript, veebiserver|CSS, javascript, veebiserver]]. Tähtaeg 6-10 oktoobri nädal, vastavalt sinu praktikumirühmale. Detsembris seda praksi enam esitada ei saa. &#039;&#039;&#039;Erandina need kes 28.11 praksis ennast kirja panid saavad kaitsta P. Järve juures ICT-501 5.12&#039;&#039;&#039;.  Kaugõppe tähtaeg on 18. oktoober.&lt;br /&gt;
* [[ITV0110 3. töö 2014: Serverirakendus: cgi pythonis|Serverirakendus: cgi pythonis]]. Tähtaeg 10-14 novembri nädal. Kaugõppe tähtaeg on 29. november.&lt;br /&gt;
* [[ITV0110 node.js töö| Serverirakendus node.js abil]]. Mittekohustuslik. Tähtaeg lükkus edasi &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;1. detsembrini&amp;lt;/font&amp;gt;. Kaugõppe tähtaeg on 29. november&lt;br /&gt;
* [[ITV0110 4. töö 2014: Andmebaasiga serverirakendus|Andmebaasiga serverirakendus php-s]].  Tähtaeg 18/19. detsember. Kaugõppe tähtaeg on kontrolltöö aeg jaanuaris.&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Järgmine ülesanne on lihtsalt tutvumiseks, pärit 2013 aastast ja sellisena neid teha ei tule. &lt;br /&gt;
2014 aasta ülesanne tuleb veidi erinev ning antakse jooksvalt eelmise ülesande tähtaja lähenedes.&lt;br /&gt;
* [[ITV0110 3. töö: Serverirakendus: cgi pythonis]]. Tähtaeg 20/21 november. Kaugõppe tähtaeg 30. november.&lt;br /&gt;
* [[ITV0110 4. töö: Andmebaasiga serverirakendus php-s|Andmebaasiga serverirakendus php-s]]. Tähtaeg 18/19. detsember. Kaugõppe tähtaeg on kontrolltöö aeg jaanuaris.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kursuse edukaks läbimiseks peavad kõik kohustuslikud praktilised tööd olema tehtud.&lt;br /&gt;
&lt;br /&gt;
Lehtede kujundamise ja stiili osas lähtu [[htmli kujunduse üldpõhimõtted| sellest juhendist]].&lt;br /&gt;
&lt;br /&gt;
== Leitud asju ==&lt;br /&gt;
&lt;br /&gt;
Vaata seda: http://keithclark.co.uk/articles/creating-3d-worlds-with-html-and-css/&lt;br /&gt;
&lt;br /&gt;
== Loengute plaan ja materjalid ==&lt;br /&gt;
&lt;br /&gt;
Alltoodud teemad kaetakse igaüks ühe-kahe loenguga. Suur osa loengutest on pühendatud näidete läbitegemisele ning seletamisele, ette-programmeerimisele ja praktikumide osalisele realiseerimisele.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== HTML põhioskused ===&lt;br /&gt;
&lt;br /&gt;
Taustaks tasub&lt;br /&gt;
* meelde tuletada interneti baastehnoloogia IT sissejuhatusest: [[Media:Itsissejuhatus10o08.pdf|Itsissejuhatus10o08.pdf]].&lt;br /&gt;
Loe ja proovi läbi (st vaja põhimõtted selgeks õppida):&lt;br /&gt;
* [http://www.w3schools.com/html/default.asp w3schools html tutorial basic blokk].&lt;br /&gt;
Loe enne või sama-aegselt lisaks läbi ka&lt;br /&gt;
* [http://www.w3.org/MarkUp/Guide/ Raggetti vanaaegne mikrotutorial  algajatele] ja selle [http://www.w3.org/MarkUp/Guide/Advanced.html teine osa]&lt;br /&gt;
* Hea eestikeelne, samuti natuke vana sissejuhatus [http://akadeemia.kakupesa.net/arhiiv/VR1/loengud/loeng3 Kaido Kikkaselt (html)]  &lt;br /&gt;
&lt;br /&gt;
Vanemates tutorialites toodud markup on reeglina endiselt pädev, v.a. xhtml ja päised: sina kasuta html5 standardit (päises &amp;amp;lt;!DOCTYPE html&amp;amp;gt;) ja ignoreeri xml teemat html-s.&lt;br /&gt;
&lt;br /&gt;
Keerulisemat: &lt;br /&gt;
* [http://www.w3.org/TR/1999/REC-html401-19991224/ vana, siiani ametlik w3c standard]&lt;br /&gt;
* html 5: [http://www.w3.org/TR/html5/ w3c pooleli html 5] ja [http://www.whatwg.org/specs/web-apps/current-work/multipage/ whatwg living html 5] ja [http://www.w3schools.com/html/html5_intro.asp w3schools tutorial]&lt;br /&gt;
* [http://www.w3.org/TR/html401/struct/tables.html tabelite osa ametlikust 4.01 standardist]&lt;br /&gt;
* [http://www.w3schools.com/html/html_entities.asp html entities osa1] ja [http://www.w3schools.com/html/html_symbols.asp osa2] ja [http://en.wikipedia.org/wiki/UTF-8 utf-8] ja [http://en.wikipedia.org/wiki/Character_encodings_in_HTML charseti seadmine]&lt;br /&gt;
* [http://hsivonen.iki.fi/doctype/ !DOCTYPE prefix] ja html vanade versioonide kuvamine&lt;br /&gt;
* Kasulik tagide nimistu: [http://joshduck.com/periodic-table.html html 5 elementide perioodiline tabel]&lt;br /&gt;
* [http://www.w3schools.com/html/html_xhtml.asp html and xhtml] ja [http://en.wikipedia.org/wiki/HTML5 html 5] &lt;br /&gt;
* klassikaline salvestamine: [http://en.wikipedia.org/wiki/HTTP_cookie cookie] tutorial [http://www.w3schools.com/js/js_cookies.asp javascriptis]&lt;br /&gt;
* html 5 web storage [http://dev-test.nemikor.com/web-storage/support-test/ support]&lt;br /&gt;
* html 5 indexed db [http://en.wikipedia.org/wiki/Indexed_Database_API lühidalt], [http://caniuse.com/indexeddb support] ja [http://www.html5rocks.com/en/tutorials/webdatabase/websql-indexeddb/ kuidas kasutada] ja [http://www.html5rocks.com/en/tutorials/indexeddb/todo/ tutorial]&lt;br /&gt;
* html 5 [http://en.wikipedia.org/wiki/Canvas_element canvas]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CSSi põhioskused === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lugeda ja proovida läbi (st vaja põhimõtted selgeks õppida):&lt;br /&gt;
* [http://www.w3.org/MarkUp/Guide/Style.html First CSS intro]&lt;br /&gt;
* [http://www.w3schools.com/css/ w3schools&#039;i css tutorial]: : kindlasti &amp;quot;basic&amp;quot;, &amp;quot;styling&amp;quot; ja &amp;quot;box&amp;quot; blokid, huvi korral loe edasi (advanced jne) ka, kuid need viimased ei ole üleni kohustuslikud, välja arvatud järgmised eriti olulised osad advanced blokist:&lt;br /&gt;
** [http://www.w3schools.com/css/css_display_visibility.asp display and visibility]&lt;br /&gt;
** [http://www.w3schools.com/css/css_positioning.asp positioning]&lt;br /&gt;
** [http://www.w3schools.com/css/css_float.asp float]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
** [http://www.w3schools.com/css/css_image_sprites.asp image sprites]: see on oluline praktikumitöös&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* Väga kasulik abimaterjal on w3schoolsi [http://www.w3schools.com/cssref/default.asp  css reference]&lt;br /&gt;
Abiks on tutvuda heade tutorialidega järgmistel teemadel:&lt;br /&gt;
* [http://www.thesitewizard.com/css/center-div-block.shtml centering div]&lt;br /&gt;
* [http://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/ inline block]&lt;br /&gt;
* [http://css.maxdesign.com.au/floatutorial/  floats]&lt;br /&gt;
* [http://css.maxdesign.com.au/listamatic/  listikasutus] ja sealtsamast [http://css.maxdesign.com.au/listutorial/index.htm listikasutuse tutorialid]&lt;br /&gt;
* [http://www.css3.info/preview/box-shadow/ css shadow]&lt;br /&gt;
* [http://webdesignerwall.com/tutorials/cross-browser-css-gradient css gradiendid]&lt;br /&gt;
Häid praktilisi soovitusi kujundusest css-ga:&lt;br /&gt;
* [http://webdesignerwall.com/tutorials/css3-gradient-buttons css nupud] ja [http://www.webdesignerwall.com/demo/css-buttons.html nupukataloog] ja [http://css-tricks.com/examples/ButtonMaker/# nuputegija1] ja [http://www.cssbuttongenerator.com/ nuputegija2]&lt;br /&gt;
* [http://smashinghub.com/9-amazing-css-rules-that-save-designers-and-developers.htm rounded corners, shadow, gradient fill jne]&lt;br /&gt;
* [http://www.script-tutorials.com/css3-metal-menu-with-icons/ multilevel metal menu with icons] pluss html/css alt muid häid css3 õpetusi&lt;br /&gt;
* [http://informationarchitects.net/blog/the-web-is-all-about-typography-period/ puhtast tüpograafia-kujundusest]&lt;br /&gt;
Vingeid graafilisi canvas+webgl asju:&lt;br /&gt;
* [http://www.clicktorelease.com/code/streetViewReflectionMapping/#59.4369400264884,24.743906027972344 street view + knot] &lt;br /&gt;
* [http://alteredqualia.com/three/examples/webgl_materials_skin.html pea]&lt;br /&gt;
* [http://robchadwick.com/TerrainEditor/ terrain editor]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Javascripti põhioskused === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kaks loengut: (a) sissejuhatus (b) reaalne kasutamine brauseris (html ja css muutmine, evendid jne)&lt;br /&gt;
&lt;br /&gt;
Vaata soenduseks/demoks [http://www.chromeexperiments.com/ Google kogutud näiteid].&lt;br /&gt;
&lt;br /&gt;
Seejärel loe läbi ja proovi järgi selles järjekorras:&lt;br /&gt;
* [http://en.wikipedia.org/wiki/JavaScript Wikipedia javascripti üldartikkel]: ülevaade, ajalugu jne. Keelt siit ei õpi!&lt;br /&gt;
* [http://www.w3schools.com/js/default.asp W3schools javascripti sissejuhatus]: JS Basic ja JS Objects osad. Mõned asjad jäävad siin veidi ebaselgeks!&lt;br /&gt;
* [http://en.wikipedia.org/wiki/JavaScript_syntax Wikipedia Javascripti keele kiirõpetus]: loe ja proovi paralleelselt w3schools-ga. Siit saab mõned asjad selgemaks kui ainult w3schoolsist.&lt;br /&gt;
&lt;br /&gt;
NB! Selle tulemusena on sul baasettekujutus javascripti keelest, aga mitte reaalsest kasutusest (seda vaatame järgmises loengus).&lt;br /&gt;
&lt;br /&gt;
Javascripti kasutamine brauseris: alustuseks on hea vaadata põhjalikku näidete loetelu&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3schools.com/js/js_ex_dom.asp html dom objektid]: põhiasjad&lt;br /&gt;
* [http://www.tizag.com/javascriptT/javascriptform.php form validation]: klassikaline rakendus&lt;br /&gt;
* [http://www.w3schools.com/js/js_ex_browser.asp brauseriobjektid]: vahel kah kasulikud&lt;br /&gt;
&lt;br /&gt;
ja tingimata lugeda sinna juurde teegijuhendeid:&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3schools.com/jsref/dom_obj_all.asp  html dom ülevaadet]&lt;br /&gt;
* [http://www.w3schools.com/jsref/dom_obj_event.asp html events ülevaadet]&lt;br /&gt;
* [http://www.w3schools.com/jsref/dom_obj_style.asp style lugemine/muutmine js-s: hädavajalik reference]&lt;br /&gt;
&lt;br /&gt;
Javascripti ja css-i teegid: uurime veidi kõige populaarsemaid teeke&lt;br /&gt;
&lt;br /&gt;
* [http://w3techs.com/technologies/overview/javascript_library/all populaarsed teegid] &lt;br /&gt;
* [http://www.jquery.com jquery] javascripti teek&lt;br /&gt;
* [http://getbootstrap.com bootstrap] css + javascript, widgetid jne&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Veebirakenduse optimeerimine mobiilile === &lt;br /&gt;
&lt;br /&gt;
* [http://www.seabreezecomputers.com/tips/mobile-css.htm sissejuhatavaid punkte ja olulist]&lt;br /&gt;
* [http://www.luster.io/blog/9-29-14-mobile-web-checklist.html põhjalik checklist kogu värgist]: kindlasti vaata, aga kõige selle tegemine on päris töömahukas ja ei ole praksis üldse nõutud.&lt;br /&gt;
&lt;br /&gt;
Täiendavalt spetsiifilisematest teemadest:&lt;br /&gt;
&lt;br /&gt;
* [http://www.javascriptkit.com/dhtmltutors/cssmediaqueries.shtml css-i valik mobiilile] ja [http://css-tricks.com/snippets/css/media-queries-for-standard-devices/ sama teema selgitusteta]&lt;br /&gt;
* [http://webdesignerwall.com/tutorials/mobile-navigation-design-tutorial navigeerimine ja menüüd]&lt;br /&gt;
* [http://taylor.fausak.me/2013/11/01/ios-7-web-apps/ iOS nüansid]&lt;br /&gt;
* [https://www.youtube.com/watch?v=3Bq521dIjCM&amp;amp;feature=youtu.be&amp;amp;t=23m50s optimeeri sujuvust: video]&lt;br /&gt;
* [http://impulse.luster.io/ interaktsiooni-animatsioonide teek]&lt;br /&gt;
* [http://ionicframework.com/ huvitav mobiili-hübriid-veebirakenduste teek]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
; Praktilist teisest praktikumist&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kuidas ja kuhu faile serverisse üles laadida jms: loe [[ITV0110 2. töö: CSS, javascript, veebiserver| teise praktikumi materjalidest]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  Cgi töötlemine eri keeltes (C, python, bash, java, ...) === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kõigepealt loe ja proovi tingimata ise läbi teha: [[pythoni cgi-d dijkstra serveris: kiire sissejuhatus]]&lt;br /&gt;
&lt;br /&gt;
Seejärel vaata [[cgi examples|hulka näiteid]], mille täpsem seletus antakse loengus.&lt;br /&gt;
&lt;br /&gt;
Tutvu linuxi shelli elementaarsete käskudega [http://www.freesoftwaremagazine.com/articles/command_line_intro siit alustades] ja [http://www.pixelbeat.org/cmdline.html selle lühiõpetusega jätkates.] Iga käsu juures on abiks man, näiteks &amp;lt;tt&amp;gt;man ls&amp;lt;/tt&amp;gt;. Huvi korral googelda lisaks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seejärel loe neid materjale CGI protokollist ja CGI programmidest serveris:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jmarshall.com/easy/cgi/ lihtne sissejuhatus cgi-desse]&lt;br /&gt;
* [[Media:cgi.pdf|cgi.pdf: detailsem juhend]]&lt;br /&gt;
* [http://www.cs.tut.fi/~jkorpela/forms/cgic.html cgi C keeles]&lt;br /&gt;
* Pythonis cgi programmeerimise tutoriali [http://www.tutorialspoint.com/python/python_cgi_programming.htm leiad siit]&lt;br /&gt;
* [http://webpython.codepoint.net/cgi_tutorial cgi Pythonis]&lt;br /&gt;
* [http://www.yolinux.com/TUTORIALS/BashShellCgi.html cgi Bashis]&lt;br /&gt;
&lt;br /&gt;
ning siis vaata lisaks loengus tehtud/proovitud [[lihtsaid cgi programminäiteid]] eri keeltes.&lt;br /&gt;
&lt;br /&gt;
Cgi jaoks on olemas ka nö [http://www.rfc-editor.org/rfc/rfc3875.txt rfc-standard], mille lugemine on aga pisut vaevarikas (nagu enamikel standarditel) ja üldjuhul on praktilisem lugeda hoopis ülaltoodud õpetusi ja vaadata&lt;br /&gt;
näiteid.&lt;br /&gt;
&lt;br /&gt;
===  Python ja näiteid kasutamisest serverirakendustes === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tutvumine kolmanda praktikumiga: [[ITV0110 3. töö: Serverirakendus: cgi pythonis]]. Praksi jaoks vajaliku koodi kirjutamise harjutamine (loengus etteprogrammeerimine).&lt;br /&gt;
&lt;br /&gt;
Sealt leiad ka soovitused esmatutvuseks Pythoniga (praktikumi jaoks piisab kõige lihtsamatest Pythoni konstruktsioonidest ja cgi teegist, keerukamaid asju pole otseselt vaja):&lt;br /&gt;
&lt;br /&gt;
* loe [http://docs.python.org/tutorial/ tutoriali] algust (keerulised andmestruktuurid, moodulite ja klasside värgi võid esialgu lugemata jätta) &lt;br /&gt;
* hea tutorial [http://www.tutorialspoint.com/python/python_cgi_programming.htm cgi programmide kohta pythonis]&lt;br /&gt;
* lisaks [http://docs.python.org/library/cgi.html cgi teegi õpetust].&lt;br /&gt;
&lt;br /&gt;
Hea mõte on paralleelselt teha lahti Pythoni interpretaator ja katsetada kõrvale asju otse Pythoni käsureal. Kui su masinas Pythonit pole, siis installeeri! Kasulikke asju lisaks:&lt;br /&gt;
&lt;br /&gt;
* [http://docs.python.org/library/index.html#library-index teegi dokumentatsioonis].&lt;br /&gt;
* [[Kasulikke pythoni näitejuppe cgi jaoks]]&lt;br /&gt;
* [http://www.makotemplates.org/ mako templates:] katsetame neid veidi loengus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Ajax ehk serveriga andmevahetus otse javascriptist === &lt;br /&gt;
&lt;br /&gt;
* Loe seotud tehnoloogiatest: [http://en.wikipedia.org/wiki/Ajax_%28programming%29 wikipedia ajax], [http://en.wikipedia.org/wiki/XMLHttpRequest wikipedia xmlhttprequest], [http://en.wikipedia.org/wiki/JSON wikipedia json]&lt;br /&gt;
* Vaata [[xmlhttprequest ja jsonile rakendatud eval näited]]&lt;br /&gt;
&lt;br /&gt;
Lisaks võib abi olla:&lt;br /&gt;
* [http://www.w3schools.com/ajax/default.asp w3schoolsi ajaxi mikrotutorial]&lt;br /&gt;
* [http://api.jquery.com/jquery.ajax/ jquery mugavamad wrapperid xmlhttprequestile]&lt;br /&gt;
&lt;br /&gt;
NB:&lt;br /&gt;
* Vanade IE-de erivariante ei ole mingit mõtet kasutada. &lt;br /&gt;
* Ajaxiga avatud urlilt võib tulla mis iganes tekst (ei pea olema xml).&lt;br /&gt;
&lt;br /&gt;
===  node.js sissejuhatus === &lt;br /&gt;
&lt;br /&gt;
[http://nodejs.org/ node.js] on süsteem serverirakenduste kirjutamiseks javascriptis. Ta on ehitatud chrome javascripti mootori peale ja lisab sinna hulgem kasulikke teeke, veebiserveri jne.&lt;br /&gt;
&lt;br /&gt;
Vaata:&lt;br /&gt;
&lt;br /&gt;
* [http://nodejs.org/ node.js] ise&lt;br /&gt;
* node.js [http://en.wikipedia.org/wiki/Node.js wikipedias]&lt;br /&gt;
&lt;br /&gt;
Seejärel installeeri enda arvutisse node.js ja alusta katsetamist:&lt;br /&gt;
&lt;br /&gt;
* [http://nodeguide.com/beginner.html hea sissejuhatav tutorial]&lt;br /&gt;
* [http://www.nodebeginner.org/ järgmine ok tutorial]&lt;br /&gt;
* [http://nodeschool.io/#learnyounode hulk eri tutoriale] mis vajavad installeerimist&lt;br /&gt;
&lt;br /&gt;
Hetkel ei ole dijkstras node.js installeeritud, aga lähiajal ta sinna ilmub. Seniks on soovitav kas&lt;br /&gt;
&lt;br /&gt;
* Installeerida node.js oma arvutisse või&lt;br /&gt;
* Installeerida node.js arvutiklassi arvutisse (ta on olemas arvutiklassi standardpakettide hulgas, ei ole vaja olla admin)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Veebiserveri ehitusest ja konfigureerimisest === &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kõigepealt tutvu või tuleta meelde http protokolli põhimõtteid:&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol http wikipedias]&lt;br /&gt;
* [http://www.jmarshall.com/easy/http/ veel http-st]&lt;br /&gt;
* [http://www.factini.com/c/httpViewer/ headerite jms vaatamise veebiabivahend]&lt;br /&gt;
&lt;br /&gt;
Veebiserverist paremaks arusaamiseks tasub veidi eksperimenteerida [[Media:Itsissejuhatus_tiny.zip|pisikese veebiserveriga]].&lt;br /&gt;
&lt;br /&gt;
Enimkasutatav veebiserver Apache:&lt;br /&gt;
&lt;br /&gt;
* [http://httpd.apache.org/ apache oma koduleht]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Apache_HTTP_Server wikipedia apachest]&lt;br /&gt;
* [http://news.netcraft.com/archives/category/web-server-survey/ veebiserverite kasutusstatistikat]&lt;br /&gt;
&lt;br /&gt;
Apache konfigureerimisest:&lt;br /&gt;
&lt;br /&gt;
* [http://www.jlk.net/apache/beginners.shtml sissejuhatus algajatele]&lt;br /&gt;
* [http://httpd.apache.org/docs/2.2/ ametlik juhend]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Serverirakendused PHP-s, näited === &lt;br /&gt;
&lt;br /&gt;
* Väikese ajaloolise ülevaate leiad [http://en.wikipedia.org/wiki/PHP wikipeediast]&lt;br /&gt;
* Põhiõpetus on [http://www.php.net/manual/en/ php oma saidil]: loe sealt kõigepealt [http://www.php.net/manual/en/tutorial.php sissejuhatavat tutoriali]&lt;br /&gt;
* [http://w3schools.com/php/default.asp W3school-si php tutorial] on samuti päris OK.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  SQL  === &lt;br /&gt;
&lt;br /&gt;
Loe selles järjekorras:&lt;br /&gt;
&lt;br /&gt;
* [http://web.njit.edu/~song/courses/is698/SQL_tutorials.ppt hea esimene sissejuhatus]&lt;br /&gt;
* [http://www.w3schools.com/sql/default.asp w3schools&#039;i tutorial]&lt;br /&gt;
* [http://dev.mysql.com/doc/refman/5.0/en/tutorial.html mysql esmane tutorial] ja [http://dev.mysql.com/doc/refman/5.0/en/index.html mysql manuaal]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  SQL serverirakendustes === &lt;br /&gt;
&lt;br /&gt;
* [[Vorgurakendused 1 SQL naited loengust]]: alusta siit&lt;br /&gt;
* Vaata veel kombineeritult [[lihtsaid php ja mysql näiteid]] loengust.&lt;br /&gt;
&lt;br /&gt;
Harilikud tutorialid ja tähelepanekud:&lt;br /&gt;
&lt;br /&gt;
* [http://dmsa.concordia.ca/tutorial_files/shortsql.ppt mysql PHP-s: ppt] &lt;br /&gt;
* [http://www.tizag.com/mysqlTutorial/ mysql PHP-s: veebitutorial]&lt;br /&gt;
* [http://blogs.techrepublic.com.com/security/?p=2368 SQL injection] vt ka [http://lh6.ggpht.com/_5YF7KQZuZS0/S6dvFXu5OoI/AAAAAAAACWM/qTcVpMxcDnA/licence%20plate%20camera%20sql%20injection_2%5B3%5D.jpg?imgmax=800 seda] ja [http://www.schneier.com/blog/archives/2010/10/pen-and-paper_s.html seda] ja [http://alicebobandmallory.com/articles/2010/09/23/did-little-bobby-tables-migrate-to-sweden seda]&lt;br /&gt;
* [http://www.w3schools.com/php/default.asp w3schools PHP tutorial all vasakul Mysql blokk]&lt;br /&gt;
&lt;br /&gt;
===  Sessioonid, cookied, sisselogimine, autentimine, web storage === &lt;br /&gt;
&lt;br /&gt;
Mõned lingid:&lt;br /&gt;
&lt;br /&gt;
* basic authentication [http://en.wikipedia.org/wiki/Basic_access_authentication wikipedias], [http://httpd.apache.org/docs/2.0/howto/auth.html apache manuaalis] ja [[basic authentication näited]]&lt;br /&gt;
* cookie [http://en.wikipedia.org/wiki/HTTP_cookie wikipedias], php cookie handling [http://w3schools.com/PHP/php_cookies.asp w3schools-st] ja [http://www.php.net/manual/en/function.setcookie.php php manuaalist]&lt;br /&gt;
* [http://oreilly.com/catalog/webdbapps/chapter/ch08.html ok sessiooniõpetus]&lt;br /&gt;
* php sessioonihandling [http://w3schools.com/PHP/php_sessions.asp w3schools] ja siit [http://ee.php.net/manual/en/book.session.php php mahukas sessiooni-manuaal] ja siit [http://www.tizag.com/phpT/phpsessions.php eraldi tutorial]&lt;br /&gt;
* väike [http://www.secologic.org/downloads/web/051123_eurosec_course_material_on_web_application_session_management.ppt ok sessioonihalduse tutorial]&lt;br /&gt;
* [[autentimise näide php sessiooniga]]&lt;br /&gt;
* [http://www.w3schools.com/html/html5_webstorage.asp Web storage]: HTML5 parem ja lihtne alternatiiv cookiedele. Vaata kindlasti ka muid [http://www.html5rocks.com/en/tutorials/offline/storage/ HTML5 data-salvestus-mehhanisme], [http://www.html5rocks.com/en/tutorials/appcache/beginner/ HTML5 application cache] ja [http://diveintohtml5.info/storage.html seda detailsemat täiendavat juttu].&lt;br /&gt;
&lt;br /&gt;
== Vajalikud tööriistad ==&lt;br /&gt;
&lt;br /&gt;
Oma arvutiga töö tegemiseks peab seal olema vähemalt&lt;br /&gt;
&lt;br /&gt;
* [http://notepad-plus-plus.org/ Notepad++] või [http://www.scintilla.org/SciTE.html scite] või [http://brackets.io/ brackets]&lt;br /&gt;
* [http://www.mozilla.com Mozilla Firefox] või [https://www.google.com/intl/en/chrome/browser/ Google Chrome]&lt;br /&gt;
* [http://www.mozilla.com Mozilla Firefoxi] kasutades installi endale [https://getfirebug.com/ firebug] plugin&lt;br /&gt;
* Windowsil [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html putty] või mõni sarnane sisselogimis-proge (Linuxil piisab ssh käsust). Hea erivariant Puttyst on [http://www.9bis.net/kitty/ kitty], mis laseb kasutajatunnuse ja parooli meelde jätta, et ei peaks igakord uuesti sisestama.&lt;br /&gt;
* Windowsil [http://winscp.net winscp] (vaata [http://winscp.net/eng/docs/ui_editor konfimisest!]) või mõni sarnane failide-üleslaadimis-proge (Linuxil piisab scp käsust)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
== Veel lugemiseks ==&lt;br /&gt;
&lt;br /&gt;
Üldist:&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3schools.com/ Mitu head tutoriali eri teemadel]&lt;br /&gt;
* [http://www.websitetips.com/ suur kogu häid tutoriale, artikleid ja soovitusi]&lt;br /&gt;
* Lisamaterjale kursusest [[Kasutajaliidesed võrgutehnoloogia baasil]]&lt;br /&gt;
&lt;br /&gt;
HTML:&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/MarkUp/Guide/ Raggetti tutorial  algajatele]&lt;br /&gt;
* [http://akadeemia.kakupesa.net/arhiiv/VR1/loengud/loeng3 Kaido Kikkase hea eestikeelne sissejuhatus] &lt;br /&gt;
* [http://innar.li.ttu.ee/failid/VR_2006.pdf Innar Liivi hea eestikeelne sissejuhatus] &lt;br /&gt;
* [http://www.w3schools.com/html/ w3schools&#039;i põhjalik html tutorial]&lt;br /&gt;
* [http://joshduck.com/periodic-table.html tore tagide nimistu]&lt;br /&gt;
* [http://www.w3.org/TR/html4/ HTML 4.01 ametlik standard]&lt;br /&gt;
* [http://www.w3.org/TR/html5/ HTML 5.0 ametlik draft]&lt;br /&gt;
&lt;br /&gt;
HTML+CSS+Javascript:&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/MarkUp/Guide/Style.html First CSS intro]&lt;br /&gt;
* [http://www.w3schools.com/css/ w3schools&#039;i css tutorial]&lt;br /&gt;
* [http://www.w3schools.com/js/ w3schools&#039;i javascripti tutorial]&lt;br /&gt;
* [http://www.maxdesign.com.au/articles/liquid/ liquid layouts]&lt;br /&gt;
* [http://www.alistapart.com/  A list apart]&lt;br /&gt;
* [http://css.maxdesign.com.au/listamatic/  listikasutus]&lt;br /&gt;
* Javascript, mashup ja ühe-lehe-sait sightsmap: http://www.sightsmap.com/&lt;br /&gt;
&lt;br /&gt;
HTTP &lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol http wikipedias]&lt;br /&gt;
* http://www.jmarshall.com/easy/http/&lt;br /&gt;
* [http://www.w3.org/Protocols/HTTP/AsImplemented.html T. Berners-Lee leiutatud esimene HTTP spec]&lt;br /&gt;
* [http://www.garshol.priv.no/download/text/http-tut.html hea väike HTTP ja CGI tutorial]&lt;br /&gt;
* [http://www.factini.com/c/httpViewer/ headerite jms vaatamise veebiabivahend]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CGI programmid serveris&lt;br /&gt;
&lt;br /&gt;
* [http://www.jmarshall.com/easy/cgi/ lihtne sissejuhatus cgi-desse]&lt;br /&gt;
* [[Media:cgi.pdf|cgi.pdf: detailsem juhend]]&lt;br /&gt;
* [http://www.whizkidtech.redprince.net/cgi-bin/tutorial cgi esmane sissejuhatus Bashi näidetega]&lt;br /&gt;
* [http://www.cs.tut.fi/~jkorpela/forms/cgic.html cgi C keeles]&lt;br /&gt;
* [http://webpython.codepoint.net/cgi_tutorial cgi Pythonis]&lt;br /&gt;
* [http://www.yolinux.com/TUTORIALS/BashShellCgi.html cgi Bashis]&lt;br /&gt;
* [[Media:Itsissejuhatus_tiny.zip|Tiny www server]] ja [[lihtsaid cgi programminäiteid]]&lt;br /&gt;
&lt;br /&gt;
PHP ja MySQL&lt;br /&gt;
&lt;br /&gt;
* http://www.php.net/ sh http://www.php.net/tut.php või http://www.php.net/manual/en/tutorial.php&lt;br /&gt;
* http://www.mysql.org, alustuseks http://dev.mysql.com/doc/refman/5.1/en/tutorial.html&lt;br /&gt;
* [[ajut22]]&lt;br /&gt;
* [[ajut23]]&lt;br /&gt;
&lt;br /&gt;
Veebiserverid:&lt;br /&gt;
&lt;br /&gt;
* [[Media:Itsissejuhatus_tiny.zip|Tiny www server]] ja [[lihtsaid cgi programminäiteid]]&lt;br /&gt;
* http://www.devside.net/guides/windows/apache&lt;br /&gt;
* http://net.tutsplus.com/tutorials/php/how-to-setup-a-dedicated-web-server-for-free/&lt;br /&gt;
* http://www.yolinux.com/TUTORIALS/LinuxTutorialWebSiteConfig.html&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Kursus]]&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=ITV0110_3._t%C3%B6%C3%B6_2014:_Serverirakendus:_cgi_pythonis&amp;diff=12025</id>
		<title>ITV0110 3. töö 2014: Serverirakendus: cgi pythonis</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=ITV0110_3._t%C3%B6%C3%B6_2014:_Serverirakendus:_cgi_pythonis&amp;diff=12025"/>
		<updated>2014-11-16T02:34:08Z</updated>

		<summary type="html">&lt;p&gt;Priit: /* Dijkstra server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pilt:Python_logo.jpg|left|Python]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NB!&amp;lt;/font&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Kui sul on probleeme serveris pythoni programmide käimasaamisega, siis loe siit lõpust peatükki &amp;quot;Põhiprobleemid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Mis tuleb teha ==&lt;br /&gt;
&lt;br /&gt;
Sinu ülesandeks on ehitada veebisüsteem, mille kaudu saab teises praksis realiseeritud &amp;lt;b&amp;gt;pig&#039;i üle võrgu mängida&amp;lt;/b&amp;gt;, ehk siis teise praktikumi teema edasiarendus veebirakendusena.&lt;br /&gt;
&lt;br /&gt;
Mängida peab saama kahel viisil, kusjuures esimene variant on kõigile kohustuslik ja annab 6 punkti, teine ei ole kohustuslik ja annab lisaks 6 punkti.&lt;br /&gt;
* Üksi, kuid sedakorda tuleb mängu tulemus - punktid ja mänguaeg - iga kord salvestada serverisse ning serverisse kogunev tulemuste tabel tuleb kasutajale otsitaval/sorditaval viisil välja kuvada&lt;br /&gt;
* Teise inimese vastu, kus samuti tuleks iga mängu tulemused serverisse salvestada.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et selles praktikumis on kõigi ülesannete realiseerimiseks vajalik koodihulk väga väike, samas nõuab tõsist pingutust välja mõelda, kuidas kõiki asju täpselt teha ja esitada ja kuidas nad omavahel kokku käivad. Samuti võtab päris päris palju aega katsetamine ja esmatutvus võõra progekeelega.&lt;br /&gt;
&lt;br /&gt;
Hakka teise inimese vastu mängu tegema alles peale seda, kui üksi masina vastu mängimine on valmis.&lt;br /&gt;
&lt;br /&gt;
== Kuidas serverisse tulemusi salvestada ja sealt kuvada ==&lt;br /&gt;
&lt;br /&gt;
Serverisse andmete salvestamiseks kirjuta nad faili.&lt;br /&gt;
&lt;br /&gt;
Kõigi mängude korral on vaja faili salvestada ka inimese nimi, kes mängis, samuti - kui on vastane - siis vastase nimi. Seega on mängu alustades vaja vormilt sisestada oma nimi, mis siis serveris mängufaili kirjutatakse ja mis mängu ajal ära ei muutu. Nime võib kasutaja valida vabalt, paroole, autentimist jne jne ei ole vaja teha (kuid ei ole ka otse keelatud, peaasi, et sa ei ehitaks seda enne, kui kõik muu valmis).&lt;br /&gt;
&lt;br /&gt;
Mängude kuvamiseks peab sinu pig&#039;i põhilehel olema link &amp;quot;kõik mängud&amp;quot;, kuhu vajutades lähed mängude vaatamise lehele.&lt;br /&gt;
&lt;br /&gt;
Mängude kuvamine on vaja teha nii, et saad sisestada (või boksist valida), kelle mänge ja mis vastasega tahad vaadata (üksi või konkreetse inimese vastu), ja siis kuvatakse ainult need. Ei ole keelatud lisaks ka kõigi mängude kuvamine ja muud täiendused.&lt;br /&gt;
&lt;br /&gt;
Mängude kuvamisel võiksid olla sellised tulbad:&lt;br /&gt;
&lt;br /&gt;
* mängu alustamise kuupäev/aeg &lt;br /&gt;
* mängija 1 nimi&lt;br /&gt;
* mängija 2 nimi: arvutiga mängides jäta see ära&lt;br /&gt;
* mängija 1 punktid&lt;br /&gt;
* mängija 2 punktid&lt;br /&gt;
* mänguaeg sekundites&lt;br /&gt;
&lt;br /&gt;
Mängude sorteerimine on vaja teha nii, et saad tulba pealkirjale vajutada, ning server sorteerib tulemused selle tulba järgi.&lt;br /&gt;
&lt;br /&gt;
Kogu filtreerimine ja sorteerimine tuleb teha serveris, mitte brauseris.&lt;br /&gt;
&lt;br /&gt;
Selles osas on soovitav kasutada harilikku cgi protokolli, mitte ajaxit: samas ei ole ajax siin ka otseselt keelatud.&lt;br /&gt;
&lt;br /&gt;
Täringu veeretamise võid teha brauseris, nagu teises praktikumis, aga võid teha ka serveris. Inimvastase vastu mängides (järgmine peatükk) tuleb täringut igal juhul serveris veeretada.&lt;br /&gt;
&lt;br /&gt;
== Mismoodi käib teise inimese vastu mängimine ==&lt;br /&gt;
&lt;br /&gt;
Teise mängija vastu mängimiseks on vaja teha järgmisi asju:&lt;br /&gt;
* Pead saama kuulutada välja, et soovid mängida (ehk, serveris kuulutuste faili tegema ja sinna inforea lisama). &lt;br /&gt;
* Pead saama vaadata, kes soovivad mängida ja valida neid mängu.&lt;br /&gt;
* Kui veeretad või annad mängukorra üle, siis server peab sinu tegevuse serverisse mängufaili talletama. Vastane ei tee seni midagi.&lt;br /&gt;
* Vastase brauser käib siis kogu aeg serverist ise uurimas, et kas on juba tema mängukord.&lt;br /&gt;
* Kui jah, siis algab tema oma mängukorraga ja kogu tsükkel käivitub uuesti.&lt;br /&gt;
&lt;br /&gt;
Teise mängija vastu mängimise tehnoloogia peab baseeruma ajaxil ehk serveriga andmevahetusel otse javascriptist (vt selle praksi lehe lõpuosa).&lt;br /&gt;
&lt;br /&gt;
Täringu veeretamine peab kindlasti toimuma serveris, mitte, nagu teises praksis, brauseris.&lt;br /&gt;
&lt;br /&gt;
Üksikuid veeretamisi ei ole tingimata vaja serveris salvestada ja teisele mängijale kuvada: piisab veeretamiste ahela lõpptulemusest enne mängukorra üleandmist. Samas ei ole keelatud ka iga ükskiku täringuviske salvestamine ja kuvamine. Vali ise, kumba varianti eelistad kasutada.&lt;br /&gt;
&lt;br /&gt;
== Praktikumi arvestamine ja hindamine ==&lt;br /&gt;
&lt;br /&gt;
Praktikum annab maksimaalselt 12 punkti.&lt;br /&gt;
&lt;br /&gt;
Esimene osa (üksi mängides mängude salvestamine serverisse ja seni mängitud mängude tulemuste kuvamine)&lt;br /&gt;
on kohustuslik osa praktikumist ja nende korralik realiseerimine annab 6 punkti. Praktikumi&lt;br /&gt;
ei arvestata, kui selles osas on suuremad puudujäägid. &lt;br /&gt;
&lt;br /&gt;
Omavahelise mängu realiseerimine (teine osa praksist) annab lisaks kuni 6 punkti ja ei ole kohustuslik.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et selles praktikumis on kõigi ülesannete realiseerimiseks vajalik koodihulk väga väike, samas nõuab tõsist pingutust välja mõelda, kuidas kõiki asju täpselt teha ja esitada ja kuidas nad omavahel kokku käivad. Samuti võtab päris päris palju aega katsetamine ja esmatutvus võõra progekeelega.&lt;br /&gt;
&lt;br /&gt;
== Tehnoloogilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
* Kõik serverirakendused tuleb realiseerida [http://www.python.org/ Pythonis].&lt;br /&gt;
* Rakendus peab olema võrgus vabalt brauseriga ligipääsetav, mitte lihtsalt töötama näiteks sinu laptopis.&lt;br /&gt;
* Serverarvutina tuleb kasutada dijkstrat, rakenduse failid tuleb kopeerida kataloogidesse public_html/prax3 ja public_html/cgi-bin/prax3&lt;br /&gt;
* Serveris tuleb infot hoida ühes või mitmes mängutulemuste failis.&lt;br /&gt;
* Kasutada tuleb nimelt lihtsaid inimloetavaid faile, andmebaasimootoreid kasutada ei tohi (andmebaasimootorite jaoks on neljas praks).&lt;br /&gt;
* Loodud veebilehed peavad sisaldama html-i, css-i ja javascripti (pluss pilte), javat ja flashi jne kasutada ei tohi.&lt;br /&gt;
* Teise mängija vastu mängimine peab kasutama ajaxit ehk andmevahetust serveriga otse javascriptist. Üksi mängimine ei pea kasutama ajaxit, kuid keelatud see ei ole.&lt;br /&gt;
&lt;br /&gt;
Turvaküsimustega ei pea selles praksis tegelema! Seega on täiesti ok, kui mängija &lt;br /&gt;
saab ise anda cgi-le parameetrid näiteks võõra mängu kohta ja sellega teiste&lt;br /&gt;
mängu ära rikkuda, pettusi teha jne. Turvaküsimused oleks selle praksi jaoks&lt;br /&gt;
lihtsalt liiga töö- ja tähelepanumahukad.&lt;br /&gt;
&lt;br /&gt;
Miks skriptikeel (siin praksis Python) ja mitte C või Java? Eeskätt seepärast, et C ja Java jaoks juba on eraldi kursused, kus neid kasutatakse. Teiseks seepärast, et skriptikeeltes on väiksemaid/lihtsamaid veebirakendusi veidi mugavam kirjutada, kui kompileeritud keeltes.&lt;br /&gt;
&lt;br /&gt;
Miks just Python? Vaata [http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html Tiobe] progekeelte populaarsuse indeksit: kõige populaarsemad nn skriptikeeled on (peale Javascripti) PHP ja Python. Kummagi jaoks on meil üks praktikum. PHP ja Python on üksteisest ka väga erinevad (Perl ja PHP on hoopis sarnasemad), seega on nad sobivad näited skriptikeelte spektri eri otstest.&lt;br /&gt;
&lt;br /&gt;
== Dijkstra server ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dijktra serverisse ligipääsu, failide laadimise ja linuxi käsureaga hakkamasaamise kohta loe pikemalt [[ITV0110 2. töö 2014: CSS, javascript, veebiserver|teise praktikumi materjalidest]] Dijkstra serveri peatükist, siin neid üle ei korrata.&lt;br /&gt;
&lt;br /&gt;
Oma programmid pane kataloogi &amp;lt;b&amp;gt;public_html/cgi-bin&amp;lt;/b&amp;gt; . Kõigepealt pead selle kataloogi tegema ja talle grupile ligipääsuõiguse andma, analoogiliselt teise praktikumiga.  Mujale pandud programme Apache käima ei pane.&lt;br /&gt;
&lt;br /&gt;
Kui töös taaskasutatakse teise praktikumi koodi, siis tee sellest uus koopia &amp;lt;b&amp;gt;public_html/prax3&amp;lt;/b&amp;gt; alla. Teise praktikumi töö peab ka alles jääma.&lt;br /&gt;
&lt;br /&gt;
Samuti on sul vaja veidi tutvuda linuxi käsurea elementaarkäskudega (kopeerimine, kustutamine, õiguste muutmine jne) nagu teises praksis soovitatud.&lt;br /&gt;
&lt;br /&gt;
== Soovitused programmeerimiseks ==&lt;br /&gt;
&lt;br /&gt;
Kõigepeal tutvu [[pythoni cgi-d dijkstra serveris: kiire sissejuhatus |  cgi programmide kirjutamise esmaste põhimõtetega loengumaterjalidest]] ja sisuliseks arusaamiseks loe cgi loengu materjalide alt teisi materjale lisaks.&lt;br /&gt;
&lt;br /&gt;
=== Python ===&lt;br /&gt;
&lt;br /&gt;
Kui sa ei ole varem Pythonis cgi-sid programmeerinud, tutvu kõigepealt Pythoni keele ja&lt;br /&gt;
cgi teegiga: &lt;br /&gt;
&lt;br /&gt;
* loe [http://docs.python.org/tutorial/ Pythoni tutoriali] algust (keerulised andmestruktuurid, moodulite ja klasside värgi võid esialgu lugemata jätta)&lt;br /&gt;
* võib-olla parima pythonis cgi programmeerimise kiirtutoriali [http://www.tutorialspoint.com/python/python_cgi_programming.htm leiad siit]&lt;br /&gt;
* see [http://www.cs.virginia.edu/~lab2q/lesson_1/ pythoni cgi tutorial] annab ka pythoni keele jaoks ok sissejuhatuse&lt;br /&gt;
*lLisadetailide jaoks vaata [http://docs.python.org/library/cgi.html cgi teegi õpetust].&lt;br /&gt;
&lt;br /&gt;
Hea mõte on paralleelselt teha lahti Pythoni interpretaator ja katsetada kõrvale asju&lt;br /&gt;
otse Pythoni käsureal. Kui su masinas Pythonit pole, siis installeeri!&lt;br /&gt;
&lt;br /&gt;
Paljud kasulikud asjad on kirjas Pythoni&lt;br /&gt;
[http://docs.python.org/library/index.html#library-index teegi dokumentatsioonis].&lt;br /&gt;
Konkreetsete küsimuste korral aitab tihti googeldamine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;NB!&amp;lt;/b&amp;gt; Pythonil on väga palju teeke ja mitmeid mittetriviaalseid keelekonstruktsioone.&lt;br /&gt;
Sul ei lähe rõhuvat enamust nendest vaja, praktikumiks piisab väga esmastest asjadest (listid,&lt;br /&gt;
stringid, numbrid) ning teekidest ei lähe samuti muud vaja, kui failide lugemine/kirjutamine,&lt;br /&gt;
stringioperatsioonid ja cgi. Ära kuluta kohe aega kõigi Pythoni teekide ja detailide uurimisele,&lt;br /&gt;
pigem alusta peale esmast tutvust koodi kirjutamist.&lt;br /&gt;
&lt;br /&gt;
Arvesta, et dijkstra serveris on installeeritud Python 2.7.3, seega väldi Python 3 spetsiifiliste&lt;br /&gt;
asjade kasutamist (vt [http://docs.python.org/py3k/whatsnew/3.0.html erinevusi 2 ja 3 sarja vahel]), &lt;br /&gt;
muidu võib tekkida komplikatsioone programmide viimisel dijkstrasse. Kui sa midagi eriti keerulist&lt;br /&gt;
ei tee, siis ei tohiks 3 sarja programmide ja 2 sarja interpretaatoriga siiski suuremaid probleeme tekkida.&lt;br /&gt;
&lt;br /&gt;
Kirjuta mõni väike näiteprogramm ja katseta serveris, kuhu lõpuks süsteemi üles&lt;br /&gt;
paned (kas siis dijkstra või oma isiklik lemmikserver).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kasulikud Pythoni näitejupid cgi jaoks ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Vaata kindlasti&amp;lt;/font&amp;gt; [[Kasulikke pythoni näitejuppe cgi jaoks]]. Nendes näidetes toodud konstruktsioonidest ja funktsioonidest peaks kolmanda praksi jaoks piisama.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Python + CGI ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vormidelt saadetud data kasutamiseks on Pythonis tore imporditav moodul nimega cgi, mille funktsioonid aitavad vormiinfot söödavamal kujul sisse võtta. &lt;br /&gt;
&lt;br /&gt;
Looge fail test2.py:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 import cgi&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;Content-type: text/html&amp;quot;&lt;br /&gt;
 print&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;head&amp;amp;gt;&amp;amp;lt;title&amp;amp;gt;test2.py&amp;amp;lt;/title&amp;amp;gt;&amp;amp;lt;/head&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;amp;lt;h1&amp;amp;gt;Hello, World!&amp;amp;lt;/h1&amp;amp;gt;&amp;amp;lt;p&amp;amp;gt;Lisaparameeter oli &amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 formdata = cgi.FieldStorage()&lt;br /&gt;
 if formdata.has_key(&amp;quot;lisaparameeter&amp;quot;):&lt;br /&gt;
   print formdata[&#039;lisaparameeter&#039;].value&lt;br /&gt;
 else:&lt;br /&gt;
   print &amp;quot;puudu&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;.&amp;amp;lt;/p&amp;amp;gt;&amp;amp;lt;/body&amp;amp;gt;&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
Vaadake faili brauseris:&amp;lt;br&amp;gt;&lt;br /&gt;
http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/test2.py&lt;br /&gt;
&lt;br /&gt;
Parandage faili õigused omaette kirudes, et seda unustati teile teisel korral öelda ja vaadake uuesti.&lt;br /&gt;
&lt;br /&gt;
http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/test2.py&lt;br /&gt;
http://dijkstra.cs.ttu.ee/~t0XXX/cgi-bin/test2.py?lisaparameeter=olemas&lt;br /&gt;
&lt;br /&gt;
Tasub vaadata ka  [[Kasulikke pythoni näitejuppe cgi jaoks]].&lt;br /&gt;
&lt;br /&gt;
=== Arendamine oma või arvutiklassi arvutitel ===&lt;br /&gt;
&lt;br /&gt;
Kuna sinu süsteem peab lõpuks töötama avalikul veebiserveril, kuid arendust teed&lt;br /&gt;
oma või arvutiklassi arvutitel, siis kuidas oleks mõistlik tööd korralda?&lt;br /&gt;
&lt;br /&gt;
Peamised variandid on sellised (vaata jällegi lisadetaile  [[ITV0110 2. töö: CSS, javascript, veebiserver|teise praktikumi materjalidest]] Dijkstra serveri peatükist):&lt;br /&gt;
&lt;br /&gt;
* Kirjutad kõik otse serveris, kasutades sisselogimiseks Putty-t (windows) või  ssh-d (linux) ja serveris kasutad redaktoriks näiteks vi-d. Aitab, kui teed lahti mitu akent. Kõige universaalsem viis, aga suhteliset ebamugav, samuti nõuab vi õppimist, mis võtab aega. Võimalik alternatiiv vi-le serveris on nano.&lt;br /&gt;
&lt;br /&gt;
* Kirjutad faile oma masinas redaktoriga, mis lubab üle võrgu faile avada ja sulgeda, windowsis näiteks [http://winscp.net/eng/docs/ui_editor winscp] abil. Katsetamiseks ja testimiseks hoiad lahti sisse logitud aknaid nagu eelmises variandis. See on &amp;lt;b&amp;gt;suhteliselt mugav viis&amp;lt;/b&amp;gt; kui sa ei taha järgmisena kirjeldatud meetodeid - mis veidi pikemas perspektiivis on paremad - kasutada.&lt;br /&gt;
&lt;br /&gt;
* Arendad süsteemi võimalikult lõpuni windowsis valmis ja siis kannad üle serverisse ja teed vajalikke muutusi. Selleks installeeri oma arvutis [http://www.python.org/download/windows/ python windowsile], arvutiklassides peaks see juba olemas olema. Väga abiks oleks seejuures ka veebiserveri installeerimine, näiteks&lt;br /&gt;
** [http://www.editrocket.com/articles/python_apache_windows.html apache saab panna käima windowsile]. &lt;br /&gt;
** Microsofti oma veebiserveri saab panna pythoni cgi-sid käivitama, vt [http://support.microsoft.com/kb/276494 siit] &lt;br /&gt;
** Mh on ka Pythoni teekide hulgas veebiserver olemas ja kasutatav:  vaata [http://docs.python.org/library/simplehttpserver.html#module-SimpleHTTPServer SimpleHTTPServer] ja [http://docs.python.org/library/cgihttpserver.html cgihttpserver].&lt;br /&gt;
&lt;br /&gt;
* Kui sul on oma arvutis windows ja põhiliselt kasutad seda, siis kõige soovitavam ja pikemas perspektiivis mõistlikum viis on installeerida windowsile lisaks [http://www.ubuntu.com/download/desktop ubuntu linux]&lt;br /&gt;
&lt;br /&gt;
* Ja loomulikult on võimalik kasutada oma masinas mõnda standalone unixt: linuxit, mõnda bsd-d, mac os X vms kas ainsa süsteemina või dual bootina. Kui kirjutad palju ja tihti koodi linuxi serverite jaoks, siis on see tõenäoliselt kõige mõistlikum variant.&lt;br /&gt;
&lt;br /&gt;
=== Tegelik koodikirjutamine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Kõige olulisem soovitus&amp;lt;/b&amp;gt;: alusta ülesande esimesest osast - oma mängu tulemuse salvestamine serverisse - ja tee seejärel&lt;br /&gt;
valmis salvestatud faili lihtne kuvamine brauseris.&lt;br /&gt;
&lt;br /&gt;
Kui see korralikult käib, &lt;br /&gt;
siis täienda esialgset funktsionaalsust vastavalt nõuetele ülal.&lt;br /&gt;
&lt;br /&gt;
Ära hakka korraga palju funktsionaalsust programmeerima: tee üks väike osa juurde, katseta&lt;br /&gt;
läbi ja paranda, ning alles seejärel lisa järgmine tükk funktsionaalsust jne.&lt;br /&gt;
&lt;br /&gt;
Ehk, selles järjekorras:&lt;br /&gt;
* väike katseprogramm a la hello world (võid ta kopeerida ülal viidatud koodinäidetest)&lt;br /&gt;
* oma mängu tulemuse salvestamine serveris olevasse faili&lt;br /&gt;
* tulemusfaili kuvamine&lt;br /&gt;
* salvestamise/kuvamise integreerimine mängu põhilehega&lt;br /&gt;
* vastase vastu mängimine&lt;br /&gt;
* täringuviske genereerimine serveris pythoniga, mitte brauseris javascriptiga&lt;br /&gt;
* mängufailide kuvamise täiendamine vastasega variandi jaoks&lt;br /&gt;
&lt;br /&gt;
Süsteemis on hulk funktsionaalsust, mis nõuaks justkui hulga erinevate cgi-de tegemist. &lt;br /&gt;
Üks variant süsteemi ehitada ongi teha mitu cgi-d, teine - üldiselt parem - variant on aga teha üks (või paar)&lt;br /&gt;
cgi-d, mis saavad vormidelt ette hidden väljale pandud operatsiooninime &lt;br /&gt;
(a la myprog.cgi?op=storetofile&amp;amp;name=John ...) ja siis kutsuvad välja operatsiooninimele&lt;br /&gt;
vastavat funktsiooni sellessamas cgi-s.&lt;br /&gt;
&lt;br /&gt;
=== HTML tekst programmis või eraldi failides ===&lt;br /&gt;
&lt;br /&gt;
Kuna sinu programm peab kokku panema ja lõpuks välja trükkima hulga html teksti, tekib küsimus, et kuidas seda paremini teha. Üldiselt on siin järgmised erinevad viisid või põhimõtted:&lt;br /&gt;
* Kõige lihtsam ja väga väikeste programmide korral kõige mugavam on panna html teksti jupid otse programmi muutujate väärtusteks umbes nii (näide on väga lihtsustatud, praktikas oleks juppe ja muutujaid rohkem):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
myresult=2&lt;br /&gt;
yourresult=1&lt;br /&gt;
header=&amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;quot;&lt;br /&gt;
html1=&amp;quot;minu tulemus on &amp;quot;&lt;br /&gt;
html2=&amp;quot; ja sinu tulemus on &amp;quot;&lt;br /&gt;
footer=&amp;quot;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
res=header+html1+str(myresult)+html2+str(yourresult)+footer&lt;br /&gt;
print res&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Kui htmli on rohkem ja programm veidi keerulisem, siis on vastupidi, praktilisem mitte panna kõiki htmli juppe programmi sisse, vaid lugeda html tekst eraldi failist ja siis asendada hulga lõike/juppe hetkel vajalikuks. Asendamiseks mõtle lihtsalt välja endale meeldivad marker-tekstijupid, mida htmlis mujal ei esine, ja tee stringiasendusi. Näiteks, kui su html on failis kpktemplate.html ja oled sinna pannud markerid {myresult} ja {yourresult} siis näeks kasutus välja umbes nii:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
myresult=2&lt;br /&gt;
yourresult=1&lt;br /&gt;
f=open(&#039;kpktemplate.html&#039;,&#039;r&#039;)&lt;br /&gt;
template=f.read()&lt;br /&gt;
f.close()&lt;br /&gt;
template=template.replace(&amp;quot;{myresult}&amp;quot;,str(myresult))&lt;br /&gt;
template=template.replace(&amp;quot;{yourresult}&amp;quot;,str(yourresult))&lt;br /&gt;
print template&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Sellise lihtsa stringiasenduse asemel võib kasutada pythonisse sisse ehitatud eraldi templatefunktsioone või ka keerulisemaid ja vägevamaid väliseid templateteeke (mako jms), mis teevad suurtes kogustes asendamisi efektiivsemalt ja mugavamalt ja lubavad template sisse programmijuppe kirjutada. Meie väikese praksiülesande jaoks oleks need vägevamad templatesüsteemid aga pigem overkill, st saadud lisamugavused asenduste tegemiseks tõenäoliselt ei kaaluks üles ajakulu/pingutust nende süsteemide uurimisele.&lt;br /&gt;
&lt;br /&gt;
=== Andmete esitamine ja kasutamine serveris ===&lt;br /&gt;
&lt;br /&gt;
Info salvestamise failid on soovitav luua õigustega, kus kõik võivad faili lugeda ja kirjutada. See on turvalisuse mõttes halb, aga arendamise/debugimise mõttes hea. Siis saad ligi ise ja saavad ligi sinu programmid. Käsurealt saad teha nii:&lt;br /&gt;
&lt;br /&gt;
     chmod a+rw myfile.txt&lt;br /&gt;
&lt;br /&gt;
Täiesti võimalik on olukord, kus Apache poolt käivitatav cgi programm ei ole nõus sinu kataloogis uusi faile tegema: siis tuleks kas muuta oma kataloogi õigusi kõigile loetavaks/kirjutatavaks või teha failid&lt;br /&gt;
mõnda kataloogi, kus apachel on õigused (ntx /tmp, kuid siis tuleks nende nimele panna ntx sufiksiks sinu matriklinumber, et teistega segi ei läheks).&lt;br /&gt;
&lt;br /&gt;
Failile kirje lisamiseks võid kirjutada uue kirje lihtsalt faili lõppu uueks reaks. Vanu&lt;br /&gt;
kirjeid pole kunagi vaja muuta!&lt;br /&gt;
&lt;br /&gt;
Igale kirjele võib panna lisaväljana (ntx esimeseks) kaasa kirje loomise aeg.&lt;br /&gt;
&lt;br /&gt;
Faili lugemisel on üldiselt hea mõte kasutada &lt;br /&gt;
[http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files f.readline()]&lt;br /&gt;
funktsiooni, võid soovi korral kasutada ka &lt;br /&gt;
[http://docs.python.org/library/csv.html csv] teeki, mille abil faili tabeliks lahti hakkimine&lt;br /&gt;
nõuab veidi vähem koodikirjutamist (aga mitte tingimata palju vähem sinu aega).&lt;br /&gt;
&lt;br /&gt;
Aja määramisel on sul kõige praktilisem kasutada time.time() funktsiooni (otsi see&lt;br /&gt;
[http://docs.python.org/library/time.html mahukast ajateegist] välja: see annab lihtsalt&lt;br /&gt;
aja ühe numbrina, sekundites peale aastat 1970 vms. Selle numbri saad siis lihtsalt faili&lt;br /&gt;
kirjutada, kui tahad aega salvestada. Lugemisel on seda samuti lihtne võrrelda (ja liita/lahutada) hetkeajaga. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;NB!&amp;lt;/b&amp;gt; Ära hakka jändama keerukate aasta/minuti/ajatsooni jne jne meetoditega: need&lt;br /&gt;
on keerulised, nende uurimine võtab hulga aega ja praksis neid vaja ei lähe (mis ei tähenda,&lt;br /&gt;
et huvi korral ei võiks neid uurida :).&lt;br /&gt;
&lt;br /&gt;
Stringi muutmine numbriks on lihtne (int(&amp;quot;12&amp;quot;) või float(&amp;quot;12&amp;quot;)) ning samamoodi on lihtne&lt;br /&gt;
numbri muutmine stringiks (string(12) või string(12.5)).&lt;br /&gt;
&lt;br /&gt;
=== Vastane: tema leidmine, tema käigu ootamine jms ===&lt;br /&gt;
&lt;br /&gt;
Selle osa lahendamiseks tuleks - tehnoloogia mõttes - kasutada ajaxit ehk andmete saatmist serverile ja sealt lugemist otse javascriptist.&lt;br /&gt;
&lt;br /&gt;
Seletused, ideed ja soovitused lisanduvad selle osa kohta loengute ja praktikumide käigus.&lt;br /&gt;
&lt;br /&gt;
* Loe seotud tehnoloogiatest: [http://en.wikipedia.org/wiki/Ajax_%28programming%29 wikipedia ajax], [http://en.wikipedia.org/wiki/XMLHttpRequest wikipedia xmlhttprequest], [http://en.wikipedia.org/wiki/JSON wikipedia json]&lt;br /&gt;
* [[xmlhttprequest ja jsonile rakendatud eval näited]]&lt;br /&gt;
&lt;br /&gt;
= Põhiprobleemid =&lt;br /&gt;
&lt;br /&gt;
Esimese asjana pane serveris käima väike katseprogramm, näiteks copy-paste see jupp kataloogi public_html/cgi-bin nime all test.py:&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 print &amp;quot;Content-type: text/html&amp;quot;&lt;br /&gt;
 print&lt;br /&gt;
 print &amp;quot;tere!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Logi serverisse sisse, pane ta prooviks käsurealt käima ja siis vaata brauserist ka, urlilt http://dijkstra.cs.ttu.ee/~Eesnimi.Perenimi/cgi-bin/test.py&lt;br /&gt;
&lt;br /&gt;
Kui see ei õnnestu, on sul tõenäoliselt juhtunud mõni - või mitu - järgmistest vigadest:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;a) Debugimiseks on vaja serverisse sisse logida ja käsurealt programm käima panna.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sisse logimiseks loe [[ITV0110 2. töö 2014: CSS, javascript, veebiserver|CSS, javascript, veebiserver]] Dijkstra serveri peatükki. Käimapanekuks:&lt;br /&gt;
&lt;br /&gt;
   cd public_html/cgi-bin&lt;br /&gt;
   ./test.py&lt;br /&gt;
&lt;br /&gt;
Kas läks käima?&lt;br /&gt;
Kas trükkis content-type: text/html ja tühja rea&lt;br /&gt;
selle järel?&lt;br /&gt;
&lt;br /&gt;
Esimese asjana logi serverisse ja pane programm käsurealt käima!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;b) Kui EI lähe üldse käima, st saate vea&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   -bash: ./test.py: Permission denied&lt;br /&gt;
&lt;br /&gt;
siis tuleb õigused panna proge jaoks õigeks:&lt;br /&gt;
&lt;br /&gt;
   chmod a+x test.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;c) Annab sellise vea:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    -bash: ./test.py: /usr/bin/python^M: bad interpreter:&lt;br /&gt;
     No   such file or directory&lt;br /&gt;
&lt;br /&gt;
Siis on sul rea lõpus lisaks line-feed sümbolile ka carriage-return. Korista ta niimoodi ära:&lt;br /&gt;
 &lt;br /&gt;
1. Ava scite menüüs View -&amp;gt; End of line&lt;br /&gt;
või Notepad++ menüüs View -&amp;gt; Show symbol -&amp;gt; show end of line&lt;br /&gt;
&lt;br /&gt;
2. Vaata, kas esimese rea lõpus on ainult LF (õige) või CR/LF (vale).&lt;br /&gt;
&lt;br /&gt;
Viimasel juhul: &lt;br /&gt;
&lt;br /&gt;
Scite jaoks:&lt;br /&gt;
&lt;br /&gt;
 1) Options -&amp;gt; Line end characters -&amp;gt; LF&lt;br /&gt;
 2) Options -&amp;gt; Convert line end characters&lt;br /&gt;
 3) OK? Kui jah, keera View -&amp;gt; end of line maha&lt;br /&gt;
&lt;br /&gt;
Notepad++ jaoks:&lt;br /&gt;
 &lt;br /&gt;
 1) Edit -&amp;gt; EOL conversion -&amp;gt; Unix/osX format&lt;br /&gt;
 2) OK? Kui jah, keera View -&amp;gt; Show symbol -&amp;gt; show end of line maha&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;b&amp;gt;d) Annab mõne muu vea, millest paistab, et python käima ei läinud.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sul võib olla rea alguses mingi veider sümbol, mida redaktor välja ei näita.&lt;br /&gt;
&lt;br /&gt;
Kontrolli serveri poolelt vaadates, st olles serveris progega samas kataloogis, ütle&lt;br /&gt;
&lt;br /&gt;
  less test.py&lt;br /&gt;
&lt;br /&gt;
ja vaata, kas esimene rida paistab ok või on seal midagi veidrat. Kui on midagi veidrat, kustuta oma redaktoris esimene rida üldse maha või tee nullist pisi-katsefail ja lae uuesti üles. Siis vaata uuesti less-ga.&lt;br /&gt;
  &lt;br /&gt;
less-ga vaatamisest saad välja, kui vajutad tähte q (nagu quit)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;e) Annab vea, mille teksti sees on &amp;quot;SyntaxError: invalid syntax&amp;quot;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Siis ongi sinu koodis süntaksiviga. Sama veateade ütleb mh, kus viga on (mitmendal real) ja näitab lühidalt kahtlast kohta koodis, umbes nii:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   File &amp;quot;./try.py&amp;quot;, line 4&lt;br /&gt;
      if 1==2&lt;br /&gt;
          ^&lt;br /&gt;
   SyntaxError: invalid syntax&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Süntaksiveaga programm kuvab veebist vaadates &amp;quot;Internal server error&amp;quot; (sest ta ei trüki &amp;quot;content-type: ...&amp;quot; rida)&lt;br /&gt;
&lt;br /&gt;
Paranda süntaksiviga ära ja katseta käsurealt uuesti!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;f) Annab sellise vea&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   File &amp;quot;./test3.py&amp;quot;, line 4&lt;br /&gt;
   SyntaxError: Non-ASCII character &#039;\xfc&#039; in file ./test3.py &lt;br /&gt;
   on line 4, but no encoding declared; see  &lt;br /&gt;
   http://www.python.org   &lt;br /&gt;
   /peps/pep-0263.html for details&lt;br /&gt;
  &lt;br /&gt;
Pythonile tuleb öelda täpitähtede kodeering:&lt;br /&gt;
  &lt;br /&gt;
Pane algusse nii:&lt;br /&gt;
  &lt;br /&gt;
   #!/usr/bin/python&lt;br /&gt;
   # -*- coding: iso-8859-1 -*-&lt;br /&gt;
&lt;br /&gt;
 või&lt;br /&gt;
 &lt;br /&gt;
   #!/usr/bin/python&lt;br /&gt;
   # -*- coding: utf-8 -*- &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;g) Käsurealt läheb OK käima, Content-type: text/html on olemas, järgmine rida on tühi, aga brauseris kuvatakse programmi source!&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sel juhul oled pannud programmi otse public_html või public_html/prax3/ alla vms, aga peaks olema public_html/cgi-bin või public_html/cgi-bin/prax3/ all. Tõsta ta õigesse kataloogi!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;h) Käsurealt läheb OK käima,aga brauseris kuvatakse &amp;quot;Internal server error&amp;quot;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kui varasemad võimalikud probleemid on lahendatud (panid käsurealt käima?) siis võiboll ei trüki programm kohe esimese reana &amp;quot;content-type: text/html&amp;quot; (ilma jutumärkideta) või ei trüki selle järele tühja rida.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;i) Käsurealt läks käima, aga brauserist näen viga tekstiga &amp;quot;Forbidden ..&amp;quot;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Umbes nii:&lt;br /&gt;
&lt;br /&gt;
   Forbidden:&lt;br /&gt;
   You don&#039;t have permission to access /~Eesnimi.Perenimi/cgi-bin/test.py on this server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sel juhul ei ole sa - tõenäoliselt - oma programmi pannud kataloogi public_html/cgi-bin/ või on ta seal teise nimega: st, teda lihtsalt ei leita selle urli pealt. Teine variant, et sa ei ole teinud&lt;br /&gt;
&lt;br /&gt;
   chmod a+x test.py&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Kaugõppe näited ja memo ==&lt;br /&gt;
&lt;br /&gt;
[[prax3 lisamemo]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Eelmiste aastate versioonid =&lt;br /&gt;
&lt;br /&gt;
Eelmiste aastate versiooni, mis on mitmes osas sarnased, kuid mitmes osas erinevad: [[ITV0110 3. töö: Serverirakendus: cgi pythonis|2013 aasta]]  [[ITV0110 3. töö 2012: Lihtne serverirakendus: vormid ja cgi| 2012 aasta]] ja&lt;br /&gt;
[[ITV0110 3. töö: Lihtne serverirakendus: vormid ja cgi| 2011 aasta]].&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[[mikromemo]]&lt;br /&gt;
[[mikromemo3]]&lt;br /&gt;
[[mikromemo4]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11887</id>
		<title>Vorgurakendused 2 prax 1 2014</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11887"/>
		<updated>2014-10-09T19:44:59Z</updated>

		<summary type="html">&lt;p&gt;Priit: /* Üldkirjeldus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
[[Pilt:Robot300.jpg|Zombie robot attack]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
P2Net - P2P botnet&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;UUS: 16. oktoober tulge kohale, kui tahate katsetada oma P2Net implementatsiooni ühilduvust teistega. 23. oktoober selleks tõenäoliselt eriti aega pole, kuna kaitsmistel on prioriteet.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ülesandeks on ehitada P2P rakendus P2Net programmide (käsurea kujul) käivitamiseks võõrastes masinates ja rehkendustulemuste kättesaamiseks, mis teeb laviinitaolise otsingu mööda P2Net klient/servereid, isetehtud P2P mehhanismi abil. &lt;br /&gt;
&lt;br /&gt;
Kasutajaliidese hea kvaliteet ei ole praksis oluline.&lt;br /&gt;
&lt;br /&gt;
Huvi korral võid vaadata ka veidi sarnaseid vanu ülesandeid [[Vorgurakendused 2 prax 1 2013 |2013 aasta arhiivis]]  ning sealt edasi vanemaid. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== Üldkirjeldus ==&lt;br /&gt;
&lt;br /&gt;
P2Net võimaldab:&lt;br /&gt;
&lt;br /&gt;
* kasutajal käivitada võõrastes masinatest käsurea. &lt;br /&gt;
* saada tagasi käsurea rehkendatud tulemus(tekst/binary vms blob).&lt;br /&gt;
* idee on selle peale ehitada mingi rakendus, näit:&lt;br /&gt;
** mingite mahukate arvutuste jaotamine masinate vahel ([[#Näiterakendus]])&lt;br /&gt;
** web scrapingu (näit google otsingu) load balancing&lt;br /&gt;
** kaugadministreerimine&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
Rakenduse tegemine P2Net protokolli peale on ka praksi osa.&lt;br /&gt;
&lt;br /&gt;
Võõraste masinate leidmiseks kasutab P2Net järgmist viisi:&lt;br /&gt;
&lt;br /&gt;
* Saadab tema oma masinas oleva faili machines.txt masinatele käsu. machines.txt sees on masinate ip ja pordid json listina kujul &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[&amp;quot;11.22.33.44&amp;quot;,&amp;quot;2345&amp;quot;],...,[&amp;quot;111.222.333.444&amp;quot;,&amp;quot;23456&amp;quot;]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Samamoodi saadab käivitus-päringu P2Net startlehel http://dijkstra.cs.ttu.ee/~priit/P2Net.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)&lt;br /&gt;
* Kui mingi masin saab minu päringu-käsurea kätte, siis ta paneb selle kohapeal käsureal käima ja saadab tulemuse päringu algatanud masinasse.&lt;br /&gt;
* Iga võõras masin, mis algselt minu käest tulnud päringu saab, saadab ta omakorda kõigile talle teadaolevatele edasi, vähendades seejuures nn ttl (time to live) counti, et päringud lõpmatult rändama ei jääks.&lt;br /&gt;
&lt;br /&gt;
Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et sinu P2Net ei pea üldse salvestama võõraste P2Net-ide ip-sid ja porte! Samas ei ole ka kuidagi keelatud (debugimiseks või niisama huvi pärast vms) salvestada teiste P2Net-ide ip-sid, mida saab teada näiteks sulle tulnud päringutest, sulle vastajate ip-dest ja miks mitte ka portscannides :)&lt;br /&gt;
&lt;br /&gt;
== Miks just selline päringu edasisaatmisviis? ==&lt;br /&gt;
&lt;br /&gt;
Põhimõtteliselt saab päringut massidesse P2P meetoditega laiali saata kahel viisil:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Iteratiivne meetod&amp;lt;/b&amp;gt; (antud praksis seda ei kasuta): algne masin küsib tuttavatelt neile tuttavate masinate faile, ja suurendab seeläbi endale teadaolevate masinate hulka. Igalt uuelt teadasaadud masinalt küsib ta jälle selle masina tuttavate faile jne. Teised masinad algset päringut ise kuhugi edasi ei saada. Meetodi pluss on see, et algne masin saab lihtsalt tagada, et päringut ei saadetaks kaks korda samale masinale. Meetodi miinus on see, et kõik masinad võrgus saadavad lõpuks terve neile tuttavate masinate faili algsele masinale: see tähendab väga suurt hulka väga suurte failide saatmisi, mis hakkavad jõhkralt ummistama võrku, ja algse masina väike kanal tõenäoliselt ummistub varsti. Saadud failide ühisosad on väga suured. Halvemal juhul saab algne masin N identset sõnumit, kus igaühes on N ip-d, kus N on kõigi masinate arv, kus jookseb P2Net. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Rekursiivne meetod&amp;lt;/b&amp;gt; (antud praksis nõutud): algne masin saadab oma päringu tuttavatele masinatele, kes selle omakorda enda tuttavatele edasi saadavad jne. Igüks, kes leiab enda failide hulgast vajaliku faili, saadab info algsele masinale (vastasel korral ei saada ta algsele masinale midagi). Algne masin ei suurenda endale teadaolevate masinate hulka. Meetodi pluss on see, et algsele masinale saadetakse tagasi infot ainult siis, kui vajalik info leitakse (väga väike protsent masinaid) ja see info on lühike. Koormus võrgule langeb tugevasti ja algse masina kanal tõenäoliselt ei ummistu. Meetodi miinus on asjaolu, et üks ja sama masin võib saada algse päringu mitu korda eri suundadest, mis jällegi kasvatab võrgu koormust. Seda viimast probleemi saab  mitmel moel leevendada (kuigi mitte täielikult kaotada), eeskätt päringu ttl (time to live) parameetrit kasutades, päringu ahela masinate lisamises päringu parameetrite hulka jne.&lt;br /&gt;
&lt;br /&gt;
Gnutella kasutab rekursiivset meetodit, nii ka meie P2Net. Lihtsakoeline rekursiivne meetod ummistab suure klientide arvu korral võrgu ja sele asemel kasutavad suured P2P süsteemid kas:&lt;br /&gt;
* struktureeritud nn superpeeride süsteemi a la Kazaa ja esialgne Skype, kus rekursiivne päring toimub ainult superpeeride vahel, ja neid on vähe, või&lt;br /&gt;
* väga kavalat nn distributed hash tables (DHT) mehhanismi, a la freenet ja (osaliselt) bittorrent. DHT on üks mitmest bittorrenti poolt kasutatud meetodist, kuigi bittorrenti põhifookus on hoopis faili paralleelse allatõmbamise optimeerimisel mitme masina koostöös, mitte masinate/failide leidmisel. Või:&lt;br /&gt;
* kasutavad masinate leidmiseks eeskätt tsentraalseid servereid, a la esialgne Napster või kaasaegne Skype&lt;br /&gt;
&lt;br /&gt;
== Tehnilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:&lt;br /&gt;
&lt;br /&gt;
* Kogu programm peab töötama kas ITC-maja klassi arvutis või sinu oma läptopis, mis ITC maja klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi. Arusaadavalt võib aga panna P2Net lisaks käima ka suvalistesse välistesse masinatesse.&lt;br /&gt;
* Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit &amp;quot;suurt&amp;quot; http serverit a la apache kasutada ei või. Kõikvõimalike võrguteekide (versus eraldiseisvad veebiserverid) kasutamine on ok, mikroserverite koodi integreerimine oma programmi on ok.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
=== Otsipäringu saatmine ja edasisaatmine ===&lt;br /&gt;
&lt;br /&gt;
Konkreetsele masinale 11.22.33.44 (kus P2Net jookseb pordis 2345) käsu saatmine &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/run?prog=käsurida&amp;amp;sendip=55.66.77.88&amp;amp;sendport=6788&amp;amp;ttl=5&amp;amp;id=wqeqwe23&amp;amp;noask=11.22.33.44_111.222.333.444 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus parameetritel on järgmine sisu:&lt;br /&gt;
&lt;br /&gt;
* prog: käsk&lt;br /&gt;
* sendip: esialgse saatja ip&lt;br /&gt;
* sendport: esialgse saatja port&lt;br /&gt;
* ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)&lt;br /&gt;
* id: optsionaalne päringu identifikaator&lt;br /&gt;
* noask: optsionaalne list masinatest, kellele pole mõtet edastada (eraldajaks alakriips) &lt;br /&gt;
    &lt;br /&gt;
Päringu identifikaator ei pea tingimata üle terve võrgu unikaalne olema - lihtsam on ja ajab asja ära, kui&lt;br /&gt;
on saatva masina piires unikaalne.&lt;br /&gt;
&lt;br /&gt;
prog parameeter peab ilmselt olema urlencoded, näit. midagi taolist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;prog=ipconfig%20/displaydns&amp;amp;...   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GET-päringu vastuseks on õnnestunud päringu korral number 0,&lt;br /&gt;
ebaõnnestunud päringu korral muu (vea)number. Vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
P2Net-le tulnud päringu edasisaatmine käib täpselt sama protokolliga, kuid edasi saadetakse veidi muudetud päring:&lt;br /&gt;
&lt;br /&gt;
* ttl vähendatakse ühe võrra&lt;br /&gt;
* optionaalselt: lisatakse oma masina ip noask parameetrile otsa&lt;br /&gt;
&lt;br /&gt;
Seejuures &amp;lt;b&amp;gt;ei saadeta päringut edasi&amp;lt;/b&amp;gt;, kui sissetulnud ttl oli 1 võ i vähem (st ttl=0 päringuid enam kuhugi ei saadeta)&lt;br /&gt;
&lt;br /&gt;
Seda päringut saab ka brauserist katsetada, kuigi brauser ei saa vastuseks midagi huvitavat peale debugimis-vastuse 0 või mingi veakoodi.&lt;br /&gt;
&lt;br /&gt;
Klientide filtreerimine (juhul kui soovitakse juhtida mingit alamhulka masinatest) toimub programmi&lt;br /&gt;
käsurea kaudu. See osa ei ole kohustuslik vaid tuleneb konkreetsest rakendusest; protokollis see funktsionaalsus ei sisaldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tulemuse tagastamine algsele pärijale ===&lt;br /&gt;
&lt;br /&gt;
Vastus oleks http post meetodiga käivitatud programmi kogu väljundi saatmine algsele küsijale muutmata kujul&lt;br /&gt;
koos lisainfoga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POST-itatud data:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  {&amp;quot;sendip&amp;quot;: &amp;quot;55.66.77.88&amp;quot;, &lt;br /&gt;
    &amp;quot;sendport&amp;quot;: &amp;quot;6788&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;asasasas&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;: &amp;quot;ascii&amp;quot; või &amp;quot;base64&amp;quot;,	  &lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;failisisustring&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
id peaks vastama esialgse saatja antud id-le, juhul kui seda kasutatakse.     &lt;br /&gt;
* id: esialgse päringu id (kui oli algselt antud)&lt;br /&gt;
* content: käsureaprogrammi väljund (kui ei ole plaintext, peaks olema base64-encodetud)&lt;br /&gt;
* encoding: mis formaadis content on&lt;br /&gt;
* sendip: tulemuse saatnud masina ip&lt;br /&gt;
* sendport: tulemuse saatnud masina port&lt;br /&gt;
&lt;br /&gt;
Programm võiks ka mitte crashida, kui id puudu on, kuna id on optional (aga praktiline ja mõtekas on lisada).&lt;br /&gt;
&lt;br /&gt;
Postituse saaja vastab eduka kättesaamise korral arvu 0,&lt;br /&gt;
arusaamatuste korral mõne muu (vea) numbri. Jällegi, vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
== Praksi kaks osa ==&lt;br /&gt;
&lt;br /&gt;
Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:&lt;br /&gt;
&lt;br /&gt;
* Teha http protokolli järgida suutev esmane rakendus.&lt;br /&gt;
* Lisada sinna kogu vajalik funktsionaalsus:&lt;br /&gt;
** P2Net protokolli implementatsioon&lt;br /&gt;
** P2Net peale ehitatud rakendus (nagu data korjamine, web query hajutamine, lihtsustatud remote admin, ...). Vt ka [[#Näiterakendus]].&lt;br /&gt;
&lt;br /&gt;
Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.&lt;br /&gt;
&lt;br /&gt;
== Soovitusi ja ideid ==&lt;br /&gt;
&lt;br /&gt;
Arendamiseks ja testimiseks pead saama jooksutada oma masinas mitut erinevat koopiat omaenda P2Net-st, igaüks oma pordil, igaühel oma konfifail tuttavate masinatega.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on teha P2Net käsurealt käivitavaks nii, et ta võtab kohe käsurealt pordinumbri parameetriks ning loeb siis oma konfifaili vastavast pordinumbrist tuletatud failipathist.&lt;br /&gt;
&lt;br /&gt;
P2Net peab päris kindlasti sisaldama või kasutama http serverit, &lt;br /&gt;
muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.&lt;br /&gt;
&lt;br /&gt;
Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.&lt;br /&gt;
&lt;br /&gt;
C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks &lt;br /&gt;
on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,&lt;br /&gt;
ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja&lt;br /&gt;
[http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.&lt;br /&gt;
&lt;br /&gt;
Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).&lt;br /&gt;
&lt;br /&gt;
Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:&lt;br /&gt;
&lt;br /&gt;
* [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]&lt;br /&gt;
* [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]&lt;br /&gt;
* [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)] &lt;br /&gt;
* [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]&lt;br /&gt;
* [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]&lt;br /&gt;
* [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]&lt;br /&gt;
* [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]&lt;br /&gt;
* [http://tomayko.com/writings/unicorn-is-unix ruby]&lt;br /&gt;
* [http://jacobian.org/writing/python-is-unix/ python]&lt;br /&gt;
* [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]&lt;br /&gt;
* [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]&lt;br /&gt;
&amp;lt;!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Näiterakendus ===&lt;br /&gt;
&lt;br /&gt;
Sisend on list sõnadest (näiteks faili kujul, kus igal real üks unikaalne sõna). Tahaks teada saada, millised neist sõnadest on üksteisega sarnased. Väljund võiks olla mapping, kus on sõna ning siis sellega sarnaste sõnade list. Sellist asja võib vaja minna juhul, kui ma tahan mingit sisenddatat, näiteks veebist scrapetud andmeid, normaliseerida - oletame et ma otsin sõna &amp;quot;serials&amp;quot;, siis võiks mind tegelikult ka huvitada kohad, kus esineb sõna &amp;quot;serial&amp;quot; (süntaktiline sarnasus) või kui ma otsin sõna &amp;quot;truck&amp;quot;, siis mind võib huvitada ka &amp;quot;lorry&amp;quot; (semantiline sarnasus, mida on küll tegelikult suht keeruline tuvastada).&lt;br /&gt;
&lt;br /&gt;
Kuidas sellist mappingut tekitada? Proovime kõiki sõnu üksteisega paarikaupa võrrelda. Näiteks oletame, et mul on sõnad: &amp;lt;code&amp;gt;[&amp;quot;oma&amp;quot;, &amp;quot;masinas&amp;quot;, &amp;quot;mitut&amp;quot;, &amp;quot;erinevat&amp;quot;, &amp;quot;koopiat&amp;quot;, &amp;quot;omaenda&amp;quot;]&amp;lt;/code&amp;gt;. Hakkame võrdlema: &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; ei ole sarnased, &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ei ole sarnased jne. kuni jõuame &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;omaenda&amp;quot;&amp;lt;/code&amp;gt; juurde, mis võiks olla sarnased (see sõltub täpselt sellest, kuidas sarnasus defineeritud on). Sellega on &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; läbi vaadatud, järgmiseks võtame &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt;. Sõnaga &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; pole seda enam tarvis võrrelda, järelikult alustame paarist &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja nõnda edasi kuni lõpuni. Väljund võiks olla näiteks mapping &amp;lt;code&amp;gt;{&amp;quot;oma&amp;quot; : [&amp;quot;omaenda&amp;quot;], &amp;quot;omaenda&amp;quot;: [&amp;quot;oma&amp;quot;]}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Selleks tuleb vaadata &#039;&#039;(n(n-1))/2&#039;&#039; paari, ehk sellel ülesandel on polünomiaalne keerukus &#039;&#039;O(n^2)&#039;&#039;. Mida see tähendab? Kui ma võtan näitena toodud kuuesõnalise listi asemel mingi realistlikuma listi, kus on 6000 sõna, siis aeg, mis selle läbi töötamisele kulub, ei kasva mitte 1000 korda vaid umbkaudu 1000000 korda. Ehk siis suht kerge on jõuda kohta, kus me enam ei viitsi tulemust ära oodata, kuna selle leidmine võtab tunde.&lt;br /&gt;
&lt;br /&gt;
Antud ülesanne kuulub [http://en.wikipedia.org/wiki/Embarrassingly_parallel triviaalselt paralleelsete] ülesannete hulka. Kui meil on 60 masinat käepärast, siis saab töö nii jagada, et iga masin teeb ~1/60 vajaminevatest võrdlustest ning see võiks tuua tööaja tundidest jälle minutite peale tagasi. Kuidas asja võiks P2Neti peal teha:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Partitsioneerimine&#039;&#039;&#039;. Oletame, et me teame, kui palju meil masinaid täpselt P2Net-iga liitunud on. Kui neid masinaid on &#039;&#039;k&#039;&#039;, siis iga masin võiks võtta &#039;&#039;1/k&#039;&#039;-ndiku sõnadest ette ja võrrelda neid kõigi sõnadega. Näiteks kolme masina korral meie kuuesõnalisel näitel võiks üks masin võrrelda sõna &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; kõigi teiste vastu, teine teha seda sõnadega &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;erinevat&amp;quot;&amp;lt;/code&amp;gt; jne. Natuke ressurssi läheb siin raisku selle peale, et ühte paari võrreldakse kaks korda: esimene masin teeb võrdluse &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt;, teine teeb ka &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt;. Selle vältimisega ei ole mõtet vaeva näha, see on pigem kasulik (sellest hiljem veel). Järgmiseks tekib küsimus, kuidas juhtida masinaid nii, et me ei peaks igaühele otse käsku andma. Seda võib lahendada nii: 1.) panen päringule kaasa parameetri &#039;&#039;k&#039;&#039; ja URL-i, kust sisendandmed saab alla tõmmata 2.) iga masin arvutab &amp;lt;code&amp;gt;h=hash(omaip,omaport) % k&amp;lt;/code&amp;gt; ja saab numbri &#039;&#039;h&#039;&#039; mis on vahemikus 0 kuni &#039;&#039;k-1&#039;&#039;. 3.) iga masin teeb sisendandmete listist täpselt iga &#039;&#039;k&#039;&#039;-nda sõna, nihkega &#039;&#039;h&#039;&#039;: kui mul &#039;&#039;h=0&#039;&#039; ja masinaid on kokku 7, siis ma võtan ette sõnad 1,8,15,... .&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sarnasuse arvutamine&#039;&#039;&#039;. Seda võib teha igat moodi, alates [http://en.wikipedia.org/wiki/Levenshtein_distance triviaalsest] kuni [http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits#Natural_language_processing_tools põhjalikuni]; vt ka http://wordnet.princeton.edu/.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Tulemuste kokku korjamine&amp;lt;/b&amp;gt;. Iga masin saadab oma osalise mappingu päringu algatajale. See paneb need kokku umbes nii: kui ühest masinast saadi &amp;lt;code&amp;gt;{&amp;quot;koer&amp;quot;: [&amp;quot;koera&amp;quot;]}&amp;lt;/code&amp;gt; ja teisest &amp;lt;code&amp;gt;{&amp;quot;koerad&amp;quot;: [&amp;quot;koera&amp;quot;]}&amp;lt;/code&amp;gt;, siis me saaks sellest kokku järeldada ka midagi sellist: &amp;lt;code&amp;gt;{&amp;quot;koera&amp;quot;:[&amp;quot;koer&amp;quot;, &amp;quot;koerad&amp;quot;]}&amp;lt;/code&amp;gt;. Mismoodi tulemusi täpselt kokku panna, sõltub natuke, kas teie arust on sarnasuse seos sümmeetriline ja/või transitiivne.&lt;br /&gt;
&lt;br /&gt;
Tähelepanelikumal tudengil võib tekkida küsimus, mis siis saab kui hash collision tekib ning mõni tükk üleliia tehakse ning mõni mitte kordagi. Selle probleemi jätame koduülesandeks, vihjeks ainult, et 1.) P2P rakendustes ei ole niikuinii mõtet loota, et kõik masinad algusest lõpuni ilusti võrgus kättesaadavad on ja ei crashi töö jooksul 2.) partitsioneerimise meetod, mida kasutasime, tekitab teatud ülekattuvuse.&lt;br /&gt;
&lt;br /&gt;
Juhul kui ka selle näiterakenduse uurimine mingeid ideid ei tekitanud, võib ka sellesama asja realiseerida. Tasub ainult tähele panna, et see on tõenäoliselt natuke töömahukam, kui mõni ise välja mõeldud rakendus.&lt;br /&gt;
&lt;br /&gt;
== Firewall ja NAT ==&lt;br /&gt;
&lt;br /&gt;
Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).&lt;br /&gt;
&lt;br /&gt;
Kes P2Net käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte. &lt;br /&gt;
&lt;br /&gt;
Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:&lt;br /&gt;
* Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.&lt;br /&gt;
* UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid].   Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]&lt;br /&gt;
&lt;br /&gt;
NB! Seda kõike ei ole väga lihtne teha ja sinu P2Net (ja ka selle inimese P2Net, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne P2Net veel ei tööta!&lt;br /&gt;
&lt;br /&gt;
Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma P2Net jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Punktiarvestusest ==&lt;br /&gt;
&lt;br /&gt;
Kui P2Net protokoll töötab vastu mõne teise grupi P2Net-i, sellele on realiseeritud mingi&lt;br /&gt;
rakendus ja koodi suudetakse seletada, saab täispunktid.&lt;br /&gt;
&lt;br /&gt;
Kui teiste P2Net-programmidega ei suuda suhelda, aga iseenda koopiatega siiski, siis päris täispunkte ei saa.&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11831</id>
		<title>Vorgurakendused 2 prax 1 2014</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11831"/>
		<updated>2014-10-02T20:29:13Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
[[Pilt:Robot300.jpg|Zombie robot attack]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
P2Net - P2P botnet&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;UUS: 16. oktoober tulge kohale, kui tahate katsetada oma P2Net implementatsiooni ühilduvust teistega. 23. oktoober selleks tõenäoliselt eriti aega pole, kuna kaitsmistel on prioriteet.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ülesandeks on ehitada P2P rakendus P2Net programmide (käsurea kujul) käivitamiseks võõrastes masinates ja rehkendustulemuste kättesaamiseks, mis teeb laviinitaolise otsingu mööda P2Net klient/servereid, isetehtud P2P mehhanismi abil. &lt;br /&gt;
&lt;br /&gt;
Kasutajaliidese hea kvaliteet ei ole praksis oluline.&lt;br /&gt;
&lt;br /&gt;
Huvi korral võid vaadata ka veidi sarnaseid vanu ülesandeid [[Vorgurakendused 2 prax 1 2013 |2013 aasta arhiivis]]  ning sealt edasi vanemaid. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== Üldkirjeldus ==&lt;br /&gt;
&lt;br /&gt;
P2Net võimaldab:&lt;br /&gt;
&lt;br /&gt;
* kasutajal käivitada võõrastes masinatest käsurea. &lt;br /&gt;
* saada tagasi käsurea rehkendatud tulemus(tekst/binary vms blob).&lt;br /&gt;
* idee on selle peale ehitada mingi rakendus, näit:&lt;br /&gt;
** mingite mahukate arvutuste jaotamine masinate vahel ([[#Näiterakendus]])&lt;br /&gt;
** web scrapingu (näit google otsingu) load balancing&lt;br /&gt;
** kaugadministreerimine&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
Rakenduse tegemine P2Net protokolli peale on ka praksi osa.&lt;br /&gt;
&lt;br /&gt;
Võõraste masinate leidmiseks kasutab P2Net järgmist viisi:&lt;br /&gt;
&lt;br /&gt;
* Saadab tema oma masinas oleva faili machines.txt masinatele käsu. machines.txt sees on masinate ip ja pordid json listina kujul &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[&amp;quot;11.22.33.44&amp;quot;,&amp;quot;2345&amp;quot;],...,[&amp;quot;111.222.333.444&amp;quot;,&amp;quot;23456&amp;quot;]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Samamoodi saadab käivitus-päringu P2Net startlehel http://dijkstra.cs.ttu.ee/~tammet/P2Net.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)&lt;br /&gt;
* Kui mingi masin saab minu päringu-käsurea kätte, siis ta paneb selle kohapeal käsureal käima ja saadab tulemuse päringu algatanud masinasse.&lt;br /&gt;
* Iga võõras masin, mis algselt minu käest tulnud päringu saab, saadab ta omakorda kõigile talle teadaolevatele edasi, vähendades seejuures nn ttl (time to live) counti, et päringud lõpmatult rändama ei jääks.&lt;br /&gt;
&lt;br /&gt;
Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et sinu P2Net ei pea üldse salvestama võõraste P2Net-ide ip-sid ja porte! Samas ei ole ka kuidagi keelatud (debugimiseks või niisama huvi pärast vms) salvestada teiste P2Net-ide ip-sid, mida saab teada näiteks sulle tulnud päringutest, sulle vastajate ip-dest ja miks mitte ka portscannides :)&lt;br /&gt;
&lt;br /&gt;
== Miks just selline päringu edasisaatmisviis? ==&lt;br /&gt;
&lt;br /&gt;
Põhimõtteliselt saab päringut massidesse P2P meetoditega laiali saata kahel viisil:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Iteratiivne meetod&amp;lt;/b&amp;gt; (antud praksis seda ei kasuta): algne masin küsib tuttavatelt neile tuttavate masinate faile, ja suurendab seeläbi endale teadaolevate masinate hulka. Igalt uuelt teadasaadud masinalt küsib ta jälle selle masina tuttavate faile jne. Teised masinad algset päringut ise kuhugi edasi ei saada. Meetodi pluss on see, et algne masin saab lihtsalt tagada, et päringut ei saadetaks kaks korda samale masinale. Meetodi miinus on see, et kõik masinad võrgus saadavad lõpuks terve neile tuttavate masinate faili algsele masinale: see tähendab väga suurt hulka väga suurte failide saatmisi, mis hakkavad jõhkralt ummistama võrku, ja algse masina väike kanal tõenäoliselt ummistub varsti. Saadud failide ühisosad on väga suured. Halvemal juhul saab algne masin N identset sõnumit, kus igaühes on N ip-d, kus N on kõigi masinate arv, kus jookseb P2Net. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Rekursiivne meetod&amp;lt;/b&amp;gt; (antud praksis nõutud): algne masin saadab oma päringu tuttavatele masinatele, kes selle omakorda enda tuttavatele edasi saadavad jne. Igüks, kes leiab enda failide hulgast vajaliku faili, saadab info algsele masinale (vastasel korral ei saada ta algsele masinale midagi). Algne masin ei suurenda endale teadaolevate masinate hulka. Meetodi pluss on see, et algsele masinale saadetakse tagasi infot ainult siis, kui vajalik info leitakse (väga väike protsent masinaid) ja see info on lühike. Koormus võrgule langeb tugevasti ja algse masina kanal tõenäoliselt ei ummistu. Meetodi miinus on asjaolu, et üks ja sama masin võib saada algse päringu mitu korda eri suundadest, mis jällegi kasvatab võrgu koormust. Seda viimast probleemi saab  mitmel moel leevendada (kuigi mitte täielikult kaotada), eeskätt päringu ttl (time to live) parameetrit kasutades, päringu ahela masinate lisamises päringu parameetrite hulka jne.&lt;br /&gt;
&lt;br /&gt;
Gnutella kasutab rekursiivset meetodit, nii ka meie P2Net. Lihtsakoeline rekursiivne meetod ummistab suure klientide arvu korral võrgu ja sele asemel kasutavad suured P2P süsteemid kas:&lt;br /&gt;
* struktureeritud nn superpeeride süsteemi a la Kazaa ja esialgne Skype, kus rekursiivne päring toimub ainult superpeeride vahel, ja neid on vähe, või&lt;br /&gt;
* väga kavalat nn distributed hash tables (DHT) mehhanismi, a la freenet ja (osaliselt) bittorrent. DHT on üks mitmest bittorrenti poolt kasutatud meetodist, kuigi bittorrenti põhifookus on hoopis faili paralleelse allatõmbamise optimeerimisel mitme masina koostöös, mitte masinate/failide leidmisel. Või:&lt;br /&gt;
* kasutavad masinate leidmiseks eeskätt tsentraalseid servereid, a la esialgne Napster või kaasaegne Skype&lt;br /&gt;
&lt;br /&gt;
== Tehnilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:&lt;br /&gt;
&lt;br /&gt;
* Kogu programm peab töötama kas ITC-maja klassi arvutis või sinu oma läptopis, mis ITC maja klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi. Arusaadavalt võib aga panna P2Net lisaks käima ka suvalistesse välistesse masinatesse.&lt;br /&gt;
* Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit &amp;quot;suurt&amp;quot; http serverit a la apache kasutada ei või. Kõikvõimalike võrguteekide (versus eraldiseisvad veebiserverid) kasutamine on ok, mikroserverite koodi integreerimine oma programmi on ok.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
=== Otsipäringu saatmine ja edasisaatmine ===&lt;br /&gt;
&lt;br /&gt;
Konkreetsele masinale 11.22.33.44 (kus P2Net jookseb pordis 2345) käsu saatmine &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/run?prog=käsurida&amp;amp;sendip=55.66.77.88&amp;amp;sendport=6788&amp;amp;ttl=5&amp;amp;id=wqeqwe23&amp;amp;noask=11.22.33.44_111.222.333.444 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus parameetritel on järgmine sisu:&lt;br /&gt;
&lt;br /&gt;
* prog: käsk&lt;br /&gt;
* sendip: esialgse saatja ip&lt;br /&gt;
* sendport: esialgse saatja port&lt;br /&gt;
* ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)&lt;br /&gt;
* id: optsionaalne päringu identifikaator&lt;br /&gt;
* noask: optsionaalne list masinatest, kellele pole mõtet edastada (eraldajaks alakriips) &lt;br /&gt;
    &lt;br /&gt;
Päringu identifikaator ei pea tingimata üle terve võrgu unikaalne olema - lihtsam on ja ajab asja ära, kui&lt;br /&gt;
on saatva masina piires unikaalne.&lt;br /&gt;
&lt;br /&gt;
prog parameeter peab ilmselt olema urlencoded, näit. midagi taolist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;prog=ipconfig%20/displaydns&amp;amp;...   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GET-päringu vastuseks on õnnestunud päringu korral number 0,&lt;br /&gt;
ebaõnnestunud päringu korral muu (vea)number. Vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
P2Net-le tulnud päringu edasisaatmine käib täpselt sama protokolliga, kuid edasi saadetakse veidi muudetud päring:&lt;br /&gt;
&lt;br /&gt;
* ttl vähendatakse ühe võrra&lt;br /&gt;
* optionaalselt: lisatakse oma masina ip noask parameetrile otsa&lt;br /&gt;
&lt;br /&gt;
Seejuures &amp;lt;b&amp;gt;ei saadeta päringut edasi&amp;lt;/b&amp;gt;, kui sissetulnud ttl oli 1 võ i vähem (st ttl=0 päringuid enam kuhugi ei saadeta)&lt;br /&gt;
&lt;br /&gt;
Seda päringut saab ka brauserist katsetada, kuigi brauser ei saa vastuseks midagi huvitavat peale debugimis-vastuse 0 või mingi veakoodi.&lt;br /&gt;
&lt;br /&gt;
Klientide filtreerimine (juhul kui soovitakse juhtida mingit alamhulka masinatest) toimub programmi&lt;br /&gt;
käsurea kaudu. See osa ei ole kohustuslik vaid tuleneb konkreetsest rakendusest; protokollis see funktsionaalsus ei sisaldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tulemuse tagastamine algsele pärijale ===&lt;br /&gt;
&lt;br /&gt;
Vastus oleks http post meetodiga käivitatud programmi kogu väljundi saatmine algsele küsijale muutmata kujul&lt;br /&gt;
koos lisainfoga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POST-itatud data:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  {&amp;quot;sendip&amp;quot;: &amp;quot;55.66.77.88&amp;quot;, &lt;br /&gt;
    &amp;quot;sendport&amp;quot;: &amp;quot;6788&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;asasasas&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;: &amp;quot;ascii&amp;quot; või &amp;quot;base64&amp;quot;,	  &lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;failisisustring&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
id peaks vastama esialgse saatja antud id-le, juhul kui seda kasutatakse.     &lt;br /&gt;
* id: esialgse päringu id (kui oli algselt antud)&lt;br /&gt;
* content: käsureaprogrammi väljund (kui ei ole plaintext, peaks olema base64-encodetud)&lt;br /&gt;
* encoding: mis formaadis content on&lt;br /&gt;
* sendip: tulemuse saatnud masina ip&lt;br /&gt;
* sendport: tulemuse saatnud masina port&lt;br /&gt;
&lt;br /&gt;
Programm võiks ka mitte crashida, kui id puudu on, kuna id on optional (aga praktiline ja mõtekas on lisada).&lt;br /&gt;
&lt;br /&gt;
Postituse saaja vastab eduka kättesaamise korral arvu 0,&lt;br /&gt;
arusaamatuste korral mõne muu (vea) numbri. Jällegi, vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
== Praksi kaks osa ==&lt;br /&gt;
&lt;br /&gt;
Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:&lt;br /&gt;
&lt;br /&gt;
* Teha http protokolli järgida suutev esmane rakendus.&lt;br /&gt;
* Lisada sinna kogu vajalik funktsionaalsus:&lt;br /&gt;
** P2Net protokolli implementatsioon&lt;br /&gt;
** P2Net peale ehitatud rakendus (nagu data korjamine, web query hajutamine, lihtsustatud remote admin, ...). Vt ka [[#Näiterakendus]].&lt;br /&gt;
&lt;br /&gt;
Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.&lt;br /&gt;
&lt;br /&gt;
== Soovitusi ja ideid ==&lt;br /&gt;
&lt;br /&gt;
Arendamiseks ja testimiseks pead saama jooksutada oma masinas mitut erinevat koopiat omaenda P2Net-st, igaüks oma pordil, igaühel oma konfifail tuttavate masinatega.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on teha P2Net käsurealt käivitavaks nii, et ta võtab kohe käsurealt pordinumbri parameetriks ning loeb siis oma konfifaili vastavast pordinumbrist tuletatud failipathist.&lt;br /&gt;
&lt;br /&gt;
P2Net peab päris kindlasti sisaldama või kasutama http serverit, &lt;br /&gt;
muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.&lt;br /&gt;
&lt;br /&gt;
Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.&lt;br /&gt;
&lt;br /&gt;
C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks &lt;br /&gt;
on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,&lt;br /&gt;
ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja&lt;br /&gt;
[http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.&lt;br /&gt;
&lt;br /&gt;
Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).&lt;br /&gt;
&lt;br /&gt;
Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:&lt;br /&gt;
&lt;br /&gt;
* [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]&lt;br /&gt;
* [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]&lt;br /&gt;
* [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)] &lt;br /&gt;
* [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]&lt;br /&gt;
* [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]&lt;br /&gt;
* [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]&lt;br /&gt;
* [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]&lt;br /&gt;
* [http://tomayko.com/writings/unicorn-is-unix ruby]&lt;br /&gt;
* [http://jacobian.org/writing/python-is-unix/ python]&lt;br /&gt;
* [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]&lt;br /&gt;
* [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]&lt;br /&gt;
&amp;lt;!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Näiterakendus ===&lt;br /&gt;
&lt;br /&gt;
Sisend on list sõnadest (näiteks faili kujul, kus igal real üks unikaalne sõna). Tahaks teada saada, millised neist sõnadest on üksteisega sarnased. Väljund võiks olla mapping, kus on sõna ning siis sellega sarnaste sõnade list. Sellist asja võib vaja minna juhul, kui ma tahan mingit sisenddatat, näiteks veebist scrapetud andmeid, normaliseerida - oletame et ma otsin sõna &amp;quot;serials&amp;quot;, siis võiks mind tegelikult ka huvitada kohad, kus esineb sõna &amp;quot;serial&amp;quot; (süntaktiline sarnasus) või kui ma otsin sõna &amp;quot;truck&amp;quot;, siis mind võib huvitada ka &amp;quot;lorry&amp;quot; (semantiline sarnasus, mida on küll tegelikult suht keeruline tuvastada).&lt;br /&gt;
&lt;br /&gt;
Kuidas sellist mappingut tekitada? Proovime kõiki sõnu üksteisega paarikaupa võrrelda. Näiteks oletame, et mul on sõnad: &amp;lt;code&amp;gt;[&amp;quot;oma&amp;quot;, &amp;quot;masinas&amp;quot;, &amp;quot;mitut&amp;quot;, &amp;quot;erinevat&amp;quot;, &amp;quot;koopiat&amp;quot;, &amp;quot;omaenda&amp;quot;]&amp;lt;/code&amp;gt;. Hakkame võrdlema: &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; ei ole sarnased, &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ei ole sarnased jne. kuni jõuame &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;omaenda&amp;quot;&amp;lt;/code&amp;gt; juurde, mis võiks olla sarnased (see sõltub täpselt sellest, kuidas sarnasus defineeritud on). Sellega on &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; läbi vaadatud, järgmiseks võtame &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt;. Sõnaga &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; pole seda enam tarvis võrrelda, järelikult alustame paarist &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja nõnda edasi kuni lõpuni. Väljund võiks olla näiteks mapping &amp;lt;code&amp;gt;{&amp;quot;oma&amp;quot; : [&amp;quot;omaenda&amp;quot;], &amp;quot;omaenda&amp;quot;: [&amp;quot;oma&amp;quot;]}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Selleks tuleb vaadata &#039;&#039;(n(n-1))/2&#039;&#039; paari, ehk sellel ülesandel on polünomiaalne keerukus &#039;&#039;O(n^2)&#039;&#039;. Mida see tähendab? Kui ma võtan näitena toodud kuuesõnalise listi asemel mingi realistlikuma listi, kus on 6000 sõna, siis aeg, mis selle läbi töötamisele kulub, ei kasva mitte 1000 korda vaid umbkaudu 1000000 korda. Ehk siis suht kerge on jõuda kohta, kus me enam ei viitsi tulemust ära oodata, kuna selle leidmine võtab tunde.&lt;br /&gt;
&lt;br /&gt;
Antud ülesanne kuulub [http://en.wikipedia.org/wiki/Embarrassingly_parallel triviaalselt paralleelsete] ülesannete hulka. Kui meil on 60 masinat käepärast, siis saab töö nii jagada, et iga masin teeb ~1/60 vajaminevatest võrdlustest ning see võiks tuua tööaja tundidest jälle minutite peale tagasi. Kuidas asja võiks P2Neti peal teha:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Partitsioneerimine&#039;&#039;&#039;. Oletame, et me teame, kui palju meil masinaid täpselt P2Net-iga liitunud on. Kui neid masinaid on &#039;&#039;k&#039;&#039;, siis iga masin võiks võtta &#039;&#039;1/k&#039;&#039;-ndiku sõnadest ette ja võrrelda neid kõigi sõnadega. Näiteks kolme masina korral meie kuuesõnalisel näitel võiks üks masin võrrelda sõna &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; kõigi teiste vastu, teine teha seda sõnadega &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;erinevat&amp;quot;&amp;lt;/code&amp;gt; jne. Natuke ressurssi läheb siin raisku selle peale, et ühte paari võrreldakse kaks korda: esimene masin teeb võrdluse &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt;, teine teeb ka &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt;. Selle vältimisega ei ole mõtet vaeva näha, see on pigem kasulik (sellest hiljem veel). Järgmiseks tekib küsimus, kuidas juhtida masinaid nii, et me ei peaks igaühele otse käsku andma. Seda võib lahendada nii: 1.) panen päringule kaasa parameetri &#039;&#039;k&#039;&#039; ja URL-i, kust sisendandmed saab alla tõmmata 2.) iga masin arvutab &amp;lt;code&amp;gt;h=hash(omaip,omaport) % k&amp;lt;/code&amp;gt; ja saab numbri &#039;&#039;h&#039;&#039; mis on vahemikus 0 kuni &#039;&#039;k-1&#039;&#039;. 3.) iga masin teeb sisendandmete listist täpselt iga &#039;&#039;k&#039;&#039;-nda sõna, nihkega &#039;&#039;h&#039;&#039;: kui mul &#039;&#039;h=0&#039;&#039; ja masinaid on kokku 7, siis ma võtan ette sõnad 1,8,15,... .&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sarnasuse arvutamine&#039;&#039;&#039;. Seda võib teha igat moodi, alates [http://en.wikipedia.org/wiki/Levenshtein_distance triviaalsest] kuni [http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits#Natural_language_processing_tools põhjalikuni]; vt ka http://wordnet.princeton.edu/.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Tulemuste kokku korjamine&amp;lt;/b&amp;gt;. Iga masin saadab oma osalise mappingu päringu algatajale. See paneb need kokku umbes nii: kui ühest masinast saadi &amp;lt;code&amp;gt;{&amp;quot;koer&amp;quot;: [&amp;quot;koera&amp;quot;]}&amp;lt;/code&amp;gt; ja teisest &amp;lt;code&amp;gt;{&amp;quot;koerad&amp;quot;: [&amp;quot;koera&amp;quot;]}&amp;lt;/code&amp;gt;, siis me saaks sellest kokku järeldada ka midagi sellist: &amp;lt;code&amp;gt;{&amp;quot;koera&amp;quot;:[&amp;quot;koer&amp;quot;, &amp;quot;koerad&amp;quot;]}&amp;lt;/code&amp;gt;. Mismoodi tulemusi täpselt kokku panna, sõltub natuke, kas teie arust on sarnasuse seos sümmeetriline ja/või transitiivne.&lt;br /&gt;
&lt;br /&gt;
Tähelepanelikumal tudengil võib tekkida küsimus, mis siis saab kui hash collision tekib ning mõni tükk üleliia tehakse ning mõni mitte kordagi. Selle probleemi jätame koduülesandeks, vihjeks ainult, et 1.) P2P rakendustes ei ole niikuinii mõtet loota, et kõik masinad algusest lõpuni ilusti võrgus kättesaadavad on ja ei crashi töö jooksul 2.) partitsioneerimise meetod, mida kasutasime, tekitab teatud ülekattuvuse.&lt;br /&gt;
&lt;br /&gt;
Juhul kui ka selle näiterakenduse uurimine mingeid ideid ei tekitanud, võib ka sellesama asja realiseerida. Tasub ainult tähele panna, et see on tõenäoliselt natuke töömahukam, kui mõni ise välja mõeldud rakendus.&lt;br /&gt;
&lt;br /&gt;
== Firewall ja NAT ==&lt;br /&gt;
&lt;br /&gt;
Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).&lt;br /&gt;
&lt;br /&gt;
Kes P2Net käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte. &lt;br /&gt;
&lt;br /&gt;
Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:&lt;br /&gt;
* Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.&lt;br /&gt;
* UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid].   Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]&lt;br /&gt;
&lt;br /&gt;
NB! Seda kõike ei ole väga lihtne teha ja sinu P2Net (ja ka selle inimese P2Net, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne P2Net veel ei tööta!&lt;br /&gt;
&lt;br /&gt;
Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma P2Net jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Punktiarvestusest ==&lt;br /&gt;
&lt;br /&gt;
Kui P2Net protokoll töötab vastu mõne teise grupi P2Net-i, sellele on realiseeritud mingi&lt;br /&gt;
rakendus ja koodi suudetakse seletada, saab täispunktid.&lt;br /&gt;
&lt;br /&gt;
Kui teiste P2Net-programmidega ei suuda suhelda, aga iseenda koopiatega siiski, siis päris täispunkte ei saa.&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11816</id>
		<title>Vorgurakendused 2 prax 1 2014</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11816"/>
		<updated>2014-09-27T13:14:01Z</updated>

		<summary type="html">&lt;p&gt;Priit: oops&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
[[Pilt:Robot300.jpg|Zombie robot attack]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
P2Net - P2P botnet&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;UUENDATUD: lisatud [[#Näiterakendus]].&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ülesandeks on ehitada P2P rakendus P2Net programmide (käsurea kujul) käivitamiseks võõrastes masinates ja rehkendustulemuste kättesaamiseks, mis teeb laviinitaolise otsingu mööda P2Net klient/servereid, isetehtud P2P mehhanismi abil. &lt;br /&gt;
&lt;br /&gt;
Kasutajaliidese hea kvaliteet ei ole praksis oluline.&lt;br /&gt;
&lt;br /&gt;
Huvi korral võid vaadata ka veidi sarnaseid vanu ülesandeid [[Vorgurakendused 2 prax 1 2013 |2013 aasta arhiivis]]  ning sealt edasi vanemaid. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== Üldkirjeldus ==&lt;br /&gt;
&lt;br /&gt;
P2Net võimaldab:&lt;br /&gt;
&lt;br /&gt;
* kasutajal käivitada võõrastes masinatest käsurea. &lt;br /&gt;
* saada tagasi käsurea rehkendatud tulemus(tekst/binary vms blob).&lt;br /&gt;
* idee on selle peale ehitada mingi rakendus, näit:&lt;br /&gt;
** mingite mahukate arvutuste jaotamine masinate vahel ([[#Näiterakendus]])&lt;br /&gt;
** web scrapingu (näit google otsingu) load balancing&lt;br /&gt;
** kaugadministreerimine&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
Rakenduse tegemine P2Net protokolli peale on ka praksi osa.&lt;br /&gt;
&lt;br /&gt;
Võõraste masinate leidmiseks kasutab P2Net järgmist viisi:&lt;br /&gt;
&lt;br /&gt;
* Saadab tema oma masinas oleva faili machines.txt masinatele käsu. machines.txt sees on masinate ip ja pordid json listina kujul &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[&amp;quot;11.22.33.44&amp;quot;,&amp;quot;2345&amp;quot;],...,[&amp;quot;111.222.333.444&amp;quot;,&amp;quot;23456&amp;quot;]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Samamoodi saadab käivitus-päringu P2Net startlehel http://dijkstra.cs.ttu.ee/~tammet/P2Net.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)&lt;br /&gt;
* Kui mingi masin saab minu päringu-käsurea kätte, siis ta paneb selle kohapeal käsureal käima ja saadab tulemuse päringu algatanud masinasse.&lt;br /&gt;
* Iga võõras masin, mis algselt minu käest tulnud päringu saab, saadab ta omakorda kõigile talle teadaolevatele edasi, vähendades seejuures nn ttl (time to live) counti, et päringud lõpmatult rändama ei jääks.&lt;br /&gt;
&lt;br /&gt;
Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et sinu P2Net ei pea üldse salvestama võõraste P2Net-ide ip-sid ja porte! Samas ei ole ka kuidagi keelatud (debugimiseks või niisama huvi pärast vms) salvestada teiste P2Net-ide ip-sid, mida saab teada näiteks sulle tulnud päringutest, sulle vastajate ip-dest ja miks mitte ka portscannides :)&lt;br /&gt;
&lt;br /&gt;
== Miks just selline päringu edasisaatmisviis? ==&lt;br /&gt;
&lt;br /&gt;
Põhimõtteliselt saab päringut massidesse P2P meetoditega laiali saata kahel viisil:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Iteratiivne meetod&amp;lt;/b&amp;gt; (antud praksis seda ei kasuta): algne masin küsib tuttavatelt neile tuttavate masinate faile, ja suurendab seeläbi endale teadaolevate masinate hulka. Igalt uuelt teadasaadud masinalt küsib ta jälle selle masina tuttavate faile jne. Teised masinad algset päringut ise kuhugi edasi ei saada. Meetodi pluss on see, et algne masin saab lihtsalt tagada, et päringut ei saadetaks kaks korda samale masinale. Meetodi miinus on see, et kõik masinad võrgus saadavad lõpuks terve neile tuttavate masinate faili algsele masinale: see tähendab väga suurt hulka väga suurte failide saatmisi, mis hakkavad jõhkralt ummistama võrku, ja algse masina väike kanal tõenäoliselt ummistub varsti. Saadud failide ühisosad on väga suured. Halvemal juhul saab algne masin N identset sõnumit, kus igaühes on N ip-d, kus N on kõigi masinate arv, kus jookseb P2Net. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Rekursiivne meetod&amp;lt;/b&amp;gt; (antud praksis nõutud): algne masin saadab oma päringu tuttavatele masinatele, kes selle omakorda enda tuttavatele edasi saadavad jne. Igüks, kes leiab enda failide hulgast vajaliku faili, saadab info algsele masinale (vastasel korral ei saada ta algsele masinale midagi). Algne masin ei suurenda endale teadaolevate masinate hulka. Meetodi pluss on see, et algsele masinale saadetakse tagasi infot ainult siis, kui vajalik info leitakse (väga väike protsent masinaid) ja see info on lühike. Koormus võrgule langeb tugevasti ja algse masina kanal tõenäoliselt ei ummistu. Meetodi miinus on asjaolu, et üks ja sama masin võib saada algse päringu mitu korda eri suundadest, mis jällegi kasvatab võrgu koormust. Seda viimast probleemi saab  mitmel moel leevendada (kuigi mitte täielikult kaotada), eeskätt päringu ttl (time to live) parameetrit kasutades, päringu ahela masinate lisamises päringu parameetrite hulka jne.&lt;br /&gt;
&lt;br /&gt;
Gnutella kasutab rekursiivset meetodit, nii ka meie P2Net. Lihtsakoeline rekursiivne meetod ummistab suure klientide arvu korral võrgu ja sele asemel kasutavad suured P2P süsteemid kas:&lt;br /&gt;
* struktureeritud nn superpeeride süsteemi a la Kazaa ja esialgne Skype, kus rekursiivne päring toimub ainult superpeeride vahel, ja neid on vähe, või&lt;br /&gt;
* väga kavalat nn distributed hash tables (DHT) mehhanismi, a la freenet ja (osaliselt) bittorrent. DHT on üks mitmest bittorrenti poolt kasutatud meetodist, kuigi bittorrenti põhifookus on hoopis faili paralleelse allatõmbamise optimeerimisel mitme masina koostöös, mitte masinate/failide leidmisel. Või:&lt;br /&gt;
* kasutavad masinate leidmiseks eeskätt tsentraalseid servereid, a la esialgne Napster või kaasaegne Skype&lt;br /&gt;
&lt;br /&gt;
== Tehnilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:&lt;br /&gt;
&lt;br /&gt;
* Kogu programm peab töötama kas ITC-maja klassi arvutis või sinu oma läptopis, mis ITC maja klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi. Arusaadavalt võib aga panna P2Net lisaks käima ka suvalistesse välistesse masinatesse.&lt;br /&gt;
* Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit &amp;quot;suurt&amp;quot; http serverit a la apache kasutada ei või. Kõikvõimalike võrguteekide (versus eraldiseisvad veebiserverid) kasutamine on ok, mikroserverite koodi integreerimine oma programmi on ok.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
=== Otsipäringu saatmine ja edasisaatmine ===&lt;br /&gt;
&lt;br /&gt;
Konkreetsele masinale 11.22.33.44 (kus P2Net jookseb pordis 2345) käsu saatmine &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/run?prog=käsurida&amp;amp;sendip=55.66.77.88&amp;amp;sendport=6788&amp;amp;ttl=5&amp;amp;id=wqeqwe23&amp;amp;noask=11.22.33.44_111.222.333.444 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus parameetritel on järgmine sisu:&lt;br /&gt;
&lt;br /&gt;
* prog: käsk&lt;br /&gt;
* sendip: esialgse saatja ip&lt;br /&gt;
* sendport: esialgse saatja port&lt;br /&gt;
* ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)&lt;br /&gt;
* id: optsionaalne päringu identifikaator&lt;br /&gt;
* noask: optsionaalne list masinatest, kellele pole mõtet edastada (eraldajaks alakriips) &lt;br /&gt;
    &lt;br /&gt;
Päringu identifikaator ei pea tingimata üle terve võrgu unikaalne olema - lihtsam on ja ajab asja ära, kui&lt;br /&gt;
on saatva masina piires unikaalne.&lt;br /&gt;
&lt;br /&gt;
prog parameeter peab ilmselt olema urlencoded, näit. midagi taolist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;prog=ipconfig%20/displaydns&amp;amp;...   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GET-päringu vastuseks on õnnestunud päringu korral number 0,&lt;br /&gt;
ebaõnnestunud päringu korral muu (vea)number. Vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
P2Net-le tulnud päringu edasisaatmine käib täpselt sama protokolliga, kuid edasi saadetakse veidi muudetud päring:&lt;br /&gt;
&lt;br /&gt;
* ttl vähendatakse ühe võrra&lt;br /&gt;
* optionaalselt: lisatakse oma masina ip noask parameetrile otsa&lt;br /&gt;
&lt;br /&gt;
Seejuures &amp;lt;b&amp;gt;ei saadeta päringut edasi&amp;lt;/b&amp;gt;, kui sissetulnud ttl oli 1 võ i vähem (st ttl=0 päringuid enam kuhugi ei saadeta)&lt;br /&gt;
&lt;br /&gt;
Seda päringut saab ka brauserist katsetada, kuigi brauser ei saa vastuseks midagi huvitavat peale debugimis-vastuse 0 või mingi veakoodi.&lt;br /&gt;
&lt;br /&gt;
Klientide filtreerimine (juhul kui soovitakse juhtida mingit alamhulka masinatest) toimub programmi&lt;br /&gt;
käsurea kaudu. See osa ei ole kohustuslik vaid tuleneb konkreetsest rakendusest; protokollis see funktsionaalsus ei sisaldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tulemuse tagastamine algsele pärijale ===&lt;br /&gt;
&lt;br /&gt;
Vastus oleks http post meetodiga käivitatud programmi kogu väljundi saatmine algsele küsijale muutmata kujul&lt;br /&gt;
koos lisainfoga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POST-itatud data:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  {&amp;quot;sendip&amp;quot;: &amp;quot;55.66.77.88&amp;quot;, &lt;br /&gt;
    &amp;quot;sendport&amp;quot;: &amp;quot;6788&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;asasasas&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;: &amp;quot;ascii&amp;quot; või &amp;quot;base64&amp;quot;,	  &lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;failisisustring&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
id peaks vastama esialgse saatja antud id-le, juhul kui seda kasutatakse.     &lt;br /&gt;
* id: esialgse päringu id (kui oli algselt antud)&lt;br /&gt;
* content: käsureaprogrammi väljund (kui ei ole plaintext, peaks olema base64-encodetud)&lt;br /&gt;
* encoding: mis formaadis content on&lt;br /&gt;
* sendip: tulemuse saatnud masina ip&lt;br /&gt;
* sendport: tulemuse saatnud masina port&lt;br /&gt;
&lt;br /&gt;
Programm võiks ka mitte crashida, kui id puudu on, kuna id on optional (aga praktiline ja mõtekas on lisada).&lt;br /&gt;
&lt;br /&gt;
Postituse saaja vastab eduka kättesaamise korral arvu 0,&lt;br /&gt;
arusaamatuste korral mõne muu (vea) numbri. Jällegi, vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
== Praksi kaks osa ==&lt;br /&gt;
&lt;br /&gt;
Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:&lt;br /&gt;
&lt;br /&gt;
* Teha http protokolli järgida suutev esmane rakendus.&lt;br /&gt;
* Lisada sinna kogu vajalik funktsionaalsus:&lt;br /&gt;
** P2Net protokolli implementatsioon&lt;br /&gt;
** P2Net peale ehitatud rakendus (nagu data korjamine, web query hajutamine, lihtsustatud remote admin, ...). Vt ka [[#Näiterakendus]].&lt;br /&gt;
&lt;br /&gt;
Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.&lt;br /&gt;
&lt;br /&gt;
== Soovitusi ja ideid ==&lt;br /&gt;
&lt;br /&gt;
Arendamiseks ja testimiseks pead saama jooksutada oma masinas mitut erinevat koopiat omaenda P2Net-st, igaüks oma pordil, igaühel oma konfifail tuttavate masinatega.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on teha P2Net käsurealt käivitavaks nii, et ta võtab kohe käsurealt pordinumbri parameetriks ning loeb siis oma konfifaili vastavast pordinumbrist tuletatud failipathist.&lt;br /&gt;
&lt;br /&gt;
P2Net peab päris kindlasti sisaldama või kasutama http serverit, &lt;br /&gt;
muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.&lt;br /&gt;
&lt;br /&gt;
Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.&lt;br /&gt;
&lt;br /&gt;
C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks &lt;br /&gt;
on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,&lt;br /&gt;
ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja&lt;br /&gt;
[http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.&lt;br /&gt;
&lt;br /&gt;
Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).&lt;br /&gt;
&lt;br /&gt;
Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:&lt;br /&gt;
&lt;br /&gt;
* [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]&lt;br /&gt;
* [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]&lt;br /&gt;
* [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)] &lt;br /&gt;
* [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]&lt;br /&gt;
* [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]&lt;br /&gt;
* [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]&lt;br /&gt;
* [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]&lt;br /&gt;
* [http://tomayko.com/writings/unicorn-is-unix ruby]&lt;br /&gt;
* [http://jacobian.org/writing/python-is-unix/ python]&lt;br /&gt;
* [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]&lt;br /&gt;
* [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]&lt;br /&gt;
&amp;lt;!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Näiterakendus ===&lt;br /&gt;
&lt;br /&gt;
Sisend on list sõnadest (näiteks faili kujul, kus igal real üks unikaalne sõna). Tahaks teada saada, millised neist sõnadest on üksteisega sarnased. Väljund võiks olla mapping, kus on sõna ning siis sellega sarnaste sõnade list. Sellist asja võib vaja minna juhul, kui ma tahan mingit sisenddatat, näiteks veebist scrapetud andmeid, normaliseerida - oletame et ma otsin sõna &amp;quot;serials&amp;quot;, siis võiks mind tegelikult ka huvitada kohad, kus esineb sõna &amp;quot;serial&amp;quot; (süntaktiline sarnasus) või kui ma otsin sõna &amp;quot;truck&amp;quot;, siis mind võib huvitada ka &amp;quot;lorry&amp;quot; (semantiline sarnasus, mida on küll tegelikult suht keeruline tuvastada).&lt;br /&gt;
&lt;br /&gt;
Kuidas sellist mappingut tekitada? Proovime kõiki sõnu üksteisega paarikaupa võrrelda. Näiteks oletame, et mul on sõnad: &amp;lt;code&amp;gt;[&amp;quot;oma&amp;quot;, &amp;quot;masinas&amp;quot;, &amp;quot;mitut&amp;quot;, &amp;quot;erinevat&amp;quot;, &amp;quot;koopiat&amp;quot;, &amp;quot;omaenda&amp;quot;]&amp;lt;/code&amp;gt;. Hakkame võrdlema: &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; ei ole sarnased, &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ei ole sarnased jne. kuni jõuame &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;omaenda&amp;quot;&amp;lt;/code&amp;gt; juurde, mis võiks olla sarnased (see sõltub täpselt sellest, kuidas sarnasus defineeritud on). Sellega on &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; läbi vaadatud, järgmiseks võtame &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt;. Sõnaga &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; pole seda enam tarvis võrrelda, järelikult alustame paarist &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja nõnda edasi kuni lõpuni. Väljund võiks olla näiteks mapping &amp;lt;code&amp;gt;{&amp;quot;oma&amp;quot; : [&amp;quot;omaenda&amp;quot;], &amp;quot;omaenda&amp;quot;: [&amp;quot;oma&amp;quot;]}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Selleks tuleb vaadata &#039;&#039;(n(n-1))/2&#039;&#039; paari, ehk sellel ülesandel on polünomiaalne keerukus &#039;&#039;O(n^2)&#039;&#039;. Mida see tähendab? Kui ma võtan näitena toodud kuuesõnalise listi asemel mingi realistlikuma listi, kus on 6000 sõna, siis aeg, mis selle läbi töötamisele kulub, ei kasva mitte 1000 korda vaid umbkaudu 1000000 korda. Ehk siis suht kerge on jõuda kohta, kus me enam ei viitsi tulemust ära oodata, kuna selle leidmine võtab tunde.&lt;br /&gt;
&lt;br /&gt;
Antud ülesanne kuulub [http://en.wikipedia.org/wiki/Embarrassingly_parallel triviaalselt paralleelsete] ülesannete hulka. Kui meil on 60 masinat käepärast, siis saab töö nii jagada, et iga masin teeb ~1/60 vajaminevatest võrdlustest ning see võiks tuua tööaja tundidest jälle minutite peale tagasi. Kuidas asja võiks P2Neti peal teha:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Partitsioneerimine&#039;&#039;&#039;. Oletame, et me teame, kui palju meil masinaid täpselt P2Net-iga liitunud on. Kui neid masinaid on &#039;&#039;k&#039;&#039;, siis iga masin võiks võtta &#039;&#039;1/k&#039;&#039;-ndiku sõnadest ette ja võrrelda neid kõigi sõnadega. Näiteks kolme masina korral meie kuuesõnalisel näitel võiks üks masin võrrelda sõna &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; kõigi teiste vastu, teine teha seda sõnadega &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;erinevat&amp;quot;&amp;lt;/code&amp;gt; jne. Natuke ressurssi läheb siin raisku selle peale, et ühte paari võrreldakse kaks korda: esimene masin teeb võrdluse &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt;, teine teeb ka &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt;. Selle vältimisega ei ole mõtet vaeva näha, see on pigem kasulik (sellest hiljem veel). Järgmiseks tekib küsimus, kuidas juhtida masinaid nii, et me ei peaks igaühele otse käsku andma. Seda võib lahendada nii: 1.) panen päringule kaasa parameetri &#039;&#039;k&#039;&#039; ja URL-i, kust sisendandmed saab alla tõmmata 2.) iga masin arvutab &amp;lt;code&amp;gt;h=hash(omaip,omaport) % k&amp;lt;/code&amp;gt; ja saab numbri &#039;&#039;h&#039;&#039; mis on vahemikus 0 kuni &#039;&#039;k-1&#039;&#039;. 3.) iga masin teeb sisendandmete listist täpselt iga &#039;&#039;k&#039;&#039;-nda sõna, nihkega &#039;&#039;h&#039;&#039;: kui mul &#039;&#039;h=0&#039;&#039; ja masinaid on kokku 7, siis ma võtan ette sõnad 1,8,15,... .&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sarnasuse arvutamine&#039;&#039;&#039;. Seda võib teha igat moodi, alates [http://en.wikipedia.org/wiki/Levenshtein_distance triviaalsest] kuni [http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits#Natural_language_processing_tools põhjalikuni]; vt ka http://wordnet.princeton.edu/.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Tulemuste kokku korjamine&amp;lt;/b&amp;gt;. Iga masin saadab oma osalise mappingu päringu algatajale. See paneb need kokku umbes nii: kui ühest masinast saadi &amp;lt;code&amp;gt;{&amp;quot;koer&amp;quot;: [&amp;quot;koera&amp;quot;]}&amp;lt;/code&amp;gt; ja teisest &amp;lt;code&amp;gt;{&amp;quot;koerad&amp;quot;: [&amp;quot;koera&amp;quot;]}&amp;lt;/code&amp;gt;, siis me saaks sellest kokku järeldada ka midagi sellist: &amp;lt;code&amp;gt;{&amp;quot;koera&amp;quot;:[&amp;quot;koer&amp;quot;, &amp;quot;koerad&amp;quot;]}&amp;lt;/code&amp;gt;. Mismoodi tulemusi täpselt kokku panna, sõltub natuke, kas teie arust on sarnasuse seos sümmeetriline ja/või transitiivne.&lt;br /&gt;
&lt;br /&gt;
Tähelepanelikumal tudengil võib tekkida küsimus, mis siis saab kui hash collision tekib ning mõni tükk üleliia tehakse ning mõni mitte kordagi. Selle probleemi jätame koduülesandeks, vihjeks ainult, et 1.) P2P rakendustes ei ole niikuinii mõtet loota, et kõik masinad algusest lõpuni ilusti võrgus kättesaadavad on ja ei crashi töö jooksul 2.) partitsioneerimise meetod, mida kasutasime, tekitab teatud ülekattuvuse.&lt;br /&gt;
&lt;br /&gt;
Juhul kui ka selle näiterakenduse uurimine mingeid ideid ei tekitanud, võib ka sellesama asja realiseerida. Tasub ainult tähele panna, et see on tõenäoliselt natuke töömahukam, kui mõni ise välja mõeldud rakendus.&lt;br /&gt;
&lt;br /&gt;
== Firewall ja NAT ==&lt;br /&gt;
&lt;br /&gt;
Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).&lt;br /&gt;
&lt;br /&gt;
Kes P2Net käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte. &lt;br /&gt;
&lt;br /&gt;
Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:&lt;br /&gt;
* Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.&lt;br /&gt;
* UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid].   Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]&lt;br /&gt;
&lt;br /&gt;
NB! Seda kõike ei ole väga lihtne teha ja sinu P2Net (ja ka selle inimese P2Net, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne P2Net veel ei tööta!&lt;br /&gt;
&lt;br /&gt;
Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma P2Net jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Punktiarvestusest ==&lt;br /&gt;
&lt;br /&gt;
Kui P2Net protokoll töötab vastu mõne teise grupi P2Net-i, sellele on realiseeritud mingi&lt;br /&gt;
rakendus ja koodi suudetakse seletada, saab täispunktid.&lt;br /&gt;
&lt;br /&gt;
Kui teiste P2Net-programmidega ei suuda suhelda, aga iseenda koopiatega siiski, siis päris täispunkte ei saa.&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11815</id>
		<title>Vorgurakendused 2 prax 1 2014</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11815"/>
		<updated>2014-09-27T13:08:26Z</updated>

		<summary type="html">&lt;p&gt;Priit: näiteülesanne&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
[[Pilt:Robot300.jpg|Zombie robot attack]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
P2Net - P2P botnet&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;UUENDATUD: lisatud [[#Näiterakendus]].&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ülesandeks on ehitada P2P rakendus P2Net programmide (käsurea kujul) käivitamiseks võõrastes masinates ja rehkendustulemuste kättesaamiseks, mis teeb laviinitaolise otsingu mööda P2Net klient/servereid, isetehtud P2P mehhanismi abil. &lt;br /&gt;
&lt;br /&gt;
Kasutajaliidese hea kvaliteet ei ole praksis oluline.&lt;br /&gt;
&lt;br /&gt;
Huvi korral võid vaadata ka veidi sarnaseid vanu ülesandeid [[Vorgurakendused 2 prax 1 2013 |2013 aasta arhiivis]]  ning sealt edasi vanemaid. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== Üldkirjeldus ==&lt;br /&gt;
&lt;br /&gt;
P2Net võimaldab:&lt;br /&gt;
&lt;br /&gt;
* kasutajal käivitada võõrastes masinatest käsurea. &lt;br /&gt;
* saada tagasi käsurea rehkendatud tulemus(tekst/binary vms blob).&lt;br /&gt;
* idee on selle peale ehitada mingi rakendus, näit:&lt;br /&gt;
** mingite mahukate arvutuste jaotamine masinate vahel ([[#Näiterakendus]])&lt;br /&gt;
** web scrapingu (näit google otsingu) load balancing&lt;br /&gt;
** kaugadministreerimine&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
Rakenduse tegemine P2Net protokolli peale on ka praksi osa.&lt;br /&gt;
&lt;br /&gt;
Võõraste masinate leidmiseks kasutab P2Net järgmist viisi:&lt;br /&gt;
&lt;br /&gt;
* Saadab tema oma masinas oleva faili machines.txt masinatele käsu. machines.txt sees on masinate ip ja pordid json listina kujul &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[&amp;quot;11.22.33.44&amp;quot;,&amp;quot;2345&amp;quot;],...,[&amp;quot;111.222.333.444&amp;quot;,&amp;quot;23456&amp;quot;]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Samamoodi saadab käivitus-päringu P2Net startlehel http://dijkstra.cs.ttu.ee/~tammet/P2Net.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)&lt;br /&gt;
* Kui mingi masin saab minu päringu-käsurea kätte, siis ta paneb selle kohapeal käsureal käima ja saadab tulemuse päringu algatanud masinasse.&lt;br /&gt;
* Iga võõras masin, mis algselt minu käest tulnud päringu saab, saadab ta omakorda kõigile talle teadaolevatele edasi, vähendades seejuures nn ttl (time to live) counti, et päringud lõpmatult rändama ei jääks.&lt;br /&gt;
&lt;br /&gt;
Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et sinu P2Net ei pea üldse salvestama võõraste P2Net-ide ip-sid ja porte! Samas ei ole ka kuidagi keelatud (debugimiseks või niisama huvi pärast vms) salvestada teiste P2Net-ide ip-sid, mida saab teada näiteks sulle tulnud päringutest, sulle vastajate ip-dest ja miks mitte ka portscannides :)&lt;br /&gt;
&lt;br /&gt;
== Miks just selline päringu edasisaatmisviis? ==&lt;br /&gt;
&lt;br /&gt;
Põhimõtteliselt saab päringut massidesse P2P meetoditega laiali saata kahel viisil:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Iteratiivne meetod&amp;lt;/b&amp;gt; (antud praksis seda ei kasuta): algne masin küsib tuttavatelt neile tuttavate masinate faile, ja suurendab seeläbi endale teadaolevate masinate hulka. Igalt uuelt teadasaadud masinalt küsib ta jälle selle masina tuttavate faile jne. Teised masinad algset päringut ise kuhugi edasi ei saada. Meetodi pluss on see, et algne masin saab lihtsalt tagada, et päringut ei saadetaks kaks korda samale masinale. Meetodi miinus on see, et kõik masinad võrgus saadavad lõpuks terve neile tuttavate masinate faili algsele masinale: see tähendab väga suurt hulka väga suurte failide saatmisi, mis hakkavad jõhkralt ummistama võrku, ja algse masina väike kanal tõenäoliselt ummistub varsti. Saadud failide ühisosad on väga suured. Halvemal juhul saab algne masin N identset sõnumit, kus igaühes on N ip-d, kus N on kõigi masinate arv, kus jookseb P2Net. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Rekursiivne meetod&amp;lt;/b&amp;gt; (antud praksis nõutud): algne masin saadab oma päringu tuttavatele masinatele, kes selle omakorda enda tuttavatele edasi saadavad jne. Igüks, kes leiab enda failide hulgast vajaliku faili, saadab info algsele masinale (vastasel korral ei saada ta algsele masinale midagi). Algne masin ei suurenda endale teadaolevate masinate hulka. Meetodi pluss on see, et algsele masinale saadetakse tagasi infot ainult siis, kui vajalik info leitakse (väga väike protsent masinaid) ja see info on lühike. Koormus võrgule langeb tugevasti ja algse masina kanal tõenäoliselt ei ummistu. Meetodi miinus on asjaolu, et üks ja sama masin võib saada algse päringu mitu korda eri suundadest, mis jällegi kasvatab võrgu koormust. Seda viimast probleemi saab  mitmel moel leevendada (kuigi mitte täielikult kaotada), eeskätt päringu ttl (time to live) parameetrit kasutades, päringu ahela masinate lisamises päringu parameetrite hulka jne.&lt;br /&gt;
&lt;br /&gt;
Gnutella kasutab rekursiivset meetodit, nii ka meie P2Net. Lihtsakoeline rekursiivne meetod ummistab suure klientide arvu korral võrgu ja sele asemel kasutavad suured P2P süsteemid kas:&lt;br /&gt;
* struktureeritud nn superpeeride süsteemi a la Kazaa ja esialgne Skype, kus rekursiivne päring toimub ainult superpeeride vahel, ja neid on vähe, või&lt;br /&gt;
* väga kavalat nn distributed hash tables (DHT) mehhanismi, a la freenet ja (osaliselt) bittorrent. DHT on üks mitmest bittorrenti poolt kasutatud meetodist, kuigi bittorrenti põhifookus on hoopis faili paralleelse allatõmbamise optimeerimisel mitme masina koostöös, mitte masinate/failide leidmisel. Või:&lt;br /&gt;
* kasutavad masinate leidmiseks eeskätt tsentraalseid servereid, a la esialgne Napster või kaasaegne Skype&lt;br /&gt;
&lt;br /&gt;
== Tehnilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:&lt;br /&gt;
&lt;br /&gt;
* Kogu programm peab töötama kas ITC-maja klassi arvutis või sinu oma läptopis, mis ITC maja klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi. Arusaadavalt võib aga panna P2Net lisaks käima ka suvalistesse välistesse masinatesse.&lt;br /&gt;
* Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit &amp;quot;suurt&amp;quot; http serverit a la apache kasutada ei või. Kõikvõimalike võrguteekide (versus eraldiseisvad veebiserverid) kasutamine on ok, mikroserverite koodi integreerimine oma programmi on ok.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
=== Otsipäringu saatmine ja edasisaatmine ===&lt;br /&gt;
&lt;br /&gt;
Konkreetsele masinale 11.22.33.44 (kus P2Net jookseb pordis 2345) käsu saatmine &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/run?prog=käsurida&amp;amp;sendip=55.66.77.88&amp;amp;sendport=6788&amp;amp;ttl=5&amp;amp;id=wqeqwe23&amp;amp;noask=11.22.33.44_111.222.333.444 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus parameetritel on järgmine sisu:&lt;br /&gt;
&lt;br /&gt;
* prog: käsk&lt;br /&gt;
* sendip: esialgse saatja ip&lt;br /&gt;
* sendport: esialgse saatja port&lt;br /&gt;
* ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)&lt;br /&gt;
* id: optsionaalne päringu identifikaator&lt;br /&gt;
* noask: optsionaalne list masinatest, kellele pole mõtet edastada (eraldajaks alakriips) &lt;br /&gt;
    &lt;br /&gt;
Päringu identifikaator ei pea tingimata üle terve võrgu unikaalne olema - lihtsam on ja ajab asja ära, kui&lt;br /&gt;
on saatva masina piires unikaalne.&lt;br /&gt;
&lt;br /&gt;
prog parameeter peab ilmselt olema urlencoded, näit. midagi taolist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;prog=ipconfig%20/displaydns&amp;amp;...   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GET-päringu vastuseks on õnnestunud päringu korral number 0,&lt;br /&gt;
ebaõnnestunud päringu korral muu (vea)number. Vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
P2Net-le tulnud päringu edasisaatmine käib täpselt sama protokolliga, kuid edasi saadetakse veidi muudetud päring:&lt;br /&gt;
&lt;br /&gt;
* ttl vähendatakse ühe võrra&lt;br /&gt;
* optionaalselt: lisatakse oma masina ip noask parameetrile otsa&lt;br /&gt;
&lt;br /&gt;
Seejuures &amp;lt;b&amp;gt;ei saadeta päringut edasi&amp;lt;/b&amp;gt;, kui sissetulnud ttl oli 1 võ i vähem (st ttl=0 päringuid enam kuhugi ei saadeta)&lt;br /&gt;
&lt;br /&gt;
Seda päringut saab ka brauserist katsetada, kuigi brauser ei saa vastuseks midagi huvitavat peale debugimis-vastuse 0 või mingi veakoodi.&lt;br /&gt;
&lt;br /&gt;
Klientide filtreerimine (juhul kui soovitakse juhtida mingit alamhulka masinatest) toimub programmi&lt;br /&gt;
käsurea kaudu. See osa ei ole kohustuslik vaid tuleneb konkreetsest rakendusest; protokollis see funktsionaalsus ei sisaldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tulemuse tagastamine algsele pärijale ===&lt;br /&gt;
&lt;br /&gt;
Vastus oleks http post meetodiga käivitatud programmi kogu väljundi saatmine algsele küsijale muutmata kujul&lt;br /&gt;
koos lisainfoga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POST-itatud data:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  {&amp;quot;sendip&amp;quot;: &amp;quot;55.66.77.88&amp;quot;, &lt;br /&gt;
    &amp;quot;sendport&amp;quot;: &amp;quot;6788&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;asasasas&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;: &amp;quot;ascii&amp;quot; või &amp;quot;base64&amp;quot;,	  &lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;failisisustring&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
id peaks vastama esialgse saatja antud id-le, juhul kui seda kasutatakse.     &lt;br /&gt;
* id: esialgse päringu id (kui oli algselt antud)&lt;br /&gt;
* content: käsureaprogrammi väljund (kui ei ole plaintext, peaks olema base64-encodetud)&lt;br /&gt;
* encoding: mis formaadis content on&lt;br /&gt;
* sendip: tulemuse saatnud masina ip&lt;br /&gt;
* sendport: tulemuse saatnud masina port&lt;br /&gt;
&lt;br /&gt;
Programm võiks ka mitte crashida, kui id puudu on, kuna id on optional (aga praktiline ja mõtekas on lisada).&lt;br /&gt;
&lt;br /&gt;
Postituse saaja vastab eduka kättesaamise korral arvu 0,&lt;br /&gt;
arusaamatuste korral mõne muu (vea) numbri. Jällegi, vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
== Praksi kaks osa ==&lt;br /&gt;
&lt;br /&gt;
Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:&lt;br /&gt;
&lt;br /&gt;
* Teha http protokolli järgida suutev esmane rakendus.&lt;br /&gt;
* Lisada sinna kogu vajalik funktsionaalsus:&lt;br /&gt;
** P2Net protokolli implementatsioon&lt;br /&gt;
** P2Net peale ehitatud rakendus (nagu data korjamine, web query hajutamine, lihtsustatud remote admin, ...). Vt ka [[#Näiterakendus]].&lt;br /&gt;
&lt;br /&gt;
Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.&lt;br /&gt;
&lt;br /&gt;
== Soovitusi ja ideid ==&lt;br /&gt;
&lt;br /&gt;
Arendamiseks ja testimiseks pead saama jooksutada oma masinas mitut erinevat koopiat omaenda P2Net-st, igaüks oma pordil, igaühel oma konfifail tuttavate masinatega.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on teha P2Net käsurealt käivitavaks nii, et ta võtab kohe käsurealt pordinumbri parameetriks ning loeb siis oma konfifaili vastavast pordinumbrist tuletatud failipathist.&lt;br /&gt;
&lt;br /&gt;
P2Net peab päris kindlasti sisaldama või kasutama http serverit, &lt;br /&gt;
muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.&lt;br /&gt;
&lt;br /&gt;
Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.&lt;br /&gt;
&lt;br /&gt;
C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks &lt;br /&gt;
on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,&lt;br /&gt;
ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja&lt;br /&gt;
[http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.&lt;br /&gt;
&lt;br /&gt;
Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).&lt;br /&gt;
&lt;br /&gt;
Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:&lt;br /&gt;
&lt;br /&gt;
* [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]&lt;br /&gt;
* [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]&lt;br /&gt;
* [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)] &lt;br /&gt;
* [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]&lt;br /&gt;
* [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]&lt;br /&gt;
* [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]&lt;br /&gt;
* [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]&lt;br /&gt;
* [http://tomayko.com/writings/unicorn-is-unix ruby]&lt;br /&gt;
* [http://jacobian.org/writing/python-is-unix/ python]&lt;br /&gt;
* [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]&lt;br /&gt;
* [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]&lt;br /&gt;
&amp;lt;!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Näiterakendus ===&lt;br /&gt;
&lt;br /&gt;
Sisend on list sõnadest (näiteks faili kujul, kus igal real üks unikaalne sõna). Tahaks teada saada, millised neist sõnadest on üksteisega sarnased. Väljund võiks olla mapping, kus on sõna ning siis sellega sarnaste sõnade list. Sellist asja võib vaja minna juhul, kui ma tahan mingit sisenddatat, näiteks veebist scrapetud andmeid, normaliseerida - oletame et ma otsin sõna &amp;quot;serials&amp;quot;, siis võiks mind tegelikult ka huvitada kohad, kus esineb sõna &amp;quot;serial&amp;quot; (süntaktiline sarnasus) või kui ma otsin sõna &amp;quot;truck&amp;quot;, siis mind võib huvitada ka &amp;quot;lorry&amp;quot; (semantiline sarnasus, mida on küll tegelikult suht keeruline tuvastada).&lt;br /&gt;
&lt;br /&gt;
Kuidas sellist mappingut tekitada? Proovime kõiki sõnu üksteisega paarikaupa võrrelda. Näiteks oletame, et mul on sõnad: &amp;lt;code&amp;gt;[&amp;quot;oma&amp;quot;, &amp;quot;masinas&amp;quot;, &amp;quot;mitut&amp;quot;, &amp;quot;erinevat&amp;quot;, &amp;quot;koopiat&amp;quot;, &amp;quot;omaenda&amp;quot;]&amp;lt;/code&amp;gt;. Hakkame võrdlema: &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; ei ole sarnased, &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ei ole sarnased jne. kuni jõuame &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;omaenda&amp;quot;&amp;lt;/code&amp;gt; juurde, mis võiks olla sarnased (see sõltub täpselt sellest, kuidas sarnasus defineeritud on). Sellega on &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; läbi vaadatud, järgmiseks võtame &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt;. Sõnaga &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; pole seda enam tarvis võrrelda, järelikult alustame paarist &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja nõnda edasi kuni lõpuni. Väljund võiks olla näiteks mapping &amp;lt;code&amp;gt;{&amp;quot;oma&amp;quot; : [&amp;quot;omaenda&amp;quot;], &amp;quot;omaenda&amp;quot;: [&amp;quot;oma&amp;quot;]}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Selleks tuleb vaadata &#039;&#039;(n(n-1))/2&#039;&#039; paari, ehk sellel ülesandel on polünomiaalne keerukus &#039;&#039;O(n^2)&#039;&#039;. Mida see tähendab? Kui ma võtan näitena toodud kuuesõnalise listi asemel mingi realistlikuma listi, kus on 6000 sõna, siis aeg, mis selle läbi töötamisele kulub, ei kasva mitte 1000 korda vaid umbkaudu 1000000 korda. Ehk siis suht kerge on jõuda kohta, kus me enam ei viitsi tulemust ära oodata, kuna selle leidmine võtab tunde.&lt;br /&gt;
&lt;br /&gt;
Antud ülesanne kuulub [http://en.wikipedia.org/wiki/Embarrassingly_parallel triviaalselt paralleelsete] ülesannete hulka. Kui meil on 60 masinat käepärast, siis saab töö nii jagada, et iga masin teeb ~1/60 vajaminevatest võrdlustest ning see võiks tuua tööaja tundidest jälle minutite peale tagasi. Kuidas asja võiks P2Neti peal teha:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Partitsioneerimine&#039;&#039;&#039;. Oletame, et me teame, kui palju meil masinaid täpselt P2Net-iga liitunud on. Kui neid masinaid on &#039;&#039;k&#039;&#039;, siis iga masin võiks võtta &#039;&#039;1/k&#039;&#039;-ndiku sõnadest ette ja võrrelda neid kõigi sõnadega. Näiteks kolme masina korral meie kuuesõnalisel näitel võiks üks masin võrrelda sõna &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;masinas&amp;quot;&amp;lt;/code&amp;gt; kõigi teiste vastu, teine teha seda sõnadega &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;erinevat&amp;quot;&amp;lt;/code&amp;gt; jne. Natuke ressurssi läheb siin raisku selle peale, et ühte paari võrreldakse kaks korda: esimene masin teeb võrdluse &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt;, teine teeb ka &amp;lt;code&amp;gt;&amp;quot;mitut&amp;quot;&amp;lt;/code&amp;gt; ja &amp;lt;code&amp;gt;&amp;quot;oma&amp;quot;&amp;lt;/code&amp;gt;. Selle vältimisega ei ole mõtet vaeva näha, see on pigem kasulik (sellest hiljem veel). Järgmiseks tekib küsimus, kuidas juhtida masinaid nii, et me ei peaks igaühele otse käsku andma. Seda võib lahendada nii: 1.) panen päringule kaasa parameetri &#039;&#039;k&#039;&#039; ja URL-i, kust sisendandmed saab alla tõmmata 2.) iga masin arvutab &amp;lt;code&amp;gt;h=hash(omaip,omaport) % k&amp;lt;/code&amp;gt; ja saab numbri &#039;&#039;h&#039;&#039; mis on vahemikus 0 kuni &#039;&#039;k-1&#039;&#039;. 3.) iga masin teeb sisendandmete listist täpselt iga &#039;&#039;k&#039;&#039;-nda sõna, nihkega &#039;&#039;h&#039;&#039;: kui mul &#039;&#039;h=0&#039;&#039; ja masinaid on kokku 7, siis ma võtan ette sõnad 1,8,15,... .&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sarnasuse arvutamine&#039;&#039;&#039;. Seda võib teha igat moodi, alates [http://en.wikipedia.org/wiki/Levenshtein_distance triviaalsest] kuni [http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits#Natural_language_processing_tools põhjalikuni]; vt ka http://wordnet.princeton.edu/.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Tulemuste kokku korjamine&amp;lt;/b&amp;gt;. See osa on ka algoritmiliselt äärmiselt lihtne. Iga masin saadab oma osalise mappingu päringu algatajale. See paneb need kokku umbes nii: kui ühest masinast saadi &amp;lt;code&amp;gt;{&amp;quot;koera&amp;quot;: [&amp;quot;koer&amp;quot;]}&amp;lt;/code&amp;gt; ja teisest &amp;lt;code&amp;gt;{&amp;quot;koera&amp;quot;: [&amp;quot;koerad&amp;quot;]}&amp;lt;/code&amp;gt;, siis kokku võiks tulla &amp;lt;code&amp;gt;{&amp;quot;koera&amp;quot;:[&amp;quot;koer&amp;quot;, &amp;quot;koerad&amp;quot;]}&amp;lt;/code&amp;gt;. Mismoodi tulemusi täpselt kokku panna, sõltub natuke, kas teie arust on sarnasuse seos sümmeetriline ja/või transitiivne.&lt;br /&gt;
&lt;br /&gt;
Tähelepanelikumal tudengil võib tekkida küsimus, mis siis saab kui hash collision tekib ning mõni tükk üleliia tehakse ning mõni mitte kordagi. Selle probleemi jätame koduülesandeks, vihjeks ainult, et 1.) P2P rakendustes ei ole niikuinii mõtet loota, et kõik masinad algusest lõpuni ilusti võrgus kättesaadavad on ja ei crashi töö jooksul 2.) partitsioneerimise meetod, mida kasutasime, tekitab teatud ülekattuvuse.&lt;br /&gt;
&lt;br /&gt;
Juhul kui ka selle näiterakenduse uurimine mingeid ideid ei tekitanud, võib ka sellesama asja realiseerida. Tasub ainult tähele panna, et see on tõenäoliselt natuke töömahukam, kui mõni ise välja mõeldud rakendus.&lt;br /&gt;
&lt;br /&gt;
== Firewall ja NAT ==&lt;br /&gt;
&lt;br /&gt;
Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).&lt;br /&gt;
&lt;br /&gt;
Kes P2Net käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte. &lt;br /&gt;
&lt;br /&gt;
Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:&lt;br /&gt;
* Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.&lt;br /&gt;
* UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid].   Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]&lt;br /&gt;
&lt;br /&gt;
NB! Seda kõike ei ole väga lihtne teha ja sinu P2Net (ja ka selle inimese P2Net, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne P2Net veel ei tööta!&lt;br /&gt;
&lt;br /&gt;
Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma P2Net jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Punktiarvestusest ==&lt;br /&gt;
&lt;br /&gt;
Kui P2Net protokoll töötab vastu mõne teise grupi P2Net-i, sellele on realiseeritud mingi&lt;br /&gt;
rakendus ja koodi suudetakse seletada, saab täispunktid.&lt;br /&gt;
&lt;br /&gt;
Kui teiste P2Net-programmidega ei suuda suhelda, aga iseenda koopiatega siiski, siis päris täispunkte ei saa.&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=V%C3%B5rgurakendused_II&amp;diff=11778</id>
		<title>Võrgurakendused II</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=V%C3%B5rgurakendused_II&amp;diff=11778"/>
		<updated>2014-09-20T12:27:09Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
[[Pilt:Revolution_small.jpg|left|revolutsioon]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Ainekood: ITV0120&amp;lt;br&amp;gt;&lt;br /&gt;
Täielik nimi: Võrgurakendused II - hajussüsteemide tehnoloogia&amp;lt;br&amp;gt;&lt;br /&gt;
Link:  http://www.lambda.ee/index.php/V%C3%B5rgurakendused_II&amp;lt;br&amp;gt;&lt;br /&gt;
Punkte: 2.5 AP ehk 4 EAP&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Lektor: Tanel Tammet&amp;lt;br&amp;gt;&lt;br /&gt;
Kontakt: tanel.tammet@ttu.ee, 6203457&amp;lt;br&amp;gt;&lt;br /&gt;
Olemas on ka [[itv0040 2013 |2013 aasta materjalide arhiiv]].&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NB! Uus aine&amp;lt;/font&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Sellest sügisest käivitus uus aine, mida saab hetkel deklareerida ja mis kehtib valikainena moodulis &amp;quot;Eriala valikud&amp;quot;: &lt;br /&gt;
teda arvestatakse kõigil reaalselt kui selle bloki valikainet, kuigi ta ei ole (vanemates) &lt;br /&gt;
õppekavaversioonides nähtavalt sees. &lt;br /&gt;
&lt;br /&gt;
Vaata lähemalt http://lambda.ee/wiki/Tarkvaraarenduse_meeskonnaprojekt&lt;br /&gt;
&lt;br /&gt;
== Aeg, koht ==&lt;br /&gt;
&lt;br /&gt;
Semester: sügis&amp;lt;br&amp;gt;&lt;br /&gt;
Tulemus: eksam&amp;lt;br&amp;gt;&lt;br /&gt;
Hindamise meetod: praktikumide tulemused (pool) pluss eksam (teine pool)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loeng: kolmapäeval 16:00-17:30 ruumis CYB-VEENUS&amp;lt;br&amp;gt;&lt;br /&gt;
Praktikum: neljapäeval 17:45-19:15  arvutiklassis ICT-501 (praktikumijuhendaja Priit Järv)&lt;br /&gt;
&lt;br /&gt;
== Praktilised tööd ja tähtajad ==&lt;br /&gt;
&lt;br /&gt;
Töid võib teha 1-3 inimesest grupina.&lt;br /&gt;
&lt;br /&gt;
Kokku on töid 2. Kumbki praktikum täismahus tehtuna annab 25 punkti, sellele võivad lisanduda ekstrapunktid. Puudulikult tehtud töö punktiarv jääb alla 25 punkti. Hilinenud kodutöö eest saab pooled muidu saadaolevad punktid. Töid tuleb esitada praktikumi ajal, projektori abil, väikese ülevaatena kõigile tudengitele.&lt;br /&gt;
&lt;br /&gt;
* 1. Tähtaeg 23. oktoober. Kaks alternatiivi, mille vahel võid ise valida:&lt;br /&gt;
** [[Vorgurakendused 2 prax 1 2014 | 1 praks]]&lt;br /&gt;
** Teha ise katseid või rakendus õppejõuga eelnevalt kokku lepitud teemal (apid, protokollid) ja teha väike loeng/ülevaade katsetest/rakendusest.&lt;br /&gt;
&lt;br /&gt;
Järgmine ülesanne on aastast 2013, neid ei tule teha! Uued ülesanded tulevad veidi sarnased ja ilmuvad siia&lt;br /&gt;
oktoobri keskel.&lt;br /&gt;
&lt;br /&gt;
* 2. Tähtaeg 18. detsember. Kaks alternatiivi:&lt;br /&gt;
** [[Vorgurakendused 2 prax 2 2013 | 2 praks: android ja google app engine]]. &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NB!&amp;lt;/font&amp;gt; Hea kogumiku teemadeks jaotatud tutorialitest [https://github.com/thecodepath/android_guides/wiki leiad siit].&lt;br /&gt;
** Teha ise katseid või rakendus õppejõuga eelnevalt kokku lepitud teemal (mobiilirakendused ja pilvekeskkonnad) ja teha väike loeng/ülevaade katsetest/rakendusest.&lt;br /&gt;
&lt;br /&gt;
== Kursus varasematel aastatel ==&lt;br /&gt;
&lt;br /&gt;
* I periood: Tammet (hajutatud failisüst, dns, p2p, ...) http://deepthought.ttu.ee/it/vorgutarkvara/wav4101/&lt;br /&gt;
* II periood: Grauen (eelmise jätk) http://cs.ttu.ee/kursused/itv0040/&lt;br /&gt;
* III periood: Kadastik (sõnumivahetus) http://cs.ttu.ee/tiki-index.php?page=ITV0040-2008&lt;br /&gt;
* IV periood: Tammet http://www.lambda.ee/index/itv0040&lt;br /&gt;
&lt;br /&gt;
== Esialgne loengukava ==&lt;br /&gt;
&lt;br /&gt;
Kursus jaguneb laias laastus neljaks teemaks: &lt;br /&gt;
&lt;br /&gt;
* Protokollid, P2P, andme-apid võrgus (neil teemadel esimene praks, autentimine&lt;br /&gt;
* Mobiilirakendused ja pilvekeskkonnad (neil teemadel teine praks)&lt;br /&gt;
* Paralleelrehkendused&lt;br /&gt;
* Andmete hajutamine ja hajutatud andmete koondamine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Loengute esialgne plaan:&lt;br /&gt;
&lt;br /&gt;
*1. Detailsem ülevaade kursuse sisust, sissejuhatus 1. praktikumi, protokollide algus, http, json&lt;br /&gt;
&amp;lt;!-- :[[Media:Protocols.ppt|Loengu raampresentatsioon]] --&amp;gt;&lt;br /&gt;
:&amp;lt;b&amp;gt;Http ja json&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 1]]&lt;br /&gt;
:Üldist materjali ja kursusi mujalt:&lt;br /&gt;
:http://en.wikipedia.org/wiki/Distributed_computing&lt;br /&gt;
:http://dcg.ethz.ch/lectures/podc_allstars/index.html&lt;br /&gt;
:http://www.eecs.harvard.edu/cs262/&lt;br /&gt;
:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-824-distributed-computer-systems-engineering-spring-2006/index.htm&lt;br /&gt;
:http://www.stanford.edu/class/cs244b/&lt;br /&gt;
&lt;br /&gt;
*2. Praktikumi lisadetaile, protokollide jätk, xml ja xml põhised protokollid xml-rpc ja soap&lt;br /&gt;
:&amp;lt;b&amp;gt;xml protokollid xml-rpc, soap ja seotud tehnoloogiad&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 2]]&lt;br /&gt;
:Probleemidest: [[veebiteenuste võlu ja valu]] ja [http://harmful.cat-v.org/software/xml/soap/simple s stands for simple]&lt;br /&gt;
&lt;br /&gt;
*3. Protokollide jätk ja P2P sissejuhatus&lt;br /&gt;
: &amp;lt;b&amp;gt;REST, binary protokollid, XMPP&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 3]]&lt;br /&gt;
:P2P sissejuhatus:&lt;br /&gt;
:[http://en.wikipedia.org/wiki/Peer-to-peer vikipeedia ülevaade]&lt;br /&gt;
&amp;lt;!-- :[http://www.srdc.metu.edu.tr/webpage/seminars/p2p/P2P.ppt hea paraja detailsusega sissejuhatus] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[http://www.cs.ucy.ac.cy/courses/EPL420/Slides/Chapter2_4ed-P2P.ppt ülevaatepresentatsioon] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[http://www.it.lut.fi/comlab/ssotc/ssotc08/presentations/Lappeenranta_summer_school_Jukka_K_Nurminen.ppt alternatiivne ülevaatepresentatsioon] --&amp;gt;&lt;br /&gt;
:[http://www14.in.tum.de/personen/schmiste/dynamo08.ppt hea detailne ülevaade eri P2P tehnoloogiatest]&lt;br /&gt;
&lt;br /&gt;
*4. P2P jätk: DHT (distributed hash tables) ja bittorrent&lt;br /&gt;
:[http://en.wikipedia.org/wiki/Distributed_hash_table ülevaade wikipedias]&lt;br /&gt;
:Chord:&lt;br /&gt;
:Põhimaterjal - [http://pdos.csail.mit.edu/rtm/slides/harvard02.ppt Chordi põhimõtted] - lugeda kuni Ivy osani (Ivy on antud juhul teemaväline)&lt;br /&gt;
&amp;lt;!-- :Täiendavalt vaata [http://www.cs.berkeley.edu/~kubitron/courses/cs294-4.../lec03-chord.ppt seda presentatsiooni] visualiseeritud algoritmidega (ppt presentatsioonirezhiimis!) &lt;br /&gt;
:Täiendavalt juurde lugeda [http://www.ece.utexas.edu/~garg/f04/dist2/papers/chord.ppt chordi ülevaadet algoritmide skeemi] ja põhiteoreemidega (ilma tõestusteta) --&amp;gt;&lt;br /&gt;
:Lisaks tasuks veidi uurida artikleid [http://en.wikipedia.org/wiki/Chord_%28peer-to-peer%29 wikipedia] sissekande lõpus (external links)&lt;br /&gt;
:Kademlia:&lt;br /&gt;
:Põhimaterjal [http://www.cs.uiowa.edu/~ghosh/kademlia.ppt presentatsioon autoritelt]&lt;br /&gt;
:Täiendavalt [http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf autorite artikkel]&lt;br /&gt;
:Bittorrent:&lt;br /&gt;
:[http://www.cs.uiowa.edu/~ghosh/bittorrent.ppt bittorrenti protokoll ja ülevaade]&lt;br /&gt;
:[http://en.wikipedia.org/wiki/BitTorrent_%28protocol%29 täiendavalt wikipediast]&lt;br /&gt;
&lt;br /&gt;
*5. Suured avalikud andme-apid.&lt;br /&gt;
: [[Andme-apide märkmed loengust]]&lt;br /&gt;
&lt;br /&gt;
*6. Autentimine: facebook, google, id-kaart.&lt;br /&gt;
&lt;br /&gt;
*7. Pilvekeskkonnad, eriti: Google appengine, database api, google bigtable and file system stack&lt;br /&gt;
:http://code.google.com/appengine/&lt;br /&gt;
&lt;br /&gt;
*8: Sissejuhatus 2. praktikumi, Androidi rakenduste ehitamine&lt;br /&gt;
:http://developer.android.com/index.html&lt;br /&gt;
&lt;br /&gt;
*9. Mobiilirakenduste tegemine üldisemalt&lt;br /&gt;
:Mobi [[Media:Mobi android lecture.pdf|loengu pdf]]&lt;br /&gt;
:Mobi [https://github.com/madisp/PostimeesRss loengu koodi link]&lt;br /&gt;
&lt;br /&gt;
*10. Paralleliseerimine ja efektiivsus: ip/tcp, socketid, http jne&lt;br /&gt;
: http näited &lt;br /&gt;
&lt;br /&gt;
*11. Mmapreduce framework for automating app parallelization + memcached&lt;br /&gt;
:Hea [http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;cd=2&amp;amp;ved=0CBkQxQEwAQ&amp;amp;url=http%3A%2F%2Fdocs.google.com%2Fviewer%3Fa%3Dv%26q%3Dcache%3AziVIMWHr2GsJ%3Anet.pku.edu.cn%2F~course%2Fcs501%2F2008%2Fresource%2Fmapreduce_in_a_week%2Fllm3-mapreduce.ppt%2Bgoogle%2Bmapreduce%2Btheory%2Band%2Bimplementation%2BChristophe%2BBisciglia%2C%2BAaron%2BKimball%2Bllm3%26hl%3Den%26pid%3Dbl%26srcid%3DADGEESiMwU-9htEZEAthU5bRtGGBQgkzwUf5vM549R-6QBooeBv10FFd-GLvrklDHx-RhI3OehhNio1E7m5GvwKyKK9ndM6oNbDO3LERl8M8YSZ5tdO4bRQ3PEs8sQ6_sdJVIF_Splx7%26sig%3DAHIEtbQVGyhnhEx0aTA0W7okwP8KdVqG1w&amp;amp;rct=j&amp;amp;q=google%20mapreduce%20theory%20and%20implementation%20Christophe%20Bisciglia%2C%20Aaron%20Kimball%20llm3&amp;amp;ei=plH_TPWOI4ay8gPVss2MCw&amp;amp;usg=AFQjCNE9y0GiXVo_hNWPmywfUjt_3ZhQqg&amp;amp;cad=rja Mapreduce sissejuhatus] &lt;br /&gt;
:Mapreduce [http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/en//papers/mapreduce-osdi04.pdf klassikaline põhiartikkel]&lt;br /&gt;
:[http://www.majordojo.com/2007/03/memcached-howto.php memcached ülevaade]&lt;br /&gt;
&lt;br /&gt;
*12. Paralleelrehkendused. Andmebaasid, lukustamine ja transaktsioonid.&lt;br /&gt;
:Paralleelsus andmebaasides, [[Media:na2_ccdb.pdf|konspekt]] ja [[Media:na2_ccdb_slides.pdf|slaidid]]&lt;br /&gt;
:Transaktsioonide sissejuhatuse [[Media:11-transactions.pdf|alternatiivsed slaidid]]&lt;br /&gt;
&lt;br /&gt;
*13. Paralleelrehkendused jätkuvad.&lt;br /&gt;
:Sünkroniseerimisprimitiivid, [[Media:na2_sync.pdf|konspekt]] ja [[Media:na2_sync_slides.pdf|slaidid]]&lt;br /&gt;
:Lisaks [[Media:Locking_v2.ppt|T.Tammeti slaidid]] &lt;br /&gt;
&lt;br /&gt;
*14. Andmelaod.&lt;br /&gt;
&lt;br /&gt;
*15. Hajutatud andmekogude integreerimine. Vaata ka linke:&lt;br /&gt;
: [http://momjian.us/main/writings/pgsql/replication.pdf Postgres replication intro]&lt;br /&gt;
: [http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling Postgres clustering and replication]&lt;br /&gt;
: [http://www.postgresql.org/docs/current/interactive/high-availability.html Postgres high availability]&lt;br /&gt;
: [http://goanna.cs.rmit.edu.au/~e76763/tiger_ref/lkmt10-dnis.pdf Integrating distributed sem web data]&lt;br /&gt;
: [http://docs.oracle.com/cd/B28359_01/server.111/b28318/integrat.htm Oracle information integration]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*16. Lisamaterjalidena [[võrgurakendused 2: täiendavad lingid]], [[Sehke speci draft]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Kursus]]&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Fail:Na2_sync_slides.pdf&amp;diff=11777</id>
		<title>Fail:Na2 sync slides.pdf</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Fail:Na2_sync_slides.pdf&amp;diff=11777"/>
		<updated>2014-09-20T12:24:59Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Fail:Na2_sync.pdf&amp;diff=11776</id>
		<title>Fail:Na2 sync.pdf</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Fail:Na2_sync.pdf&amp;diff=11776"/>
		<updated>2014-09-20T12:24:21Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Fail:Na2_ccdb_slides.pdf&amp;diff=11775</id>
		<title>Fail:Na2 ccdb slides.pdf</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Fail:Na2_ccdb_slides.pdf&amp;diff=11775"/>
		<updated>2014-09-20T12:23:25Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Fail:Na2_ccdb.pdf&amp;diff=11774</id>
		<title>Fail:Na2 ccdb.pdf</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Fail:Na2_ccdb.pdf&amp;diff=11774"/>
		<updated>2014-09-20T12:22:47Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=V%C3%B5rgurakendused_II&amp;diff=11773</id>
		<title>Võrgurakendused II</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=V%C3%B5rgurakendused_II&amp;diff=11773"/>
		<updated>2014-09-20T12:22:04Z</updated>

		<summary type="html">&lt;p&gt;Priit: uued materjalid lukustamine/spinlock&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
[[Pilt:Revolution_small.jpg|left|revolutsioon]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Ainekood: ITV0120&amp;lt;br&amp;gt;&lt;br /&gt;
Täielik nimi: Võrgurakendused II - hajussüsteemide tehnoloogia&amp;lt;br&amp;gt;&lt;br /&gt;
Link:  http://www.lambda.ee/index.php/V%C3%B5rgurakendused_II&amp;lt;br&amp;gt;&lt;br /&gt;
Punkte: 2.5 AP ehk 4 EAP&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Lektor: Tanel Tammet&amp;lt;br&amp;gt;&lt;br /&gt;
Kontakt: tanel.tammet@ttu.ee, 6203457&amp;lt;br&amp;gt;&lt;br /&gt;
Olemas on ka [[itv0040 2013 |2013 aasta materjalide arhiiv]].&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NB! Uus aine&amp;lt;/font&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Sellest sügisest käivitus uus aine, mida saab hetkel deklareerida ja mis kehtib valikainena moodulis &amp;quot;Eriala valikud&amp;quot;: &lt;br /&gt;
teda arvestatakse kõigil reaalselt kui selle bloki valikainet, kuigi ta ei ole (vanemates) &lt;br /&gt;
õppekavaversioonides nähtavalt sees. &lt;br /&gt;
&lt;br /&gt;
Vaata lähemalt http://lambda.ee/wiki/Tarkvaraarenduse_meeskonnaprojekt&lt;br /&gt;
&lt;br /&gt;
== Aeg, koht ==&lt;br /&gt;
&lt;br /&gt;
Semester: sügis&amp;lt;br&amp;gt;&lt;br /&gt;
Tulemus: eksam&amp;lt;br&amp;gt;&lt;br /&gt;
Hindamise meetod: praktikumide tulemused (pool) pluss eksam (teine pool)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loeng: kolmapäeval 16:00-17:30 ruumis CYB-VEENUS&amp;lt;br&amp;gt;&lt;br /&gt;
Praktikum: neljapäeval 17:45-19:15  arvutiklassis ICT-501 (praktikumijuhendaja Priit Järv)&lt;br /&gt;
&lt;br /&gt;
== Praktilised tööd ja tähtajad ==&lt;br /&gt;
&lt;br /&gt;
Töid võib teha 1-3 inimesest grupina.&lt;br /&gt;
&lt;br /&gt;
Kokku on töid 2. Kumbki praktikum täismahus tehtuna annab 25 punkti, sellele võivad lisanduda ekstrapunktid. Puudulikult tehtud töö punktiarv jääb alla 25 punkti. Hilinenud kodutöö eest saab pooled muidu saadaolevad punktid. Töid tuleb esitada praktikumi ajal, projektori abil, väikese ülevaatena kõigile tudengitele.&lt;br /&gt;
&lt;br /&gt;
* 1. Tähtaeg 23. oktoober. Kaks alternatiivi, mille vahel võid ise valida:&lt;br /&gt;
** [[Vorgurakendused 2 prax 1 2014 | 1 praks]]&lt;br /&gt;
** Teha ise katseid või rakendus õppejõuga eelnevalt kokku lepitud teemal (apid, protokollid) ja teha väike loeng/ülevaade katsetest/rakendusest.&lt;br /&gt;
&lt;br /&gt;
Järgmine ülesanne on aastast 2013, neid ei tule teha! Uued ülesanded tulevad veidi sarnased ja ilmuvad siia&lt;br /&gt;
oktoobri keskel.&lt;br /&gt;
&lt;br /&gt;
* 2. Tähtaeg 18. detsember. Kaks alternatiivi:&lt;br /&gt;
** [[Vorgurakendused 2 prax 2 2013 | 2 praks: android ja google app engine]]. &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;NB!&amp;lt;/font&amp;gt; Hea kogumiku teemadeks jaotatud tutorialitest [https://github.com/thecodepath/android_guides/wiki leiad siit].&lt;br /&gt;
** Teha ise katseid või rakendus õppejõuga eelnevalt kokku lepitud teemal (mobiilirakendused ja pilvekeskkonnad) ja teha väike loeng/ülevaade katsetest/rakendusest.&lt;br /&gt;
&lt;br /&gt;
== Kursus varasematel aastatel ==&lt;br /&gt;
&lt;br /&gt;
* I periood: Tammet (hajutatud failisüst, dns, p2p, ...) http://deepthought.ttu.ee/it/vorgutarkvara/wav4101/&lt;br /&gt;
* II periood: Grauen (eelmise jätk) http://cs.ttu.ee/kursused/itv0040/&lt;br /&gt;
* III periood: Kadastik (sõnumivahetus) http://cs.ttu.ee/tiki-index.php?page=ITV0040-2008&lt;br /&gt;
* IV periood: Tammet http://www.lambda.ee/index/itv0040&lt;br /&gt;
&lt;br /&gt;
== Esialgne loengukava ==&lt;br /&gt;
&lt;br /&gt;
Kursus jaguneb laias laastus neljaks teemaks: &lt;br /&gt;
&lt;br /&gt;
* Protokollid, P2P, andme-apid võrgus (neil teemadel esimene praks, autentimine&lt;br /&gt;
* Mobiilirakendused ja pilvekeskkonnad (neil teemadel teine praks)&lt;br /&gt;
* Paralleelrehkendused&lt;br /&gt;
* Andmete hajutamine ja hajutatud andmete koondamine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Loengute esialgne plaan:&lt;br /&gt;
&lt;br /&gt;
*1. Detailsem ülevaade kursuse sisust, sissejuhatus 1. praktikumi, protokollide algus, http, json&lt;br /&gt;
&amp;lt;!-- :[[Media:Protocols.ppt|Loengu raampresentatsioon]] --&amp;gt;&lt;br /&gt;
:&amp;lt;b&amp;gt;Http ja json&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 1]]&lt;br /&gt;
:Üldist materjali ja kursusi mujalt:&lt;br /&gt;
:http://en.wikipedia.org/wiki/Distributed_computing&lt;br /&gt;
:http://dcg.ethz.ch/lectures/podc_allstars/index.html&lt;br /&gt;
:http://www.eecs.harvard.edu/cs262/&lt;br /&gt;
:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-824-distributed-computer-systems-engineering-spring-2006/index.htm&lt;br /&gt;
:http://www.stanford.edu/class/cs244b/&lt;br /&gt;
&lt;br /&gt;
*2. Praktikumi lisadetaile, protokollide jätk, xml ja xml põhised protokollid xml-rpc ja soap&lt;br /&gt;
:&amp;lt;b&amp;gt;xml protokollid xml-rpc, soap ja seotud tehnoloogiad&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 2]]&lt;br /&gt;
:Probleemidest: [[veebiteenuste võlu ja valu]] ja [http://harmful.cat-v.org/software/xml/soap/simple s stands for simple]&lt;br /&gt;
&lt;br /&gt;
*3. Protokollide jätk ja P2P sissejuhatus&lt;br /&gt;
: &amp;lt;b&amp;gt;REST, binary protokollid, XMPP&amp;lt;/b&amp;gt;: [[võrgurakenduste protokollid 3]]&lt;br /&gt;
:P2P sissejuhatus:&lt;br /&gt;
:[http://en.wikipedia.org/wiki/Peer-to-peer vikipeedia ülevaade]&lt;br /&gt;
&amp;lt;!-- :[http://www.srdc.metu.edu.tr/webpage/seminars/p2p/P2P.ppt hea paraja detailsusega sissejuhatus] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[http://www.cs.ucy.ac.cy/courses/EPL420/Slides/Chapter2_4ed-P2P.ppt ülevaatepresentatsioon] --&amp;gt;&lt;br /&gt;
&amp;lt;!-- :[http://www.it.lut.fi/comlab/ssotc/ssotc08/presentations/Lappeenranta_summer_school_Jukka_K_Nurminen.ppt alternatiivne ülevaatepresentatsioon] --&amp;gt;&lt;br /&gt;
:[http://www14.in.tum.de/personen/schmiste/dynamo08.ppt hea detailne ülevaade eri P2P tehnoloogiatest]&lt;br /&gt;
&lt;br /&gt;
*4. P2P jätk: DHT (distributed hash tables) ja bittorrent&lt;br /&gt;
:[http://en.wikipedia.org/wiki/Distributed_hash_table ülevaade wikipedias]&lt;br /&gt;
:Chord:&lt;br /&gt;
:Põhimaterjal - [http://pdos.csail.mit.edu/rtm/slides/harvard02.ppt Chordi põhimõtted] - lugeda kuni Ivy osani (Ivy on antud juhul teemaväline)&lt;br /&gt;
&amp;lt;!-- :Täiendavalt vaata [http://www.cs.berkeley.edu/~kubitron/courses/cs294-4.../lec03-chord.ppt seda presentatsiooni] visualiseeritud algoritmidega (ppt presentatsioonirezhiimis!) &lt;br /&gt;
:Täiendavalt juurde lugeda [http://www.ece.utexas.edu/~garg/f04/dist2/papers/chord.ppt chordi ülevaadet algoritmide skeemi] ja põhiteoreemidega (ilma tõestusteta) --&amp;gt;&lt;br /&gt;
:Lisaks tasuks veidi uurida artikleid [http://en.wikipedia.org/wiki/Chord_%28peer-to-peer%29 wikipedia] sissekande lõpus (external links)&lt;br /&gt;
:Kademlia:&lt;br /&gt;
:Põhimaterjal [http://www.cs.uiowa.edu/~ghosh/kademlia.ppt presentatsioon autoritelt]&lt;br /&gt;
:Täiendavalt [http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf autorite artikkel]&lt;br /&gt;
:Bittorrent:&lt;br /&gt;
:[http://www.cs.uiowa.edu/~ghosh/bittorrent.ppt bittorrenti protokoll ja ülevaade]&lt;br /&gt;
:[http://en.wikipedia.org/wiki/BitTorrent_%28protocol%29 täiendavalt wikipediast]&lt;br /&gt;
&lt;br /&gt;
*5. Suured avalikud andme-apid.&lt;br /&gt;
: [[Andme-apide märkmed loengust]]&lt;br /&gt;
&lt;br /&gt;
*6. Autentimine: facebook, google, id-kaart.&lt;br /&gt;
&lt;br /&gt;
*7. Pilvekeskkonnad, eriti: Google appengine, database api, google bigtable and file system stack&lt;br /&gt;
:http://code.google.com/appengine/&lt;br /&gt;
&lt;br /&gt;
*8: Sissejuhatus 2. praktikumi, Androidi rakenduste ehitamine&lt;br /&gt;
:http://developer.android.com/index.html&lt;br /&gt;
&lt;br /&gt;
*9. Mobiilirakenduste tegemine üldisemalt&lt;br /&gt;
:Mobi [[Media:Mobi android lecture.pdf|loengu pdf]]&lt;br /&gt;
:Mobi [https://github.com/madisp/PostimeesRss loengu koodi link]&lt;br /&gt;
&lt;br /&gt;
*10. Paralleliseerimine ja efektiivsus: ip/tcp, socketid, http jne&lt;br /&gt;
: http näited &lt;br /&gt;
&lt;br /&gt;
*11. Mmapreduce framework for automating app parallelization + memcached&lt;br /&gt;
:Hea [http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;cd=2&amp;amp;ved=0CBkQxQEwAQ&amp;amp;url=http%3A%2F%2Fdocs.google.com%2Fviewer%3Fa%3Dv%26q%3Dcache%3AziVIMWHr2GsJ%3Anet.pku.edu.cn%2F~course%2Fcs501%2F2008%2Fresource%2Fmapreduce_in_a_week%2Fllm3-mapreduce.ppt%2Bgoogle%2Bmapreduce%2Btheory%2Band%2Bimplementation%2BChristophe%2BBisciglia%2C%2BAaron%2BKimball%2Bllm3%26hl%3Den%26pid%3Dbl%26srcid%3DADGEESiMwU-9htEZEAthU5bRtGGBQgkzwUf5vM549R-6QBooeBv10FFd-GLvrklDHx-RhI3OehhNio1E7m5GvwKyKK9ndM6oNbDO3LERl8M8YSZ5tdO4bRQ3PEs8sQ6_sdJVIF_Splx7%26sig%3DAHIEtbQVGyhnhEx0aTA0W7okwP8KdVqG1w&amp;amp;rct=j&amp;amp;q=google%20mapreduce%20theory%20and%20implementation%20Christophe%20Bisciglia%2C%20Aaron%20Kimball%20llm3&amp;amp;ei=plH_TPWOI4ay8gPVss2MCw&amp;amp;usg=AFQjCNE9y0GiXVo_hNWPmywfUjt_3ZhQqg&amp;amp;cad=rja Mapreduce sissejuhatus] &lt;br /&gt;
:Mapreduce [http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/en//papers/mapreduce-osdi04.pdf klassikaline põhiartikkel]&lt;br /&gt;
:[http://www.majordojo.com/2007/03/memcached-howto.php memcached ülevaade]&lt;br /&gt;
&lt;br /&gt;
*12. Paralleelrehkendused. Andmebaasid, lukustamine ja transaktsioonid.&lt;br /&gt;
:[[Media:na2_ccdb.pdf|Konspekt]] ja [[Media:na2_ccdb_slides.pdf|slaidid]]&lt;br /&gt;
:Transaktsioonide sissejuhatuse [[Media:11-transactions.pdf|alternatiivsed slaidid]]&lt;br /&gt;
&lt;br /&gt;
*13. Paralleelrehkendused jätkuvad.&lt;br /&gt;
:[[Media:na2_sync.pdf|Konspekt]] ja [[Media:na2_sync_slides.pdf|slaidid]]&lt;br /&gt;
:Lisaks [[Media:Locking_v2.ppt|T.Tammeti slaidid]] &lt;br /&gt;
&lt;br /&gt;
*14. Andmelaod.&lt;br /&gt;
&lt;br /&gt;
*15. Hajutatud andmekogude integreerimine. Vaata ka linke:&lt;br /&gt;
: [http://momjian.us/main/writings/pgsql/replication.pdf Postgres replication intro]&lt;br /&gt;
: [http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling Postgres clustering and replication]&lt;br /&gt;
: [http://www.postgresql.org/docs/current/interactive/high-availability.html Postgres high availability]&lt;br /&gt;
: [http://goanna.cs.rmit.edu.au/~e76763/tiger_ref/lkmt10-dnis.pdf Integrating distributed sem web data]&lt;br /&gt;
: [http://docs.oracle.com/cd/B28359_01/server.111/b28318/integrat.htm Oracle information integration]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*16. Lisamaterjalidena [[võrgurakendused 2: täiendavad lingid]], [[Sehke speci draft]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Kursus]]&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11748</id>
		<title>Vorgurakendused 2 prax 1 2014</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11748"/>
		<updated>2014-09-11T23:30:17Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
P2Net - P2P botnet&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;JUHENDI SEIS: Ülesande, s.h. protokolli kirjeldus paigas. Detailid võivad natuke muutuda, aga mitte nii et see juba alustatud tööd segaks.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ülesandeks on ehitada P2P rakendus P2Net programmide (käsurea kujul) käivitamiseks võõrastes masinates ja rehkendustulemuste kättesaamiseks, mis teeb laviinitaolise otsingu mööda P2Net klient/servereid, isetehtud P2P mehhanismi abil. &lt;br /&gt;
&lt;br /&gt;
Kasutajaliidese hea kvaliteet ei ole praksis oluline.&lt;br /&gt;
&lt;br /&gt;
Huvi korral võid vaadata ka veidi sarnaseid vanu ülesandeid [[Võrgurakendused 2013 prax 1 |2013 aasta arhiivis]] ning sealt edasi vanemaid. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== Üldkirjeldus ==&lt;br /&gt;
&lt;br /&gt;
P2Net võimaldab:&lt;br /&gt;
&lt;br /&gt;
* kasutajal käivitada võõrastes masinatest käsurea. &lt;br /&gt;
* saada tagasi käsurea rehkendatud tulemus(tekst/binary vms blob).&lt;br /&gt;
* idee on selle peale ehitada mingi rakendus, näit:&lt;br /&gt;
** mingite mahukate arvutuste jaotamine masinate vahel&lt;br /&gt;
** web scrapingu (näit google otsingu) load balancing&lt;br /&gt;
** kaugadministreerimine&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
Võõraste masinate leidmiseks kasutab P2Net järgmist viisi:&lt;br /&gt;
&lt;br /&gt;
* Saadab tema oma masinas oleva faili machines.txt masinatele käsu. machines.txt sees on masinate ip ja pordid json listina kujul &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[&amp;quot;11.22.33.44&amp;quot;,&amp;quot;2345&amp;quot;],...,[&amp;quot;111.222.333.444&amp;quot;,&amp;quot;23456&amp;quot;]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Samamoodi saadab käivitus-päringu P2Net startlehel http://dijkstra.cs.ttu.ee/~tammet/P2Net.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)&lt;br /&gt;
* Kui mingi masin saab minu päringu-käsurea kätte, siis ta paneb selle kohapeal käsureal käima ja saadab tulemuse päringu algatanud masinasse.&lt;br /&gt;
* Iga võõras masin, mis algselt minu käest tulnud päringu saab, saadab ta omakorda kõigile talle teadaolevatele edasi, vähendades seejuures nn ttl (time to live) counti, et päringud lõpmatult rändama ei jääks.&lt;br /&gt;
&lt;br /&gt;
Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et sinu P2Net ei pea üldse salvestama võõraste P2Net-ide ip-sid ja porte! Samas ei ole ka kuidagi keelatud (debugimiseks või niisama huvi pärast vms) salvestada teiste P2Net-ide ip-sid, mida saab teada näiteks sulle tulnud päringutest, sulle vastajate ip-dest ja miks mitte ka portscannides :)&lt;br /&gt;
&lt;br /&gt;
== Miks just selline päringu edasisaatmisviis? ==&lt;br /&gt;
&lt;br /&gt;
Põhimõtteliselt saab päringut massidesse P2P meetoditega laiali saata kahel viisil:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Iteratiivne meetod&amp;lt;/b&amp;gt; (antud praksis seda ei kasuta): algne masin küsib tuttavatelt neile tuttavate masinate faile, ja suurendab seeläbi endale teadaolevate masinate hulka. Igalt uuelt teadasaadud masinalt küsib ta jälle selle masina tuttavate faile jne. Teised masinad algset päringut ise kuhugi edasi ei saada. Meetodi pluss on see, et algne masin saab lihtsalt tagada, et päringut ei saadetaks kaks korda samale masinale. Meetodi miinus on see, et kõik masinad võrgus saadavad lõpuks terve neile tuttavate masinate faili algsele masinale: see tähendab väga suurt hulka väga suurte failide saatmisi, mis hakkavad jõhkralt ummistama võrku, ja algse masina väike kanal tõenäoliselt ummistub varsti. Saadud failide ühisosad on väga suured. Halvemal juhul saab algne masin N identset sõnumit, kus igaühes on N ip-d, kus N on kõigi masinate arv, kus jookseb P2Net. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Rekursiivne meetod&amp;lt;/b&amp;gt; (antud praksis nõutud): algne masin saadab oma päringu tuttavatele masinatele, kes selle omakorda enda tuttavatele edasi saadavad jne. Igüks, kes leiab enda failide hulgast vajaliku faili, saadab info algsele masinale (vastasel korral ei saada ta algsele masinale midagi). Algne masin ei suurenda endale teadaolevate masinate hulka. Meetodi pluss on see, et algsele masinale saadetakse tagasi infot ainult siis, kui vajalik info leitakse (väga väike protsent masinaid) ja see info on lühike. Koormus võrgule langeb tugevasti ja algse masina kanal tõenäoliselt ei ummistu. Meetodi miinus on asjaolu, et üks ja sama masin võib saada algse päringu mitu korda eri suundadest, mis jällegi kasvatab võrgu koormust. Seda viimast probleemi saab  mitmel moel leevendada (kuigi mitte täielikult kaotada), eeskätt päringu ttl (time to live) parameetrit kasutades, päringu ahela masinate lisamises päringu parameetrite hulka jne.&lt;br /&gt;
&lt;br /&gt;
Gnutella kasutab rekursiivset meetodit, nii ka meie P2Net. Lihtsakoeline rekursiivne meetod ummistab suure klientide arvu korral võrgu ja sele asemel kasutavad suured P2P süsteemid kas:&lt;br /&gt;
* struktureeritud nn superpeeride süsteemi a la Kazaa ja esialgne Skype, kus rekursiivne päring toimub ainult superpeeride vahel, ja neid on vähe, või&lt;br /&gt;
* väga kavalat nn distributed hash tables (DHT) mehhanismi, a la freenet ja (osaliselt) bittorrent. DHT on üks mitmest bittorrenti poolt kasutatud meetodist, kuigi bittorrenti põhifookus on hoopis faili paralleelse allatõmbamise optimeerimisel mitme masina koostöös, mitte masinate/failide leidmisel. Või:&lt;br /&gt;
* kasutavad masinate leidmiseks eeskätt tsentraalseid servereid, a la esialgne Napster või kaasaegne Skype&lt;br /&gt;
&lt;br /&gt;
== Tehnilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:&lt;br /&gt;
&lt;br /&gt;
* Kogu programm peab töötama kas ITC-maja klassi arvutis või sinu oma läptopis, mis ITC maja klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi. Arusaadavalt võib aga panna P2Net lisaks käima ka suvalistesse välistesse masinatesse.&lt;br /&gt;
* Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit &amp;quot;suurt&amp;quot; http serverit a la apache kasutada ei või. Kõikvõimalike võrguteekide (versus eraldiseisvad veebiserverid) kasutamine on ok, mikroserverite koodi integreerimine oma programmi on ok.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
=== Otsipäringu saatmine ja edasisaatmine ===&lt;br /&gt;
&lt;br /&gt;
Konkreetsele masinale 11.22.33.44 (kus P2Net jookseb pordis 2345) käsu saatmine &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/run?prog=käsurida&amp;amp;sendip=55.66.77.88&amp;amp;sendport=6788&amp;amp;ttl=5&amp;amp;id=wqeqwe23&amp;amp;noask=11.22.33.44_111.222.333.444 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus parameetritel on järgmine sisu:&lt;br /&gt;
&lt;br /&gt;
* prog: käsk&lt;br /&gt;
* sendip: esialgse saatja ip&lt;br /&gt;
* sendport: esialgse saatja port&lt;br /&gt;
* ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)&lt;br /&gt;
* id: optsionaalne päringu identifikaator&lt;br /&gt;
* noask: optsionaalne list masinatest, kellele pole mõtet edastada (eraldajaks alakriips) &lt;br /&gt;
    &lt;br /&gt;
Päringu identifikaator ei pea tingimata üle terve võrgu unikaalne olema - lihtsam on ja ajab asja ära, kui&lt;br /&gt;
on saatva masina piires unikaalne.&lt;br /&gt;
&lt;br /&gt;
prog parameeter peab ilmselt olema urlencoded, näit. midagi taolist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;prog=ipconfig%20/displaydns&amp;amp;...   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GET-päringu vastuseks on õnnestunud päringu korral number 0,&lt;br /&gt;
ebaõnnestunud päringu korral muu (vea)number. Vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
P2Net-le tulnud päringu edasisaatmine käib täpselt sama protokolliga, kuid edasi saadetakse veidi muudetud päring:&lt;br /&gt;
&lt;br /&gt;
* ttl vähendatakse ühe võrra&lt;br /&gt;
* optionaalselt: lisatakse oma masina ip noask parameetrile otsa&lt;br /&gt;
&lt;br /&gt;
Seejuures &amp;lt;b&amp;gt;ei saadeta päringut edasi&amp;lt;/b&amp;gt;, kui sissetulnud ttl oli 1 võ i vähem (st ttl=0 päringuid enam kuhugi ei saadeta)&lt;br /&gt;
&lt;br /&gt;
Seda päringut saab ka brauserist katsetada, kuigi brauser ei saa vastuseks midagi huvitavat peale debugimis-vastuse 0 või mingi veakoodi.&lt;br /&gt;
&lt;br /&gt;
Klientide filtreerimine (juhul kui soovitakse juhtida mingit alamhulka masinatest) toimub programmi&lt;br /&gt;
käsurea kaudu. See osa ei ole kohustuslik vaid tuleneb konkreetsest rakendusest; protokollis see funktsionaalsus ei sisaldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tulemuse tagastamine algsele pärijale ===&lt;br /&gt;
&lt;br /&gt;
Vastus oleks http post meetodiga käivitatud programmi kogu väljundi saatmine algsele küsijale muutmata kujul&lt;br /&gt;
koos lisainfoga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POST-itatud data:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  {&amp;quot;sendip&amp;quot;: &amp;quot;55.66.77.88&amp;quot;, &lt;br /&gt;
    &amp;quot;sendport&amp;quot;: &amp;quot;6788&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;asasasas&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;: &amp;quot;ascii&amp;quot; või &amp;quot;base64&amp;quot;,	  &lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;failisisustring&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
id peaks vastama esialgse saatja antud id-le, juhul kui seda kasutatakse.     &lt;br /&gt;
* id: esialgse päringu id (kui oli algselt antud)&lt;br /&gt;
* content: käsureaprogrammi väljund (kui ei ole plaintext, peaks olema base64-encodetud)&lt;br /&gt;
* encoding: mis formaadis content on&lt;br /&gt;
* sendip: tulemuse saatnud masina ip&lt;br /&gt;
* sendport: tulemuse saatnud masina port&lt;br /&gt;
&lt;br /&gt;
Programm võiks ka mitte crashida, kui id puudu on, kuna id on optional (aga praktiline ja mõtekas on lisada).&lt;br /&gt;
&lt;br /&gt;
Postituse saaja vastab eduka kättesaamise korral arvu 0,&lt;br /&gt;
arusaamatuste korral mõne muu (vea) numbri. Jällegi, vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
== Praksi kaks osa ==&lt;br /&gt;
&lt;br /&gt;
Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:&lt;br /&gt;
&lt;br /&gt;
* Teha http protokolli järgida suutev esmane rakendus.&lt;br /&gt;
* Lisada sinna kogu vajalik funktsionaalsus.&lt;br /&gt;
&lt;br /&gt;
Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.&lt;br /&gt;
&lt;br /&gt;
== Soovitusi ja ideid ==&lt;br /&gt;
&lt;br /&gt;
Arendamiseks ja testimiseks pead saama jooksutada oma masinas mitut erinevat koopiat omaenda P2Net-st, igaüks oma pordil, igaühel oma konfifail tuttavate masinatega.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on teha P2Net käsurealt käivitavaks nii, et ta võtab kohe käsurealt pordinumbri parameetriks ning loeb siis oma konfifaili vastavast pordinumbrist tuletatud failipathist.&lt;br /&gt;
&lt;br /&gt;
P2Net peab päris kindlasti sisaldama või kasutama http serverit, &lt;br /&gt;
muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.&lt;br /&gt;
&lt;br /&gt;
Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.&lt;br /&gt;
&lt;br /&gt;
C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks &lt;br /&gt;
on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,&lt;br /&gt;
ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja&lt;br /&gt;
[http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.&lt;br /&gt;
&lt;br /&gt;
Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).&lt;br /&gt;
&lt;br /&gt;
Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:&lt;br /&gt;
&lt;br /&gt;
* [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]&lt;br /&gt;
* [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]&lt;br /&gt;
* [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)] &lt;br /&gt;
* [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]&lt;br /&gt;
* [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]&lt;br /&gt;
* [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]&lt;br /&gt;
* [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]&lt;br /&gt;
* [http://tomayko.com/writings/unicorn-is-unix ruby]&lt;br /&gt;
* [http://jacobian.org/writing/python-is-unix/ python]&lt;br /&gt;
* [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]&lt;br /&gt;
* [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]&lt;br /&gt;
&amp;lt;!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firewall ja NAT ==&lt;br /&gt;
&lt;br /&gt;
Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).&lt;br /&gt;
&lt;br /&gt;
Kes P2Net käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte. &lt;br /&gt;
&lt;br /&gt;
Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:&lt;br /&gt;
* Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.&lt;br /&gt;
* UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid].   Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]&lt;br /&gt;
&lt;br /&gt;
NB! Seda kõike ei ole väga lihtne teha ja sinu P2Net (ja ka selle inimese P2Net, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne P2Net veel ei tööta!&lt;br /&gt;
&lt;br /&gt;
Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma P2Net jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!&lt;br /&gt;
&lt;br /&gt;
== Seda kohta pole vaja lugeda ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  F3AA34&lt;br /&gt;
    &lt;br /&gt;
  base64&lt;br /&gt;
    &lt;br /&gt;
  utf-8 moodi????&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Punktiarvestusest ==&lt;br /&gt;
&lt;br /&gt;
Kui kõik eelnimetatu töötab vastu mõne teise grupi P2Net-i ja &lt;br /&gt;
koodi suudetakse seletada, saab täispunktid.&lt;br /&gt;
&lt;br /&gt;
Kui teiste P2Net-programmidega ei suuda suhelda, aga iseenda koopiatega siiski, siis päris täispunkte ei saa.&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11747</id>
		<title>Vorgurakendused 2 prax 1 2014</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11747"/>
		<updated>2014-09-11T23:23:46Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
P2Net - P2P botnet&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;JUHENDI SEIS: Ülesande, s.h. protokolli kirjeldus paigas. Detailid võivad natuke muutuda, aga mitte nii et see juba alustatud tööd segaks.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ülesandeks on ehitada P2P rakendus P2Net programmide (käsurea kujul) käivitamiseks võõrastes masinates ja rehkendustulemuste kättesaamiseks, mis teeb laviinitaolise otsingu mööda P2Net klient/servereid, isetehtud P2P mehhanismi abil. &lt;br /&gt;
&lt;br /&gt;
Kasutajaliidese hea kvaliteet ei ole praksis oluline.&lt;br /&gt;
&lt;br /&gt;
Huvi korral võid vaadata ka veidi sarnaseid vanu ülesandeid [[Võrgurakendused 2013 prax 1 |2013 aasta arhiivis]] ning sealt edasi vanemaid. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== Üldkirjeldus ==&lt;br /&gt;
&lt;br /&gt;
P2Net võimaldab:&lt;br /&gt;
&lt;br /&gt;
* kasutajal käivitada võõrastes masinatest käsurea. &lt;br /&gt;
* saada tagasi käsurea rehkendatud tulemus(tekst/binary vms blob).&lt;br /&gt;
&lt;br /&gt;
Võõraste masinate leidmiseks kasutab P2Net järgmist viisi:&lt;br /&gt;
&lt;br /&gt;
* Saadab tema oma masinas oleva faili machines.txt masinatele käsu. machines.txt sees on masinate ip ja pordid json listina kujul &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[&amp;quot;11.22.33.44&amp;quot;,&amp;quot;2345&amp;quot;],...,[&amp;quot;111.222.333.444&amp;quot;,&amp;quot;23456&amp;quot;]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Samamoodi saadab käivitus-päringu P2Net startlehel http://dijkstra.cs.ttu.ee/~tammet/P2Net.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)&lt;br /&gt;
* Kui mingi masin saab minu päringu-käsurea kätte, siis ta paneb selle kohapeal käsureal käima ja saadab tulemuse päringu algatanud masinasse.&lt;br /&gt;
* Iga võõras masin, mis algselt minu käest tulnud päringu saab, saadab ta omakorda kõigile talle teadaolevatele edasi, vähendades seejuures nn ttl (time to live) counti, et päringud lõpmatult rändama ei jääks.&lt;br /&gt;
&lt;br /&gt;
Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et sinu P2Net ei pea üldse salvestama võõraste P2Net-ide ip-sid ja porte! Samas ei ole ka kuidagi keelatud (debugimiseks või niisama huvi pärast vms) salvestada teiste P2Net-ide ip-sid, mida saab teada näiteks sulle tulnud päringutest, sulle vastajate ip-dest ja miks mitte ka portscannides :)&lt;br /&gt;
&lt;br /&gt;
== Miks just selline päringu edasisaatmisviis? ==&lt;br /&gt;
&lt;br /&gt;
Põhimõtteliselt saab päringut massidesse P2P meetoditega laiali saata kahel viisil:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Iteratiivne meetod&amp;lt;/b&amp;gt; (antud praksis seda ei kasuta): algne masin küsib tuttavatelt neile tuttavate masinate faile, ja suurendab seeläbi endale teadaolevate masinate hulka. Igalt uuelt teadasaadud masinalt küsib ta jälle selle masina tuttavate faile jne. Teised masinad algset päringut ise kuhugi edasi ei saada. Meetodi pluss on see, et algne masin saab lihtsalt tagada, et päringut ei saadetaks kaks korda samale masinale. Meetodi miinus on see, et kõik masinad võrgus saadavad lõpuks terve neile tuttavate masinate faili algsele masinale: see tähendab väga suurt hulka väga suurte failide saatmisi, mis hakkavad jõhkralt ummistama võrku, ja algse masina väike kanal tõenäoliselt ummistub varsti. Saadud failide ühisosad on väga suured. Halvemal juhul saab algne masin N identset sõnumit, kus igaühes on N ip-d, kus N on kõigi masinate arv, kus jookseb P2Net. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Rekursiivne meetod&amp;lt;/b&amp;gt; (antud praksis nõutud): algne masin saadab oma päringu tuttavatele masinatele, kes selle omakorda enda tuttavatele edasi saadavad jne. Igüks, kes leiab enda failide hulgast vajaliku faili, saadab info algsele masinale (vastasel korral ei saada ta algsele masinale midagi). Algne masin ei suurenda endale teadaolevate masinate hulka. Meetodi pluss on see, et algsele masinale saadetakse tagasi infot ainult siis, kui vajalik info leitakse (väga väike protsent masinaid) ja see info on lühike. Koormus võrgule langeb tugevasti ja algse masina kanal tõenäoliselt ei ummistu. Meetodi miinus on asjaolu, et üks ja sama masin võib saada algse päringu mitu korda eri suundadest, mis jällegi kasvatab võrgu koormust. Seda viimast probleemi saab  mitmel moel leevendada (kuigi mitte täielikult kaotada), eeskätt päringu ttl (time to live) parameetrit kasutades, päringu ahela masinate lisamises päringu parameetrite hulka jne.&lt;br /&gt;
&lt;br /&gt;
Gnutella kasutab rekursiivset meetodit, nii ka meie P2Net. Lihtsakoeline rekursiivne meetod ummistab suure klientide arvu korral võrgu ja sele asemel kasutavad suured P2P süsteemid kas:&lt;br /&gt;
* struktureeritud nn superpeeride süsteemi a la Kazaa ja esialgne Skype, kus rekursiivne päring toimub ainult superpeeride vahel, ja neid on vähe, või&lt;br /&gt;
* väga kavalat nn distributed hash tables (DHT) mehhanismi, a la freenet ja (osaliselt) bittorrent. DHT on üks mitmest bittorrenti poolt kasutatud meetodist, kuigi bittorrenti põhifookus on hoopis faili paralleelse allatõmbamise optimeerimisel mitme masina koostöös, mitte masinate/failide leidmisel. Või:&lt;br /&gt;
* kasutavad masinate leidmiseks eeskätt tsentraalseid servereid, a la esialgne Napster või kaasaegne Skype&lt;br /&gt;
&lt;br /&gt;
== Tehnilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:&lt;br /&gt;
&lt;br /&gt;
* Kogu programm peab töötama kas ITC-maja klassi arvutis või sinu oma läptopis, mis ITC maja klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi. Arusaadavalt võib aga panna P2Net lisaks käima ka suvalistesse välistesse masinatesse.&lt;br /&gt;
* Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit &amp;quot;suurt&amp;quot; http serverit a la apache kasutada ei või. Kõikvõimalike võrguteekide (versus eraldiseisvad veebiserverid) kasutamine on ok, mikroserverite koodi integreerimine oma programmi on ok.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
=== Otsipäringu saatmine ja edasisaatmine ===&lt;br /&gt;
&lt;br /&gt;
Konkreetsele masinale 11.22.33.44 (kus P2Net jookseb pordis 2345) käsu saatmine &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/run?prog=käsurida&amp;amp;sendip=55.66.77.88&amp;amp;sendport=6788&amp;amp;ttl=5&amp;amp;id=wqeqwe23&amp;amp;noask=11.22.33.44_111.222.333.444 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus parameetritel on järgmine sisu:&lt;br /&gt;
&lt;br /&gt;
* prog: käsk&lt;br /&gt;
* sendip: esialgse saatja ip&lt;br /&gt;
* sendport: esialgse saatja port&lt;br /&gt;
* ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)&lt;br /&gt;
* id: optsionaalne päringu identifikaator&lt;br /&gt;
* noask: optsionaalne list masinatest, kellele pole mõtet edastada (eraldajaks alakriips) &lt;br /&gt;
    &lt;br /&gt;
Päringu identifikaator ei pea tingimata üle terve võrgu unikaalne olema - lihtsam on ja ajab asja ära, kui&lt;br /&gt;
on saatva masina piires unikaalne.&lt;br /&gt;
&lt;br /&gt;
prog parameeter peab ilmselt olema urlencoded, näit. midagi taolist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;prog=ipconfig%20/displaydns&amp;amp;...   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GET-päringu vastuseks on õnnestunud päringu korral number 0,&lt;br /&gt;
ebaõnnestunud päringu korral muu (vea)number. Vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
P2Net-le tulnud päringu edasisaatmine käib täpselt sama protokolliga, kuid edasi saadetakse veidi muudetud päring:&lt;br /&gt;
&lt;br /&gt;
* ttl vähendatakse ühe võrra&lt;br /&gt;
* optionaalselt: lisatakse oma masina ip noask parameetrile otsa&lt;br /&gt;
&lt;br /&gt;
Seejuures &amp;lt;b&amp;gt;ei saadeta päringut edasi&amp;lt;/b&amp;gt;, kui sissetulnud ttl oli 1 võ i vähem (st ttl=0 päringuid enam kuhugi ei saadeta)&lt;br /&gt;
&lt;br /&gt;
Seda päringut saab ka brauserist katsetada, kuigi brauser ei saa vastuseks midagi huvitavat peale debugimis-vastuse 0 või mingi veakoodi.&lt;br /&gt;
&lt;br /&gt;
Klientide filtreerimine (juhul kui soovitakse juhtida mingit alamhulka masinatest) toimub programmi&lt;br /&gt;
käsurea kaudu. See osa ei ole kohustuslik vaid tuleneb konkreetsest rakendusest; protokollis see funktsionaalsus ei sisaldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tulemuse tagastamine algsele pärijale ===&lt;br /&gt;
&lt;br /&gt;
Vastus oleks http post meetodiga käivitatud programmi kogu väljundi saatmine algsele küsijale muutmata kujul&lt;br /&gt;
koos lisainfoga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POST-itatud data:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  {&amp;quot;sendip&amp;quot;: &amp;quot;55.66.77.88&amp;quot;, &lt;br /&gt;
    &amp;quot;sendport&amp;quot;: &amp;quot;6788&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;asasasas&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;: &amp;quot;ascii&amp;quot; või &amp;quot;base64&amp;quot;,	  &lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;failisisustring&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
id peaks vastama esialgse saatja antud id-le, juhul kui seda kasutatakse.     &lt;br /&gt;
* id: esialgse päringu id (kui oli algselt antud)&lt;br /&gt;
* content: käsureaprogrammi väljund (kui ei ole plaintext, peaks olema base64-encodetud)&lt;br /&gt;
* encoding: mis formaadis content on&lt;br /&gt;
* sendip: tulemuse saatnud masina ip&lt;br /&gt;
* sendport: tulemuse saatnud masina port&lt;br /&gt;
&lt;br /&gt;
Programm võiks ka mitte crashida, kui id puudu on, kuna id on optional (aga praktiline ja mõtekas on lisada).&lt;br /&gt;
&lt;br /&gt;
Postituse saaja vastab eduka kättesaamise korral arvu 0,&lt;br /&gt;
arusaamatuste korral mõne muu (vea) numbri. Jällegi, vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
== Praksi kaks osa ==&lt;br /&gt;
&lt;br /&gt;
Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:&lt;br /&gt;
&lt;br /&gt;
* Teha http protokolli järgida suutev esmane rakendus.&lt;br /&gt;
* Lisada sinna kogu vajalik funktsionaalsus.&lt;br /&gt;
&lt;br /&gt;
Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.&lt;br /&gt;
&lt;br /&gt;
== Soovitusi ja ideid ==&lt;br /&gt;
&lt;br /&gt;
Arendamiseks ja testimiseks pead saama jooksutada oma masinas mitut erinevat koopiat omaenda P2Net-st, igaüks oma pordil, igaühel oma konfifail tuttavate masinatega ja oma kataloog jagatavate failidega.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on teha P2Net käsurealt käivitavaks nii, et ta võtab kohe käsurealt pordinumbri parameetriks ning loeb siis oma konfifaili ja jagatavaid faile vastavast pordinumbrist tuletatud failipathist.&lt;br /&gt;
&lt;br /&gt;
P2Net peab päris kindlasti sisaldama või kasutama http serverit, &lt;br /&gt;
muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.&lt;br /&gt;
&lt;br /&gt;
Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.&lt;br /&gt;
&lt;br /&gt;
C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks &lt;br /&gt;
on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,&lt;br /&gt;
ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja&lt;br /&gt;
[http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.&lt;br /&gt;
&lt;br /&gt;
Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).&lt;br /&gt;
&lt;br /&gt;
Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:&lt;br /&gt;
&lt;br /&gt;
* [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]&lt;br /&gt;
* [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]&lt;br /&gt;
* [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)] &lt;br /&gt;
* [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]&lt;br /&gt;
* [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]&lt;br /&gt;
* [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]&lt;br /&gt;
* [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]&lt;br /&gt;
* [http://tomayko.com/writings/unicorn-is-unix ruby]&lt;br /&gt;
* [http://jacobian.org/writing/python-is-unix/ python]&lt;br /&gt;
* [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]&lt;br /&gt;
* [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]&lt;br /&gt;
&amp;lt;!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firewall ja NAT ==&lt;br /&gt;
&lt;br /&gt;
Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).&lt;br /&gt;
&lt;br /&gt;
Kes P2Net käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte. &lt;br /&gt;
&lt;br /&gt;
Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:&lt;br /&gt;
* Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.&lt;br /&gt;
* UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid].   Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]&lt;br /&gt;
&lt;br /&gt;
NB! Seda kõike ei ole väga lihtne teha ja sinu P2Net (ja ka selle inimese P2Net, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne P2Net veel ei tööta!&lt;br /&gt;
&lt;br /&gt;
Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma P2Net jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!&lt;br /&gt;
&lt;br /&gt;
== Seda kohta pole vaja lugeda ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  F3AA34&lt;br /&gt;
    &lt;br /&gt;
  base64&lt;br /&gt;
    &lt;br /&gt;
  utf-8 moodi????&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Punktiarvestusest ==&lt;br /&gt;
&lt;br /&gt;
Kui kõik eelnimetatu töötab vastu mõne teise grupi P2Net-i ja &lt;br /&gt;
koodi suudetakse seletada, saab täispunktid.&lt;br /&gt;
&lt;br /&gt;
Kui teiste P2Net-programmidega ei suuda suhelda, aga iseenda koopiatega siiski, siis päris täispunkte ei saa.&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11746</id>
		<title>Vorgurakendused 2 prax 1 2014</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11746"/>
		<updated>2014-09-11T23:21:40Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
P2Net - P2P botnet&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;JUHENDI SEIS: Ülesande, s.h. protokolli kirjeldus paigas. Detailid võivad natuke muutuda, aga mitte nii et see juba alustatud tööd segaks.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ülesandeks on ehitada P2P rakendus P2Net programmide (käsurea kujul) käivitamiseks võõrastes masinates ja rehkendustulemuste kättesaamiseks, mis teeb laviinitaolise otsingu mööda P2Net klient/servereid, isetehtud P2P mehhanismi abil. &lt;br /&gt;
&lt;br /&gt;
Kasutajaliidese hea kvaliteet ei ole praksis oluline.&lt;br /&gt;
&lt;br /&gt;
Huvi korral võid vaadata ka veidi sarnaseid vanu ülesandeid [[Võrgurakendused 2013 prax 1 |2013 aasta arhiivis]] ning sealt edasi vanemaid. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== Üldkirjeldus ==&lt;br /&gt;
&lt;br /&gt;
P2Net võimaldab:&lt;br /&gt;
&lt;br /&gt;
* kasutajal käivitada võõrastes masinatest käsurea. &lt;br /&gt;
* saada tagasi käsurea rehkendatud tulemus(tekst/binary vms blob).&lt;br /&gt;
&lt;br /&gt;
Võõraste masinate leidmiseks kasutab P2Net järgmist viisi:&lt;br /&gt;
&lt;br /&gt;
* Saadab tema oma masinas oleva faili machines.txt masinatele käsu. machines.txt sees on masinate ip ja pordid json listina kujul &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[&amp;quot;11.22.33.44&amp;quot;,&amp;quot;2345&amp;quot;],...,[&amp;quot;111.222.333.444&amp;quot;,&amp;quot;23456&amp;quot;]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Samamoodi saadab käivitus-päringu P2Net startlehel http://dijkstra.cs.ttu.ee/~tammet/P2Net.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)&lt;br /&gt;
* Kui mingi masin saab minu päringu-käsurea kätte, siis ta paneb selle kohapeal käsureal käima ja saadab tulemuse päringu algatanud masinasse.&lt;br /&gt;
* Iga võõras masin, mis algselt minu käest tulnud päringu saab, saadab ta omakorda kõigile talle teadaolevatele edasi, vähendades seejuures nn ttl (time to live) counti, et päringud lõpmatult rändama ei jääks.&lt;br /&gt;
&lt;br /&gt;
Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et sinu P2Net ei pea üldse salvestama võõraste P2Net-ide ip-sid ja porte! Samas ei ole ka kuidagi keelatud (debugimiseks või niisama huvi pärast vms) salvestada teiste P2Net-ide ip-sid, mida saab teada näiteks sulle tulnud päringutest, sulle vastajate ip-dest ja miks mitte ka portscannides :)&lt;br /&gt;
&lt;br /&gt;
== Miks just selline päringu edasisaatmisviis? ==&lt;br /&gt;
&lt;br /&gt;
Põhimõtteliselt saab päringut massidesse P2P meetoditega laiali saata kahel viisil:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Iteratiivne meetod&amp;lt;/b&amp;gt; (antud praksis seda ei kasuta): algne masin küsib tuttavatelt neile tuttavate masinate faile, ja suurendab seeläbi endale teadaolevate masinate hulka. Igalt uuelt teadasaadud masinalt küsib ta jälle selle masina tuttavate faile jne. Teised masinad algset päringut ise kuhugi edasi ei saada. Meetodi pluss on see, et algne masin saab lihtsalt tagada, et päringut ei saadetaks kaks korda samale masinale. Meetodi miinus on see, et kõik masinad võrgus saadavad lõpuks terve neile tuttavate masinate faili algsele masinale: see tähendab väga suurt hulka väga suurte failide saatmisi, mis hakkavad jõhkralt ummistama võrku, ja algse masina väike kanal tõenäoliselt ummistub varsti. Saadud failide ühisosad on väga suured. Halvemal juhul saab algne masin N identset sõnumit, kus igaühes on N ip-d, kus N on kõigi masinate arv, kus jookseb P2Net. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Rekursiivne meetod&amp;lt;/b&amp;gt; (antud praksis nõutud): algne masin saadab oma päringu tuttavatele masinatele, kes selle omakorda enda tuttavatele edasi saadavad jne. Igüks, kes leiab enda failide hulgast vajaliku faili, saadab info algsele masinale (vastasel korral ei saada ta algsele masinale midagi). Algne masin ei suurenda endale teadaolevate masinate hulka. Meetodi pluss on see, et algsele masinale saadetakse tagasi infot ainult siis, kui vajalik info leitakse (väga väike protsent masinaid) ja see info on lühike. Koormus võrgule langeb tugevasti ja algse masina kanal tõenäoliselt ei ummistu. Meetodi miinus on asjaolu, et üks ja sama masin võib saada algse päringu mitu korda eri suundadest, mis jällegi kasvatab võrgu koormust. Seda viimast probleemi saab  mitmel moel leevendada (kuigi mitte täielikult kaotada), eeskätt päringu ttl (time to live) parameetrit kasutades, päringu ahela masinate lisamises päringu parameetrite hulka jne.&lt;br /&gt;
&lt;br /&gt;
Gnutella kasutab rekursiivset meetodit, nii ka meie P2Net. Lihtsakoeline rekursiivne meetod ummistab suure klientide arvu korral võrgu ja sele asemel kasutavad suured P2P süsteemid kas:&lt;br /&gt;
* struktureeritud nn superpeeride süsteemi a la Kazaa ja esialgne Skype, kus rekursiivne päring toimub ainult superpeeride vahel, ja neid on vähe, või&lt;br /&gt;
* väga kavalat nn distributed hash tables (DHT) mehhanismi, a la freenet ja (osaliselt) bittorrent. DHT on üks mitmest bittorrenti poolt kasutatud meetodist, kuigi bittorrenti põhifookus on hoopis faili paralleelse allatõmbamise optimeerimisel mitme masina koostöös, mitte masinate/failide leidmisel. Või:&lt;br /&gt;
* kasutavad masinate leidmiseks eeskätt tsentraalseid servereid, a la esialgne Napster või kaasaegne Skype&lt;br /&gt;
&lt;br /&gt;
== Tehnilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:&lt;br /&gt;
&lt;br /&gt;
* Kogu programm peab töötama kas ITC-maja klassi arvutis või sinu oma läptopis, mis ITC maja klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi. Arusaadavalt võib aga panna P2Net lisaks käima ka suvalistesse välistesse masinatesse.&lt;br /&gt;
* Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit &amp;quot;suurt&amp;quot; http serverit a la apache kasutada ei või. Kõikvõimalike võrguteekide (versus eraldiseisvad veebiserverid) kasutamine on ok, mikroserverite koodi integreerimine oma programmi on ok.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
=== Otsipäringu saatmine ja edasisaatmine ===&lt;br /&gt;
&lt;br /&gt;
Konkreetsele masinale 11.22.33.44 (kus P2Net jookseb pordis 2345) käsu saatmine &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/run?prog=käsurida&amp;amp;sendip=55.66.77.88&amp;amp;sendport=6788&amp;amp;ttl=5&amp;amp;id=wqeqwe23&amp;amp;noask=11.22.33.44_111.222.333.444 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus parameetritel on järgmine sisu:&lt;br /&gt;
&lt;br /&gt;
* prog: käsk&lt;br /&gt;
* sendip: esialgse saatja ip&lt;br /&gt;
* sendport: esialgse saatja port&lt;br /&gt;
* ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)&lt;br /&gt;
* id: optsionaalne päringu identifikaator&lt;br /&gt;
* noask: optsionaalne list masinatest, kellele pole mõtet edastada (eraldajaks alakriips) &lt;br /&gt;
    &lt;br /&gt;
Päringu identifikaator ei pea tingimata üle terve võrgu unikaalne olema - lihtsam on ja ajab asja ära, kui&lt;br /&gt;
on saatva masina piires unikaalne.&lt;br /&gt;
&lt;br /&gt;
prog parameeter peab ilmselt olema urlencoded, näit. midagi taolist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;prog=ipconfig%20/displaydns&amp;amp;...   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GET-päringu vastuseks on õnnestunud päringu korral number 0,&lt;br /&gt;
ebaõnnestunud päringu korral muu (vea)number. Vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
P2Net-le tulnud päringu edasisaatmine käib täpselt sama protokolliga, kuid edasi saadetakse veidi muudetud päring:&lt;br /&gt;
&lt;br /&gt;
* ttl vähendatakse ühe võrra&lt;br /&gt;
* optionaalselt: lisatakse oma masina ip noask parameetrile otsa&lt;br /&gt;
&lt;br /&gt;
Seejuures &amp;lt;b&amp;gt;ei saadeta päringut edasi&amp;lt;/b&amp;gt;, kui sissetulnud ttl oli 1 võ i vähem (st ttl=0 päringuid enam kuhugi ei saadeta)&lt;br /&gt;
&lt;br /&gt;
Seda päringut saab ka brauserist katsetada, kuigi brauser ei saa vastuseks midagi huvitavat peale debugimis-vastuse 0 või mingi veakoodi.&lt;br /&gt;
&lt;br /&gt;
Klientide filtreerimine (juhul kui soovitakse juhtida mingit alamhulka masinatest) toimub programmi&lt;br /&gt;
käsurea kaudu. See osa ei ole kohustuslik vaid tuleneb konkreetsest rakendusest; protokollis see funktsionaalsus ei sisaldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tulemuse tagastamine algsele pärijale ===&lt;br /&gt;
&lt;br /&gt;
Vastus oleks http post meetodiga käivitatud programmi kogu väljundi saatmine algsele küsijale muutmata kujul&lt;br /&gt;
koos lisainfoga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POST-itatud data:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  {&amp;quot;sendip&amp;quot;: &amp;quot;55.66.77.88&amp;quot;, &lt;br /&gt;
    &amp;quot;sendport&amp;quot;: &amp;quot;6788&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;asasasas&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;: &amp;quot;ascii&amp;quot; või &amp;quot;base64&amp;quot;,	  &lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;failisisustring&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
id peaks vastama esialgse saatja antud id-le, juhul kui seda kasutatakse.     &lt;br /&gt;
* id: esialgse päringu id (kui oli algselt antud)&lt;br /&gt;
* content: käsureaprogrammi väljund (kui ei ole plaintext, peaks olema base64-encodetud)&lt;br /&gt;
* encoding: mis formaadis content on&lt;br /&gt;
* sendip: tulemuse saatnud masina ip&lt;br /&gt;
* sendport: tulemuse saatnud masina port&lt;br /&gt;
&lt;br /&gt;
Programm võiks ka mitte crashida, kui id puudu on, kuna id on optional (aga praktiline ja mõtekas on lisada).&lt;br /&gt;
&lt;br /&gt;
Postituse saaja vastab eduka kättesaamise korral arvu 0,&lt;br /&gt;
arusaamatuste korral mõne muu (vea) numbri. Jällegi, vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
== Praksi kaks osa ==&lt;br /&gt;
&lt;br /&gt;
Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:&lt;br /&gt;
&lt;br /&gt;
* Teha http protokolli järgida suutev esmane rakendus.&lt;br /&gt;
* Lisada sinna kogu vajalik funktsionaalsus.&lt;br /&gt;
&lt;br /&gt;
Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.&lt;br /&gt;
&lt;br /&gt;
== Soovitusi ja ideid ==&lt;br /&gt;
&lt;br /&gt;
Arendamiseks ja testimiseks pead saama jooksutada oma masinas mitut erinevat koopiat omaenda P2Net-st, igaüks oma pordil, igaühel oma konfifail tuttavate masinatega ja oma kataloog jagatavate failidega.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on teha P2Net käsurealt käivitavaks nii, et ta võtab kohe käsurealt pordinumbri parameetriks ning loeb siis oma konfifaili ja jagatavaid faile vastavast pordinumbrist tuletatud failipathist.&lt;br /&gt;
&lt;br /&gt;
Wazaa peab päris kindlasti sisaldama või kasutama http serverit, &lt;br /&gt;
muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.&lt;br /&gt;
&lt;br /&gt;
Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.&lt;br /&gt;
&lt;br /&gt;
C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks &lt;br /&gt;
on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,&lt;br /&gt;
ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja&lt;br /&gt;
[http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.&lt;br /&gt;
&lt;br /&gt;
Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).&lt;br /&gt;
&lt;br /&gt;
Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:&lt;br /&gt;
&lt;br /&gt;
* [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]&lt;br /&gt;
* [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]&lt;br /&gt;
* [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)] &lt;br /&gt;
* [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]&lt;br /&gt;
* [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]&lt;br /&gt;
* [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]&lt;br /&gt;
* [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]&lt;br /&gt;
* [http://tomayko.com/writings/unicorn-is-unix ruby]&lt;br /&gt;
* [http://jacobian.org/writing/python-is-unix/ python]&lt;br /&gt;
* [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]&lt;br /&gt;
* [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]&lt;br /&gt;
&amp;lt;!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firewall ja NAT ==&lt;br /&gt;
&lt;br /&gt;
Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).&lt;br /&gt;
&lt;br /&gt;
Kes P2Net käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte. &lt;br /&gt;
&lt;br /&gt;
Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:&lt;br /&gt;
* Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.&lt;br /&gt;
* UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid].   Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]&lt;br /&gt;
&lt;br /&gt;
NB! Seda kõike ei ole väga lihtne teha ja sinu P2Net (ja ka selle inimese P2Net, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne P2Net veel ei tööta!&lt;br /&gt;
&lt;br /&gt;
Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma P2Net jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!&lt;br /&gt;
&lt;br /&gt;
== Seda kohta pole vaja lugeda ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  F3AA34&lt;br /&gt;
    &lt;br /&gt;
  base64&lt;br /&gt;
    &lt;br /&gt;
  utf-8 moodi????&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Punktiarvestusest ==&lt;br /&gt;
&lt;br /&gt;
Kui kõik eelnimetatu töötab vastu mõne teise grupi P2Net-i ja &lt;br /&gt;
koodi suudetakse seletada, saab täispunktid.&lt;br /&gt;
&lt;br /&gt;
Kui teiste P2Net-programmidega ei suuda suhelda, aga iseenda koopiatega siiski, siis päris täispunkte ei saa.&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11745</id>
		<title>Vorgurakendused 2 prax 1 2014</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2014&amp;diff=11745"/>
		<updated>2014-09-11T23:20:53Z</updated>

		<summary type="html">&lt;p&gt;Priit: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
P2Net - P2P botnet&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;JUHENDI SEIS: Ülesande, s.h. protokolli kirjeldus paigas. Detailid võivad natuke muutuda, aga mitte nii et see juba alustatud tööd segaks.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ülesandeks on ehitada P2P rakendus P2Net programmide (käsurea kujul) käivitamiseks võõrastes masinates ja rehkendustulemuste kättesaamiseks, mis teeb laviinitaolise otsingu mööda P2Net klient/servereid, isetehtud P2P mehhanismi abil. &lt;br /&gt;
&lt;br /&gt;
Kasutajaliidese hea kvaliteet ei ole praksis oluline.&lt;br /&gt;
&lt;br /&gt;
Huvi korral võid vaadata ka veidi sarnaseid vanu ülesandeid [[Võrgurakendused 2013 prax 1 |2013 aasta arhiivis]] ning sealt edasi vanemaid. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== Üldkirjeldus ==&lt;br /&gt;
&lt;br /&gt;
P2Net võimaldab:&lt;br /&gt;
&lt;br /&gt;
* kasutajal käivitada võõrastes masinatest käsurea. &lt;br /&gt;
* saada tagasi käsurea rehkendatud tulemus(tekst/binary vms blob).&lt;br /&gt;
&lt;br /&gt;
Võõraste masinate leidmiseks kasutab P2Net järgmist viisi:&lt;br /&gt;
&lt;br /&gt;
* Saadab tema oma masinas oleva faili machines.txt masinatele käsu. machines.txt sees on masinate ip ja pordid json listina kujul &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[&amp;quot;11.22.33.44&amp;quot;,&amp;quot;2345&amp;quot;],...,[&amp;quot;111.222.333.444&amp;quot;,&amp;quot;23456&amp;quot;]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Samamoodi saadab käivitus-päringu P2Net startlehel http://dijkstra.cs.ttu.ee/~tammet/P2Net.txt olevatele masinatele (startlehel on plaintekstina eelmises punktis näidatud formaadis json-fail)&lt;br /&gt;
* Kui mingi masin saab minu päringu-käsurea kätte, siis ta paneb selle kohapeal käsureal käima ja saadab tulemuse päringu algatanud masinasse.&lt;br /&gt;
leiab minu otsitud faili, siis ta saadab mulle teate, et mis IP ja pordiga masin ja mis täisnimega fail on.&lt;br /&gt;
* Iga võõras masin, mis algselt minu käest tulnud päringu saab, saadab ta omakorda kõigile talle teadaolevatele edasi, vähendades seejuures nn ttl (time to live) counti, et päringud lõpmatult rändama ei jääks.&lt;br /&gt;
&lt;br /&gt;
Ehk, masinad saadavad minu antud päringut rekursiivselt ise edasi.&lt;br /&gt;
&lt;br /&gt;
Pane tähele, et sinu P2Net ei pea üldse salvestama võõraste P2Net-ide ip-sid ja porte! Samas ei ole ka kuidagi keelatud (debugimiseks või niisama huvi pärast vms) salvestada teiste P2Net-ide ip-sid, mida saab teada näiteks sulle tulnud päringutest, sulle vastajate ip-dest ja miks mitte ka portscannides :)&lt;br /&gt;
&lt;br /&gt;
== Miks just selline päringu edasisaatmisviis? ==&lt;br /&gt;
&lt;br /&gt;
Põhimõtteliselt saab päringut massidesse P2P meetoditega laiali saata kahel viisil:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Iteratiivne meetod&amp;lt;/b&amp;gt; (antud praksis seda ei kasuta): algne masin küsib tuttavatelt neile tuttavate masinate faile, ja suurendab seeläbi endale teadaolevate masinate hulka. Igalt uuelt teadasaadud masinalt küsib ta jälle selle masina tuttavate faile jne. Teised masinad algset päringut ise kuhugi edasi ei saada. Meetodi pluss on see, et algne masin saab lihtsalt tagada, et päringut ei saadetaks kaks korda samale masinale. Meetodi miinus on see, et kõik masinad võrgus saadavad lõpuks terve neile tuttavate masinate faili algsele masinale: see tähendab väga suurt hulka väga suurte failide saatmisi, mis hakkavad jõhkralt ummistama võrku, ja algse masina väike kanal tõenäoliselt ummistub varsti. Saadud failide ühisosad on väga suured. Halvemal juhul saab algne masin N identset sõnumit, kus igaühes on N ip-d, kus N on kõigi masinate arv, kus jookseb P2Net. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Rekursiivne meetod&amp;lt;/b&amp;gt; (antud praksis nõutud): algne masin saadab oma päringu tuttavatele masinatele, kes selle omakorda enda tuttavatele edasi saadavad jne. Igüks, kes leiab enda failide hulgast vajaliku faili, saadab info algsele masinale (vastasel korral ei saada ta algsele masinale midagi). Algne masin ei suurenda endale teadaolevate masinate hulka. Meetodi pluss on see, et algsele masinale saadetakse tagasi infot ainult siis, kui vajalik info leitakse (väga väike protsent masinaid) ja see info on lühike. Koormus võrgule langeb tugevasti ja algse masina kanal tõenäoliselt ei ummistu. Meetodi miinus on asjaolu, et üks ja sama masin võib saada algse päringu mitu korda eri suundadest, mis jällegi kasvatab võrgu koormust. Seda viimast probleemi saab  mitmel moel leevendada (kuigi mitte täielikult kaotada), eeskätt päringu ttl (time to live) parameetrit kasutades, päringu ahela masinate lisamises päringu parameetrite hulka jne.&lt;br /&gt;
&lt;br /&gt;
Gnutella kasutab rekursiivset meetodit, nii ka meie P2Net. Lihtsakoeline rekursiivne meetod ummistab suure klientide arvu korral võrgu ja sele asemel kasutavad suured P2P süsteemid kas:&lt;br /&gt;
* struktureeritud nn superpeeride süsteemi a la Kazaa ja esialgne Skype, kus rekursiivne päring toimub ainult superpeeride vahel, ja neid on vähe, või&lt;br /&gt;
* väga kavalat nn distributed hash tables (DHT) mehhanismi, a la freenet ja (osaliselt) bittorrent. DHT on üks mitmest bittorrenti poolt kasutatud meetodist, kuigi bittorrenti põhifookus on hoopis faili paralleelse allatõmbamise optimeerimisel mitme masina koostöös, mitte masinate/failide leidmisel. Või:&lt;br /&gt;
* kasutavad masinate leidmiseks eeskätt tsentraalseid servereid, a la esialgne Napster või kaasaegne Skype&lt;br /&gt;
&lt;br /&gt;
== Tehnilised nõuded ==&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeele ja muu tehnoloogia valik on vaba, kuid rakendus peab vastama neile tingimustele:&lt;br /&gt;
&lt;br /&gt;
* Kogu programm peab töötama kas ITC-maja klassi arvutis või sinu oma läptopis, mis ITC maja klassis kaasas. Mingit kaugel asuvat serverit põhirakenduse jaoks kasutada ei tohi. Arusaadavalt võib aga panna P2Net lisaks käima ka suvalistesse välistesse masinatesse.&lt;br /&gt;
* Http protokolli jms realisatsioon peab olema teie oma programmi osa, mingit &amp;quot;suurt&amp;quot; http serverit a la apache kasutada ei või. Kõikvõimalike võrguteekide (versus eraldiseisvad veebiserverid) kasutamine on ok, mikroserverite koodi integreerimine oma programmi on ok.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
=== Otsipäringu saatmine ja edasisaatmine ===&lt;br /&gt;
&lt;br /&gt;
Konkreetsele masinale 11.22.33.44 (kus P2Net jookseb pordis 2345) käsu saatmine &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/run?prog=käsurida&amp;amp;sendip=55.66.77.88&amp;amp;sendport=6788&amp;amp;ttl=5&amp;amp;id=wqeqwe23&amp;amp;noask=11.22.33.44_111.222.333.444 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kus parameetritel on järgmine sisu:&lt;br /&gt;
&lt;br /&gt;
* prog: käsk&lt;br /&gt;
* sendip: esialgse saatja ip&lt;br /&gt;
* sendport: esialgse saatja port&lt;br /&gt;
* ttl: kui mitu otsingu-hopi veel teha (iga edasiküsimine vähendab ühe võrra)&lt;br /&gt;
* id: optsionaalne päringu identifikaator&lt;br /&gt;
* noask: optsionaalne list masinatest, kellele pole mõtet edastada (eraldajaks alakriips) &lt;br /&gt;
    &lt;br /&gt;
Päringu identifikaator ei pea tingimata üle terve võrgu unikaalne olema - lihtsam on ja ajab asja ära, kui&lt;br /&gt;
on saatva masina piires unikaalne.&lt;br /&gt;
&lt;br /&gt;
prog parameeter peab ilmselt olema urlencoded, näit. midagi taolist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&amp;amp;prog=ipconfig%20/displaydns&amp;amp;...   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GET-päringu vastuseks on õnnestunud päringu korral number 0,&lt;br /&gt;
ebaõnnestunud päringu korral muu (vea)number. Vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
P2Net-le tulnud päringu edasisaatmine käib täpselt sama protokolliga, kuid edasi saadetakse veidi muudetud päring:&lt;br /&gt;
&lt;br /&gt;
* ttl vähendatakse ühe võrra&lt;br /&gt;
* optionaalselt: lisatakse oma masina ip noask parameetrile otsa&lt;br /&gt;
&lt;br /&gt;
Seejuures &amp;lt;b&amp;gt;ei saadeta päringut edasi&amp;lt;/b&amp;gt;, kui sissetulnud ttl oli 1 võ i vähem (st ttl=0 päringuid enam kuhugi ei saadeta)&lt;br /&gt;
&lt;br /&gt;
Seda päringut saab ka brauserist katsetada, kuigi brauser ei saa vastuseks midagi huvitavat peale debugimis-vastuse 0 või mingi veakoodi.&lt;br /&gt;
&lt;br /&gt;
Klientide filtreerimine (juhul kui soovitakse juhtida mingit alamhulka masinatest) toimub programmi&lt;br /&gt;
käsurea kaudu. See osa ei ole kohustuslik vaid tuleneb konkreetsest rakendusest; protokollis see funktsionaalsus ei sisaldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tulemuse tagastamine algsele pärijale ===&lt;br /&gt;
&lt;br /&gt;
Vastus oleks http post meetodiga käivitatud programmi kogu väljundi saatmine algsele küsijale muutmata kujul&lt;br /&gt;
koos lisainfoga&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
http://11.22.33.44:2345/result&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
POST-itatud data:&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  {&amp;quot;sendip&amp;quot;: &amp;quot;55.66.77.88&amp;quot;, &lt;br /&gt;
    &amp;quot;sendport&amp;quot;: &amp;quot;6788&amp;quot;,&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;asasasas&amp;quot;,&lt;br /&gt;
    &amp;quot;encoding&amp;quot;: &amp;quot;ascii&amp;quot; või &amp;quot;base64&amp;quot;,	  &lt;br /&gt;
    &amp;quot;content&amp;quot;: &amp;quot;failisisustring&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
id peaks vastama esialgse saatja antud id-le, juhul kui seda kasutatakse.     &lt;br /&gt;
* id: esialgse päringu id (kui oli algselt antud)&lt;br /&gt;
* content: käsureaprogrammi väljund (kui ei ole plaintext, peaks olema base64-encodetud)&lt;br /&gt;
* encoding: mis formaadis content on&lt;br /&gt;
* sendip: tulemuse saatnud masina ip&lt;br /&gt;
* sendport: tulemuse saatnud masina port&lt;br /&gt;
&lt;br /&gt;
Programm võiks ka mitte crashida, kui id puudu on, kuna id on optional (aga praktiline ja mõtekas on lisada).&lt;br /&gt;
&lt;br /&gt;
Postituse saaja vastab eduka kättesaamise korral arvu 0,&lt;br /&gt;
arusaamatuste korral mõne muu (vea) numbri. Jällegi, vastuse mõte on eeskätt debugimise lihtsustamine ja vastust peaks pärija üldiselt ignoreerima. P2Net peaks töötama edukalt ka juhul, kui ta saatmise peale ühenduse lihtsalt kinni paneb ja vastust kuulama ei hakka.&lt;br /&gt;
&lt;br /&gt;
== Praksi kaks osa ==&lt;br /&gt;
&lt;br /&gt;
Väga soovitav on teha praks kahes osas ja esitada kaks korda ülevaatamiseks:&lt;br /&gt;
&lt;br /&gt;
* Teha http protokolli järgida suutev esmane rakendus.&lt;br /&gt;
* Lisada sinna kogu vajalik funktsionaalsus.&lt;br /&gt;
&lt;br /&gt;
Http protokolli järgimise võimet kontrollitakse praksi eduka läbimise tingimusena.&lt;br /&gt;
&lt;br /&gt;
== Soovitusi ja ideid ==&lt;br /&gt;
&lt;br /&gt;
Arendamiseks ja testimiseks pead saama jooksutada oma masinas mitut erinevat koopiat omaenda P2Net-st, igaüks oma pordil, igaühel oma konfifail tuttavate masinatega ja oma kataloog jagatavate failidega.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on teha P2Net käsurealt käivitavaks nii, et ta võtab kohe käsurealt pordinumbri parameetriks ning loeb siis oma konfifaili ja jagatavaid faile vastavast pordinumbrist tuletatud failipathist.&lt;br /&gt;
&lt;br /&gt;
Wazaa peab päris kindlasti sisaldama või kasutama http serverit, &lt;br /&gt;
muidu ei ole temaga võimalik väljast ühendust võtta. NB! See ei tähenda mingit nö suurt veebiserverit a la apache, vaid pigem ise kirjutatud väikest minimaalset serverit, mis pealegi ei pea veebilehti serveerima ja cgi-sid käivitama, vaid ainult teatud käskudele/parameetritele reageerima.&lt;br /&gt;
&lt;br /&gt;
Server tuleb realiseerida ise, kasutades võrgust leitavaid näiteid mikro-http-serveri jaoks (tüüpiliselt paar lehekülge koodi). Selliseid näitekoode võib täiesti otse kasutada.&lt;br /&gt;
&lt;br /&gt;
C jaoks on sobiv mikroserver näiteks [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny], java jaoks &lt;br /&gt;
on [http://www.java2s.com/Code/Java/Tiny-Application/HttpServer.htm see server] väga hea väike näide, aga selgitava tekstita,&lt;br /&gt;
ning selgitavate tekstidega servereid leiad mh [http://onjava.com/pub/a/onjava/2003/04/23/java_webserver.html siit] ja&lt;br /&gt;
[http://fragments.turtlemeat.com/javawebserver.php siit].Loe java socketitest põhjalikumalt [http://download.oracle.com/javase/tutorial/networking/sockets/ siit]. Pythoni serverinäite [http://muharem.wordpress.com/2007/05/29/roll-your-own-server-in-50-lines-of-code/ saad siit]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
Kasutajaliides võib olla tehtud aknaga, aga see ei ole kohustuslik: võib teha ka puhtalt käsurea rakenduse.&lt;br /&gt;
&lt;br /&gt;
Rakendus on mõistlik teha nii, et annad käivitamisel ette pordi, millel ta räägib, ning kui seda porti ei ole antud, siis kasutad vaikimisi porti 1215 (1214 on Kazaa port).&lt;br /&gt;
&lt;br /&gt;
Häid selgeid näiteid ja õpetusi socketite ja serveri tegemise kohta leiad veel siit:&lt;br /&gt;
&lt;br /&gt;
* [http://www.prasannatech.net/2008/07/socket-programming-tutorial.html socketite kasutamise õpetus ja source C-s, javas ja pythonis]&lt;br /&gt;
* [http://www.jbox.dk/sanos/webserver.htm lihtne veebiserver C-s (eksootilise sanosi all)]&lt;br /&gt;
* [http://www.ibm.com/developerworks/systems/library/es-nweb/index.html lihtne veebiserver/klient C-s (ibm-i tutorial ja source)] &lt;br /&gt;
* [http://www.lambda.ee/images/8/89/Itsissejuhatus_tiny.zip tiny webserver C-s]&lt;br /&gt;
* [http://download.oracle.com/javase/tutorial/networking/sockets/ java socketid: klassikaline tutorial]&lt;br /&gt;
* [http://www.tud.ttu.ee/material/kallik/JOOP/Jutukas/ Kaarel Alliku kursuse näite-jutukas (java)]&lt;br /&gt;
* [http://www.rgagnon.com/javadetails/java-have-a-simple-http-server.html java http teegi kasutamine, mis kasutab socketeid sisemiselt]&lt;br /&gt;
* [http://tomayko.com/writings/unicorn-is-unix ruby]&lt;br /&gt;
* [http://jacobian.org/writing/python-is-unix/ python]&lt;br /&gt;
* [http://docs.python.org/library/socketserver.html pythoni üks serversocketi-teek]&lt;br /&gt;
* [http://beej.us/guide/bgnet/ Väga põhjalik socketite/võrguprogrammeerimise õpetus]&lt;br /&gt;
&amp;lt;!-- * [http://heather.cs.ucdavis.edu/~matloff/Python/PyNet.pdf Pythoni socketiprogrammeerimise õpetus] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Firewall ja NAT ==&lt;br /&gt;
&lt;br /&gt;
Firewallist läbi murdmise ja kinniste portidega ühendamise probleemiga ei pea selles praksis tegelema. Samas tähendab see, et ei ole kuigi lihtne teise masinaga tegelikult ühendust saada (ühes masinas debugimise võimaldamine ongi seepärast kriitiline).&lt;br /&gt;
&lt;br /&gt;
Kes P2Net käima saab, võib mõelda välja ja realiseerida probleemi lahendamiseks sobiva vaheserveri: selle eest saab ekstrapunkte. &lt;br /&gt;
&lt;br /&gt;
Võrgust infot otsides leiad kahte liiki teemasid, meie jaoks oluline on siit listist teine:&lt;br /&gt;
* Tunneldamise artiklid, loe näiteks [http://en.wikipedia.org/wiki/HTTP_tunnel http tunnel] artiklit wikipediast ja [http://sebsauvage.net/punching/ seda artiklit] firewallist läbipääsemisest.&lt;br /&gt;
* UDP/TCP hole punching ja NAT traversal: arusaadava sissejuhatusena loe [http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html Skype jms süsteemide meetoditest], sellele [http://www.portugal-a-programar.org/forum/index.php?topic=7852.0 väike täiendus]. Vaata ka [http://en.wikipedia.org/wiki/Session_Traversal_Utilities_for_NAT wikipedia utiliitide artiklit ja viiteid].   Detailsemalt/lisaks [http://www.brynosaurus.com/pub/net/p2pnat/ siit] ja [http://nutss.gforge.cis.cornell.edu/pub/imc05-tcpnat/ siit] ja [http://www.jdrosen.net/midcom_turn.html siit] ja [http://www.ietf.org/rfc/rfc3489.txt siit], keerulise vahendi leiab [http://natblaster.sourceforge.net/ siit]&lt;br /&gt;
&lt;br /&gt;
NB! Seda kõike ei ole väga lihtne teha ja sinu P2Net (ja ka selle inimese P2Net, kellega suhtled) peab ka oskama seda vaheserverit kasutada. Ära hakka seda ehitama, kui nö lihtne P2Net veel ei tööta!&lt;br /&gt;
&lt;br /&gt;
Ekstra-lisapunktide saamise variant: realiseeri ja pane kõigile kasutatavaks firewalliprobleemi lahendamiseks sobiv vaheserver. Kirjuta kasutamise juhend ja näited, mida teised saaks soovi korral oma P2Net jaoks tarvitada (st panna nad sinu vaheserverit kasutama, nii et seda saaks ka arvutiklassist kasutada). Esimesed kaks gruppi, kes sellega hakkama saavad, saavad lisaks pooled praksipunktid!&lt;br /&gt;
&lt;br /&gt;
== Seda kohta pole vaja lugeda ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  F3AA34&lt;br /&gt;
    &lt;br /&gt;
  base64&lt;br /&gt;
    &lt;br /&gt;
  utf-8 moodi????&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Punktiarvestusest ==&lt;br /&gt;
&lt;br /&gt;
Kui kõik eelnimetatu töötab vastu mõne teise grupi P2Net-i ja &lt;br /&gt;
koodi suudetakse seletada, saab täispunktid.&lt;br /&gt;
&lt;br /&gt;
Kui teiste P2Net-programmidega ei suuda suhelda, aga iseenda koopiatega siiski, siis päris täispunkte ei saa.&lt;/div&gt;</summary>
		<author><name>Priit</name></author>
	</entry>
</feed>