jQuery საკუთარი ხელით – ნაწილი 1

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

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

პოსტის დანარჩენი ნაწილის წაკითხვამდე მინდა გაგაფრთხილოთ რომ ეს არ არის ტუტორიალი jQuery – ს შესწავლის მსურველთათვის, და იგულისხმება რომ თქვენ უკვე გაქვთ ამ ბიბლიოთეკასთან მუშაობის გარკვეული გამოცდილება.
სრულად »

ტეგები: , , ,

Code.ge redesign… And I’m back B-)

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

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

პირველი ეტაპისთვის გამოვნახე დრო და გავაკეთე ბლოგის გარეგანი იერსახის სრული ცვლილება რომელიც ალბათ უკვე თვალში მოგხვდათ :D

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

პირველ რიგში დღეს გავაოფენსორსე(როგორი ქართულია? :D ) LinGO ინგლისურ ქართული ლექსიკონი iPhone – სთვის რომელიც ხელმისაწვდომია GitHUB – ზე. ეს მინი პროექტი აუცილებლად მიიღებს დასრულებულ სახეს რადგან დღეიდან მასში მონაწილეობას მიიღებს ორი გამოცდილი Mac (და არა მარტო) დეველოპერი – ლაშა დოლიძე და ირაკლი ნადარეიშვილი! დიდი მადლობა ორივეს მხარდაჭერისა და ამ პროექტში მონაწილეობის სურვილისათვის.

სხვა სიახლეებსა და შეძლებისდაგვარად სასარგებლო ნამუშევრების შესახებ სულ მალე შეიტყობთ ამ ბლოგის მეშვეობით.

მაშ ასე I’m Back B-)

ტეგები: , , , ,

ქართული ტერმინოლოგია – დილემა

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

პრობლემა თავისთავად რთულია და ერთის მხრივ შესაძლებელია რომ ამ პრობლემას ჩემი მხრიდან ქართულის არასათანადო ცოდნაც ამძაფრებს… მაგრამ… ეგება ვინმემ მიმითითოს ავტორიტეტულ წყაროზე ან ჯგუფზე ვინც ამ ტერმინების თარგმნით არის დაკავებული? კი ვიცი რომ ითარგმნება მთელი რიგი პროგრამული პაკეტები არსებობს გაქართულების ჯგუფები და ა.შ. მაგრამ მოდით რეალურად შევხედოთ პრობლემას. ერთია როდესაც თარგმნი “checkbox” – ს და მას არქმევ თოლიას(ჩემთვის სრულიად წარმოუდგენელი თარგმანია და ალბათ შინაგანად ვერასოდეს დავძლევ ბარიერს და ვერ გამოვიყენებ ამ ტერმინს), მაგრამ, მეორეა როდესაც უნდა თარგმნო ამ სფეროში დამკვიდრებული ისეთი სიტყვები და ფრაზები რომლებსაც განსაკუთრებული მნიშნველობა აქვთ შეძენილი კონტექსტიდან გამომდინარე.

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

ჩემს შემთხვევაში პირველი და ყველაზე მნიშნველოვანი ფრაზა რის თარგმნასაც რამდენიმე წელია ვცდილობ და ვერაფრით ვერ მოვახერხე არის Content Management System(CMS). CMS – ის თარგმნა რამდენჯერმე ვთხოვე ქართულის ჩემზე გაცილებით უკეთ მცოდნე პიროვნებებს… თუმცა რა შედეგი მივიღე? არაფერი! და რატომ? პირველ რიგში Content – ის თარგმანის სავარაუდო ვარიანტებია “შინაარსი, შიგთავსი, არსი და ა.შ.” როგორც არ უნდა ვუტრიალოთ ამ სიტყვის ასეთი თარგმანი აბსოლუტურად არაფერს არ გვაძლევს, და რატომ? იმიტომ რომ კონკრეტულად “Content Management System” – ის კონტექსტში ეს სიტყვა მოიცავს გაცილებით მეტს ვიდრე უბრალოდ შინაარსს, კერძოდ კი კონტენტი ეს არის კომპლექსური მონაცემის ტიპი რომელსაც გააჩნია აზრი(meaning) და კონტექსტი. პირობით მაგალითად რომ განვიხილოთ ამ ბლოგის პოსტები, აღმოვაჩენთ რომ თითეულ ბლოგ პოსტს გარდა თავად პოსტისა გააჩნია სხვადასხვა ატრიბუტები(სათაური, გამოქვეყნების დრო, კატეგორა/კატეგორიები(შეიძლება განვიხილოთ როგორც კონტექსტი), ავტორი და ა.შ. გამომდინარე აქედან ბლოგ პოსტი ზოგადად არის სპეციფიური კონტენტის ტიპი. ახლა ისმის კითხვა შესაძლებელია რომ ცალკეულ ბლოგ პოსტს ვუწოდოთ მარტივად შინაარსი ან შიგთავსი? არ ვიცი მე პირადად ვერანაირ ასოცირებას ვერ ვახერხებ კონტენტთან… თუ ვცდები შემისწორედ ამით ძალიან გამახარებთ…

და რა მოხდება თუ წერისას ან საუბრისას უბრალოდ გამოვიყენებთ ფრაზას “კონტენტის მენეჯმენტის სისტემა”? რა დაშავდება ამითი? ხომ არ ჯობია თარგმნის ნაცვლად თამამად გამოვიყენოთ ასეთი პრობლემური სიტყვები/ფრაზები რომლებმაც ინდუსტრიაში გარკვეული გავრცელება ჰპოვა და სპეციფიური დატვირთავა შეიძინა? თუ ამ საკითხთან დაკავშირებით გაგიჩნდებათ პროტესტის გრძნობა, აბა მითხარით როგორ გადათარგმნით “Enterprise Java Beans(EJB)”? არა მითხრას ვინმემ? ვთარგმნოთ პირდაპირ? და იცით რას მივიღებთ?

Enterprise Java Beans(EJB) – საწარმოო ყავის მარცვლები აი ვინმემ მითხრას ახლა რა შუაშია საწარმოო ყავის მარცვლები?

თუ წინა ორი მაგალითი არ არის საკმარისი აბა სცადეთ თარგმნოთ “widget“, ძალიან მაინტერესებს როგორ უნდა ითარგმნოს ეს სიტყვა რომელიც ვების კონტექსტში შეიძლება განვმარტოთ როგორც – Interactive mini application that delivers content and functionality to the user. თუმცა კონტექსტიდან გამომდინარე ვიჯეტს სხვა განმარტებებიც გააჩნია…

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

ტეგები:

Jetpak – დამატებების ახალი სისტემა Mozilla – სგან

jetpack_logo საერთოდ ცნობილია რომ კონკურენცია ძალიან კარგი რამ არის. ამ მტკიცებულების სისწორის კიდევ ერთი ძალიან კარგი მაგალითი გვაქვს სახეზე კერძოდ კი Google Chrome – სა და Mofilla Firefox – ის ე.წ. extension – ების სისტემების სახით.

მოგეხსენებათ რომ Google Chrome ძალიან ახალი ბრაუზერია რომელიც გასული წლის სექტემბრის დასაწყისში მოევლინა სამყაროს. მიუხედავად მისი ინოვაციურობისა მისი კრიტიკის ერთერთ მთავარ მიზეზად იქცა FF – ის მსგავსი დამატებების სისტემის არ ქონის გამო.

ცხადია ასე პირველივე დღიდან ყველაფერის ჩადებას ვერ მოახერხებდა Google თავის ახალ ბრაუზერში, თუმცა, როგორც მალე გაირკვა შეჩერებასაც არ აპირებდა. სულ რამდენიმე თვეში გამოჩნდა პირველი პროპოზალი რომელიც Chrome – ს დამატებების პლატფორმას შეეხებოდა. თუმცა ამ პროპოზალში ერთმა მეტად საგულისხმო დეტალმა გაიჟღერა – განსხვავებით FF – ის ანალოგიური სისტემისგან Chrome – ს დამატებების შესაქმნელად საკმარისია მხოლოდ HTML/CSS და JavaScript. არავითარი XUL, არავითარი რთული XML კონფიგურაციის ფაილები დამატების ინსტალაციისათვის და ა.შ.

Google – ს ეს გდაწყვეტილება ჩემთვის პირადად გაცილებით მისაღები იყო რადგან XUL – ის ვერანაირ აუცილებლობას ვერც FF – ში ვხედავდი მანამდე და სიმართლე ითქვას ვერც დღეს ვერ ვხედავ… თუმცა არც Mozilla – მ დააყოფნა და დღეს უკვე შემოგვთავაზა FF – ის დამატებების შექმნის ახალი მექანიზმი. კერძოდ კი Jetpak!

ციტატა პროექტის საიტიდან:

In short, Jetpack is an API for allowing you to write Firefox add-ons using the web technologies you already know.

რითია საინტერესო Jetpak? პირველ რიგში ისევე როგორც Crhome – ს შემთხვევაში, Jetpak – ის შემთხვევაშიც დამატების შესაქმნელად საკმარისია მხოლოდ HTML/CSS და JavaScript. ამ შემთხვევაშიც არავითარი XUL და რთული XML კონფიგურაციის ფაილები. ასევე არავიტარი ბრაუზერის გადატვირთვა დამატების ინსტალაციის შემდგომ და რაც ყველაზე ყველაზე ყველაზე მნიშვნელოვანია დეველოპმენტის პროცესში შეგვიძლია გამოვიყენოთ ნებისმიერი არსებული ინსტრუმენტული საშუალებები და Firebug დებაგირებისათვის რაც არსებულ მოდელში პრაქტიკულად შეუძლებელია. ასევე jQuery – ს მოყვარულთათვის ძალიან მნიშვნელოვანი ფაქტია რომ ეს ბიბლიოთეკა ნაგულისხმევად არის ჩადებული Jetpak – ში, რაც კიდევ უფრო გაამარტივებს დამატებების პროგრამირებას.

მართალია დასრულებამდე და საყოველთაო გავრცელებამდე კიდევ დიდი გზა აქვს გასავლელი Jetpak – ს, თუმცა მისი გამოყენება უკვე შესაძლებელია. ასე რომ თუ არ გეზარებათ შეგიძლიათ დააინსტალიროთ და დამატებების წერასაც შეუდგეთ :)

ტეგები: , , , ,

Handling “onchange” event revisited

რამდენიმე თვის წინ დავწერე პოსტი, HTML ფორმის ელემენტის onchange ივენთისა და მისი დელეგირების შესახებ.

ნახსენებ პოსტში ნაჩვენებია onchange ივენთის დელეგირების მაგალითი სადაც ფორმის ყველა ელემენტის აღნიშნული ივენთის ცენტრალიზებული კონტროლი ხორციელდება მშობელი ელემენტის onchange ივენთის მეშვეობით.

მსგავსი შედეგის მიღწევა შესაძლებელი ე.წ. Event Bubbling – ის წყალობით რაც ივენთის, საწყისი ელემენტიდან მშობელი ელემენტისკენ გავრცელებას ეწოდება. მეტი თვალსაჩინოებისთვის იხ. სურათი(სურათისათვის განსაკუთრებული მადლობა ირაკლის):

picture-17

ივენთის გავცელების(შვილიდან მშობლის მიმართულებით) ასეთი მეთოდი ყველა ბრაუზერში ერთნაირად მუშაობს. და წესით ეს უნდა ეხებოდეს ყველა ტიპის ივენთს. თუმცა როგორც მოსალოდნელი იყო IE – ში მისი მერვე ვერსიის ჩათვლით სწორედ ამ ივენთზე აღმოჩნდა შეზღუდვა და იგი საწყისი ელემენტს(ელემენტი რომელზეც უშუალოდ წარმოიშვა ეს ივენთი) იქეთ არ ვრცელდება.

ერთი შეხედვით, ამ ჩიხიდან რამდენიმე გამოსავალი შეიძლება მოიძებნოს:

  1. ფორმის ყველა ელემენტის ჩამოვლა და მათთვის onchange ივენთ ჰენდლერის მინიჭება. თუმცა აქ მთელ რიგ პრობლემებს წავაწყდებით:

    • ელემენტებზე ასეთი გზით ივენთ ჰენდლერების მინიჭება IE – ში იწვევს მეხსიერებასთან დაკავშირებულ პრობლემებს, ე.წ. memory leaks. ეს გარემოება განსაკუთრებით მნიშვნელოვანია თუ ფორმაში ბევრი ელემენტები გვაქვს.
    • თუ ფორმის ელემენტები იტვირთება დინამიურად Ajax – ის მეშვეობით, ყოველი ასეთი ჩატვირთვის შემდეგ საჭიროა: ა) ყველა ფორმის ელემენტისა და მათი ივენთ ჰენდლერების განადგურება რათა თავიდან ავირიდოთ მეხსიერებასთან დაკავშირებული პრობლემები; ბ) ახლად ჩატვირთული ელემენტების იტერაცია და მათთვის შესაბამისი ივენთ ჰენდლერების განსაზღვრა.

    დამეთანხმებით რომ აღწერილი ორი მეთოდი დიდი მოქნილებით არ გამოირჩევა.

  2. ნაცვლად onchange ივენთისა გამოვიყენოთ onfocus და onblur ივენთები. თუმცა აღმოჩნდა რომ არც ამ ივენთების გავრცელება არ ხდება ტრადიციული(შვილიდან მშობლის მიმართულებით) მეთოდით.

გარკვეული კვლევა ძიების შემდეგ მივაგენი ისეთ ივენთებს(დიდი მადლობა PPK – ს) რომელთა ბაბლინგი IE – ში ისე მუშაობს როგორც საჭიროა. ეს ივენთებია onfocusin და onfocusout.

როგორ შეიძლება აღნიშნული ივენთების გამოყენება პრობლემის გადასაჭრელად? სანამ უშუალოდ კოდის წერას დავიწყებთ საჭიროა კარგად გავერკვეთ თუ როგორ მუშაობს onchange ივენთი HTML ფორმის ცალკეული ელემენტებისათვის და ასევე თუ რა გვერდის ავლის მექანიზმების გამოყენებაა შესაძლებელი IE – ში.

SELECT ელემენტი

ამ ელემენტის შემთხვევაში onchange ივენთი წარმოიშვება მხოლოდ იმ ჩამოსაშლელი სიიდან კონკრეტული ელემენტის ამორჩევის დროს. IE – ში იგივე ხდომილების ემულაციისათვის შესაძლებელია onclick ივენთის გამოყენება, თუმცა, ასეთ შემთხვევაში ივენთი ორჯერ წარმოიშვება ერთხელ ელემენტის გააქტიურებისას ხოლო მეორედ ჩამოსაშლელი სიიდან მნიშვნელობის არჩევისას. თუმცა ამ პრობლემის არიდება მარტივად არის შესაძლებელი სწორედ onfocusin და onfocusout ივენთების მეშვეობით რადგან ეს ორივე ივენთი წარმოიშვება onclick ივენთამდე, გამომდინარე აქედან შესაძლებელია წინა ივენთის ტიპის დამახსოვრება და შემდგომ უკვე დადგენა ეს იყო პირველი კლიკი თუ ჩამოსაშლელი მენიუდან ელემენტის არჩევა მოხდა?

INPUT text და TEXTAREA ელემენტები
ამ ელემენტების შემთხვევაში onchange ივენთი წარმოიშვება როდესაც ელემენტი კარგავს ფოკუსს. IE – ში იგივეს მიღწევა შესაძლებელია onfocusout ივენთის მეშვეობით.

INPUT checkbox და radio ელმენტები
ამ ელემენტების შემთხვევაში onchange ივენთი წარმოიშვება მათი მნიშვნელობის ცვლილების თანავე. IE – ში იგივე შედეგის მისაღებად მარტივად არის შესაძლებელი onclick ივენთის გამოყენება.

მაშ ასე წინა სამი პარაგრაფში გამოიკვეთა სამი ისეთი ივენთი რომელთა გამოყენებაც შესაძლებელია onchange ბაბლინგის ემულაციისათვის. ეს ივენთებია: onclick, onfocusin, onfocusout.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
(function() {
   
   var div = document.getElementById('testonchange');
   
   //ყველა ბრაუზერი IE - ს გარდა
   if (document.addEventListener) {

      div.onchange = function(e) {
         //აქ შეგვიძლია გამოვიძახოთ ივენთის უშუალო ჰენდლერი
      };

   } else { //IE - ს სპეციფიური რეალიზაცია
     
      var previousEvent = null;
     
      div.onfocusin = div.onfocusout = div.onclick = function() {

         var e            = window.event,
            target       = e.srcElement,
            isSelect     = target.nodeName  == 'SELECT',
            notTextInput = target.nodeName  == 'INPUT' && /^radio|checkbox$/i.test(target.type),
            isTextInput  = (target.nodeName == 'INPUT' && target.type == 'text') || target.nodeName == 'TEXTAREA',
            validElement = notTextInput || isSelect;

         if (isSelect && !target.size && /^focus(in|out)$/.test(previousEvent)) {
            validElement = null;
         }

         previousEvent = e.type;

         if ((e.type == 'click' && validElement) || (e.type == 'focusout' && isTextInput)) {
            //აქ შეგვიძლია გამოვიძახოთ ივენთის უშუალო ჰენდლერი
         }

      };

   }
   
   div = null;
   
})();

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

ტეგები: , ,

JavaScript: Regex and Multi-line Mode

დღეს აღმოვაჩინე რომ JavaScript – ის Regex იმპლემენტაციას გარდა სხვა ნაკლოვანებებისა ასევე არ გააჩნია ე.წ. “multi-line match mode”. ამ შემთხვევაში ლაპარაკი არ მაქვს რეგულარული გამოსახულების “m” მოდიფიკატორის მხარდაჭერაზე, ლაპარაკი მაქვს “s” მოდიფიკატორზე რომელიც “.“(წერტილი) სიმბოლოს აიძულებს გარდა სხვა სიმბოლოებისა(ნაგულისხმევად “.” ნიშნავს “ნებისმიერი სიმბოლო გარდა ახალი სტრიქონის სიმბოლოსი”) ასევე მოძებნოს ახალი სტრიქონის სიმბოლო.

ჩემი მარტივი ამოცანის გადასაჭრელად საჭირო იყო მოცემულ ტექსტში მეპოვა შემდეგი ტიპის მონაკვეთი:

1
2
3
function myFunction($param1, $param2) {
      return array($param1, $param2);
}

ხოლო ნაპოვნი მონაკვეთიდან ამომეღო {code}{/code} ტაგებს შორის მოქცეული ტექსტი. თუმცა ეს გასაგები მიზეზების გამო არ გამომივიდა.

ნებისმიერ PCRE – სთან თავსებად იმპლემენტაციას გააჩნია “s” მოდიფიკატორი რომლის მეშვეობითაც მსგავსი ამოცანა წყდება ძალიან მარტივად. მაგალითად PHP – ში რეგულარულ გამოსახულებას ჩავწერდით შემდეგნაირად:

1
2
3
//ყურადღება მიაქციეთ გამოსახულების ბოლოში
//მიწერილ "s" სიმბოლოს
$regex = '/{code lang="(\w+)"}(.*?){\/code}/s'

სამწუხაროდ ასეთ გამოსახულებას JavaScript – ში ვერ დავწერთ. თუმცა, ცოტაოდენი კვლევაძიებისა და ექსპერიმენტების შემდგომ მივაგენი გამოსავალს რაც გამოიხატება სპეციფიური ე.წ. character class – ის გამოყენებაში. ამისათვის საჭიროა “\s” და “\S” მეტა სიმბოლოების დაჯგუფება character class – ში. შედეგად მივიღებთ შემდეგ გამოსახულებას:

1
[\s\S]

სადაც “\s” შეესაბამება ნებისმიერ უხილავ სიმბოლოს, ხოლო “\S” შეესაბამება ნებისმიერ არა უხილავ სიმბოლოს.

შედეგად მივიღე ასეთი JavaScript – ის რეგულარული გამოსახულება:

1
/{code\s+lang="(\w+)"}([\s\S]*){\/code}/

ეს გამოსახულება მუშაობს ანალოგიურად PCRE – სთან თავსებადი გამოსახულებისა რომელიც იყენებს “s” მოდიფიკატორს.

ტეგები: ,