மாத்திரை பார்வையில் குறள்

                    ஆசிரியர்: பரதன் தியாகலிங்கம், முத்து அண்ணாமலை

திருக்குறள் 1330 குறட்பாக்களை மாத்திரை பார்வையில் கணினிவழியாக இயல்மொழி ஆய்வு செய்தால் என்ன கிடைக்கும்? திருக்குறளை மாத்திரை மதிப்பின் வாயிலாக வரிசைப்படுத்திப் பார்த்தால் என்ன கிடைக்கும் ? ஏதேனும் புதிய புரிதல் உண்டாகிறதா? பார்க்கலாம் வாருங்கள்.

செய்முறை – அல்கோரிதம்

குறளின் மாத்திரை அளவு என்பது குறளின் உள்ள அனைத்து சீர்பிரிக்காத சொற்களின் தனி மாத்திரை அளவுகளின் சமன்பாடு என்று கொள்ளலாம். இது நமது ஆய்வின் முன்கூட்டிய புரிதல்.

முதலில் இதற்கு ஒரு தமிழில் உள்ள மாத்திரை விதிகளை கணிக்கும் சார்பு தேவைப்படுகிறது. இதனை open-tamil 0.97 தொகுப்பில் ‘tamil.utf8.total_maththirai’ என்ற நிரல்துண்டு வழுங்குகிறது. மேலும் குறட்பக்களை ‘kural.Thirukkural().get_kural_no()’ என்பதிலிருந்து பெரலாம். இரண்டினையும் சேர்த்து ஒரு சிரிய கோவ்சியன் வளையம் பொருத்தலுடன் இணைத்துப்பார்த்தால் இப்படி தெரிகிறது; இதன் மூல நிரல் kural_mathirai.py என்பதில் காணலாம்.

#!/usr/bin/env python3
# This Python file uses the following encoding: utf-8
from kural import Thirukkural
from tamil.utf8 import get_letters, get_tamil_words, total_maaththirai
from collections import Counter, OrderedDict
from pprint import pprint
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from scipy.optimize import curve_fit

# Define model function to be used to fit to the data above:
def gauss(x, *p):
    A, mu, sigma = p
    return A*np.exp(-(x-mu)**2/(2.*sigma**2))

def main():
    eq = Counter()
    eqd = {}
    kural = Thirukkural()
    for kural_no in range(1330):
        kural_words = get_tamil_words(get_letters(kural.get_kural_no(kural_no+1).ta))
        mathirai = sum([total_maaththirai(word) for word in kural_words])
        if eq[mathirai] == 0:
                eqd[mathirai] = [kural_no+1]
        else:
            eqd[mathirai].append(kural_no+1)
        eq[mathirai] += 1
    eq_sorted=OrderedDict(sorted(eq.items(),key=lambda x: x))
    print("total = ",sum(eq.values()))
    plt.scatter(eq_sorted.keys(),eq_sorted.values())
    plt.ylabel(u'குறட்பாக்கள் எண்ணிக்கை',{'fontname':'Catamaran'})
    plt.xlabel(u'மாத்திரை அளவு',{'fontname':'Catamaran'}) #Arial Unicode MS'})

    # p0 is the initial guess for the fitting coefficients (A, mu and sigma above)
    p0 = [75., 20., 5.]
    coeff, var_matrix = curve_fit(gauss, list(eq_sorted.keys()), list(eq_sorted.values()), p0=p0)

    # Get the fitted curve
    hist_fit = gauss(list(eq_sorted.keys()), *coeff)
    plt.plot(eq_sorted.keys(), hist_fit, label='Gaussian Fitted data (mean=%g, std=%g)'%(coeff[1],coeff[2]))
    plt.title(r'குறள் மாத்திரை வரிசை (Gauss \mu=%g, \sigma=%g)'%(coeff[1],coeff[2]),{'fontname':'Catamaran'})

    # Finally, lets get the fitting parameters, i.e. the mean and standard deviation:
    print ('Fitted mean = ', coeff[1])
    print('Fitted standard deviation = ', coeff[2])

    plt.show()


if __name__ == "__main__":
    main()
திருக்குறள் மாத்திரை வரிசை ஒத்திய குறட்பா எண்ணிக்கை

விடைகள்

  1. திருக்குறளில் உள்ள சராசரி குறட்பாவின் மாத்திரை அளவு μ ~ 29.5. இதன் மாற்றமளவு σ ~ 2.5
  2. மாத்திரை பார்வையில் திருக்குறள் ஏரக்குறைய கௌசியன் பரப்பை போல் அமைந்துள்ளது
  3. திருக்குறள் மாத்திரை வடிவிலும் கூட அழகிய சீர்மை கொண்டதாக மிகவும் கோர்வையுடன் அமைந்தது.
  4. குறைந்த அளவு நமாத்திரை  நீளம் (23) கொண்ட குறளானவை குறள் எண்கள், 391, 426, 483, 786

“கற்க கசடறக் கற்பவை கற்றபின்
நிற்க அதற்குத் தக.” குறள் 391.

  1. அதிக அளவு நீளமான மாத்திரை (37.5) கொண்ட குறளானது குறள் வரிகள்,

”காணாதான் காட்டுவான் தான்காணான் காணாதான்
கண்டானாம் தான்கண்ட வாறு.” குறள் 849.

மத்திரை அளவுகுறள் எண்ணிக்கை                 குறள் எண்(கள்)
234391, 426, 483, 786
23.5567, 77, 366, 637, 979
248108, 485, 961, 965, 1042, 1048, 1277, 1304
24.57304, 467, 602, 652, 1118, 1322, 1324
2520133,
193,
331,
360,
412,
477,
546,
559,
576,
592,
616,
771,
796,
846,
947,
1052,
1116,
1239,
1240,
1289
25.52996,
339,
347,
350,
373,
400,
405,
439,
444,
569,
625,
669,
742,
764,
841,
937,
944,
978,
980,
1045,
1072,
1085,
1102,
1108,
1176,
1203,
1258,
1318,
1329
26371,
28,
40,
90,
152,
229,
308,
314,
340,
454,
466,
480,
488,
594,
622,
639,
666,
668,
687,
692,
715,
774,
824,
847,
856,
934,
964,
975,
988,
1008,
1028,
1168,
1238,
1242,
1256,
1279,
1309
26.54645,
54,
107,
168,
175,
196,
236,
296,
364,
451,
484,
516,
518,
531,
540,
571,
572,
598,
608,
611,
623,
628,
700,
706,
708,
738,
769,
838,
854,
877,
935,
954,
1010,
1066,
1071,
1131,
1132,
1134,
1222,
1224,
1227,
1229,
1232,
1233,
1296,
1302
277380,
105,
109,
119,
120,
121,
172,
173,
174,
202,
224,
231,
283,
284,
292,
321,
337,
341,
349,
374,
380,
399,
411,
428,
429,
438,
447,
489,
505,
508,
512,
520,
552,
562,
570,
578,
599,
604,
651,
654,
661,
693,
698,
729,
747,
770,
772,
778,
790,
803,
805,
807,
817,
818,
822,
832,
851,
863,
887,
889,
963,
994,
1019,
1041,
1069,
1107,
1120,
1122,
1159,
1173,
1300,
1321,
1326
27.58821,
34,
39,
64,
73,
87,
95,
98,
111,
115,
124,
131,
140,
157,
205,
207,
208,
210,
215,
239,
261,
270,
272,
280,
293,
309,
315,
336,
388,
394,
419,
431,
457,
465,
468,
469,
482,
491,
494,
495,
542,
543,
545,
554,
558,
574,
575,
581,
629,
653,
657,
679,
690,
705,
739,
759,
788,
811,
821,
823,
835,
876,
878,
882,
883,
904,
918,
949,
1004,
1023,
1039,
1063,
1091,
1105,
1109,
1117,
1138,
1144,
1156,
1165,
1166,
1226,
1257,
1266,
1273,
1281,
1283,
1301
2810413,
14,
60,
63,
75,
85,
89,
101,
103,
123,
145,
158,
167,
186,
191,
195,
213,
218,
230,
234,
302,
327,
369,
408,
410,
416,
425,
434,
463,
464,
472,
475,
478,
500,
504,
521,
522,
535,
549,
563,
580,
595,
596,
609,
618,
620,
621,
636,
664,
677,
703,
741,
748,
752,
767,
793,
797,
802,
816,
844,
873,
880,
884,
917,
925,
943,
984,
1003,
1011,
1013,
1031,
1040,
1043,
1051,
1080,
1086,
1088,
1092,
1096,
1099,
1100,
1114,
1135,
1137,
1141,
1146,
1153,
1157,
1177,
1178,
1184,
1199,
1201,
1208,
1210,
1216,
1221,
1259,
1264,
1295,
1306,
1307,
1327,
1330
28.59529,
68,
102,
104,
112,
114,
116,
132,
137,
153,
203,
223,
227,
238,
244,
255,
265,
267,
268,
274,
277,
295,
303,
316,
333,
342,
372,
381,
385,
392,
393,
398,
401,
403,
407,
437,
493,
506,
511,
517,
553,
577,
591,
601,
605,
631,
655,
671,
674,
696,
710,
723,
727,
740,
744,
749,
757,
763,
781,
809,
819,
829,
839,
852,
871,
941,
986,
996,
1025,
1050,
1061,
1062,
1073,
1093,
1098,
1119,
1142,
1152,
1164,
1170,
1196,
1209,
1213,
1223,
1249,
1250,
1268,
1280,
1287,
1290,
1298,
1308,
1310,
1315,
1328
299123,
26,
59,
76,
99,
113,
169,
181,
184,
197,
214,
233,
237,
254,
262,
264,
289,
313,
329,
334,
335,
338,
384,
427,
503,
539,
544,
547,
588,
590,
597,
607,
619,
630,
634,
638,
672,
707,
709,
712,
728,
754,
779,
785,
787,
791,
810,
812,
813,
826,
830,
837,
848,
853,
879,
888,
898,
905,
920,
942,
955,
971,
1014,
1021,
1034,
1068,
1084,
1089,
1110,
1121,
1126,
1139,
1143,
1147,
1149,
1151,
1172,
1193,
1200,
1211,
1231,
1237,
1245,
1247,
1251,
1253,
1271,
1276,
1292,
1299,
1305
29.51069,
33,
53,
55,
61,
66,
71,
79,
100,
136,
150,
154,
171,
177,
182,
192,
216,
226,
259,
279,
288,
290,
306,
310,
323,
344,
352,
363,
371,
375,
376,
377,
378,
404,
414,
418,
440,
448,
449,
455,
486,
497,
501,
527,
532,
585,
589,
593,
603,
641,
644,
650,
688,
697,
704,
726,
731,
734,
736,
743,
746,
751,
761,
765,
782,
801,
814,
815,
831,
836,
842,
850,
870,
872,
899,
922,
933,
945,
953,
958,
970,
974,
982,
997,
1000,
1038,
1053,
1065,
1067,
1095,
1111,
1113,
1128,
1161,
1171,
1219,
1228,
1234,
1235,
1236,
1244,
1252,
1254,
1261,
1284,
1297
3011619,
22,
48,
49,
57,
78,
97,
117,
122,
125,
129,
142,
151,
178,
180,
201,
217,
220,
241,
245,
250,
257,
260,
269,
273,
276,
286,
300,
332,
348,
353,
362,
365,
370,
420,
421,
432,
435,
436,
443,
470,
474,
479,
490,
498,
499,
507,
509,
524,
529,
534,
556,
565,
568,
610,
613,
626,
633,
640,
647,
659,
663,
676,
684,
714,
725,
750,
775,
776,
784,
798,
799,
800,
828,
864,
869,
885,
886,
890,
891,
892,
893,
902,
907,
916,
946,
948,
951,
962,
999,
1015,
1016,
1044,
1047,
1049,
1055,
1056,
1074,
1076,
1082,
1124,
1125,
1127,
1155,
1175,
1179,
1180,
1183,
1204,
1207,
1217,
1230,
1243,
1263,
1282,
1319
30.58510,
32,
58,
62,
83,
84,
88,
92,
139,
179,
200,
209,
235,
243,
251,
287,
291,
294,
297,
299,
320,
322,
346,
356,
367,
386,
396,
415,
430,
441,
442,
458,
459,
519,
525,
537,
557,
567,
624,
645,
656,
665,
678,
701,
717,
724,
773,
783,
789,
855,
859,
895,
906,
912,
915,
977,
992,
995,
1012,
1024,
1029,
1059,
1078,
1087,
1090,
1094,
1103,
1106,
1115,
1129,
1140,
1145,
1163,
1214,
1225,
1262,
1265,
1274,
1275,
1291,
1293,
1303,
1313,
1320,
1323
319216,
17,
18,
30,
37,
46,
50,
70,
72,
74,
93,
106,
135,
138,
144,
146,
160,
161,
190,
198,
204,
211,
222,
307,
319,
351,
358,
382,
383,
390,
406,
422,
460,
471,
473,
496,
523,
528,
538,
555,
561,
566,
587,
600,
612,
615,
648,
670,
702,
716,
721,
737,
753,
760,
768,
795,
820,
843,
857,
862,
866,
874,
903,
909,
985,
987,
989,
991,
1018,
1020,
1030,
1037,
1054,
1060,
1077,
1123,
1130,
1136,
1154,
1158,
1162,
1169,
1185,
1188,
1189,
1198,
1206,
1218,
1260,
1278,
1288,
1314
31.5703,
4,
11,
36,
41,
65,
69,
81,
110,
189,
242,
258,
263,
275,
278,
324,
354,
355,
359,
361,
379,
413,
417,
476,
481,
510,
536,
541,
573,
579,
586,
614,
617,
649,
658,
680,
694,
718,
722,
755,
766,
794,
804,
845,
858,
860,
867,
913,
914,
923,
926,
928,
936,
952,
956,
957,
976,
990,
998,
1022,
1026,
1027,
1033,
1035,
1075,
1104,
1167,
1182,
1248,
1255
325912,
44,
52,
128,
143,
156,
164,
165,
185,
188,
228,
253,
298,
311,
312,
345,
357,
389,
395,
433,
445,
450,
513,
530,
560,
564,
606,
642,
673,
686,
711,
730,
732,
735,
758,
762,
777,
792,
825,
833,
840,
881,
919,
968,
1036,
1057,
1058,
1081,
1112,
1160,
1174,
1197,
1212,
1215,
1272,
1294,
1311,
1316,
1325
32.5512,
20,
24,
31,
35,
47,
82,
86,
118,
147,
148,
159,
162,
176,
187,
271,
281,
282,
328,
446,
502,
514,
526,
533,
550,
582,
583,
662,
683,
699,
719,
720,
827,
861,
865,
908,
921,
927,
969,
981,
1097,
1150,
1181,
1186,
1187,
1191,
1194,
1195,
1241,
1286,
1312
33378,
155,
170,
183,
206,
212,
225,
248,
249,
318,
325,
368,
402,
462,
492,
548,
627,
646,
675,
685,
756,
780,
808,
834,
911,
939,
1046,
1070,
1083,
1101,
1148,
1190,
1192,
1269,
1270,
1285,
1317
33.53027,
194,
219,
221,
305,
317,
343,
456,
461,
632,
643,
667,
689,
806,
896,
900,
901,
930,
932,
959,
966,
972,
993,
1001,
1005,
1009,
1133,
1205,
1220,
1267
342338,
51,
56,
126,
134,
166,
252,
266,
330,
453,
487,
660,
681,
682,
695,
897,
910,
938,
950,
960,
967,
1007,
1032
34.5125, 42, 130, 149, 232, 387, 424, 733, 931, 983, 1006, 1079
351691,94,141,199,246,247,423,452,635,691,875,924,
973,1002,1017,1064
35.5925, 163, 285, 301, 515, 584, 868, 894, 929
3647, 409, 713, 745
36.56127, 240, 326, 551, 1202, 1246
37215, 940
37.5243, 397
3826, 256
39.51849

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) மதிப்புகளை பார்க்கலாம், மூல நிரலின் வரிகளில் படிப்படியாக செயலியின் இயக்கத்தை பார்க்கலாம், செயலியின் முழு செயல்பாட்டை புரிந்து கொள்ளலாம், இயக்கத்தில் தர்க்கரீதியான பிழைகள் இருப்பதை கண்டுபிடிக்கலாம் அல்லது முன்கூட்டியே அறிந்த வழுக்களை நீக்கம்செய்ய விசாரணைகள் நடத்தலாம்.

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

An Introduction to Tamil Computing

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

காட்சிக்கோப்புகள் இங்கு.

-முத்து

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

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

எழில் – சில அம்சங்கள் – மீள்பார்வை

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

Lemonade

“கிடைப்பதெல்லாம் புளிப்பான எலுமிச்சைதான் என்றால் அதில் சிறப்பான எலுமிச்சைசாறு குளிர்பானத்தை செய்யும்,” என்பது அமெரிக்க நடைமுறை. இதனை மிகையாகக் கொண்டு பிரபல இசைபாடகி பியான்சே ஒரு முழு பாடல் தொகுப்பையே, Lemonade என 2016-இல் வெளியிட்டாள். அதில் கருப்பினத்தின் மீது போலிசார் வழி நடத்தும் அமெரிக்க அடக்குமுறையை கடுமையாக விமர்சித்தும் பாடினாள் பியான்சே – அவள் மால்கம்-எக்ஸ், கருப்பு சிருத்தைகள் என்றெல்லாம் அவர்களது வரிகளில் பூந்து ஒரு ஆதங்கத்தை கலைவடிவு படுத்தினாள்.

லெமனேட் – (C) 2016 Beyoncé

அதெல்லாம் சரி. தமிழில் சிறப்பாக livestream/videoconference வழி (இயங்கு + அலை = இயங்கலை) வழி ஒரு மாநாட்டை இந்த பேரிடர் காலத்தில் நடத்துவது என்பது இங்கு நமக்கு நடந்த ஒரு லெமனேட் என்று காணலாம். என்னதான் கொரோனா நுண்கிருமி தொற்று நோய் பரந்தாலும் நாம் சோர்வடையாமல் நமது affirmations-ஐ நினைத்தபடி முன்னெடுத்துச்செல்வது முக்கியமாக அமைகிறது.

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

மாநாடு காணொளிகள் இங்கு youtube-இல் காணலாம்: (கீழ் உள்ள வீடியோ வேலைசெய்யவில்லை எனில் இங்கு காண்க)

2020 கட்டற்ற தமிழ் மென்பொருள் மாநாடு

“மலேசிய உத்தமம், ஓம்தமிழ் ஏற்பாட்டில், கணியம் அறக்கட்டளை, தித்தியான் டிஜிட்டல், மொசில்லா தமிழ் குழுமம், உபுண்டு தமிழ் குழுமம், தமிழ் லிப்ரெஓபிஸ் இணை ஏற்பாட்டில் 4 – 5 ஜூலை 2020 அன்று, உலகின் முதலாவது கட்டற்ற தொழில்நுட்பத் தமிழ் மாநாடு” இணையம்வழி ஏற்பாடு செய்யப்பட்டது.

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

INFITT MALAYSIA & OMTAMIL with KANIYAM FOUNDATION, PROGRAM TITIAN DIGITAL, MOZILLA TAMIL GROUP, UBUNTU TAMIL GROUP, TAMIL LIBREOFFICE organised World’s First in Tamil “Open Source Technology Conference” via online on the 4th & 5th of July 2020.”

2020 – Tamil Open Source conference

இன்று தமிழ் மாநாட்டில் “Open-Tamil – திறமூல தமிழ் நிரல் தொகுப்பு,” என்ற தலைப்பில் பேசுவேன்.

Open-Tamil – திறமூல தமிழ் நிரல் தொகுப்பு

    அருளாளன், சையது அபுதாகிர், பரதன் தியாகலிங்கம், சீனிவாசன், சத்தியா மகாதேவன், அருண்ராம், மற்றும் முத்து அண்ணாமலை.

அனுகும் மின்னஞ்சல்: ezhillang@gmail.com, நாள்: ஜீலை 1, 2020.

1. அறிமுகம்

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

படம். 1: தமிழ் பேசு திட்டத்தின் சின்னம்.

2. கட்டமைப்புகள்

இந்த நிரல்தொகுப்பிலுள்ள மொட்யூல்களாவன கீழோ. இவற்றின் முழு விவரங்களையும் காண http://tamilpesu.us/static/sphinx_doc/_build/html/sphinx_doc/ இங்கு செல்லலாம்.

Moduleபயன்பாடுகள்/சார்புகள்
1tamilTamil tokenization, word ordering, encoding converters, numerals, text summarizer.
2ngramcorpus modeling classes
3solthiruthiTamil spelling checker algorithms
4spellTamil spelling checker application
5tamilmorseMorse code generation, decoding for Tamil
6tamilsandhiTamil sandhi-checker – packaged with Open-Tamil but developed independently by Nithya and Shrinivasan.
7transliterateTamil transliteration tools
8tamilstemmerThis module is new in version 0.96 and provides access to simple stemmer functions originally created by Damodharan Rajalingam
9tabrailleTamil Braille generation following Barathia Braille standard
10kuralThirukkural source text and English translation

.

Open-Tamil source code examples like numeral to audio generation, ngram generation, corpus analysis etc. see link here.

3. வெளியீடு, உரிமம், நிறுவுதல்

2015-இல் முதல் வெளியீடு (வரிசை எண் 0.4) கண்டு பின்னர் இந்த ஆண்டு ஜூன் 12-இல் சமீபத்திய (ஒன்பதாம்) வெளியீடு (வரிசை எண் 0.97) கண்டது. இந்த நிரல் தொகுப்பு MIT உரிமம் வழியாக நீட்சி செய்தும், பகிர்ந்து மறுசெயல்பாட்டிலும் உபயோகிக்கலாம்.

சமீபத்திய வரிசை எண் 0.97-இல் வெளிவந்த புதிய அம்சங்களானவையாவன:

  1. மாத்திரை கணித்தல் – தமிழ் உரையில் உள்ள சொற்களின் மாத்திரை அளவை கணிக்க புதியசார்பு ‘tamil.utf8.total_maaththirai()’ என்று திரு. பரதன் தியாகலிங்கம் அவரால் பங்களிக்கப்பட்டது.
  2. வடமொழி சொல்பட்டியல் மோனியர்-வில்லியம்ஸ் அவரது அகராதியில் இருந்து திரிக்கப்பட்டு இங்கு சேர்க்கப்பட்டது
  3. ‘tabraille’ என்ற module-இல் கண்பார்வை குறை உள்ளவர்களினால் தமிழ் பாரத பிரெயில் என்ற தரத்தை கையாளும் வகை சில உத்திகள் உள்ளன.
  4. ‘kural’ என்ற module-இல் திருக்குறளை நேரடியாக கையாள சில உத்திகள் உள்ளன. இது 2013-இல் வெளிவந்த ‘libkural’ என்பதன் மீள்பதிவாகும்.

இதனை நிறுவ இப்படி கட்டளை கொடுக்கலாம்,

$ pip install open-tamil

ஏற்கனவே நிறுவியிருப்பின் புதிய அத்யாயத்தில் நிறுவ, என்றும் கொடுக்கலாம்.

$ pip install –upgrade open-tamil

4. வளர்ச்சி

ஓப்பன்-தமிழ் திட்டம் இதனைக்கொண்டு பல மென்பொருடகள் இன்று இயங்கிவருகின்றன – இவற்றில் முக்கியமானவை http://tamilpesu.us என்ற வலைத்தளம். இந்த நிரல்தொகுப்பில் இருந்து செயல்பாடுகளை மொத்தமாக வலைவழியாக தமிழ் ஆர்வலர்கள் கணிமை செய்யாமல் பயன்படுத்த இது உதவும்.

       படம் 2: ஒப்பன்-தமிழ் வழி உருவாக்கப்பட்ட தமிழ்பேசு வலைதளத்தில் உள்ள பெருக்கல் அட்டவனை செயலி.

ஒப்பன் தமிழ் கொண்டு பல தமிழ்இயல்மொழி ஆய்வுகள் (உதாரணமாக Tamil NLP, PyTamil) என்ற திட்டங்களும் செயல்படுகின்றன. இது எங்களுக்கு தெறித்தவை மட்டுமே!

5. பங்களிப்பாளார்கள்

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

https://github.com/Ezhil-Language-Foundation/open-tamil

எழில் மொழி அறக்கட்டளையின் பார்வையில் இது மேம்படுத்தப்பட்டாலும், இதன்வழியாக பத்துக்கும் மேற்பட்ட பங்களிப்பாளர்கள் உள்ளனர்.இந்த திட்டம் ஏரக்குறைய 800 பங்களிப்புகளை பெற்றும், 114 வழு/திறணாம்சங்களையும் முடிவுபடித்தியும், மேலும் 82 திறணாம்சங்களை ஒழுங்கு செய்தும் வடிவமைப்புக்காக குறிக்கப்பட்டுள்ளன. 

இந்த திட்டத்தை அனைவரும் தொடர்ந்து பயன்படுத்தியும், ஆதரிக்குமாரும் கேட்டுககொள்கிறோம்.

மொழிவெளியில் எண்ணிம செயல்பாடும், பங்களிப்புகளும்

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

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

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

ஆகட்டும் அவர்கள் கண்களுக்கு அரைப்பழங்குடியினராக மட்டும் தென்பட்டதால் அவர்களது (ஆங்கிலமல்லாத) மொழி வளர்ச்சியடைந்ததாக நான்கண்டதில்லை. எனினும் தமிழில் செயல்படும் பலரும் நெருக்கடிக்கிடையில் ஒரு பெரும்பாலான ஆங்கில சூழலில் பணியாற்றிக்கொண்டும், அல்லது மாணவரான சூழலில் தொடங்கி திறம்பட 30இல் இருந்து 60ஆண்டுகள் வரை பின்னடைந்த தமிழ் தகவல் ஆராய்ச்சிகளை தாமாகவே முன்னெடுத்து செய்கின்றனர். இவர்களை atavist, neanderthal என்றெல்லாம் பழிப்பது வெகுவான liberal/libertarian அரசியல் பார்வைக்குள் அடங்காதது. இதற்கு முன்சான்றே தமிழர்களை தற்குறைவாக பார்ப்பதாக மட்டுமே, “ஏய் மடராசி” என்றேல்லாம் சொல்வது போலவே அமைகிறது.

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

இந்த எண்ணிம உலகில் 1-0 தவிர யார் மொழி கணினியில் செலுத்தப்பட வேண்டும் என்பது ஒரு அரசியல் – அதில் பிழைக்காதவர்கள் மொழிகள் தேக்கத்தை அல்லது ஒதுக்கப்படும் நிலைக்க தள்ளப்படுவதே ஒரு பின்னடைவு. மொழியையும் அதில் உள்ள கருத்துக்களையும் நாம் மனதில் அடைந்த முன்னேற்றத்திற்கும் வாழ்க்கை வழிக்கும் இசைவாக முன்னெடுத்துசெல்வது பெருமை – பன்மைத்துவத்தின் ஒரு உச்ச கட்டமாகவும் பார்க்கலாம். தமிழில் செயல்படுவது ஒரு புரிதல் – “நீ யார்,” என்ற தேடலின் ஒரு மிகப்பெரிய அடையாள கேள்வியின் பயணத்தில் உள்ள காட்டுப்பாதை. தாங்கள் பேசிய மொழிகள் பழுதடையப்பார்ப்பது ஒரு அடாவடி அடாவிசம்.

சாஸா எபலிங்

தமிழில் பெண்ணியம், பெண்ணிய எழுத்தாளர்கள் பற்றி சமிபத்தில் எழுதியுள்ள சாஸா எபலிங் 19-ஆம் நூற்றாண்டின் தமிழ் இலக்கியங்களை பற்றி ஆய்வு செய்து செருமனியின் கலோன் பல்களையில்இருந்து முதுகலை/முனைவர்பட்டம் பெற்றார் – பின்னர் அவர் சிக்காகோ பல்கலைக்கழகத்தில் துணை பேராசிரியராக பணியாற்றுகிறார். இவரைப்பற்றிய 2010 செய்தி கட்டுரை இங்கு தாய்வீடு 2010-ஆகஸ்டு :

சிந்திக்கவைக்கும் ஆய்வுகள்

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

இந்த சில கட்டுரைகள் செல்லாத இடத்திற்கு, முற்றிலும் வேறுபட்ட சிந்தனைகளை முன்வைப்பவைகளில் சிலவற்றைப்பற்றி இன்று பார்க்கலாம்.

படம் 1: எழில் மொழி திருத்தியில் உள்ள தமிழ்-99 விசைப்பலகை. 

தமிழ்-99 விசைபலகைக்கு ஒரு மேம்பாடு என்ற படியாக 2004-இல் நடந்த தமிழ் கணிமை மாநாட்டில் இந்த (clj-thamil படைத்த இளங்கோ சேரன் குழுவினரால்) கட்டுரை “Optimization of Thamil Phonetic Keyboard.” இதில் ஆசிரியர்கள் கூறியதாவது, தமிழ்-99 விசையில் மெய்களுக்கு பதில் அகர-மெய்களை விசைப்பலகையில் பொருத்தினால் சிக்கனமாக (விசை தட்டச்சு செய்யும் எண்ணிக்கையில் குறைவாக) ஒரு குறிப்பிட்ட உரையை இந்த மாற்று விசைப்பலகையில் உள்ளீடு செய்யலாம் என்று கண்டெடுத்தார்கள். ஆனால் இதை உள்வாங்கி எதுவும் செய்யவில்லை.

new vistas:The iTamil project aims to make the Tamil script easy to learn, print and display, among other things —Photo: Special Arrangement
படம் 2: iTamil – என்ற தமிழ் எழுத்துரு மாற்றம் பற்றிய  தடைசெய்யப்பட்ட 2016 கட்டுரை. படம்: இந்து நாளிதழ்

அடுத்த கட்டுரைக்கு மேர்கோள் என்க்கு கிடைக்கவில்லை, KaReFo-குழுவினரால் “iTamil,” (2016) ; ஆனால் அதன் சாராம்சமாவது தமிழின் உயிமெய் எழுத்து வடிவத்தை முற்றிலுமாக மாற்றியமைக்க ஒரு ஆய்வு பரிந்துரை சமர்ப்பிக்கப்பட்டது. ஆனால் இந்த கட்டுரை 2016-ஆம் ஆண்டு நடந்த தமிழ் கணிமை மா நாட்டில் வாசிப்பு பெற்றாலும் அது பின்னர் நீக்கம் ஆயிற்று – காரணம் இதனை ஆய்வளவில் கூட தமிழ் சமுகம் ஏற்கக்கூடாது என்றோரு தரப்பின் வாதம் வெற்றி பெற்றதன் காரணம். இந்த சர்ச்சைக்கும் அப்பால் அவர்கள் சொன்ன கோரிக்கை, ஆய்வுகளை பார்க்க இந்த செய்தி உபயோகரமாக வரலாற்று சின்னமாக அமைகிறது.

ஆய்வுக்களத்தில் சிந்திக்கலாம்தானே! அதை நடைமுறைப்படுத்தவேண்டுமானால்தானே மேலும்/கூடுதல் விவாதங்கள் தேவை? சிந்தனையே தடைசெய்யப்படவேண்டுமெனில் தமிழருக்கும் தலிபனார்களுக்கும் வித்தியசமென்ன?