{"id":36721,"date":"2019-10-31T22:13:20","date_gmt":"2019-10-31T19:13:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-dark-razvertyvaet-kod-za-50-ms\/"},"modified":"2019-10-31T22:13:20","modified_gmt":"2019-10-31T19:13:20","slug":"kak-dark-razvertyvaet-kod-za-50-ms","status":"publish","type":"post","link":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","title":{"rendered":"K\u0101 Dark izv\u0113r\u0161 kodu 50 ms.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"K\u0101 Dark izv\u0113r\u0161 kodu 50 ms.\" src=\"\/wp-content\/uploads\/2019\/08\/c159a36eb52bf488f3a70ea511690366.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jo \u0101tr\u0101k notiek izstr\u0101des process, jo \u0101tr\u0101k att\u012bst\u0101s tehnolo\u0123iju uz\u0146\u0113mums.<\/p>\n<p><\/p>\n<p>Diem\u017e\u0113l m\u016bsdienu lietojumprogrammas darbojas pret mums \u2014 m\u016bsu sist\u0113m\u0101m j\u0101atjaunojas re\u0101llaik\u0101, netrauc\u0113jot nevienam un neizraisot d\u012bkst\u0101ves vai trauc\u0113jumus. Ievie\u0161ana \u0161\u0101d\u0101s sist\u0113m\u0101s ir sare\u017e\u0123\u012bta uzdevums un prasa sare\u017e\u0123\u012btus nep\u0101rtrauktas pieg\u0101des kan\u0101lus pat maz\u0101s komand\u0101s.<\/p>\n<p><\/p>\n<p>\u0160ie kan\u0101li parasti ir \u0161auri, l\u0113ni un nav \u012bpa\u0161i uzticami. Izstr\u0101d\u0101t\u0101jiem vispirms ir j\u0101izveido tie manu\u0101li, un p\u0113c tam tie ir j\u0101kontrol\u0113, t\u0101p\u0113c uz\u0146\u0113mumi bie\u017ei pie\u0146em veselas DevOps komandas, lai to paveiktu.<\/p>\n<p><\/p>\n<p>No \u0161iem kan\u0101liem atkar\u012bga izstr\u0101des \u0101trums. Lab\u0101kaj\u0101m komand\u0101m ievie\u0161ana aiz\u0146em 5\u201310 min\u016btes, ta\u010du parasti tas notiek daudz ilg\u0101k, un viena ievie\u0161ana var ilgt vair\u0101kas stundas.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Dark to paveic 50 ms. <em>Piekdesmit. Milisekundes.<\/em>. Dark \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">tas ir integr\u0113ts risin\u0101jums ar programm\u0113\u0161anas valodu, redaktoru un infrastrukt\u016bru<\/a><\/noindex>, izveidota \u012bpa\u0161i nep\u0101rtrauktai pieg\u0101dei, un visi aspekts Dark, tostarp pati valoda, ir izstr\u0101d\u0101ti ar domu par dro\u0161u un moment\u0101lu ievie\u0161anu.<\/p>\n<p><\/p>\n<h3 id=\"pochemu-konveyery-nepreryvnoy-postavki-takie-medlennye\">K\u0101p\u0113c nep\u0101rtraukt\u0101s pieg\u0101des kan\u0101li ir tik l\u0113ni?<\/h3>\n<p><\/p>\n<p>Pie\u0146emsim, ka mums ir Python t\u012bmek\u013ca lietojumprogramma un jau esam izveidoju\u0161i br\u012bni\u0161\u0137\u012bgu un m\u016bsdien\u012bgu nep\u0101rtrauktas pieg\u0101des kan\u0101lu. Izstr\u0101d\u0101t\u0101jam, kur\u0161 katru dienu str\u0101d\u0101 pie \u0161\u012b projekta, viena nenoz\u012bm\u012bga labojuma ievie\u0161ana izskat\u012bsies apm\u0113ram t\u0101:<\/p>\n<p><\/p>\n<h3 id=\"vnesenie-izmeneniy\">Izmai\u0146u veik\u0161ana<\/h3>\n<p><\/p>\n<ul>\n<li>Jaunas zara izveide git<\/li>\n<li>Izmai\u0146u veik\u0161ana funkcijas p\u0101rsl\u0113g\u0161anai<\/li>\n<li>Modul\u0101ro testu veik\u0161ana, lai p\u0101rbaud\u012btu izmai\u0146as ar funkcijas p\u0101rsl\u0113g\u0161anu un bez<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pul-rekvest\">Pull piepras\u012bjums<\/h3>\n<p><\/p>\n<ul>\n<li>Izmai\u0146u apstiprin\u0101\u0161ana<\/li>\n<li>Izmai\u0146u nos\u016bt\u012b\u0161ana att\u0101lin\u0101tajam repozitorijam GitHub<\/li>\n<li>Pull piepras\u012bjums<\/li>\n<li>CI b\u016bv\u0113\u0161ana tiek autom\u0101tiski veikta fon\u0101<\/li>\n<li>Koda p\u0101rskats<\/li>\n<li>V\u0113l da\u017eas p\u0101rskat\u012b\u0161anas, ja nepiecie\u0161ams<\/li>\n<li>Izmai\u0146u apvieno\u0161ana ar git master.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"ci-vypolnyaetsya-na-mastere\">CI darbojas uz mastera<\/h3>\n<p><\/p>\n<ul>\n<li>Frontend atkar\u012bbu uzst\u0101d\u012b\u0161ana caur npm<\/li>\n<li>Resursu HTML+CSS+JS b\u016bv\u0113\u0161ana un optimiz\u0101cija<\/li>\n<li>Modul\u0101ro un funkcion\u0101lo testu izpilde frontend\u0101<\/li>\n<li>Python atkar\u012bbu uzst\u0101d\u012b\u0161ana no PyPI<\/li>\n<li>Modul\u0101ro un funkcion\u0101lo testu izpilde backend\u0101<\/li>\n<li>Integr\u0101cijas test\u0113\u0161ana abos galos<\/li>\n<li>Resursu nos\u016bt\u012b\u0161ana frontend\u0101 uz CDN<\/li>\n<li>Python program container assembly<\/li>\n<li>Sending the container to the registry<\/li>\n<li>Kubernetes manifest update<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zamena-starogo-koda-novym\">Replacing old code with new<\/h3>\n<p><\/p>\n<ul>\n<li>Kubernetes launches multiple instances of the new container<\/li>\n<li>Kubernetes waits for the instances to become operational<\/li>\n<li>Kubernetes adds instances to the HTTP load balancer<\/li>\n<li>Kubernetes waits until the old instances are no longer in use<\/li>\n<li>Kubernetes stops the old instances<\/li>\n<li>Kubernetes repeats these operations until the new instances replace all the old ones<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vklyuchenie-novogo-pereklyuchatelya-funkcii\">Enabling the new feature toggle<\/h3>\n<p><\/p>\n<ul>\n<li>New code is enabled only for itself to ensure everything is functioning correctly<\/li>\n<li>New code is enabled for 10% of users, operational and business metrics are monitored<\/li>\n<li>New code is enabled for 50% of users, operational and business metrics are monitored<\/li>\n<li>New code is enabled for 100% of users, operational and business metrics are monitored<\/li>\n<li>Finally, you repeat the entire procedure to remove the old code and toggle<\/li>\n<\/ul>\n<p><\/p>\n<p>The process depends on tools, language, and service-oriented architecture usage, but generally looks like this. I have not mentioned deployments with database migrations, as this requires careful planning, but below I will explain how Dark deals with this.<\/p>\n<p><\/p>\n<p>There are many components, and many of them can easily cause bottlenecks, failures, temporary contention, or crash the working system.<\/p>\n<p><\/p>\n<p>And since these pipelines are almost always created for special cases, they are hard to rely on. Many people have days when the code cannot be deployed because there are issues in the Dockerfile, one of the dozens of services has failed, or the necessary specialist is on vacation.<\/p>\n<p><\/p>\n<p>Worse yet, many of these steps do not accomplish anything useful at all. They were needed earlier when we deployed code directly for users, but now we have toggles for the new code, and these processes have separated. As a result, the step where code is deployed (old is replaced with new) has now simply become an unnecessary risk.<\/p>\n<p><\/p>\n<p>Of course, this is a very well-thought-out pipeline. The team that created it did not spare time and money for rapid deployment. Usually, deployment pipelines are much slower and less reliable.<\/p>\n<p><\/p>\n<h3 id=\"realizaciya-nepreryvnoy-postavki-v-dark\">Implementing continuous delivery in Dark<\/h3>\n<p><\/p>\n<p>Nep\u0101rtraukta pieg\u0101de ir tik svar\u012bga uz\u0146\u0113mumam Dark, ka m\u0113s s\u0101kum\u0101 cent\u0101mies sasniegt laiku, kas ir maz\u0101ks par vienu sekundi. M\u0113s p\u0101rskat\u012bj\u0101m visus procesus un no\u0146em\u0101m visu lieko, k\u0101 ar\u012b uzlaboj\u0101m atliku\u0161os. L\u016bk, k\u0101 m\u0113s izsl\u0113dz\u0101m so\u013cus.<\/p>\n<p><\/p>\n<blockquote><p>D\u017eesija Frazela (<noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex>) izdom\u0101ja jauno terminu \u201edeployless\u201d (neprasot izv\u0113r\u0161anu) Future of Software Development konferenc\u0113 Reikjav\u012bk\u0101.<\/p><\/blockquote>\n<p>M\u0113s t\u016bl\u012bt nol\u0113m\u0101m, ka Dark balst\u012bsies uz \u201edeployless\u201d koncepciju (pateicoties <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">D\u017eesijai Frazelai<\/a><\/noindex> par neologismu). Deployless noz\u012bm\u0113, ka jebk\u0101ds kods ir moment\u0101ni izv\u0113rsts un gatavs izmanto\u0161anai ra\u017eo\u0161an\u0101. Protams, m\u0113s nepalaid\u012bsim gar\u0101m boj\u0101tu vai nepiln\u012bgu kodu (dro\u0161\u012bbas principi tiks aprakst\u012bti zem\u0101k).<\/p>\n<p><\/p>\n<p>Dark demonstr\u0101cijas laik\u0101 bie\u017ei tika jaut\u0101ts, k\u0101 mums izdev\u0101s tik \u013coti pa\u0101trin\u0101t izv\u0113r\u0161anu. D\u012bvains jaut\u0101jums. Cilv\u0113ki, \u0161\u0137iet, dom\u0101, ka m\u0113s izdom\u0101j\u0101m k\u0101du supersist\u0113mu, kas sal\u012bdzina kodu, kompil\u0113 to, iepako trauk\u0101, \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0101lo ma\u0161\u012bnu, aukst\u0101 pudi\u0146a konteineru un visu t\u0101du lietu, \u2014 un viss tas notiek 50 ms laik\u0101. Maz ticams, ka tas ir iesp\u0113jams. Bet m\u0113s izveidoj\u0101m \u012bpa\u0161u izv\u0113r\u0161anas dzin\u0113ju, kuram viss \u0161is process visp\u0101r nav nepiecie\u0161ams.<\/p>\n<p><\/p>\n<p>Dark s\u0101k izpild\u012bt interpretatorus m\u0101ko\u0146os. Pie\u0146emsim, ka j\u016bs rakst\u0101t kodu funkcij\u0101 vai HTTP vai notikumu apstr\u0101d\u0101t\u0101j\u0101. M\u0113s nos\u016bt\u0101m diff uz abstrakto sintaktisko koku (koda realiz\u0101ciju, ko iek\u0161\u0113ji izmanto m\u016bsu redaktors un serveri) uz m\u016bsu serveriem un tad izpild\u0101m \u0161o kodu, kad sa\u0146emam piepras\u012bjumus. T\u0101tad izv\u0113r\u0161ana izskat\u0101s vienk\u0101r\u0161i k\u0101 pietic\u012bgs ieraksts datu b\u0101z\u0113 \u2014 moment\u0101na un element\u0101ra. Izv\u0113r\u0161ana notiek tik \u0101tri, jo iek\u013cauj minim\u0101lo.<\/p>\n<p><\/p>\n<p>N\u0101kotn\u0113 pl\u0101nojam padar\u012bt Dark par infrastrukt\u016bras kompilatoru, kas rad\u012bs un izpild\u012bs ide\u0101lu infrastrukt\u016bru augstas veiktsp\u0113jas un uzticam\u012bbas lietotn\u0113m. Moment\u0101na izv\u0113r\u0161ana, protams, nekur nepazud\u012bs.<\/p>\n<p><\/p>\n<h2 id=\"bezopasnoe-razvertyvanie\">Dro\u0161a izv\u0113r\u0161ana<\/h2>\n<p><\/p>\n<h3 id=\"strukturirovannyy-redaktor\">Struktur\u0113tais redaktors<\/h3>\n<p><\/p>\n<p>Kods Dark tiek rakst\u012bts Dark redaktor\u0101. Struktur\u0113tais redaktors nepie\u013cauj sintaktiskas k\u013c\u016bdas. Paties\u012bb\u0101 Dark nav neviena analizatora. Kam\u0113r j\u016bs ievadat tekstu, m\u0113s tie\u0161i str\u0101d\u0101jam ar abstrakto sintaktisko koku (AST), k\u0101 <noindex><a rel=\"nofollow\" href=\"http:\/\/danmidwood.com\/content\/2014\/11\/21\/animated-paredit.html\">Paredit<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/ravichugh.github.io\/sketch-n-sketch\/\">Sketch-n-Sketch<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/gregoor.github.io\/tofu\/\">Tofu<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/notes\/kent-beck\/prune-a-code-editor-that-is-not-a-text-editor\/1012061842160013\/\">Prune<\/a><\/noindex> un <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/mps\/\">MPS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Ikvienam nepabeigtam kodam Dark ir pie\u013caujama izpildes semantika, aptuveni k\u0101 <noindex><a rel=\"nofollow\" href=\"https:\/\/hazel.org\/\">typed holes Hazel valod\u0101<\/a><\/noindex>. Piem\u0113ram, ja j\u016bs main\u0101t funkcijas izsaukumu, m\u0113s saglab\u0101jam veco funkciju, kam\u0113r jaun\u0101 k\u013c\u016bst der\u012bga.<\/p>\n<p><\/p>\n<p>Katram programmas elementam Dark ir sava noz\u012bme, t\u0101p\u0113c neizpild\u012bts kods netrauc\u0113 izpild\u012btajam darboties.<\/p>\n<p><\/p>\n<h3 id=\"rezhimy-redaktirovaniya\">Redi\u0123\u0113\u0161anas re\u017e\u012bmi<\/h3>\n<p><\/p>\n<p>J\u016bs rakst\u0101t kodu Dark divos gad\u012bjumos. Pirmais: j\u016bs rakst\u0101t jaunu kodu un esat vien\u012bgais lietot\u0101js. Piem\u0113ram, tas ir REPL, un citi lietot\u0101ji nekad tam netiks kl\u0101t, vai t\u0101 ir jauna HTTP mar\u0161ruta piek\u013cuve, uz kuru j\u016bs nekur neatsaucaties. \u0160eit var str\u0101d\u0101t bez jebk\u0101d\u0101m piesardz\u012bbas darb\u012bb\u0101m, un \u0161obr\u012bd j\u016bs vair\u0101k vai maz\u0101k t\u0101 ar\u012b str\u0101d\u0101jat izstr\u0101des vid\u0113.<\/p>\n<p><\/p>\n<p>Otra situ\u0101cija: kods jau tiek izmantots. Ja caur kodu pl\u016bst satiksme (funkcijas, notikumu apstr\u0101d\u0101t\u0101ji, datu b\u0101zes utt.), j\u0101iev\u0113ro piesardz\u012bba. T\u0101p\u0113c m\u0113s blo\u0137\u0113jam visu izmantoto kodu un piepras\u0101m izmantot struktur\u0113t\u0101kus r\u012bkus t\u0101 redi\u0123\u0113\u0161anai. Par struktur\u0113tajiem r\u012bkiem es run\u0101\u0161u zem\u0101k: funkciju sl\u0113d\u017ei HTTP un notikumu apstr\u0101d\u0101t\u0101jiem, jaud\u012bga migr\u0101cijas platforma datu b\u0101z\u0113m un jauna versiju vad\u012bbas metode funkcij\u0101m un tipiem.<\/p>\n<p><\/p>\n<h3 id=\"pereklyuchateli-funkciy\">Funkciju sl\u0113d\u017ei<\/h3>\n<p><\/p>\n<p>Viens no veidiem <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">k\u0101 samazin\u0101t lieku sare\u017e\u0123\u012bt\u012bbu<\/a><\/noindex> Dark ir atrisin\u0101t vair\u0101kas probl\u0113mas ar vienu risin\u0101jumu. Funkciju sl\u0113d\u017ei veic daudz da\u017e\u0101du uzdevumu: viet\u0113j\u0101s izstr\u0101des vides aizvieto\u0161ana, git zari, koda izvieto\u0161ana un, protams, tradicion\u0101lais l\u0113nais un kontrol\u0113tais jauna koda izlai\u0161ana.<\/p>\n<p><\/p>\n<p>Funkciju sl\u0113d\u017ea izveide un izvieto\u0161ana tiek veikta m\u016bsu redaktor\u0101 vien\u0101 oper\u0101cij\u0101. Tas izveido tuk\u0161u telpu jaunajam kodam un nodro\u0161ina piek\u013cuves kontroli gan vecajam, gan jaunajam kodam, k\u0101 ar\u012b pogas un komandas pak\u0101peniskai p\u0101rejai uz jauno kodu vai t\u0101 izsl\u0113g\u0161anai.<\/p>\n<p><\/p>\n<p>Funkciju sl\u0113d\u017ei ir ieb\u016bv\u0113ti Dark valod\u0101, un pat neizpild\u012btie sl\u0113d\u017ei veic savu uzdevumu \u2014 ja nosac\u012bjums sl\u0113d\u017e\u0101 netiek izpild\u012bts, tiks izpild\u012bts vecais blo\u0137\u0113tais kods.<\/p>\n<p><\/p>\n<h3 id=\"sreda-razrabotki\">Izstr\u0101des vide<\/h3>\n<p><\/p>\n<p>Funkciju p\u0101rsl\u0113gi aizvieto viet\u0113jo izstr\u0101des vidi. \u0160odien komand\u0101m ir gr\u016bti sekot l\u012bdzi tam, lai visi izmantotu vien\u0101das instrumentu un bibliot\u0113ku versijas (koda format\u0113\u0161anas r\u012bki, linters, pakot\u0146u p\u0101rvaldnieki, kompilatori, priek\u0161procesori, test\u0113\u0161anas r\u012bki utt.). Ar Dark nav nepiecie\u0161ams lok\u0101li instal\u0113t atkar\u012bbas, p\u0101rvald\u012bt lok\u0101lo Docker instal\u0101ciju vai veikt citus pas\u0101kumus, lai nodro\u0161in\u0101tu vismaz k\u0101du l\u012bdz\u012bbu starp izstr\u0101des un ra\u017eo\u0161anas vidi. <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/honeycombs-charity-majors-go-ahead-test-in-production\/\">\u0145emot v\u0113r\u0101, ka \u0161\u0101da l\u012bdz\u012bba tom\u0113r nav iesp\u0113jama<\/a><\/noindex>, m\u0113s pat neizliksimies, ka tiecamies uz to.<\/p>\n<p><\/p>\n<p>T\u0101 viet\u0101, lai izveidotu klon\u0113tu viet\u0113ju vidi, Dark funkciju p\u0101rsl\u0113gi veido jaunu smil\u0161u kasti ra\u017eo\u0161an\u0101, kas aizvieto izstr\u0101des vidi. N\u0101kotn\u0113 pl\u0101nojam izveidot smil\u0161u kasti cit\u0101m lietojumprogrammas da\u013c\u0101m (piem\u0113ram, moment\u0101nos datub\u0101zu klonos), lai gan pagaid\u0101m tas neizskat\u0101s tik svar\u012bgi.<\/p>\n<p><\/p>\n<h3 id=\"vetki-i-razvertyvaniya\">Zaru un izvietojumu<\/h3>\n<p><\/p>\n<p>Pa\u0161laik ir vair\u0101ki veidi, k\u0101 ieviest jaunu kodu sist\u0113m\u0101s: git zarus, izvieto\u0161anas posmus un funkciju p\u0101rsl\u0113gus. Tie risina vienu probl\u0113mu da\u017e\u0101d\u0101s darba pl\u016bsmas da\u013c\u0101s: git \u2014 izvieto\u0161anas posmos, izvietojums \u2014 p\u0101rej\u0101 no vec\u0101 koda uz jauno, bet funkciju p\u0101rsl\u0113gi \u2014 kontrol\u0113t\u0101 jauna koda izlai\u0161anas br\u012bd\u012b.<\/p>\n<p><\/p>\n<p>Visefekt\u012bv\u0101kais veids ir funkciju p\u0101rsl\u0113gi (t\u0101pat k\u0101 visviegl\u0101k saprotamais un lietojamais). Ar tiem var piln\u012bb\u0101 atteikties no abiem atliku\u0161ajiem metod\u0113m. \u012apa\u0161i noder\u012bgi ir atteikties no izvieto\u0161anas \u2014 ja m\u0113s tom\u0113r izmantojam funkciju p\u0101rsl\u0113gus, lai iesp\u0113jo kodu, tad serveru p\u0101rejas uz jauno kodu solis tikai rada liekas riskus.<\/p>\n<p><\/p>\n<p>Git ir gr\u016bti lietot, \u012bpa\u0161i ies\u0101c\u0113jiem, un tas b\u016btiski ierobe\u017eo t\u0101 lieto\u0161anu, tom\u0113r tam ir \u0113rti zari. M\u0113s esam izlaboju\u0161i daudzas git nepiln\u012bbas. Dark tiek redi\u0123\u0113ts re\u0101laj\u0101 laik\u0101 un nodro\u0161ina sadarb\u012bbas iesp\u0113jas k\u0101 Google Dokumentiem, lai neb\u016btu j\u0101nos\u016bta kods un var\u0113tu ret\u0101k veikt rebaz\u0113\u0161anu un sapl\u016b\u0161anu.<\/p>\n<p><\/p>\n<p>Funkciju sl\u0113d\u017ei ir dro\u0161a izvieto\u0161anas pamats. Kop\u0101 ar t\u016bl\u012bt\u0113jiem izvietojumiem tie \u013cauj \u0101tri p\u0101rbaud\u012bt koncepcijas maz\u0101s da\u013c\u0101s ar zemu risku, nevis ieviest vienu lielu izmai\u0146u, kas var saboj\u0101t sist\u0113mu.<\/p>\n<p><\/p>\n<h3 id=\"versionirovanie\">Versiju kontrole<\/h3>\n<p><\/p>\n<p>Funkciju un tipu mai\u0146ai m\u0113s izmantojam versiju kontroli. Ja v\u0113laties main\u012bt funkciju, Dark izveido jaunu \u0161\u012bs funkcijas versiju. P\u0113c tam j\u016bs varat izsaukt \u0161o versiju, izmantojot sl\u0113dzi HTTP apstr\u0101d\u0101t\u0101j\u0101 vai notikumos. (Ja tas ir aicin\u0101jums dzi\u013ci izsaukumu grafik\u0101, pa ce\u013cam tiek izveidota jauna versija katrai funkcijai. Tas var likties p\u0101rsp\u012bl\u0113ti, bet funkcijas netrauc\u0113, ja j\u016bs t\u0101s neizmantojat, t\u0101p\u0113c j\u016bs to pat nepaman\u012bsiet.)<\/p>\n<p><\/p>\n<p>Tie\u0161i \u0161o pa\u0161u iemeslu d\u0113\u013c m\u0113s vers\u0113jam tipus. Par m\u016bsu tipu sist\u0113mu m\u0113s detaliz\u0113ti past\u0101st\u012bj\u0101m <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">iepriek\u0161\u0113j\u0101 ierakst\u0101<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Pateicoties funkciju un tipu versiju kontrolei, j\u016bs varat pak\u0101peniski veikt izmai\u0146as lietojumprogramm\u0101. Varat p\u0101rbaud\u012bt, ka katrs individu\u0101lais apstr\u0101d\u0101t\u0101js darbojas ar jauno versiju, neatkar\u012bgi no t\u0101, vai uzreiz veicat visas izmai\u0146as lietojumprogramm\u0101 (ta\u010du mums ir r\u012bki, lai to \u0101tri izdar\u012btu, ja v\u0113laties).<\/p>\n<p><\/p>\n<p>Tas ir daudz dro\u0161\u0101k nek\u0101 uzreiz izvietot visu kop\u0101, k\u0101 tas notiek tagad.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-paketov-i-standartnaya-biblioteka\">Jaunas pakot\u0146u versijas un standarta bibliot\u0113ka<\/h3>\n<p><\/p>\n<p>Kad j\u016bs atjaunin\u0101t pakotni Dark, m\u0113s uzreiz neaizvietojam katras funkcijas vai tipa izmanto\u0161anu vis\u0101 kodu b\u0101z\u0113. Tas nav dro\u0161i. Kods turpina izmantot to pa\u0161u versiju, k\u0101du tas izmantoja, un j\u016bs atjaunin\u0101t funkciju un tipu izmanto\u0161anu l\u012bdz jaunai versijai katr\u0101 atsevi\u0161\u0137\u0101 gad\u012bjum\u0101, izmantojot sl\u0113d\u017eus.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rh\/t3\/4w\/rht34wyibolrgracbz88tnqqhg0.png\"><img decoding=\"async\" alt=\"K\u0101 Dark izv\u0113r\u0161 kodu 50 ms.\" src=\"\/wp-content\/uploads\/2019\/08\/54fdb566b4bcbc10e06e51c47a3820f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Ekr\u0101nuz\u0146\u0113mums no da\u013cas automatiz\u0113t\u0101 procesa Dark, kas par\u0101da divas funkcijas Dict::get versijas. Dict::get_v0 atgrieza tipu Any (no kura m\u0113s atteiksimies), bet Dict::get_v1 atgrie\u017e tipu Option.<\/em><\/p>\n<p><\/p>\n<p>M\u0113s bie\u017ei sniedzam jaunas funkcijas standarta bibliot\u0113k\u0101 un izsl\u0113dzam vec\u0101s versijas. Lietot\u0101jiem ar vecaj\u0101m versij\u0101m kod\u0101 saglab\u0101s pieeju t\u0101m, bet jaunajiem lietot\u0101jiem t\u0101s vairs neb\u016bs pieejamas. M\u0113s pl\u0101nojam nodro\u0161in\u0101t r\u012bkus, lai p\u0101rceltu lietot\u0101jus no vecaj\u0101m versij\u0101m uz jaunaj\u0101m vien\u0101 sol\u012b, un atkal, izmantojot funkciju sl\u0113d\u017eus.<\/p>\n<p><\/p>\n<p>Dark ar\u012b sniedz unik\u0101lu iesp\u0113ju: t\u0101 k\u0101 m\u0113s izpild\u0101m j\u016bsu darba kodu, m\u0113s varam pa\u0161i test\u0113t jaun\u0101s versijas, sal\u012bdzinot rezult\u0101tus jaunajiem un vecajiem piepras\u012bjumiem, lai inform\u0113tu j\u016bs par izmai\u0146\u0101m. Rezult\u0101t\u0101 pakot\u0146u atjaunin\u0101\u0161ana, kas bie\u017ei tiek veikta akli (vai nepiecie\u0161ama r\u016bp\u012bga test\u0113\u0161ana dro\u0161\u012bbas nol\u016bkos), rada daudz maz\u0101k risku un var notikt autom\u0101tiski.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-dark\">Jaun\u0101s Dark versijas<\/h3>\n<p><\/p>\n<p>P\u0101reja no Python 2 uz Python 3 norit\u0113ja desmit gadus un joproj\u0101m ir aktu\u0101la probl\u0113ma. T\u0101 k\u0101 m\u0113s izstr\u0101d\u0101jam Dark nep\u0101rtrauktai pieg\u0101dei, \u0161\u012bs valodas izmai\u0146as ir j\u0101\u0146em v\u0113r\u0101.<\/p>\n<p><\/p>\n<p>Kad m\u0113s ievie\u0161am nelielas izmai\u0146as valod\u0101, m\u0113s izveidojam jaunu Dark versiju. Vecais kods paliek vecaj\u0101 Dark versij\u0101, bet jaunais kods tiek lietots jaunaj\u0101 versij\u0101. P\u0101rsl\u0113g\u0161anu uz jauno Dark versiju var veikt, izmantojot sl\u0113d\u017eus vai funkciju versijas.<\/p>\n<p><\/p>\n<p>Tas ir \u012bpa\u0161i noder\u012bgi, \u0146emot v\u0113r\u0101, ka Dark ir izveidots pavisam nesen. Daudzas valodas vai bibliot\u0113kas izmai\u0146as var b\u016bt neveiksm\u012bgas. Pak\u0101penisk\u0101 valodas versiju p\u0101rvald\u012bba \u013cauj mums veikt nelielus atjaunin\u0101jumus, t.i., m\u0113s varam nesteigties un atlikt daudzas valodas l\u0113mumu pie\u0146em\u0161anas, kam\u0113r mums nav vair\u0101k lietot\u0101ju, t\u0101tad ar\u012b vair\u0101k inform\u0101cijas.<\/p>\n<p><\/p>\n<h3 id=\"migracii-baz-dannyh\">Datu b\u0101zu migr\u0101cijas<\/h3>\n<p><\/p>\n<p>Dro\u0161ai datu b\u0101zu migr\u0101cijai past\u0101v <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brunton-spall.co.uk\/post\/2014\/05\/06\/database-migrations-done-right\/\">standarta formula<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ul>\n<li>P\u0101rrakst\u012bt kodu, lai atbalst\u012btu jaunos un vecos form\u0101tus<\/li>\n<li>P\u0101rveidot visus datus jaunaj\u0101 form\u0101t\u0101<\/li>\n<li>No\u0146emt veco piek\u013cuvi datiem<\/li>\n<\/ul>\n<p><\/p>\n<p>Rezult\u0101t\u0101 datu b\u0101zes migr\u0101cija tiek aizkav\u0113ta un prasa daudz resursus. Un mums uzkr\u0101jas novecoju\u0161as sh\u0113mas, jo pat vienk\u0101r\u0161as darb\u012bbas, piem\u0113ram, tabulas vai kolonnas nosaukuma labo\u0161ana, nav t\u0101 v\u0113rta.<\/p>\n<p><\/p>\n<p>Dark ir efekt\u012bva datu b\u0101zu migr\u0101cijas platforma, kas (m\u0113s ceram) tik \u013coti vienk\u0101r\u0161os procesu, ka j\u016bs p\u0101rst\u0101siet to baid\u012bties. Visi datu kr\u0101tuvju veidi Dark (atsl\u0113gas-v\u0113rt\u012bbas p\u0101ru glab\u0101tuves vai past\u0101v\u012bg\u0101s hash tabulas) ir defin\u0113ti. Lai p\u0101rvietotu datu kr\u0101tuvi, j\u016bs vienk\u0101r\u0161i pie\u0161\u0137irat tai jaunu tipa un atgrie\u0161anas funkciju, lai p\u0101rv\u0113rstu v\u0113rt\u012bbas starp diviem tipiem.<\/p>\n<p><\/p>\n<p>Piek\u013cuve datu kr\u0101tuvei Dark tiek nodro\u0161in\u0101ta caur versiju nosaukumiem. Piem\u0113ram, datu kr\u0101tuve Users s\u0101kotn\u0113ji tiks saukta par Users-v0. Kad tiek izveidota jauna versija ar citu tipu, nosaukums tiek main\u012bts uz Users-v1. Ja dati ir saglab\u0101ti, izmantojot Users-v0, bet j\u016bs piek\u013c\u016bstat tiem caur Users-v1, tiek pielietota atgrie\u0161anas funkcija. Ja dati ir saglab\u0101ti, izmantojot Users-v1, bet j\u016bs piek\u013c\u016bstat tiem caur Users-v0, tiek pielietota atgrie\u0161anas funkcija.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/ui\/sl\/wd\/uislwdrfrvact0d1ts5icnk-4ka.png\"><img decoding=\"async\" alt=\"K\u0101 Dark izv\u0113r\u0161 kodu 50 ms.\" src=\"\/wp-content\/uploads\/2019\/08\/35743ba246f327ca9e8b71f0069a3800.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Datu b\u0101zes migr\u0101cijas ekr\u0101ns ar vec\u0101s datu b\u0101zes lauku nosaukumiem, atgrie\u0161anas un atgrie\u0161anas izteiksm\u0113m un instrukcij\u0101m migr\u0101cijas iek\u013cau\u0161anai.<\/em><\/p>\n<p><\/p>\n<p>Izmantojiet funkciju sl\u0113d\u017eus, lai novirz\u012btu izsaukumus no Users-v0 uz versiju Users-v1. To var izdar\u012bt pa vienam HTTP apstr\u0101d\u0101t\u0101jam, lai samazin\u0101tu riskus, un sl\u0113d\u017ei darbojas atsevi\u0161\u0137iem lietot\u0101jiem, lai j\u016bs var\u0113tu p\u0101rbaud\u012bt, ka viss darbojas k\u0101 paredz\u0113ts. Kad iz\u017e\u016bs visus Users-v0 lietot\u0101jus, Dark fon\u0101 p\u0101rveidos visas atliku\u0161o datus no vec\u0101 form\u0101ta uz jauno. J\u016bs to pat neman\u012bsiet.<\/p>\n<p><\/p>\n<h3 id=\"testirovanie\">Test\u0113\u0161ana<\/h3>\n<p><\/p>\n<p>Dark ir <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">funkcion\u0101la programm\u0113\u0161anas valoda ar statisku tipiz\u0101ciju<\/a><\/noindex> un nemain\u012bgiem v\u0113rt\u012bb\u0101m, t\u0101p\u0113c t\u0101 test\u0113\u0161anas virsma ir iev\u0113rojami maz\u0101ka sal\u012bdzin\u0101jum\u0101 ar objektorient\u0113t\u0101m valod\u0101m ar dinamisku tipiz\u0101ciju. Bet test\u0113\u0161ana t\u0101pat ir nepiecie\u0161ama.<br \/>\nDark redaktors autom\u0101tiski veic modu\u013cu testus fon\u0101 redi\u0123\u0113jamajam kodam, un p\u0113c noklus\u0113juma \u0161ie testi tiek veikti visiem funkciju sl\u0113d\u017eiem. N\u0101kotn\u0113 m\u0113s v\u0113lamies izmantot statiskos tipus, lai autom\u0101tiski veiktu fuzzeru testus kod\u0101, lai atrastu k\u013c\u016bdas.<\/p>\n<p><\/p>\n<p>Turkl\u0101t Dark realiz\u0113 j\u016bsu infrastrukt\u016bru ra\u017eo\u0161an\u0101, kas atver jaunas iesp\u0113jas. M\u0113s autom\u0101tiski saglab\u0101jam HTTP piepras\u012bjumus Dark infrastrukt\u016br\u0101 (kam\u0113r m\u0113s saglab\u0101jam visus piepras\u012bjumus, bet v\u0113l\u0101k v\u0113lamies p\u0101riet uz izlasi). M\u0113s test\u0113jam jauno kodu p\u0113c tiem un veicam modu\u013cu testus, un, ja v\u0113laties, j\u016bs varat viegli p\u0101rv\u0113rst interesantus piepras\u012bjumus modu\u013cu testos.<\/p>\n<p><\/p>\n<h3 id=\"ot-chego-my-izbavilis\">No k\u0101 m\u0113s esam atbr\u012bvoju\u0161ies<\/h3>\n<p><\/p>\n<p>T\u0101 k\u0101 mums nav izsnieg\u0161anas, bet ir funkciju sl\u0113d\u017ei, aptuveni 60% izsnieg\u0161anas proces\u0101 paliek nov\u0101rt\u0101. Mums nav nepiecie\u0161ami git zari vai piepras\u012bjumi, servera resursu un konteineru b\u016bv\u0113\u0161ana, resursu un konteineru nos\u016bt\u012b\u0161ana re\u0123istriem vai izsnieg\u0161anas so\u013ci Kubernetes.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/gc\/9e\/g-\/gc9eg-szouq0dtrxxr8jd6c6dyo.jpeg\"><img decoding=\"async\" alt=\"K\u0101 Dark izv\u0113r\u0161 kodu 50 ms.\" src=\"\/wp-content\/uploads\/2019\/08\/d584b13a1f91e9eef1e2e40c25e90052.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Sal\u012bdzino\u0161s standarta nep\u0101rtraukt\u0101s pieg\u0101des l\u012bnijas att\u0113lojums (kreisaj\u0101 pus\u0113) un Dark nep\u0101rtraukt\u0101s pieg\u0101des (labaj\u0101 pus\u0113). Dark pieg\u0101de sast\u0101v no 6 so\u013ciem un viena cikla, savuk\u0101rt tradicion\u0101l\u0101 versija ietver 35 so\u013cus un 3 ciklus.<\/em><\/p>\n<p><\/p>\n<p>Dark izvieto\u0161an\u0101 ir tikai 6 so\u013ci un 1 cikls (so\u013ci, kas atk\u0101rtojas vair\u0101kas reizes), kam\u0113r m\u016bsdienu nep\u0101rtraukt\u0101s pieg\u0101des l\u012bnija sast\u0101v no 35 so\u013ciem un 3 cikliem. Dark testi tiek palaisti autom\u0101tiski, un j\u016bs to pat neiev\u0113rojat; atkar\u012bbas tiek instal\u0113tas autom\u0101tiski; viss, kas saist\u012bts ar git vai Github, vairs nav nepiecie\u0161ams; nav nepiecie\u0161ams sav\u0101kt, test\u0113t un nos\u016bt\u012bt Docker konteinerus; izvieto\u0161ana Kubernetes vairs nav nepiecie\u0161ama.<\/p>\n<p><\/p>\n<p>Pat paliku\u0161ie so\u013ci Dark ir k\u013cuvu\u0161i vienk\u0101r\u0161\u0101ki. Kad funkciju sl\u0113d\u017ei tiek p\u0101rvald\u012bti ar vienu darb\u012bbu, nav j\u0101dodas v\u0113lreiz cauri visai izvieto\u0161anas l\u012bnijai, lai izdz\u0113stu veco kodu.<\/p>\n<p><\/p>\n<p>M\u0113s cik vien iesp\u0113jams esam atvieglin\u0101ju\u0161i koda pieg\u0101di, samazinot laiku un riskus, kas saist\u012bti ar nep\u0101rtrauktu pieg\u0101di. M\u0113s ar\u012b iev\u0113rojami atvieglojam pakot\u0146u atjaunin\u0101\u0161anu, datu b\u0101zu migr\u0101ciju, test\u0113\u0161anu, versiju p\u0101rvald\u012bbu, atkar\u012bbu instal\u0113\u0161anu, vienot\u012bbu starp att\u012bst\u012bbas un ra\u017eo\u0161anas vidi, k\u0101 ar\u012b \u0101trus un dro\u0161us valodas versiju uzlabojumus.<\/p>\n<p><\/p>\n<p>Es atbildu uz jaut\u0101jumiem par to <noindex><a rel=\"nofollow\" href=\"https:\/\/news.ycombinator.com\/item?id=20394166\">HackerNews<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Lai uzzin\u0101tu vair\u0101k par Dark ier\u012bci, izlasiet <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">rakstu par Dark<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/darklang?source=post_page---------------------------\">sekojiet mums Twitter<\/a><\/noindex> (vai <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/paulbiggar?source=post_page---------------------------\">man<\/a><\/noindex>) vai <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/subscribe?source=post_page---------------------------\">pierakstieties uz beta versiju un sa\u0146emiet pazi\u0146ojumus par n\u0101kamajiem ierakstiem<\/a><\/noindex>. Ja dodaties uz StrangeLoop septembr\u012b, <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/launch\">n\u0101ciet pie mums uz palai\u0161anu<\/a><\/noindex>.<\/p>\n<p>Avots: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/462027\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0430\u0441 \u2014 \u043d\u0430\u0448\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u0442\u044c \u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043f\u0440\u043e\u0441\u0442\u043e\u044f\u043c \u0438 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430\u043c. \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0434\u0430\u0436\u0435 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27506,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36721","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a Dark \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u0437\u0430 50 \u043c\u0441 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:13:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:20+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47K\u0101 Dark izvieto kodu 50 ms laik\u0101 | ProHoster","description":"Jo \u0101tr\u0101k notiek izstr\u0101des process, jo \u0101tr\u0101k.","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a Dark \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u0437\u0430 50 \u043c\u0441 | ProHoster","og:description":"\u0427\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435.","og:url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:13:20+00:00","article:modified_time":"2019-10-31T19:13:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36721","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 04:34:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:40:22","updated":"2026-01-22 04:34:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/36721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=36721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/36721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media\/27506"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=36721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=36721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=36721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}