{"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\/sq\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","title":{"rendered":"Si e zhvillon Dark kodin brenda 50 ms","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Si e zhvillon Dark kodin brenda 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/c159a36eb52bf488f3a70ea511690366.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sa m\u00eb shpejt t\u00eb jet\u00eb procesi i zhvillimit, aq m\u00eb shpejt zhvillohet kompania teknologjike.<\/p>\n<p><\/p>\n<p>Fatkeq\u00ebsisht, aplikacionet moderne punojn\u00eb p\u00ebr t\u00eb na penguar \u2014 sistemet tona duhet t\u00eb p\u00ebrdit\u00ebsohen n\u00eb koh\u00eb reale dhe n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb t\u00eb mos ndihmojn\u00eb ask\u00ebnd dhe t\u00eb mos \u00e7ojn\u00eb n\u00eb pezullime dhe nd\u00ebrprerje. Zbatimi n\u00eb k\u00ebto sisteme b\u00ebhet nj\u00eb detyr\u00eb e komplikuar dhe k\u00ebrkon pipeline t\u00eb nd\u00ebrlikuara t\u00eb furnizimit t\u00eb vazhduesh\u00ebm, madje edhe n\u00eb ekipet e vogla.<\/p>\n<p><\/p>\n<p>K\u00ebto pipeline zakonisht kan\u00eb aplikime t\u00eb ngushta, punojn\u00eb ngadal\u00eb dhe nuk jan\u00eb t\u00eb besueshme. Zhvilluesit duhet s\u00eb pari t'i krijojn\u00eb ato manualisht, pastaj t'i menaxhojn\u00eb, dhe kompanit\u00eb shpesh angazhojn\u00eb ekipe t\u00eb t\u00ebra DevOps p\u00ebr k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<p>Shpejt\u00ebsia e k\u00ebtyre pipeline-ve p\u00ebrcakton shpejt\u00ebsin\u00eb e zhvillimit. N\u00eb ekipet m\u00eb t\u00eb mira, zbatimi zgjat 5\u201310 minuta, por zakonisht gjith\u00e7ka b\u00ebhet shum\u00eb m\u00eb gjat\u00eb, dhe p\u00ebr nj\u00eb zbatim jan\u00eb t\u00eb nevojshme disa or\u00eb.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>N\u00eb Dark, kjo zgjat 50 ms. <em>Pes\u00ebdhjet\u00eb. Milisekonda<\/em>. Dark \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">\u00ebsht\u00eb nj\u00eb zgjidhje e plot\u00eb me nj\u00eb gjuh\u00eb programimi, nj\u00eb redaktues dhe infrastruktur\u00eb.<\/a><\/noindex>, e krijuar ve\u00e7an\u00ebrisht p\u00ebr d\u00ebrgesa t\u00eb vazhdueshme, dhe t\u00eb gjitha aspektet e Dark, p\u00ebrfshir\u00eb gjuh\u00ebn vet\u00eb, jan\u00eb nd\u00ebrtuar me shikim p\u00ebr nj\u00eb vendosje t\u00eb sigurt dhe t\u00eb menj\u00ebhershme.<\/p>\n<p><\/p>\n<h3 id=\"pochemu-konveyery-nepreryvnoy-postavki-takie-medlennye\">Pse jan\u00eb ngadal\u00eb linjat e d\u00ebrges\u00ebs s\u00eb vazhdueshme?<\/h3>\n<p><\/p>\n<p>Supozoni se kemi nj\u00eb aplikacion web Python dhe tashm\u00eb kemi krijuar nj\u00eb proces t\u00eb mahnitsh\u00ebm dhe modern t\u00eb d\u00ebrges\u00ebs s\u00eb vazhdueshme. P\u00ebr nj\u00eb zhvillues q\u00eb \u00ebsht\u00eb i angazhuar \u00e7do dit\u00eb me k\u00ebt\u00eb projekt, vendosja e nj\u00eb ndryshimi t\u00eb vog\u00ebl do t\u00eb dukej k\u00ebshtu:<\/p>\n<p><\/p>\n<h3 id=\"vnesenie-izmeneniy\">B\u00ebrja e ndryshimeve<\/h3>\n<p><\/p>\n<ul>\n<li>Krijimi i nj\u00eb dege t\u00eb re n\u00eb git<\/li>\n<li>B\u00ebrja e ndryshimeve pas kalimit t\u00eb funksionit<\/li>\n<li>Testimi modular p\u00ebr t\u00eb verifikuar ndryshimet me dhe pa kalim t\u00eb funksionit<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pul-rekvest\">K\u00ebrkesa p\u00ebr bashkimin<\/h3>\n<p><\/p>\n<ul>\n<li>Angazhimi i ndryshimeve<\/li>\n<li>D\u00ebrgimi i ndryshimeve n\u00eb depo t\u00eb larg\u00ebt n\u00eb github<\/li>\n<li>K\u00ebrkesa p\u00ebr bashkimin<\/li>\n<li>Nd\u00ebrtimi i CI b\u00ebhet automatikisht n\u00eb sfond<\/li>\n<li>Rishikimi i kodit<\/li>\n<li>Disa rishikime t\u00eb tjera, n\u00ebse \u00ebsht\u00eb e nevojshme<\/li>\n<li>Bashkimi i ndryshimeve me masterin git.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"ci-vypolnyaetsya-na-mastere\">CI kryhet n\u00eb master<\/h3>\n<p><\/p>\n<ul>\n<li>Instalimi i var\u00ebsive frontend p\u00ebrmes npm<\/li>\n<li>Nd\u00ebrtimi dhe optimizimi i burimeve HTML+CSS+JS<\/li>\n<li>P\u00ebrvedhja e testeve modulare dhe funksionale n\u00eb frontend<\/li>\n<li>Instalimi i var\u00ebsive Python nga PyPI<\/li>\n<li>P\u00ebrvedhja e testeve modulare dhe funksionale n\u00eb backend<\/li>\n<li>Testimi i integrimit n\u00eb t\u00eb dy an\u00ebt<\/li>\n<li>D\u00ebrgimi i burimeve t\u00eb frontend n\u00eb CDN<\/li>\n<li>Nd\u00ebrtimi i kontejnerit p\u00ebr programin Python<\/li>\n<li>D\u00ebrgimi i kontejnerit n\u00eb regjistrin<\/li>\n<li>P\u00ebrdit\u00ebsimi i manifestit Kubernetes<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"zamena-starogo-koda-novym\">Z\u00ebvend\u00ebsimi i kodit t\u00eb vjet\u00ebr me t\u00eb riun<\/h3>\n<p><\/p>\n<ul>\n<li>Kubernetes nget disa instanca t\u00eb kontejnerit t\u00eb ri<\/li>\n<li>Kubernetes pret q\u00eb instancat t\u00eb b\u00ebhen funksionale<\/li>\n<li>Kubernetes shton instancat n\u00eb balancuesin e ngarkes\u00ebs HTTP<\/li>\n<li>Kubernetes pret q\u00eb instancat e vjetra t\u00eb mos p\u00ebrdoren m\u00eb<\/li>\n<li>Kubernetes ndalon instancat e vjetra<\/li>\n<li>Kubernetes p\u00ebrs\u00ebrit k\u00ebto operacione derisa instancat e reja t\u00eb z\u00ebvend\u00ebsojn\u00eb t\u00eb gjitha t\u00eb vjetrat<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"vklyuchenie-novogo-pereklyuchatelya-funkcii\">Aktivizimi i kalimtarit t\u00eb ri t\u00eb funksionit<\/h3>\n<p><\/p>\n<ul>\n<li>Kodi i ri aktivizohet vet\u00ebm p\u00ebr veten, p\u00ebr t\u00eb siguruar q\u00eb gjith\u00e7ka \u00ebsht\u00eb n\u00eb rregull<\/li>\n<li>Kodi i ri aktivizohet p\u00ebr 10% t\u00eb p\u00ebrdoruesve, maten metrike operacionale dhe t\u00eb biznesit<\/li>\n<li>Kodi i ri aktivizohet p\u00ebr 50% t\u00eb p\u00ebrdoruesve, maten metrike operacionale dhe t\u00eb biznesit<\/li>\n<li>Kodi i ri aktivizohet p\u00ebr 100% t\u00eb p\u00ebrdoruesve, maten metrike operacionale dhe t\u00eb biznesit<\/li>\n<li>M\u00eb n\u00eb fund, p\u00ebrs\u00ebrisni t\u00eb gjith\u00eb procedur\u00ebn p\u00ebr t\u00eb hequr kodin e vjet\u00ebr dhe kalimtarin<\/li>\n<\/ul>\n<p><\/p>\n<p>Procesi varet nga mjetet, gjuha dhe p\u00ebrdorimi i arkitekturave t\u00eb orientuara nga sh\u00ebrbimet, por n\u00eb m\u00ebnyr\u00eb t\u00eb p\u00ebrgjithshme duket k\u00ebshtu. Nuk e p\u00ebrmenda implementimin me migrimin e bazave t\u00eb t\u00eb dh\u00ebnave, sepse kjo k\u00ebrkon planifikim t\u00eb kujdessh\u00ebm, por m\u00eb posht\u00eb do t\u00eb flas si e menaxhon k\u00ebt\u00eb Dark.<\/p>\n<p><\/p>\n<p>Ka shum\u00eb komponent\u00eb k\u00ebtu, dhe shum\u00eb prej tyre mund t\u00eb ngadal\u00ebsojn\u00eb, d\u00ebshtojn\u00eb, shkaktojn\u00eb konkurenc\u00eb p\u00ebrkohshme ose t\u00eb arrijn\u00eb sistemin operativ n\u00eb kolaps.<\/p>\n<p><\/p>\n<p>Dhe p\u00ebr shkak se k\u00ebto pipeline pothuajse gjithmon\u00eb krijohen p\u00ebr raste t\u00eb ve\u00e7anta, \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb baza mbi to. Ka dit\u00eb kur nuk mund t\u00eb implementosh kodin sepse n\u00eb Dockerfile ka probleme, ka pasur nj\u00eb d\u00ebshtim n\u00eb nj\u00eb nga dhjet\u00ebra sh\u00ebrbimet apo specialisti i nevojsh\u00ebm \u00ebsht\u00eb n\u00eb pushim.<\/p>\n<p><\/p>\n<p>M\u00eb keq akoma, shum\u00eb nga k\u00ebto hapa nuk b\u00ebjn\u00eb asgj\u00eb t\u00eb dobishme. Ata ishin t\u00eb nevojsh\u00ebm m\u00eb par\u00eb, kur implementonim kodin menj\u00ebher\u00eb p\u00ebr p\u00ebrdoruesit, por tani kemi t\u00eb nd\u00ebrprera p\u00ebr kodin e ri, dhe k\u00ebto procese jan\u00eb ndar\u00eb. Si pasoj\u00eb, hapi kur implementohet kodi (i vjet\u00ebr z\u00ebvend\u00ebsohet me t\u00eb riun) tani \u00ebsht\u00eb b\u00ebr\u00eb thjesht nj\u00eb rrezik i panevojsh\u00ebm.<\/p>\n<p><\/p>\n<p>Sigurisht, kjo \u00ebsht\u00eb nj\u00eb pipeline shum\u00eb e menduar. Ekipa q\u00eb e krijoi at\u00eb, nuk kurseu koh\u00eb dhe para p\u00ebr ta \u00e7uar at\u00eb n\u00eb veprim sa m\u00eb shpejt. N\u00eb p\u00ebrgjith\u00ebsi, pipeline-t e zhvillimit jan\u00eb shum\u00eb m\u00eb t\u00eb ngadalta dhe m\u00eb pak t\u00eb besueshme.<\/p>\n<p><\/p>\n<h3 id=\"realizaciya-nepreryvnoy-postavki-v-dark\">Implementimi i dor\u00ebzimit t\u00eb vazhduesh\u00ebm n\u00eb Dark<\/h3>\n<p><\/p>\n<p>Dor\u00ebzimi i vazhduesh\u00ebm \u00ebsht\u00eb kaq i r\u00ebnd\u00ebsish\u00ebm p\u00ebr Dark, sa q\u00eb q\u00eb n\u00eb fillim vendos\u00ebm t\u00eb arrijm\u00eb nj\u00eb koh\u00eb m\u00eb t\u00eb shkurt\u00ebr se nj\u00eb sekond\u00eb. Ne shqyrtuam t\u00eb gjitha hapat e pipeline-it p\u00ebr t\u00eb hequr \u00e7do t\u00eb tep\u00ebrt dhe i arrit\u00ebm t\u00eb tjer\u00ebt deri n\u00eb perfekcion. K\u00ebtu \u00ebsht\u00eb se si i hoq\u00ebm hapat.<\/p>\n<p><\/p>\n<blockquote><p>Jessie Frazelle (<noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex>) shpiku fjal\u00ebn e re deployless (pa nevoj\u00eb p\u00ebr zhvillim) n\u00eb konferenc\u00ebn Future of Software Development n\u00eb Reikjavik<\/p><\/blockquote>\n<p>Ne menj\u00ebher\u00eb vendos\u00ebm q\u00eb Dark do t\u00eb bazohej n\u00eb konceptin \u00abdeployless\u00bb (faleminderit <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/jessfraz\">Jessie Frazelle<\/a><\/noindex> p\u00ebr neologjizmin). Deployless do t\u00eb thot\u00eb q\u00eb \u00e7do kod \u00ebsht\u00eb menj\u00ebher\u00eb i vendosur dhe i gatsh\u00ebm p\u00ebr t'u p\u00ebrdorur n\u00eb prodhim. Sigurisht, ne nuk do t\u00eb kalojm\u00eb kodin e prishur ose t\u00eb pap\u00ebrfunduar (principet e siguris\u00eb do i p\u00ebrshkruaj m\u00eb posht\u00eb).<\/p>\n<p><\/p>\n<p>Gjat\u00eb demonstrimit t\u00eb Dark, shpesh na pyesnin se si arrit\u00ebm t\u00eb shpejtonim kaq shum\u00eb vendosjen. \u00cbsht\u00eb nj\u00eb pyetje e \u00e7uditshme. Njer\u00ebzit mendojn\u00eb ndoshta se ne kemi shpikur ndonj\u00eb superteknologji q\u00eb krahasohet me kodin, e kompilon at\u00eb, e paket\u00ebson n\u00eb nj\u00eb kontejner, aktivizon nj\u00eb makin\u00eb virtuale, dhe nis kontejnerin n\u00eb m\u00ebnyr\u00eb t\u00eb ftoht\u00eb \u2014 dhe gjith\u00eb kjo brenda 50 ms. E pamundur, ndoshta. Por ne krijuam nj\u00eb motor t\u00eb posa\u00e7\u00ebm vendosjeje q\u00eb nuk ka nevoj\u00eb p\u00ebr gjith\u00e7ka k\u00ebt\u00eb.<\/p>\n<p><\/p>\n<p>Dark aktivizon interpretuesit n\u00eb cloud. Supozoni se shkruani kod n\u00eb nj\u00eb funksion ose trajtes\u00eb HTTP ose ngjarjesh. Ne d\u00ebrgojm\u00eb diferenc\u00ebn n\u00eb pem\u00ebn sintaksore abstracte (implementimi i kodit q\u00eb e p\u00ebrdor redaktori yn\u00eb dhe server\u00ebt) n\u00eb server\u00ebt tan\u00eb, dhe pastaj e aktivizojm\u00eb k\u00ebt\u00eb kod kur merrni k\u00ebrkesa. K\u00ebshtu vendosja duket thjesht si nj\u00eb regjistrim modest n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave \u2014 momentale dhe elementare. Vendosja ndodh kaq shpejt, sepse p\u00ebrfshin t\u00eb pakt\u00ebn t\u00eb domosdoshme.<\/p>\n<p><\/p>\n<p>N\u00eb t\u00eb ardhmen, ne planifikojm\u00eb t\u00eb b\u00ebjm\u00eb Dark nj\u00eb kompilator infrastrukture, i cili do t\u00eb krijoj\u00eb dhe ekzekutoj\u00eb infrastruktura ideale p\u00ebr performanc\u00eb dhe besueshm\u00ebri t\u00eb lart\u00eb t\u00eb aplikacioneve. Menj\u00ebher\u00eb shp\u00ebrndarja, sigurisht, nuk do t\u00eb zhduket.<\/p>\n<p><\/p>\n<h2 id=\"bezopasnoe-razvertyvanie\">Shp\u00ebrndarje e sigurt<\/h2>\n<p><\/p>\n<h3 id=\"strukturirovannyy-redaktor\">Redaktori i strukturuar<\/h3>\n<p><\/p>\n<p>Kodi n\u00eb Dark shkruhet n\u00eb redaktorin Dark. Redaktori i strukturuar nuk lejon gabime sintaksore. N\u00eb thelb, n\u00eb Dark nuk ka as nj\u00eb analizues. Nd\u00ebrsa ju shkruani tekstin, ne punojm\u00eb drejtp\u00ebrdrejt me pem\u00ebn abstrakte sintaksore (AST), si <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> dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jetbrains.com\/mps\/\">MPS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>\u00c7do kod i pap\u00ebrfunduar n\u00eb Dark ka semantik\u00eb t\u00eb lejuar ekzekutimi, p\u00ebr t\u00eb nj\u00ebjt\u00ebn m\u00ebnyr\u00eb si <noindex><a rel=\"nofollow\" href=\"https:\/\/hazel.org\/\">holes t\u00eb tipizuara n\u00eb Hazel<\/a><\/noindex>. P\u00ebr shembull, n\u00ebse ju ndryshoni thirrjen e nj\u00eb funksioni, ne ruajm\u00eb funksionin e vjet\u00ebr derisa i ri t\u00eb b\u00ebhet i p\u00ebrshtatsh\u00ebm.<\/p>\n<p><\/p>\n<p>\u00c7do program n\u00eb Dark ka kuptimin e tij, prandaj kodi i pap\u00ebrfunduar nuk e pengon t\u00eb p\u00ebrfunduarin t\u00eb funksionoj\u00eb.<\/p>\n<p><\/p>\n<h3 id=\"rezhimy-redaktirovaniya\">Re\u017eime redaktimi<\/h3>\n<p><\/p>\n<p>Ju vendosni kodin n\u00eb Dark n\u00eb dy raste. E para: po shkruani nj\u00eb kod t\u00eb ri dhe jeni p\u00ebrdoruesi i vet\u00ebm. P\u00ebr shembull, ndodhet n\u00eb REPL dhe p\u00ebrdoruesit e tjer\u00eb kurr\u00eb nuk do t\u00eb ken\u00eb qasje n\u00eb t\u00eb, ose \u00ebsht\u00eb nj\u00eb rrug\u00eb e re HTTP p\u00ebr t\u00eb cil\u00ebn nuk b\u00ebni referenc\u00eb askund. N\u00eb k\u00ebt\u00eb rast, mund t\u00eb punoni pa ndonj\u00eb mas\u00eb t\u00eb kujdesit, dhe tani jeni duke punuar n\u00eb ambientin e zhvillimit.<\/p>\n<p><\/p>\n<p>Situata e dyt\u00eb: kodi tashm\u00eb \u00ebsht\u00eb n\u00eb p\u00ebrdorim. N\u00ebse p\u00ebrmes kodit kalon trafik (funksione, menaxher\u00eb ngjarjesh, baza t\u00eb dh\u00ebnash, etj.), duhet t\u00eb jeni t\u00eb kujdessh\u00ebm. P\u00ebr k\u00ebt\u00eb, bllokojm\u00eb gjith\u00eb kodin n\u00eb p\u00ebrdorim dhe k\u00ebrkojm\u00eb t\u00eb p\u00ebrdoren mjete m\u00eb strukturore p\u00ebr redaktimin e tij. N\u00eb lidhje me mjetet strukturore do t\u00eb flas m\u00eb posht\u00eb: kaluesit e funksioneve p\u00ebr menaxher\u00ebt HTTP dhe ngjarjeve, nj\u00eb platform\u00eb e fuqishme migrimi p\u00ebr bazat e t\u00eb dh\u00ebnave dhe nj\u00eb metod\u00eb e re p\u00ebr menaxhimin e versioneve p\u00ebr funksione dhe lloje.<\/p>\n<p><\/p>\n<h3 id=\"pereklyuchateli-funkciy\">Kaluesit e funksioneve<\/h3>\n<p><\/p>\n<p>Nj\u00eb nga m\u00ebnyrat <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">p\u00ebr t\u00eb eliminuar kompleksitetin e tep\u00ebrt<\/a><\/noindex> N\u00eb Dark \u2014 zgjidhni disa probleme me nj\u00eb zgjidhje. Nd\u00ebrruesit e funksioneve kryejn\u00eb shum\u00eb detyra t\u00eb ndryshme: z\u00ebvend\u00ebsimi i ambientit vendas t\u00eb zhvillimit, deg\u00ebt git, shp\u00ebrndarja e kodit dhe, sigurisht, l\u00ebshimi tradicional i ngadalt\u00eb dhe t\u00eb kontrolluar t\u00eb kodit t\u00eb ri.<\/p>\n<p><\/p>\n<p>Krijimi dhe shp\u00ebrndarja e nd\u00ebrruesit t\u00eb funksionit b\u00ebhet n\u00eb redaktorin ton\u00eb me nj\u00eb operacion. Ai krijon nj\u00eb hap\u00ebsir\u00eb t\u00eb bardh\u00eb p\u00ebr kodin e ri dhe ofron elemente kontrolli p\u00ebr kodin e vjet\u00ebr dhe t\u00eb ri, si edhe butona dhe komanda p\u00ebr kalimin gradual n\u00eb kodin e ri ose p\u00ebr ta p\u00ebrjashtuar at\u00eb.<\/p>\n<p><\/p>\n<p>Nd\u00ebrruesit e funksioneve jan\u00eb t\u00eb integruar n\u00eb gjuh\u00ebn Dark, dhe madje edhe nd\u00ebrruesit n\u00eb progres kryejn\u00eb detyr\u00ebn e tyre \u2014 n\u00ebse kushti n\u00eb nd\u00ebrrues nuk p\u00ebrmbushet, do t\u00eb ekzekutohet kodi i vjet\u00ebr i bllokuar.<\/p>\n<p><\/p>\n<h3 id=\"sreda-razrabotki\">Mjedisi i zhvillimit<\/h3>\n<p><\/p>\n<p>Kalot e funksioneve z\u00ebvend\u00ebsojn\u00eb ambientin lokal t\u00eb zhvillimit. Sot, ekipet kan\u00eb t\u00eb v\u00ebshtir\u00eb t\u00eb sigurojn\u00eb q\u00eb t\u00eb gjith\u00eb t\u00eb p\u00ebrdorin versione t\u00eb nj\u00ebjta t\u00eb mjeteve dhe bibliotekave (mjetet e formatimit t\u00eb kodit, linters, menaxher\u00ebt e pacak\u00ebve, kompajler\u00ebt, preprocessors, mjetet e testimit, etj.) Me Dark, nuk \u00ebsht\u00eb nevoja t\u00eb instaloni var\u00ebsi lokalisht, t\u00eb menaxhoni instalimin lokal t\u00eb Docker-it, ose t\u00eb merrni masa t\u00eb tjera p\u00ebr t\u00eb siguruar ndonj\u00eb barazi midis ambientit t\u00eb zhvillimit dhe prodhimit. <noindex><a rel=\"nofollow\" href=\"https:\/\/thenewstack.io\/honeycombs-charity-majors-go-ahead-test-in-production\/\">Duke pasur parasysh se nj\u00eb barazi e till\u00eb gjithsesi \u00ebsht\u00eb e pamundur<\/a><\/noindex>, ne as q\u00eb do t\u00eb b\u00ebhemi pretendues se po p\u00ebrpiqemi p\u00ebr t\u00eb.<\/p>\n<p><\/p>\n<p>N\u00eb vend q\u00eb t\u00eb krijoni nj\u00eb ambient lokal t\u00eb klonuar, kalot n\u00eb Dark krijojn\u00eb nj\u00eb sand\u00ebkut t\u00eb ri n\u00eb prodhim q\u00eb z\u00ebvend\u00ebson ambientin e zhvillimit. N\u00eb t\u00eb ardhmen, ne gjithashtu planifikojm\u00eb t\u00eb krijojm\u00eb sand\u00ebku p\u00ebr pjes\u00eb t\u00eb tjera t\u00eb aplikacionit (p.sh., klonet momentale t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave), megjithat\u00eb, p\u00ebr momentin, kjo nuk duket aq e r\u00ebnd\u00ebsishme.<\/p>\n<p><\/p>\n<h3 id=\"vetki-i-razvertyvaniya\">Deg\u00ebt dhe shp\u00ebrndarjet<\/h3>\n<p><\/p>\n<p>Aktualisht ka disa m\u00ebnyra p\u00ebr t\u00eb futur nj\u00eb kod t\u00eb ri n\u00eb sistemet: deg\u00ebt git, faza e implementimit dhe kaluesit e funksioneve. Ato zgjidhin nj\u00eb problem n\u00eb pjes\u00eb t\u00eb ndryshme t\u00eb procesit t\u00eb pun\u00ebs: git \u2014 n\u00eb fazat para implementimit, implementimi \u2014 n\u00eb momentin e kalimit nga kodi i vjet\u00ebr n\u00eb at\u00eb t\u00eb ri, dhe kaluesit e funksioneve \u2014 p\u00ebr nj\u00eb l\u00ebshim t\u00eb kontrolluar t\u00eb kodit t\u00eb ri.<\/p>\n<p><\/p>\n<p>M\u00ebnyra m\u00eb efikase \u2014 jan\u00eb kaluesit e funksioneve (n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb, m\u00eb t\u00eb thjesht\u00eb p\u00ebr t'u kuptuar dhe p\u00ebrdorur). Me ta, mund t\u00eb heqim plot\u00ebsisht dy metodat e tjera. E ve\u00e7anta \u00ebsht\u00eb se heqja e implementimit \u00ebsht\u00eb shum\u00eb e dobishme \u2014 n\u00ebse ne p\u00ebrdorim gjithsesi kaluesit e funksioneve p\u00ebr t\u00eb aktivizuar kodin, at\u00ebher\u00eb hapi i kalimit t\u00eb server\u00ebve n\u00eb kodin e ri krijon thjesht rreziqe t\u00eb panevojshme.<\/p>\n<p><\/p>\n<p>Git \u00ebsht\u00eb i v\u00ebshtir\u00eb p\u00ebr t'u p\u00ebrdorur, ve\u00e7an\u00ebrisht p\u00ebr ata q\u00eb jan\u00eb t\u00eb rinj, dhe kjo e kufizon shum\u00eb, por ka deg\u00eb t\u00eb p\u00ebrshtatshme. Ne kemi zbutur shum\u00eb prej disavantazheve t\u00eb git. Dark redaktohet n\u00eb koh\u00eb reale dhe ofron mund\u00ebsin\u00eb e bashk\u00ebpunimit n\u00eb stilin e Google Docs, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb mos jet\u00eb e nevojshme t\u00eb d\u00ebrgosh kod dhe t\u00eb mund t\u00eb b\u00ebsh m\u00eb pak rebazime dhe bashkime.<\/p>\n<p><\/p>\n<p>Ndryshimet e funksioneve jan\u00eb baz\u00eb e nj\u00eb implementimi t\u00eb sigurt. N\u00eb kombinim me implementimet e menj\u00ebhershme, ato lejojn\u00eb testimin e shpejt\u00eb t\u00eb koncepteve n\u00eb segmente t\u00eb vogla me rrezik t\u00eb ul\u00ebt, p\u00ebrve\u00e7se t\u00eb aplikoni nj\u00eb ndryshim t\u00eb madh q\u00eb mund t\u00eb rr\u00ebzoj\u00eb sistemin.<\/p>\n<p><\/p>\n<h3 id=\"versionirovanie\">Versionimi<\/h3>\n<p><\/p>\n<p>P\u00ebr ndryshimin e funksioneve dhe llojeve, p\u00ebrdorim versionimin. N\u00ebse d\u00ebshiron t\u00eb ndryshosh nj\u00eb funksion, Dark krijon nj\u00eb version t\u00eb ri t\u00eb k\u00ebtij funksioni. Pastaj mund ta th\u00ebrras\u00ebsh k\u00ebt\u00eb version me an\u00eb t\u00eb nj\u00eb nd\u00ebrruesi n\u00eb menaxherin HTTP ose ngjarjeve. (N\u00ebse ky \u00ebsht\u00eb nj\u00eb funksion i thell\u00eb n\u00eb grafikun e thirrjeve, nj\u00eb version i ri krijohet p\u00ebr secilin funksion n\u00eb rrug\u00ebn. Mund t\u00eb duket se \u00ebsht\u00eb shum\u00eb, por funksionet nuk prishen n\u00ebse nuk i p\u00ebrdor, k\u00ebshtu q\u00eb nuk do ta v\u00ebsh re fare.)<\/p>\n<p><\/p>\n<p>P\u00ebr k\u00ebto arsye, ne gjithashtu versionojm\u00eb llojet. Kemi folur holl\u00ebsisht p\u00ebr sistemin ton\u00eb t\u00eb llojeve <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">n\u00eb postimin e kaluar<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Me fal\u00ebnderon versionimi i funksioneve dhe tipeve, mund t\u00eb b\u00ebni ndryshime n\u00eb aplikacion gradualisht. Mund t\u00eb kontrolloni q\u00eb \u00e7do menaxher i ve\u00e7ant\u00eb punon me versionin e ri, nuk \u00ebsht\u00eb e nevojshme t\u00eb b\u00ebni t\u00eb gjitha ndryshimet n\u00eb aplikacionet nj\u00ebher\u00ebsh (por ne kemi mjete p\u00ebr ta b\u00ebr\u00eb k\u00ebt\u00eb shpejt n\u00ebse d\u00ebshironi).<\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb shum\u00eb m\u00eb e sigurt se sa t\u00eb krijosh nj\u00eb implementim t\u00eb plot\u00eb menj\u00ebher\u00eb, si\u00e7 ndodh tani.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-paketov-i-standartnaya-biblioteka\">Versionet e reja t\u00eb paketave dhe biblioteka standarde<\/h3>\n<p><\/p>\n<p>Kur p\u00ebrdit\u00ebsoni nj\u00eb paket\u00eb n\u00eb Dark, ne nuk z\u00ebvend\u00ebsojm\u00eb menj\u00ebher\u00eb p\u00ebrdorimin e \u00e7do funksioni ose tipi n\u00eb t\u00ebr\u00eb baz\u00ebn e kodit. Kjo nuk \u00ebsht\u00eb e sigurt. Kodi vazhdon t\u00eb p\u00ebrdor\u00eb versionin e nj\u00ebjt\u00eb q\u00eb ka p\u00ebrdorur, nd\u00ebrsa ju p\u00ebrdit\u00ebsoni p\u00ebrdorimin e funksioneve dhe tipeve n\u00eb versionin e ri p\u00ebr \u00e7do rast t\u00eb ve\u00e7ant\u00eb me ndihm\u00ebn e nd\u00ebrfuturve.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rh\/t3\/4w\/rht34wyibolrgracbz88tnqqhg0.png\"><img decoding=\"async\" alt=\"Si e zhvillon Dark kodin brenda 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/54fdb566b4bcbc10e06e51c47a3820f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Screenshot i nj\u00eb pjese t\u00eb procesit automatik n\u00eb Dark, q\u00eb tregon dy versione t\u00eb funksionit Dict::get. Dict::get_v0 ktheu tipin Any (nga i cili po heqim dor\u00eb), nd\u00ebrsa Dict::get_v1 kthen tipin Option.<\/em><\/p>\n<p><\/p>\n<p>Ne ofrojm\u00eb shpesh nj\u00eb funksion t\u00eb ri n\u00eb bibliotek\u00ebn standarde dhe p\u00ebrjashtojm\u00eb versionet e vjetra. P\u00ebrdoruesit me versione t\u00eb vjetra do t\u00eb mbajn\u00eb akses n\u00eb to, por p\u00ebrdoruesit e rinj nuk do t\u00eb jen\u00eb n\u00eb gjendje t'i p\u00ebrdorin. Ne jemi duke planifikuar t\u00eb ofrojm\u00eb mjete p\u00ebr t\u00eb kaluar p\u00ebrdoruesit nga versionet e vjetra n\u00eb ato t\u00eb reja me nj\u00eb hap, dhe p\u00ebrs\u00ebri me ndihm\u00ebn e kaluesve t\u00eb funksioneve.<\/p>\n<p><\/p>\n<p>Dark gjithashtu ofron mund\u00ebsi unike: pasi ne ekzekutojm\u00eb kodin tuaj t\u00eb pun\u00ebs, ne mund t\u00eb testojm\u00eb vet\u00eb versionet e reja, duke krahasuar daljet p\u00ebr k\u00ebrkesat e reja dhe ato t\u00eb vjetra, p\u00ebr t'ju informuar mbi ndryshimet. Si rezultat, p\u00ebrdit\u00ebsimi i pakove, i cili shpesh b\u00ebhet n\u00eb er\u00eb (ose k\u00ebrkon testim t\u00eb kujdessh\u00ebm p\u00ebr arsye sigurie), paraqet shum\u00eb m\u00eb pak rreziqe dhe mund t\u00eb ndodhi automatikisht.<\/p>\n<p><\/p>\n<h3 id=\"novye-versii-dark\">Versionet e reja t\u00eb Dark<\/h3>\n<p><\/p>\n<p>Kalimi nga Python 2 n\u00eb Python 3 zgjati nj\u00eb dekad\u00eb dhe ende mbetet nj\u00eb problem. Duke qen\u00eb se ne po krijojm\u00eb Dark p\u00ebr shp\u00ebrndarje t\u00eb vazhdueshme, duhet t\u00eb kemi parasysh k\u00ebto ndryshime t\u00eb gjuh\u00ebs.<\/p>\n<p><\/p>\n<p>Kur b\u00ebjm\u00eb ndryshime t\u00eb vogla n\u00eb gjuh\u00eb, krijojm\u00eb nj\u00eb Version t\u00eb ri t\u00eb Dark. Kodi i vjet\u00ebr mbetet n\u00eb versionin e vjet\u00ebr t\u00eb Dark, nd\u00ebrsa kodi i ri p\u00ebrdoret n\u00eb versionin e ri. P\u00ebrdorimi i kaluesve ose versioneve t\u00eb funksioneve mund t\u00eb na ndihmoj\u00eb p\u00ebr kalimin n\u00eb versionin e ri t\u00eb Dark.<\/p>\n<p><\/p>\n<p>Kjo \u00ebsht\u00eb ve\u00e7an\u00ebrisht e dobishme, duke pasur parasysh se Dark ka dal\u00eb relativisht koh\u00ebt e fundit. Shum\u00eb ndryshime n\u00eb gjuh\u00eb ose bibliotek\u00eb mund t\u00eb jen\u00eb t\u00eb d\u00ebshtuara. Versionimi gradual i gjuh\u00ebs na lejon t\u00eb b\u00ebjm\u00eb p\u00ebrdit\u00ebsime t\u00eb vogla, pra mund t\u00eb mos jemi nxitim dhe t\u00eb shtyjm\u00eb shum\u00eb vendime p\u00ebr gjuh\u00ebn derisa t\u00eb kemi m\u00eb shum\u00eb p\u00ebrdorues dhe, p\u00ebr pasoj\u00eb, m\u00eb shum\u00eb informacione.<\/p>\n<p><\/p>\n<h3 id=\"migracii-baz-dannyh\">Migrimet e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave<\/h3>\n<p><\/p>\n<p>P\u00ebr migrimin e sigurt t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, ekziston <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brunton-spall.co.uk\/post\/2014\/05\/06\/database-migrations-done-right\/\">formula standarde<\/a><\/noindex>:<\/p>\n<p><\/p>\n<ul>\n<li>Rikrijoni kodin p\u00ebr t\u00eb mb\u00ebshtetur formate t\u00eb reja dhe t\u00eb vjetra<\/li>\n<li>Transformoni t\u00eb gjitha t\u00eb dh\u00ebnat n\u00eb formatin e ri<\/li>\n<li>Fshini qasjen e vjet\u00ebr n\u00eb t\u00eb dh\u00ebna<\/li>\n<\/ul>\n<p><\/p>\n<p>Si rezultat, migrimi i baz\u00ebs s\u00eb t\u00eb dh\u00ebnave zgjat dhe k\u00ebrkon shum\u00eb burime. Dhe kemi akumuluar skema t\u00eb vjetruara, sepse edhe detyrat e thjeshta, si\u00e7 \u00ebsht\u00eb korrigjimi i emrit t\u00eb tabel\u00ebs ose kolon\u00ebs, nuk ia vlen p\u00ebrpjekja e hapur.<\/p>\n<p><\/p>\n<p>Dark ka nj\u00eb platform\u00eb efikase t\u00eb migrimit t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, e cila (shpresojm\u00eb) do ta thjeshtoj\u00eb procesin aq shum\u00eb saq\u00eb do t\u00eb ndaloni s\u00eb frik\u00ebsuari prej tij. T\u00eb gjitha depozitat e t\u00eb dh\u00ebnave n\u00eb Dark (depozita \u00e7el\u00eb-shtes\u00eb ose tabela t\u00eb p\u00ebrhershme me \u00e7el\u00ebsa) kan\u00eb nj\u00eb lloj. P\u00ebr t\u00eb transferuar nj\u00eb depozit\u00eb t\u00eb dh\u00ebnash, ju thjesht i caktoni nj\u00eb lloj t\u00eb ri dhe funksionin e rikthimit dhe restartrimit p\u00ebr t\u00eb transformuar vlerat midis dy llojeve.<\/p>\n<p><\/p>\n<p>Qasja n\u00eb depozit\u00eb t\u00eb dh\u00ebnash n\u00eb Dark b\u00ebhet p\u00ebrmes emrave t\u00eb ndryshuesh\u00ebm t\u00eb versioneve. P\u00ebr shembull, depozita e dh\u00ebnave Users fillimisht do t\u00eb quhet Users-v0. Kur krijohet nj\u00eb version i ri me nj\u00eb lloj tjet\u00ebr, emri ndryshon n\u00eb Users-v1. N\u00ebse t\u00eb dh\u00ebnat ruhen p\u00ebrmes Users-v0 dhe ju i qaseni ato p\u00ebrmes Users-v1, aplikohet funksioni i rikthimit. N\u00ebse t\u00eb dh\u00ebnat ruhen p\u00ebrmes Users-v1 dhe ju i qaseni ato p\u00ebrmes Users-v0, aplikohet funksioni i restartrimit.<\/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=\"Si e zhvillon Dark kodin brenda 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/35743ba246f327ca9e8b71f0069a3800.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Ekrani i migrimit t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave me emrat e fushave t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave t\u00eb vjetra, shprehjet e rikthimit dhe restartrimit dhe udh\u00ebzimet p\u00ebr aktivizimin e migrimit.<\/em><\/p>\n<p><\/p>\n<p>P\u00ebrdorni nd\u00ebrruesit e funksioneve p\u00ebr t\u00eb drejtuar thirrjet nga Users-v0 n\u00eb versionin Users-v1. Kjo mund t\u00eb b\u00ebhet p\u00ebr nj\u00eb menaxher HTTP n\u00eb nj\u00eb koh\u00eb, p\u00ebr t\u00eb reduktuar rrezikun, dhe nd\u00ebrruesit funksionojn\u00eb p\u00ebr p\u00ebrdorues t\u00eb ve\u00e7ant\u00eb, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb mund t\u00eb testoni se gjith\u00e7ka funksionon si\u00e7 pritej. Kur p\u00ebrdoruesit e Users-v0 t\u00eb p\u00ebrfundojn\u00eb, Dark do t\u00eb konvertoj\u00eb t\u00eb dh\u00ebnat e mbetura nga formati i vjet\u00ebr n\u00eb t\u00eb ri n\u00eb sfond. Nuk do ta v\u00ebreni fare.<\/p>\n<p><\/p>\n<h3 id=\"testirovanie\">Testimi<\/h3>\n<p><\/p>\n<p>Dark \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/real-problems-with-functional-languages-efe668c5264a\">nj\u00eb gjuh\u00eb programimi funksionale me tipizim statik<\/a><\/noindex> dhe vlera t\u00eb pandryshueshme, k\u00ebshtu q\u00eb sip\u00ebrfaqja e testimit \u00ebsht\u00eb shum\u00eb m\u00eb e vog\u00ebl krahasuar me gjuh\u00ebt objekt-orientuese me tipizim dinamik. Por edhe duhet testuar.<br \/>\nN\u00eb Dark, redaktori automatikisht ekzekuton testet modulare n\u00eb sfond p\u00ebr kodin e redaktuesh\u00ebm dhe p\u00ebr parazgjedhje ekzekuton k\u00ebto teste p\u00ebr t\u00eb gjith\u00eb nd\u00ebrruesit e funksioneve. N\u00eb t\u00eb ardhmen, ne duam q\u00eb me ndihm\u00ebn e tipeve statike t\u00eb kryejm\u00eb automatikisht fuzzing t\u00eb kodit p\u00ebr t\u00eb gjetur defekte.<\/p>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, Dark menaxhon infrastruktur\u00ebn tuaj n\u00eb prodhim, duke hapur mund\u00ebsi t\u00eb reja. Ne ruajm\u00eb automatikisht k\u00ebrkesat HTTP n\u00eb infrastruktur\u00ebn Dark (p\u00ebr momentin ruajm\u00eb t\u00eb gjitha k\u00ebrkesat, por m\u00eb von\u00eb duam t\u00eb kalojm\u00eb n\u00eb tregime). Ne testojm\u00eb kodin e ri dhe realizojm\u00eb teste modulare, dhe n\u00ebse d\u00ebshironi, mund ta ktheni leht\u00ebsisht k\u00ebrkesat interesante n\u00eb teste modulare.<\/p>\n<p><\/p>\n<h3 id=\"ot-chego-my-izbavilis\">\u00c7far\u00eb heqim dor\u00eb<\/h3>\n<p><\/p>\n<p>Duke pasur parasysh se nuk kemi shp\u00ebrndarje, por kemi nd\u00ebrrues funksionesh, rreth 60% e pipeline-it t\u00eb shp\u00ebrndarjes mbetet jasht\u00eb. Nuk na nevojiten dega git ose pull-request-e, nd\u00ebrtimi i resurseve backend dhe konteiner\u00ebve, d\u00ebrgimi i resurseve dhe konteiner\u00ebve n\u00eb regjistra ose hapat e shp\u00ebrndarjes n\u00eb 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=\"Si e zhvillon Dark kodin brenda 50 ms\" src=\"\/wp-content\/uploads\/2019\/08\/d584b13a1f91e9eef1e2e40c25e90052.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<em>Krahasimi i pipeline-it standard t\u00eb dor\u00ebzimit t\u00eb vazhduesh\u00ebm (majtas) dhe dor\u00ebzimi i vazhduesh\u00ebm i Dark (djathtas). N\u00eb Dark, dor\u00ebzimi p\u00ebrb\u00ebhet nga 6 hapa dhe nj\u00eb cik\u00ebl, nd\u00ebrsa versioni tradicional p\u00ebrfshin 35 hapa dhe 3 cikle.<\/em><\/p>\n<p><\/p>\n<p>N\u00eb Dark, implementimi p\u00ebrfundon me vet\u00ebm 6 hapa dhe 1 cik\u00ebl (hapat q\u00eb p\u00ebrs\u00ebriten disa her\u00eb), nd\u00ebrsa nj\u00eb pipeline modern i furnizimit t\u00eb vazhduesh\u00ebm p\u00ebrmban 35 hapa dhe 3 cikle. N\u00eb Dark, testet ekzekutohen automatikisht, dhe ju nuk e shihni k\u00ebt\u00eb; var\u00ebsit\u00eb instalohen automatikisht; gjith\u00e7ka q\u00eb lidhet me git ose Github nuk \u00ebsht\u00eb m\u00eb e nevojshme; nd\u00ebrtimi, testimi dhe d\u00ebrgimi i konteiner\u00ebve Docker nuk \u00ebsht\u00eb i nevojsh\u00ebm; implementimi n\u00eb Kubernetes nuk \u00ebsht\u00eb m\u00eb i nevojsh\u00ebm.<\/p>\n<p><\/p>\n<p>Edhe hapat e mbetur n\u00eb Dark jan\u00eb b\u00ebr\u00eb m\u00eb t\u00eb thjesht\u00eb. Pasi kalit\u00ebsit e funksioneve mund t\u00eb menaxhohen me nj\u00eb veprim, nuk \u00ebsht\u00eb e nevojshme p\u00ebr t\u00eb kaluar s\u00ebrish n\u00ebp\u00ebr t\u00eb gjith\u00eb pipeline-in e implementimit p\u00ebr t\u00eb hequr kodin e vjet\u00ebr.<\/p>\n<p><\/p>\n<p>Ne e kemi thjeshtuar furnizimin e kodit sa m\u00eb shum\u00eb q\u00eb t\u00eb mundemi, duke zvog\u00ebluar koh\u00ebn dhe rreziqet e furnizimit t\u00eb vazhduesh\u00ebm. Gjithashtu, ne e kemi thjeshtuar ndjesh\u00ebm azhurnimin e paketave, migrimin e bazave t\u00eb t\u00eb dh\u00ebnave, testimin, menaxhimin e versioneve, instalimin e var\u00ebsive, barazin\u00eb midis mjedisit t\u00eb zhvillimit dhe prodhimit, si dhe p\u00ebrdit\u00ebsimet e shpejta dhe t\u00eb sigurta t\u00eb versioneve t\u00eb gjuh\u00ebs.<\/p>\n<p><\/p>\n<p>Un\u00eb po p\u00ebrgjigjem n\u00eb pyetje rreth k\u00ebsaj n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/news.ycombinator.com\/item?id=20394166\">HackerNews<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb m\u00ebsuar m\u00eb shum\u00eb rreth mekanizmit t\u00eb Dark, lexoni <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/darklang\/the-design-of-dark-59f5d38e52d2\">artikullin mbi Dark<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/darklang?source=post_page---------------------------\">na ndiqni n\u00eb Twitter<\/a><\/noindex> (ose n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/paulbiggar?source=post_page---------------------------\">m\u00eb<\/a><\/noindex>) ose <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/subscribe?source=post_page---------------------------\">regjistrohuni p\u00ebr versionin beta dhe merrni njoftimet p\u00ebr postimet e ardhshme<\/a><\/noindex>. N\u00ebse po shkoni n\u00eb StrangeLoop n\u00eb shtator, <noindex><a rel=\"nofollow\" href=\"https:\/\/darklang.com\/launch\">vini te ne p\u00ebr lansimin<\/a><\/noindex>.<\/p>\n<p>Burimi: <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.0.1 - 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 \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.\" \/>\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\/sq\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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 \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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/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\udd47Si Dark implementon kodin brenda 50 ms | ProHoster","description":"Sa m\u00eb shpejt t\u00eb jet\u00eb procesi i zhvillimit, aq m\u00eb shpejt nj\u00eb kompani teknologjike zhvillohet. Fatkeq\u00ebsisht, aplikacionet moderne punojn\u00eb kund\u00ebr nesh - sistemet tona duhet t\u00eb azhurnohen n\u00eb koh\u00eb reale dhe pa penguar ask\u00ebnd, pa shkaktuar ndalesa dhe nd\u00ebrprerje. Zhvillimi n\u00eb k\u00ebto sisteme b\u00ebhet nj\u00eb detyr\u00eb e komplikuar dhe k\u00ebrkon pipeline t\u00eb komplikuara t\u00eb dor\u00ebzimit t\u00eb vazhduesh\u00ebm edhe n\u00eb ekipe t\u00eb vogla.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/kak-dark-razvertyvaet-kod-za-50-ms","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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 \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.","og:url":"https:\/\/prohoster.info\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/36721","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=36721"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/36721\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/27506"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=36721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=36721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=36721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}