August 6, 2012

රිවිර අකුරු අවුල්නම් මෙන්න විසඳුමක්

UPDATED
මගේ පරණ post එකට හෝ ගාලා කස්ටිය එනවා රිවර පත්තරේ කියවන්න බෑ අකුරු අවුල් වෙලා කියලා. අකුරු conversion වලදී පොඩි අස්පට් එකක් වෙලා තියෙනවා වගේ තමයි පේන්නේ. තියෙන්න ඕන අකරු නැතුව මඤ්ඤං අකුරු පෙනවානම් මෙන්න විසඳුමක්.
වැඩේට ක්‍රම සහ විදි දෙකක් තියෙනවා.

එක ක්‍රමයක් තමයි :
  1. මුලින්ම මෙන්න මේ item එක right click කරලා bookmark එකක් විදියට save කරගන්න.
  2. රිවිර පත්තරේ වෙබ් අඩවියට ගියාට පස්සේ bookmark එක උඩ click කරන්න.
  3. දැන් වෙඩි වගේ වැඩ ඇති - හැබයි site එකේ එහා මෙහා යන යන සැරේට bookmark එක click කරන්න වෙයි.
මේ ක්‍රමය ඕනෑම browser එහෙක වැඩ කරන්න ඕන - tested on chrome and firefox.

අනික් ක්‍රමය තමයි:
  1. රිවිර වෙබ් පිටුව එක ටැබ එහෙක open කරලා...
  2. මේ item එක ඇදගෙන ගිහින් රිවිර tab එක උඩින් අතාරින්න.
මේ ක්‍රමය chrome වල සහ පරණ firefox version වල වැඩ කරාවි.

ඔන්න code තේරෙන අයට code කෑල්ල. මහා ලොකු magic එකක් මේකේ වෙන්නෑ. Full code එක: https://gist.github.com/4189308/
if (typeof jQuery == 'undefined') {
  var head = document.getElementsByTagName("head")[0];
  var jqsqript = document.createElement('script');
  jqsqript.type = 'text/javascript';
  jqsqript.src = '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js';
  head.appendChild(jqsqript);
}

function addFont() {
  if (jQuery('font').length > 0) {
    var isiabhayastyle = "..see gist..";
    jQuery('head').append('<link rel="stylesheet" href="' +
             isiabhayastyle + '" type="text/css" />');
    jQuery('font[face="Isiabhaya"]').attr('face', 'Isiabhayax');
    jQuery('font[face="IsiBasuru"]').attr('face', 'Isiabhayax');
  } else {
    $("..see gist..").css('font-family', 'Isiabhayax, Arial, Sans-serif');
  }
  jQuery('body').html(jQuery('body').html()
    .replace(/‰/gi, '\u02C6')
    .replace(/Š/gi, '\u02C6')
    .replace(/ƒ/gi, '\u0DC4')
    .replace(/†/gi, 'ළු')
    .replace(/‡/gi, 'ෆ'));
}

function checkjq() {
  var checktimer;
  if (!window.jQuery) {
    checktimer = window.setTimeout(checkjq, 1000);
  } else {
    clearTimeout(checktimer);
    addFont();
  }
}
checkjq();
bookmarklet එකක් කරේ මේ tool එකෙන්: http://chris.zarate.org/bookmarkleter.

August 3, 2011

python වලින් චුට්ටං විතර server එකක් හදමු

python වලින් යම්තම් වගේ වැඩ කරන server එකක් හදන හටි බලමු. GET requests වලට respond කරන HTTP Server එකක් හදන හැටි තමයි මෙදා සැරේ ලියවෙන්නේ. මේ හරහා python වල http - server modules ගැනත් යමක් කමක් දැන ගන්නට ලැබේවීයි සිතමු.
code පෙරවදන 
පහල තියන සියලු script ලියා test කරන ලද්දේ python 2.6 සහිත Debian මැෂිමක බවත්, එම නිසා පහත ඇති සියලු code, python 2.6 - 2.7 version වල අනිවාර්යෙන්මත්, python 3k වල බොහෝ දුරටත් වැඩ කරන බව මුලින්ම සඳහන් කරමි - නැත්නම් 2to3.py script එකට try පාරක් දෙන්න.

නු/සුදුසු shortcut එක
මේ post එක මහ ලොකුවට ලියන්න පටන් ගත්තට python වලින් simple sever එකක් හදන්න මහලොකු වෙලාවක් නම් යන්නේ නෑ. හදිසිකාරයොන්ට ඔන්න ඒ code එක - python ඉතින් තියෙන්නේ හදිසිකාරයොන්ටනේ:

python -m SimpleHTTPServer 8888

දැන් browser එක open කරගෙන http://127.0.0.1:8888 address එකට ගියාම shell එකේ current working direcory එකේ directory listing එකක් පෙන්වයි ලස්සනට, index.html File එකක් තියෙනවා නම් ඒක පෙන්වයි. ඒවාගේම shell එකේ පුංචි පහේ server log එකකුත් dump වෙනවා. අපි මෙදා සැරේ කතා කරන්නේ හදිසිකාරයොන්ට ලියපු ඔය පුංචි code කෑල්ල ගැන නෙමෙයි, ඒ වගේ එකක් අපි ලියන හැටි ගැන. ඕක try කලා වගේ නෙමෙයි

Troubleshoot
python 3k දුවන මැෂිමක උඩ code කෑල්ල වැඩ නොකරන නිසා මේකටත් try පාරක් දෙන්න - python 3k වල සිට සියලුම SimpleHTTPServer, BaseHTTPServer හා තවත් scripts http.server module එකට merge කර ඇති බැවිනි.

python -m http.server 8888

තවත් දෙයක් තමයි code එක run කරලා හොඳට වැඩ කරාට පස්සේ Debian/Linux වල වුන දේ. run කලාම එලකිරි වගේ වැඩ ඒත් server එක නවත්වන්න / port එක close කරන්න keyboard interrupt (Ctrl + C) එකක් හරියන්නේ නෑ. මේ නිසා Linux මැෂිමක ps command එක පාවිච්චි කරලා python process එකේ process ID එක kill command එක පාවිච්චි කරලා stop කරන කම් server එක නතර උනේ නෑ - මේ case එක windows වල මතු උනේ නෑ.

ps
kill -9 PIDNO

ඔන්න එහෙනම් අපේ චුට්ටං විතර http server එකේ code එක
මුලු code එකම එක සැරේ අතෑරලා කිසිදෙයක් තේරෙන්නැති නිසා කොටස් වශයෙන් පෙන්වන්නයි බලාපොරොත්තුව.
මුලින්ම එහෙනම් import කරන module ටික - පහලට කියවන් යන්න කලින් python doc එකේ මේ module ගැන තියෙන විස්තර බැලුවට වරදක් නෑ. sys module එක import කලේ අපිට පස්සේ වෙලාවක sys.argv පාවිච්චි කරන්න ඕන නිසා.
import sys
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
කට්ටිය දන්නවනේ ඉතින් server එකක් කිව්වම GET request, POST request වගේම තව PUT, HEAD වගේ HTTP Server request බර ගානක් තියෙන බව දන්නවනේ. request handle කරන එක තමයි server එක කොරන මහලොකු වැඩේ. දැනටනම් අපේ server එක respond කරන්නේ GET request වලට විතරයි. ඒ නිසානේ චුට්ටං විතර server එකක් කිව්වේ.
පහල තියෙන්නේ අපේ server එක GET request එක handle කොරන method එක.
def do_GET(self):
      afile_path = os.curdir + os.sep + self.path
      try:
            afile = None
            if self.path.endswith('.html') or self.path.endswith('.htm'):
                  afile = open(afile_path, 'r')
                  self.send_response(200)
                  self.send_header('Content-type', 'text/html')
                  self.end_headers()
                  self.wfile.write(afile.read())
            else:
                  afile = open(afile_path, 'rb')
                  self.send_response(200)
                  self.end_headers()
                  self.wfile.write(afile.read())

      except IOError:
             self.send_error(404, 'File not found : %s' % self.path)

      finally:
             if afile: afile.close()
if කෑලි වගයක් දාලා තියෙනවා පේනවා නේද? html හෝ htm files එක විදියකට පාස් වෙන්නත් අනික් ඔක්කොම තව විදියකට පාස් වෙන්නත් තමයි ලියලා තියෙන්නේ. ඔහොම නැතුව ඔක්කොම එක ගොඩේ දැම්මත් එලකිරි වගේ වැඩ ඒත් ...
අපිට පස්සේ දවසක මීලඟ version එකක පුලුවනි වෙනමම extension එකකින් එන ඒව අපිට ඕන විදියට process කරලා pass කරන්න. ඕනනම් PHP code එකක් process කරලා browser එකට තේරෙන html විදියට respond කරන්න පුලුවන්. ඔව්වා පස්සට තියලා ..

අපි main function එක බලලා ඉමු.
def main():
   if len(sys.argv) < 2:
      print('chutton-http-server usage: chutton-http-server.py port')
   else:
      try:
         server = HTTPServer(('localhost', int(sys.argv[1])),ChuttonHandler)
         print('Starting http server on port' + str(sys.argv[1]))
         server.serve_forever()

      except KeyboardInterrupt:
         print(' Shutting down due to Keyboard interrupt')
         server.shutdown()
python වල main එකක් තියෙනවදෝ කියලා කලබවුනා නම් කලබල වෙන්න එපා. පහල තියෙන code එක නිසා තමයි main method එක call වෙන්නේ.
if __name__ == '__main__':
     main()
එහෙන් මෙහෙන් ගිහින් අන්තිමට code එකේ අග්ගිස්සටම ආවා ඕං.

තනිකර code එක
Full code එක බලාගන්න මෙතනට යන්න .

Testing 123
run කරන්න නම් html files එහෙම තියෙන තැනක් shell එකේ current working directory කරගෙන, අපේ python script එකත් එතනට copy කරගෙන, මෙහෙම ගහන්න.
python chutton-http-server.py 8888
chutton-http-server.py කියන්නේ python script එකේ file name එක. 8888 කිව්වෙ port එක.

දැන් මුලින් කරපු shortcut එක වගේම http://127.0.0.1:8888/index.html address එකට ගියාම වැඩේ ගොඩ.

Troubleshoot
URL එක ගහද්දි file name එකත් එක්කම දෙන්න, නැත්නම් 404 එයි. තාම අපේ server එක චූටි බව මතක තියා ගත්තොත් හොඳයි. python 3 පාවිච්චි කරන අයට මෙදා සැරේ 2to3 library එක පාවිච්චි කරන්න වෙයි. ඒකට මගේ සාතිශය සංවේගය බව කරුණාවෙන් සලකන්න.

පසුවදන
බැලූ බැල්මට කිසිදෙයක් තේරුන්නැති උනත් ටිකක් උවමනාවෙන් බැලුවොත් code එක තේරුන් ගන්න ලේසී වගේ. මොනවා වුනත් මේකේ python වල තියෙන object orientation යම්තම් වගේ පාවිච් කරලා තියෙනවා. ඒක code එක අවබෝධයට පුරස්නයක් නොවේවායි හිතනවා. ඉතුරු python scripts හෝ වෙනත් දෙයක් සමඟින් නැවත හමුවෙමු.
ආ.. තවත් දෙයක් post එකෙන් යමක් කමක් දැනගත්තානම්, මේ අලුතින් blog එකට දාපු google plus one share පාරක් දැම්මොත් නරකම නෑ - button එක නම් තියෙන්නේ sidebar එකේ උඩම.

July 13, 2011

ඩිංගක් දන්න අයට තව ඩිංගක් python

hello world, variable declarations, data types හා තවත් syntax අමු ද්‍රව්‍ය python වලින් ලියන හැටි පොඩ්ඩක් හොයලා බලමු. මීට කලින් programming කරලා තියෙන අයට තකට තක ගලපන්න පුලුවන් විදියට ලියවුනු python කතාවක් තමයි මේ.
මුලින්ම කියන්න ඕන හරිය
කඩ්ඩෙන් ලියවුනු මේ tutorial එකත් සලකා බලන්න -- Python in 10 minutes. පහල තියෙන සියලු script, python 2.6+ හා python 3k syntax බව කරුණාවෙන් සලකන්න. පටාන් ගන්න කලියෙන් python interactive shell එක open කරගෙන ඉන්න. python ගැන දන්නෙවත් නැත්නම් පරණ ලිපිය කියවලා හිටියොත් හොඳා.

අපේ විදියට  Hello world ලියමු
Python interactive shell එකේ තමයි අපිට ගොඩක් සෙල්ලම් දාන්න පුලුවන්. ඒක නිසා තමන්ගේ මැෂිමේ හැටියට python shell එක on කරගන්නවා හොඳයි. බොහොමයක් වෙලාවට ඕනම මැෂින් එකක shell එකේ python කියලා type කරාම වැඩේ ගොඩ. මේක '>>>' ඉස්සරහා ඕන දෙයක් කොටලා බලන්න තියෙන්නේ.
ඔන්න බලන්න මම Fedora මැෂිමක ලියලා වෙච්චි දෙයක්.
[user@fedoramachine ~]$ python
Python 2.7.1 (r271:86832, Apr 12 2011, 16:16:18) 
[GCC 4.6.0 20110331 (Red Hat 4.6.0-2)] on linux2
Type "help", "copyright", ....
>>> print('ayubowan')
ayubowan
>>> 1+1
2
>>> 9*9
81
උඩ තියෙන print statement එක පැහැදිලි නැති හින්දා ඔන්න මේක බලාගන්න. C පවුලේ language දන්න අය බලාගන්න ඕන දෙයක්; statement එක අගට තිත්කොමාවක් නෑ - සෙල්ලම් නෑ :) හිතන්න එපා මේ interactive shell එකේ විතරයි තිත්කොමා නැත්තේ කියලා -- python script වලත් එහෙමම තමා.
>>> print('ayubowan')
'ayubowan' කියලා තියෙන්නේ string එකක් කියල ඔය ඇත්තො දන්නවා ඇතිනේ. C පවුලේ භාෂා වල නම් string එක wrap කරන්නේ double quotation mark වලින් වුනාට, python strings මේ පහල තියෙන ඕන විදියකට ලියන්න පුලුවන්. Method call එකේ නම් වෙනසක් නෑ.
>>> print("ayubowan")
ayubowan
>>> # Triple double quotes
>>> print("""Hello crazy world""")
Hello crazy world
ඔය උඩ # (# Triple double quotes) එකක් එක්ක ලියල තියෙන්නේ comment එකක්. අන්න එහෙම තමයි python comments.
Triple double quotes අතරේ තියෙන strings වල newlines එක්කම print කරන්න පුලුවන්. Try එකක් දීලාම බලන්න.
>>> print("""Hello 
         crazy world""")
Hello 
crazy world
variable declare කරන හැටි
කලින් ලිපියේ කිව්ව මතක ඇතිනේ python -- dynamically typed කියලා. ඒ කිව්වේ variable declaration එකේදී type එක define කරන්න ඕන නෑ.
>>> abc = 'abc'
>>> abc = '123'
>>> # type() method returns the type of variable
>>> type(abc)
<class 'str'>
>>> # a different type for same old abc
>>> abc = 456
>>> type(abc)
<class 'int'>
තවත් data types ටිකක් -
>>> mbool = True
>>> type(mbool)
<class 'bool'>
>>> mfloat = 100.001
>>> type(mfloat)
<class 'float'>
>>> mnull = None
>>> type(mnull)
<class 'NoneType'>
- boolean True එකේ T capital -- False නුත් ඒවගේමයි
>>> 1 == 2
False
- null / undefined වෙනුවට None

Variable එක්ක පොඩි පොඩි සෙල්ලම්
++ / -- operator එක වෙනුවට += / -= operator එකම තමයි පාවිච්චි කරන්නේ
>>> j = 99
>>> j += 1
>>> j
100
+= operator එකේ අනිත් language එක්ක වැඩි වෙනසක් නෑ
>>> i = 20
>>> i += 30
>>> i
50
>>> abc = "Hello"
>>> abc += " wewa"
>>> abc
'Hello wewa'
වෙනස් වූ data type දෙකක් එකතු / operate කරද්දී
>>> num = 20
>>> abc = '40'
>>> type(abc)
<class 'str'>
>>> num + abc
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    num + abc
TypeError:
 unsupported operand type(s) for +: 'int' and 'abc'
>>> # cast abc to int
>>> int(abc) + num
60
ඔය (උඩ) තියෙන විදියට තමයි type cast කරන්නේ python වල int(abc)
Cast වෙන්නෝන ( / ප්‍රතිඵලය වෙන) data type එකේ class constructor එකට cast කරන්න ඕන variable type එක පාස් කරනවා.
Java වල (මට මතක විදියට) මේ code කෑල්ලේ අවුලක් නැති වුනත් -

System.out.println("Hello " + 123);

Python කියන්නේ Java නෙමේ නේ ඒ නිසා -
මෙහෙම කියලා python අතාරින්න එපා පාවිච්චියේදී තේරෙයි අගය
>>> print("Hello "+ 123)
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    print("Hello "+ 123)
TypeError: 
  Can't convert 'int'' object to str implicitly
>>> print("Hello " + str(123))
Hello 123
Lists සහ Dictionaries
අපි සාමාන්‍යයෙන් arrays කියන ඒවාට Python වල නම් යොදා තිබෙන්නේ Lists කියලා.
Dictionaries නම් Java වල hash tables වගේ - [ key -- value pairs ]
>>> # the backslash helps to break 1 line to 2
>>> # it's not anything with list syntax
>>> justalist = ['a string', 123 \
      , 'with numbs' , ['and other', 'objects']]
>>> type(justalist)
<class 'list'>
>>> dir(justalist)
අන්තිමට ලියලා තියෙන dir(justalist) කියන එක ඔය ගොල්ලන්ගේ shell එකෙත් අනිවාර්යෙන්ම කොටලා බලන්න.
ඕක කරන්නේ පාස් කරන object එකේ ඇතුලේ තියන methods list එකක් shell එකට dump කරනවා. මේනිසා හැමතිස්සෙම source code සහා documentation වල පිටු පෙරලපෙරල බලන්න ඕන නෑ. අපි වගේ අයට ඕක ගොඩක් වටිනවා.
ඒවගේම තවත් වටින දෙයක් තමයි මේ පහල තියෙන්නේ
>>> justadict = {'name' : 'value can be anything', 'key-is-a-string' : 123}
>>> type(justadict)
<class 'dict'>
>>> help(dict)
help( [class name උදා: dict] ) දැම්මම තනික‍ර explanation එකක් එනවා ඒ class එක ගැන. අනිවා මේකත් පොඩ්ඩක් shell එකේ කොටලා බලන්න.
ඉගෙන ගන්නා අපිට ගොඩක් උදවු වෙන මේ dir method එකයි help method එකයි linux shell එකේ ls command එකයි man command එකයි වගේ.
මේ help method එක එහෙම දුවන්නේ කලින් ලිපියේ කියපු auto documentation වලට උදවු වෙන docstring නිසා බව කියමින්, මේ ලිපියෙන් යම්තම් සන්තම් හෝ දෙයක් ඔබ දැන ගත්තායැයි පතමින්, අදට අහවර කරන්නයි මේ ලෑස්තිය.

methods, control statements සහ loops ගැන කතාකිරීමට පසුවට තබමින් help සහ dir methods දෙක පාවිච්චියෙන් python ගවේෂණය ඔබට භාර කරමින් අදට නවතිමි.