C++ pokreće Joint Strike Fighter
Verovatno ste čuli za Joint Strike Fighter(JSF). Cilj projekta je da se napravi borbeni avion koji bi objedinio potrebe sva tri roda vojske. Bilo je nekoliko emisija o razvoju ovog aviona na kablovskim kanalima. Ono što verovatno niste znali, je da je softver koji pogoni ovaj avion pisan u C++u. Za one hardcore C++ programere, ovde se nalazi dokument standarda kodiranja, koji koristi razvojni tim. Embeded sistemi, ugrađeni u ovakav avion, zahtevaju real-time izvršavanje(zamislite posledice u suprotnom), te su na primer, izuzeci(exception) i upotreba operatora new standardom zabranjeni.
Međutim, ovo priča nije toliko dokaz o upotrebljivosti i mogućnosti široke primeni C++a, koliko je dokaz da je vojska digla ruke od jezika Ada. Čime je, praktično, ozvaničena smrt Ade. Na širem planu, ovo nas podseća na nešto još važnije. Da koliko se god trudili prethodnih decenija da kvalitativno unapredimo postupak razvoja, uvek bi dolazili u ćorsokak. Rezultati su bili samo kvantitativna poboljšanja, merena jednocifrenim faktorom. Formalna specifikacija. Verifikacija i validacija. Transformacioni razvoj. CASE alati i generisanje koda. Sva čuda softverskog inženjerstva su bila tu, ali rezultati nikada nisu zavredili veću pažnju. Sve te tehnike gotovo da nikada nisu videle širu primenu. Opet smo se vratili na početak. Na C++, kakav god on bio. Bolje, izgleda, nemamo.
No da što kraće pokušam da zaključim celu priču. Mnogi će izgleda morati da pročitaju taj „No silver bullet“. Razvoj softvera je ipak inherentno složen proces. Rešenje problema nećemo ugledati skorije. Iskren da budem, mislim da rešenje nećemo nikada ni naći. Možda zato što ovaj problem i nema rešenje.
Pravi programeri znaju C ?!
Nekada je najveća dilema studenata bila: „Da li treba da naučim C?“. Oni manje iskusni dolazili bi kod svojih iskusnijih kolega sa ovim pitanjem. Čini mi se, nažalost, ovo pitanje danas više niko i ne postavlja. Nekada je C bio stvar prestiža, a danas na onoga ko zna C gledaju kao na budalu, koja je protraćila par godina svog života. I da budem potpuno jasan. Kada kažem C, mislim tada na kombinaciju C/C++. I imam potpuno jasan odgovor. Pravi programer mora da zna C! Tačka. Oko ovoga nema rasprave. Ne zato što ga ja znam, već iz jedinog dobrog razloga koga mogu da se setim. C nema nikakvu zamenu.
Za one koji ne veruju meni, zanimljivo je šta kaže jedan poznati bloger. O onima koji ne znaju C:
- They don't really know what a pointer is.
- They're not even using a real compiler! That thing they're using doesn't even generate native code you know. It's "byte code", so it's not real.
- Those people have never had to manage their own memory.
- In fact, they've never really had to do anything at all. I mean really. They're building on a class library that's got more features in it than Photoshop.
Ne znam koliko su ovi argumenti objektivni. Niti znam koliko je ovo značajno za vas. Ali sa sledećim zapažanjem mogu samo u potpunosti da se složim:
- All of the truly extraordinary developer s I know are people who really understand the kind of low-level details that C forces you to know.
- Every programmer without C experience has a clear path of personal development: Learn C. Get some real experience using C to write a serious piece of software. Even if you never use it again, you'll be a better programmer when you're done.
I možda ono najbitnije na kraju: Furthermore, I'll admit that knowing C is not a magic solution to poor skills. A lousy developer who happens to know C is simply better equipped to hurt himself or somebody nearby. Ili na prostom srpskom: „Od lošeg programera, C će napraviti još goreg“. Jednostavno za neke nema nikakve pomoći. Osim možda da promene profesiju…
Zaštita i sigurnost informacija
Naslov možda ne prija uhu, ali svi znaju o čemu se radi. Gotova svi imaju svest koliko je ovo bitna tema. Međutim, bez obzira na važnost ovog pitanja, problem bezbednosti je najčešće zanemaren. Retko gde ćete imati priliku da učite o sigurnosti računarskih sistema. Svi akademski kursevi posvećeni su algoritmima, programskim jezicima(čitaj Java) ili teorijskom računarstvu. Ovu temu, obično i sami programeri poznati po samoukosti, ostavljaju za kasnije, što obično bude nikada. U tom pogledu, imao sam sreće da u prošlom semestru izučavam ovu materiju, i hteo to ili ne upoznam se sa nečim što čini pismenost jednog programera.
Problem bezbednosti je izražen posebno danas, u uslovima poplave Web aplikacija, od kojih je dabar deo ranjiv još „iz aviona“. U kombinaciji sa gomilom aljkavih programera, rezultati su potencijalno katastrofalani. Verovatno da jedino lenjost sprečava zlonamernike da učine više štete.
Da li je sistem siguran?
Prvo pitanje koje pada na pamet. Kao i obično, pitanje bez dobro dogovora.
Ovo nije problem koji bi mogao da bude rešen nekim matematičkim aparatom. Ne postoji instrument koji može da kaže da li je neki sistem siguran ili ne. Kao što ne može da se kaže da li neki program ima ili nema grešaka. Nejasno je da li strogo formalno, uopšte i možemo da definišemo šta je siguran sistem. Najbolje je na ovaj problem gledati kao na jedan inženjerski problem, i uvesti nešto manje strog kriterijum, sa pitanjem da li je sistem dovoljno siguran. Jedino dovoljno dobro rešenje je osloniti se na dobru praksu i skup već oprobanih metoda.
Sa ekonomskog aspekta može da se govori i o prihvatljivom nivou rizika. Kako nisam ljubitelj, a nadam se ni drugi, ekonomskog pogleda na stvari, ostavimo tu temu za neki drugi put…
Napadi i pretnje
Prosto rečeno, napad je bilo koja akcija koja ugrožava sigurnost informacija. U [1] se kaže:
U osnovi, napadi su akcije koje su usmerene na ugrožavanje sigurnosti informacija, računarskih sistema i mreža. Postoje različite vrste napada, ali one se generalno mogu klasifikovati u 4 različite kategorije.
Tako autori navode sledeće kategorije napada:
- Presecanje ili prekidanje
- Presretanje
- Izmena
- Fabrikovanje
Da bi se napad uopšte dogodio, sistem mora da ima određenu ranjivost(vulnerability), koja može da se iskoristi(eksploatiše) sa ciljem kompromitovanja sistema. Ranjivost može da nastane na više načina. Kao posledica greške u dizajnu, kao posledica greške ili previda u poslovnim pravilima ili kao posledica programerske greške(ko je rekao prekoračenje bafera). Na taj način, svaki potencijalni protivnik sa namerom i kapacitetom da iskoristi određenu ranjivost i situacija koja može da dovede do napada, predstavljaju pretnju po sistem.
Na osnovu pretnje, mogućnosti da se pretnja realizuje i materijalnog gubitka koji bi na taj način nastao, može da se izračuna i rizik. Zatim, na osnovu rizika može da se kreira i strategija ili plan rešavanja ili ublažavanja pretnje. No, ekonomski aspekti nas ne interesuju u ovoj priči…
Kriptografija
U osnovi svake sigurnosne tehnike ili servisa obično leži kriptografija. Bruce Schneier je na pitanje šta je to kriptografija dao sledeći jednostavan odgovor:
Ako uzmem pismo, zaključam ga u sef, sakrijem taj sef negde u Njujorku, a zatim vam kažem da pročitate pismo, onda to nije kriptografija. Sa druge strane, ako uzmem pismo i zaključam ga u sef, a zatim vam dam taj sef, njegovu projektnu dokumentaciju i stotinu identičnih sefova sa njihovim šiframa, a vi i dalje ne možete da otvorite sef i pročitate pismo, to je kriptografija.
Osnovni zadatak kriptografije je proučavanje kriptografskih algoritama, ili svima poznato, algoritama šifrovanja. Današnje šifre svoju moć zasnivaju na nečemu što se zove ključ(nije uvek tako, Cezarova šifra). Nasuprot kriptografiji, kriptoanaliza ima zadatak da na osnovu šifrovanog teksta odredi početni tekst ili ključ koji je korišćen. Kriptologija obuhvata zajedno kriptografiju i kriptoanalizu.
Postoje dve osnovne vrste šifara sa ključem. Simetrične i asimetrične šifre. Simetrične šifre, poznate i kao šifre sa tajnim ključem, koriste jedan te isti ključ i za šifrovanje i za dešifrovanje podataka. Simetrične šifre mogu da rade bit po bit(bajt po bajt) sa ulaznim podacima, kada se nazivaju šifre toka, ili sa blokovima podatka, kada se kaže da su to blokovske šifre. Asimetrične šifre, koje se još zovu i šifre sa javnim ključem, koriste dva različita ključa. Javni i privatni ključ. Poruka se šifruje javnim ključem, a zatim je dešifrovanje moguće jedino privatnim ključem.
U zavisnosti od toga na koji način šifra obrađuje ulazne podatke, razlikuju se supstitucione i transpozicione šifre. Supstituciona šifra svaki element(slovo) ulaza, zamenjuje nekim drugim(ne uvek istim) elementom. Kod transpozicionih šifara, elementi ulaza ostaju isti, ali im se menja raspored.
Jednosmerne heš funkcije
Jednosmerne funkcije nisu same algoritmi šifrovanja, ali su sastavni deo gotovo svih šifara. To su funkcije koje je relativno lako izračunati, ali jako teško naći inverznu funkciju. Lako je razbiti prozor, ali gotovo je nemoguće od komadića sastaviti prvobitni oblik. Da li „prave“ jednosmerne funkcije u matematičkom smislu postoje, ne zna se niti postoji dokaza za to. Primenjena kriptografija koristi jedan poseban oblik jednosmernih funkcija. Jednosmerne heš funkcije. Heš funkcija za ulaznu, originalnu poruku, daje vrednost fiksne dužine, nazvanu heš. Na taj način, dobija se digitalni „otisak prsta“ originalne poruke. Kako ove funkcije ulaznu poruku preslikavaju u vrednost fiksne dužine moguće je da postoje dve različite poruke koje imaju jednaku heš vrednost. Očigledno je da ove funkcije nisu bijekcije, te da nisu ni prave jednosmerne funkcije. Međutim njihov rezultat je dovoljno dobar za primenu u kriptografiji. Naime, ako je heš dužine 160 bita, tada je verovatnoća da dve poruke imaju jednaku heš vrednost jednaka 1:2^160.
Da bi se uspostavio siguran komunikacioni kanal između dva računara, potreban je nekakav sigurnosni protokol. Jedan takav protokol, koji dodaje sigurnost u TCP/IP model, je dobro poznati SSL – Secure Socket Layer. Konkretno SSL nudi:
- Privatnost. Sve poruke između dva računara šifrovane su simetričnom šifrom.
- Proveru identiteta. Identitet obe strane može da se proveri(klijent i server).
- Pouzdanost. Protokol proverava integritet poruka.
Funkcionalno SSL se sastoji iz dva protokola: SSL Handshake-a i SSL Record-a. Handshake uspostavlja sigurnu sesiju između dve strane. Identifikuje računare, bira konkretan protokol za šifrovanje i razmenjuje ključ sesije kojim će nadalje biti šifrovane sve poruke. SSL Record obavlja samo šifrovanje komunikacije. Posebna snaga ovog protokola ogleda se u tome što se sam ključ sesije, koji razmenjuju dve strane, šifruje javnim ključem. Sa druge strane relativna brzina proizilazi iz činjenice da se za komunikaciju koristi simetrična šifra.
Najpoznatija primena SSL-a je HTTPS protokol. Uistinu HTTPS nije novi protokol, već je to stari obični HTTP, koji kao komunikacioni kanal koristi SSL.
Zaključak
Kako su neke teme ostale nedorečene u jednom od prethodnih tekstova, da pokušam da sada budem potpuno jasan. Ako želite da učite o ovakvim stvarima, upišite FIT. Ako želite efikasno, brzo, i studiranje koje vam daje praktično i upotrebljivo znanju, upišite FIT. Ako hoćete da učite o pravom programiranju, i da vas uči ekipa sjanih profesora i asistenata, upišite FIT. Uzgred, imao sam priliku da mi jedan od dole potpisanih autora knjige bude profesor…
[1] Sigurnost računarskih sistema i mreža, Mikro Knjiga 2007, Dragan Pleskonjić, Nemanja Maček, Borislav Đorđević, Marko Carić
[2] Primenjena kriptografija, prevod drugog izdanja, Mikro Knjiga 2007, Bruce Schneier
Relative vs. absolute path
Nije mi jasno kada će, oni koji do sada to nisu, da shvate da u feed ne mogu da idu relativne putanje. Ako ste primetili da u nekim agregatorima nema slika u Vašim tekstovima, već se pojavljuju precrtani kvadratići, odgovor leži ovde:
ExplanationSome RSS elements are allowed to contain HTML, including links and images. However, if these links use relative URLs to point to resources, users of some news aggregators will not be able to click on them. And your images use the relative URLs, the images may not appear (since the news aggregator will be looking for the images locally on the user's hard drive, rather than on your web site).
Znači ne može:
već samo:
Heroku: Rails u brauzeru
Prosto rečeno, Heroku je Rails razvojno okruženje u pretraživaču(jel sad bolje?). Nešto preciznije, Heroku je kompletna, web zasnovana, code/deploy/run platforma za Rails aplikacije. Ili, sve na jednom mestu. To znači da nove Rails aplikacije kreirate kroz web interfejs. Tako napravljene aplikacije možete da menjate kroz IDE u samom brauzeru. Kako sam skeptičan po pitanju složenijih web aplikacija, ovaj IDE je prevazišao moja očekivanja. Svakako nedostaju neke napredne opcije kao code completion, ali je editor i pored toga potpuno upotrebljiv. Dovoljan je jedan pritisak na dugme pa da pokrenete ovako napravljenu aplikaciju, koja je odmah dostupna na webu.
Svi drugi aspekti razvoja Rails aplikacije su identični. Kao da pišete kod na svojoj lokanoj mašini. Tako imate i pun pristup Rails konzoli, Rake zadacima i logovima aplikacije.
Zanimljivo je i šta se krije ispod haube. Autori Heroku-a kažu da cela platforma leži na Amazon EC2 osnovi. Tvrde da zahvaljujući tome, imate pristup neograničenim resursima i skalabilnosti. Ja sam se malo igrao, i sve ovo izgleda sjajno. Pitanje je samo kako bi se sistem ponašao u realnim uslovima i pod realnim opterećenjem. No za to treba sačekati da Heroku izađe iz beta faze, i da zaživi kao deo neke prave aplikacije.
Zaista sam oduševljen idejom. Ono što je Rails za Ruby, to je Heroku za Rails. U ostalom, probajte sami.
© 2007 Dušan Pantelić. Sva prava zadržana.
From Russia with love, nginx! | FreeCSSTemplates.org




