რა ვუყოთ ქართულ მთავრულ ასოებს უნიკოდში?

შარშან მაისში Unicode-მა ქართული მხედრული ანბანის 46 მთავრული ასონიშანი დაამტკიცა.

შეიძლება ჯერ კიდევ ადრეა, მაგრამ მომავალში ოპერაციული სისტემების განახლებებში მაინც აისახება ეს ცვლილება. ცნობისმოყვარეობის გამო გადავწყვიტე პატარა მოკვლევა გამეკეთებინა, თუ რას გვიცვლის ეს ამბები პროგრამისტებს და ამ პოსტში გაგიზიარებთ.

მანამდე ყოველი შემთხვევისთვის რამდენიმე განმარტება:
Unicode – სტანდარტი, რომელიც ყველა სიმბოლოს უნიკალური რიცხვითი კოდით განსაზღვრავს. ასევე აღწერს სხვადასხვა ენისთვის საჭირო სპეციფიურ წესებს. ამ სტანდარტმა მთელი ტექნიკური სამყარო მოიცვა და დღეს ყველა იყენებს მას, ვისაც ტექსტის დამუშავება / გამოსახვა სჭირდება – ოპერაციული სისტემები, პლატფორმები, ბრაუზერები…

UTF-8 – უნიკოდს სიმბოლოების და რიცხვების სია აქვს, თუმცა არ ანაღვლებს, როგორ მოხდება ამ ინფორმაციის შენახვა მეხსიერებაში. ამისთვის კოდირების სხვადასხვა ალგორითმი არსებობს. UTF-8 ერთ-ერთი და ყველაზე გავრცელებული მათგანია, რადგან ოპტიმალურად იყენებს ადგილს და ზედმეტ ბაიტებს არ გამოყოფს სიმბოლოსთვის, თუ ის ერთ ცალშიც ეტევა. კოდირების სხვა მაგალითებია UCS-2, UTF-16, UTF-32…

სტანდარტში ცვლილებები იმპლემენტაციებში ცვლილებებს იწვევს, რაც არც ისე სწრაფად ხდება. მაგალითად, ₾ ლარის სიმბოლო უნიკოდის მერვე ვერსიაში დაემატა 2015 წლის 17 მაისს და ვინდოუსის განახლება ამ სიმბოლოს ასახვისთვის 2016 წლის 19 იანვარს გამოვიდა.

ოპერაციულებმა უნდა განაახლონ კლავიატურის დრაივერი, რომ მომხმარებლებს CAPS რეჟიმის ჩართვით შეეძლოთ მთავრულის წერა. და ასევე უნდა განაახლონ სისტემური ფონტები, რომ font fallback-ის დროს სწორი სიმბოლოები გამოჩნდეს.

იმის გამო, რომ მთავრულის და არამთავრულის ერთსა და იმავე სიმბოლოს სხვადასხვა კოდი აქვს, პროგრამისტებს რაღაცების გათვალისწინება გვიწევს ხოლმე – აქამდე მხოლოდ სხვა ენებისთვის, ახლა კი ქართულისთვისაც. მაგალითად, როცა ხდება სტრიქონების შედარება, ძებნა, regex პატერნები, სორტირება, ბაზაში შენახვა და ა.შ.

 

მონაცემთა ბაზა

MS SQL server-ს ჩაშენებული აქვს უნიკოდის მხარდაჭერა და ოპერაციებისას ისედაც სტანდარტს უყურებს, მთავარია სწორ ვერსიას უყუროს: SQL Fiddle

აი, MySQL-თან ცოტა სხვაგვარადაა – აქ თითოეულ ბაზას, ცხრილს ან საერთოდ ველს შეიძლება ჰქონდეს განსაზღვრული კონკრეტული collation (წყობა?), იმის მიხედვით თუ რა ტიპის ინფორმაციას ინახავს. ჩვენ დაჩვეულები ვართ, რომ utf8_general_ci გამოვიყენოთ, რომელსაც ქართული ასოებიც ‘ესმის’. ეს collation სრულყოფილად არ აკეთებს უნიკოდის იმპლემენტაციას utf8_unicode_ci-ისგან განსხვავებით. უბრალოდ მეტი წარმადობისთვის იყენებდნენ. ახლანდელი პროცესორების პირობებში დიდი სხვაობა აღარ არის. სამაგიეროდ, utf8_unicode_ci ქართულ წყობას კარგად გაიგებს.

აი, მაგალითს მოვიყვან:
უნიკოდს კოდებთან ერთად განსაზღვრული აქვს სიმბოლოების მიმდევრობაც, რომელსაც სორტირებისას ვიყენებთ. მაგალითად ამ სიაში ყველა ქართული ‘ა’ სიმბოლო მიყოლებით არის – ნუსხურიც, ასომთავრულიც და მხედრულიც. მათ შემდეგ მოდის ‘ბ’ ასოს ვარიანტები. სავარაუდოდ ახალი მთავრულიც ანალოგიურად დაემატება.

SQL Fiddle

CREATE TABLE IF NOT EXISTS `test` (
  `content` varchar(200) NOT NULL
) DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
INSERT INTO `test` (`content`) VALUES
  ('აბგ'),  ('ააააა'),  ('Ⴁააააა'),  ('Ⴀააააა'),  ('bcd'),  ('ab.'),  ('Ⴄ'),  ('ж'),  ('Ж'),  ('ц'),  ('Ц');
  

CREATE TABLE IF NOT EXISTS `test_better` (
  `content` varchar(200) NOT NULL
) DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci;
INSERT INTO `test_better` (`content`) VALUES
  ('აბგ'),  ('ააააა'),  ('Ⴁააააა'),  ('Ⴀააააა'),  ('bcd'),  ('ab.'),  ('Ⴄ'),  ('ж'),  ('Ж'),  ('ц'),  ('Ц');


select * from `test` d order by d.content;
select * from `test_better` d order by d.content;

შედეგი:

ab., bcd, Ж, ж, ц, Ц, Ⴀააააა, Ⴁააააა, Ⴄ, ააააა, აბგ
ab., bcd, ж, Ж, ц, Ц, ააააა, Ⴀააააა, აბგ, Ⴁააააა, Ⴄ

ახლა რომ MySQL 8-ის ბეტა რელიზი გამოვიდა, იქ ჯერ უნიკოდის მეცხე ვერსიაა. ჩვენი მთავრული ასოები კი მეთერთემეტეშია 🙂

 

ჯავასკრიპტი

მართალია ბევრი რეალიზაცია არსებობს, მაგრამ V8-ს ვერ ავცდებით, ამიტო მაგის მიხედვით განვიხილავ.

ჯავასკრიპტს უნიკოდის მხარდაჭერა კი აქვს, თუმცა რაღაცები მაინც პრობლემურია (მაგალითად რეგექსი). თუ საიტზე გვჭირდება სორტირება ან შედარება (მაგალითად თუ ფილტრები გვაქვს), მაშინ ჩვეულებრივი სორტირება არ გამოგვადგება და Locale უნდა მივუთითოთ, რომ უნიკოდის წესები გათვალისწინოს:
მაგალითად,

let a = ['აბგ','ააააა','Ⴁააააა','Ⴀააააა','bcd','ab.','Ⴄ','ж','Ж','ц','Ц'];
console.log(a.sort());
console.log(a.sort(Intl.Collator('ru').compare));

ქართული Collation-ის მხარდაჭერა სამწუხაროდ საერთოდ არ აქვს. ამიტომ ნუსხურთან და ასომთავრულთან ერთად სწორად ვერ დაასორტირებს. ნუ, ეს მაინც ძალიან იშვიათი შემთხვევაა სადარდებლად რომ ღირდეს. სტანდარტულად, code point-ების მიხედვით ალაგებს და ანბანის მიხედვით გამოვა, მხოლოდ მთავრულ “ა” ასოს ჩვეულებრივი “ჰ”-ს მერე დასვამს ან პირიქით.

ამ პრობლემას სხვა ენებში სტრიქონების ერთ რეგისტრში გადაყვანით ვჭრით. გიორგიმ იდეა მომაწოდა:

myArray.sort(function(s1,s2){ return s1.toLowerCase() > s2.toLowerCase()}));

ქართულზეც სავარაუდოდ ეგრე იმუშავებს, მას შემდეგ რაც V8-ში უნიკოდის იმპლემენტაცია განახლდება. ახლა მაგალითად ასომთავრულზე და ნუსხურზე ეგრეა: "Ⴀ".toLowerCase() => "ⴀ"

როგორც ჩანს, იმის გამო რომ სტანდარტში ასომთავრულს CAPITAL აწერია, ხოლო ნუსხურს SMALL, ის ნუსხურის მთავრულ ვარიანტად არის იმპლემენტირებული (ეს v8 source ფაილი: unicode.cc, კოდებია პირდაპირ შესაბამებული.)
მხედრული ახლა caseless არის. საინტერესოა როგორი აღნიშნვა ექნება. მგონი სხვა ენა არ არსებობს, რომელსაც ორნაირი მთავრული ასოები აქვს.
Anyway, ამასაც ვერსიის განახლება სჭირდება.

ახლა გამახსენდა, რომ V8 საერთოდ open source პროექტია და მოხალისეს შეუძლია საერთოდ ქართული locale დაამატოს. ჯერ-ჯერობით ამის შედეგი ცარიელია:

Intl.Collator.supportedLocalesOf('ka')

 

ჯავა

ჯავაც არ ჩქარობს განახლებებს. JDK 9 უნიკოდის მერვე ვერსიით (სადაც ლარის სიმბოლო დაემატა) ორი წლის შემდეგ – 2017 წლის სექტემბერში გამოვიდა.
აქ სტრიქონების შედარება ხდება equals მეთოდით. მომავალში ქართულისთვისაც მოგვიწევს რომ equalsIgnoreCase გამოვიყენოთ:

"Ⴀ".equals("ⴀ")  => false
"Ⴀ".equalsIgnoreCase("ⴀ")  => true

ერთი მთავრული რადგან უკვე გვაქვს, მაგის გამოყენებით ვტესტავ, უბრალოდ პრაქტიკაში არ ვიყენებთ მაგ ასოებს.

ასევე რეგექსის დროსაც პირდაპირ ვერ მოვძებნით. ჩვეულებრივი i – ignore case არ გამოგვადგება, უნიკოდს სხვანაირად ამუშავებს. ამიტო:

"A".matches("(?i)[a]")  => true
"Ⴀ".matches("(?i)[ⴀ]") => false

Pattern.compile("[ⴀ]", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE).matcher("Ⴀ").matches();  => true

შესაბამისად ყველგან სადაც სადაც სტრიქონებს ვიყენებთ, გათვალისწინება იქნება საჭირო – maps, sets, etc.

 

PHP

აქ საერთოდ უნიკოდთან ცუდი სამუშაოა + დაემატება აქაც გადაყვანა-გადმოყვანა.

 

 
კიდევ ცვლილება დაგვჭირდება ერთ ადგილას – ძებნის ძალიან მოსახერხებელ ხელსაწყოებში – grep და მისთანები. grep-ის case insensitive ოპცია ახლაც არ მუშაობს ქართულ ასომთავრულ ასოებზე. იმედია მაგათ ვერსიების განახლებაშიც აისახება, უებარი პროგრამებია დიდ (და პატარაც) ტექსტებში და ფაილებში რეგექსით საძებნად.

ბევრი აქაური სისტემა მაშინვე ვერც განაახლებს ალბათ პლატფორმებს, რადგან დიდი ტესტირება დასჭირდება. მაგათ ალბათ ფრონტში მოუწევთ ვალიდატორების და კონვერტერების დაყენება, რომ მომხმარებლის მთავრული ასოები ძველ ჯავაში ან სხვაგან კარგად წავიდეს.

საერთო ჯამში, მე მომწონს რომ მთავრული დაამატეს (რამდენიმე ადამიანის დიდი შრომის შედეგად). ქართული ენის ნაწილია და არ უნდა დაიკარგოს.

თქვენ ხომ არ გაქვთ იდეები, კიდევ რაზე აისახება ეს ცვლილება?

ბმულები მთავრული ასოების შესახებ:
On.ge – UNICODE-მა ქართული მხედრული ანბანის 46 მთავრული ასონიშანი დაამტკიცა
DevFest 2016: Akaki Razmadze –  ❤  [I LOVE UNICODE]
DevFest 2017: Akaki Razmadze – გუტენბერგი, სტივ ჯობსი, გუგლი, ხინკალი, უნიკოდი
DevFest 2016: Michael Everson – The confusing case history of Georgian in Unicode

კულინარიული: წითელი ბულგარულის “კეტჩუპი”

გურმანებისთვის ეს რეცეპტი ალბათ ჩვეულებრივი ამბავია, მაგრამ ჩემთვის ფრიად საინტერესო აღმოჩენა იყო.

ყველაფერი კი აქედან დაიწყო:
პომიდორი არის იმ მრავალ უგემრიელესობიდან ერთ-ერთი, რაზეც ალერგია მაქვს. არადა რამდენ რამეშია პომიდორი! საწებლები, სხვადასხვა კეტჩუპები, ბურგერები, უამრავი სალათა, ჩაშუშულები, ათასნაირი სენდვიჩები და პიცები… მართალია ზოგჯერ ვერ ვითმენ, მაგრამ მერე ან სინდისი მქენჯნის, ან ალერგია 😀 not fair, man! not fair 🙁

ჰოდა 29 წლის თავზე პირველად მომივიდა აზრად დამეგუგლა პომიდორთან მიმსგავსებული სოუსები, თურმე ჩაშუშული წითელი ბულგარული საკმაოდ ჰგავს – ტექსტურით, ფერით, ცოტა გემოთიც. ნამდვილ კეტჩუპშიც კი რაღაც წილი ბულგარულს უჭირავს. გიზიარებთ რეცეპტს რაც შევაკოწიწე. ზუსტი მეცნიერების ადამიანს მაგრად არ მიყვარდა ხოლმე ჩანაწერი “შეაზავეთ გემოვნებით”, მაგრამ იდეალური კომბინაცია შეიძლება ჯერ კიდევ არ მაქვს. ასეც გემრიელი ჩანს:

პატარა ქილის პორცია:

4 დიდი წითელი ბულგარული წიწაკა,
საშუალო თავი ხახვი
2 კბილი ნიორი
2 სუფრის კოვზი ვაშლის ძმარი
1 სუფრის კოვზი შაქარი
მწიკვი დარიჩინი და მიხაკი (რამდენიც ფოტოზე დავყარე)

ძმარი და სუნელები აუცილებელია. სხვა დანარჩენიც პრინციპში 🙂

წიწაკა მოვხარშოთ ან შევწვათ რომ კანი მარტივად გაძვრეს და თან კარგად დარბილებული იყოს ბლენდერისთვის. მე მთლიანებს ვხარშავ 30-40 წუთი მაინც, სანამ მარტივად არ აძვრება კანი. კურკებსაც გამოვაცლი და დავჭრი საშუალოდ. ცალკე ჩავშუშოთ დაჭრილი ხახვი და დაჭყლეტილი ნიორი რაიმე სითხეში, რომ ძირს არ დაეკრას. მე წყალს ვასხამ. ბოლოს შევაზავოთ, შევურიოთ და ცოტა ხანს ვხარშოთ. გავაციოთ და ბლენდერით გავთქვიფოთ.


პიცა ჯერ არ მიცდია, მაგრამ ანანასი თუ გიყვართ ჩემსავით, ასეთ ბრუსკეტებს შემოგთავაზებთ:

  • პურის ნაჭრების ძირზე კარაქი
  • ზედა მხრიდან ყველის თხელი ნაჭერი
  • შემდეგ ცოტა მაიონეზი და კეტჩუპი
  • უხვად ორეგანო და ბოლოს ანანასის ნაჭრები

თუ გეგულებათ პომიდვრის ალტერნატიული სოუსები, სიამოვნებით გავსინჯავდი 😀

ახალი სიცოცხლის ამბები


რომ მკითხოთ, ყველაზე რთული რა გამიკეთებია ცხოვრებაში, გიპასუხებთ რომ ბავშვი :)) ახლა ექვსი თვის ხდება და ცოტა ხანი კომპიუტერთან გამოვიპარე. ჩემს ბლოგსაც ხომ უნდა შეეტყოს ახალი ამბავი 😀

გადავიარეთ აუარება უცნაური გამოცდილება, გამოწვევა, მტკივნეული არჩევანი; მოვისმინეთ ბევრი მითი, ჭორი და კარგი წამალიც. ყველა დედას და ბავშვს სხვადასხვანაირად აქვს ეს ისტორიები გადატანილი, მით უმეტეს სხვადასხვა ქვეყანაში და ქალაქში.

ბავშვებისგან ყოველთვის შორს ვიდექი, არადა თურმე საკუთარზე ტკბილი არაფერია ამქვეყნად. მშობლების ამაგი კი უზომოდ დაუფასებელია 😀 და ოჯახის წევრებს თანადგომა აუწერლად მნიშვნელოვანი. განსაკუთრებით მიყვარდა მამიკო როცა აჭმევდა, უცვლიდა და აცმევდა ხოლმე უნაკლოდ :))

აქ პრობლემებზე ბუზღუნი არ მაქვს გეგმაში, მაგრამ ძალიან მინდოდა იგივე შარში მყოფი გოგოებისთვის მეთქვა რამდენიმე რამ, თუნდაც სუბიექტურად 🙂

  • პირველ რიგში, ნუ დაუჯერებთ ყველას და ყველაფერს. თითქმის არაფერი დაიჯეროთ გადაუმოწმებლად. ექიმებს არ უყვართ ინტერნეტში ამოკითხული და შეიძლება იქაც საშიშია ბევრი რამ, თუმცა ჩემთვის ექიმებსაც არანაკლებ საშიში რაღაცები აქვთ ნათქვამი. კარგებს შრომას არ დავუკარგავ, თუმცა დანარჩენზე – ყველა პრობლემა უცოდინრობის, უყურადღებობის ან არაპროფესიონალიზმის გამო გამიჩნდა.
     
  • ექიმის გარდა წიგნები და ინტერნეტ რესურსებიც ძალიან დაგეხმარებათ, რომ რაც შეიძლება ცოტა რამ დაიზიანოთ (დასაზიანებელი ნამდვილად ბევრია :D). თუნდაც ის რად ღირს, რომ შეგვიძლია ხელის ერთ გაწვდენაზე თანამედროვე მეანობის დედად წოდებულ აინა მეი გასკინის სემინარებსაც კი მოვუსმინოთ შიშის და ტკივილის დაძლევაზე. ერთადერთი ბებიაქალია – და საერთოდ ერთადერთი ქალი – რომლის სახელობის ტექნიკაც არსებობს მეანობაში.
     
  • ძალიან შემაცდინა პოპულარულმა გამონათქვამმა, რომ “ვერ გავძელი და ორი თვიდან სამსახურში გავედი”. ხშირ შემთხვევაში ბავშვთან უფრო ძნელი გასაძლებია, ვიდრე სამსახურის მონატრება. ცხადია, სამუშაოს გააჩნია და ადამიანს, მაგრამ ორსულობის პერიოდშიც კი ეფექტური საქმიანობა ძალიან რთულია, ბოლოში ფაქტიურად შეუძლებელი. განსაკუთრებით მჯდომიარე პროფესიების შემთხვევაში, რადგან ჯდომა არ შეიძლება. მართალია, სხვა ქვეყნებთან შედარებით დეკრეტზე საწუწუნო არ გვაქვს, მაგრამ რამდენადაც შესაძლებელია, ჯობია რომ წინასწარ გაითავისუფლოთ მეტი დრო დაბადებიდან კიდევ 6 თვემდე მაინც.
     
  • ნუ დაუჯერებთ სტატიებს, თუ რა კარგია პირველი ბავშვი 35 წლის მერე, და ნურც კაპიტალისტებს. ყველაფერი რთულდება ასაკთან და სირთულეები ისედაც არ დაგვაკლდება. ევროპულ ქვეყნებს თუ მოვიყვანთ არგუმენტად, შევიხედოთ მათ ფორუმებზეც რა დღეში არიან რეალურად – გამონაკლისები კი ყველგანაა 🙂
    ისე, ადრეულ ასაკში რომ გაჩენილიყო, ჩემი კარიერა სავარაუდოდ განახევრდებოდა.

 
 

დედის რძის საოცრებები

ახლა რომ დავიწყო რძის სარგებელზე საუბარი, ათი სტატია არ მეყოფა, მაგრამ რამდენიმეს მაინც ვახსენებ, იმიტომ რომ მართლაც საოცარი რამეა :))

  • მისი შემცვლელი ბუნებაში არ არსებობს, რადგან მუდმივად იცვლება და ბავშვს ერგება. ჭამის დასაწისში სხვანაირია და ბოლოს სხვანაირი, პირველ დღეებში სხვაა, თვეების შემდეგ სხვა და გადაჩვევის დროს სხვა; ბავშვის ავადმყოფობისას სხვა და ჯანმრთელობისას სხვა;
    მაგალითად, ერთი დედის რძე შეამოწმეს, რომელიც ტყუპებს აჭმევდა და სხვადასხვა მხარეს სხვადასხვა შემადგენლობის რძე მოსდიოდა.
     
  • საკვები ღირებულების გარდა, რძეში ძალიან მნიშვნელოვანია ანტისხეულები, რომლებიც დაავადებებს ებრძვიან. მათი რაოდენობა იმატებს კიდეც, როცა ბავშვი გადაჩვევას იწყებს, რომ ბოლო შანსიც გამოიყენოს დედამ მის დასაცავად.
     
  • ხელოვნურთან შედარებით უფრო ადვილი მოსანელებელია, პირველ დღეებში ხსენი რომ მოდის, იმას საერთოდ არ სჭირდება მონელება და პირდაპირ იწოვს ბავშვის ორგანიზმი.
     
  • არ შეგეშინდებათ გაციების, რაც ძალიან გართულებადია ხოლმე რძის გარეშე. თვალის ინფექციას უწამლოდ მოარჩენთ რძით ერთ-ორ დღეში. ექიმის დანიშნულ სიცხის წამალს აწერია ‘სამი თვიდან’, არადა ბავშვის აცრა ხდება ერთ თვეზეც და ორ თვეზეც. რძე უებარი წამალია უამრავი რამისთვის.
     
  • დედისთვისაც ძალიან კარგია – მოსარჩენად, ფორმაში ჩასადგომად, დასასვენებლად. არ მოგიწევთ ღამე სამჯერ ადგომა საჭმლის გასაკეთებლად. არც ბოთლის რამდენჯერმე შეთბობა ცალი ხელით, სანამ ჭამას დაასრულებს. არც ერთი საათი ხელში ჭერა, რომ ბოთლის ჰაერი არ დარჩეს მუცელში. არც ტანჯვა და ექსპერიმენტები, თუ ფორმულა წყენს.
     
  • სულ არაფერთან შედარებით, ცოტა რძეც ბევრს ნიშნავს, განსაკუთრებით პირველ თვეებში.
     
  • რძისთვის მუშაობს ორი ჰორმონი: პროლაქტინის გამოყოფისას სისხლიდან გაკეთდება რძე, ხოლო ოქსიტოცინი გამოუშვებს რძეს, რასაც ინგლისურად let-down რეფლექსი ჰქვია. სხვათაშორის ეს რეფლექსი მოქმედებს მაშინაც როცა უბრალოდ ბავშვზე ფიქრობთ, ან უყურებთ ან მისი ტირილის ხმა გესმით – იმიტომ რომ ტვინი აკეთებს ამ ყველაფერს. Let-down-ს ხელს უშლის დაღლილობა, სიბრაზე, შიში, სტრესი, უარყოფითი ემოციები, ტკივილი, ა.შ.
    თუ დედა არ იკვებება ჯანსაღად, რძეში ნუტრიენტების შეტანისთვის ორგანიზმის ‘დახარჯვა’ და გამოფიტვა დაიწყება.
     
  • რძე იმატებს, როცა მოთხოვნა იმატებს (ბავშვი მეტს ჭამს, ან ხშირად ხდება ხელით გამოწველა). ანალოგიურად იკლებს, როცა აღარ არის საჭირო.

ამ თემაზე აუარება მასალა და ნაშრომია, სხვათაშორის ძალიან საინტერესო საკითხავი და ჟრუანტელის მომგვრელი – რომ რა მაგარია ადამიანის ორგანიზმი.

ცუდი ის არის, რომ ძალიან ბუნებრივი პროცესის მიუხედავად, ხშირად საშინელ პრობლემებს უკავშირდება. გაიკითხეთ თქვენს გარშემო და შეიძლება ვერც იპოვოთ ადამიანი, ვისაც მარტივად გამოუვიდა ეს ყველაფერი. შეიხედეთ თბილისის ფორუმზე, როგორი გამწარებული და ნატანჯია ხალხი. აქედან ბევრი რამე არასწორი ინფორმაციის დამსახურებაა და გოგოები იძულებული ხდებიან ხელოვნურზე გადავიდნენ. მათი გაკიცხვა არაფრით არ შეიძლება – ისედაც ეს უარესი გზაა, მათთვისაც საშინლად მტკივნეული, დამღლელი და სინდისის მქენჯნელი.
არადა თურმე სულ თითზე ჩამოსათვლელია პრობლემები, როდესაც დედას არ შეუძლია ბავშვის რძით კვება. სხვა შემთხვევებში თითქმის ყოველთვის არის ამის შესაძლებლობა თუნდაც ნაწილობრივ, გამოცდილი პროფესიონალი და ახლობლების მხარდაჭერა ძალიან ბევრს ცვლის. (unicef-ის მიხედვით საქართველოში მარტო 59% იყო რძეზე 2015-ში)

დაე, იყოს ხელოვნურზე, მაგრამ იყოს ეს ნამდვილი პრობლემის და არა ზარმაცი ექთნების ან ექიმების შეცდომების ბრალი. დღეს ისედაც მოუსწრებელ სამყაროში ვცხოვრობთ გოგოები, არ უნდა დავიჩაგროთ თავი! :))))

რამდენიმე პუნქტი მაინც უნდა დავწერო ამაზე, ვერ ვითმენ:

  • რაიმე სამედიცინო ჩვენების გარდა ნურავის განაჩენს დაიჯერებთ, რომ ბავშვი რძეს არ / აღარ მოწოვს. არ აქვს მნიშვნელობა მკერდის ფორმა-ზომას, რძის რაოდენობას. დაათვალიერეთ იუთუბზე როგორი ათასნაირი ისტორიაა. ზოგი საერთოდ თვეობით ხელით იწველის და ისე აჭმევს ბავშვს, სანამ ცოტა გაიზრდება და კიდევ ცდის. ზოგი საერთოდ გაშრობის პირას მყოფ ლაქტაციას აღადგენს. შეიძლება ჯერ კიდევ არის შანსი, დაჟინებული და სწორი მცდელობა ზოგჯერ შედეგიანია. უცხოეთში ცალკე პროფესიაც კი არის ამ ყველაფერთან გასამკლავებლად – ლაქტაციის კონსულტანტი. ჩვენთან კი ზოგჯერ შეიძლება მხოლოდ ახლობლების გამოცდილების იმედადღა დარჩე.
     
  • ‘სწორი’ იყო საკვანძო სიტყვა წინა პუნქტში. მე მგონი თბილისში სულ რამდენიმე მასაჟისტია (meta: დალი), ვინც სწორად იცის რძის გამოწველა. თანაც მარტივად და ტკივილის გარეშე. თუ სამსახურში გიწევთ გასვლა და გამოწველის პრობლემა გაქვთ, ან ვერ წოვს ბავშვი, აუცილებლად მოიყვანეთ მასაჟისტი მაშინვე. აუცილებლად. ზოგს ტკივილის ეშინია და თავს არიდებს, რადგან ზოგიერთი მათგანი კინაღან მეორე მშობიარობას გადაგატანინებთ, მაგრამ არ გაუჩერდეთ ეგეთ ადამიანს. არაფრით არ შეიძლება, რომ ეს მტკივნეული პროცესი იყოს.
     
  • ჯანდაცვის სამინისტროს გაიდლაინებშიც კი წერია, რომ სამშობიაროში არ უნდა იყოს საწოვარა და მატყუარა. თუ თავიდანვე არ მოდის რძე, ათასი საშუალებაა რომ საწოვარას გარეშე დაალევინონ ბავშვს საკვები. მაგრამ სად სცალიათ აბა ექთნებს მაგისთვის. ბოთლის წოვა ძალიან განსხვავდება დედის კვებისგან და მერე რომც გადავიდეს ბავშვი ბუნებრივზე, ძალიან რთულია ან შეუძლებელი გადაჩვევა, ამიტო ბოთლის მერე ხშირ შემთხვევაში კვება არის მტკივნეული, იწვევს ნახეთქებს და ა.შ. რაც სათქმელად მარტივია, მაგრამ ფიზიკურად აუტანელი. ექიმების გაიდლაინებს რატო ვკითხულობდი ეგ კიდე ცალკე თემაა.
     
  • სამშობიაროში წესით უნდა გასწავლონ კვების სწორი ტექნიკები. ან შეგიძლიათ წინასწარ ნახოთ ამ უკრაინულ არხზე. ძალიან კარგად ხსნიან ბევრ რამეს: Нина Зайченко – всё о грудном вскармливании.
    როცა ბავშვი სწორად არ არის მოჭიდებული (ან ბოთლივით ცდილობს წოვას), ვერ იღებს რძეს ბოლომდე, იღლება, შედეგად უფრო მშიერია და რძეც მცირდება.
     
  • და ბოლოს ყველაზე მთავარი: რაც უფრო ინერვიულებთ, დაისტრესებით, არ დაისვენებთ, ენერგიას არ მოაგროვებთ, არ დაიძინებთ, უფრო შემცირდება რძე და ვერაფერი წამალი მაგას ვერ უშველის.

სხვათაშორის, ადრე, სადღაც აფრიკაში, აკრძალული იყო მოყოლა, თუ როგორ ჩნდება ბავშვი. ზოგს ეგონა პირიდან ამოვიდოდა და თითები ელანდებოდა ყელში. მხოლოდ ბოლო წუთს იგებდნენ ყველაფერს, როცა კარავში შევიდოდნენ. ეგ ალბათ ერთადერთი გამართლებული დეზინფორმაციაა 😀 რომ შიში აეცილებინათ. ყველა სხვა შემთხვევაში ძალიან გვჭირდება ბევრი და კარგი ინფორმაცია. მიკვირს, რომ ქალების ჟურნალები ყვითელი ჰოროსკოპებით არის სავსე როცა თურმე ამდენი სასიცოცხლოდ მნიშვნელოვანი სირთულეა გადასალახი. ვითხოვთ საინტერესო და საჭირო ჟურნალებს :)))

ცოტა დამგრუზველი პოსტი გამომივიდა, მაგრამ ამ ყველაფრით სულაც არ გაშინებთ (ვინც ბოლომდე ჩამომყევით :))) ), საერთო ჯამში ძალიან მაგარია ცხადია 🙂

DevFest 2017 გამოსვლა: Continuous Integration-Delivery-Deployment

დეველოპერების ფესტივალის გამოსვლების გამოქვეყნება დაიწყო ^_^
ჩემს გამოსვლას აქ გავაზიარებ, რომ ბლოგზე მქონდეს. მიყვარს ეს ფესტივალი და მართალია დღეების ნაცვლად ერთი თვე მოვუნდი პრეზენტაციის მომზადებას პატარას ხელში :))) მაგრამ ძალიან მინდოდა მონაწილეობის მიღება.

ესეც დემოს ლინკი გიტჰაბზე:
https://github.com/elatsoshvili/DevFestDemo2017

Integration ტესტები მონაცემთა ბაზებით (Node.js + Mocha მაგალითზე)

კოდის ავტომატური ტესტები რამდენიმე ჯგუფად იყოფა. მოკლედ რომ ვთქვათ, Unit ტესტი გამოიყენება კოდის მცირე ფრაგმენტების გასატესტად. მაგალითად, თუ გვაქვს ტელეფონის ნომრის ფორმატირების ფუნქცია, მისთვის შეიძლება რამდენიმე unit ტესტი გვქონდეს სხვადასხვა შემთხვევის დასაფარად. მაგრამ თუ გვინდა შევამოწმოთ, როგორ რეგისტრირდება მომხმარებელი ამ ტელეფონის ნომრით და შემდეგ ავტორიზაციას გადის, უკვე რამდენიმე კომპონენტის ურთიერთობა უნდა მოვაქციოთ ჩვენს ტესტში – ეს integration ტესტია.

როგორც წესი, Integration ტესტთან გვაქვს საქმე, თუ ტესტი იყენებს:

  • მონაცემთა ბაზას
  • ქსელს
  • რაიმე გარე სისტემას (მაგ: მეილ სერვერს)
  • I/O ოპერაციებს

ზუსტად ამაშია მისი სირთულე, რომ უწყინარი unit ტესტების მსგავსად გარე სისტემებზე პირდაპირ ვერ შევასრულებთ სატესტო ოპერაციებს. მაგალითად, ასობით სატესტო მეილს ვერ გავგზავნით შემთხვევით გენერირებულ მისამართებზე. ასეთი პრობლემის გადასაჭრელად რამდენიმე გზა არსებობს, გააჩნია ჩვენ რისი ტესტირება გვსურს. მოდი ვარიანტებს შევხედოთ:

 

სერვისის იმიტაცია (Stubs, Mocks)

მაგალითად, ვწერთ კლიენტ აპლიკაციას, რომელიც სხვადასხვა სერვერზე არსებულ სერვისებს იძახებს. ანუ, ჩვენთვის კლიენტის კოდის შემოწმებაა მნიშვნელოვანი და არ გვსურს, რომ მან რეალურად გამოიყენოს სერვისები. ასეთ დროს შეგვიძლია სერვისის stub, ანუ სერვისის იმიტაცია გავაკეთოთ, რომელსაც ზუსტად იგივე ფუნქციები და პარამეტრები აქვს რაც ნამდვილს, უბრალოდ ლოგიკის შესრულების ნაცვლად პირდაპირ ჩვენს მიერ გაწერილ ფიქსირებულ პასუხებს აბრუნებს.

function sendMail(email, content) {
    console.log(‘Email sent to: ‘ + email);
    return true;
}

როდესაც ტესტირების რეჟიმში გავუშვებთ პროგრამას, მას ნამდვილი სერვისის ობიექტის ნაცვლად ჩვენი ყალბი სერვისი უნდა გამოვაყენებინოთ (ამის დეტალებს ცალკე პოსტში შემოგთავაზებთ).

 

მონაცემთა ბაზის გამოყენება

ახლა, ვთქვათ, სერვისს ვწერთ, რომელიც ინტენსიურად იყენებს მონაცემთა ბაზას და მის შესამოწმებლად გვინდა integration ტესტები. ცხადია, შეგვიძლია რომ ბაზის ფენაც stub-ით ჩავანაცვლოთ და select-ებმა, insert-ებმა, ა.შ. ფიქსირებული მნიშვნელობები დაგვიბრუნოს. თუმცა ხშირ შემთხვევაში ეს არაპრაქტიკულია და რეალურად პროცესებს შორის ურთიერთობა ვერ მოწმდება. მაგალითად, მინდა რომ მომხმარებელი დარეგისტრირდეს, გაააქტიუროს თავისი ანგარიში და გაიაროს ავტორიზაცია. ასეთი ოპერაციები ბაზის რამდენიმე ცხრილს იყენებს და მირჩევნია, რომ რეალურად ბაზაზე შესრულდეს.

ასეთ შემთხვევაშიც არსებობს რამდენიმე გამოსავალი. მაგალითად, მე ვამჯობინებ, რომ ცალკე ცარიელი ბაზა მქონდეს. არც in-memory და არც ბაზის მსუბუქი ალტერნატივა, არამედ ზუსტად იგივენაირი ბაზა, ოღონდ მხოლოდ ტესტებისთვის განკუთვნილი.
როდესაც ტესტირების რეჟიმში გაეშვება ჩემი პროგრამა, ის შესაბამისი კონფიგურაციიდან აიღებს სატესტო ბაზის მისამართს და სწორედ მას გამოიყენებს არენად. ტესტების ყოველი გაშვების წინ კი ცხრილებიდან ჩანაწერებს წაშლის, რომ არსებულმა მონაცემებმა ხელი არ შეუშალოს.

Node-ისა და Mocha-ს მაგალითზე გავაკეთებ ამას

წინა პოსტში სხვადასხვა გარემოს დაკონფიგურირებაზე ვსაუბრობდი. Mocha-ს ტესტებს მთლად ცალკე გარემოდ არ ვთვლი, რადგან შეიძლება გვქონდეს dev და test, ან კიდევ build სერვერები და ყველა მათგანზე ვუშვებდეთ ტესტებს. თუმცა ანალოგიურ მიდგომას – environment ცვლადებს გამოვიყენებ ტესტების გარემოს დასაკონფიგურირებლადაც და შევქმნი ფაილს .env.mocha

აქვე აღვნიშნავ: dotenv-ის აღწერაში თუ შეიხედავთ, იქ მუქად წერია, რომ არ არის რეკომენდირებული გვქონდეს .env, env.test, env.prod და ასე გამოყოფილი ფაილები, არამედ მხოლოდ ერთი .env ფაილი, რომელსაც სხვადასხვა სერვერზე სხვადასხვა შიგთავსი აქვს. ჩემი აზრით .env.mocha სულ სხვა მიზანს ემსახურება და ამ წესში არ შედის.

შემდეგი ნაბიჯია, რომ ტესტების გაშვების დროს ნამდვილის ნაცვლად .env.mocha ფაილი იყოს გამოყენებული. ინტერნეტში ამის კროს-პლატფორმული მუშა მაგალითი არ არის, მე კი ვინდოუსზე მიყვარს მუშაობა. ამიტომ ჩემს ვარიანტს შემოგთავაზებთ, სადაც ყველა ტესტ ფაილში არ მოგიწევთ კონფიგურაციის ჩატვირთვა:

  • პროექტის საქაღალდეში .env-ის გვერდით შევქმნათ .env.mocha და შევავსოთ სასურველი კონფიგურაციით.
  • test საქაღალდეში შევქმნათ ფაილი setup.js და შიგნით ჩავწეროთ ეს ხაზი:
    require('dotenv').config({path:__dirname + '/../.env.mocha'});
  • test საქაღალდეში შევქმნათ კიდევ ერთი ფაილი – mocha.opts და შიგნით ჩავწეროთ:
    --require test/setup.js

სულ ეს არის.
npm test-ს რომ გავუშვებთ პროექტზე, ტესტები ავტომატურად ყველგან .env.mocha კონფიგურაციას გამოიყენებენ.

თავი რომ დავიზღვიო და დარწმუნებული ვიყო რომ mocha-ს გაშვებისას ნამდვილად შესაბამისი კონფიგურაცია არის ჩატვირთული და სამუშაო ბაზა არ წავშალო, კიდევ რაიმე ცვლადს ჩავამატებ .env.mocha ფაილში და მხოლოდ მისი არსებობის შემთხვევაში გავაგრძელებ setup.js-ის შესრულებას (მაგალითად: MOCHA_CONFIG_LOADED=yes)

მე ასევე მინდა, რომ ყოველ გაშვებაზე ცხრილები დაცარიელდეს. Mocha-ს აქვს სხვადასხვა ჰუკები, მათ შორის before(), რომელსაც თუ describe-ის შიგნით აღვწერთ, მაშინ test suite-ის გაშვების წინ შესრულდება, ხოლო თუ გლობალურად აღვწერთ, მაშინ სულ ყველა ტესტამდე ერთხელ შესრულდება. სწორად მას გამოვიყენებ, რომ ტესტირების დაწყებისას ცხრილები დავაცარიელო. კარგი იქნებოდა, რომ setup.js ფაილშივე შეიძლებოდეს მისი აღწერა, მაგრამ თუ ცდით, ნახავთ რომ იქ mocha არ არის ჯერ ჩატვირთული და before ცვლადს ვერ იპოვის. ამიტომ test საქაღალდეში დავამატე ფაილი hooks.js და ამ ფაილში აღვწერე ჩემი გლობალური ჰუკები.

თუ Integration ტესტების შესრულებას დიდი დრო მიაქვს, შესაძლებელია ისე დააკონფიგურიროთ package.json-ში სკრიპტები, რომ unit ტესტებისა და integration ტესტების გაშვება (დირექტორიის დონეზე) ცალცალკე ბრძანებით ხდებოდეს.