Thursday, April 21, 2016

Information security - part 1

Security කියනකොට ඕන කෙනෙක්ගේ ඔලුවට එකපාරටම එන්නේ ආරක්ෂාව, ආරක්ෂණය වගේ දෙයක්. අපි හැම වෙලාවේම ආරක්ෂා කරන්න බලන්නේ අපිට වටිනා වැදගත් දේවල්. මෙතැනදී මම කියන්න යන්නේ පරිගණක භාවිතයේදී, තොරතුරු හුවමාරු කරන විට සහ සන්නිවේදන කටයුතු වලදී භාවිතා වන ආරක්ෂණ ක්‍රම ගැන.
ඔයා නිතරම පරිගණකය භාවිතා කරන, අන්තර්ජාලය (Internet) භාවිතාකරන කෙනෙක්නම් පරිගණක වෛරස (computer viruses) ගැන අහල ඇති. සමහර විට ඒවා ඔයාගේ පරිගණකයට ඇතුල්වෙච්ච අවස්ථාත් ඇති. ඒවගෙන් බේරෙන්න සමහරවිට ප්‍රතිවෛරස මෘදුකාංග (antivirus software) පාවිච්චි කරනවත් ඇති. වෛරස පරිගණකයට එන්න පුලුවන් ක්‍රම ගොඩක් තියනවා. ඒවා අතරින් අන්තර්ජාල භාවිතයෙන් සහ දත්ත හුවමාරු කරගන්න පාවිච්චි කරන pen drives වගේ උපකරණ වලින් වෛරස පැතිරීමේ අවදානම වැඩියි. ඒ නිසා අඩුම ගානේ නොමිලේ download කර install කරගන්න පුලුවන් antivirus software එකක්වත් පාවිච්චි කරන එකෙන් මේ අවදානම අඩු කරගන්න පුළුවන්. හැබැයි මතක ඇතුව update කරන්නත් ඕන. නැත්තන් අලුතෙන් එන වෛරස හදුනා ගන්ඩ antivirus එකට බැරී වෙනවා.
හැබැයි information security වලට බලපාන්නේ මේ වෛරස් විතරක් නෙමේ. අපේ පරිගණක වල තියන වැදගත් ලිපිගොනු වගේ දේවල් අපේ දැනුවත් වීමකින් තොරව වෙන පුද්ගලයන් හොරෙන් ලබාගන්ඩ හැකියාව තියනවා. අනෙක් එක තමයි කව්රුවත් ගත්තේ නැති උනත් අපි පාවිච්චි කරන දත්ත ගබඩා කරන උපකරණ (data storage media) නිසි ප්‍රමිතියකට නැති උනොත් හරි අපි හරි විදියට පාවිච්ච් කරේ නැත්තන් හරි අපේ දත්ත විනාශ වෙන්න පුළුවන්.
යම් පරිගණකයක් හෝ පරිගණක පද්ධතියක් ආරක්‍ෂිත (secured) නම් තියෙන්න ඕන අත්‍යවශ්‍ය අංග 3ක් තියනවා. මේ අංග CIA Triad කියලත් හදුන්වනවා.

Confidentiality
            මේකෙන් කියන්නේ දත්ත/තොරතුරු වල රහස්‍ය භාවය නැත්නම් විශ්වසනීය භාවයි. උදාහරණයක් විදියට බැංකුවක් ගත්තොත් එකේ computer system එකේ බැංකුවත් එක්ක ගනුදෙනු කරන අයගේ account numbers, visa cards වල pin numbers වගේ දේවල් තියනවා. අනෙක් දේ තමයි ගොඩක් අය internet එක හරහා තමයි දැන් ගණුදෙනු කරන්නේ. එතකොට ඒ අයගේ usernames, passwords වගේ ඒවා අනික් users ලට පෙනුනොත් හරි ඒවා ඕන කෙනෙකුට දැනගන්න පුලුවන් උනොත් හරි එතන රහස්‍ය භාවය නැති වෙලා තියනවා. ඒක නිසා තොරතුරු දැනගැනීමේ අයිතිය ඊට අදාල පුද්ගලයන්ට (authorized parties) පමණක් ලබා දිය යුතුයි. ඒක නිසා රහස්‍ය භාවය (confidentiality) ඉතා වැදගත්.

Integrity
            මේකෙන් කියන්නේ දත්ත/තොරතුරු වල නිරවද්‍ය භාවයයි. කලින් උදාහරණයේ බැංකුව සමග අන්තර්ජාලය හරහා ගණුදෙනු කරන කෙනෙක් ගත්තොත් තමන්ගේ savings account එකේ details බලද්දී තියෙන මුදල් ප්‍රමාණය වගේ දේවල් වැරදියට පෙන්නුවොත් වගේ දෙයක් උනොත් අන්න එතන නිරවද්‍ය බව නැති වෙලා තියනවා. එක නිසා නිරවද්‍ය බවත් (integrity) වැදගත් වෙනවා.

Availability
            මේකෙන් කියන්නේ එම පරිගණක පද්ධතිය අවශ්‍ය වෙලාවට පාවිච්චි කිරීමට ඇති හැකියාවයි. ඉහත උදාහරණයම ගත්තොත් ඉහත කරුණු දෙකම තිබුනත් අවශ්‍ය වෙලාවට අන්තර්ජාලය හරහා ඒ පුද්ගලයාට ගණුදෙනු කිරීමට ඉඩ දෙන්නේ නැත්නම් හෝ හැම වෙලාවේම system එක crash වෙනවානම් එම පරිගණක පද්ධතියෙන් නිසි ප්‍රයෝජනය ගන්න බැරී වෙනවා. ඒක නිසා availability කියන දේ සැහෙන්න වැදගත් වෙනවා.
ඉතින් මේ දේවල් ඇති වෙන විදියට පරිගණකයක් හෝ පරිගණක පද්ධතියක් ආරක්ෂා කරගන්න පාවිච්චි කරන ක්‍රම ගැන මම ඊළඟ ලිපියෙන් කියන්න බලාපොරොත්තු වෙනවා.


Wednesday, April 20, 2016

Phases of Compiler

Programming කරන අයගෙනුත් ඉතා සුළු පිරිසක් තමයි අපි program එකක් ලියල compile කරල run කලාම machine එක ඇතුලෙදි compiler එකෙන් මොකක්ද වෙන්නේ කියල දන්නේ ඉතින් මම අද කියන්ඩ යන්නේ අපි source code එකක් run කලාම එකට machine එක ඇතුලෙදි මොකද වෙන්නේ කියල එහෙනම් අපි වැඩේට බහිමු.

මුලින්ම පැහැදිලි කරන්ඩ ලේසි වෙන්ඩ මම code එකට වෙන දේවල් ටික සරලව පැහැදිලිව බලන්ඩ පුළුවන් රුපයක් පහලින් දාන්නම් එක මුලින්ම හොදට බලන්ඩකෝ.ඊට පස්සේ බලමු මේ එකින් එක මොකද වෙන්නේ කියල.


Lexical Analyser 

මුලින්ම අපි ලියපු source code එක යන්නේ lexical analyzer හරහා මේක හරහා යන source code එකේ තියන wide space , comments එහෙම නොසලකා හැරල source code එක tokens වලට වෙන් වෙනවා දැන් කට්ටිය බලනවා ඇති මොනවද මේ tokens කියල tokens කියන්නේ සමුහයක් විදිහට එකතු කරල ගත්තම මොකක් හරි තේරුමක් තියන වචන අනුපිලිවලකට.දැන් අපි උදාහරණයක් අරගෙනම බලමු මේ ක්‍රියාවලිය වෙන්නේ කොහොමද කියල.

Ex :-                      newvalue = oldvalue + rate * 60

මෙන්න මේ tokens ටික හදන්නේ lexical analyzer එකෙන් තමයි.

Syntax Analyser

මෙන්න මෙතැනදී තමයි අපි ලියපු program එකට අදාල parse tree එක හැදෙන්නේ දැන් කට්ටිය බලනවා ඇති parse tree කියන්නේ මොකක්ද කියල එක ටිකක් ලොකු කතාවක් ඒකනිසා ඒගැන වෙනම post එකකින් කතා කරන්නම් දැනට මේ කියන්නේ මොකක්ද කියල තේරුම් ගන්ඩ පොඩ්ඩක් පැහැදිලි කරල දෙන්නම්.

ඕනෑම භාෂාවක් ගත්තම අපි එක පාවිච්චි කරන්නේ මොකක හරි grammar එකකට අදාලව ඒ කිව්වේ නීති රීති වලට අනුකුලව ඉතින් programming language එකක් ගත්තත් එකේ වෙනසක් නැ අපි ඒක පාවිච්චි කරන්නේ grammar එකකට අනුව ඉතින් parse tree කියන්නේ අන්න ඒ grammar එක නිරුපනය කරන්ඩ අදින tree එකකට කියල දැනට මතක තියාගන්ඩ. parse tree එකකින් program එකක syntactic representation එක තමයි අපිට නිරුපනය කරන්ඩ පුළුවන් ඒ කිව්වේ හරියට grammar use කරලද කියන එක. හරි දැන් අපි බලමු lexical analyzer එකෙන් හැදුන tokens එකතු කරගෙන syntax analyzer එකෙන් ඉහත උදාහරණයට අදාල parse tree එක හැදෙන්නේ කොහොමද කියල.

syntax analyzer එකෙන් මෙන්න මේ tree එක හදල ඉතුරු වැඩ වලට semantic analyzer එකට බාරදෙනවා.

Semantic Analyzer

දැන් syntax analyzer එකෙන් program එක grammatically correct කරල තියෙන්නේ ඉතින් semantic analyzer එකෙන් කරන්නේ program එකේ ලියල තියන දේවල් meaningful ද කියල බලන එක (Semantically verify). මේක තේරුම් ගන්ඩ English වල example එකක් දෙන්නම් එතකොට හොදට තේරෙයි.
  • snake is mammal. (grammatically correct උනාට meaningful නැ)
  • snake not mammal is. (grammatically correct නැ වගේම meaningful නැ)
  • snake is a reptile.(grammatically correct වගේම meaningful) 

දැන් තේරෙනවා නේද semantically verify කරනවා කියන්නේ මොකක්ද කියල.



Intermediate Code Generator(ICG)

නමින්ම තේරෙනවනේ මෙතන මොකක්ද වෙන්නේ කියල මෙතැනදී intermediate code එකක් generate වෙනවා දැන් අපි බලමු මොකක්ද මේ කියන code එකේ වැදගත්කම කියල දැන් අපි මෙතනට එනකන් කතා කරපු හැම step එකක්ම platform independent කියපු එක තේරුනේ නැ නේද ඒ කිව්වේ හිතන්දකෝ අපිට ඕනි අලුතින් compiler එකක් design කරන්ඩ කියල එහෙමනම් අපිට මුල ඉදලම design කරන්ඩ ඕනි නැ මෙතන step එකට එනකම් ඕනිම compiler එකක් සමානයි අපි අලුතින් design කරන්ඩ ඕනි මෙතනි එහෙට තියන step ටික විතරි.
මෙන්නේ මේ ICG එකේ තවත් වැදගත් කම් ටිකක තියනවා මම අ ටිකත් කෙටියෙන් කියන්නම් එකක් තමි intermediate code එක හදාගත්තට පස්සේ target program එකට translate කරගන්ඩ ලේසියි ඒවගේම තමයි මේක නිසා memory efficient ඒ කිව්වේ memory ඉතුරුකරගන්ඩ පුළුවන් මොකද මේකෙන් අපිට පුළුවන් උසේ කරන්ඩ පුළුවන් අවම memory addresses ගැන වෙනකන් program එක අඩු කරගන්ඩ.දැන් බලමු ඉහත උදාහරණයට හැදෙන intermediate code එක මොන වගේද කියල.

එක එක වර්ගයේ intermediate code තියනවා ඒ උනාට ගොඩක් තැන්වලදී වගේම මෙතනදීත් අපිට ඇවිත් තියෙන්නේ 3 address code එකක් එකේ තේරුම තමයි හැම expression එකකම use වෙලා තියෙන්නේ address 3 විතරයි. ඔය හේතුව නිසා තමයි මම කිව්වේ මේකෙන් memory efficient වෙනවා කියල එතකොට ඕනිම program එකක් registers 3 විතරක් use කරල run කරගන්ඩ පුළුවන්. මෙතනට එනකන් step ටිකට අපි කියනවා front end කියල මෙතනින් එහාට තියන step ටිකට අපි කියන්නේ compiler phase වල back end එක කියල.

Code Optimiz

මෙකෙන්නම් එච්චර ලොකු වැදගත් දෙයක් වෙන්නේ නැහැ මේකෙන් වෙන්නේ intermediate code generator එකෙන් හැදුන code එකේ වැඩිපුර line තියනවනම් ඒවා ඓන් කරල code එක optimize කරන එක.මේ සේරම කරල අවදානයට බාරදෙන්නේ code generator එකට.

Code Generator 

මෙතනට optimize වෙලා ආපු code එක එකට සමාන machine language එකට translate වෙන එක තමයි වෙන්නේ.ඊට අමතරව තවත් වැදගත් වැඩ කීපයක් මෙතැනදී වෙනවා ඒවා තමයි.
  • program එක run වෙන්ඩ අවශ්‍ය data structure එක create කරන එක.
  • program එකේ උසේ වෙන variable වලට අවශ්‍ය memory location select කරනවා.

ඔන්න ඔහොම තමයි අපි program එකක් ලියල run කරහම අ program එකෙන් අපිට ඕනි කරන දේ වෙනකන් process වෙන්නේ හිතනවා හැමෝටම තෙරුම්යන්ඩ ඇති කියල වැරදි තියෙන්ඩත් පුලවන් එහෙම වැරද්දක් තියනවා දැක්කොත් comment එකක් දාල support එකක් දෙන්ඩ එහෙනම් තවත් post එකකින් හමුවෙමු හැමෝටම ජය වේවා .....!!!!!

Tuesday, April 19, 2016

Algorithms පිළිබද හැදින්වීමක්

සරලවම  Algorithm එකක් කියන්නෙ ක්‍රියා පටිපාටියක් නැත්නම් ක්‍රියාපිලිවලක්. අපි එදිනෙදා මුහුණදෙන ගැටලු විසඳා ගැනීමට ගන්න පියවර වගේ algorithms භාවිතා කරලා ඕනැම problem එකක් solve කරන්න පුලුවන් පියවරෙන් පියවර.

අපි ගැටලු විසදන විදි ගොඩක් තියනවා. සමහරු හොඳට හිතලා බලලා ඒකට සුදුසුම විදිහට විසඳුම් හොයනකොට තවත් පිරිසක් කලබලවෙලා ඉක්මන් විසඳුම් හොයනවා. මේ වගේම තමා එක එක විදිහේ algorithms තියනවා. සමහර  algorithm වලින් optimal solutions එක හොයගන්න පුලුවන් ඒවට කියනව optimal algorithms කියලා, සමහර algorithm වලින් quick solutions ගන්න පුලුවන් අපි ගොඩක් වෙලවට ඉක්මන් විසඳුම් හොයනවා කියල කරන්නෙ තමන්ට වාසි වෙනවා කියල පේන විසඳුම තොරගන්න එක එ විදිහේ algorithm වලට කියනවා greedy algorithms කියලා. ඒවගේම තමා තවත් සමහර ප්‍රශ්න විසඳන්න අපි අපේ අත්දැකීම් උදව් කරගන්නවා. ඒවගෙ අවස්තා වලදී අපි කරන්නෙ ස්වභාවික සිදුවීම් එක්ක අපේ අත්දැකීම් මිශ්‍ර කරල අපිට අවශ්‍ය solution එක ගන්නවා. ඒවගේ algorithms වලට කියන්නෙ genetic algorithms කියලා. මේ වගේම තවත් ගොඩක් algorithm වර්ග තියනවා. ඒ එක එක algorithm types වලින් problems solve කරන විදි ඉදිරි ලිපි වලිදි කියන්නම්.

අපි බලමු කොහොමඳ computer science එක්ක algorithm සම්බන්ධ වෙන්නෙ කියලා. Computer Science කියන්නෙ programming විතරක් නෙමෙයි. තාක්ෂණය බාවිතා කරමින් ගැටලු විසදීම , මිනිසගේ දියුණුව සඳහා තාක්ෂණය යොදා ගැනීම වගේ දේවලුත් ඒකට  අදාළ වෙනවා. ගොඩක් වෙලවට අපි තාක්ෂණය උපයෝගී කරගන කරන්නෙ අපේ එදිනෙදා කාර්යයන් පහසුවෙන් කරගන්න ක්‍රම හදගන්න එක වගේ දේවල් තමයි.

 සාමාන්‍ය මිනිසෙකුට මොකක්හරි ගැටලුවක් ආවම එයාට ඒ ගැටලුව ගැන කල්පනා කරලා තේරුම් ගැනීමේ හැකියාවක් තියනවා. ඒත් computer එකට එහෙම තේර්ම්ගැනීමේ හැකියාවක් නැහැ. ඒක නිසා algorithm භාවිතා කරලා අපිට අවශ්‍ය instruction set එක හඳුනාගෙන එවා පියවරෙන් පියවර computer එකට ලබාදුන්නාම අපිට අවශ්‍ය  solution එක ගන්න පුලුවන්. මේක තමා සරලවම සිදුවෙන්නේ.