<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Vorgurakendused_2_prax_1_2019_kevad</id>
	<title>Vorgurakendused 2 prax 1 2019 kevad - Redigeerimiste ajalugu</title>
	<link rel="self" type="application/atom+xml" href="http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Vorgurakendused_2_prax_1_2019_kevad"/>
	<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;action=history"/>
	<updated>2026-10-28T12:31:58Z</updated>
	<subtitle>Selle lehekülje redigeerimiste ajalugu</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15589&amp;oldid=prev</id>
		<title>Martinv: /* Ülesanne */</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15589&amp;oldid=prev"/>
		<updated>2019-03-07T13:52:41Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Ülesanne&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;et&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←Vanem redaktsioon&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Redaktsioon: 7. märts 2019, kell 15:52&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l17&quot;&gt;17. rida:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;17. rida:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Programmeerimiskeel on vabalt valitav. Masin(ad), kus su süsteem töötab, on vabalt valitavad: võid kasutada oma laptoppi, arvutiklassi arvutit, dijkstrat või mõnda muud serverit.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Programmeerimiskeel on vabalt valitav. Masin(ad), kus su süsteem töötab, on vabalt valitavad: võid kasutada oma laptoppi, arvutiklassi arvutit, dijkstrat või mõnda muud serverit.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;NB! Siin praksis ei või kasutada nö suurt veebiserverit a la Apache, Nginx vms. Lihtsad http teegid on samas OK. Ei &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;soovitaks &lt;/del&gt;kasutada ka veebiraamistikke a la Spring &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;vms&lt;/del&gt;: need ei ole esimese praksi jaoks mõttekad ning nende jaoks on eraldi 2. praksi variant.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;strong&amp;gt;&lt;/ins&gt;NB! Siin praksis ei või kasutada nö suurt veebiserverit a la Apache, Nginx vms. Lihtsad http teegid on samas OK &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;- näiteks Pythonisse sisseehitatud SocketServer&lt;/ins&gt;. Ei &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tohiks &lt;/ins&gt;kasutada ka veebiraamistikke a la Spring&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, Flask või keerukamaid implementatsioone nagu AIOHTTP&lt;/ins&gt;: need ei ole esimese praksi jaoks mõttekad ning nende jaoks on eraldi 2. praksi variant.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/strong&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Praktikumi lõpus pead tegema juhendajale oma grupiga väikese demo - et kuidas töötab - ja seletama natuke oma koodi ehitust.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Praktikumi lõpus pead tegema juhendajale oma grupiga väikese demo - et kuidas töötab - ja seletama natuke oma koodi ehitust.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Martinv</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15561&amp;oldid=prev</id>
		<title>Tammet: /* Rakenduse variant 1: distributed ledgeri komponent */</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15561&amp;oldid=prev"/>
		<updated>2019-02-27T17:23:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Rakenduse variant 1: distributed ledgeri komponent&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;et&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←Vanem redaktsioon&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Redaktsioon: 27. veebruar 2019, kell 19:23&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l186&quot;&gt;186. rida:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;186. rida:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Jällegi, kättesaadud blokk tuleks salvestada ja omakorda teistele kloonidele laiali saata. Pane tähele, et kui sa oled mingi hashiga bloki saad, siis peaksid vaatama, kas ta sul juba on, ja kui on, siis mitte edasi saatma.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Jällegi, kättesaadud blokk tuleks salvestada ja omakorda teistele kloonidele laiali saata. Pane tähele, et kui sa oled mingi hashiga bloki saad, siis peaksid vaatama, kas ta sul juba on, ja kui on, siis mitte edasi saatma.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;== Märkmeid presentatsiooni kohta ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Arvesta, et sul on mitu node: &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* eristamiseks vaja porti, AGA ip ka! Siis saab mitme masinaga katsetada.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* raporteeri, et mis juhtus mitme masinaga katsetamisel&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Protokoll suhtlemiseks:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* tahaks aru saada protokollist&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* selleks peaks olema näitefail, kus on päringute ja vastuste näited&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;== Tähelepanekuid P2P paremaks organiseerimiseks ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[P2P realiseerimise märkmeid]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Rakenduse variant 2: anonümiseeriv võrk =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Rakenduse variant 2: anonümiseeriv võrk =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Tammet</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15320&amp;oldid=prev</id>
		<title>Kanter – 31. jaanuar 2019, kell 08:56</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15320&amp;oldid=prev"/>
		<updated>2019-01-31T08:56:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;et&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←Vanem redaktsioon&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Redaktsioon: 31. jaanuar 2019, kell 10:56&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l102&quot;&gt;102. rida:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;102. rida:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Rakenduse variant 1: distributed ledgeri komponent =&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= Rakenduse variant 1: distributed ledgeri komponent =&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Sul on vaja kirjutada lihtne bitcoini-tüüpi rakendus, mis suudab leida oma kloone ehk sõlmi võrgus, küsida neilt olemasolevaid ledgeri &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blokke &lt;/del&gt;ja saata neile endale teadaolevaid blokke ja uusi transaktsioone (transaktsioonid on ülekanded ehk mistahes info, millest blokk kokku pannakse).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Sul on vaja kirjutada lihtne bitcoini-tüüpi rakendus, mis suudab leida oma kloone ehk sõlmi võrgus, küsida neilt olemasolevaid ledgeri &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;plokke &lt;/ins&gt;ja saata neile endale teadaolevaid blokke ja uusi transaktsioone (transaktsioonid on ülekanded ehk mistahes info, millest blokk kokku pannakse).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;quot;Ledgeri blokk&amp;quot; võib selles praksis olla lihtsalt suvaline string või json struktuur: neid ei pea kontrollima, sünkima ega kaevandama. Piisab lihtsalt nende kogumisest ja soovijatele laialisaatmisest.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;quot;Ledgeri blokk&amp;quot; võib selles praksis olla lihtsalt suvaline string või json struktuur: neid ei pea kontrollima, sünkima ega kaevandama. Piisab lihtsalt nende kogumisest ja soovijatele laialisaatmisest.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Kanter</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15315&amp;oldid=prev</id>
		<title>Tammet: /* HTTP server/klient */</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15315&amp;oldid=prev"/>
		<updated>2019-01-30T15:01:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;HTTP server/klient&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;et&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←Vanem redaktsioon&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Redaktsioon: 30. jaanuar 2019, kell 17:01&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l81&quot;&gt;81. rida:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;81. rida:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;HTTP baasil töötav protokoll näeb välja umbes järgmine:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;HTTP baasil töötav protokoll näeb välja umbes järgmine:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   GET http://1.2.3.4/request?param1=val1&amp;amp;param2=&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;val2&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   GET http://1.2.3.4/request?param1=val1&amp;amp;param2=&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;val&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   POST http://1.2.3.5/response&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;?&lt;/del&gt;param1=val1&amp;amp;param3=val3&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   POST http://1.2.3.5/response&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  ...&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/ins&gt;param1=val1&amp;amp;param3=val3&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;jne. Seega tuleb meil teha:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;jne. Seega tuleb meil teha:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Tammet</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15258&amp;oldid=prev</id>
		<title>Tammet: Uus lehekülg: &#039;Fail:Shut-up-and-take-my-bitcoin.jpg  = Ülesanne =  Sul on võimalik valida kahe erineva ülesande vahel:  * Lihtsa P2P võrgu realiseerimine ja sellele distributed ledgeri...&#039;</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Vorgurakendused_2_prax_1_2019_kevad&amp;diff=15258&amp;oldid=prev"/>
		<updated>2019-01-30T07:00:57Z</updated>

		<summary type="html">&lt;p&gt;Uus lehekülg: &amp;#039;&lt;a href=&quot;/wiki/Fail:Shut-up-and-take-my-bitcoin.jpg&quot; title=&quot;Fail:Shut-up-and-take-my-bitcoin.jpg&quot;&gt;Fail:Shut-up-and-take-my-bitcoin.jpg&lt;/a&gt;  = Ülesanne =  Sul on võimalik valida kahe erineva ülesande vahel:  * Lihtsa P2P võrgu realiseerimine ja sellele distributed ledgeri...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Uus lehekülg&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Fail:Shut-up-and-take-my-bitcoin.jpg]]&lt;br /&gt;
&lt;br /&gt;
= Ülesanne =&lt;br /&gt;
&lt;br /&gt;
Sul on võimalik valida kahe erineva ülesande vahel:&lt;br /&gt;
&lt;br /&gt;
* Lihtsa P2P võrgu realiseerimine ja sellele distributed ledgeri mõne aluskomponendi (mitte veel terve ledgeri) realiseerimine.&lt;br /&gt;
&lt;br /&gt;
* Lihtsa P2P võrgu realiseerimine ja sellel anonümiseeriva võrgu (mikro-TOR) realiseerimine.&lt;br /&gt;
&lt;br /&gt;
Kummalgi juhul on sul alustuseks vaja implementeerida lihtne P2P protokoll üle HTTP, nii et:&lt;br /&gt;
&lt;br /&gt;
* protokoll oleks realiseeritud HTTP protokolli peale (vaja implementeerida ka HTTP server ja klient)&lt;br /&gt;
* mitu sinu rakenduse klooni suudavad suhelda nii samas masinas, töötades eri portide peal, kui mitmes erinevas masinas eri IP-de peal.&lt;br /&gt;
* eesmärk on kõigi rakendused omavahel suhtlema ja ühise võrguna tegutsema panna&lt;br /&gt;
&lt;br /&gt;
Programmeerimiskeel on vabalt valitav. Masin(ad), kus su süsteem töötab, on vabalt valitavad: võid kasutada oma laptoppi, arvutiklassi arvutit, dijkstrat või mõnda muud serverit.&lt;br /&gt;
&lt;br /&gt;
NB! Siin praksis ei või kasutada nö suurt veebiserverit a la Apache, Nginx vms. Lihtsad http teegid on samas OK. Ei soovitaks kasutada ka veebiraamistikke a la Spring vms: need ei ole esimese praksi jaoks mõttekad ning nende jaoks on eraldi 2. praksi variant.&lt;br /&gt;
&lt;br /&gt;
Praktikumi lõpus pead tegema juhendajale oma grupiga väikese demo - et kuidas töötab - ja seletama natuke oma koodi ehitust.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Jooksvalt praktikumide käigus täienev nimekiri soovitustest kuidas rakendust samm-sammult ehitada asub siin: https://github.com/martinve/pyp2p&amp;#039;&amp;#039;&amp;#039; Näidisrakendus on kirjutatud Pythonis aga tegevuste nimekiri on universaale sõltumata platvormist.&lt;br /&gt;
&lt;br /&gt;
= Kuidas alustada =&lt;br /&gt;
&lt;br /&gt;
Sul on kõigepealt vaja teha väike P2P rakendus, ehk proge, mis suudaks oma kloonidega suhelda. Konkreetsemalt:&lt;br /&gt;
&lt;br /&gt;
* sinu proge on käsurea rakendus ilma kasutajaliideseta&lt;br /&gt;
* ta kuulab, kas temaga tahetakse võtta ühendust ja võtab ise teistega ühendust&lt;br /&gt;
* tahame saavutada, et meil käib korraga N koopiat, eri masinates, ja nad süngivad omavahel datat (ledgeri puhul) või saadavad päringuid teistele laiali (tori puhul).&lt;br /&gt;
* &amp;quot;teiste kuulamine tähendab&amp;quot;, et ta on server&lt;br /&gt;
* eeldame, et ühendus toimub üle http&lt;br /&gt;
&lt;br /&gt;
Kõigepealt tee nii, et sinu proge reageeriks http päringutele ja vastaks neile mingi testvastuse, et sa saaks ise aru, et ta on värgi kätte saanud.&lt;br /&gt;
&lt;br /&gt;
Järgmine asi on panna ta ise teistega ühendust võtma: siis ta avab urli nagu brauser.&lt;br /&gt;
&lt;br /&gt;
Küsimus, et kuidas päringuid kodeerida.&lt;br /&gt;
&lt;br /&gt;
võtame GET näite urliga&lt;br /&gt;
&lt;br /&gt;
   http://1.2.3.4:4500/request?param1=val1&amp;amp;param2=val2&lt;br /&gt;
&lt;br /&gt;
siin  http://1.2.3.4:4500/ ütleb, mis masinaga (1.2.3.4) ühendust võtta mis pordilt (4500)&lt;br /&gt;
ja see   &lt;br /&gt;
   request?param1=val1&amp;amp;param2=val2 &lt;br /&gt;
on string, mis rakendus kätte saab ja ise parsima peab, ja mida võib kodeerida ehk&lt;br /&gt;
ka näiteks nii &lt;br /&gt;
&lt;br /&gt;
   /val1/val2/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
POST puhul see osa &lt;br /&gt;
    request?param1=val1&amp;amp;param2=val2 &lt;br /&gt;
on mittevajalik ja parem oleks teha ainult&lt;br /&gt;
     http://1.2.3.4:4500/ &lt;br /&gt;
ja saata sisu jsoni tekstina a la &lt;br /&gt;
    {&amp;quot;param1&amp;quot;:val1, &amp;quot;param2&amp;quot;:val2}&lt;br /&gt;
kuigi saab ka saata postiga lihtsalt &lt;br /&gt;
     param1=val1&amp;amp;param2=val2 &lt;br /&gt;
mis on veidi vähem mainstream.&lt;br /&gt;
&lt;br /&gt;
Mis teeb käsurea rakendus? Panen ta käima, ta jääbki käima ja trükib vajadusel debuginfot. &lt;br /&gt;
Tal peab olema pordikuulamise tükk sees ja talle peab kuskil ütlema, et mis porti kuulata.   Tal võiks olla default port a la 5134 ja saad käivitades öelda pordi a la  ühes aknas&lt;br /&gt;
&lt;br /&gt;
    prog.py 6345&lt;br /&gt;
&lt;br /&gt;
teises aknas aga&lt;br /&gt;
&lt;br /&gt;
    prog.py 7890&lt;br /&gt;
&lt;br /&gt;
NB! Iga kloon samas masinas peaks olema eri pordil.&lt;br /&gt;
&lt;br /&gt;
== Näidisrakendus ==&lt;br /&gt;
&lt;br /&gt;
Näidisrakenduse implementatsioon Pythonis on leitav Githubist: https://github.com/martinve/pyp2p&lt;br /&gt;
&lt;br /&gt;
= HTTP server/klient =&lt;br /&gt;
&lt;br /&gt;
HTTP baasil töötav protokoll näeb välja umbes järgmine:&lt;br /&gt;
&lt;br /&gt;
  GET http://1.2.3.4/request?param1=val1&amp;amp;param2=val2&lt;br /&gt;
  POST http://1.2.3.5/response?param1=val1&amp;amp;param3=val3&lt;br /&gt;
&lt;br /&gt;
jne. Seega tuleb meil teha:&lt;br /&gt;
&lt;br /&gt;
# HTTP server, mis suudaks vastu võtta GET ja POST päringut ning parseerida pathi ja parameetrid (query stringi). Meid huvitab ka IP, kust päring tuli, see tuleb edaspidi kasutamiseks meelde jätta. POST päringu puhul peab lugema päringu &amp;quot;keha&amp;quot; (body).&lt;br /&gt;
# Selle peale peaks serveris käivituma mingi funktsioon. Selle võime jätta hetkel tühjaks&lt;br /&gt;
# Lõpuks saadame vastuse samuti HTTP päringuga. Seega vaja selleks HTTP klienti.&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://tinyhttpd.cvs.sourceforge.net/viewvc/tinyhttpd/tinyhttpd/httpd.c?revision=1.4&amp;amp;view=markup tiny], java jaoks sobib alustuseks [http://stackoverflow.com/questions/3732109/simple-http-server-in-java-using-only-java-se-api sisseehitatud HTTP server]. Socketi tasemel alternatiividest&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]; [https://daanlenaerts.com/blog/2015/06/03/create-a-simple-http-server-with-python-3/ lühem ja uuem]. Http kohta võib lugeda [http://www.jmarshall.com/easy/http/ näiteks siit].&lt;br /&gt;
&lt;br /&gt;
= Rakenduse variant 1: distributed ledgeri komponent =&lt;br /&gt;
&lt;br /&gt;
Sul on vaja kirjutada lihtne bitcoini-tüüpi rakendus, mis suudab leida oma kloone ehk sõlmi võrgus, küsida neilt olemasolevaid ledgeri blokke ja saata neile endale teadaolevaid blokke ja uusi transaktsioone (transaktsioonid on ülekanded ehk mistahes info, millest blokk kokku pannakse).&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Ledgeri blokk&amp;quot; võib selles praksis olla lihtsalt suvaline string või json struktuur: neid ei pea kontrollima, sünkima ega kaevandama. Piisab lihtsalt nende kogumisest ja soovijatele laialisaatmisest. &lt;br /&gt;
&lt;br /&gt;
Sa võid ise valida, kas &lt;br /&gt;
&lt;br /&gt;
* realiseerid lihtsustatud protokolli, millega saad ise distributed ledgeri ehitada, ei saa aga suhelda päris-bitcoini sõlmedega. &lt;br /&gt;
* või realiseerid alamhulga tegelikust bitcoini protokollist: see on tehniliselt päris keeruline (protokoll on bititasemel ja seal on palju detaile), samas saad siis ise leida päris-bitcoini võrgusõlmi ja katsetada, mis juhtub, kui neile näiteks ise ülekandeid vms saadad. Kui seda kaalud, siis loe enne bitcoini materjale kursuse põhilehel ja tutvu hardcore dokumentatsiooniga algul siit https://bitcoin.org/en/developer-guide#p2p-network ja siis siit https://en.bitcoin.it/wiki/Protocol_documentation&lt;br /&gt;
&lt;br /&gt;
Nüüd detailsemalt meie oma lihtsustatud protokollist. Edaspidises eeldame, et http päringud on GET päringud, kui mõne puhul pole spetsiaalselt öeldud, et tegu on POST päringuga.&lt;br /&gt;
Pane tähele, et sul on vaja realiseerida nii kloonide/blokkide küsimine kui nende küsimisele vastamine!&lt;br /&gt;
&lt;br /&gt;
== Kloonide ehk sõlmede leidmine võrgus ==&lt;br /&gt;
&lt;br /&gt;
Klooni leidmine tähendab, et saad teada ip aadressi ja pordi, kus võiks olla töötav kloon.&lt;br /&gt;
Sinu rakendusel peaks kõigepealt olema väike konfifail, kuhu saad kirjutada järjest mõned ip aadressid ja pordid: soovitav on see esitada teha jsoni listina. Käivitades hakkab sinu rakendus neid läbi käima ja küsima neilt, milliseid teisi kloone nad teavad. Nii kogud kokku pikema listi kloonidest. Samuti pead suutma vastata endale teadaolevate kloonide päringule.&lt;br /&gt;
&lt;br /&gt;
Soovitav on realiseerida päring http protokolliga, näiteks nii:&lt;br /&gt;
&lt;br /&gt;
  http://xx.xx.xx.xx:yyyy/addr&lt;br /&gt;
&lt;br /&gt;
millele vastatakse kloonide json listiga, samas formaadis, kui sinu konfifailis.&lt;br /&gt;
&lt;br /&gt;
Reaalse töö käigus ei ole sul vaja leida kõiki töötavaid kloone, piisab mingist &amp;quot;mõistlikust&amp;quot; hulgast.&lt;br /&gt;
&lt;br /&gt;
Hea mõte on taustaks läbi lugeda need lühikesed jutud kursuse põhilehelt (arusaadavalt ei pea sa neid meetodeid realiseerima):&lt;br /&gt;
* https://bitcoin.stackexchange.com/questions/3536/how-do-bitcoin-clients-find-each-other&lt;br /&gt;
* https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery&lt;br /&gt;
&lt;br /&gt;
== Ledgeri blokkide küsimine  ==&lt;br /&gt;
&lt;br /&gt;
Sul on vaja regulaarselt küsida ja kettal hoida nö ametliku ledgeri kõiki blokke. Ledger on lihtsalt blokkide list. Igal blokil on oma tekstiline id (bitcoini puhul bloki hash) ja sisu. Bloki hash tuleb arvutada bloki tekstilise esituse pealt sha-256 hashifunktsiooniga, ning konvertida hex-kujule. Hashe saadame siis alati hex-kujul.&lt;br /&gt;
&lt;br /&gt;
Nagu öeldud, ei pea me esimeses praksis blokkide sisuga ja nende kontrollimisega tegelema, selleks on teine praks.&lt;br /&gt;
&lt;br /&gt;
Kuna sul võib juba olla mingi hulk ledgeri blokke salvestatud, siis on kasulik saada küsida ka blokke alates mingist teadaolevast blokist (ehk tema hashist). &lt;br /&gt;
&lt;br /&gt;
Blokkide järjestuse võid teha esialgu lihtsalt nii, et hoiad blokke saabumise järjekorras. Lõplikus ledgeri variandis peaks blokid olema hashchaini järjestuses (blokk N+1 hash moodustatakse bloki sisust+eelmise bloki hashist, vaata [https://blog.ethereum.org/wp-content/uploads/2015/11/mining.jpg seda pilti], kus on näha bloki sees olev hashide merkle puu ja blokkide järjestus lihtsa hashiahelana), aga seda hashchaini ja kontrolli ei ole esialgu vaja teha.&lt;br /&gt;
&lt;br /&gt;
Blokkide küsimine peaks välja nägema nii, et saad &lt;br /&gt;
* küsida korraga blokkide nimistut ehk hashide listi (kas tervet või ainult uuemaid)&lt;br /&gt;
* küsida konkreetseid blokke vastavalt nende hashidele.&lt;br /&gt;
&lt;br /&gt;
Kõigi blokkide nimistu küsimine võiks välja näha nii:&lt;br /&gt;
 &lt;br /&gt;
  http://xx.xx.xx.xx:yyyy/getblocks&lt;br /&gt;
&lt;br /&gt;
ja alates-blokist-Z nii:&lt;br /&gt;
&lt;br /&gt;
  http://xx.xx.xx.xx:yyyy/getblocks/Z&lt;br /&gt;
&lt;br /&gt;
kus Z on bloki id ehk hash.&lt;br /&gt;
&lt;br /&gt;
Vastuseks võiksid saada bloki hashide listi.&lt;br /&gt;
&lt;br /&gt;
Ühe konkreetse bloki küsimine võiks välja näha nii:&lt;br /&gt;
&lt;br /&gt;
  http://xx.xx.xx.xx:yyyy/getdata/H&lt;br /&gt;
&lt;br /&gt;
kus H on bloki hash, millele vastavat blokki tahad.&lt;br /&gt;
&lt;br /&gt;
== Uute transaktsioonide ja uute ledgeri blokkide laialisaatmine  ==&lt;br /&gt;
&lt;br /&gt;
Siin toimub tehingute ja blokkide laviinitaoline laialisaatmine kõigile kloonidele: iga kloon salvestab talle saadetud info ja saadab selle siis teistele edasi.&lt;br /&gt;
&lt;br /&gt;
Sul olema võimalik omal initsiatiivil laiali saata transaktsioone ehk ülekandeid (a la Jaan kannab 2018-02-15 Antsule 0.0001 bitcoini).&lt;br /&gt;
&lt;br /&gt;
See päring võiks olla POST päring, kus url on&lt;br /&gt;
&lt;br /&gt;
  http://xx.xx.xx.xx:yyyy/inv&lt;br /&gt;
&lt;br /&gt;
ning postitatud väärtus (st tekst peale http päiste järel olevat tühja rida) on on transaktsiooni hash ja tema json-esitus. Transaktsiooni sisu võiks esialgu olla suvaline (json) string. Sellise postitatud päringu vastuseks võiks anda kas arvu 1 kui transaktsioon aktsepteeriti või veateate (näiteks {&amp;quot;errcode&amp;quot;: ..., &amp;quot;errmsg&amp;quot;: ...} kui teda ei aktsepteeritud.&lt;br /&gt;
&lt;br /&gt;
Kättesaadud transaktsioon tuleks salvestada ja omakorda teistele kloonidele laiali saata. Pane tähele, et kui sa oled mingi hashiga transaktsiooni saad, siis peaksid vaatama, kas ta sul juba on, ja kui on, siis mitte edasi saatma.&lt;br /&gt;
&lt;br /&gt;
Samuti peab sul olema võimalik saata teistele kloonidele omal initsiatiivil uusi blokke, mis nemad peaks oma ahela lõppu lisama, kontrolle pole esialgu vaja (teises praksis hakkame tegelema blokkide kontrolli ja &amp;quot;ametliku&amp;quot; ahela sünkimisega. Blokk koosneb üldjuhul hulgast kontrollitud transaktsioonidest.&lt;br /&gt;
&lt;br /&gt;
See päring võiks olla POST päring, kus url on&lt;br /&gt;
&lt;br /&gt;
  http://xx.xx.xx.xx:yyyy/block&lt;br /&gt;
&lt;br /&gt;
ning postitatud väärtus (st tekst peale http päiste järel olevat tühja rida) on bloki hash ja tema tekstiline sisu (vali ise, kuidas neid kodeerid). Sellise postitatud päringu vastuseks võiks anda kas arvu 1 kui blokk aktsepteeriti või veateate (näiteks {&amp;quot;errcode&amp;quot;: ..., &amp;quot;errmsg&amp;quot;: ...} kui teda ei aktsepteeritud. &lt;br /&gt;
&lt;br /&gt;
Jällegi, kättesaadud blokk tuleks salvestada ja omakorda teistele kloonidele laiali saata. Pane tähele, et kui sa oled mingi hashiga bloki saad, siis peaksid vaatama, kas ta sul juba on, ja kui on, siis mitte edasi saatma.&lt;br /&gt;
&lt;br /&gt;
= Rakenduse variant 2: anonümiseeriv võrk =&lt;br /&gt;
&lt;br /&gt;
Eesmärgiks on ehitada anonümiseeriv võrk nagu [https://www.torproject.org/ Tor]. Täpsemalt on eeskujuks praeguseks mitteaktiivne anonüümne failijagamise võrk [http://mute-net.sourceforge.net/ MUTE Network]. Sealt võetud ideid kasutades teeme võrgu, kus saab anonüümselt veebist faile (html vms) alla laadida.&lt;br /&gt;
&lt;br /&gt;
Meie võrgus teab iga võrgusõlm (node) näiteks kolme naabrit. Kui sõlm A tahab alla laadida URL-i http://google.ee, saadab ta päringu kõigile oma naabritele. Need omakorda saadavad päringu oma naabritele jne. Päringul on kaasas salajane identifikaator - ainult A teab, et see identifikaator seostub temaga. Lõpuks jõutakse võrgusõlmeni B, kes otsustab, et laadib ise URL-i sisu alla. B ei tea kes URL-i sisu soovis, aga saadab vastuse suunas, kust ta päringu sai. Samal viisil liigub vastus mööda võrku tagasi, kuni jõuab A-ni, kes tunneb ära oma salajase identifikaatori.&lt;br /&gt;
&lt;br /&gt;
Võrku liituda ja sealt lahkuda võib suvalisel ajal. Seetõttu tuleb liitudes ja edasi perioodiliselt värsket naabrite nimekirja küsida, selleks paigutatakse samasse võrgu eraldi kataloogiserver.&lt;br /&gt;
&lt;br /&gt;
== Protokoll ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Port&amp;#039;&amp;#039;&amp;#039;. Vaikimisi on eeldatud, et võrgusõlmed kasutavad sõnumite vastuvõtmiseks porti 1215. Kasuta seda, kui suhtled teiste üliõpilaste programmidega ja kataloogiserveriga virtuaallaboris. Iseseisvaks või kohalikuks testimiseks võib kasutada ka muid porte.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Päringu saamise kinnitus&amp;#039;&amp;#039;&amp;#039;. Peale iga HTTP päringu saamist vastab võrgusõlm tekstiga &amp;lt;code&amp;gt;&amp;quot;OK&amp;quot;&amp;lt;/code&amp;gt; juhul kui ei olnud viga ning tekstiga &amp;lt;code&amp;gt;&amp;quot;Error: xxxxxxxxxxx&amp;quot;&amp;lt;/code&amp;gt; kui oli viga (&amp;#039;&amp;#039;xxxxxxxxxxx&amp;#039;&amp;#039; tähistab vabas vormis vea kirjeldust ning selle võib ka ära jätta). Vastuse saatmine on kohustuslik, isegi kui võrgusõlm päringuga tulnud sõnumit ignoreerib. Korrektse sõnumi puhul peab vastuse HTTP staatus olema 200, muul juhul on lubatud ka HTTP veakoodide esinemine.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Naabrite nimekiri&amp;#039;&amp;#039;&amp;#039;. Iga minuti tagant tuleb naabrite nimekirja kataloogiserverist uuendada (vt allpool).&lt;br /&gt;
&lt;br /&gt;
=== URL-i (faili) alla laadimise päring ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nimi (path)&lt;br /&gt;
|/download&lt;br /&gt;
|-&lt;br /&gt;
|parameetrid&lt;br /&gt;
|?id=&amp;#039;&amp;#039;xxxxxxxx&amp;#039;&amp;#039;&amp;amp;url=&amp;#039;&amp;#039;yyyyyyy&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|tüüp&lt;br /&gt;
|HTTP GET&lt;br /&gt;
|-&lt;br /&gt;
|body&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;xxxxxxxx&amp;#039;&amp;#039; on selle sõnumi jaoks genereeritud juhuslik number. Kui sama võrgusõlm näeb hiljem sama id-ga &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; sõnumit, siis see sisaldab soovitud vastust. &amp;#039;&amp;#039;yyyyyyy&amp;#039;&amp;#039; on täispikk URL, mis peab olema [https://en.wikipedia.org/wiki/Percent-encoding turvaliselt kodeeritud], [https://docs.python.org/3.5/library/urllib.parse.html#url-quoting Pythoni lahendus].&lt;br /&gt;
&lt;br /&gt;
Näide: http://1.2.3.4:1215/download?id=7652354352&amp;amp;url=http%3A//google.ee/%3Fs%3Dbla%26lang%3Den&lt;br /&gt;
&lt;br /&gt;
Käsitlemise reeglid:&lt;br /&gt;
# Kui sõlm algatab ise selle päringu, peab ta meelde jätma &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, et hiljem vastust ära tunda&lt;br /&gt;
# Päringu algatav võrgusõlm saadab sõnumi kõigile hetkel teadaolevatele naabritele&lt;br /&gt;
# Esimest korda selle sõnumi vastu võtmisel otsustab võrgusõlm, kas faili alla laadida (tõenäosus &amp;#039;&amp;#039;x%&amp;#039;&amp;#039;, konfitav)&lt;br /&gt;
## Kui faili alla ei laadita, saadab võrgusõlm sõnumi edasi kõigile oma naabritele, v.a juhul kui naabri IP langeb kokku sõnumi edastanud sõlme IP-ga&lt;br /&gt;
## Kui fail alla laaditakse, siis algatatakse &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; tüüpi sõnum (vt. allpool)&lt;br /&gt;
## Mõlemal juhul tuleb meelde jätta sõnumi &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; ja edastanud võrgusõlme IP&lt;br /&gt;
# Teist korda sama (või enda algatatud) &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;-ga sõnumi vastu võtmise korral seda ignoreeritakse&lt;br /&gt;
# Päringu algatanud sõlm peab arvestama võimalusega, et võrgu ebastabiilse iseloomu tõttu ei ole vastuse saabumine garanteeritud&lt;br /&gt;
&lt;br /&gt;
=== Faili sisu tagastamine ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|nimi (path)&lt;br /&gt;
|/file&lt;br /&gt;
|-&lt;br /&gt;
|parameetrid&lt;br /&gt;
|?id=&amp;#039;&amp;#039;xxxxxxxx&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
|tüüp&lt;br /&gt;
|HTTP POST&lt;br /&gt;
|-&lt;br /&gt;
|body&lt;br /&gt;
|{&amp;quot;status&amp;quot;:yyy, &amp;quot;mime-type&amp;quot;:&amp;quot;zzzzzzzz&amp;quot;, &amp;quot;content&amp;quot;:&amp;quot;...&amp;quot;}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;xxxxxxxx&amp;#039;&amp;#039; on sama, mis &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; sõnumis, mille saamise tõttu fail alla laaditi. HTTP päringu kehas on JSON formaadis objekt, mis sisaldab &amp;#039;&amp;#039;base64&amp;#039;&amp;#039; kodeeringus faili ja selle metadatat. &amp;#039;&amp;#039;yyy&amp;#039;&amp;#039; on faili allalaadimisel saadud HTTP staatus. &amp;#039;&amp;#039;zzzzzzzz&amp;#039;&amp;#039; on faili sisu MIME tüüp (peale dekodeerimist). &amp;quot;content&amp;quot; väljal on RFC-3548 ühilduvas &amp;#039;&amp;#039;base64&amp;#039;&amp;#039; kodeeringus ([https://docs.python.org/3/library/base64.html Pythoni tugi]) faili sisu.&lt;br /&gt;
&lt;br /&gt;
URI näide: http://5.6.7.8:1215/file?id=7652354352&lt;br /&gt;
&lt;br /&gt;
Keha näide 1:&lt;br /&gt;
&lt;br /&gt;
  {&amp;quot;status&amp;quot;:200, &amp;quot;mime-type&amp;quot;:&amp;quot;text/html&amp;quot;, &amp;quot;content&amp;quot;:&lt;br /&gt;
  &amp;quot;PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTC...&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Keha näide 2 (viga):&lt;br /&gt;
&lt;br /&gt;
  {&amp;quot;status&amp;quot;:404}&lt;br /&gt;
&lt;br /&gt;
Käsitlemise reeglid:&lt;br /&gt;
# Päringu algatav võrgusõlm saadab sõnumi naabrile, kellelt sama &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;-ga &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; sõnumi vastu võttis&lt;br /&gt;
# Kui eelmine samm ebaõnnestus, saadetakse sõnum kõigile naabritele&lt;br /&gt;
# Esimest korda selle sõnumi vastu võtmisel otsustab võrgusõlm, kas fail oli tema enda soovitud (&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; parameeter)&lt;br /&gt;
## Kui ei olnud, saadab võrgusõlm sõnumi edasi naabrile, kellelt saabus sama &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;-ga &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; päring&lt;br /&gt;
## Kui eelmine samm ebaõnnestus (või sellist naabrit ei teata), saadetakse sõnum edasi kõigile naabritele, v.a. juhul kui naabri IP langeb kokku käsitletava &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; sõnumi saatja IP-ga&lt;br /&gt;
## Kui fail oli sõlme enda soovitud, parseeritakse päringu kehast staatus ja olemasolul faili sisu.&lt;br /&gt;
# Teist korda sama (või enda algatatud) &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;-ga sõnumi vastu võtmise korral seda ignoreeritakse&lt;br /&gt;
&lt;br /&gt;
=== Millal faili alla laadida? ===&lt;br /&gt;
&lt;br /&gt;
Oletame, et võrgus on 10 arvutit. Kui allalaadimispäring laiali saadetakse, peaks üks neist hakkama faili alla laadima, ülejäänud 9-l pole seda vaja teha. Kuidas aga otsustada, kelle töö on fail alla laadida? Korrektne viis seda teha oleks [https://en.wikipedia.org/wiki/Distributed_hash_table DHT] abil, mis aga mitmekordistaks protokolli keerukust. Kui me aga loobume korrektsusest lihtsuse huvides, saab asja teha ka täiesti suhtlusvabalt.&lt;br /&gt;
&lt;br /&gt;
Igal võrgusõlmel on oma &amp;quot;laiskuse mõõt&amp;quot;, näiteks antud juhul number 0.9. Kui võrgusõlm näeb päringut, mille peale tuleks algatada faili alla laadimine, leiab ta juhusliku numbri vahemikus 0 kuni 1. Kui see on suurem kui tema laiskus, siis tuleb hakata faili alla laadima. Kui aga laiskus on suurem, siis saadetakse sõnum edasi teistele. Antud näite puhul on kõige tõenäolisem, et üks võrgusõlm hakkab faili alla laadima, ehkki võib ka juhtuda, et neid on mitu või mitte ühtegi.&lt;br /&gt;
&lt;br /&gt;
== Kataloogiserver ==&lt;br /&gt;
&lt;br /&gt;
Kataloogiserveriga suhtlemine toimub lihtsa klient-serveri mudeli abil, seal pole P2P protokolli tarvis. Naabrite küsimine:&lt;br /&gt;
&lt;br /&gt;
  http://192.168.3.11:1215/getpeers&lt;br /&gt;
&lt;br /&gt;
Vastus:&lt;br /&gt;
&lt;br /&gt;
  [ &amp;quot;1.2.3.4:1215&amp;quot;, &amp;quot;5.6.7.8:1215&amp;quot;, &amp;quot;1.2.3.6:1215&amp;quot; ]&lt;br /&gt;
&lt;br /&gt;
Vastus on JSON formaadis. Naabreid võib olla ka rohkem või vähem kui 3 (näiteks juhul, kui keegi teine pole võrguga liitunud).&lt;br /&gt;
&lt;br /&gt;
== Soovitused ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Konfiguratsioon&amp;#039;&amp;#039;&amp;#039;. Formaat pole oluline, aga mõtekas on järgmised parameetrid konfigureeritavaks teha. Pordi võib teha ka käsureaparameetriks:&lt;br /&gt;
&lt;br /&gt;
  ; lokaalse testimise korral vähenda, suures võrgus suurenda&lt;br /&gt;
  laziness = 0.5&lt;br /&gt;
  ; kataloogiteenus, siia võid panna ka staatilise tekstifaili URL-i&lt;br /&gt;
  directory = http://192.168.3.249:1215/getpeers&lt;br /&gt;
  ; lokaalseks mitme instantsiga testimiseks&lt;br /&gt;
  port = 1215&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Naabrite tabel&amp;#039;&amp;#039;&amp;#039;. Täidetakse kataloogiserverit kasutades.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!nr&lt;br /&gt;
!ip&lt;br /&gt;
!port&lt;br /&gt;
!elus&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1.2.3.4&lt;br /&gt;
|1215&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|5.6.7.8&lt;br /&gt;
|1215&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|1.2.3.6&lt;br /&gt;
|1215&lt;br /&gt;
|N&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Väli &amp;lt;code&amp;gt;elus&amp;lt;/code&amp;gt; võimaldab meelde jätta, kui naaber võrgust ära kaob. Seda saab asendada ka ajatempliga, aga jah/ei lipu käsitlemine on lihtsam.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Minu päringute tabel&amp;#039;&amp;#039;&amp;#039;. Kuna igal päringul on uus &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, tuleb mitme päringu tegemisel ajalugu meelde jätta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!nr&lt;br /&gt;
!id&lt;br /&gt;
!url&lt;br /&gt;
!ajatempel&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|7652354352&lt;br /&gt;
|http://google.ee/?s=bla&amp;amp;lang=en&lt;br /&gt;
|Sat Sep 17 02:16:57 2016&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Väli &amp;lt;code&amp;gt;url&amp;lt;/code&amp;gt; on kasulik näiteks veateadete edastamiseks. &amp;lt;code&amp;gt;ajatempel&amp;lt;/code&amp;gt; abil saab tuvastada, kui kaua päring on vastust oodanud ning vajadusel päringut korrata - sel juhul tuleb kindlasti uus identifikaator genereerida - või anda veateade.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Marsruutimistabel&amp;#039;&amp;#039;&amp;#039;. Kui ülejäänud tabelid on &amp;quot;maitse küsimus&amp;quot;, siis protokollis ette nähtud sõnumite käsitlusreeglite järgmiseks on järgnev marsruutimistabeli formaat oluliseks lihtsustavaks abivahendiks.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!nr&lt;br /&gt;
!id&lt;br /&gt;
!download ip&lt;br /&gt;
!file ip&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|7652354352&lt;br /&gt;
|1.2.3.4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|7657856788&lt;br /&gt;
|&lt;br /&gt;
|5.6.7.8&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|9845345233&lt;br /&gt;
|1.2.3.6&lt;br /&gt;
|5.6.7.8&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;download ip&amp;lt;/code&amp;gt; on naabri IP, kes saatis meile vastava identifikaatoriga &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; sõnumi. Juhul kui näeme sama identifikaatoriga &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; sõnumit, tuleks meil just &amp;lt;code&amp;gt;download ip&amp;lt;/code&amp;gt; aadressile see edastada. Mõeldav on ka juhtum, kus meil tuleb sisse &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; sõnum, millele vastavat &amp;lt;code&amp;gt;download&amp;lt;/code&amp;gt; sõnumit me ei ole näinud. See tuleb aga ikkagi marsruutimistabelisse registreerida, et korduvat sõnumite laialisaatmist vältida (rida 2). &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; sõnumi saatja IP läheb väljale &amp;lt;code&amp;gt;file ip&amp;lt;/code&amp;gt;. Juhul kui mõlemad sõnumid on nähtud, siis on mõlemad IP-d täidetud (rida 3) ning igasugusel edasisel kokkupuutel antud identifikaatoriga pole enam tarvis reageerida.&lt;br /&gt;
&lt;br /&gt;
Seda tabelit saab täiendada ka ajatempliga, et vanemaid kirjeid kustutama hakata. Väikeste testimismahtude juures pole see veel vajalik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Juhtimine&amp;#039;&amp;#039;&amp;#039; Et testida, on minimaalselt vaja rakendusele ka alla laaditavaid URL-e ette sööta. Selleks on mõeldavad järgmised viisid:&lt;br /&gt;
* lähtekoodi sisse kirjutatud, lihtne teha aga raske hallata&lt;br /&gt;
* loetakse tekstifailist rakenduse käivitamisel&lt;br /&gt;
* antakse rakendusele käsurea argumendiks&lt;br /&gt;
* reaalajas üle HTTP (võimaldab näiteks AJAX-iga veebiliides lisada)&lt;br /&gt;
* reaalajas käsurealiidese (CLI) abil&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Testimiseks on soovitatav esialgu lihtsam variant võtta ning hiljem kui rakendus juba suuremalt osalt töötab, leida viis, mis võimaldab paindlikumalt ja massilisemalt testida.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Praktikumi kirjeldus täieneb jooksvalt semestri käigus&amp;lt;/b&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tammet</name></author>
	</entry>
</feed>