Promenjive okruženja = ENV variable

Šta su promenjive okruženja

Promenljive okruženja (eng. “Environment Variables“) koriste se na različitim mestima u razvoju softvera i IT infrastrukturi, kao npr. kod: operativnih sistema (“PATH” promenjiva koja definiše direktorijume u kojima operativni sitem traži izvršne fajlove), razvoja softvera (promenljive za čuvanje konfiguracionih parametara kao što su API ključevi, baze podataka, URL-ovi..), bezbednost (za čuvanje poverljivih informacija umesto hardkodovanja u aplikacioni kod).

env

Promenjive okruženja u Node

Promenjive okruženja su ključne komponente za rad sa Node.js aplikacijama, omogućavaju konfiguraciju aplikacije bez potrebe za menjanjem koda. Posebno korisna alatka pri radu sa različitim okruženjima (razvoj, testiranje ili produkcija).

Setovanje vrednosti promenjivih

Promenjive okružanja možete setovati na dva načina:

  1. Direktno u komandnoj liniji terminala
    • Unix/Linux:
    • Windows
  2. Unutar posebnih fajlova (.env )

    Sa korišćenjem jednog fajla mi grupišemo sve promenjive i tako omogućavamo bolju organizaciju.

Dostupnost promenjivih

Da bi promenjiva bila dostupna negde u kodu aplikacije potrebno je da je naš kod ima pristup .env fajlu. Pristup promenjivama iz .env fajla se ostvaruje preko objekta “process”. To je globalni objekat koji pruža informacije i kontrolu nad trenutnim radnim procesom Node.js aplikacije. On je deo standardne Node.js biblioteke i dostupan je u svim modulima bez potrebe za uključivanjem dodatnih paketa. Za učitavanje (environment) promenljivih iz .env fajla u process.env je potrebno da instaliramo dotenv paket:

Učitavanje sadržaja .env u process.env objekat

Nakon instalacije dotenv paketa, možemo da pozovemo metodu dotenv.config() koja će učitati sadržaj .env datoteke u “process.env”objekat. Pozivanje config() metode se može uraditi na dva načina:

  1. Pozivanje config() metode iz koda:

  2. Koristeći skriptu u okviru package.json fajla:

    NAPOMENA:
    Ako se env-file setuje u okviru script-e u package.json fajlu, tada nije potrebno da se poziva config() metoda u samom kodu!!!

Tek nakon toga se mogu koristiti ove statičke promenjive bilo gde u kodu na sledeći način:

NAPOMENA:
.env datoteku treba dodati u .gitignore fajl kako bi se izbeglo njeno deljenje sa verzionim kontrolama, čime se štite osetljive informacije. Obratite pažnju da se u produkciji ne zaboravi da se “ručno” napravi novi .env fajl jer se on ne šalje sa git-om !!!

Putanja do promenjive (“path”)

Ponekad je korisno imati različite .env datoteke za različita okruženja, na primjer, .env.development, .env.test, .env.production. Možeš učitati odgovarajuću datoteku na osnovu trenutnog okruženja na više načina:

Takodje dobro je da se tip okruženja definiše na nivou aplikacije, a to možemo uraditi na više načina.

  1. Direktno u kodu pri pozivanju config() metode, kada joj se prosledi path:
  2. Definisati odgovarajući fajl u okviru skripti u package.json fajlu:
    ili npr.

    NAPOMENA:
    Ako se env-file setuje u okviru script-e u package.json fajlu, tada nije potrebno da se poziva config() metoda u samom kodu!!!
  3. Definisati NODE_ENV promenjivu, pa na osnovu nje dobijati path sa path: .env.${env} :

    • Definisanje NODE_ENV promenjive u samom .env fajlu:
    • Definisanje NODE_ENV promenjive u terminalu pre pokretanja aplikacije:
    • Definisanje NODE_ENV promenjive u okviru skripte u package.json fajlu:
      ili npr.

    Nakon čega možemo koristi na sledeći način:


Docker: Pokretanje aplikacija svuda


Uvod u Docker svet

Šta je Docker?

Docker je platforma koja omogućava programerima da jednostavno kreiraju, implementiraju i pokreću aplikacije unutar kontejnera.

Šta su to kontejneri?
Kontejneri se mogu shvatiti kao lagane virtuelne mašine, ali su dosta brži i manje zahtevni od njih, oni sadrže sve što je potrebno za pokretanje aplikacije: kod, biblioteke i podešavanja operativnog sisteme.

docker image

Zašto koristiti Docker?

  1. Rad aplikacije na različitim sistemima

    Kada aplikacija radi u kontejneru, onda ona može raditi bilo gde, i lokalno ili u nekom udaljenom serveru. Kontejneri omogućavaju aplikacijama da rade konzistentno u različitim okruženjima a to se naručito “oseti” kod timova koji razvijaju aplikaciju na različitim računarima koristeći različite operativne sisteme, kao npr.:

    • Programer A (Windows): Razvija aplikaciju u Docker kontejneru.
    • Programer B (Mac): Testira aplikaciju u Docker kontejneru.
    • Server za produkciju (Linux): Pokreće aplikaciju u istom Docker kontejneru.

    Bez Docker-a, svaki programer bi morao instalirati sve potrebne alate i biblioteke na svom računaru, što može dovesti do problema sa kompatibilnošću i reproduktivnošću. A ako se koristi Docker onda svi programeri koriste jednu istu Docker sliku, što im omogućava da razvijaju i testiraju aplikaciju u identičnom okruženju. Na kraju, aplikacija se prenosi na produkciju bez brige o različitim verzijama biblioteka ili softvera na produkciskom serveru.

  2. Izolacija aplikacije

    Kontejneri omogućavaju svakoj aplikaciji da radi u svom odvojenom okruženju, bez međusobnog ometanja. Ovo može biti veoma bitno kod kompanija koja razvijaju ili hostuje dve različite aplikacije a koje zahtevaju različite verzije MySQL baze podataka. U tom slučaju je idealno da se koristi Docker jer se tada svaka aplikacija može smestiti u svoj Docker kontejner sa odgovarajućom verzijom MySQL-a, kao u sledećem primeru:

    • Aplikacija 1 (MySQL 5.7): Pokreće se u Docker kontejneru sa MySQL 5.7
    • Aplikacija 2 (MySQL 8.0): Pokreće se u Docker kontejneru sa MySQL 8.0

    Ili kada tim radi na aplikaciji koja zavisi od specifičnih verzija Node.js-a, NPM-a ili nekih drugih biblioteka. U tom slučaju kada se koristi Docker onda tim kreira Docker sliku koja sadrži sve potrebne zavisnosti, pa se na taj način pokreće aplikacija u potpuno istom okruženju, bez brige o verzijama biblioteka.

  3. Skalabilnost aplikacije

    Docker omogućava lako skaliranje aplikacija horizontalno (dodavanje novih instanci), pa ako kompanija doživljava nagli porast saobraćaja na svojoj e-commerce platformi onda se sistem lako skalira dodavanjem dodatnih kontejnera za rukovanje većim opterećenjem, kao npr.:

    • Web serveri: 10 Docker kontejnera sa Nginx-om
    • API serveri: 15 Docker kontejnera sa aplikacijom
    • Web serveri: 15 Docker kontejnera sa MySQL-om

Osnovni Docker koncepti:

  • Docker Image (Slika): Template za stvaranje kontejnera. Definiše kako će izgledati kontejner.
  • Docker Container (Kontejner): Pokrenut primerak Docker slike.
  • Dockerfile: Datoteka s uputstvima kako kreirati Docker sliku.
  • Docker Hub: Repozitorijum za deljenje i preuzimanje Docker slika.

Instalacija Docker-a

Evo kratkog uputstva za instalaciju:

  1. Provera sistemskih zahteva:

    • Docker Desktop zahteva 64-bitni Windows 10 ili noviji sa verzijom 21H2 ili novijom, ili Windows 11.
    • Virtualizacija mora biti omogućena u BIOS-u (Hyper-V i Windows Container funkcije).
    • Instalacija zahteva najmanje 4GB RAM-a.
  2. Preuzmi Docker Desktop instalacioni program: na ovom linku ili poseti stranicu za instalaciju i klikni na dugme “Download Docker Desktop for Windows”.
  3. Pokreni instalacioni program (npr. “Docker Desktop Installer.exe”) i prati uputstva na ekranu.
  4. Restartuj računar
  5. Proveri Docker instalaciju:

    • Otvori terminal (PowerShell ili Command Prompt) i pokreni komandu:
    • Ako vidiš verziju Dockera, to znači da je instalacija uspela.

NAPOMENA:
Postupak instalacije se može menjati od verzije do verzije, te je najbolje pogledati aktuelno stanje na oficijalnoj stranici.

Korišćenje Docker-a

Docker može da se koristi preko preuzete aplikacije Doker Desktop ili preko terminala, evo par najčešćih komandi za terminal:

  1. Preuzimanje Docker slike sa Docker Huba

    Kao npr:

    ili

  2. Kreiranje slike prema uputstvu iz Dokerfile-a

    U trenutom direktorijumu:

    Ako se DockerFile nalazi na nekoj drugoj lokaciji:

    Gde je:

    • -t: Označava (tag) sliku imenom.
    • -f: Navodi put do Dockerfilea.
  3. Prikazivanje dostupnih Docker slika

    Naredba docker images se koristi za prikazivanje liste svih Docker slika koje su trenutno sačuvane na vašem lokalnom računaru.

    Kada koristite samo docker images bez dodatnih opcija, Docker prikazuje samo najnovije označene slike za svaki repozitorijum. Ovo znači da, ako imate više verzija slike sa različitim oznakama (tagovima), prikazuje se samo poslednja verzija. Kada dodate opciju “-a” ili “–all”, Docker prikazuje sve slike, uključujući sve verzije iste slike kao i tzv. “dangling images” tj. slike koje nemaju oznake i često su rezultat međukoraka tokom procesa građenja slike.

    Primer

    Ova opcija omogućava da vidimo sve slike koje su sačuvane na vašem sistemu, što vam pomaže da upravljate prostorom na disku i odlučite koje slike možete obrisati.

  4. Pokretanje kontejnera

    Kao npr.:

    ili sa dodatnim opcijama:

    Značenje opcija:

    • -d: Pokreće kontejner u pozadini (detached mode)
    • -p: Mapira portove host:container (npr. 8080:80)
    • –name: Dodjeljuje ime “moj-nginx” kontejneru
  5. Spisak pokrenutih kontejnera

    Npr.

    ili sa dodatnim opcijama:

    Opcija -a prikazuje sve kontejnere, uključujući i zaustavljene.

  6. Zaustavljanje pokrenutog kontejnera

    Zaustavljanje po nazivu:

    ili prema id-u:

  7. Brisanje kontejnera

    Brisanje po nazivu:

    NAPOMENA:
    Naredba "docker container prune" sza uklanjanje svih zaustavljenih kontejnera sa vašeg sistema. Ova naredba pomaže u oslobađanju prostora i održavanju urednog Docker okruženja uklanjanjem kontejnera koji više nisu aktivni.

  8. Brisanje Docker slike

    Npr:

    NAPOMENA:
    “Dangling” slike su one koje nisu povezane ni sa jednim repozitorijumom ili oznakom (tagom). Obično imaju “none” kao naziv repozitorijuma i oznake. Naredba "docker image prune" se koristi za uklanjanje neupotrebljenih (dangling) Docker slika sa vašeg lokalnog sistema.

  9. Izvršavanje naredbe unutar pokrenutog kontejnera:

    Npr.:

  10. Prikazivanje logova kontejnera:

    Npr. prikazivanje svih logova

    Prikazivanje zadnjih 10 linija loga:

Docker Volume

Docker volume je mehanizam za trajno skladištenje podataka generisanih i korišćenih od strane Docker kontejnera. Volumeni omogućavaju da podaci prežive ponovna pokretanja kontejnera, a mogu se deliti između različitih kontejnera. Koriste se za upravljanje podacima na način koji je nezavistan od životnog ciklusa kontejnera.

Ključne karakteristike Docker volumena:
  • Trajnost podataka: Podaci smešteni u Docker volumene opstaju čak i kada kontejneri koji ih koriste budu obrisani.
  • Deljenje podataka: Više kontejnera može istovremeno koristiti isti volumen, što omogućava deljenje podataka između kontejnera.
  • Izolacija podataka: Docker volumeni su izolovani od sistema domaćina (host) i ostalih kontejnera, što doprinosi boljoj sigurnosti i organizaciji podataka.
  • Performanse: Docker volumeni obično nude bolje performanse u odnosu na skladištenje podataka direktno na fajl sistemu kontejnera.

Kreiranje i korišćenje Docker volumena:

Kreiranje volumena:

Pregled postojećih volumena:

Korišćenje volumena u kontejneru:

Kada kreirate ili pokrećete kontejner, možete montirati volumen koristeći opciju -v ili --mount.

Korišćenje opcije -v:

U ovom primeru:

  • my_volume je naziv volumena koji montirate.
  • /app/data je direktorijum unutar kontejnera gde će volumen biti montiran.
  • my_image je Docker slika koju koristite za kreiranje kontejnera.

Korišćenje opcije --mount:

Ova sintaksa je slična, ali pruža više fleksibilnosti i čitljivosti.

Upravljanje Docker volumenima:

Brisanje volumena:

docker volume rm my_volume

Automatsko brisanje volumena:

Kada želite da uklonite sve nepovezane (dangling) volumene, koristite naredbu:

Primer upotrebe:

Pretpostavimo da imate aplikaciju koja skladišti podatke u direktorijumu /app/data unutar kontejnera. Želite da osigurate da ti podaci budu trajni i dostupni čak i ako ponovo pokrenete kontejner.

1. Kreirajte Docker volumen:

2. Pokrenite kontejner i montirajte volumen:

Podaci kreirani u /app/data unutar kontejnera my_app_container biće sačuvani u volumenu app_data, koji možete koristiti sa drugim kontejnerima ili pristupiti direktno ako je potrebno.

Docker Compose

Docker Compose je alat koji olakšava upravljanje višekontejnerskim Docker aplikacijama. Koristeći jednostavni YAML fajl (docker-compose.yml), možemo da definišemo konfiguraciju svih servisa, mreža i volumena koji čine našu aplikaciju, a zatim ih pokrenete i upravljate njima pomoću jedne komande. Docker Compose je uključen u sklopu Docker Dektop instalacije.

YAML (YAML Ain’t Markup Language):

YAML je format za serializaciju podataka koji je dizajniran da bude jednostavan za čitanje i pisanje. Podaci su organizovani u parove ključeva i vrednosti. Ključ i vrednost se odvajaju dvotačkom i jednim razmakom. Struktura podataka u YAML-u definiše se pomoću uvlačenja razmacima, što omogućava jasnu hijerarhiju podataka.

Rečnici se definišu pomoću ključeva i vrednosti, sa uvlačenjem koje pokazuje koji ključevi pripadaju kojem rečniku.

Liste se predstavljaju pomoću crtica sa jednim razmakom ispred svakog elementa liste.

Komentari u YAML-u počinju sa # i mogu biti postavljeni bilo gde u liniji.

Primer

U ovome primeru je prikazan doker-compose.yml fajl sa uputstvima za aplikaciju sa dva servisa: frontend (Vue.js aplikacija) i backend (NestJS API):

Gde je backend servis (NestJS API) opisan u DockerFile:

I frontend servis (Vue.js aplikacija) opisan u DockerFile:

Objašnjenje koraka
  • FROM node:18:

    Koristi zvaničnu Node.js sliku verzije 18 kao osnovu za kreiranje novog kontejnera.

  • WORKDIR /app:

    Postavlja radni direktorijum na /app. Ako direktorijum postavljen sa WORKDIR ne postoji, Docker ga automatski kreira.

    • Sledeće naredbe u Dockerfile-u će se izvršavati relativno prema ovom direktorijumu.
    • Na primer, ako naredba COPY . . sledi nakon WORKDIR /app, sve datoteke će biti kopirane u /app. COPY, ADD i druge naredbe koje koriste fajl ili direktorijum kao argument oslanjaju se na relativne puteve prema trenutnom radnom direktorijumu.
  • COPY package*.json ./:

    Kopira package.json i package-lock.json iz trenutnog direktorijuma na hostu u trenutni radni direktorijum unutar kontejnera (/app).

    • ./ ukazuje na radni direktorijum (postavljen sa WORKDIR).
  • RUN npm install:

    Izvršava npm install unutar trenutnog radnog direktorijuma (/app).

    • Instalira sve Node.js zavisnosti prema package.json.
  • COPY . .:

    Kopira sav preostali kod iz trenutnog direktorijuma na hostu u trenutni radni direktorijum unutar kontejnera (/app).

  • CMD [“npm”, “start”]:

    Postavlja komandnu liniju za pokretanje aplikacije koristeći npm start.

Struktura projekta:

Za pokretanje apilikacije je potrebno da se u terminalu “prebacimo” do lokacije projekta:

A zatim pokrenemo Docker Compose na sledeći način:

Nakon čega možemo da pogledamo aplikaciju u pretraživaču:


Binarni sistem

Uvod

Binarni sistem je osnova za rad računara i digitalne elektronike i predstavlja sistem koji koristi samo dve cifre: 0 i 1. Svaka cifra u binarnom broju se naziva “bit” , a osam bitova predstavlja “bajt”

Svaki bit u binarnom broju predstavlja neki stepen broja dva. Ako imamo binarni broj od četri cifre, onda skroz desna cifra predstavlja tzv. “Least Significiant bit” i njen eksponent je “0” pa je njen stepen 2^0, krećući se na levo eksponent dvojke se povećava za jedan, pa tako drugi bit je 2^1, eksponent trećeg bita je 2 tj. 2^2 a četvrtog bita 3 tj. 2^3. Krećući se “ulevo” svaki sledeći bit je “važniji” pa se krajnji bit zove “Most Significiant bit”.

Konvertovanje binarnog u decimalni sistem

Kod binarnog sistema osnova nije “10” već “2” te bi binarni broj “1001” imao sledeću decimalnu vrednost broja 9. Evo kako dolazimo do toga:
1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 8 + 0 + 0 + 1 = 9

DECIMALNI SISTEM:
U decimalnom sistemu, svaka cifra u binarnom broju predstavlja neki stepen broja 10. Te ako imamo decimalni broj od četri cifre, onda skroz desna cifra ima eksponent “0” pa je njen stepen 10^0, krećući se na levo eksponent se povećava za jedan, pa tako druga cifra je 10^1, eksponent trećeg cifre je 2 tj. 10^2, a četvrte cifre je 3 tj. 10^3. Da bi dobili vrednost decimalnig broja potrebno je da se saberu sve vrednosti. Npr. broj “583′ ima sledeću vrednost:
1: 5*10^2 + 8*10^1 + 3*10^0 = 500 +80 +3 = 583

Formati za organizovanje bajtova

Kada se višebajtni podaci (poput celih brojeva većih od 255) čuvaju u memoriji oni mogu da se sačuvaju u različitim redosledima bitova. Postoje dve metode za organizovanje bajtova binarnih podataka: “Big Endian” i “Little Endian”.
U Big Endian formatu, najznačajniji bajt (MSB) se stavlja na najnižoj (prvoj) memorijskoj adresi. Nasuprot tome, Little Endian format stavlja najmanje značajniji bajt (LSB) na najnižoj (prvoj) adresi. Ovi formati imaju direktan uticaj na način na koji računari čitaju, pišu, i manipulišu višebajtnim binarnim vrednostima. U kontekstu računarske arhitekture i mrežnih protokola, za standardno prikazivanje podataka često se smatra “big endian” format. S druge strane, “little endian” format se često koristi u nekim računarskim arhitekturama, uključujući većinu verzija Intel x86 i x86-64 procesora.

Primer

Za 32-bitni podatak binarni prikaz bi bio:

  • “Big Endian” (čita se s leva na desno pa je najveći bajt levo a najmanji desno):
    0001 0010 0011 0100 0101 0110 0111 1000
  • “Little Endian” (čita s desna na levo, pa je najveći bajt desno a najmanji levo) pa da bi predstavljao isti binarni broj moramo obrnuti redosled:
    1000 0111 0110 0101 0100 0011 0010 0001

NAPOMENA:
U stvarnosti, kada se radi o pravim bajtovima od 8 bitova, little endian poredak znači obrnuti redosled bajtova unutar većeg tipa podataka (kao što je 32-bitni integer), a ne bitova unutar bajta. U ovom kontekstu, za potrebe objašnjenja smo pretpostavili da je svaka grupa od 4 bita nezavisna jedinica .

binarni sistem

Binarno predstavljanje decimalnih brojeva

Binarno predstavljanje Negativnih Brojeva

U računarstvu, postoji nekoliko metoda za predstavljanje negativnih brojeva u binarnom sistemu. Dve glavne metode su: “Komplement jedan” , “Komplement dva”. Komplement je dopuna datog broja do neke unapred definisane vrednosti, najčešće se realizuje dopunom broja do najvećeg broja binarnog sistema ili do osnove S brojnog sistema.

METODE ZA PREDSTAVLJANJE NEGATIVNIH BROJEVA:

1) “Komplement jedan” (Ones’ Complement)

U metodi komplementa jedan, negativni brojevi se predstavljaju invertovanjem svih bitova pozitivne vrednosti broja. Ima dva prikaza za nulu: 00000000 i 11111111.

2) “Komplement dva” (Two’s Complement)

“Komplement dva” je najčešće korišćena metoda za predstavljanje negativnih brojeva. Ova metoda koristi prvi bit za označavanje znaka, gde 0 označava pozitivan, a 1 negativan broj. Da bismo dobili negativan broj, invertujemo sve bite pozitivnog broja i dodamo 1 na rezultat.

Primer konvertovanja broja “-5” u binarni (“Komplement jedan”)

Za -5, prvo zapisujemo 5 kao 00000101 u binarnom formatu, a zatim invertujemo sve bite da dobijemo 11111010 kao “Komplement jedan” predstavljanje -5.

Primer konvertovanja broja “-5” u binarni (“Komplement dva”)

Da pretvorimo negativni celobrojni broj -5 u binarni sistem koristeći “Komplement dva” metod, pratimo sledeće korake:

  1. Pretvorimo apsolutnu vrednost broja (5) u binarni oblik, što je 101.
  2. Dopunimo broj nulama do željenog broja bitova, na primer 8 bitova, da dobijemo 00000101.
  3. Invertujemo sve bite, što daje 11111010.
  4. Dodamo 1 na ovaj broj, dobijajući 11111011, što je “Komplement dva” reprezentacija broja -5.

Ovaj binarni broj u “Komplement dva” metodu može se “pročitati” na obrnut način da bi se vratio u originalni decimalni broj -5.

Svaka od ovih metoda ima svoje prednosti i nedostatke. “”Komplement dva”” se najčešće koristi zbog svoje efikasnosti u aritmetičkim operacijama i jedinstvenog prikaza nule.

Konvertovanje celog broja u binarni sistem

Da biste pretvorili decimalni broj u binarni, možete koristiti metod deljenja sa 2. Ovaj postupak uključuje deljenje decimalnog broja sa 2 i zapisivanje ostatka. Ostatci će predstavljati cifre binarnog broja, a postupak se ponavlja sa svakim količnikom dobijenim deljenjem dok količnik ne postane 0. Bitno je zapamtiti da se binarni broj čita od poslednjeg ostatka prema prvom, odnosno u obrnutom redosledu od kako su zapisivani.

Prikazivanje decimalnih brojeva u binarnom formatu možemo dobiti ako pratimo sledeće korake:

  1. Odredimo znak broja. 0 za pozitivan, 1 za negativan.
  2. Pretvorimo celobrojni deo broja u binarni format.
  3. Pomnoži decimalni deo broja sa 2.
  4. Zabeleži celobrojni deo rezultata kao binarnu cifru (0 ili 1).
  5. Uzmi preostali decimalni deo rezultata i ponovi proces množenja sa 2.
  6. Nastavi ponavljati proces dok ne dobiješ rezultat bez decimalnog ostatka ili dok ne dostigneš željeni broj decimala.
Primer konvertovanja broja “13” u binarni
  • 13 deljeno sa 2 je 6 ostatak 1.
  • 6 deljeno sa 2 je 3 ostatak 0.
  • 3 deljeno sa 2 je 1 ostatak 1.
  • 1 deljeno sa 2 je 0 ostatak 1.

Kada zabeležimo ostatke odozdo na gore, dobijamo binarni broj 1101. Dakle, decimalni broj 13 je u binarnom sistemu 1101.

Kod pretvaranja negativnih decimalnih brojeva u binarni format, često se koristi dvosmisleni komplement te ćemo ga i mi ovde koristiti. Postupak je sledeći

  1. Konvertvoanje apsolutne vrednosti broja u binarni format: koristeći metod deljenja sa 2.
  2. Invertovanje cifre: Nakon dobijanja binarnog prikaza apsolutne vrednosti, invertuj cifre binarnog broja tako što ćeš zamijeniti sve nule sa jedinicama i sve jedinice sa nulama.
  3. Dodaj 1: Na invertovani binarni broj dodaj 1. Rezultat ovog koraka je dvosmisleni komplement originalnog negativnog decimalnog broja, što je njegov binarni ekvivalent.
Primer konvertovanja broja “-13” u binarni

Ako koristimo 8-bitni sistem za -13, postupak bi bio:

  • Pretvori 13 u binarni: 00001101.
  • Invertuj sve cifre: 11110010.
  • Dodaj 1: 11110011.

Dakle, -13 u 8-bitnom dvosmislenom komplementu je 11110011.

Konvertovanje decimalnog broja sa frakcijom

Celi deo broja se pretvara na prethodno pomenuti način ali da biste pretvorili decimalni broj sa frakcijom u binarni, možete koristiti metod množenja sa 2. Ovaj postupak uključuje množenje decimalnog broja sa 2 i zapisivanje celog dela. Celi deo će predstavljati cifre binarnog broja, a postupak se ponavlja sa decimalnim delom dok ne dobijemo željeni broj decimala ili dok ne dobijemo rezultat bez decimalnog ostatka.

Primer konvertovanja broja “13.75” u binarni

Celi deo broja 13 pretvara se u binarni sistem na isti način kao i bilo koji celi broj. Postupak deljenja sa 2 daje binarni ekvivalent 1101.

Frakcijski deo 0.75 pretvara se množenjem sa 2:

  1. 0.75 × 2 = 1.5 (zabeležimo 1, nastavljamo sa frakcijskim delom 0.5)
  2. 0.5 × 2 = 1.0 (zabeležimo 1, frakcijski deo je sada 0)

Ovo daje frakcijski binarni ekvivalent .11, čime se celokupni binarni prikaz broja 13.75 postaje 1101.11.

Stoga, binarni ekvivalent decimalnog broja 13.75 je 1101.11.

Primer konvertovanja broja “0.625” u binarni

Da bismo pretvorili decimalni broj 0.625 u binarni, sledimo gore navedene korake:

  • Množenje sa 2: 0.625 x 2 = 1.25. Cela cifra je 1, zato je prva binarna cifra 1.
  • Ponovi sa ostatkom: Uzimamo decimalni deo 0.25 i ponovo množimo sa 2.
  • Množenje sa 2: 0.25 x 2 = 0.5. Cela cifra je 0, zato je druga binarna cifra 0.
  • Množenje sa 2: 0.5 x 2 = 1.0. Cela cifra je 1, zato je treća binarna cifra 1.

Dakle, 0.625 u decimalnom sistemu je .101 u binarnom sistemu.

Ovaj metod može dovesti do situacije gde proces ponavljanja nikada ne završi ako se pretvara decimalni broj koji nema tačan ekvivalent u binarnom sistemu. U takvim slučajevima, obično se koristi aproksimacija do određenog broja decimalnih mesta.

Primer konvertovanja broja “5.5” u binarni

Pretvaranje decimalnog broja 5.5 u binarni format:

  • Celobrojni deo (5) je 101 u binarnom.
  • Deo posle decimalnog zareza (0.5) je 0.1 u binarnom.
  • Kombinovanjem dobijamo 101.1.
  • U IEEE 754 formatu, ovo bi bilo normalizovano sa određenim eksponentom (ovisno o preciznosti i formatu).
Primer konvertovanja broja “-2.75” u binarni

Za pretvaranje broja -2.75 u binarni format:

  • Znak je 1 jer je broj negativan.
  • Celobrojni deo (-2) je 10 u binarnom.
  • Decimalni deo (0.75) se pretvara u 0.11 u binarnom.
  • Kombinovanjem celobrojnog i decimalnog dela dobijamo binarni broj 10.11.

Binarno predstavljanje heksadecimalnih podataka

Heksadecimalni brojevni sistem koristi 16 simbola (0-9 i A-F). U ovom sistemu, brojevi se pišu koristeći cifre od 0 do 9 i slova od A do F, gde A predstavlja 10, B je 11, C je 12, D je 13, E je 14, i F je 15 u decimalnom sistemu. Heksadecimalni brojevni sistem koristi osnovu 16 te slično kao i kod binarnih i decimalnih brojeva broj 456 ustvari ima vrednost 4*16^2+5*16^1+6*16^0= 1110 u decimalnom sistemu. Na primer, heksadecimalni broj FF predstavlja binarni broj 11111111 ili decimalni broj 255 (15*16^1+15*16^0=255).

Heksadecimalni brojevi su veoma slični decimalnim npr. 456 je takav broj, da bi ga razlikovali od decimalnih oni se obeležavaju na sledeći način: 0x456 gde “0x” ne menja vrednost nego predstavlja samo indikator.

Heksadecimalni brojevi su korisni u programiranju jer pružaju jednostavniji način za predstavljanje binarnih brojeva.Heksadecimalni brojevi su pogodni za predstavljanje binarnih brojeva, jer svaka heksadecimalna cifra odgovara četiri binarna bita. Da bismo pretvorili heksadecimalni broj u binarni, svaku heksadecimalnu cifru zasebno pretvaramo u odgovarajući četverobitni binarni broj.

Heksadecimalna Binarni
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111
Primer konvertovanja heksadecimalnog broja “0x1A3” u binarni

Da bismo pretvorili heksadecimalni broj 1A3 u binarni koristićemo prethodnu tablicu:

  • Pretvoriti 1 u binarni: 0001
  • Pretvoriti A u binarni: 1010
  • Pretvoriti 3 u binarni: 0011

Dakle, heksadecimalni broj 1A3 u binarnom sistemu je 000110100011.

Binarno predstavljanje stringova

Pretvaranje stringova (teksta) u binarni sistem se obično vrši koristeći standardne šeme kodiranja znakova, gde svaki karakter ima svoju binarnu vrednost. Kodiranje znakova (Character Encoding) je sistem koji mapira skupove binarnih brojeva na znakove (slova, cifre, simbole), omogućavajući nam da koristimo kompjutere za čuvanje i prikazivanje teksta. Najpoznatije kodiranje je ASCII, ali ima ograničen set znakova. UTF-8 je šire korišćeno kodiranje koje može predstaviti mnogo veći broj znakova, uključujući sve što je potrebno za skoro sve svetske jezike. ASCII može direktno predstavljati znakove poput ‘A’ (65) ili ‘a’ (97), dok UTF-8 može predstavljati složenije znakove poput ‘ć’ (u dva ili više bajta).

ASCII Kodiranje znakova (Character Encoding)

ASCII je sistem koji koristi 7 bita za predstavljanje svakog karaktera, dozvoljavajući 128 različitih simbola. Na primer, veliko slovo “A” je predstavljeno brojem 65 u decimalnom sistemu, odnosno 01000001 u binarnom sistemu.

Tabela prvih 10 Slova Abecede sa Decimalnim, Heksadecimalnim i Binarnim Vrednostima
Slovo Decimalno Heksadecimalno Binarno
A 65 41 01000001
B 66 42 01000010
C 67 43 01000011
D 68 44 01000100
E 69 45 01000101
F 70 46 01000110
G 71 47 01000111
H 72 48 01001000
I 73 49 01001001
J 74 4A 01001010
Primer (ASCII)

Za string “Hi”:

  • “H” u ASCII je 72, binarno: 01001000
  • “i” u ASCII je 105, binarno: 01101001

Stoga, “Hi” postaje 01001000 01101001 u binarnom formatu.

UTF-8 Kodiranje znakova (Character Encoding)

UTF-8 može koristiti između 1 i 4 bajta za predstavljanje karaktera, podržavajući mnogo veći broj simbola, uključujući različite jezičke skripte i emoji. UTF-8 je kompatibilan sa ASCII-em za prvi set od 128 simbola.

Napomena: Ne postoji specifična “tabela” za svaki string. Umesto toga, koristite relevantne tabele kodiranja za pretvaranje karaktera u binarni sistem. Ovi kodovi omogućavaju standardizovanu konverziju tekstualnih podataka u binarne sekvence.


Objektno orjentisano programiranje

Šta je objektno orjentisano programiranje?

Objektno orjentisano programiranje ili skraćeno “OOP” je način organizovanja koda oko manjih celina pod nazivom “objekat”. Objektno orjentisano programiranje pomaže u strukturiranju koda u razumljive i samostalne jedinice koje se mogu lako ponovno koristiti u različitim delovima programa. Primenom objektno orjentisanog programiranja se dobija pregledniji i razumljiviji programski kod koji je jednostavan za održavanje!

Šta je objekat?

Objekat u programiranju ima dosta sličnosti sa ljudskim poimanjem objekta te je upravo zbog toga i dobio takav naziv. Svaki objekat ima neke svoje osobine (svojstva) i funkcionalnost sa kojom može da izvršava zadatke.

Objekat u programiranju predstavlja mali deo programskog koda koji čuva odredjene podatke i ima funkcionalnost da izvršava neke prethodno pripremljene akcije.

Karakteristike objekta (“Svojstva”)

Dobar kandidat za primer objekta u programiranju je “Vozilo” (npr. vozilo u nekoj igrici). Vozilo u realnom životu ima baš puno karakteristika (‘svojstava’) ali ćemo u ovom primeru pomenuti samo par karakterističnih kao što su: “marka vozila”, “tip motora”, “godište proizvodnje”.

Funkcionalnosti objekta (“Metode”)

Vozilo ima mnogo funkcionalnosti kao što su: “prevoz putnika”, “prevoz materijala”, “grejanje putnika”, “osvetljavanje”… Da bi se izvršila funkcionalnost “prevoz putnika” potrebno je uraditi čitav niz akcija: otključati vrata, okrenutli ključ, ubacili u brzinu, dati gas… Sve pomenute sitne akcije koje prethode ispunjavanju funkcionalnosti predstavljaju odličan primer za grupisanje. Grupisanje programerskog koda koje je zaduženo za izvršavanje jedne funkcionalnosti objekta se piše u još manjoj programskoj celini koja se naziva metoda objekta.

Kreiranje objekata (“Klase”)

U običnom životu da bi se napravio neki objekat potreban je njegov projekat ili plan na osnovu čega bi smo ga mi napravili. Isto važi i kod programiranja, šablon za kreiranje objekta u programiranju naziva “klasa”. Klasa ima istu ulogu kao i šablon u realnom životu, ona definiše kako će da izgleda, koja svojstva i koje funkcionalnosti će da ima kreirani objekat. Objekat nastao na osnovu klase (‘šablona’) se naziva “instanca” klase.

Svi objekti kreirani istom klasom imaju ista svojstva i funkcionalnosti ali sa različitim vrednosti tih svojstava.

Objekat nastao na osnovu klase (“šablona”) za kreiranje vozila imao bi ista svojstva kao i svaki drugi objekat nastao od iste klase (“marka”, “tip motora”, “godište proizvodnje”), ali sa svojim vrednostima tih svojstava. Npr. instanca vozilo bi mogla imati vrednost “Renault 4” za svojastvo “marka”, za svojstvo “tip motora” vrednost “1.0 benzin” i za svojstvo “godište proizvodnje” vrednost “1986”. Na sledećem primeru klasa “Vozilo” ima dva svojstva: “markaVozila” i “godisteProizvodnje” i jednu metodu “vozi()”:



Kreiranje i korišćenje instance klase Vozilo u okviru nekog programa bi izgledalo ovako (isto i u verziji za JS i TS):

U primeru “mojAuto” je objekat kreiran na osnovu klase “Vozilo”, i pri kreiranju objekta su mu setovane vrednosti za markaVozila (“Toyota”) i godisteProizvodnje (“2020”). Ovaj objekat čuva te dve informacije i ima dodatnu funkcionalnost sa kojom u konzoli može da ispiše “Vozilo marke Toyota iz 2020. godine vozi” kad god da pozovemo metodu “vozi()”.

OBJAŠNJENJE:
Specijalna JS metoda “constructor” se poziva samo jednom i to prilikom kreiranja nove instance klase. U našem primeru, constructor prihvata unos dve vrednosti i onda setuje te vrednosti svojstavima klase (“markaVozila” i “godisteProizvodnje”) pri samoom instanciranju objekta. Više o klasama pogledaj u članku “Klase u JS-u”

Privatno svojstava objekta

Često je potrebno da se zabrani pristup nekim svojstvima objekta izvan samog objekta, takva svojstva se nazivaju “privatna” svojstva i ona nisu dostupna izvan definisanog objekta, tj. ona su “skrivena” od spoljašnjeg koda.

Ukoliko bi smo pokušali pri programiranju da napišemo:

Ovo će izazvati grešku u JavaScriptu (ES2020 i novijim).

Ukoliko bi smo pokušali pri programiranju da napišemo:

TypeScript kompajler će prijaviti grešku jer pokušavate da pristupite privatnom svojstvu klase izvan nje.

U prethodnom primeru svojstva “markaVozila” i “godisteProizvodnje” su privatna, što znači da ne mogu biti pristupljena ili promenjena direktno izvan instance klase. Metoda vozi i dalje može da pristupi ovim privatnim svojstvima, jer je ona deo klase. Ukoliko bi pokušali da pristupimo nekom privatnom svojstvu ili da mu promenimo ime onda bi kompajler izbacio grešku.

U JavaScriptu, koncept privatnih svojstava nije bio formalno podržan do nedavno (ES2020 je uveo privatna polja sa # prefiksom). Pre toga, konvencija je bila koristiti određene nazive (kao što je underscore “_” prefiks) kako bi se signaliziralo da su određena svojstva “privatna”. Međutim, ovo nije bila prava enkapsulacija na nivou jezika, već više konvencija unutar zajednice programera.

Enkapsulacija

OBJAŠNJENJE:
“Enkapsulacija” je jedan od principa objektno orjentisano programiranja i zasniva se na sakrivanju stanja svojstva klase za kod izvan same klase, omogućivajući kontrolisani pristup svojstvu samo preko metoda predefinisanih za to.

U prethodnom primeru je jasno zašto je neophodno da svojstva “markaVozila” i “godisteProizvodnje” budu privatna tj. da se setuju samo jednom pri kreiranju objekta bez načina da se naknadno promene izvan same klase. Medjutim nekada su potrebna privatna svojstva čije vrednosti mogu da se menjaju iz “spoljašnjeg koda”. U takvim slučajevima se to omogući ali samo kroz kontrolisan pristup, odličan primer bi bilo novo privatno svojstvo “bojaKaroserije”, čiju bi promenu dozvolili i van objekta samo kroz specijalizovanu metodu pod nazivom “farbanjeKola()”:



Apstrakcija

“Apstrakcija” je još jedan od principa objektno orjentisano programiranja i podrazumeva fokusiranje na ono što je bitno i skrivanje kompleksnosti od korisnika (korisnik = “kod izvan klase”). Kada postoji takva potreba za nekom funkcionalnosti kojoj ne želimo da se pristupa izvan klase onda je potrebno da je definišemo kao “privatnu funkciju”.

U sledećem primeru ćemo dodati novo privatno svojstvo “količinaGoriva” čija vrednost može da se poveća samo kroz specijalizovanu metodu “napuniGorivo()”, i možemo da promenimo metodu “vozi()” i da joj damo novu funkcionalnost tako da će ona biti zadužena da smanji količinu goriva u rezervaru u zavisnosti koliko kilometara vožnja treba da predje. Ova metoda će od sada da prihvata jedan ulazni parametar “broj kilometara vožnje” te će na osnovu njega i vrednosti iz svojstva “potrošnjeGoriva” smanjivati količinu goriva u rezervaru po odgovarajućoj formuli. Takodje metoda treba proveriti da li ima dovoljno goriva za planiranu vožnju i ukoliko nema onda da ne izvrši vožnju i da u konzoli ispiše poruku upozorenje. Proveru da li ima goriva u rezervaru ćemo posvetiti privatnoj funkciji pod nazivom “imaLiDovoljnoGoriva()”. Pošto je ova metoda potrebna samo unutar klase i nije potrebno da njoj ima pristup neko spolja ona je odličan primer apstrakciju (skrivena kompleksnost) i privatnu funkciju.



U klasi Vozilo, detalji o tome kako se računa potrošnja goriva ili kako se proverava da li ima dovoljno goriva su sakriveni unutar metode, pa kada korisnik klase poziva metodu vozi() on nema potrebu da zna detalje o tome kako se gorivo troši ili kako se vrši provera nivoa goriva.

Nasleđivanje

Objektno orjentisano programiranje omogućava da podklasa nasledi sve karateristike svoje bazne klase ali da pri tom i doda nove funkcionalnoti. U ovom primeru klasa “Formula” nasleđuje sve osobine i metode klase “Vozilo” i proširuje ih sa svojim novim svojstvom “_maksimalnaBrzina” i metodom “voziTrku()”. Metoda voziTrku() je slična metodi vozi() ali za razliku od nje ona pri trci troši dvostruko više goriva od normalne potrošnje (kada se poziva metoda vozi()).

auto-formula

NAPOMENA:
U okviru bazne klase metoda “imaLiDovoljnoGoriva()” je privatna (u TS-u sa ključnom reči private, a u JS-u sa prefiksom #). Da bismo omogućili korišćenje privatne metode promeniGorivo i unutar potklase, u TS-u je potrebno promeniti njeno stanje iz “private” u “protected”. Medjutim privatne metode i svojstva u JavaScriptu označene sa # su dostupne samo unutar klase u kojoj su definisane i ne postoji direktan način da ih učinite dostupnim u izvedenim (extended) klasama (kao što je to moguće u TypeScriptu sa protected). Da bi smo to uradili i u JS-u potrebno je umesto prave privatnosti (metode označene sa prefiksom “#””), koristiti samo konvenciju imenovanja sa prefiksom “_”, čime metode označuje da je “privatne”, ali one tehnički ostaju javno dostupne.



Nova ekstendovana klasa bi mogla da se koristi u programu na sledeći način:

Polimorifizam

Objektno orjentisano programiranje podržava još jedan koncept “Polimorfizam” koji predstavlja sposobnost koda da se ponaša na različite načine, u zavisnosti od objekta sa kojim radi. Ovo je posebno korisno u situacijama kada želimo da različite klase imaju isti naziv za metodu, ali svaka klasa na svoj način implementira tu metodu. Postoje dva osnovna tipa polimorfizma: statički (ili compile-time) “Overloading” i dinamički (ili run-time) “Override”.

Dinamički Polimorfizam (Override)

Odličan primer za dinamički Polimorfizam bi bila metoda vozi(), gde pri pozivanju metode štampamo drugačije poruke u zavisnosti od klase:

A proširena klasa Formula bi sada izgledala ovako:

Demonstracija polimorfizma:

U prethodnom primeru je prikazan Dinamički Polimorfizam (Override) pri kojem je u extendovanoj klasi “pregažena” funkcionalnost metode. Kompajler zna u toku izvršenja programa (runtime), na osnovu tipa objekta (“Vozilo” ili “Formula”) koja metoda treba da se pozove!

Statički Polimorfizam (Overloading)

Ovaj tip polimorfizma se dešava kada imamo više metoda unutar iste klase sa istim imenom, ali sa različitim parametrima (brojem, tipom, itd.). Kompajler odlučuje koju verziju metode da koristi na osnovu argumenata koje metoda prima prilikom poziva. U programski jezicima “Java” i “C#” je omogućen stvarni overloading metoda unutar klase a to podrazumeva da u okviru klase možete imati više metoda sa istim imenom, ali sa različitim potpisima (različiti tipovi i/ili broj parametara). Svaka od ovih metoda može imati svoju jedinstvenu implementaciju. Evo primera za overLoading u C#-u:

Primer

U TypeScriptu, overloading (preopterećenje) metoda se postiže definisanjem više potpisa za istu funkciju, ali sa jednom implementacijom koja mora biti kompatibilna sa svim potpisima. Evo primera sličnog kalkulatora kao u C# primeru, ali prilagođenog za TypeScript:

U ovom TypeScript primeru, klasa Kalkulator ima dva potpisa za metodu saberi: jedan sa dva parametra i drugi sa tri parametra. Postoji samo jedna implementacija metode saberi koja koristi opcionalni parametar (označen sa ?) kako bi se omogućilo pozivanje metode sa dva ili tri argumenta. Na ovaj način, TypeScript omogućava overloading uz očuvanje tipičnih karakteristika statičke provere tipova koje pruža jezik.

Primer

U ovome primeru ista metoda može da primi i “različit tip parametara”, pa u C# to izgledalo ovako:

Kako TypeScript ne podržava više stvarnih implementacija istog naziva funkcije (kao što to čine Java i C#…), moramo koristiti tipove unije i proveru tipova unutar jedne implementacije da biste obradili različite slučajeve. Evo kako bi to moglo izgledati:

U ovoj verziji, saberi metoda može prihvatiti ili brojeve ili stringove. Funkcija unutar klase koristi proveru tipova (typeof) da odredi da li su argumenti brojevi ili stringovi i obavlja odgovarajuću operaciju (sabiranje brojeva ili spajanje stringova) na osnovu toga.
Ovo je fleksibilan način da se u TypeScriptu upravlja različitim vrstama parametara unutar jedne funkcije, iako se mora pažljivo rukovati tipovima podataka kako bi se izbegle greške u vreme izvršenja.


Git submodul

Šta su git submoduli?

Submoduli su projekti (najčešće neke biblioteke) koji su ubačeni u neki drugi projekat, nakon čega su u tom tzv. “glavnom” projektu dostupni svi fajlovi submodula. Git subdmoduli nam omogućavaju da koristimo dva ili više repozitorijuma kao da su jedno. Svaki repozitorijum održava svoju zasebnu istoriju promena pa se čak subdmoduli ažuriraju nezavisno od glavnog repozitorijuma. Kada klonirate ili povučete repozitorijum sa submodulom, glavni repozitorijum dobija samo vezu do mesta odakle će “povući” kod submodul-a.

git sumbmodul

Submoduli su korisni ako u jednom git repozitorijumu imate kod ili sadržaj koji želite da koristite u više drugih projekata kojima upravlja git, ali ipak želite da istorija promena ostane odvojena. Na primer, možda koristite biblioteku koja je u aktivnom razvoju a morate da razvijete svoj kod aplikacije zajedno sa svim promenama submodula.

Kada dodate subdmodul u Git, vi ne dodajete ceo kod subdmodula u glavni repozitorijum, već dodajete samo informacije o subdmodulu. Ove informacije opisuju na koji komit subdmodula se pokazuje. Zbog toga kod subdmodula neće doći do ažuriratanja kada se ažurira repozitorijum glavnog projekta. Ovo može da bude poželjno ponašanje, jer vaš kod možda neće raditi sa najnovijim promenama subdmodula, te se tako sprečava neočekivano pucanje aplikacije.

U ovome članku ćemo koristiti dva projekta sa github-a: jedan kao glavni (https://github.com/choslee/gitSubmodulMasterParent i drugi kao subdmodul (https://github.com/choslee/gitSubmoduleChild).

Ubacivanje submodul-a u projekat

Dok smo u našem “parent” projektu za dodavnje submodula je potrebna samo njegova url adresa i korišćenje naredbe git submodule add:

Nakon izvšavanja ove naredbe pojavljuje se dva nova fila:

  • .gitmodules
  • Novi folder u kome se nalazi ceo podprojekat (našem primeru “gitSubmoduleChild”))

Zatim je ove izmene potrebno komitovari i poslati na cloud:

Kloniranje projekta sa submodulom

Sada kad imamo projekat na cloud-u (npr. GitHub-u) koji u sebi sadrži subprojekat tj. submodul potrebno je da ga kloniramo. Pri kloniranju projekata sa submodulom postoji jedan korak više u odnosu na običan projekat. Prvo ćemo uraditi standardno kloniranje projekta:

Nakon kloniranja se u okviru projekta vidi folder sa nazivom subprojekta, medjutim on je prazan! Da bi ga popunili potrebno je inicirati a zatim ga i ažurirati sa sledećim naredbama:

Nakon ove dve naredbe će se inicirati submodul a zatim i klonirati, ove dva naredbe možemo zameniti sa jednom:

Slanje izmena na cloud

Izmene na glavnom projektu

Ako napravimo izmene u okviru našeg glavnog projekta njih ćemo jednostavno poslati standardnim naredbama:

Izmene na subprojektu

Medjutim ukoliko iz našeg projekta napravimo neke izmene na fajlovima submodula i proverimo status dobićemo sledeći izveštaj:

U izveštaju vidimo da je glavni projekat nema izmena, ali vidimo da modifikovan sadržaj submodula. Ukoliko probamo da dodamo promene na index sa naredbom git add . ništa se neće dogoditi jer nema promena na glavnom projektu. Da bi poslali promene napravljene u submodulu potrebno je uraditi komit i push iz tog foldera, što znači da prvo moramo promeniti lokaciju:

A zatim tu sve odraditi:

Nakon ovoga će biti ažuriran repozitorijum koji je ubačen kao submodul.

NAPOMENA:
Uvek je potrebno prvo povući sve promene sa submodula pre pušovanja na server (pogledajte deo “Ažuriranje submodula”)

Trebamo napomenuti da se ove poslate promene neće videti na Github-u glavnog projekta, već na GitHub-u subprojekta.

Ažuriranje submodula

Kada želimo da ažuriramo podProjekat tj. submodul onda to ne možemo da uradimo samo ažuriranjem glavnog projekta sa standardnim naredbama:

Jer standardnim pull-om neće biti ažuriran submodul, ni u lokalu ni na cloud-u. Na lokalu ćemo primetiti da nema novih ili izmenjenih fajlova dok na cloud-u (npr. GitHub-u) to uočavamo posmatrajući broj komita pored naziva foldera submodula. Taj broj komita mora da bude broj poslednjeg komita suprojekta. Pogledajte broj komita subprojekta na sledećoj slici:

glavni projekat sa submodulom

Kao što se vidi na slici poslednje ažurirani komit ima broj “e14f576”, a kada pogledamo pravo stanje komita u subprojektu vidimo da ima jedan noviji komit “41b4c54” (pogledaj sliku dole):

I način

Potrebno je prvo ući u submodul:

Pa zatim povući njegove izmene:

Kada se nakon ove naredbe vratimo u glavni projekni folder i proverimo status dobijamo sledeće:

Pa sada možemo da komitujemo i pošaljemo izmene na cloud:

Tek nakon ovoga će se na cloud-u prikazati poslednje izmene u okiviru submodula, a videće se i broj poslednjeg komita submodula “41b4c54”, vidi sliku:

II način

Ovaj način je lakši jer sve možemo da radimo dok smo u glavnom projektnom direktorijumu. Za ažuriranje submodula je potrebno koristi naredbu:

Kada nakon ove naredbe proverimo status dobijamo sledeće:

Ovde se vidi da promene postoje u okviri submodula, te je sada moguće komitovati i pušovati na claud:

Nakon čega će biti ažuriran broj pored submodula koji označava poslednji komit submodula.

Brisanje submodula iz projekta

Brisanje se vrši u par koraka:

  • Obrišemo folder u našem projektu koji predstavlja submodul
  • Ako imamo samo jedan submodul onda je dovoljno da obrišemo fajl “.gitmodules” u suprotnom je potrebno da ga editujemo i obrišemo deo vezan za naš submodul
  • U okviru “.git” foldera nadjemo “modules” folder i u okviru njega obrišemo submodul.
  • U okviru “.git” foldera potrebno naći fajl “config” i unutar njega obrisati deo vezan za naš submodul:

Nakon ovoga je neophodno ove izmene komitovati i pušovati na klaud.

NAPOMENA:
Brisanje submodula iz projkta ne utiče na sam repozitorijum tog submodula, on nastavlja da “živi” na cloud-u.


Domen i hosting

Zakup domena

Zakup domena je jedan od prvih koraka neophodnih za web prezentaciju. Kupovina se vrši preko ovlašćenih prodavaca (registara). Registri domena su kompanije koje prodaju domene. One moraju imati sertifikat odobren od strane ICANN, Internet Corporation for Assigned Names and Numbers (Internet Korporacija za Pripisana Imena i Brojeve). Spisak ovalašćenih registra u Srbiji možete pogledati ovde, dok ću od stranih registara pomenuti namecheep.com i name.com. Kada kupite domen vi ga stvarno ne posedujete, nego kupujete pravo da koristite taj domen na odredjeni period.

Transfer domena

Ukoliko želite da promenite firmu kod koje ste registrovali domen postupak se zove “transfer domena” za kojeg važi sledeći postupak:

  • Krajnji korisnik domena potvrdjuje da su podaci iz “whois” zapisa tačni (potvrdjuje tačnost e-mejl adrese…) i preuzima autentifikacioni kod od starog registra.
  • Korisnik kontaktira svog novog registra sa zahtevom za transfer domena i pritom mu prosledjuje autentifikacioni kod koji je dobio od starog registra.
  • Novi registar kontaktira starog registra domena.
  • Stari registar kontaktira krajnjeg korisnika sa zahtevom za potvrdu verodostojnosti zahteva.
  • Nakon potvrde stari registar će prepustiti domen novom registru.
  • Novi registar će obavestiti krajnjeg korisnika o završetku transfera domena.

Zbog ovako komplikovane procedure koja se često i naplaćuje, kao i zbog drugih prikrivenih problema je preporuka da se ne zakupljuje domen i hosting kod iste firme.

Web hosting

Hosting je usluga koju pruža hosting provajder i zasniva se na iznajmljivanju resursa na serverima (kompjuteri koji su priključeni na mrežu non stop).

Osnovne karakteristike hostinga
  • Prostor na hard disku
    Ovo je zakupljeni prostor na hard disku, koji je neophodan za smeštanje podataka vezanih za web sajt. Treba napomenuti da bi prostor trebao biti dovoljno veliki da na njega stanu svi fajlovi koji čine vašu web prezentaciju ali i kontinuirani backup web sajta (mesečni, nedeljni…)
  • Dozvoljeni mesečni promet podataka (Bandwidth ili Data Transfer)
    U transfer podataka spadaju slike, tekst, audio fajlovi, video fajlovi i sve ostalo sve ostalo što server prebacuje na korisnički web browser. Važi pravilo da stranice sa dosta slika ili video sadržaja imaju veći mesečni promet (protok) podataka, od stranica samo sa tekstom. Takodje važi da sajtovi koji imaju mnogo posetilaca (tj. pristupa stranicama) troše vece količine dozvoljenog mesečnog transfera. Okviran protok se može izračunati ako se pomnoži mesečni broj pristupa i prosečna veličina stranice vašeg sajta (“običan” sajt sa 40.000 pristupa stranici ima protok oko 1GB).
  • Broj dozvoljenih domena i poddomena (tj. broj dozvoljenih baza podataka)
  • Stabilnost hostiga (eng. uptime)
    Ovaj pojam označava koliko vremena je server “up” tj. dostupan. Uptime garancija koju hosting pruža je odraz njihovog kvalita i stabilnosti. Dostupnost od 99% je apsolutni minimum koji bi hosting trebao garantovati.
  • Dostupnost tehničke podrške
    Ova karakteristika podrazumeva koje je radno vreme tehničke podrške kao i vreme na koje tehnička podrška odgovara na neki zahtev (ticket). Ako se ne razumete u poslove administracije hosting paketa, potrebno je naći hosting provajdera sa dobrim preporukama za podršku.
  • Brzina servera
    Brzina servera zavisi od softverske i hardverske konfiguracije (količine memorije, snage procesora, vrste hard diska..), tako da serveri sa boljim procesorima i većom količinom memorije kao i serveri sa SSD diskovima imaju dobre perfomanse.
Tipovi hostinga

Na osnov prethodnih karakteristika postoje raličite vrste hostinga, navešću tipove od lošijih ka boljim:

  • Shared hosting
    Najjeftiniji način da hostujete vaš websajt. Na deljenom hostingu fajlovi vašeg websajta se smeštaju na server (računar) na kojem se nalazi veći broj hostovanih sajtova. Deljenje servera podrazumeva deljenje dva najvažnija resursa hostinga: prostora i protoka (mada ne treba zanemariti procesor i memoriju servera). Iako web hosting provajderi često nude slične mogućnosti (slične servere), razlika može biti velika jer pored toga što kvalitet deljenog hostinga zavisi od kvaliteta samog servera takodje zavisi i od broja sajtova po serveru. Očigledno je da će jedan isti server mnogo bolje raditi ukoliko na njemu ima 20 sajtova nego ako ih je ima 1000. Glavna karakteristika shared hostinga jeste postojanje centralne administracije servera od strane tehničkih lica, što predstavlja pogodnost za one korisnike koji ne žele da se bave informatičkim podešavanjima. Sa druge strane ovo je istovremeno i prepreka za napredne korisnika koji žele da razvijaju i testiraju nove funkcionalnosti zbog manjeg stepena kontrole.
  • VPS (Virtual Private Server)
    VPS hosting je jedan korak iznad shared web hostinga. Ovaj hosting i dalje deli server sa drugim VPS korisnicima, ali svaki server pokreće sopstveni operativni sistem i nezavisno od drugih se može resetovati, namenski podešavati, reinstalirati i sl. VPS hosting pruža fleksibilnost dodavanja i menjanja komponenti operativnog sistema, mrežnih postavki i instalacije software-a po želji.
  • Cloud hosting
    Cloud hosting je tehnologija hostovanja Internet prezentacija na virtuelnim serverima koji svoje resurse povlače iz mreža velikog broja hardverskih servera. On predstavlja naredni evolutivni korak i nastao je kao alternativa hostovanju sajtova na jednom fizičkom serveru.
    Najveća prednost cloud tehnologije je njena fleksibilnost i mogućnost da veoma lako skalirate resurse. Takodje prednost ovakvog hostinga je što osim resursa, možete birati i operativni sistem. Sa standardnim hostingom problem može nastati zbog kvara servera kao i drugih delova infrastrukture, dok su kod cloud hostinga serveri povezani u jedan cloud (komponente mogu biti fizički na potpuno različitim lokacijama), pa se kvar neke komponente brzo rešava, a kopija vašeg cloud servera postaje aktivna u roku od nekoliko minuta, umesto nekoliko sati.
  • Namenski hosting (Dedicated Hosting)
    Hosting kod koga korisnik zakupljuje ceo server koji se ne deli sa drugim korisnicima. Serveri su u vlasništvu web hosting kompanija ali se iznajmljuju samo jednom korisniku. Korisnik ima potpunu kontrolu nad celokupnim serverom uključujući i izbor operativnog sistema, serverskih aplikacija, hardvera. Postoje više podvrsta ovakvog hostinga koje se medjusobno razlikuju od količine uplitanja hosting provajdera u održavanje servera:

    • Fully managed (potpuno nadgledani)
      Podrazumeva praćenje, ažuriranje softvera, restartovanje, bezbedonosne zakrpe, i nadogradnje sistema. Korisnici nemaju potrebu za posedovanjem naprednih informatičkih znanja ili administracijom ili angažovanjem trećih lica za ove poslove.
    • Managed (upravljanje)
      Predstavlja srednji nivo podrške, ali deo administracije se delegira na korisnika
    • Self managed (upravljanje od strane korisnika)
      Podrazumeva osnovni nivo podrške od strane hosting provajdera
    • Unmanaged (bez podrške)
      Zahteva potpunu administraciju od strane korisnika

DNS hosting

DNS (domain name system) je ogroman sistem servera čija je namena da čuvaju bazu kataloga koji sadrži informacije vezane za svaki domen: njegovu IP adresu, informacije o registraciji kao i o njihovom odnosu prema drugim domenima i hostizima. Softver koji prebacuje ime domena razumljivo ljudima (npr. webprogramiranje.org) u njegovu IP adresu (npr. 194.63.248.47.) se zove DNS software. Server koji ima instaliran “DNS software” se nazivaja nameserver, takvi serveri čine DNS sistem. Obično hosting kompanije imaju svoje nameserver-e, pa pored web hostinga daju i DNS hosting svojim klijentima.

Podešavanje nameserver-a

Ukoliko zakup domena i hosting nisu uzeti kod iste kompanije potrebno je obavestiti provajdera preko koga smo zakupili domen, koje nameserver-e koristi web prezentacija (vezana za taj domen). Podatke o tim nameserver-ima vam obezbedjuje kompanija koja Vam daje uslugu DNS hosting-a (obično ista kompanija kao za web hosting).

Primer promene nameservera kod namecheap.com

Prvo se izabere domen kojem želimo da promenimo nameservere. Zatim nadjemo gde se definišu “NAMESERVERS” i izaberemo opciju custom. U ponudjenu formu upišemo imena nameservera koje Vam je dala vaša hosting kompanija. Broj nameservera varira u zavisnosti od izbora hosting kompanije.

primer dreamhost name servera

Nakon promene podatka o nameserver-ima potrebno je vreme da se u svim tačkama DNS sistema ažuriraju promene o novim nameserverima, ta operacija može potrajati i do 48 sati.

SAVET:
Ukoliko ste windows korisnik možete “naterati” vaš browser da za odredjeni naziv domena ode na odredjenu IP adresu. Potrebno je naći fajl host, čija putanja je: c:\windows\System32\drivers\etc\hosts i unutar njega dodati liniju koda koja povezuje IP adresu novog hostinga i naziv domena kao na sledećem primeru:
188.93.124.246 www.webprogramiranje.com
Napomena: nakon što napravite izmene u hosts fajlu, potrebno je da izbrišete browser cache i da restartujete browser. Na ovaj način sa našeg kompjutera možemo odmah pristupiti novom hostingu.

Definisanje A zapisa (A record)

Nakon što smo ukazali gde se nalaze serveri sa DNS softverom (nameserver) koji će vršiti konverziju ime domena u IP adresu, potrebno je definisati podatke za konverziju. A zapis (address record) definiše vezu izmedju odgovarajućeg imena domena i IP adrese. A record je za IPv4 dok je AAAA record za IPv6 protokol.

Postupak

Potrebno je ulogovati se na nalog kod DNS provajdera i locirati stranicu gde se definiše A records. Te stranice se obično imaju naziv: DNS Management, Name Server Management, ili Advanced Settings. Potrebno je definisati naziv domena, IP adresu kao i TTL (time to live) vreme. Vreme TTL je trajanje informacija na serveru bez mogućnosti promene tzv keširanje. Obično je ta vrednost 3600s (1h).

A records primer

Definisanje aliasa CNAME

CNAME (engl. canonical name) je glavno ime domena. Definisanje aliasa (zamenskog imena) za CNAME tzv. setovanje CNAME zapisa nam daje mogućnost da domen zovemo pored defaultnog naziva i nekim drugim imenom. Takvo zamensko ime dobija sve osobine originala, uključujući i IP adrese i poddomene. Najčešća primena je da naš domen www.webprogramirnje.org možemo da pozovemo samo sa webprogramiranje.org.

cname

Mail hosting (Mail Exchange)

Mail hosting predstavlja iznajmljivanje email servera i njegovih usluga. Većina web hosting kompanija u sklopu svoje ponude za web hosting uključuje u cenu i uslugu mail hosting-a. Mail hosting najčešće podrazumeva mail uslugu na bazi POP3 protokola i webmail uslugu baziranu na nekoj od opensource aplikaciji (Horde, RoundCube ili SquirrelMail)

MX zapis

MX zapis (engl. mail exchange record) definiše koji su sve e-mail servisi nadležni za prihvatanje mail poruka kod odredjenog domena. Osnovna funkcionalnost ovog mehanizma je pružiti mogućnost da postoji više e-mail servisa za jedan domen i da se definiše tačan redosled prema kojem kontaktiraju. Time se na jednostavan način omogućava usmerivanje maila (engl. mail routing) preko SMTP protokola (Simple Mail Transfer Protocol), kao i mogućnost raspodele opterećenja između više servisa. MX zapis se koristi ukoliko želite da vam email bude vezan za poddomen (na primer mail.mojdomen.rs).

Prvo je potrebno da definišemo vezu izmedju našeg podomena mail.webprogramiranje.org i IP adrese naših servera, stog ćemmo definisati A zapis

A records mail

Zatim da definišemo MZ zapis:

mx zapis

Nakon definisanja MX zapisa potrebno je do 48h da bi se DNS serveri ažurirali.

Kontrolu MX setovanja Vašeg domena možete proveriti na sledećim linkovima:


JSON (format za razmenu podataka)

JSON opšte

JSON (JavaScript Object Notation) je jedan od lakših tekstualnih otvorenih standarda dizajniran za čitljivu razmenu podataka. Ekstenzija datoteke s podacima u JSON-ovom formatu je .json, dok je meta oznaka (MIME format) application/json.

JSON je format koji polako zamenjuje XML jer ima nekolicinu prednosti u odnosu na XML. JSON ne koristi tagove pa stoga ima kraći kod koji je lakši za pisanje i razumljiviji za čitanje. Mada je najbitnija prednost JSON-a u odnosu na XML je ta što se JSON parsira kroz standardnu JavaScript funkciju dok se XML parsira kroz XML parser.

Continue reading…


Web servisi (osnove)

Šta su web servisi?

Web servis je aplikacija smeštena na nekom serveru, koja je pored osnovne namene dizajnirana da podrži interakciju izmedju dve mašine preko mreže i omogući razmenu informacija izmedju njih. Smatra se da je svaki servis i web servis ako je:

  • Dostupan preko interneta ili (interne mreže)
  • Koristi stadndardizovan sistem poruka
  • Prepoznatiljv je od strane mehanizma za pretragu
  • Nije vezan za operativni sistem ili programski jezik
Pretraga web servisa

Web Servisi se objavljuju na jedinstvenoj lokaciji gde se nude kao usluge. UDDI (Universal Description, Discovery and Integration) predstavlja centralizoanu lokaciju koja obezbeđuje mehanizam za registrovanje i pronalaženje Web servisa. UDDI koristi SOAP za komunikaciju i omogućava klijentima da pronađu servis, kao i serveru da ga objavi.

Servisi mogu biti zatvoreni (privatni) ali i javno dostupni. Listu javno dostupnih servisa možete pogledati na više sajtova:

Opis web servisa

Web servisi imaju mogućnost da opišu sebe, a za opis servisa se koristi WSDL (eng. Web Service Description Language). WSDL je napisan XML-om i sadrži informacije gde se web servis nalazi i koji protokol za komunkaciju koristi.

Saradnja sa GUI aplikacijom

Web servisi u saradnji sa GUI aplikacijom su nešto izmedju web i desktop aplikacije. Web servis na serveru daje funkcionalnost i podatke a desktop aplikacija samo daje prilagodljivi grafički interfejs koji popunjava sa dobijenim podacima od servisa. Web servis u saradnji sa GUI aplikacijom je fleksibilniji od web aplikacije jer korisnik može da prilagodi izgled aplikacije na klijentu dok korisnik web aplikaciie mora da koristi web browser i nema uticaja na to kako će aplikacija izgledati na ekranu.

Prednosti u odnosu na web aplikaciju:
  • Štedljiviji su po pitanju opterećenja mreže i resursa servera jer pri komunikaciji šalju samo odgovor dok web aplikacije pored odgovora šalju i HTML sa formom i opisom kako ogovor treba da bude prikazan. Web servisi su idealni su za “male” uredjaje koji nisu PC tj. mobilne Pocet PC… jer je na takvom uredjaju instalirana samo front-end aplikacija a teži deo se odradjuje na serveru.
  • Lakši su za razvoj, testiranje i održavanje. Kod Web aplikacije pored neophodne funkcionalnosti je potrebno istestirati i dizajn na svim browserima i platformama dok kod web servisa autor brine samo o funkciji dok o prikazu brine klijentska aplikacija.

klijent server

Kod servisa se komunikacija odvija izmedju klijenta i servera tako što klijent pošalje zahtev serveru koji onda server taj zahtev primi i obradi ga pa u odnosu na njega formira odgovor koji zatim pošalje nazad klijentu. Klijent-server stil arhitekture odvaja problematiku dve strane komunikacijskog kanala, što znači da klijentsku stranu uopšte ne zanima način čuvanja informacija na serveru jer uvijek postoji uniforman način pristupa tim resursima. S druge strane, server je nezavisan od klijenta i ne zanima ga kako je implementirano korisnički interfejs niti u kojem je stanju pojedini klijent, čime je serverska strana znatno pojednostavljena. Ovime je postignuta njihov nezavisnost i lakše razdvojeno razvijanje obe strane, odnosno moguće je npr. unaprediti serversku stranu ili potpuno izmeniti njegovu logiku, a da klijent to uopšte ne primieti dok god je način pristupa resursima isti.

Šta je API?

Da bi se ostvarila komnikacija izmedju dva sistema potrebno je da imaju “tačku” za kontakt, tzv. interfejs. Interfejs je posrednik (veza) pri komunikaciji izmedju dva odvojena sistema koji zajedno rade i može biti:

  • Hardverski interfejs (npr. volan, gas i menjač su “tačke pristupa vozilu” i predstavlju posrednika između automobila i osobe koja upravlja sa njim)
  • Programski interfejs tzv. “API” koje predstavlja “tačke pristupa” pri komunikaciju izmedju dva programa

Rad sa servisima podrazumeva da se resursima pristupa na udaljenom serveru (pristup je putem interenet mreže), ovakva mrežna komunikacija sa sobom donosi problem pristupa i prenosa složenih struktura podataka kao i same organizacije resursa na serveru. Programeri su tokom vremena kreirali komunikaciju izmedju dva programa na razne načine tj. pravli različite tipove API-ja ali su u jednom trenutku standardizovali način komunikacije tj. napravili su skup pravila koja mrežne aplikacije trebaju pratiti pri medjusobnoj komunikaciji (npr. jedan od takvih standardizovanih api-ja je “REST API”).
Ono na šta moramo obratiti pažnju je da kada se jednom definiše API i pusti u “promet”, u slučaju da je nakon nekog vremena potrebno napraviti izmene, nije pametno menjati do sada postavljene “end point-e” jer bi bilo u najmanju ruku neljubazno prisiljavati potrošače API-ja da menjaju već izradjene programe da bi se prilagodili na promenu. Kada se napravi promena uvek treba težiti da nastavite s podrškom za postojeća svojstva (end point-e), a da za promene dodate nova svojstva umesto menjanja postojećih.

Continue reading…


Mrežni protokoli (osnove)

OSI referentni model

OSI referentni model (eng. Open Systems Interconnection Basic Reference Model) je apstraktni opis arhitekture mreže. OSI referentni model se sastoji od sedam različitih nivoa apstrakcije.

Slojevi Jedinica Protokoli
Aplikacija
Mrežni procesi vezani za aplikaciju
Podatak HTTP, HTTPS, FTP, SSH, DNS, SMTP
Prezentacija
Enkripcija i kodiranje podataka
Podatak MIME SSL TLS
Sesija
Uspostavljanje sesije krajnjih korisnika
Podatak RPC, PAP, SCP
Transport
Veza, pouzdanost, transport
Segment
Datagram
TCP, UDP
Mreža
Logičko adresiranje i rutiranje
Paket IP, ICMP, ARP, RARP
Sloj veze
Fizičko adresiranje, pristup medijumu
Frejm (Okvir) PPP, HDLC, Frame Relay
Fizički sloj
Transmisija signala
Bit Token Ring
IEEE 802.11

Continue reading…