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

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

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

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

PySangamam

Mr. B. Vijaykumar, founder of GLUG-Trichy, Zylogic, and GNU evangelist, and ChennaiPy organizer , is launching a Python conference in Chennai – PySangamam. Pre-registration is open at http://pysangamam.org

Announcement follows:

From: Vijay Kumar <vijaykumar@bravegnu.org>
Date: Sun, May 27, 2018 at 12:52 AM
Subject: [Chennaipy] PySangamam: Tickets is Open
To: Chennai Python User Group Mailing List <chennaipy@python.org>

Hi Everyone,
Early bird tickets for PySangamam, are now open! The early bird ticket is priced at Rs. 900 (Inclusive of GST). You can purchase tickets from http://pysangamam.org/

Do note that we have a contributor ticket priced at Rs. 5000 (Inclusive of GST). As a contributor, you can take pride in making the conference more accessible to students. Your contribution will go towards providing discounted tickets to students. You will also be credited on the conference website.

Regards,
Vijay
_______________________________________________
Chennaipy mailing list
Chennaipy@python.org
https://mail.python.org/mailman/listinfo/chennaipy

I had pleasure of participating in Chennai Python meetup in March, 2018; their technical audience is high-level and very sincere in their attempts to understand and communicate in regards to your material. Highly recommended to attend this event.

-Muthu

 

நிரல் அலசிஆராய்தல் – art of debugging

Debugging – அதாவது கணினியில் பிழைகளை கண்டு திருத்தம் செய்வது எப்படி ? பைத்தான் மொழியில் இது சற்று சகஜமானது : முழு விவரம் இங்கு.

What is Debugging ?

Computer programs don’t always work like how we want them to. So at times we need to stop the program in the middle of execution and inspect them. By doing that – looking at the variables, functions, statements/source code in the debugger – we can understand the problem better than before and by stepping through the source code we can understand the source of the error to arrive at a solution.

This may sound somewhat complex, but in practice its quite repetitive and you will get the hang of it. Its the equivalent of a software detective work, and it is surprisingly fun, and you keep getting better at it with more practice.

How to Debug Python Code ?

To debug python we use the python module ‘pdb‘ [read documents இங்கு]; pdb is named evocatively like the more famous, powerful gdb – GNU source debugger. The simple usage is to call your program throwing the error from the command line as follows,

$ python -m pdb myscript.py

Once you see the (Pdb) prompt you can do the following:

  1. Setup a breakpoint at a particular function, class or module
  2. Resume the program running and
  3. Wait for the program to enter the breakpoint code or hit an exception
  4. At this time Pdb will enter the breakpoint and give you options to inspect variable, function, the call stack, and step up or down the frames
  5. For exceptions caught by gdb, we can go through the same scope variables and source-stepping inspections only via the post-mortem execution

Finally, you can figure out the cause of the problem and fix it!

Bon Voyage. You are starting on a powerful journey to write cool software and fix buggy ones!

Goodluck, and Godspeed.

எழில் எங்கே போகிறது ?

ezhil_March1_2017.png
படம் :  திருத்தியுடன்  எழில் மொழி  செயலி; நிரல் இடது பக்கம், இயக்கிய வெளியீடு வலது பக்கம். சாளரத்தின் கீழ் இயக்கிய விவரம். இந்த செயலி எழில் படிக்க உதவும்.       (c) 2017 எழில் மொழி அறக்கட்டளை.

 

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

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

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

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

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

எழில் மொழியில் உள்ள “installer” திரட்டியில் இவை இடம் பெறவேண்டும் என்று எனக்கு தற்சமய நிபந்தனை:

  1. Platform Support: இயங்கு தளங்களில் வேலை செய்ய வேண்டும்:
    1. Windows 64, 32 bit
    2. Linux 64
  2. திரட்டியில் வேண்டியவை : Installer package
    1. எழில் மொழி திருத்தி ; இதனை ‘ezhuthi’ (எழுதி) என்று pygtk-இல் இங்கு இங்கு வடிவமைத்து வருகிறேன்.
    2. எழில் மொழி ezhil module python library
    3. தமிழில் நிரல் எழுது புத்தகம்
    4. தமிழில் நிரல் எழுது புத்தகம் பயிற்சி நிரல்கள்
    5. மேல் நிலை எழில் எ.கா. உதாரணங்கள்
    6. பாடம், ஆசிரியர்களுக்கு உண்டான காணொளி, கேள்வி தாள், வினா-விடை பாட திட்டம்.
  3. பரிசோதனைகள்
    1.  மொத்தமாக நிறுவுதல் பரிசோதனை (அணைத்து தளங்களிலும்)
    2. நிரல் எழுதுவது
    3. கோப்புகளை திறப்பது, இயக்குவது, சேமிப்பது
    4. தனியன்க்கி பரிசோதனைகள் (automatic tests)
    5. பயனர் நடப்பு பரிசோதனை (interactive tests)
  4. வெளியீடு
    1. md5 checksum, zip/exe/tgz package generation and upload to networks
    2. release notes, credits, contribution notes, credits to open-source software

ஒரு தவம், வரம் மறக்கப்படாது – முயற்சி திருவினையாக்கும். கை கூடுவோம், வாருங்கள்.

 

open-tamil project growth

 

Open-Tamil project has been very important piece of software to enable people to build software on top of well defined component. This blog shares the chart of growth in codebase over two years. I thank all our contributors to open-tamil.

open-tamil-growth-2016
ஓபன்-தமிழ் நிரல் தொகுப்பில் வளர்ச்சி (2015 முதல் 2016 வரை).

Loc – lines of code in units of 100 lines. Unittests grew from 5 to 38 cases.

Open-Tamil and Ezhil updates (2016)

Today we are releasing updates to two packages maintained by Ezhil Language Foundation;

  1. open-tamil v0.65
    • open-tamil package contains minor bug fixes and solid performance on Python 2 and Python 3.
    • pip install –upgrade open-tamil
  2. ezhil-v0.82
    • Fix some issues for Python 3 installation from the previous release
    • pip install –upgrade ezhil

Both these packages maybe downloaded from PyPi (Python Package Index) via ‘pip’ command.

Thanks very much to the original contributors, bug reporters, and Tamil open-source software (TOSS) enthusiasts.

 

ஓபன் தமிழ் வழி சொல்திருத்தி

எல்லாம் நலமாக இருக்கிறீர்கள் என்று எண்ணுகிறேன். சென்ற வாரம் பாஸ்டன் நகரில் சைபீரியா குளிர் -22*C, அனால் எனக்கும் ஓபன் தமிழ் திட்டத்தில் பங்களிக்க நேரம் கிடைத்தது.

ஓபன் தமிழ் வழி சொல்திருத்தி ஒன்றை உருவாக்கும் பணியை மீண்டு இந்த ஆண்டு தொடங்கினேன். இந்த திருத்தியை “பல்-நிலை” (multi-pass) முறையில் முன்பே திட்டமிட்ட படி நாம் செயல்படுத்தலாம். இன்றுவரை செய்த நிரல்களை இங்கு பாருங்கள்
நேரம், ஆர்வம் இதற்க்கு சற்றுற ஒதுக்குங்கள்.
நன்றி,
முத்து

Lessons from Open-Tamil Library for Indian Language Applications – PyCon India 2015

The open-tamil team is proposing a talk, at upcoming PyCon India 2015, titled “Lessons from Open-Tamil Library for Indian Language Applications,”

The first 20 years of Indian languages on the Internet have been spent debating encoding schemes and editors, to be concerned with application development. India with its rich enthno-linguistic history needs to preserve and grow this heritage in the digital space. We believe this can be done only through writing novel, and useful applications specific to each languages.

  • As a community developed effort, and due to proximity of the various Indian languages, we believe Open-Tamil can form a prototype open-source toolbox for other Indian languages.

support our talk by voting for the open-tamil library at the Python 2015, here.

Open-Tamil porting for Python 3 and Python 2

For a long time Open-Tamil package was envisioned and supported for both Python 3 and Python 2. Now in work done during last weekend (during harsh Boston winter what better than sit indoors and code away?) I have made the following changes,

  1. source code compatible for both Python 3 and Python 2,
  2. pass unittests on Python 2.6, 2.7, 3.3 and 3.4 with Travis-CI testing , and running successfully on Windows and Linux

This is still development bleeding edge software so please feel free to poke and play, and file bugs. Let us know if you are using open-tamil in your work.

-Muthu