<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.infokiir.ee/articles/</id>
    <title>Infokiir OÜ artiklid</title>
    <updated>2026-06-12T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.infokiir.ee/articles/"/>
    <subtitle>Infokiir OÜ Blog</subtitle>
    <icon>https://www.infokiir.ee/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Uus koduleht 2026]]></title>
        <id>https://www.infokiir.ee/articles/uus-koduleht-2026/</id>
        <link href="https://www.infokiir.ee/articles/uus-koduleht-2026/"/>
        <updated>2026-06-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[2017. aasta lõpus sai siinsamas kirjutatud, et vana koduleht oli liiga kaua muutumatuna püsinud. Ajalugu kordub — vahepeal möödus kaheksa aastat ja nüüd oli jälle aeg uuenduseks.]]></summary>
        <content type="html"><![CDATA[<ol start="2017">
<li class="">aasta lõpus sai siinsamas kirjutatud, et vana koduleht oli liiga kaua muutumatuna püsinud. Ajalugu kordub — vahepeal möödus kaheksa aastat ja nüüd oli jälle aeg uuenduseks.</li>
</ol>
<!-- -->
<p>Põhimõte jäi samaks: koduleht on endiselt staatiline. Need põhjused, mis kehtisid 2017, kehtivad tänagi:</p>
<ul>
<li class="">staatiline veebisait on lihtsam kui dünaamiline</li>
<li class="">see on palju kiirem</li>
<li class="">see on palju turvalisem</li>
</ul>
<p>Vahetusse läks generaator. Senine <a href="https://metalsmith.io/" target="_blank" rel="noopener noreferrer" class="">Metalsmith</a> tegi oma töö omal ajal hästi ära, kuid selle pluginad jäid aastatega hooldamata ja iga uuendus muutus aina vaevalisemaks. Uus sait on ehitatud <a href="https://docusaurus.io/" target="_blank" rel="noopener noreferrer" class="">Docusaurusega</a> — sama tööriistaga, millega tehakse paljude tuntud tarkvaraprojektide dokumentatsioonisaite.</p>
<p>Mida uuendus kaasa tõi:</p>
<ul>
<li class="">artiklid, sildid, RSS-voog ja sitemap tulevad nüüd "karbist", ilma omakirjutatud koodita</li>
<li class="">lehel on tume režiim ja korralikud meta-andmed otsingumootorite jaoks</li>
<li class="">vanade artiklite aadressid jäid samaks, nii et lingid ja järjehoidjad töötavad edasi</li>
<li class="">mõned päris aegunud artiklid said koristatud — vähem, aga värskem sisu</li>
</ul>
<p>Tehniline õppetund on sama, mida räägime ka klientidele: tarkvara ei ole kunagi "valmis". Ka hästi töötav lahendus vajab aeg-ajalt hooldust, sest tööriistad ja turvanõuded tema ümber liiguvad edasi.</p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="varia" term="varia"/>
        <category label="veeb" term="veeb"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Kummalise SSH vea lahendamine]]></title>
        <id>https://www.infokiir.ee/articles/ssh-seadistus/</id>
        <link href="https://www.infokiir.ee/articles/ssh-seadistus/"/>
        <updated>2023-01-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[See artikkel on pisike jätk varasemale artiklile:]]></summary>
        <content type="html"><![CDATA[<p>See artikkel on pisike jätk varasemale artiklile:</p>
<p><a href="https://www.asjade.net/varia-menu/81-maengud-ssh-ga" target="_blank" rel="noopener noreferrer" class="">https://www.asjade.net/varia-menu/81-maengud-ssh-ga</a></p>
<p>Pärast Ubuntu 20.04 focal üleminekut uuemale Ubuntu 22.04 jammy versioonile ei toiminud enam võtmeid vahetades ssh ühendus ühe Synology NAS seadmega. Tuli parooli küsimise rida ning sisestades õige salasõna oli võimalik ikka sisse saada.</p>
<p>Sedasorti probleemide lahendamisel aitab -vvv võtme lisamine ssh käsureale. Lisaks sellele kasuta ikka Google otsingut, kuid ära pelga ka uut populaarset ChatGPT <a href="https://en.wikipedia.org/wiki/ChatGPT" target="_blank" rel="noopener noreferrer" class="">https://en.wikipedia.org/wiki/ChatGPT</a> teenust <a href="https://chat.openai.com/" target="_blank" rel="noopener noreferrer" class="">https://chat.openai.com</a>. See võib lahenduseni viia kiiremini kui arvata oskad.</p>
<p>Lahenduseks oli seekord selline:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">touch</span><span class="token plain"> ~/.ssh/config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">600</span><span class="token plain"> ~/.ssh/config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">nano</span><span class="token plain"> ~/.ssh/config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> ~/.ssh/config</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Host tegelik.ip.aadress</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PubkeyAcceptedKeyTypes +ssh-rsa</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">KexAlgorithms +diffie-hellman-group14-sha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">HostKeyAlgorithms +ssh-rsa</span><br></div></code></pre></div></div>
<p>Rohkem selle kohta lugemist:</p>
<p><a href="https://askubuntu.com/questions/1409105/ubuntu-22-04-ssh-the-rsa-key-isnt-working-since-upgrading-from-20-04" target="_blank" rel="noopener noreferrer" class="">https://askubuntu.com/questions/1409105/ubuntu-22-04-ssh-the-rsa-key-isnt-working-since-upgrading-from-20-04</a></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="tarkvara" term="tarkvara"/>
        <category label="internet" term="internet"/>
        <category label="turvalisus" term="turvalisus"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Avatud uus veebisait e-hind.ee elektrihindade jälgimiseks]]></title>
        <id>https://www.infokiir.ee/articles/elektrihinnad/</id>
        <link href="https://www.infokiir.ee/articles/elektrihinnad/"/>
        <updated>2022-01-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Selleks, et suured elektriarved ei tuleks üllatusena, sai avatud uus veebisait e-hind.ee. Loomulikult ei ole see ainus võimalus reaalajas elektri börsihindade jälgimiseks. Eeliseks on see, et:]]></summary>
        <content type="html"><![CDATA[<p>Selleks, et suured elektriarved ei tuleks üllatusena, sai avatud uus veebisait <a href="https://e-hind.ee/" target="_blank" rel="noopener noreferrer" title="e-hind.ee - elektrihindade jälgimine reaaalajas" class="">e-hind.ee</a>. Loomulikult ei ole see ainus võimalus reaalajas elektri börsihindade jälgimiseks. Eeliseks on see, et:</p>
<ul>
<li class="">siin ei ole praegu reklaame</li>
<li class="">ei kasutata küpsiseid</li>
<li class="">avaneb kiiresti</li>
</ul>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="programmeerimine" term="programmeerimine"/>
        <category label="internet" term="internet"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[MacBook Pro Ubuntu Desktop 20.04 LTS Linux ja USB klaviatuur]]></title>
        <id>https://www.infokiir.ee/articles/mac-book-ubuntu-ja-usb-klaviatuur/</id>
        <link href="https://www.infokiir.ee/articles/mac-book-ubuntu-ja-usb-klaviatuur/"/>
        <updated>2020-06-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Kuidas installida Ubuntu Desktop 20.04 LTS Linux MacBook Pro sülearvutile USB mälupulgale?]]></summary>
        <content type="html"><![CDATA[<p>Kuidas installida Ubuntu Desktop 20.04 LTS Linux MacBook Pro sülearvutile USB mälupulgale?</p>
<p><img decoding="async" loading="lazy" alt="macbook-ubuntu" src="https://www.infokiir.ee/assets/images/2020-06-06-21-21-34-5249e1092957364d14e15f4d05d67ab9.png" width="800" height="450" class="img_ev3q"></p>
<p>Selle kohta sai tehtud 2 videot:</p>
<p><a href="https://www.youtube.com/watch?v=mo440sAe2dQ" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=mo440sAe2dQ</a></p>
<p><a href="https://www.youtube.com/watch?v=F7ZHVNVBuN8" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=F7ZHVNVBuN8</a></p>
<p>Selleks, et GRUB käsureal oleks kergem tööd teha, sai tehtud ka USB klaviatuur, mis saadab klahvivajutused järjestikpordi kaudu:</p>
<p><a href="https://www.youtube.com/watch?v=ZbuvjBGOJGg" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=ZbuvjBGOJGg</a></p>
<p>Vastavad github leheküljed:</p>
<p><a href="https://github.com/asjadenet/macbook-ubuntu-usb" target="_blank" rel="noopener noreferrer" class="">https://github.com/asjadenet/macbook-ubuntu-usb</a></p>
<p><a href="https://github.com/asjadenet/serial2keyb" target="_blank" rel="noopener noreferrer" class="">https://github.com/asjadenet/serial2keyb</a></p>
<p><a href="https://github.com/asjadenet/serial2keyb-byline" target="_blank" rel="noopener noreferrer" class="">https://github.com/asjadenet/serial2keyb-byline</a></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="tarkvara" term="tarkvara"/>
        <category label="riistvara" term="riistvara"/>
        <category label="MacOS" term="MacOS"/>
        <category label="Linux" term="Linux"/>
        <category label="varia" term="varia"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Pordi suunamine turvalisemaks OpenWrt ruuteriga]]></title>
        <id>https://www.infokiir.ee/articles/pordi-suunamine-turvalisemaks-openwrt-ruuteriga/</id>
        <link href="https://www.infokiir.ee/articles/pordi-suunamine-turvalisemaks-openwrt-ruuteriga/"/>
        <updated>2020-03-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Ei ole just ebatavaline olukord, kus meil on vaja sisevõrgust mingi teenus kättesaadavaks teha avalikule internetile. Seda saab suhteliselt lihtsasti teha pordi suunamisega. Näiteks Cisco EPC3940 modemil näeb see välja selliselt:]]></summary>
        <content type="html"><![CDATA[<p>Ei ole just ebatavaline olukord, kus meil on vaja sisevõrgust mingi teenus kättesaadavaks teha avalikule internetile. Seda saab suhteliselt lihtsasti teha pordi suunamisega. Näiteks Cisco EPC3940 modemil näeb see välja selliselt:</p>
<p><img decoding="async" loading="lazy" alt="Cisco EPC3940" src="https://www.infokiir.ee/assets/images/2020-03-06-11-53-20-c600e07b72a52a93481c1d2691ea968d.png" width="629" height="230" class="img_ev3q"></p>
<p>Kui teeme lahti pordi 22 ja meil on see edasi suunatud ssh serveri teenusele, siis võime näha logidest umbes sellist vaatepilti:</p>
<p><img decoding="async" loading="lazy" alt="ssh auth fail log" src="https://www.infokiir.ee/assets/images/2020-03-06-11-59-46-3d2e28857c0b90a3ad6ca472e1c5e2e9.png" width="497" height="457" class="img_ev3q"></p>
<p>Kui nüüd ip aadresside haaval uurida, siis võime leida, et üritajaid on olnud Hiinast, Vietnamist, Lõuna-Koreast ja mujaltki.</p>
<p>Loomulikult tuleb tahtmine nende üritajate elu raskemaks teha ja need IP aadressid ära keelata. Tavalise ruuteri tarkvaras ei pruugi aga sellist võimalust olla. Õnneks on populaarses vabavaralises ruuteri tarkvaras <a href="https://openwrt.org/" target="_blank" rel="noopener noreferrer" class="">OpenWrt</a> see võimalik. Sellepärast tasuks enne uue ruuteri ostmist uurida, kui hästi see OpenWrt OS-i toetab. Näiteks üks populaarne ruuter on <a href="https://openwrt.org/toh/tp-link/archer-c5-c7-wdr7500" target="_blank" rel="noopener noreferrer" class="">TP-LINK Wireless Access Point Archer C7 AC1750 Dual Band Gigabit wireless Router</a></p>
<p>Selle asemel, et hoida ajakohasena pikka nimekirja, kust me ühendusi ei soovi, võime teha ka nn "valge nimekirja" IP-aadressidest, kust me soovime ligipääsu lubada.</p>
<p>Mängime nüüd läbi olukorra, kus tahame lubada ligipääsu vaid Eesti IP aadressidelt ja mitte kusagilt mujalt.</p>
<p>Esiteks on meil vaja nimekirja Eesti IP aadressruumist. Abiks on selline pisike tööriist nagu <a href="https://github.com/mivk/ip-country/blob/master/get-ripe-ips" target="_blank" rel="noopener noreferrer" class="">get-ripe-ips</a>. See on bash skript, mis laadib aadressid json vormingus alla ja salvestab tekstifailina. On ka teisi võimalusi. Vaatame siin vaid ühte.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/mivk/ip-country.git</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> +x get-ripe-ips</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ ./get-ripe-ips </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> ee </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1800</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">./get-ripe-ips: line </span><span class="token number" style="color:#36acaa">74</span><span class="token plain">: hash: jq: ei leitud</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Cannot </span><span class="token function" style="color:#d73a49">find</span><span class="token plain"> the jq Json processor. Install it with </span><span class="token string" style="color:#e3116c">'apt install jq'</span><span class="token plain"> or similar</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> jq</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ ./get-ripe-ips </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> ee </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> </span><span class="token builtin class-name">.</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1800</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">head</span><span class="token plain"> ipv4_ee</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2.57</span><span class="token plain">.220.0/22</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2.59</span><span class="token plain">.164.0/22</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">5.34</span><span class="token plain">.240.0/21</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">5.44</span><span class="token plain">.184.0/21</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">5.45</span><span class="token plain">.112.0/21</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">5.45</span><span class="token plain">.120.0/21</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">5.101</span><span class="token plain">.112.0/20</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">5.101</span><span class="token plain">.176.0/20</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">5.153</span><span class="token plain">.232.0/21</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">5.157</span><span class="token plain">.0.0/18</span><br></div></code></pre></div></div>
<p>Selliselt on meil IP aadressid failis ipv4_ee olemas.</p>
<p>Vaikimisi ei ole ruuteris installeeritud ipset utiliiti, kuid selle võib installeerida veebiliidese abil:</p>
<p><img decoding="async" loading="lazy" alt="openwrt-ipset" src="https://www.infokiir.ee/assets/images/2020-03-06-13-23-29-66f1e0982a59743c2167a98675873251.png" width="1431" height="822" class="img_ev3q"></p>
<p>Samuti võime testimiseks installida <em>netcat</em>:
<img decoding="async" loading="lazy" alt="openwrt-netcat" src="https://www.infokiir.ee/assets/images/2020-03-06-13-24-46-cd4925b69695896e1872a0c32b4ec8a5.png" width="1429" height="678" class="img_ev3q"></p>
<p>Kopeerin selle faili ruuteris asukohta <em>/usr/opt/geoip-ee/ipv4_ee</em>.</p>
<p>Muudan ruuteris faili <em>/etc/firewall.user</em>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">root@OpenWrt:~</span><span class="token comment" style="color:#999988;font-style:italic"># cat /etc/firewall.user</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># This file is interpreted as shell script.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Put your custom iptables rules here, they will</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># be executed with each firewall (re-)start.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Internal uci firewall chains are flushed and recreated on reload, so</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># put custom rules into the root chains e.g. INPUT or FORWARD or into the</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># special user chains, e.g. input_wan_rule or postrouting_lan_rule</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ipset create ipv4_ee hash:net</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token builtin class-name">read</span><span class="token plain"> network </span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">do</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ipset </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> ipv4_ee </span><span class="token variable" style="color:#36acaa">$network</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">done</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> /usr/opt/geoip-ee/ipv4_ee</span><br></div></code></pre></div></div>
<p>Teeme ruuterile restardi. Seejärel logime sisse ja vaatame, kas igal käivitamisel tehakse ipset nimega <em>ipv4_ee</em>. Seda saame vaadata käsklusega:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ipset list ipv4_ee</span><br></div></code></pre></div></div>
<p>Kui ilmub nimekiri IP aadressidega, siis on sellega korras.</p>
<p>Proovime kõigepealt pordi suunamist ilma ip aadresside piiranguteta.</p>
<p><img decoding="async" loading="lazy" alt="openwrt-port-fw1" src="https://www.infokiir.ee/assets/images/2020-03-06-13-27-40-a565daf0068cc2a27802fcf9440e9a37.png" width="1341" height="798" class="img_ev3q">
<img decoding="async" loading="lazy" alt="openwrt-port-fw1a" src="https://www.infokiir.ee/assets/images/2020-03-06-13-28-28-c6d236a08f4e2e57fe665cab49d13c52.png" width="1342" height="1214" class="img_ev3q"></p>
<p>Käivitan ruuteris:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">netcat </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8080</span><br></div></code></pre></div></div>
<p>Proovin Eestis paiknevast masinast:</p>
<p><img decoding="async" loading="lazy" alt="connect-test-eesti1" src="https://www.infokiir.ee/assets/images/2020-03-06-13-33-27-69e3c752aaf8604abfc53e036a7397b9.png" width="638" height="197" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="listen-test-eesti1" src="data:image/png;base64,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" width="590" height="133" class="img_ev3q"></p>
<p>Sama Inglismaal paiknevast masinast:</p>
<p><img decoding="async" loading="lazy" alt="connect-test-uk1" src="data:image/png;base64,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" width="569" height="178" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="listen-test-uk1" src="https://www.infokiir.ee/assets/images/2020-03-06-13-39-24-f3feeed165620db10dbea868cce6a6e9.png" width="547" height="173" class="img_ev3q"></p>
<p>Nagu näha, pordi suunamine töötab ja see on ligipääsetav igalt poolt maailmas.</p>
<p>Paneme nüüd piirangu peale, lisades tulemüüris <em>Extra arguments</em> reale: <em>-m set --match-set ipv4_ee src</em>.</p>
<p><img decoding="async" loading="lazy" alt="openwrt-extra-arguments" src="https://www.infokiir.ee/assets/images/2020-03-06-13-42-28-f4da961006879c0ce8db948fe2b4ce28.png" width="1335" height="1207" class="img_ev3q"></p>
<p>Proovime nüüd uuesti. Kui meil on kõik õigesti, siis peaksime endiselt Eestist ligi pääsema, kuid Inglismaalt enam mitte:</p>
<p><img decoding="async" loading="lazy" alt="connect-test-eesti1" src="https://www.infokiir.ee/assets/images/2020-03-06-13-52-02-2ffc3c064d1061293dbfc70c91b55251.png" width="599" height="196" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="listen-test-eesti2" src="data:image/png;base64,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" width="570" height="178" class="img_ev3q"></p>
<p>Sama Inglismaal paiknevast masinast:</p>
<p><img decoding="async" loading="lazy" alt="connect-test-uk2" src="https://www.infokiir.ee/assets/images/2020-03-06-13-58-11-289b8434272eabf5bdcb24b6f34b8ffe.png" width="772" height="132" class="img_ev3q"></p>
<p>Mida öelda kokkuvõtteks? Kui meil on kasutada OpenWrt ruuter, siis tasub ligipääs IP aadresside järgi ära seadistada. Nagu nägime, ei olegi seda nii raske teha.</p>
<p>Linke:</p>
<p><a href="https://openwrt.org/toh/tp-link/archer-c5-c7-wdr7500" target="_blank" rel="noopener noreferrer" class="">https://openwrt.org/toh/tp-link/archer-c5-c7-wdr7500</a></p>
<p><a href="https://unix.stackexchange.com/questions/502907/how-to-block-countries-iptables-or-firewalld-by-geolite2-mmdb/527504#527504" target="_blank" rel="noopener noreferrer" class="">https://unix.stackexchange.com/questions/502907/how-to-block-countries-iptables-or-firewalld-by-geolite2-mmdb/527504#527504</a></p>
<p><a href="https://unix.stackexchange.com/questions/516504/iptables-to-allow-traffic-from-one-country-only" target="_blank" rel="noopener noreferrer" class="">https://unix.stackexchange.com/questions/516504/iptables-to-allow-traffic-from-one-country-only</a></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="tarkvara" term="tarkvara"/>
        <category label="riistvara" term="riistvara"/>
        <category label="turvalisus" term="turvalisus"/>
        <category label="OpenWrt" term="OpenWrt"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mitte keegi ei taha rohkem tarkvara…]]></title>
        <id>https://www.infokiir.ee/articles/rohkem-tarkvara/</id>
        <link href="https://www.infokiir.ee/articles/rohkem-tarkvara/"/>
        <updated>2020-02-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[tarkvara]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="tarkvara" src="https://www.infokiir.ee/assets/images/fotis-fotopoulos-LJ9KY8pIH3E-unsplash-resized-9e04901594a0913ba93564c082b69133.jpg" width="600" height="400" class="img_ev3q"></p>
<p><em>Photo by Fotis Fotopoulos on Unsplash</em></p>
<p>Mitte keegi ei taha rohkem tarkvara… See on täitsa tõsi. Tarkvara ei ole vaja lihtsalt tarkvara pärast. Kellele meeldiks iga päev paigaldada oma arvutisse aina uusi programme või proovida internetis üha uusi ja uusi teenuseid?</p>
<p>Kui meil ei ole vaja uut tarkvara, siis mida meil siiski vaja on? Eelkõige soovime lahendusi tüütutele ja keerulistele probleemidele, soovime vältida vigu, mis tulenevad sellest, et meil ei ole asjad hästi organiseeritud, puudub ülevaade, eksime sisestamisel, unustame jne.</p>
<p>Hea tarkvara aitab lahendada probleeme ja kes seda ei tahaks? Hea tarkvara justkui peidab probleemid ja keerukuse meie eest ja näitab meile midagi lihtsat, ilusat ja mugavat.</p>
<p>Seega selle asemel, et öelda "meil on vaja rohkem tarkvara" võiks öelda "meil on vaja head lahendust".</p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="tarkvara" term="tarkvara"/>
        <category label="varia" term="varia"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Azure docker ja eestikeelne kõnetuvastus]]></title>
        <id>https://www.infokiir.ee/articles/azure-docker-eesti-konetuvastus/</id>
        <link href="https://www.infokiir.ee/articles/azure-docker-eesti-konetuvastus/"/>
        <updated>2019-11-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Eesti keele kõnetuvastus on üsna keeruline tarkvara. Isegi selle installeerimine enda arvutisse võib olla väljakutse. Mis siis rääkida veel selle kirjutamisest programmeerijana.]]></summary>
        <content type="html"><![CDATA[<p>Eesti keele kõnetuvastus on üsna keeruline tarkvara. Isegi selle installeerimine enda arvutisse võib olla väljakutse. Mis siis rääkida veel selle kirjutamisest programmeerijana.</p>
<p>Veebibrauseris vastav tööriist on internetis saadaval siin:
<a href="http://bark.phon.ioc.ee/webtrans/" target="_blank" rel="noopener noreferrer" class="">http://bark.phon.ioc.ee/webtrans/</a></p>
<p>Kui siiski soovime seda tarkvara ise jooksutada, siis üks lihtne võimalus on kasutada valmis <em>docker</em> konteinerit.</p>
<p>Juhendi leiame siit:</p>
<p><a href="https://github.com/alumae/kaldi-offline-transcriber/tree/master/misc/docker" target="_blank" rel="noopener noreferrer" class="">https://github.com/alumae/kaldi-offline-transcriber/tree/master/misc/docker</a></p>
<p>Kui teha selle juhendi järgi, siis suure tõenäosusega saame selle ka kohe tööle. Eelnevalt tuleb jälgida, et <em>docker</em> konteineri käsutuses oleks vähemalt 6GB RAM. Mul ebaõnnestus 4GB RAM-ga, kuid 6GB oli piisav, et üks näide tööle saada.</p>
<p>Kui me ei sooviks seda tarkvara hoida enda arvutis vaid hoopis Azure pilves, kuidas see siis tööle saada? Järgnevalt on dokumenteeritud väike juhend, kuidas mul see õnnestus kasutades PowerShell käsurida.</p>
<p>Kõigepealt tee <em>resource group</em>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az group create </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> tuvastusResourceGroup </span><span class="token parameter variable" style="color:#36acaa">--location</span><span class="token plain"> uksouth</span><br></div></code></pre></div></div>
<p>vastus:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/subscriptions/55622624-1ccb-4e6c-97dc-51d463935a2e/resourceGroups/tuvastusResourceGroup"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"location"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"uksouth"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"managedBy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tuvastusResourceGroup"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"properties"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"provisioningState"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Succeeded"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"tags"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Microsoft.Resources/resourceGroups"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Seejärel tee Container Registry:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az acr create --resource-group tuvastusResourceGroup </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> tuvastusContainerRegistry </span><span class="token parameter variable" style="color:#36acaa">--sku</span><span class="token plain"> Basic</span><br></div></code></pre></div></div>
<p>vastus:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"adminUserEnabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"creationDate"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2019-11-01T08:36:50.213637+00:00"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/subscriptions/55622624-1ccb-4e6c-97dc-51d463935a2e/resourceGroups/tuvastusResourceGroup/providers/Microsoft.ContainerRegistry/registries/tuvastusContainerRegistry"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"location"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"uksouth"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"loginServer"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tuvastuscontainerregistry.azurecr.io"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tuvastusContainerRegistry"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"networkRuleSet"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"policies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"quarantinePolicy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"disabled"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"retentionPolicy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"days"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"lastUpdatedTime"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2019-11-01T08:36:52.156079+00:00"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"disabled"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"trustPolicy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"disabled"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Notary"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"provisioningState"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Succeeded"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceGroup"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tuvastusResourceGroup"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"sku"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Basic"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"tier"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"storageAccount"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"tags"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Microsoft.ContainerRegistry/registries"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Logi sisse:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az acr login </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> tuvastusContainerRegistry</span><br></div></code></pre></div></div>
<p>Vastus:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Login Succeeded</span><br></div></code></pre></div></div>
<p>Lubame admin kasutaja:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az acr update </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> tuvastusContainerRegistry --admin-enabled </span><span class="token boolean" style="color:#36acaa">true</span><br></div></code></pre></div></div>
<p>vastus:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"adminUserEnabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"creationDate"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2019-11-01T08:36:50.213637+00:00"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/subscriptions/55622624-1ccb-4e6c-97dc-51d463935a2e/resourceGroups/tuvastusResourceGroup/providers/Microsoft.ContainerRegistry/registries/tuvastusContainerRegistry"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"location"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"uksouth"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"loginServer"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tuvastuscontainerregistry.azurecr.io"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tuvastusContainerRegistry"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"networkRuleSet"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"policies"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"quarantinePolicy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"disabled"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"retentionPolicy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"days"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"lastUpdatedTime"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2019-11-01T08:36:52.156079+00:00"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"disabled"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"trustPolicy"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"disabled"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Notary"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"provisioningState"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Succeeded"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceGroup"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tuvastusResourceGroup"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"sku"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Basic"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"tier"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"storageAccount"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"tags"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Microsoft.ContainerRegistry/registries"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Tekitatud kasutajanime ja parooli saab vaadata nii:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az acr credential show </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> tuvastusContainerRegistry</span><br></div></code></pre></div></div>
<p>Vastus:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"passwords"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"password"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"********************************"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"password2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"********************************"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"username"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"tuvastusContainerRegistry"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Veendu, et käsurida lokaalses dockeris töötab. Näiteks:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> </span><span class="token builtin class-name">exec</span><span class="token plain"> 79bafd51385a1933d7ea584a07870a0bc8ab9c791ab24a938e17e3313ce750cb </span><span class="token function" style="color:#d73a49">bash</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'mkdir -p /opt/speechfiles/ ; cd /opt/speechfiles/ ; wget https://www.infokiir.ee/mp3test/proov.mp3 ; /opt/kaldi-offline-transcriber/speech2text.sh  --trs /opt/speechfiles/proov.trs /opt/speechfiles/proov.mp3 ; cat /opt/speechfiles/proov.trs'</span><br></div></code></pre></div></div>
<p>tag käsklusega märgistame konteineri:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> tag alumae/kaldi-offline-transcriber-et tuvastuscontainerregistry.azurecr.io/kaldi-offline-transcriber-et:v1</span><br></div></code></pre></div></div>
<p>Saadame selle azure pilve (see võtab üsnagi aega, sõltuvalt interneti kiirusest):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> push tuvastuscontainerregistry.azurecr.io/kaldi-offline-transcriber-et:v1</span><br></div></code></pre></div></div>
<p>Nüüd teen docker image vastava käsureaga:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az container create --restart-policy Never --registry-username tuvastusContainerRegistry --registry-password ******************************** </span><span class="token parameter variable" style="color:#36acaa">--cpu</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--memory</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token plain"> --resource-group tuvastusResourceGroup </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> tuvastus6m </span><span class="token parameter variable" style="color:#36acaa">--image</span><span class="token plain"> tuvastuscontainerregistry.azurecr.io/kaldi-offline-transcriber-et:v1 --command-line </span><span class="token string" style="color:#e3116c">"bash -c 'mkdir -p /opt/speechfiles/ ; cd /opt/speechfiles/ ; wget https://www.infokiir.ee/mp3test/proov.mp3 ; /opt/kaldi-offline-transcriber/speech2text.sh  --trs /opt/speechfiles/proov.trs /opt/speechfiles/proov.mp3 ; cat /opt/speechfiles/proov.trs'"</span><br></div></code></pre></div></div>
<p>Muide alla 6GB mälu ei tasu panna. Proovisin 4GB ja sellest jäi väheks.</p>
<p>Tulemust vaatan käsklusega:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">az container logs --resource-group tuvastusResourceGroup </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> tuvastus6m</span><br></div></code></pre></div></div>
<p>See näeb välja umbes selline:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token prolog" style="color:#999988;font-style:italic">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token doctype punctuation" style="color:#393A34;font-style:italic">&lt;!</span><span class="token doctype doctype-tag" style="color:#999988;font-style:italic">DOCTYPE</span><span class="token doctype" style="color:#999988;font-style:italic"> </span><span class="token doctype name" style="color:#999988;font-style:italic">Trans</span><span class="token doctype" style="color:#999988;font-style:italic"> </span><span class="token doctype name" style="color:#999988;font-style:italic">SYSTEM</span><span class="token doctype" style="color:#999988;font-style:italic"> </span><span class="token doctype string" style="color:#e3116c;font-style:italic">"trans-14.dtd"</span><span class="token doctype punctuation" style="color:#393A34;font-style:italic">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Trans</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">scribe</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">est-speech2txt</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">audio_filename</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">proov</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">version</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">version_date</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">191101</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Speakers</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Speaker</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">id</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">spk1</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">K01</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">check</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">no</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">dialect</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">native</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">accent</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">scope</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">local</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Speakers</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Episode</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Section</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">report</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">startTime</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">0.000</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">endTime</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">9.330</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Turn</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">speaker</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">spk1</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">startTime</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">0.690</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">endTime</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">9.150</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Sync</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">time</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">0.690</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Ma teen siis ise kõigepealt ühe väikse proovi. Vaatame, kas ta oskab helifaili teha tekstiks.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Turn</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">Section</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">filler</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">startTime</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">9.330</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">endTime</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">10.320</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Section</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Episode</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">Trans</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>Kui soovin uuesti käivitada kestuse mõõtmisega, siis kasutan käsklust:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Measure-Command </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> az container start --resource-group tuvastusResourceGroup </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain">  tuvastus6m </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Tulemus:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Days              </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Hours             </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Minutes           </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Seconds           </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">43</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Milliseconds      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">367</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Ticks             </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5233673801</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">TotalDays         </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0,00605749282523148</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">TotalHours        </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0,145379827805556</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">TotalMinutes      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8,72278966833333</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">TotalSeconds      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">523,3673801</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">TotalMilliseconds </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">523367,3801</span><br></div></code></pre></div></div>
<p>See tarkvara jookseb üllatavalt kaua, samas tuvastuse kvaliteet on üllatavalt hea.</p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="Linux" term="Linux"/>
        <category label="varia" term="varia"/>
        <category label="docker" term="docker"/>
        <category label="Azure" term="Azure"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Excel ja C++ (Microsoft Excel C API XLL)]]></title>
        <id>https://www.infokiir.ee/articles/excel-ja-cpp/</id>
        <link href="https://www.infokiir.ee/articles/excel-ja-cpp/"/>
        <updated>2019-05-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Kuidas Excelis andmeid töödelda, kui me ei soovigi kasutada VBA-d, vaid hoopis C++? Selleks on mitmeid võimalusi, kuid praegune lemmik on Microsoft Excel C API.]]></summary>
        <content type="html"><![CDATA[<p>Kuidas Excelis andmeid töödelda, kui me ei soovigi kasutada VBA-d, vaid hoopis C++? Selleks on mitmeid võimalusi, kuid praegune lemmik on <a href="https://docs.microsoft.com/en-us/office/client-developer/excel/programming-with-the-c-api-in-excel" target="_blank" rel="noopener noreferrer" class="">Microsoft Excel C API</a>.</p>
<p>Vaata lähemalt videot: <a href="https://youtu.be/_90HgVo1D5c" target="_blank" rel="noopener noreferrer" class="">https://youtu.be/_90HgVo1D5c</a>.</p>
<p>Lähtekood: <a href="https://github.com/asjadenet/xlltemplate" target="_blank" rel="noopener noreferrer" class="">https://github.com/asjadenet/xlltemplate</a></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="programmeerimine" term="programmeerimine"/>
        <category label="VBA" term="VBA"/>
        <category label="Excel" term="Excel"/>
        <category label="C++" term="C++"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Nädalapäev E, T, K, N, R, L, P Excelisse]]></title>
        <id>https://www.infokiir.ee/articles/excelis-nadalapaev/</id>
        <link href="https://www.infokiir.ee/articles/excelis-nadalapaev/"/>
        <updated>2019-03-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Exceliga tööd tehes on mõnikord vaja kuupäeva puhul teada nädalapäeva. Tore oleks, kui selleks oleks valmis funktsioon. Tegelikult selline funktsioon ongi olemas. Esimese hooga ehk selle peale lihtsalt ei tule. Tavaliselt aitab interneti otsingumootor, kui teada sobivaid märksõnu.]]></summary>
        <content type="html"><![CDATA[<p>Exceliga tööd tehes on mõnikord vaja kuupäeva puhul teada nädalapäeva. Tore oleks, kui selleks oleks valmis funktsioon. Tegelikult selline funktsioon ongi olemas. Esimese hooga ehk selle peale lihtsalt ei tule. Tavaliselt aitab interneti otsingumootor, kui teada sobivaid märksõnu.</p>
<p>Funktsioon ise on selline:</p>
<div class="language-basic codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-basic codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">=</span><span class="token function" style="color:#d73a49">TEXT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">WEEKDAY</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"2019-03-15"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token string" style="color:#e3116c">"ddd"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Muidugi saaks sarnase funktsiooni ka ise programmeerida, kuid sellisel juhul peaks olema failis makrod lubatud. Ülaltoodud funktsioon töötab ka LibreOffice-ga.</p>
<p><img decoding="async" loading="lazy" alt="excel-nadalapaev" src="https://www.infokiir.ee/assets/images/2019-03-15-10-09-12-2d228b885b1b45177ecb4570e42520b8.png" width="619" height="469" class="img_ev3q"></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="programmeerimine" term="programmeerimine"/>
        <category label="VBA" term="VBA"/>
        <category label="Excel" term="Excel"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Monitori remont]]></title>
        <id>https://www.infokiir.ee/articles/monitori-remont/</id>
        <link href="https://www.infokiir.ee/articles/monitori-remont/"/>
        <updated>2018-11-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Mida teha siis, kui monitor "ei võta enam pilti ette", on "pime" jne? Enamasti rändab see jäätmejaama ja on aeg osta uus. Kuid kas tegelikult on vaja alati uut osta? Rikkis võib olla monitoril vaid paar detaili ning nende vahetamine võtab kogemustega remondimehel ehk 15 minutit.]]></summary>
        <content type="html"><![CDATA[<p>Mida teha siis, kui monitor "ei võta enam pilti ette", on "pime" jne? Enamasti rändab see jäätmejaama ja on aeg osta uus. Kuid kas tegelikult on vaja alati uut osta? Rikkis võib olla monitoril vaid paar detaili ning nende vahetamine võtab kogemustega remondimehel ehk 15 minutit.</p>
<p>Siin on üks video monitori remondist päris hea selgitusega:</p>
<p><a href="https://www.youtube.com/watch?v=72sJ5Infuu0" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=72sJ5Infuu0</a></p>
<p>Nagu sellest videost näha võis, on kõige tavalisem viga elektrolüütkondensaatorite riknemine.</p>
<p>Siin on siis ka üks näide edukast monitori remondist. Vigaseks osutus monitor <strong>Samsung 2343BW</strong>.</p>
<p>Pärast monitori lahtivõtmist avanes selline vaatepilt:</p>
<p><img decoding="async" loading="lazy" alt="toiteplokis vigased kondensaatorid" src="https://www.infokiir.ee/assets/images/sam-2343bw-bad-caps1-09f87e974b0a2b2df480b3010018cc96.jpg" width="400" height="300" class="img_ev3q"></p>
<p>Nagu näha, on pildi keskel kaks kõrvutist elektrolüütkondensaatorit "kergelt punnis". Kui on käepärast <em>ESR meter</em>, siis sellega mõõtes saab kergesti kondensaatorite korrasolekut hinnata. Spetsiaalne <em>ESR meter</em> ei ole just kõige odavam mõõteriist, kuid abiks on ka odav <a href="https://www.instructables.com/id/Assembling-the-LCR-T4-Mega328-Tester-Kit/" target="_blank" rel="noopener noreferrer" class="">LCR-T4</a>, mille võib kätte saada konstruktori komplektina ligi 10€ eest.</p>
<p>Kui kondensaatorid olid lahti joodetud, siis nägid need välja sellised:</p>
<p><img decoding="async" loading="lazy" alt="vigased kondensaatorid vaade" src="https://www.infokiir.ee/assets/images/sam-2343bw-bad-caps2-8b7f9689ab42254fb373be7cb5d0019f.jpg" width="400" height="455" class="img_ev3q"></p>
<p>Tegemist on Samsungi 1000uF x 16V <em>LOW ESR</em> kondensaatoritega. Asenduseks läksid sisse <a href="https://www.oomipood.ee/product/eeu_fm1c102_1000uf_16v_105c_20_10_20mm_low_esr_fm_panasonic" target="_blank" rel="noopener noreferrer" class="">Oomipoest saadaolevad Panasonic kondensaatorid EEU-FM1C102</a>:</p>
<p>Ise monitori remontimine ei ole muidugi päris kõigile jõukohane. Miks mitte enne äraviskamist siiski proovida seda remontida? Vajadusel võta ühendust ja too rikkis monitor kohale <a href="https://www.google.ee/maps/place/V%C3%A4ljataguse+12,+Rapla" target="_blank" rel="noopener noreferrer" class="">Raplas Väljataguse 12</a>.</p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="arvutiparandus" term="arvutiparandus"/>
        <category label="riistvara" term="riistvara"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[CMake tutvustus Visual Studio abil (lihtsa konsoolirakenduse tegemine)]]></title>
        <id>https://www.infokiir.ee/articles/cmake-tutvustus-visual-studio/</id>
        <link href="https://www.infokiir.ee/articles/cmake-tutvustus-visual-studio/"/>
        <updated>2018-06-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Esialgu võib üsnagi aega võtta, et aru saada CMake ülesehitusest ja loogikast. Sai sellepärast tehtud väike demo, kuidas alustada Visual Studio CMake projekti. Teeme lihtsa konsooliprogrammi, mis töötab nii Windows-s kui Linux-s. Samuti näeme, kuidas teha teeke ja neid kasutada.]]></summary>
        <content type="html"><![CDATA[<p>Esialgu võib üsnagi aega võtta, et aru saada CMake ülesehitusest ja loogikast. Sai sellepärast tehtud väike demo, kuidas alustada Visual Studio CMake projekti. Teeme lihtsa konsooliprogrammi, mis töötab nii Windows-s kui Linux-s. Samuti näeme, kuidas teha teeke ja neid kasutada.</p>
<p>Demo: <a href="https://www.youtube.com/watch?v=2_Rd4uqu4-g" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=2_Rd4uqu4-g</a></p>
<p>Lähtekood: <a href="https://github.com/asjadenet/CMakeProjectDemo" target="_blank" rel="noopener noreferrer" class="">https://github.com/asjadenet/CMakeProjectDemo</a></p>
<p>Linke:</p>
<p><a href="https://cmake.org/examples/" target="_blank" rel="noopener noreferrer" class="">https://cmake.org/examples/</a></p>
<p><a href="http://preshing.com/20170522/learn-cmakes-scripting-language-in-15-minutes/" target="_blank" rel="noopener noreferrer" class="">http://preshing.com/20170522/learn-cmakes-scripting-language-in-15-minutes/</a></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="programmeerimine" term="programmeerimine"/>
        <category label="C++" term="C++"/>
        <category label="VisualStudio" term="VisualStudio"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Nipid linkimiseks, ehk kuidas üle saada 'error LNK2019' vigadest]]></title>
        <id>https://www.infokiir.ee/articles/linking-tips/</id>
        <link href="https://www.infokiir.ee/articles/linking-tips/"/>
        <updated>2018-03-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Pidin hiljuti maadlema error LNK2019 .]]></summary>
        <content type="html"><![CDATA[<p>Pidin hiljuti maadlema <em>error LNK2019: unresolved external symbol</em> tüüpi vigadega. Põhiliselt tekivad need siis, kui lingitavat lihtsalt ei leita <em>.lib</em> või <em>.obj</em> failidest. Rohkem lugemist selle kohta on siin: <a href="https://msdn.microsoft.com/en-us/library/799kze2z.aspx" target="_blank" rel="noopener noreferrer" class="">https://msdn.microsoft.com/en-us/library/799kze2z.aspx</a>.</p>
<p>Puuduvad <em>.lib</em> või <em>.obj</em> faild saab <em>Visual Studio</em>-s lisada nii:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Project Properties &gt; Configuration Properties &gt; Linker &gt; Input &gt; Additional Dependencies &gt; add</span><br></div></code></pre></div></div>
<p>Kuidas aga õiged <em>.lib</em> ja <em>.obj</em> failid üles leida, kui need on eri kohtades laiali? Tegelikult saab selle üsna ruttu tehtud, kui kasutada õiget tööriista.</p>
<p>Alustada võib kiirest ülevaatest. Seda saab ruttu teada käsklusega:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">dir *.lib /b /s</span><br></div></code></pre></div></div>
<p>või</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">dir *.obj /b /s</span><br></div></code></pre></div></div>
<p><strong>/b</strong> vorming näitab failid koos teekonnaga ilma üleliigse infota.</p>
<p><strong>/s</strong> otsib kõigist alamkataloogidest rekursiivselt.</p>
<p>Esiteks tasub meeles pidada seda, et välja võib olla jäänud mõni süsteemi teegi fail.</p>
<p>Näiteks sain veateate:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">error LNK2001: unresolved external symbol __imp_timeGetTime</span><br></div></code></pre></div></div>
<p>Tihtipeale on kõige kiirem lahendus kasutada üldotstarbelist interneti otsingumootorit. Veidi otsides leiame, et tuleks lisada linkimisse teek <strong>WinMM.lib</strong>.
Kui meil pole aimu, kust selle faili võiks leida, siis aitab meid jälle tavaline dir käsklus:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">dir WinMM.lib /s</span><br></div></code></pre></div></div>
<p>Kuna neid faile võib olla arvutis mitmeid, siis selleks et näha ka faili kuupäeva ja suurust, jätan meelega ära <strong>/b</strong> võtme.</p>
<p>Kui internetiotsinguga vastust ei leia, tasub kõik oletatavad kataloogid läbi otsida.
Mõnevõrra aega nõuab kõigi binaarfailide läbiotsimine, kuid kui meil pole paremat ideed, siis see võibki just meid aidata.</p>
<p><em>.lib</em> failide läbiotsimiseks tegin käsufaili <em>findlib.bat</em>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">@echo off</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> otsime .lib failidest %1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain">  /r %%f </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">*.lib</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">do</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token string" style="color:#e3116c">"C:\Program Files (x86)\Microsoft Visual Studio</span><span class="token string entity" style="color:#36acaa">\201</span><span class="token string" style="color:#e3116c">7\Professional\VC\Tools\MSVC</span><span class="token string entity" style="color:#36acaa">\14</span><span class="token string" style="color:#e3116c">.13.26128</span><span class="token string entity" style="color:#36acaa">\b</span><span class="token string" style="color:#e3116c">in\Hostx86</span><span class="token string entity" style="color:#36acaa">\x86</span><span class="token string" style="color:#e3116c">\dumpbin.exe"</span><span class="token plain"> /exports </span><span class="token string" style="color:#e3116c">"%%f"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> findstr %1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> errorlevel </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> not errorlevel </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token builtin class-name">echo</span><span class="token plain"> Leitud failist: %%f </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> echo.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Tulemused:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Program Files </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Windows Kits</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Lib</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10586.0</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">um</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">x8</span><span class="token operator file-descriptor important" style="color:#393A34">6</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">findlib.bat timeGetTime</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">otsime .lib failidest timeGetTime</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  _timeGetTime@0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Leitud failist: C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Program Files </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Windows Kits</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Lib</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10586.0</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">um</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">mmos.lib</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  _timeGetTime@0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Leitud failist: C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Program Files </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Windows Kits</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Lib</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10586.0</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">um</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">OneCore.Lib</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  _timeGetTime@0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Leitud failist: C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Program Files </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Windows Kits</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Lib</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10586.0</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">um</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">OneCoreUAP.Lib</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  _timeGetTime@0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Leitud failist: C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Program Files </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Windows Kits</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Lib</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10586.0</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">um</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">OneCoreUAP_downlevel.Lib</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  _timeGetTime@0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Leitud failist: C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Program Files </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Windows Kits</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Lib</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10586.0</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">um</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">OneCore_downlevel.Lib</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                  _timeGetTime@0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Leitud failist: C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Program Files </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Windows Kits</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">Lib</span><span class="token punctuation" style="color:#393A34">\</span><span class="token number" style="color:#36acaa">10.0</span><span class="token plain">.10586.0</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">um</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">x86</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">WinMM.Lib</span><br></div></code></pre></div></div>
<p><em>.obj</em> failidest otsimiseks tegin käsufaili:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">@echo off</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> otsime .obj failidest %1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain">  /r %%f </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">*.obj</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">do</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token string" style="color:#e3116c">"C:\Program Files (x86)\Microsoft Visual Studio</span><span class="token string entity" style="color:#36acaa">\201</span><span class="token string" style="color:#e3116c">7\Professional\VC\Tools\MSVC</span><span class="token string entity" style="color:#36acaa">\14</span><span class="token string" style="color:#e3116c">.13.26128</span><span class="token string entity" style="color:#36acaa">\b</span><span class="token string" style="color:#e3116c">in\Hostx86</span><span class="token string entity" style="color:#36acaa">\x86</span><span class="token string" style="color:#e3116c">\dumpbin.exe"</span><span class="token plain"> /SYMBOLS </span><span class="token string" style="color:#e3116c">"%%f"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> findstr %1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> errorlevel </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> not errorlevel </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token builtin class-name">echo</span><span class="token plain"> Leitud failist: %%f </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> echo.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Linkimisel on oluline jälgida, et platvorm (x86 või x64) oleks õige.</p>
<p>Samuti on tähtis, et <em>Run-Time Library</em> klapiks kogu rakenduse lõikes.</p>
<p>Selle kohta saab rohkem lugeda siit: <a href="https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx" target="_blank" rel="noopener noreferrer" class="">https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx</a></p>
<p>Tegin väikese <em>MSYS2 bash</em> käsufaili, millega saan teada <em>.lib</em> faili kuupäeva, platvormi ning ka <em>Run-Time Library</em>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> /usr/bin/libinfo.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#! /bin/sh</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ls</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token string" style="color:#e3116c">"C:\Program Files (x86)\Microsoft Visual Studio</span><span class="token string entity" style="color:#36acaa">\201</span><span class="token string" style="color:#e3116c">7\Professional\VC\Tools\MSVC</span><span class="token string entity" style="color:#36acaa">\14</span><span class="token string" style="color:#e3116c">.13.26128</span><span class="token string entity" style="color:#36acaa">\b</span><span class="token string" style="color:#e3116c">in\Hostx86</span><span class="token string entity" style="color:#36acaa">\x86</span><span class="token string" style="color:#e3116c">\dumpbin.exe"</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-headers</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> machine </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">head</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-aPo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'.{0,20}DEFAULTLIB.{0,12}'</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">head</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><br></div></code></pre></div></div>
<p>Viiteid:
<a href="https://msdn.microsoft.com/en-us/library/799kze2z.aspx" target="_blank" rel="noopener noreferrer" class="">https://msdn.microsoft.com/en-us/library/799kze2z.aspx</a></p>
<p><a href="https://docs.microsoft.com/en-us/cpp/porting/overview-of-potential-upgrade-issues-visual-cpp" target="_blank" rel="noopener noreferrer" class="">https://docs.microsoft.com/en-us/cpp/porting/overview-of-potential-upgrade-issues-visual-cpp</a></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="programmeerimine" term="programmeerimine"/>
        <category label="C++" term="C++"/>
        <category label="VisualStudio" term="VisualStudio"/>
        <category label="Windows" term="Windows"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Avatud laiendamisele, suletud muutmisele ehk C++ ja staatiline polümorfism]]></title>
        <id>https://www.infokiir.ee/articles/poly-static-cpp/</id>
        <link href="https://www.infokiir.ee/articles/poly-static-cpp/"/>
        <updated>2018-01-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Kui sissejuhatuseks rääkida veidi raamatutest, siis Robert C. Martin-i sulest ilmunud teos "Agile Principles, Patterns, and Practices in C#" on klassika, mis ilmselt tasub küll igal programmeerijal läbi lugeda. Siin tutvustatud niinimetatud SOLID printsiibid on väärt rakendamist, kuigi alati ei õnnestu see tavaliselt 100%-liselt.]]></summary>
        <content type="html"><![CDATA[<p>Kui sissejuhatuseks rääkida veidi raamatutest, siis Robert C. Martin-i sulest ilmunud teos <a href="https://www.safaribooksonline.com/library/view/agile-principles-patterns/0131857258/" target="_blank" rel="noopener noreferrer" class="">"Agile Principles, Patterns, and Practices in C#"</a> on klassika, mis ilmselt tasub küll igal programmeerijal läbi lugeda. Siin tutvustatud niinimetatud <a href="https://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29" target="_blank" rel="noopener noreferrer" class="">SOLID printsiibid</a> on väärt rakendamist, kuigi alati ei õnnestu see tavaliselt 100%-liselt.</p>
<p>Võtame korraks vaatluse alla <a href="https://en.wikipedia.org/wiki/Open/closed_principle" target="_blank" rel="noopener noreferrer" class="">"Avatud laiendamisele, suletud muutmisele"</a> põhimõtte, millega on tihedalt seotud ka <a href="https://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank" rel="noopener noreferrer" class="">SRP</a>.</p>
<p>Meenus ammune juuni 2008 MSDN-s ilmunud Jeremy Miller kirjutatud artikkel <a href="http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazine2008_06en-us.chm" target="_blank" rel="noopener noreferrer" class="">"The Open Closed Principle"</a>. Seal on kasutusel muidugi dünaamiline polümorfism. Kuid C++ võimaldab ka <a href="https://stackoverflow.com/questions/262254/crtp-to-avoid-dynamic-polymorphism" target="_blank" rel="noopener noreferrer" class="">staatilist polümorfismi</a> ilma <a href="https://en.wikipedia.org/wiki/Virtual_method_table" target="_blank" rel="noopener noreferrer" class="">VTABLE-t</a> kasutamata. Eriti meeldib see mikrokontrollerite programmeerijatele, sest see võimaldab tihtipeale mälu kokku hoida ja töötab ka kiiremini.</p>
<p>Alustame lihtsa näitega, kus kasutame tavalist if-else hargnemist. Me ei järgi siin erilisi printsiipe, kasutame lihtsalt niiöelda oma talupojamõistust:</p>
<div class="language-clike codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-clike codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#include </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">iostream</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">enum class </span><span class="token class-name">OrderType</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Domestic</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> International</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct Order </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int order_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int customer_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    OrderType orderType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct SelectAndProcess </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    static void </span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing InternationalOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing DomesticOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">int </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order international</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic2</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">international</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Lihtsuse mõttes on kõik struktuurid ja klassid samas failis. Need saaks küll paigutada erinevatesse failidesse, kuid me ei keskendu praegu sellele.</p>
<p>Seda koodi võib vaadata aadressilt: <a href="https://godbolt.org/g/GgNsJA" target="_blank" rel="noopener noreferrer" class="">https://godbolt.org/g/GgNsJA</a>. Assembleris on siin 74 rida.</p>
<p>Ülaltoodud kood on ilmselt esimene viis, kuidas me programmeerijatena oleme alustanud. Suureks plussiks on siin lihtsus. Koodi ei ole ka palju ja see on praegu lihtsasti arusaadav. Programm väljastab:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Processing DomesticOrder id:1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Processing InternationalOrder id:2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Processing DomesticOrder id:3</span><br></div></code></pre></div></div>
<p>Kogenud programmeerija näeb siin siiski probleeme:</p>
<ul>
<li class="">struct SelectAndProcess on reaalses elus kindlasti palju keerulisem. Mõistlik oleks, et iga if lause taga olev kood oleks omaette funktsioonis või pigem klassis. Võime ette kujutada (kindlasti oleme ise näinud või ka ise kirjutanud), kui pikaks see execute meetod võib minna.</li>
<li class="">Kui soovime näiteks lisada uue Order tüübi <em>Special</em>, siis peaksime lisame veel ühe if lause ning meie <em>execute</em> meetod venib veelgi pikemaks. Kuidas oleks tulevikus sellist koodi hooldada? See ei ole väga tore. Vigu võib kergesti tulla ja see võib olla aeganõudev.</li>
<li class="">See kood ei vasta ei <a href="https://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank" rel="noopener noreferrer" class="">SRP</a> ega ka <a href="https://en.wikipedia.org/wiki/Open/closed_principle" target="_blank" rel="noopener noreferrer" class="">OCP</a> põhimõttele.</li>
</ul>
<p>Järgmisena vaatame kuidas lahendada sama ülesanne dünaamilise polümorfismi abil, kasutades abstraktset baasklassi. Sisuliselt peame muutma vaid SelectAndProcess avalikku klassi.</p>
<div class="language-clike codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-clike codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#include </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">iostream</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">enum class </span><span class="token class-name">OrderType</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Domestic</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> International</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct Order </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int order_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int customer_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    OrderType orderType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct OrderHandler </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    virtual </span><span class="token operator" style="color:#393A34">~</span><span class="token function" style="color:#d73a49">OrderHandler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    virtual void </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    virtual bool </span><span class="token function" style="color:#d73a49">can_process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct DomesticOrderProcessor </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> OrderHandler </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    void </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> override </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing DomesticOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bool </span><span class="token function" style="color:#d73a49">can_process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> override </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct InternationalOrderProcessor </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> OrderHandler </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    void </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> override </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing InternationalOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bool </span><span class="token function" style="color:#d73a49">can_process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> override </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct SelectAndProcess </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    static void </span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        DomesticOrderProcessor domesticOrderProcessor</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        InternationalOrderProcessor internationalOrderProcessor</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        OrderHandler </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">arr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">domesticOrderProcessor</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">internationalOrderProcessor</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        int size </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sizeof</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">arr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sizeof</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">arr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">int i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> size</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">++</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">arr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token function" style="color:#d73a49">can_process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                arr</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">int </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order international</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic2</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">international</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Käivitame selle ja tulemus on sama:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Processing DomesticOrder id:1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Processing InternationalOrder id:2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Processing DomesticOrder id:3</span><br></div></code></pre></div></div>
<p>Assembleris on ridu gcc-ga kõvasti rohkem: <a href="https://godbolt.org/g/itBHRg" target="_blank" rel="noopener noreferrer" class="">https://godbolt.org/g/itBHRg</a>. Siin on näha ka, et genereeriti vastavad <em>vtable</em> read.</p>
<p>Kui vaadata <em>clang</em> abil genereeritud listingut <a href="https://godbolt.org/g/jwHW3r" target="_blank" rel="noopener noreferrer" class="">https://godbolt.org/g/jwHW3r</a>, siis on ridu kõvasti vähem ja ka <em>vtable</em> read puuduvad.</p>
<p>Nüüd siis sama asi staatilist polümorfismi kasutades. Ilma template võimalust kasutades näeb kood välja niimoodi:</p>
<div class="language-clike codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-clike codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#include </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">iostream</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">enum class </span><span class="token class-name">OrderType</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Domestic</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> International</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct Order </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int order_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int customer_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    OrderType orderType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct DomesticOrderProcessor </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bool </span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing DomesticOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct InternationalOrderProcessor </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bool </span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing InternationalOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">inline int </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">InternationalOrderProcessor </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">orderp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> orderp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">inline int </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">DomesticOrderProcessor </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">orderp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> orderp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct SelectAndProcess </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    static int </span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        DomesticOrderProcessor domestic_order</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        InternationalOrderProcessor international_order</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic_order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">international_order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">int </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order international</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic2</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">international</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Assembleri listingus saime 78 koodirida: <a href="https://godbolt.org/g/j8PBxU" target="_blank" rel="noopener noreferrer" class="">https://godbolt.org/g/j8PBxU</a></p>
<p>Kasutasime siin ära selle, et vastavalt meetodi parameetritele käivitatakse ka vastav funktsioon. Järgmisena võtame appi C++ <em>template</em>, mis võimaldab meil koodi mitte korrata:</p>
<div class="language-clike codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-clike codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">template</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">typename order_processor</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">int </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order_processor </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">orderp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> orderp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>kogu programm:</p>
<div class="language-clike codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-clike codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#include </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">iostream</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">enum class </span><span class="token class-name">OrderType</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Domestic</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> International</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct Order </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int order_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int customer_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    OrderType orderType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct DomesticOrderProcessor </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bool </span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing DomesticOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct InternationalOrderProcessor </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bool </span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing InternationalOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">template</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">typename order_processor</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">int </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order_processor </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">orderp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> orderp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct SelectAndProcess </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    static int </span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        DomesticOrderProcessor domestic_order</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        InternationalOrderProcessor international_order</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic_order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">international_order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">int </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order international</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic2</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">international</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Assembleri listing <a href="https://godbolt.org/g/Qf3F9F" target="_blank" rel="noopener noreferrer" class="">https://godbolt.org/g/Qf3F9F</a> on tegelikult täpselt sama.</p>
<p>Lõpuks veel sama asi <a href="https://stackoverflow.com/questions/4173254/what-is-the-curiously-recurring-template-pattern-crtp" target="_blank" rel="noopener noreferrer" class="">CRTP</a> abil:</p>
<div class="language-clike codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-clike codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#include </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">iostream</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">enum class </span><span class="token class-name">OrderType</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Domestic</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> International</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct Order </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int order_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    int customer_id</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    OrderType orderType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">template</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">class </span><span class="token class-name">Derived</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct base </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    void </span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        static_cast</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Derived </span><span class="token operator" style="color:#393A34">*</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct DomesticOrderProcessor </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> base</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">DomesticOrderProcessor</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bool </span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing DomesticOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct InternationalOrderProcessor </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> base</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">InternationalOrderProcessor</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    bool </span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orderType </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            std</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">cout </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Processing InternationalOrder id:"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">order_id </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">template</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">typename order_processor</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">int </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order_processor </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">orderp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> orderp</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">process</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">struct SelectAndProcess </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    static int </span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Order </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        DomesticOrderProcessor domestic_order</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        InternationalOrderProcessor international_order</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic_order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">process_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">international_order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">int </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order international</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">International</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Order domestic2</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">Domestic</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">international</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SelectAndProcess</span><span class="token punctuation" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">:</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">domestic2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Genereeritud assembleri listing on ikka sama: <a href="https://godbolt.org/g/e4s5iF" target="_blank" rel="noopener noreferrer" class="">https://godbolt.org/g/e4s5iF</a>. Koodi tuli juurde, aga olulist võitu sellest ei tulnud.</p>
<p>Mida öelda kokkuvõtteks?</p>
<ul>
<li class="">On hea teada nii dünaamilise kui staatilise polümorfismi võimalusi. See aitab kirjutada kergemini hallatavad koodi.</li>
<li class="">Tasub vaadata ja võrrelda genereeritud assembleri listinguid. Optimeeritud kompilaator võib meid üllatada. Näiteks <em>clang</em>-i genereeritud dünaamilise polümorfismiga variant ei sisaldanudki <em>vtable</em> ridu.</li>
</ul>
<p>linke:</p>
<p><a href="https://www.safaribooksonline.com/library/view/agile-principles-patterns/0131857258/" target="_blank" rel="noopener noreferrer" class="">https://www.safaribooksonline.com/library/view/agile-principles-patterns/0131857258/</a></p>
<p><a href="https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)" target="_blank" rel="noopener noreferrer" class="">https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)</a></p>
<p><a href="https://en.wikipedia.org/wiki/Open/closed_principle" target="_blank" rel="noopener noreferrer" class="">https://en.wikipedia.org/wiki/Open/closed_principle</a></p>
<p><a href="https://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank" rel="noopener noreferrer" class="">https://en.wikipedia.org/wiki/Single_responsibility_principle</a></p>
<p><a href="https://blogs.msdn.microsoft.com/msdnmagazine/2008/07/02/patterns-in-practice-the-open-closed-principle/" target="_blank" rel="noopener noreferrer" class="">https://blogs.msdn.microsoft.com/msdnmagazine/2008/07/02/patterns-in-practice-the-open-closed-principle/</a></p>
<p><a href="http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazine2008_06en-us.chm" target="_blank" rel="noopener noreferrer" class="">http://download.microsoft.com/download/3/a/7/3a7fa450-1f33-41f7-9e6d-3aa95b5a6aea/MSDNMagazine2008_06en-us.chm</a></p>
<p><a href="https://en.wikipedia.org/wiki/Template_metaprogramming#Static_polymorphism" target="_blank" rel="noopener noreferrer" class="">https://en.wikipedia.org/wiki/Template_metaprogramming#Static_polymorphism</a></p>
<p>Real-Time C++ <a href="http://www.springer.com/gp/book/9783662478097" target="_blank" rel="noopener noreferrer" class="">http://www.springer.com/gp/book/9783662478097</a></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="programmeerimine" term="programmeerimine"/>
        <category label="CSharp" term="CSharp"/>
        <category label="C++" term="C++"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Enda otsingumootor ehk kuidas otsida infot staatiliselt veebisaidilt (Apache Solr ja Nutch)]]></title>
        <id>https://www.infokiir.ee/articles/solr-nutch/</id>
        <link href="https://www.infokiir.ee/articles/solr-nutch/"/>
        <updated>2018-01-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Staatilisel veebisaidil on omad eelised: see on lihtsam, kiirem ja turvalisem kui dünaamiline sait. Nii nagu staatilist veebisaiti tehes, võib koostada ka dokumendikogu, kasutades markdown süntaksit.]]></summary>
        <content type="html"><![CDATA[<p>Staatilisel veebisaidil on omad eelised: see on lihtsam, kiirem ja turvalisem kui dünaamiline sait. Nii nagu staatilist veebisaiti tehes, võib koostada ka dokumendikogu, kasutades <a href="https://et.wikipedia.org/wiki/Markdown" target="_blank" rel="noopener noreferrer" class="">markdown süntaksit</a>.</p>
<p>Kuidas aga korraldada otsing, kui soovime dokumente hoida vaid sisevõrgus? Keegi ei keela enda otsingumootori püstipanekut. Toon siin lihtsa näite, kuidas seda teha <a href="https://lucene.apache.org/solr/" target="_blank" rel="noopener noreferrer" class="">Apache Solr</a> ja <a href="http://nutch.apache.org/" target="_blank" rel="noopener noreferrer" class="">Apache Nutch</a> abil. Siintoodud juhend on Linux keskkonnas, kuid see töötab ka näiteks <a href="https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux" target="_blank" rel="noopener noreferrer" class="">WSL keskkonnas</a>.</p>
<p>Internetis on üsna hea lihtne juhend: <a href="https://factorpad.com/tech/solr/tutorial/solr-web-crawl.html" target="_blank" rel="noopener noreferrer" class="">https://factorpad.com/tech/solr/tutorial/solr-web-crawl.html</a>.  Ainuke häda on see, et veebisaidi sisu allalaadides -recursive võtmega kipub ilmuma veateade "[Fatal Error] :1:1: Content is not allowed in prolog." Selleks, et sellest üle saada, kasutame Apache Nutch-i.</p>
<p>Kuna lihtsasti mõistetavat ja töötavat õpetust oli raske leida, panen siis selle nüüd kirja.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~$ </span><span class="token builtin class-name">cd</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~$ </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> solr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~$ </span><span class="token builtin class-name">cd</span><span class="token plain"> solr</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/solr$ </span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> http://www-us.apache.org/dist/lucene/solr/7.2.0/solr-7.2.0.tgz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/solr$ </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> xf solr-7.2.0.tgz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/solr$ </span><span class="token builtin class-name">cd</span><span class="token plain"> solr-7.2.0/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/solr/solr-7.2.0$ bin/solr start</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/solr/solr-7.2.0$ bin/solr create_core </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> infokiir</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">WARNING: Using _default configset. Data driven schema functionality is enabled by default, </span><span class="token function" style="color:#d73a49">which</span><span class="token plain"> is</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         NOT RECOMMENDED </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> production use.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">         To turn it off:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://localhost:8983/solr/infokiir/config </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{"set-user-property": {"update.autoCreateFields":"false"}}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Created new core </span><span class="token string" style="color:#e3116c">'infokiir'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/solr/solr-7.2.0$</span><br></div></code></pre></div></div>
<p>Veendume ka, et meil oleks java installeeritud:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/solr/solr-7.2.0$ </span><span class="token function" style="color:#d73a49">java</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">openjdk version </span><span class="token string" style="color:#e3116c">"1.8.0_151"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">OpenJDK Runtime Environment </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">build </span><span class="token number" style="color:#36acaa">1.8</span><span class="token plain">.0_151-8u151-b12-0ubuntu0.16.04.2-b12</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">OpenJDK </span><span class="token number" style="color:#36acaa">64</span><span class="token plain">-Bit Server VM </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">build </span><span class="token number" style="color:#36acaa">25.151</span><span class="token plain">-b12, mixed mode</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Juhul, kui JAVA_HOME ei ole väärtustatud, siis teen seda käsklusega:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">JAVA_HOME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/usr/lib/jvm/java-8-openjdk-amd64</span><br></div></code></pre></div></div>
<p>Edasi:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/solr/solr-7.2.0$ </span><span class="token builtin class-name">cd</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~$ </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> nutch</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~$ </span><span class="token builtin class-name">cd</span><span class="token plain"> nutch/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch$ </span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> http://www-eu.apache.org/dist/nutch/1.14/apache-nutch-1.14-bin.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--2018-01-08 </span><span class="token number" style="color:#36acaa">14</span><span class="token plain">:04:20--  http://www-eu.apache.org/dist/nutch/1.14/apache-nutch-1.14-bin.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Lahendan www-eu.apache.org </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">www-eu.apache.org</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">. </span><span class="token number" style="color:#36acaa">195.154</span><span class="token plain">.151.36, </span><span class="token number" style="color:#36acaa">2001</span><span class="token plain">:bc8:2142:300::</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Loon ühendust serveriga www-eu.apache.org </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">www-eu.apache.org</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">|</span><span class="token number" style="color:#36acaa">195.154</span><span class="token plain">.151.36</span><span class="token operator" style="color:#393A34">|</span><span class="token plain">:80</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">. ühendus loodud.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">HTTP päring saadetud, ootan vastust</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">. </span><span class="token number" style="color:#36acaa">200</span><span class="token plain"> OK</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Pikkus: </span><span class="token number" style="color:#36acaa">249107211</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">238M</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">application/x-gzip</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Salvestan: </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">apache-nutch-1.14-bin.tar.gz'</span><br></div><div class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa"></span><br></div><div class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">apache-nutch-1.14-bin.tar.gz                 </span><span class="token variable number" style="color:#36acaa">100</span><span class="token variable" style="color:#36acaa">%</span><span class="token variable punctuation" style="color:#393A34">[</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">==</span><span class="token variable operator" style="color:#393A34">=</span><span class="token variable operator" style="color:#393A34">&gt;</span><span class="token variable punctuation" style="color:#393A34">]</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable number" style="color:#36acaa">237</span><span class="token variable" style="color:#36acaa">,57M  </span><span class="token variable number" style="color:#36acaa">5</span><span class="token variable" style="color:#36acaa">,30MB/s    </span><span class="token variable keyword" style="color:#00009f">in</span><span class="token variable" style="color:#36acaa"> 48s</span><br></div><div class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa"></span><br></div><div class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa"></span><span class="token variable number" style="color:#36acaa">2018</span><span class="token variable" style="color:#36acaa">-01-08 </span><span class="token variable number" style="color:#36acaa">14</span><span class="token variable" style="color:#36acaa">:05:09 </span><span class="token variable punctuation" style="color:#393A34">(</span><span class="token variable number" style="color:#36acaa">4,93</span><span class="token variable" style="color:#36acaa"> MB/s</span><span class="token variable punctuation" style="color:#393A34">)</span><span class="token variable" style="color:#36acaa"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token plain">apache-nutch-1.14-bin.tar.gz' salvestatud </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">249107211</span><span class="token plain">/249107211</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch$ </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> xf apache-nutch-1.14-bin.tar.gz</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch$ </span><span class="token builtin class-name">cd</span><span class="token plain"> apache-nutch-1.14/</span><br></div></code></pre></div></div>
<p>Proovin, kas crawl käivitub:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch/apache-nutch-1.14$ bin/crawl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Usage: crawl [-i|--index] [-D "key=value"] [-w|--wait] [-s &lt;Seed Dir&gt;] &lt;Crawl Dir&gt; &lt;Num Rounds&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        -i|--index      Indexes crawl results into a configured indexer</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        -D              A Java property to pass to Nutch calls</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        -w|--wait       NUMBER[SUFFIX] Time to wait before generating a new segment when no URLs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        are scheduled for fetching. Suffix can be: s for second,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        m for minute, h for hour and d for day. If no suffix is</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                        specified second is used by default.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        -s Seed Dir     Path to seeds file(s)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Crawl Dir       Directory where the crawl/link/segments dirs are saved</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Num Rounds      The number of rounds to run this crawl for</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch/apache-nutch-1.14$</span><br></div></code></pre></div></div>
<p>Edasi seadistame mõned parameetrid:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch/apache-nutch-1.14$ </span><span class="token function" style="color:#d73a49">nano</span><span class="token plain"> conf/nutch-site.xml</span><br></div></code></pre></div></div>
<p>Kopeerin "configuration" tag-de vahele (sisu laenatud veebisaidilt <a href="http://opensourceconnections.com/blog/2014/05/24/crawling-with-nutch/" target="_blank" rel="noopener noreferrer" class="">http://opensourceconnections.com/blog/2014/05/24/crawling-with-nutch/</a>):</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">http.agent.name</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">MyBot</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">MUST NOT be empty. The advertised version will have Nutch appended.</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">http.robots.agents</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">MyBot,*</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">The agent strings we'll look for in robots.txt files,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> comma-separated, in decreasing order of precedence. You should</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> put the value of http.agent.name as the first agent name, and keep the</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> default * at the end of the list. E.g.: BlurflDev,Blurfl,*. If you don't, your logfile will be full of warnings.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">fetcher.store.content</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">true</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">If true, fetcher will store content. Helpful on the getting-started stage, as you can recover failed steps, but may cause performance problems on larger crawls.</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">fetcher.max.crawl.delay</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">-1</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> If the Crawl-Delay in robots.txt is set to greater than this value (in</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> seconds) then the fetcher will skip this page, generating an error report. If set to -1 the fetcher will never skip such pages and will wait the amount of time retrieved from robots.txt Crawl-Delay, however long that might be.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Applicable plugins--&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">plugin.includes</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">name</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">protocol-http|urlfilter-regex|parse-(html|tika|metatags)|index-(basic|anchor|metadata)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-opic|indexer-solr|urlnormalizer-(pass|regex|basic)</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> At the very least, I needed to add the parse-html, urlfilter-regex, and the indexer-solr.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">description</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">property</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">```![](2018-01-08-14-54-15.png)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">```bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch/apache-nutch-1.14$ nano urls/seed.text</span><br></div></code></pre></div></div>
<p>Lisan siia rea:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">http://www.infokiir.ee</span><br></div></code></pre></div></div>
<p>Kommenteerin välja viimase rea ja lisan:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">#+.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+^https?://([a-z0-9-]+\.)*www\.infokiir\.ee/</span><br></div></code></pre></div></div>
<p>See on vajalik selleks, et me püsiks <a href="http://www.infokiir.ee/" target="_blank" rel="noopener noreferrer" class="">www.infokiir.ee</a> veebisaidil ega hakkaks alla laadima väliseid viidatud veebisaite.</p>
<p>Veebisaidi sisu allalaadimine käib kahes etapis. Kõigepealt käivitan:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch/apache-nutch-1.14$ bin/crawl </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> urls crawl/ </span><span class="token number" style="color:#36acaa">2</span><br></div></code></pre></div></div>
<p>Seejärel:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch/apache-nutch-1.14$ bin/nutch solrindex http://localhost:8983/solr/infokiir crawl/crawldb/ crawl/segments/*</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Segment </span><span class="token function" style="color:#d73a49">dir</span><span class="token plain"> is complete: crawl/segments/20180108144502.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Segment </span><span class="token function" style="color:#d73a49">dir</span><span class="token plain"> is complete: crawl/segments/20180108144521.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Indexer: starting at </span><span class="token number" style="color:#36acaa">2018</span><span class="token plain">-01-08 </span><span class="token number" style="color:#36acaa">14</span><span class="token plain">:48:13</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Indexer: deleting gone documents: </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Indexer: URL filtering: </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Indexer: URL normalizing: </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Active IndexWriters </span><span class="token builtin class-name">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SOLRIndexWriter</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        solr.server.url </span><span class="token builtin class-name">:</span><span class="token plain"> URL of the SOLR instance</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        solr.zookeeper.hosts </span><span class="token builtin class-name">:</span><span class="token plain"> URL of the Zookeeper quorum</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        solr.commit.size </span><span class="token builtin class-name">:</span><span class="token plain"> buffer size when sending to SOLR </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">default </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        solr.mapping.file </span><span class="token builtin class-name">:</span><span class="token plain"> name of the mapping </span><span class="token function" style="color:#d73a49">file</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> fields </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">default solrindex-mapping.xml</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        solr.auth </span><span class="token builtin class-name">:</span><span class="token plain"> use authentication </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">default </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        solr.auth.username </span><span class="token builtin class-name">:</span><span class="token plain"> username </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> authentication</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        solr.auth.password </span><span class="token builtin class-name">:</span><span class="token plain"> password </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> authentication</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Indexing </span><span class="token number" style="color:#36acaa">6</span><span class="token plain">/6 documents</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Deleting </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> documents</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Indexer: number of documents indexed, deleted, or skipped:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Indexer:      </span><span class="token number" style="color:#36acaa">6</span><span class="token plain">  indexed </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">add/update</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Indexer: finished at </span><span class="token number" style="color:#36acaa">2018</span><span class="token plain">-01-08 </span><span class="token number" style="color:#36acaa">14</span><span class="token plain">:48:16, elapsed: 00:00:02</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tiit@tiit-Virtual-Machine:~/nutch/apache-nutch-1.14$</span><br></div></code></pre></div></div>
<p>Nüüd vaatan tulemust:</p>
<p><img decoding="async" loading="lazy" src="https://www.infokiir.ee/assets/images/2018-01-08-14-52-02-b7dcf45955be020c1a2c0040db67e7bf.png" width="1075" height="690" class="img_ev3q"></p>
<p>Otsing:
<img decoding="async" loading="lazy" src="https://www.infokiir.ee/assets/images/2018-01-08-14-54-32-e70dba5cd144dc6e73348dc3635d55bb.png" width="1075" height="944" class="img_ev3q"></p>
<p>Linke:</p>
<p><a href="https://et.wikipedia.org/wiki/Markdown" target="_blank" rel="noopener noreferrer" class="">https://et.wikipedia.org/wiki/Markdown</a></p>
<p><a href="https://lucene.apache.org/solr/" target="_blank" rel="noopener noreferrer" class="">https://lucene.apache.org/solr/</a></p>
<p><a href="http://nutch.apache.org/" target="_blank" rel="noopener noreferrer" class="">http://nutch.apache.org/</a></p>
<p><a href="https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux" target="_blank" rel="noopener noreferrer" class="">https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux</a></p>
<p><a href="https://factorpad.com/tech/solr/tutorial/solr-web-crawl.html" target="_blank" rel="noopener noreferrer" class="">https://factorpad.com/tech/solr/tutorial/solr-web-crawl.html</a></p>
<p><a href="http://opensourceconnections.com/blog/2014/05/24/crawling-with-nutch/" target="_blank" rel="noopener noreferrer" class="">http://opensourceconnections.com/blog/2014/05/24/crawling-with-nutch/</a></p>
<p><a href="https://lobster1234.github.io/2017/08/14/search-with-nutch-mongodb-solr/" target="_blank" rel="noopener noreferrer" class="">https://lobster1234.github.io/2017/08/14/search-with-nutch-mongodb-solr/</a></p>]]></content>
        <author>
            <name>Tiit Ülejõe</name>
            <uri>https://www.infokiir.ee</uri>
        </author>
        <category label="varia" term="varia"/>
        <category label="veeb" term="veeb"/>
    </entry>
</feed>