Python வழு நீக்கம் – PDB Debugging

ஆசிரியர்: லிசா டாக்லியபெரி,

தமிழாக்கம்: முத்து அண்ணாமலை.

This article is a translation of tutorial article on PDB from DigitalOcean; இந்த கட்டுரை ஏற்கனவே வெளியீடான பயிற்சி கட்டுரை தமிழாக்கம் ஆகும்.

சுருக்கம்: பல சமயங்களில் நாம் எழுதிய நிரல்கள் நமது எண்ணம் போல இயங்குவதில்லை; இதை சரிசெய்ய திக்குத்தெரியாத காட்டில் தேவை ஒரு வழு நீக்கி என்ற செயலி; பைத்தான் மொழியில் இது pdb – இதன் செயல்பாடு சில சிறப்பம்சங்கள் பற்றி இங்கு பார்க்கலாம்.

கணினி துறையில் நிரலராக (programmer) செயல்படுவதில் ஒருவரி முக்கியாமாக பெற்றுக்கொள்ளும் திறமை வழுநீக்கம் – அதாவது debugging. விளையாட்டாக பேசுகையில் வழுநீக்கம் என்பதன் ஆங்கில சொல்லின் பகுதி-விகுதிகளை பிரித்துப்பார்த்தால், அது புழு/பூச்சி நீக்கம் என்றும் அசட்டுத்தனமாக இருக்கும். இதனை வேடிக்கையாக இப்படி ஒரு படத்தில் அந்தகாலத்து கணினியில் காட்டினார்கள்!

Computer Bug

தொடர்வது லிசா எழுதிய https://www.digitalocean.com/community/tutorials/how-to-use-the-python-debugger இந்த 2017-ஆம் ஆண்டு கட்டுரையின் தமிழாக்கம்.

அறிமுகம்

கணினி உருவாக்கம் மற்றும் கட்டமைப்பில் வழுநீக்கம் என்பது கணினி செயலியின் தவறான/பிழையாக இயங்கும் இடங்களை மூல நிரலில் தேடிக் கண்டறிந்தும் பின் அவ்வகையான பிழைகளை நீக்கம் செய்யும் படிநிலை செயல்பாட்டிற்கு அளிக்கப்படும் பெயராகும்.

பைத்தான் மொழியில் pdb என்ற ஒரு வழு நீக்கி செயலி உள்ளது; இது python மொழியில் எழுதிய நிரல்களுக்கு ஒரு வழுநீக்கம் செய்யும் சூழலை அளிக்கிறது. pdb மூலம் நிபந்தனை நிறுத்தங்கள் (conditional breakpoints), வரிவரியான கண்காணிப்பு இயக்கம் (stepping through the source code one line at a time), அடுக்கு கண்கானிப்பு (stack inspection), என பல வைகயான உத்திகளைக்கொண்டு நிரலின் இயக்க நிலைகளை காணமுடிகிறது.

pdbஐ படிப்படியாக பயன்படுத்துதல்

பைத்தான் மொழியில் தரப்படுத்தப்பட்ட ஒரு நிரல்தொகுப்பு (module) வழியாக இந்த pdb வழுநீக்கி நமக்கு கிடைக்கிறது. இந்த Pdb வழுநீக்கியையே நீட்சி செய்து நாம் ஒரு நிரல்கூட எழுதலாம்க். pdb பற்றிய மூல ஆவணத்தை இங்கு படிக்கலாம்.

pdb பற்றி கற்றுக்கொள்ள நாம் ஒரு சின்ன நிரலின் வழுநீக்கம் வழியாக கற்றுக்கொள்ளலாம்; இந்த நிரலில் இரு பொதுவெளி மாறிகள் (global variables), ஒரு நிரல்பாக சார்பும் (function) அதனுள் உள்ள அடுக்கு மடக்கு வாக்கியமும் (loop), இவை அனைத்தையும் தொடங்கிவைக்கும் if __name__ == '__main__': என்ற நிரல்தொடக்க நிபந்தனையும் (அதாவது சார்பு nested_loop() என்பதை தொடக்கிவிடும்) வகையில் அமைந்தது இந்த நிரல் looping.py

num_list = [500, 600, 700]
alpha_list = ['x', 'y', 'z']

def nested_loop():
    for number in num_list:
        print(number)
        for letter in alpha_list:
            print(letter)

if __name__ == '__main__':
    nested_loop()

பைத்தான் வழுநீக்கம் என்பதை நமது நிரலில் தொடங்க இவ்வாறு கட்டளை அளிக்க வேண்டும்:

python -m pdb looping.py

இந்த -m என்ற flag பைத்தான் moduleஐ ஒரு நிரலாக இயக்க வழிசெய்யும். மேல் கண்டபடி கட்டளையிட்டால் நமது நிரல் (looping.py) பைத்தான் வழு நீக்கியான pdb-யினைக்கொண்டு அதன் கண்காணிப்பில் இயங்கும்.

மேல்கண்ட கட்டளை இயங்கியதும் இவ்வறு வெளியீடை காணலாம்:

Output> /Users/sammy/looping.py(1)<module>()
-> num_list = [500, 600, 700]
(Pdb) 

இதில், முதல் வரியில் (அதாவது <module> என்ற வரி) நிரல் கோப்பின் இருப்பிடம், மற்றும் நிரலின் இயங்கும் வரி (இங்கு முதல் வரி இயங்குகிறது). ‘->’ என்ற குறியிடின் அடுத்து வரும் வரி நிரலின் தற்சமயம் உள்ள இயக்கப்புள்ளியைச் சேர்ந்த வரியாகும். வழு நீக்கியின் திறன்கள் மற்றும் கட்டளைகளை பற்றி கற்றுக்கொள்ள  help <கட்டளை>  என்று கட்டளையின் பெயரை pdb shell-இல் இட்டு அந்த கட்டளையினைப்பற்றி குறிப்பாக கற்றுக்கொள்ளலாம். pdb கட்டளை திறை என்பதும் பைத்தான் console என்பதும் வெவ்வேரான விஷயங்கள் என்பதை கருத்தில் கொள்ள வேண்டும்.

pdb வழு நீக்கி நிரலின் இருதியில் மீண்டும் தொடங்கும் வகை கட்டமைக்கப்பட்டது; இதில் இருந்து வெளியேர quit அல்லது exit என்று கட்டளையிடவேண்டும். மேலும் நிரலின் ஏதேனும் குறிப்பிட்ட வரியில் இருந்து இயக்கத்தை தொடர வேண்டும் என்றால் run என்ற கட்டளையை pdb வழுநீக்கியால் செலுத்தலாம்.

வழு நீக்கியில் நிரல் இயக்கத்தை கண்கானித்தல்

pdb கட்டளைகளான list, step, மற்றும் next உங்களது நிரல் இயக்கத்தை கண்கானிக்கலாம். இந்த கட்டளைகளைப்பற்றி விரிவாக இந்த பத்தியில் பார்க்கலாம்.

pdb shell அதனில் list என்ற கட்டளையை இட்டால் தற்சமயம் இயங்கும் புள்ளியின் வரியின் சுற்றத்தில் உள்ள வரிகளை பார்க்கலாம்.  உதாரணமாக looping.py நிரலின் முதல் வரியின் சுற்றத்தில் — num_list = [500, 600, 700] — இப்படி வெளியீடு அளிக்கும்:

(Pdb) list
  1  -> num_list = [500, 600, 700]
  2     alpha_list = ['x', 'y', 'z']
  3     
  4     
  5     def nested_loop():
  6         for number in num_list:
  7             print(number)
  8             for letter in alpha_list:
  9                 print(letter)
 10     
 11     if __name__ == '__main__':
(Pdb) 

‘->’ என்ற குறியிடின் அடுத்து வரும் வரி நிரலின் தற்சமயம் உள்ள இயக்கப்புள்ளியைச் சேர்ந்த வரியாகும்.

நமது இந்த நிரல் சற்று சிறிதாக உள்ளதால் முழு நிரலையும் list கட்டளை இங்கு அளித்துவிடுகிறது. சராசரியான பயன்பாட்டில் list கட்டளை 11 வரிகளையும் முழுதாக வெளியிடுகிரது; ஆனால் list 3, 7 வரிகள் 3-இல் இருந்து 7-வரை மட்டும் வெளியிட வேண்டுமெனில் கீழ்கண்டபடி கட்டளையிடவும்: list 3, 7

(Pdb) list 3, 7
  3     
  4     
  5     def nested_loop():
  6         for number in num_list:
  7             print(number)
(Pdb) 

செயலியின் இயக்கத்தை நிரல் வரிகளில் ஒவ்வொரு வரியாக அலசுவதற்கு step அல்லது next கட்டளைகளை பயன்படுத்தலாம்; உதாரணம்:

(Pdb) step
> /Users/sammy/looping.py(2)<module>()
-> alpha_list = ['x', 'y', 'z']
(Pdb) 

(Pdb) next
> /Users/sammy/looping.py(2)<module>()
-> alpha_list = ['x', 'y', 'z']
(Pdb) 

step என்ற கட்டளைக்கும் next என்ற கட்டளைக்கும்  வித்தியாசமானது step என்பது சார்புகள், நிரல்துண்டுகளை கடக்கும்பொழுது அது நிறுத்தம் அடையும், ஆனால் next கட்டளை சார்புகளை முழுதாக இயகிய பின்னரே அதனை அடுத்த வரியில் சென்று நிற்கும்.

step கட்டளை மடக்கு வாக்கியங்களில் படிபடியாக ஒவ்வொரு வரியிலும் நிறுத்தி இயக்கத்தைக் காட்டும்; இதனைக்கொண்டு மாறிகளின் மதிப்புகள், மாறிகளை அச்சிடுவது, print(number), என்றும் letter என்றதை அச்சிடுவதும் print(letter), return number என்ற வரியை செயல்படுத்துவதையும் பார்க்கலாம்.

(Pdb) step
> /Users/sammy/looping.py(5)<module>()
-> def nested_loop():
(Pdb) step
> /Users/sammy/looping.py(11)<module>()
-> if __name__ == '__main__':
(Pdb) step
> /Users/sammy/looping.py(12)<module>()
-> nested_loop()
(Pdb) step
--Call--
> /Users/sammy/looping.py(5)nested_loop()
-> def nested_loop():
(Pdb) step
> /Users/sammy/looping.py(6)nested_loop()
-> for number in num_list:
(Pdb) step
> /Users/sammy/looping.py(7)nested_loop()
-> print(number)
(Pdb) step
500
> /Users/sammy/looping.py(8)nested_loop()
-> for letter in alpha_list:
(Pdb) step
> /Users/sammy/looping.py(9)nested_loop()
-> print(letter)
(Pdb) step
x
> /Users/sammy/looping.py(8)nested_loop()
-> for letter in alpha_list:
(Pdb) step
> /Users/sammy/looping.py(9)nested_loop()
-> print(letter)
(Pdb) step
y
> /Users/sammy/looping.py(8)nested_loop()
-> for letter in alpha_list:
(Pdb)

ஒரு முழு சார்பு/நிரல்பாத்தினை next கட்டளை வழியாக செயல்படுத்தலாம் – இது படிநிலை இயக்கம் இல்லாமல் குறிப்பிட்ட சார்பினை முழுதாக கடந்து செல்லும். வழு நீக்கியை விட்டு வெளியேற exit கட்டளையிடவும். அதன்பின் மீண்டும் வழுநீக்கியை தொடங்கவும்:

python -m pdb looping.py

இப்பொழுது next கட்டளையின் செயல்பாடை காணலாம்:

(Pdb) next
> /Users/sammy/looping.py(5)<module>()
-> def nested_loop():
(Pdb) next
> /Users/sammy/looping.py(11)<module>()
-> if __name__ == '__main__':
(Pdb) next
> /Users/sammy/looping.py(12)<module>()
-> nested_loop()
(Pdb) next
500
x
y
z
600
x
y
z
700
x
y
z
--Return--
> /Users/sammy/looping.py(12)<module>()->None
-> nested_loop()
(Pdb)  

உங்கள் நிரலை வழு நீக்கி  மூலம் ஆராய்ச்சி செய்யும் பொழுது ஒரு மாறியின் மதிப்பை கண்டுபிடிக்க pp என்ற கட்டளையை கையாளவேண்டும்; இது pretty-print, அழுபடித்து அச்சிடு என்ற செயலின் ஆங்கில சொற்றொடரின் சுறுக்கமாக pp என்றபடி அமைத்தது; இதன் செயல்பாட்டின் வழியாக மாறியின் மதிப்பை ஒரு pprint  மோட்யூல் வழியாக அச்சிடும். உதாரணம் நமது தற்சமயமாக கையாளும் நிரலின் வழி இதைக்காணலாம்.

(Pdb) pp num_list
[500, 600, 700]
(Pdb) 

pdb இல் உள்ள பல கட்டளைகளுக்கும் முழு கட்டளை பெயரை இடாமல் சற்று குறுகிய வடிவில் (shortcut) தட்டச்சு செய்யலாம்; break என்பதற்கு b, step என்பதற்கு s, next என்றால் n என்றும் எழுதலாம். இதற்குமுன் இட்ட கட்டளை மருஇயக்கம் செய்ய ENTER என்ற விசை தட்டினால் போதும்.

நிறுத்தங்கள் (Breakpoints)

பல நூறு எண்கள் கொண்ட ஒரு நிரலினை வரிவரியாக இயக்கியும் ஆலோசனைசெய்யலாம் ஆனால் அதற்கு ஒரு முழு நாள் போய்விடும்; இதனை தவிற்க்கவும், நிரலினில் உள்ள சுவாரசியமான புள்ளிகளை மட்டுமே அலசுவதற்கு break என்ற கட்டளையைக்கொண்டு நிறுத்தப்புள்ளிகளை செயல்படுத்தலாம். அதாவது அவ்வபோது குறிப்பிட்ட நிறுத்தப்புள்ளிகளின்வரை இயக்கம் தொடர்ந்து செல்லும்.

நிறுத்தப்புள்ளிகளுக்கு pdb 1-இல் தொடங்கியவாரு முழு எண்களை (கூடும் வரிசையில்) குறியீடாக வைத்திருக்கும்; ஆகையால் நிறுத்தப்புள்ளிகளை முழு எண்கள் கொண்டும் குறிப்பிடலாம்.

நிறுத்தப்புள்ளிகளைக் குறிப்பிட <நிரல் கோப்பு>:<வரி எண்> என்றபடி குறிப்பிடலாம்:

(Pdb) break looping.py:5
Breakpoint 1 at /Users/sammy/looping.py:5
(Pdb)

கட்டளை clear என்று அளித்து அதன் கேள்விக்கு y என்றும் அடுத்து உள்ளீடு செய்தால் வழு நீக்கியில் அனைத்து நிறுத்தங்களும் அழிக்கப்படும். அடுத்து எங்கு வேண்டுமானாலும், தற்போது ஒரு சார்பின் தொடக்கத்தில் நிறுத்தம் இடலாம்:

(Pdb) break looping.nested_loop
Breakpoint 1 at /Users/sammy/looping.py:5
(Pdb) 

வழு நீக்கியில் அனைத்து நிறுத்தங்களும் அழிக்க கட்டளை clear என்று அளித்து அதன் கேள்விக்கு y என்றும் அடுத்து உள்ளீடு செய்தால் . நிறுத்தம் என்பது நிபந்தனைக்கு இனங்க செயல்படவும் செயற்படுத்தலாம் – உதாரணம்:

(Pdb) break looping.py:7, number > 500
Breakpoint 1 at /Users/sammy/looping.py:7
(Pdb)     

ஒரு நிறுத்தப்புள்ளியில் இருக்கும் பொழுது continue (தொடர்) என்ற கட்டளையை கொடுத்தால், நிபந்தனை மெய்யாகும் வரை அந்த நிறுத்தப்புள்ளி செயல்தவிர்க்கப்படும் – அதாவது இங்கு number என்ற மாறி 500-க்கும் கூடுதலான வகையில் இயங்கும் வரை அது செயல்படாமல் இருக்கும் (வேறு வகையில் சொல்லவேண்டுமானால் number என்ற மாறி 600 என்ற மதிப்பை வெளி மடக்கின் இரண்டாம் சுற்றில் பெரும் பொழுது இந்த நிறுத்தப்புள்ளி செயல்படும்):

(Pdb) continue
500
x
y
z
> /Users/sammy/looping.py(7)nested_loop()
-> print(number)
(Pdb) 

pdb-இல் உள்ள நிறுவப்பட்ட நிறுத்தப்புள்ளிகளை பார்க்க ‘break’ என்ற கட்டளையை அளிக்கவும்:

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /Users/sammy/looping.py:7
    stop only if number > 500
    breakpoint already hit 2 times
(Pdb) 

disable என்ற கட்டளையைக்கொண்டு ஒரு நிறுத்தப்புள்ளியை செயல்தவிர்க்கலாம்:

(Pdb) break looping.py:11
Breakpoint 2 at /Users/sammy/looping.py:11
(Pdb) disable 1
Disabled breakpoint 1 at /Users/sammy/looping.py:7
(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep no    at /Users/sammy/looping.py:7
    stop only if number > 500
    breakpoint already hit 2 times
2   breakpoint   keep yes   at /Users/sammy/looping.py:11
(Pdb) 

enable என்ற கட்டளையைக்கொண்டு ஒரு நிறுத்தப்புள்ளியை செயல்பாட்டிற்கு கொண்டுவரலாம்; clear என்ற கட்டளையினால் நிறுத்தப்புள்ளியை அழித்துவிடலாம்.

(Pdb) enable 1
Enabled breakpoint 1 at /Users/sammy/looping.py:7
(Pdb) clear 2
Deleted breakpoint 2 at /Users/sammy/looping.py:11
(Pdb) 

pdbயின் நிறுத்தப்புள்ளிகள் வழியாக நிரல் இயத்தின் மீது அதிகளவு கட்டுப்பாடு கிடைக்கிறது. நிறுத்தப்புள்ளிகளில் கூடுதல் செயல்பாடுகளானவை, ignore என்ற கட்டளை – இது நிறுத்தப்புள்ளியினுடன் இணைக்கப்பட்ட இணைசெயல்கள்/நிரல்துண்டுகளை அழித்துவிடு; அதேபோல் command என்ற கட்டளை நிறுத்தப்புள்ளியினுடன் சேர்ந்த இணைசெயல்கள்/நிரல்துண்டுகளை குறிப்பிட உதவும் – எ.கா. ‘command 1’ என்று தொடங்கி இணைசெயல்களைக் குறிப்பிட்டு முடிந்தபின் ‘end’ என்று முடிக்கலாம். மேலும் ‘tbreak’ என்ற கட்டளை ‘temporary break’ என்றதன் சுருக்கமாக முதன்முறை மட்டும் நிறுத்தப்புள்ளியை செயல்படுத்தி இரு இயக்கத்தில் பிடிபட்டபின் ‘clear’ என்ற கட்டளையை இதே நிறுத்தப்புள்ளிக்கு தானாக செலுத்திவிடும் தன்மை உடையது; ‘tbreak 3’ என்பது நிரலின் மேலே இயக்கப்பட்டது.

உங்கள் நிரல்களில் pdb-ஐ இணைப்பது

உங்கள் நிரல்களில் வழுநீக்கம் தானாக நிரல் செயல்பாட்டின் இடையேயும் தொட்டவைக்கலா; இதனைச்செய்ய pdb module-ஐ இணைத்தும் pdb சார்பான pdb.set_trace() என்ற நிரல்பாகம் குறிப்பிட்டிருக்க வேண்டும்; இயக்கம் இந்த நிரல் வரிக்கு வரும்பொழுது உங்கள் நிரலின் இயக்கத்தினிடையே வழு நீக்கி தொடக்கமாகிவிடும்.

உதாரணமாக, நமது மாதிரி நிரலில் (கீழே கொடுக்கப்பட்டது) import வாக்கியத்தின் மூலம் pdb-யின் set_trace சார்பினை அழைக்கவும். நமது உதாரணத்தில், இந்த வழு நீக்கம் சார்பை அடுக்கு மடக்கு வாக்கியதின் (nested loop) முன் சேர்த்துப் பரிசோதனை செய்யலாம்.

# Import pdb module
import pdb

num_list = [500, 600, 700]
alpha_list = ['x', 'y', 'z']

def nested_loop():
    for number in num_list:
        print(number)

        # வழு நீக்கி இங்கு தொடங்கும்
        pdb.set_trace()
        for letter in alpha_list:
            print(letter)

if __name__ == '__main__':
    nested_loop()

இந்த பத்தியில் காட்டியபடி உங்கள் நிரலில் இருந்தபடியே வழு நீக்கியை இணைத்தால் தனிப்பட்டபடி pdb-ஐ இணைக்கவும் வேண்டாம், நிறுத்தப்புள்ளிகளும் தேவையில்லை.

அதாவது pdb module வழியாக அழைக்கப்பட்ட pdb.set_trace() சார்பு உங்கள் நிரலில் எங்கு இங்குகிறதோ அதே இடத்தில் அந்த நிரல் வழு நீக்கியினில் செயல்படும்.

நிரல் இயக்கத்தை மாற்றுவது

Python pdb கட்டளை jump வழியாக இயங்கும் நேரத்தில் ஒரு நிரலின் இயக்கத்தை திசைமாற்றலாம். இதன் மூலம் ஒரு நிரலில் உள்ள சில நிரல்பாகங்களை முன் – பின் வரிசை மாற்றியும் செயல்படுத்தலாம்.

இந்த பகுதியில் sammy (நிரலில் "sammy") என்ற சரத்தில் உள்ள எழுத்துக்களை ஒரு பட்டியலாக பெருவதற்கு நிரல் எழுதுவோம்: letter_list.py

def print_sammy():
    sammy_list = []
    sammy = "sammy"
    for letter in sammy:
        sammy_list.append(letter)
        print(sammy_list)

if __name__ == "__main__":
    print_sammy()

python letter_list.py என்று இயக்கினால், இந்த வெளியீடை பார்க்கலாம் (இது நேர்கோட்டான இயக்கம் – எதுவும் மாற்றங்கள் இல்லாமல் இயக்கப்படுகிறது):

Output['s']
['s', 'a']
['s', 'a', 'm']
['s', 'a', 'm', 'm']
['s', 'a', 'm', 'm', 'y']

அடுத்த முறை இதே நிரலை pdb-யின் மூலம் for மடக்கு வாக்கியதின் இரண்டாம் சுற்றை நீக்கி (நேர்கோட்டற்ற இயக்கத்தின் வழி) இயக்கி பார்க்கலாம்:

python -m pdb letter_list.py

> /Users/sammy/letter_list.py(1)<module>()
-> def print_sammy():
(Pdb) list
  1  -> def print_sammy():
  2         sammy_list = []
  3         sammy = "sammy"
  4         for letter in sammy:
  5             sammy_list.append(letter)
  6             print(sammy_list)
  7     
  8     if __name__ == "__main__":
  9         print_sammy()
 10     
 11     
(Pdb) break 5
Breakpoint 1 at /Users/sammy/letter_list.py:5
(Pdb) continue
> /Users/sammy/letter_list.py(5)print_sammy()
-> sammy_list.append(letter)
(Pdb) pp letter
's'
(Pdb) continue
['s']
> /Users/sammy/letter_list.py(5)print_sammy()
-> sammy_list.append(letter)
(Pdb) jump 6
> /Users/sammy/letter_list.py(6)print_sammy()
-> print(sammy_list)
(Pdb) pp letter
'a'
(Pdb) disable 1
Disabled breakpoint 1 at /Users/sammy/letter_list.py:5
(Pdb) continue
['s']
['s', 'm']
['s', 'm', 'm']
['s', 'm', 'm', 'y']

மேல்கண்டதில் வழுநீக்கி வரி 5-இல் ஒரு நிறுத்தப்புள்ளியை இடுகிறது; இதனை அடைந்த பின் letter என்ற மாறியின் சேமிக்கப்பட்ட மதிப்பை அச்சிடுகிறது. அடுத்தபடியாக, pdb கருவியில், jump கட்டளையைக்கொண்டு வரி 6-இல் நேர்கோட்டுக்கு மாறாக இயக்கத்தை வரி 5-ஐ கடந்து செல்கிறோம். அதாவது மாறி letter-ஐ 'a' என்ற மதிப்பு கொண்டுள்ளது ஆனால் இது பட்டியலில் சேர்க்காமல் வரி 5-ஐ தாவி வரி 6-இல் இயக்கம் தொடர்ந்து செல்கிறது.

இதன்பின் வரி 5-இல் உள்ள நிறுத்தப்புள்ளியை செயல்தவிர்த்து பழையபடியே நிரல் உள்ளவடிவில் இயக்கம் முடிவடைகிறது.

அடுத்து நாம் நிரலில் இயக்கம் முடிந்த ஒருவரிக்கு மீண்டும் இயக்கத்தை திருப்பிச் செல்ல jump  கட்டளையைக் கொண்டு முயற்சிக்கலாம். இந்தமுறை for வாக்கியத்தின் முதல் சுற்றை மீண்டும் pdb-யில் இயக்கிப்பார்க்கலாம்.

> /Users/sammy/letter_list.py(1)<module>()
-> def print_sammy():
(Pdb) list
  1  -> def print_sammy():
  2         sammy_list = []
  3         sammy = "sammy"
  4         for letter in sammy:
  5             sammy_list.append(letter)
  6             print(sammy_list)
  7     
  8     if __name__ == "__main__":
  9         print_sammy()
 10     
 11     
(Pdb) break 6
Breakpoint 1 at /Users/sammy/letter_list.py:6
(Pdb) continue
> /Users/sammy/letter_list.py(6)print_sammy()
-> print(sammy_list)
(Pdb) pp letter
's'
(Pdb) jump 5
> /Users/sammy/letter_list.py(5)print_sammy()
-> sammy_list.append(letter)
(Pdb) continue
> /Users/sammy/letter_list.py(6)print_sammy()
-> print(sammy_list)
(Pdb) pp letter
's'
(Pdb) disable 1
Disabled breakpoint 1 at /Users/sammy/letter_list.py:6
(Pdb) continue
['s', 's']
['s', 's', 'a']
['s', 's', 'a', 'm']
['s', 's', 'a', 'm', 'm']
['s', 's', 'a', 'm', 'm', 'y']

இந்த மேல் காட்டப்பட்ட வழுநீக்கத்தில் வரி-6 இல் முதல் நிறுத்தப்புள்ளி இருக்கிறது; இது வரி 5-ஐ கடந்து செல்கிறது. ஆனாலும் வரி 5-ஐ மீண்டும் நாம் இயக்கச்செய்கின்றோம். இதனால் மாறி ‘letter’ இல் உள்ள மதிப்பான 's' இரண்டு முறை பட்டியலில் இணைக்கப்படுகிறது.

pdb-இல் அனைத்து வரிகளுக்கும் jump கட்டளையைக்கொண்டு நகர்த்திச்செல்ல முடியாது; குறிப்பாக, try:except வாக்கியங்கள், finally வாக்கியங்கள் போன்றவற்றின் இடையிலும், இயக்கத்தை தாவிச்செல்ல முடியாது.

அதாவது jump கட்டளையானது pdb என்பதினைக்கொண்டு ஒரு நிரலின் இயக்கத்தினை திசைமாற்றியும் அதனில் உள்ள வழுக்களை முன்னுக்குப்பின் அலசி ஆராய்ந்து புரிதல் செய்ய உதவும்.

பொதுவான pdb கட்டளைகள்

கீழ்கண்டதாவது பொதுவான pdb கட்டளைகள், அவற்றின் சுறுக்கமான வடிவங்கள், மற்றும் கட்டளை செயல்பாட்டினைப்பற்றிய விளக்கங்கள்.  மேலும் விரிவான pdb பற்றிய தகவல்களுக்கு pdb மூல ஆவணத்தை இங்கு படிக்கலாம்.

கட்டளைசுறுக்கம்விளக்கம்
argsaநிரல்பாகம் சார்பின் உள்ளீடுகளை (function arguments) அச்சிடும்
breakbஇயங்கும் செயலியில் ஒரு நிறுத்தப்புள்ளியை உறுவாக்கும்
continuec or contநிரல் இயக்கத்தை நிறுத்தப்புள்ளியில் இருந்து மீண்டும் தொடங்கச்செய்யும்
helphpdb இல் உள்ள அனைத்து கட்டளைகளையும் உதவிக்குறிப்புகளுடன் காட்டும்
jumpjஅடுத்த நிரல் வரி எடு என்பதை நாம் குறிப்பிட உதவும் கட்டளை
listlஇயக்கப்புள்ளியைச்சுற்றி அமைந்துள்ள நிரல் வரிகளை காட்டும்
nextnநிரல் இயக்கத்தை நிறுத்தப்புள்ளியில் இருந்து சார்பின் அடுத்த வரிக்கு அல்லது அதன் முடிவடையும் வரை நகர்த்திச்செல்லும்.
stepsநிரல் இயக்கத்தை நிறுத்தப்புள்ளியில் இருந்து தொடங்கி அடுத்த நெருக்கமான இடத்தின் வரையில் நிறுத்தம் செய்யும்
ppppநிரலின் ஏதேனும் மாறியின் மதிப்பினை அழகாக அச்சிடும்
quit or exitqநிரல் இயக்கத்தை திடீர் என நிறுத்திதம் செய்யும் அல்லது வெளியேரும்
returnrநிரல் இயக்கத்தை நிறுத்தப்புள்ளியில் இருந்து வெளியேறும்
pdb – பொதுவான கட்டளைகள்

முடிவுரை

வழுநீக்கம் என்பது எந்த ஒரு கணினி நிரலாக்க திட்டத்திற்கும் முக்கியமானது. பைத்தான் மொழியில் pdb என்ற ஒரு வழு நீக்கி செயலி மூலம் பைத்தான் மொழியில் எழுதிய நிரல்களுக்கு ஒரு வழுநீக்கம் செய்யும் சூழலை அளிக்கிறது.

வழுநீக்கி அம்சங்கள் வழியாக இயங்கிக்கொண்டிருக்கும் நிரல்களை நிறுத்தி பரிசோதிக்கலாம், மாறிலிகளின் (variables) மதிப்புகளை பார்க்கலாம், மூல நிரலின் வரிகளில் படிப்படியாக செயலியின் இயக்கத்தை பார்க்கலாம், செயலியின் முழு செயல்பாட்டை புரிந்து கொள்ளலாம், இயக்கத்தில் தர்க்கரீதியான பிழைகள் இருப்பதை கண்டுபிடிக்கலாம் அல்லது முன்கூட்டியே அறிந்த வழுக்களை நீக்கம்செய்ய விசாரணைகள் நடத்தலாம்.

அடிக்குறிப்பு: வழு நீக்கம் சம்பந்தமான தொழில்நுட்பத்தினை தமிழில் எழுதும் முதல் கட்டுரைகளில் இந்த கட்டுரை இடம் பெர வேண்டும் என்பது எனது குறிக்கோள்.

எழில் கணினி நிரலாக்கம் – பயிற்சிப்பட்டறை – மீள்பார்வை

2017-இல் ஒரு பயிற்சிப்பட்டறைக்காக உருவாக்கப்பட்ட காட்சிகோப்புகள் – இதனை கணினி நிரலாக்கம் பயிலவேண்டுமானவர்கள் கண்டிப்பாக படிக்கலாம். மத்தபடி இந்த பட்டறை மாநாட்டில் நடந்ததா என்ற கதையை நீங்கள் எனக்கு ஒரு பீர்/காப்பி (இடம்-பொருள்-நேரம்) எல்லாம் பொருத்து கட்டவிழ்த்து விடுகிறேன். அதுவரை பார்த்து/படித்து மகிழவும்.

சில ஆய்வுகள்

“Tamil Vowel Recognition With Augmented MNIST-like Data Set,” https://arxiv.org/abs/2006.08367

சமிபத்தில், கவிஞர் சல்மா வரிகள் போல, எல்லாரும் வௌவால்களா இந்த கொரொனாவினால் நிலைகுலைந்தனர். அவர்களின் நீண்ட பட்டியலில் நானும் ஒருவன் – ஆனால் அதிகளவு பாதிப்பு ஏதுமில்லை – வீடு, வாசல், சோறு, தண்ணி இதுக்கெல்லாம் திண்டாட்டம் இல்லை என்றாலும், இங்கு அமெரிக்க மண்ணில் 20% வேலையிழந்த பலரையும் போல் வேலைக்கு மட்டும் காவுவாங்கிட்டேன்.

சரி. இந்த நேரத்தில் மற்ற சிலபல செயல்கள் முடிவில்லாமல் தொடங்கியதை முடித்துவைக்க சில படிகள் எடுக்க நேரம் கிடைத்தது. மேலோகத்தில் இருப்பவன், என்றும் அதை நப்புபவர்கள், ஒரு கதவை மூடினால் மற்றொரு கதவை திறப்பார் என்றபடியாக இது தமிழ் வெளியில் எப்போதும் நம்மளை கொண்டு சேர்த்தது.

மொத்தம் 3-ஆய்வுகள், பெரும்பாலும், முடிவு பெற்ற நிலையில் இருந்தன; அவையாவன,

கட்டுரை தலைப்பு – PDF கோப்புகள்
1Tamil Vowel Recognition With Augmented MNIST-like Data Set
2Generation and Parsing of Number to Words in Tamil
3Algorithm to Correct Missing ​Pulli​-Signs in Printed Tamil Text
கொரோனா காலத்தில் உண்டாக்கிய ஆய்வுக்கட்டுரைகள்
  1. தமிழ் உயிரெழுத்துக்கள் செயற்கைப்பின்னல் வழியாக திறன்கண்டுகொள்வது. இதை, ஜூன் 2019-இல் தொடங்கிய ஒரு ஆய்வு என்றாலும் இந்த மூன்று கால இடைவெளியில் தான் இன்று முடிவடைந்தது. இதனை ArXiV-இல் கற்பூரம் மீது சத்தியமிட்டாமல் ஏழு நாள் தாமதத்துடன் வெளியானது. தலைப்பு: “Tamil Vowel Recognition With Augmented MNIST-like Data Set,” https://arxiv.org/abs/2006.08367
  2. அடுத்த கட்டுரை “Generation and Parsing of Number to Words in Tamil”, இதை ArXiV ஏற்க மறுத்தது – காரணம் எங்கள் வாசகர்களுக்கு இது சுவாரசியமானதல்ல என்ற சாக்கைச்சொல்லி மழுப்பினார்கள். இதை நான் மற்றொறு மொழியியல் மாநாட்டிற்கு அனுப்பியுள்ளேன் – என்ன விளைவு என்று பார்க்கலாம்.
  3. அடுத்த கட்டுரை “Algorithm to correct missing pulli signs in printed Tamil text,” என்பது [2] போல் அதே கதி. பார்க்கலாம்.
  4. கடைசியாக எழுத நினைத்தது ஆனால் நேரம் கிடைக்கவில்லாமல் போனது என்றால் “தமிழில் சொற்களை ஒலி எண்களாக பிரிப்பது” (Syllable identification) என்பதை bigram/unigram என்ற எழுத்தளவான புள்ளியியல் வடிவில் கொண்டு இவற்றை செயல்படுத்துவது. இதற்கு உங்களுக்கு ஆர்வம் இருந்தால் என்னுடன் இணைந்து செயல்படலாம் வாங்க.

இந்த பேரிடர் காலகட்டத்தில் என்னை அடைக்கலம் கொடுப்பதில் ஒன்று மொழி, மொழியியல் அதில் வசிக்கும், செயல்படும் அஞ்சா நெஞ்சர்கள். இதையும் காலம் கடந்து செல்வோம். உருதுணையாக இருந்தவர்கள் அனைவருக்கும் நன்றி.

-முத்து

குவாண்டம் கணிமை

குவாண்டம் நிலைகள் என்பவை நுன்உலக செயல்பாட்டின் குவாண்டம் விதிகளை கொண்டு அதன் முக்கிய அம்சமான entanglement (நிலை சிக்கல்பாடு) மற்றும் superposition (பல் நிலைப்பாடு) என்ற விதிகளினைகொண்டு புதுவிதமாக பல்னிலைகளை ஒரே நேரத்தில் அனுகும் வகை நிரல்கள்; இவற்றை எழுத முற்படும் தொழில்னுட்பம் குவாண்டம் கணிமை.

இதில் சிந்திக்கவும், இயற்பியல் அறிவினை கணிமையில் கலக்கவும் மாற்றுத்திசையில் சிந்தனைகள் ஊடுறுவவும் செய்வதினால் பல விடைகள் தீராத கணிமை சிக்கல்களுக்கு விடை கிடைக்கும் என்று அறிவியலாளர்களால் எதிர்பார்க்கப்படுகின்றது.

தற்சமயம் 20இல் இருந்து 30 குவாண்டம் பிட்கள் கூபிட் என்ற அளவிலான கணிதங்களை சராசரி கணினியில் பரிசோதனையாகவும் NMR, Ion Trap, SQUID வழிமுறை குவாண்டம் கணினியிலும் செயல்படுத்த முடிகின்றது. இந்த நிலை விரைவில் (சில ஆண்டுகளில்) மாறலாம்.

மேலும் படிக்க பல சுட்டிகள் – https://github.com/desireevl/awesome-quantum-computing

தமிழ் உரை சம்பந்தமான சில புதிர்கள்

தமிழ் செயற்கையறிவு மற்றும் எந்திர வழி உரை பகுப்பாய்வு போன்ற செயல்பாடுகளின் திறன் தினமும் வளர்ந்து கொண்டே போகின்ற சமயத்தில் (செயற்கையறிவு என்ற பேரலையின் முதுகில் பயணிக்கின்றது என்றபடியாக) இவற்றினால் கடக்கவேண்டிய சில புதிர்கள் என்ன (என்பார்வையில்) என்று இந்த பதிவில் அலசலாம்.

  1. இருபால் சமநிலைப்பாடுத்தல் (gender balanced text)
    • அரசாங்கம், வணிக கார்ப்ரேட் நிறுவனங்கள் தினசரி புழக்கத்தில் பல செய்திகள் விளம்பரப்படுத்தலுக்கும், உள்நிறுவன செயல்பாட்டிற்கும் பகிர்ந்துகொள்ள வேண்டியிருக்கும். இத்தகைய செய்திகளில் சில் கேள்விகள் எழுகின்றன:
      • இந்த செய்திகள் முழுவதும் இருபாலினருக்கும் சரிசமமாக பாரபட்சமின்றி எழுதப்பட்டுள்ளதா?
      • இப்படி இல்லாவிட்டால் செயற்கையாக உரைதிருத்தம் செய்து இருபால் சம நிலைப்படுத்தல் செய்யலாம ?
    • உதாரணம்: “பணியாளர் வேலைக்கு வந்தால் அவர் மனைவியிடம் ஒப்புதல் பெற வேண்டும்..” என்ற படி ஒரு உரை இருந்தால் அது சமனிலைப்படுத்தப்பட்டபின்  “பணியாளர் வேலைக்கு வந்தால் அவர் மனைவியிடம் (அல்லது அவள் கணவனிடம், [துனைவன்/வியிடம்]) ஒப்புதல் பெறவேண்டும்” என்று வரவேண்டும்.
    • இத்தகைய ஒரு செயற்கையறிவு அல்லது தானியங்கியிடம் திருக்குறள் மற்றும் சம்காலத்தில் உருவாகாத பழங்கால உரைகளைக்கொடுத்தால் என்ன ஆகும் ?

மேலும் சில திறன்களை தமிழ் இயல்மொழிபகுப்பாய்வு பெரும் என்றும் நம்பலாம்; அடுத்தகட்ட கேள்விகள் / புதிர்கள் அடுத்த பதிவில்.

நன்றி

-முத்து

 

செயற்கையறிவு – சில சுட்டிகள்

மெரிட் ஏரி, ஓக்லாண்டு, கலிபோர்னியா.

இனிய புத்தாண்டு வாழ்த்துக்கள் 2020. செயற்கையறிவு – சில கட்டமைப்பு பயிற்சி சுட்டிகளை இந்த பதிவில் நான் பகிர்கின்றேன். எனது குறிக்கோள் என்னவென்றால் – இதனை படிக்கும் நீங்கள் பைத்தான், numpy, tensorflow என்ற நுட்பங்களையும் கட்டமைப்புகளையும் கையாண்டு செயற்கையறிவு திறண்களை ஒரு ஆண்டில் அல்லது குறைவான காலத்தில் நீங்கள் பெறலாம் என்பதாவது. இவை அனைத்தையும் கற்றிட ஒரு கூகில் கணக்கு மட்டும் இருந்தால் போதும் – அவர்களது colaboratory = code + laboratory என்ற இணைய சேவை மிக உதவிகரமானது – இங்கு பார்க்கவும்.

  1. முதலில் உங்களுக்கு பைத்தான் மற்றும் numpy, அணிகளின் கணிதம் (linear algebra – எனுக்கு மிகவும் பிடித்தவர் பேராசிரியர். கில்பட் ஸ்டிராங்.) ஒருபடியாக தேர்ச்சியடைந்திருந்தால் நல்லது. இல்லாட்டி வருத்தப்படாமல் கூகில் செய்யுங்க; StackOverflow செய்யுங்கள்.
  2. ஸ்டான்போர்டு பல்களை செய்ற்கையறிவு பாடம், மற்றும் tensorflow நிரல் மாதிரிகள். இதனை இயற்றியவர் சிப்னுயன் என்பவள். இதன்வழி நீங்கள் tensorflow கற்றிடலாம். இவற்றின் மூலம் சில ஆண்டுகளாக நானும் படித்து வருகிறேன்.
  3. மேலும் படி 2-இல் சிக்கல் நேர்ந்தால் அல்லது உங்களுக்கு அதிக அளவு விவரங்கள் தேவைகள் இல்லாவிட்டால் Keras என்ற கட்டமைப்பையும் பயன்படுத்திடலாம். இவை இரண்டும் இல்லாத மற்ற கட்டமைப்புகளான PyTorch மற்றும் Caffe, CNTK என்றும் உள்ளன – இவற்றை பற்றி சொல்வதற்கு எனக்கு தேர்ச்சி இல்லை;
    1. உங்களுக்கு படிப்பதற்கு இவற்றில் ஏதோ ஓன்றினை மற்றும் படித்தால் போதுமானது; அதாவது இவற்றினிடையே வித்தியாசங்கள் எல்லாம் குளிர்பானங்களினிடையே உள்ள வித்தியாசங்களினை மட்டும்தான் என்ற்படி உணரவேண்டும்; நீங்கள் இந்த பலவிதமான செயற்கையறிவு கட்டமைப்புகளினிடையே காணமுடியும் என்றும் சொல்லாம்.
  4. தமிழில் ஒரு முதல் முறையாக சென்ற ஆண்டு வெளிவந்த நூல் “எளிய தமிழில் Machine Learning,” கணியம் திருமதி. து. நித்தியா. இதனை கிண்டில் மின்கருவி/செயலி அல்லது PDF-இலும் இங்கு படிக்கலாம்.
  5. எது செய்தாலும் நீங்கள் பயிற்சி நோக்கில் செய்பட எனது வலியுருத்தல். ஏட்டு சுறைக்காய் கறிக்கு என்றும் உதவாது என்றும் நாம் அறிவோம். மேலும் பயிற்சி செய்து சான்றுகள் பெற இணைய வழி பல்கழைக்கழாக்ங்களும் உதவுகின்றன – Coursera, Udacity போன்றவை.

இந்த செயற்கையறிவு நிரல்களை கொண்டு சில 5 ஆண்டுகளுக்கும் முன்பு எவராலும் இயல்முடியாத செயல்களை இந்த செயற்கை நரம்பு பின்னல்கள் (Deep Neural Networks) என்பவை சாத்தியப்படுத்துகின்றன. இந்தியாவில் இதை எழுதும் சமயம் 50% மேலான மக்கள் 30 வதிற்கும் குறைந்தவர்கள் – இந்த வழி திறண்களைக்கொண்டு புதிய சேவைகளையும் பலதுரைகளின் உருவாக்கியும் வழங்கியும் வாழ்வினை செம்மைப்படுத்தலாம்.

உதாரணம்:

  1. தானியங்கி கார்கள்/வாகனங்கள் செயல்படுத்துதல்: Tesla, Waymo, Cruise போன்ற பல நிறுவனங்கள் இவற்றினை செயல்படுத்துகின்றனர்.
  2. கணினி காட்சி அறிவியல்/உணர்தல்: ImageNet என்ற பல மில்லியன் படங்கள் கொண்ட தறவில் இருந்து பயிற்சி செய்யப்பட்ட செயற்கை நரம்பு பின்னல் 1000-வகையான பொருட்களை மனிதர் திறன் காட்டிலும் துல்லியமாகக் கண்டறிய உதவும். இவற்றைக்கொண்டு என்ன செய்யலாம் – யோசியுங்கள் ?
  3. மொழியில் சேவைகளும் NLP கணினியில் செம்மைபடுத்த இவைகள் உதவும்;
    1. மொழி உரை, ஒலி உணர்தல். (Comprehension)
    2. மொழி உரை->ஒலி மாற்றி (TTS)
    3. மொழி ஒலி -> உரை மாற்றி (ASR)

மேலும் பல. நீங்கள் முயற்சி செய்வீர்களா?

-முத்து.

மென்பொருள் வெளியீட்டில் உள்ள சிக்கல்கள்

சமிபத்தில் ஓப்பன் தமிழ் வரிசை எண் 0.95-ஐ பதிவாக்கி வெளியிட்டோம். ஆனால் ஒரு பெரிய சிக்கல் – இது பொது பயன்பாட்டில் வேலை செய்யவில்லை.

ஏன் என்று பார்த்தால் :

1. PyPi – தளம் மேம்பாட்டின்/மாற்றத்தின் காரணமாக reST என்ற படிவத்தில் மற்றுமே நிரல் தொகுப்புகளின் குறிப்புகளை ஏற்றுக்கொண்டவகை ஆனது. நாங்கள் எப்போதுமே MD படிவத்தில் மட்டும் தான் இந்த குறிப்புகளை எழுதுவது வழக்கமானது. ஆனால் reST குறிப்புகளுக்கு கட்டாயப்படுத்தபட்டோம்.

2. PyPi தளத்தில் நிரல்களை வினியோகல் செய்ய setup.py என்ற நிரல் வழி செயல்படுகின்றது. இந்த நிரல் சரிவர இருந்தாலொளிய பயனரிகளின் நிறுவுதல் கட்டளைகள் வேலைசெய்யாது. ஆகவே, ஓப்பன் தமிழ் நிரல் தொகுப்பு.

 

இதன் காரணத்தை இங்கு பார்க்கலாம்:

bug-pypi

அடுத்த கட்டமாக இதனை நிவரத்தி செய்ய, MANIFEST.in கோப்பில் சரியான தகவல்களை மேம்படுத்தியபின் முதலில் எனது கணினியில் பரிசோதித்தபின், 0.96 வரிசை எண்னை PyPi-இல் பதிவு செய்தேன்.

$ python3 setup.py sdist build

$ python3 -m twine upload dist/*

இதனை, நண்பர்கள் சரிவர உள்ளதாவென்று சரிபார்த்தபின் வழு நீக்கமானதை உணர முடிந்தது.

ஆகவே காரணங்கள் என்னவென்றும், சிக்கல்களை உணர்ந்தபின்னும் பல வழிகளில் இவற்றை மறுமுறை தவிர்க்க வழிகளை கண்டிட நேர்கின்றேன்.

1. அடிக்கடி நிரல்களை வெளியிடுவது. (ஏப்ரல் 2019-இல் உள்ள வெளியீட்டிற்கும், இந்த நவம்பர் மாத வெளியீட்டிற்கும் நடுவில் PyPi தளம் மாற்றம் பெற்றது – இதனை சரிவர கண்டிடலாம்)

2. வெளியீட்டின் பொழுது உடணடியாக பரிசோதிப்பது

3. மற்ற பங்களிப்பாளர்களை உடனடியாக பரிசோதிக்க வேண்டிவது.

நன்றி.