Kyiv Go Meetup Maj 2018:

Moderator: â PĂ«rshĂ«ndetje tĂ« gjithĂ«ve! Faleminderit qĂ« jeni kĂ«tu! Sot kemi dy folĂ«s zyrtarĂ« â LjoĆĄa dhe Vanya. Do tĂ« ketĂ« edhe dy tĂ« tjerĂ«, nĂ«se na lejon koha. FolĂ«si i parĂ« â Alekseev GraÄev, ai do tĂ« na flasĂ« pĂ«r GopherJS.
Alekseev GraÄev (nĂ« vazhdim â AG): â Jam zhvillues Go dhe shkruaj shĂ«rbime web nĂ« Go. NdonjĂ«herĂ« pĂ«rballen me frontend-in, herĂ« pas here duhet tĂ« futem atje me duar. Dua tĂ« ndaj pĂ«rvojĂ«n dhe hulumtimet e mia pĂ«r Go nĂ« frontend.
Legjenda Ă«shtĂ«: sĂ« pari do tĂ« flasim pse duam tĂ« ekzekutojmĂ« Go nĂ« frontend, pastaj do tĂ« flasim si ta bĂ«jmĂ« kĂ«tĂ«. Ka dy mundĂ«si â Web Assembly dhe GopherJS. Le tĂ« shohim nĂ« cilin gjendje janĂ« kĂ«to zgjidhje dhe çfarĂ« mund tĂ« bĂ«jmĂ«.
ĂfarĂ« nuk shkon me frontend-in?
Të gjithë janë dakord se gjithçka është mirë me frontend-in?

Testet janë të pakta? Ndërtime të ngadalta? Ekosistemi? Mirë.
Për frontend-in më pëlqen një citat që tha një nga zhvilluesit e frontend-it në librin e tij:

Në Javascript nuk ka sistem tipesh. Tani do të përmend problemet me të cilat kam përballur gjatë punës time dhe do të shpjegoj se si i zgjidhin ato.
Sistemi i tipave nuk mund tĂ« quhet sistem tipesh nĂ« Javascript â ka vargje qĂ« pĂ«rfaqĂ«sojnĂ« tipin e objektit, por nĂ« tĂ« vĂ«rtetĂ« nuk kanĂ« tĂ« bĂ«jnĂ« asgjĂ« me tipat. Ky problem Ă«shtĂ« zgjidhur nĂ« TypeScript (shtesĂ« mbi Javascript) dhe Flow (kontrollues static i tipeve nĂ« Javascript). Prandaj, frontend-i tashmĂ« ka arritur zgjidhjen e problemit tĂ« keq tĂ« sistemit tĂ« tipave nĂ« Javascript.

Biblioteka standarde nĂ« shfletues si e tillĂ« nuk ekziston â ka disa objekte tĂ« integruara dhe funksione 'magjike' nĂ« shfletues. Por nĂ« Javascript si i tillĂ«, biblioteka standarde mungon. Ky problem ishte zgjidhur dikur nga jQuery (tĂ« gjithĂ« pĂ«rdornin jQuery me tĂ« gjitha prototipat, ndihmĂ«sit, funksionet qĂ« nevojiten pĂ«r punĂ«). Tani tĂ« gjithĂ« pĂ«rdorin Lodash:

Hell-i i callback-ëve. Mendoj se të gjithë e kanë parë kodin në Javascript diku 5 vjet më parë, dhe ai dukej si 'përzierje' e jashtëzakonshme e callback-ëve. Tani ky problem është zgjidhur (me daljen e ES-15 ose ES-16), u shtuan në Javascript premtimet (promises) dhe gjithkush mund të marrë frymë më lehtë për një kohë.

Derisa nuk erdhi Hell-i i PromicĂ«ve... Nuk e di se si industria e frontend-it arrin ta bĂ«jĂ« kĂ«tĂ«, por ata vazhdimisht e futin veten nĂ« ndonjĂ« derĂ« tĂ« çuditshme. ArritĂ«n ta bĂ«nin hell-in edhe me 'premtat'. MĂ« pas zgjidhen kĂ«tĂ« problem duke shtuar njĂ« primitiv tĂ« ri â async/await:

Me problemin e asinkronisĂ« Ă«shtĂ« zgjidhur. Async/await Ă«shtĂ« njĂ« primitiv mjaft i njohur nĂ« gjuhĂ« tĂ« ndryshme. NĂ« "Python" dhe nĂ« tĂ« tjera ka njĂ« qasje tĂ« tillĂ« â Ă«shtĂ« mjaft e mirĂ«. Problemi Ă«shtĂ« zgjidhur.
Cila problem nuk është zgjidhur? Rritja në progresion gjeometrik e kompleksitetit të framework-eve, kompleksiteti i ekosistemit dhe vetë programeve.

- Sintaksisi i Javascript-it është paksa i çuditshëm. Të gjithë e dimë problemin me mbledhjen e një array dhe një objekt dhe të tjera çudi.
- Javascript është multifunksional. Tani kjo është një sistem veçanërisht i rëndësishëm, kur ekosistemi është shumë i madh:
- tĂ« gjithĂ« shkruajnĂ« nĂ« stile tĂ« ndryshme â disa shkruajnĂ« nĂ« mĂ«nyrĂ« strukturore, disa nĂ« mĂ«nyrĂ« funksionale, zhvillues tĂ« ndryshĂ«m shkruajnĂ« ndryshe;
- nga paketat e ndryshme (packages) parime të ndryshme, kur përdorni paketa të ndryshme;
- ka shumĂ« "kĂ«naqĂ«si" me programimin funksional nĂ« Javascript â doli biblioteka rambda dhe tani askush nuk mund tĂ« lexojĂ« programet e shkruara nĂ« kĂ«tĂ« bibliotekĂ«.
- Kjo sjell një ndikim të madh në ekosistem dhe ajo është zgjeruar në mënyrë të pabesueshme. Paketat janë të papajtueshme me njëra-tjetrën: disa janë në promesa, disa janë në async/await, disa në kolbeka. Edhe në paradigmat e ndryshme shkruajnë!
- Kjo çon në faktin që projekti është i vështirë për t'u mbajtur. E vështirë të gjesh një bug, nëse nuk mund ta lexosh kodin.
ĂfarĂ« Ă«shtĂ« Web Assembly?
DjemtĂ« e guximshĂ«m nga Mozilla Foundation dhe disa kompani tĂ« tjera shpikĂ«n njĂ« gjĂ« si Web Assembly. ĂfarĂ« Ă«shtĂ« kjo?

- Kjo është një makinë virtuale e integruar në shfletues, që mbështet një format binar.
- Programet binare atje kalojnë dhe ekzekutohen pothuajse në mënyrë natyrale, që do të thotë se shfletuesi nuk duhet ta analizojë çdo herë të gjithë "llojin" e kodit javascript.
- Të gjithë shfletuesit shpallen mbështetje.
- Duke qenë se është kod bajt, mund të shkruash një kompilator për çdo gjuhë.
- Katër shfletuesit kryesorë tashmë vijnë me mbështetje për Web Assembly.
- Shumë shpejt presim mbështetje natyrale në Go. Një arkitekturë e re është tashmë shtuar: GOARCH=wasm GOOS=js (shpejt). Deri tani, siç e kuptoj, nuk është funksionale, megjithatë ka një deklaratë se kjo do të jetë me siguri në Go.
ĂfarĂ« tĂ« bĂ«jmĂ« tani? GopherJS
Derisa nuk kemi mbështetje për Web Assembly, ka një transpajler si GopherJS.

- Kodi në Go transpajlohet në Javascript "të pastër".
- Ekzekutohet nĂ« tĂ« gjithĂ« shfletuesit â nuk ka funksione tĂ« reja qĂ« mbĂ«shteten vetĂ«m nĂ« shfletuesit modernĂ« (ky Ă«shtĂ« Vanilla JS, i cili ekzekutohet nĂ« çdo gjĂ«).
- Ka Ă«shtĂ« mbĂ«shtetje pĂ«r thuajse çdo gjĂ« qĂ« ka Go, pĂ«rfshirĂ« gorutinat dhe kanalet... â gjithçka qĂ« ne e duam dhe e njohim.
- G casi gjithĂ« biblioteka standarde Ă«shtĂ« mbĂ«shtetur, pĂ«rveç atyre paketave qĂ« nuk kanĂ« kuptim tĂ« mbĂ«shteten nĂ« shfletues: syscall, ndĂ«rveprimet neto (ka njĂ« klient net/http, por nuk ka server, dhe klienti emulohet pĂ«rmes XMLHttpRequest). NĂ« pĂ«rgjithĂ«si, e gjithĂ« biblioteka standarde Ă«shtĂ« e aksesueshme â ja ajo nĂ« shfletues, ja stdlib Go, qĂ« ne e duam.
- E gjithë ekosistemi i paketës në Go, të gjitha zgjidhjet e jashtme (templating dhe të tjera) mund të kompilohet me anë të GopherJS dhe të startohet kjo në shfletues.
TĂ« merrni GopherJS Ă«shtĂ« shumĂ« e thjeshtĂ« â Ă«shtĂ« njĂ« paketĂ« e zakonshme Go. BĂ«jmĂ« go get, dhe kemi komandĂ«n GopherJS pĂ«r tĂ« ndĂ«rtuar aplikacionin:

Ja një hello world të tillë...

...NjĂ« program i zakonshĂ«m nĂ« Go, njĂ« paketĂ« e zakonshme fmt e bibliotekĂ«s standarde dhe Binding Js, pĂ«r tĂ« arritur nĂ« API-nĂ« e shfletuesit. Println nĂ« fund do tĂ« transformohet nĂ« log tĂ« konsolĂ«s dhe shfletuesi do tĂ« shkruajĂ« âHello gophersâ! Kaq e thjeshtĂ«: bĂ«jmĂ« GopherJS build â ekzekutojmĂ« nĂ« shfletues â gjithçka funksionon!
ĂfarĂ« ka deri mĂ« tani? Bindings

Ka bindings për të gjitha framework-at popullorë js:
- JQuery;
- Angular.js;
- D3.js për ndërtimin e grafikëve dhe punën me të dhëna të mëdha;
- React.js;
- VueJS;
- madje ka mbështetje për Electron (pra tani mund të shkruajmë aplikacione desktop me 'Electron');
- dhe e gjitha kjo Ă«shtĂ« e çuditshme â Ă«shtĂ« WebGL (mund tĂ« bĂ«jmĂ« aplikacione poligonale, pĂ«rfshirĂ« lojĂ«ra me grafikĂ« 3D, muzikĂ« dhe tĂ« gjitha gjĂ«rat e tjera);
- dhe shumë bindings të tjera për të gjitha framework-at dhe bibliotekat popullore JavaScript.
Framework
- Ka njĂ« framework tĂ« zhvilluar posaçërisht pĂ«r GopherJS â Vecty. Ky Ă«shtĂ« njĂ« ekuivalent i plotĂ« i React.js, vetĂ«m se i zhvilluar nĂ« Go, me specifikĂ«n e GopherJS.
- Ka çanta për lojëra (papritur!). Kam gjetur dy më të njohurat:
- Engo;
- Ebiten.
Do të demonstroj disa shembuj, si duket dhe çfarë mund të shkruhet tani në Go:

Ose një variant të tillë (nuk gjeva një shooter 3D, por, ndoshta, ai ekziston):

ĂfarĂ« ofroj unĂ«?
Tani industria e front-end-it ndodhet nĂ« njĂ« gjendje tĂ« tillĂ«, sa qĂ« tani do i drejtohen tĂ« gjitha gjuhĂ«ve qĂ« deri tani qanin nga Javascript. Tani tĂ« gjithĂ« do tĂ« kompilohet nĂ« 'Web Assembly'. ĂfarĂ« na nevojitet pĂ«r tĂ« zĂ«nĂ« njĂ« vend tĂ« denjĂ« atje si 'gofers'?

Tradicionalisht, në Go është e njohur se është një gjuhë programimi sistemike, dhe praktikisht nuk ka biblioteka për të punuar me UI. Disa ekzistojnë, por janë gjysmë të braktisura dhe gjysmë jo funksionale.
Dhe ja, një shans i shkëlqyer për të krijuar biblioteka UI në Go, të cilat do të ekzekutohen në GopherJS! E fundit, mund të shkruash kornizën tënde! Ka ardhur koha për të shkruar një kornizë, dhe ajo do të jetë një nga të parat që do të marrë përshtatje të hershme, dhe do të jetë një yll (nëse është një kornizë e mirë).
Mund tĂ« adaptohen shumĂ« paketa tĂ« ndryshme, tĂ« cilat tashmĂ« ekzistojnĂ« nĂ« ekosistemin Go, pĂ«r specifikat e shfletuesit (pĂ«r shembull, motori i shabllonĂ«ve). Ato do tĂ« funksionojnĂ«, mund tĂ« krijosh mbĂ«shtetje tĂ« pĂ«rshtatshme, nĂ« mĂ«nyrĂ« qĂ« tĂ« mund tĂ« renderosh pĂ«rmbajtjen direkt nĂ« shfletues. PĂ«r mĂ« tepĂ«r, mund tĂ« krijosh, pĂ«r shembull, njĂ« shĂ«rbim qĂ« mund tĂ« renderojĂ« tĂ« njĂ«jtĂ«n gjĂ« nĂ« server dhe nĂ« frontend, duke pĂ«rdorur tĂ« njĂ«jtin kod â gjithçka siç e duan zhvilluesit e frontend-it (vetĂ«m tani nĂ« Go).
Mund të shkruash një lojë! Thjesht për argëtim...
Kjo është gjithçka nga unë.

Pyetje
Pyetja (mĂ« pas â P): â A shkruaj nĂ« Go apo nĂ« Js?
AG: â Ti shkruan nĂ« Go rutina, kanale, struktura, embedding â gjithçka... Ti regjistrohesh pĂ«r njĂ« ngjarje, kalon atje njĂ« funksion.
P: â Pra, po shkruaj nĂ« «golë» Js?
AG: â Jo, ti shkruan si nĂ« Go dhe lidhe me API-nĂ« e shfletuesit (API-ja nuk Ă«shtĂ« ndryshuar). Mund tĂ« shkruash mbĂ«shtetje tĂ« tua, kĂ«shtu qĂ« mesazhet tĂ« vijnĂ« nĂ« kanal â kjo nuk Ă«shtĂ« e komplikuar.
P: â ĂfarĂ« ndodh me celularin?
AG: â UnĂ« me siguri e kam parĂ«: ka lidhje pĂ«r patch Cordova, qĂ« Js ekzekuton. NĂ« React Native â nuk e di; ndoshta ka, ndoshta jo (nuk jam shumĂ« i interesuar). Motori i lojĂ«rave N-go mbĂ«shtet gjithashtu aplikacionet mobile â si iOS ashtu edhe Android.
P: â Pyetje pĂ«r Web Assembly. Po merr gjithnjĂ« e mĂ« shumĂ« hapĂ«sirĂ«, pavarĂ«sisht nga kompresimi, «zipimi»... A do ta shkatĂ«rrojmĂ« kĂ«shtu edhe mĂ« shumĂ« botĂ«n e frontend-it?
AG: â Web Assembly Ă«shtĂ« njĂ« format binar, dhe binari sipas par regullit nuk mund tĂ« jetĂ« mĂ« i madh nĂ« versionin pĂ«rfundimtar se sa teksti... Ti je i tĂ«rhequr nga runtime, por kjo Ă«shtĂ« e njĂ«jtĂ« me tĂ«rheqjen e bibliotekĂ«s standarde tĂ« Javascript-it kur nuk Ă«shtĂ« aty, prandaj ne pĂ«rdorim ndonjĂ« Lodash. Nuk e di se sa hapĂ«sirĂ« merr Lodash.
P: â Sigurisht mĂ« pak se runtime...
AG: â NĂ« Javascriptin «e pastĂ«r»?
P: â Po. Ne e kompresojmĂ« atĂ« para se ta dĂ«rgojmĂ«...
AG: â Por, kyç doni qĂ« Ă«shtĂ« njĂ« tekst⊠NĂ« pĂ«rgjithĂ«si, njĂ« megabajt duket shumĂ«, por Ă«shtĂ« gjithçka (ke tĂ« gjithĂ« runtime-in tuaj). MĂ« pas, ti shkruan logjikĂ«n tĂ«nde tĂ« biznesit, e cila do ta rrisĂ« binarin tuaj me 1%. Deri tani, nuk po shoh qĂ« kjo e prish frontend-in. PĂ«r mĂ« tepĂ«r, Web Assembly do tĂ« punojĂ« mĂ« shpejt se Javascript pĂ«r njĂ« arsye tĂ« qartĂ« â nuk ka nevojĂ« tĂ« analizohet.
P: â Deri tani Ă«shtĂ« njĂ« moment debati⊠Nuk ka ende njĂ« zbatim standard tĂ« "VasmĂ«s" (Web Assembly), pĂ«r tĂ« cilin mund tĂ« gjykojmĂ« qartĂ«. Konceptualisht â po: tĂ« gjithĂ« e kuptojmĂ« se binari duhet tĂ« jetĂ« mĂ« i shpejtĂ«, por zbatimi aktual i tĂ« njĂ«jtit V8 Ă«shtĂ« shumĂ« efektiv.
AG: â Po.
P: â Kompilimi aty funksionon me tĂ« vĂ«rtetĂ« shumĂ« mirĂ« dhe nuk Ă«shtĂ« e sigurt se do tĂ« ketĂ« ndonjĂ« avantazh tĂ« madh.
AG: â Web Assembly po zhvillohet edhe nga figura tĂ« mĂ«dha.
P: â Deri tani, mĂ« duket se Ă«shtĂ« ende e vĂ«shtirĂ« tĂ« gjykohet pĂ«r Web Assembly. Sa kohĂ« po flitet dhe pak arritje reale qĂ« mund tĂ« prekĂ«sh.
AG: â Ndoshta. Do tĂ« shohim.
P: â Nuk kemi probleme nĂ« backend⊠Ndoshta, t'i lĂ«mĂ« kĂ«to probleme nĂ« frontend? Pse tĂ« futemi aty?
AG: â Duhet tĂ« mbajmĂ« njĂ« staf frontend-esh.

Pak reklamĂ« đ
Faleminderit që po qëndroni me ne. Ju pëlqen artikujt tanë? Doni të shihni më shumë materiale interesante? Na mbështesni duke bërë një porosi ose duke rekomanduar tek miqtë tuaj, , një analog unik i serverëve entry-level që e kemi shpikur për Ju: (opcionet me RAID1 dhe RAID10, deri në 24 bërthama dhe deri në 40GB DDR4 janë të disponueshme).
Dell R730xd dyfish mĂ« i lirĂ« nĂ« qendĂ«r tĂ« tĂ« dhĂ«nave Equinix Tier IV nĂ« Amsterdam? VetĂ«m te ne nĂ« HolandĂ«! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â nga $99! Lexoni rreth
Burimi: habr.com
