ჩემი სემინარი თსუ-ში 2: ვებ სერვისები (SOAP, REST)

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

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

ამ შაბათს კი (29 იანვარს ისევ 5 საათზე) ისე მოხდა, რომ ისევ მე ვკითხულობ სემინარს და თემა შეეხება ვებ სერვისებს.

ისევ დავიწყებ შედარებით საბაზო სტრუქტურით და შესავლით, ხოლო შემდეგ ვისაუბრებ SOAP და REST არქიტექტურის მქონე სერვისებზე.

ჩემი სემინარი თსუ-ში: ვებ აპლიკაციის უსაფრთხოება

რამდენიმე თვის წინ თბილისის სახელმწიფო უნივერსიტეტის კომპიუტერული მეცნიერების მიმართულების სტუდენტებმა ერთ საინტერესო წამოწყებას ჩაუყარეს საფუძველი : D

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

მაგალითად აქამდე ჩატარდა სემინარები:

  • HTML5-სა და HTML4–ს შორის განსხვავება და ახალი API–ები (ნინო ლომინეიშვილი)
  • HTML5: Drag & Drop (მარიამ ხუნჯგურუა)
  • HTML5 Web Storage (შოთა ბაკურაძე, არჩილ ვარშანიძე)
  • Mobile Device Game Architecture (გიორგი აბელაშვილი)
  • Introduction to Android development (ირაკლი მანაგაძე)
  • Facebook for developers (დავით თვალჭრელიძე, გიორგი მაისურაძე)

სემინარების შესახებ ინფორმაცია ქვეყნდება ხოლმე facebook-ზე.

ამ შაბათს, ანუ 22 იანვარს (როგორც ყოველთვის 17:00 საათზე ბიოლოგების კორპუსის 421-ე აუდიტორიაში) იქნება ჩემი სემინარი :D

რომელიც ვებ აპლიკაციის უსაფრთხოებას შეეხება.

დავიწყებ სულ საბაზო სტრუქტურის მიმოხილვით, თუ როგორ არის ქსელში მოწყობილი კლიენტისა და ვებ აპლიკაციის ურთიერთობა და რატომ არის ისეთი, როგორიც არის (HTTP პროტოკოლი, HTTP request / response, სესიები).

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

შევეხები თემებს: Injecting OS commands / SQL / scripting languages, Directory traversal, Remote file inclusion, Persistent / Non-persistent XSS attack, Cross-site tracing და საშიში HTTP მეთოდები,  DDoS attack, Brute force, და კიდევ რამდენიმე, თუ არ გამომაგდეს აუდიტორიიდან :D

ესეც ანონსი..

p.s. იმედი მაქვს ვინმე არ გადაწყვეტს დაამტკიცოს რომ აზრზე არ ვარ უსაფრთხოების და ხვალ ჩემი ბლოგი ცოცხალი დამხვდება :  D ჩვეულებრივი ვორდპრესია და ბეკაპების გარდა არაფრისთვის ვიწუხებ თავს.

Trip to Google

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

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

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

შთაბეჭდილებების გაზიარება არც ისე კარგად გამომდის ხოლმე :) ამიტომ რამდენიმე ფოტო…

google

google

teo_rachvela_lekva

teo_rachvela_lekva

lekva_elle_rachvela

ეეეი.. ეხლა დავინახე თითები უკან

Update:

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

Coding შეკითხვები იყო შემდეგი (მე ჯავაზე ვწერდი, თუმცა შეიძლება C++-ზეც):

1. დასაწერი იყო მეთოდი, რომელსაც გადაეცემა პარამეტრად List ტიპის ობიექტი და მეთოდმა უნდა დააბრუნოს ამ ლისტიდან random ობიექტი. random-ისთვის შეიძლებოდა ჯავას Random კლასის გამოყენება.

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

Object getRandom(List list){

if (list == null || list.size() ==0)  do something;

int next = Random.nextInt(list.size());

return list.get(next);

}

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

3. დასაწერი იყო მეთოდი, რომელსაც პარამეტრად გადაეცემა ინდექსი (0-დან) და აბრუნებს შემდეგი სახის სტრიქონს: 0-ის შემთხვევაში A, 1 – B, ასე სანამ ინგლისური ალფაბიტი არ ამოიწურება. შემდეგ იქნება AA, AB….  AAA, AAB, AAC…

მაგალითად როგორც ექსელშია გადანომრილი სვეტები.

4. დასაწერი იყო Iterator-ის კლასი (next და hasNext მეთოდები), რომელიც დადის არა კოლექციის შიგნით, არამედ კოლექციების კოლექციაში. ანუ, რომ წარმოვიდგინოთ გადაბმული კოლექციები.

ალგორითმებზე შეკითხვები:

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

კიდევ ერთი კითხვა იყო ალგორითმებთან კავშირში: 10მბ ზომის ფაილი უნდა დამეკოპირებინა ერთი მანქანიდან 10000 მანქანაზე, ოღონდ სწრაფად. და ჩათვლილი იყო, რომ დისკიდან წაკითხვის და დისკზე წაკითხვის სიჩქარეა 100მბ/წმ, ხოლო ქსელში მონაცემების გადაცემის სიჩქარე – 1000 მეგაბიტი წამში. ასევე სანამ ფაილი ბოლომდე არ ჩაიწერება ერთ ადგილას არ შეიძლება იმ ადგილიდან მისი გადაწერა სხვაგან. და კიდევ ერთი კომპიუტერიდან რამდენიმეზე პარალელურად გაშვებული გადაწერა მაინც ცალცალკე დაითვლება, იმიტომ რომ არ შეუძლია ქსელში დაუკავშირდეს რამდენიმეს ერთად და ისე გადაუწეროს.

low level კითხვებში იყო ასეთი რამეები:

1. რა არის ბაიტის მაქსიმალური მნიშვნელობა?

2. როგორ შევინახოთ ბაიტში დიდი რიცხვი? მაგალითად 1000 ან 100 000

3. როგორ არის წარმოდგენილი float ტიპის მნიშვნელობა მეხსიერებაში?

4. როგორ არის ჯავაში რეალიზებული ArrayList? და საერთოდ როგორ ხდება დინამიური მასივის მართვა მეხსიერებაში

იყო კიდევ ერთი ასეთი შეკითხვა, რომელიც არ ვიცი რა ტიპში შედის..

ვთქვათ, მობილურის ერთ-ერთ ოპერატორს უნდა გაუკეთო sms-ების შესანახი ბაზა, რაიმე storage, რომელსაც შემდეგ აპლიკაციები გამოიყენებენ. რა მეხსიერებას (სერვერები) გამოყოფდი ამ sms-ების შესანახად?

მე მგონი სულ ეს იყო :D

better not be late :)

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

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

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

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

რამდენიმე წლის წინ ბროწეული გახმა. მოვჭერით და ყოველთვის როცა მომჟავო და მოთეთრო ბროწეულს მივირთმევ, მახსენდება, როგორ არ ვაფასებ იმას რაც მაქვს :D

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

Who dares, wins :D

რას მივუძვნიდი ამ პოსტს, თუ არა ჯეოლიმპს :)

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

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

სამ დღეს თუ გადაცდა ეს პროცესი, სასტიკად მძულს ის ამოცანა და ამოხსნა კი არა, გახსენებაც აღარ მინდა : ))

ჯეოლიმპში ის მომწონს, რომ საჩემო ამოცანებიც არის :D ჩემს ჭიასაც უხარია, როცა ნოლზე არ ვრჩები.

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

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

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

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

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

(თვითონ ხომ კარგს არ დაწერენ თავის თავზე.. :D )

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

ბოლო დროს ჩამოყალიბებული ტრადიციისამებრ ინტერნეტ-რაუნდის პარალელურად დასწრებული შეჯიბრიც ჩატარდება ერთ-ერთ სასწავლო დაწესებულებაში – ამ რაუნდში კონკრეტულად თბილისის სახელმწიფო უნივერსიტეტის XI კორპუსში, სადაც ადგილობრივი გამარჯვებულიც გამოვლინდება :)

ჰოდა, რომ მეუბნებით ხოლმე ზოგიერთები ტრასაზე როდის დავდგეთო, :D მობრძანდით კვირას (19-ში) და ამ არენაზე შევეჯიბროთ. its more fun.  მე დიდი ამომხსნელი არ ვარ, მაგრამ მაინც სახალისოა.

”ჯეოლიმპი” თბილისის სახელმწიფო უნივერსიტეტში

”ჯეოლიმპი” თბილისის სახელმწიფო უნივერსიტეტში

ლოგოების ხელოვნება

მე ახლა თავს უფლებას ვერ მივცემ ლოგოების ავ-კარგიანობაზე ან ’როგორი-უნდა-იყოს-ლოგო’ თემაზე ვისაუბრო :) )  მაგრამ თვალიერება მეტისმეტად მიყვარს. დღეს კიდევ ფრიად სასიამოვნოდ გამაკვირვა რამდენიმე მათგანმა.

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

აი, თავად ნახეთ:

logos1

ეს Web designer ledger-ზე იყო..
ამას კი logopond.com-ზე გადავაწყდი:<
logos2
ეს ”იმედის გმირები” milash-ს, იგივე გიორგი ბოხუას ეკუთვნის და მისი სხვა ლოგოები ამ ბმულზე შეგიძლიათ ნახოთ.
ამავე საიტზე შემხვდა ქართული ლოგოების კიდევ ერთი ავტორი – topicha

giwa-by-topicha1მისი გალერეა ამ ბმულზეა.

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

აქ კი logopond.com-ზე არსებული პორტფოლიოებიდან რამდენიმე ჩემს ფავორიტს, ორიგინალურ ლოგოს ამოვარჩევ:

the_human_elements_by_impodsterThe Human Elementsby impodster

in_safe_hands_by_danny

In Safe Hands by danny

minimal_logos_8

minimal_logos_21

minimal_logos_2

the_little_big_company_by_nidoThe Little Big Company by nido

gels_kitchen_by_lboiGel’s Kitchen by lboi

grace_hospice_by_strangeideasGrace Hospice by strangeideas

more_by_actiondesignerMore by actiondesigner

hope_by_janzabranskyHope by janzabransky

ბოლოს იდეა ძალიან მომწონს :) )

File input ველი html-ში

ბლოგზე მაინც დავწერო რამე, გულს გადავაყოლებ..

ყველაზე ბოლოს რაც მახსოვს, html file input-ის ღილაკზე მინდოდა სტილის დადება (არ მითხრათ flash-ით გექნაო :D )

ნუ, თურმე, რაც არ უნდა თავი მოიკლას კაცმა, მაგ ღილაკს სტილს ვერ შეუცვლის.. ვერც ტექსტს (choose file…). ამ ტექსტს ბრაუზერი სვამს და თან სხვადასხვა ბრაუზერში სხვადასხვაა ხოლმე.

გუგლმა რაღაც ჰაკებამდე მიმიყვანა.. ხალხი css-ით და javascript-ით აღწევს იმას, რომ ამ file input-ს გამჭვირვალეს ასვამს თავზე ჩვეულებრივ ღილაკს და input ველს (ანუ fileinput ზევიდანაა).

და მერე ჯავასკრიპტით იღებს ფაილის სახელს..

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

<button type="submit" id="fake-btn" onclick="document.getElementById('real').click();"> ატვირთვა</button>
<input type="text" id="filename_in"/>
<input type="file" id="real" style="display:none" value="some" onchange="document.getElementById('filename_in').value = this.value;"/>

ანუ, ვმალავ ნამდვილ ამტვირთავ ინფუთს, მაქვს ჩემი ღილაკი და ტექსტური ინფუთი და როცა ვინმე დააჭერს ჩემს ღილაკზე, ვაჭერინებ დამალულზეც click() მეთოდით. ხოლო მერე რა value-საც მიიღებს დამალული ელემენტი , ის გამომაქვს ჩემს ტექსტურ ინფუთში (onchange ივენტის საშუალებით).

მაგრამ მერე გამოჩნდა რატომაც არ გამოდიოდა ესე მარტივად. მოზილას და ოპერას click() მეთოდი (რომლითაც პროგრამულად ვაკეთებთ ელემენტზე მაუსის დაჭერის შემცვლელ მოქმედებას) არ აქვთ file input-ისთვისთვის.. გამონაკლისია ეს. ალბათ უსაფრთხოების მხრივ, მაგრამ რა დიდი ზარალი ეგ არის, ერთი ფაილ დიალოგი გამოვიდეს და მორჩა.. მოკლედ არ ვიცი რატომ არ აქვთ :D მაგრამ ფაქტია.. და კიდევ არც onchange ივენთი არ ესმით მაგისთვის.

ჰაკებსაც არ ადგიათ კარგი დღე. თუ ვინმე გადაწყვეტთ ამ ფაილ ინფუთის გალამაზებას, ბევრი ბრაუზერის ხუშტურების გათვალისწინება მოგიწევთ :D მგონი ყველასი სათითაოდ :D

ყოველი შემთხვევისთვის ერთ-ერთი გავრცელებული გზა ეს არის: Quirksmode.org

ისე კარგი ამბავიც არის – html5-ში multiple file ამტვირთავი იქნება ეს ელემენტი. ახლა ეს შესაძლებლობა არ აქვს და flash-ის uploader-ებს იყენებენ ხოლმე.

რომ დავფიქრდი, მგონი ყველაზე მეტი ამ ელემენტმა მაწვალა :D მე კიდევ jquery-ის ვაწვალებდი. აი მაგალითად აჯაქს რიქვესთით კი ვერ ატვირთავთ სურათს :D აუცილებლად უნდა გადავიდეს საბმიტის გვერდზე. jquery.post-ით ფორმის მონაცემებს რომ ვგზავნით, არ იგზავნება ეს. არც jQuery-ის serialize() ფუნქცია მოქმედებს მაგაზე, ფორმის სერიალიზებას როცა ვაკეთებთ..

გამოსავალი iframe ელემენტია ან ისევ flash uploader-ი.

და ბოლოს, რომ გამოვკეთდები ეს პოსტი რომ არ წავშალო, სიმღერასაც დავამატებ… : D i love it


Polling და Pushing აჯაქსით

მივადექი საიტის შეტყობინებების (notifications) ნაწილს და ბლოგი ძალიან რომ არ მივივიწყო, ნანახის მიმოხილვას აქ გავაკეთებ :D

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

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

ამ ამოცანის გადასაჭრელად ძირითადად ორ გზას იყენებენ ხოლმე:

1. ყოველ 5 წამში (სიტყვაზე) ბრაუზერი ეკითხება სერვერს ჩემთვის რამე ახალი ხომ არ გაქვსო (უგზავნის მოთხოვნას XMLHttpRequest ობიექტის საშუალებით). სერვერიც თავის მხრივ პასუხს უბრუნებს და ასე გრძელდება დაუსრულებლად. ამას polling-ს ეძახიან.

2. ბრაუზერი მიმართავს სერვერს და ამის შემდეგ კავშირს არც ერთი მხარე არ ხურავს. HTTP ქონექშენი ღიაა. თუ სერვერზე რამე ახალი მოხდება, სტრიმის სახით გაუშვებს ინფორმაციას კლიენტთან ამ კავშირით. ეს push-ია.

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

polling-ს ზედვე ეტყობა როგორ ხარჯავს რესურს. ჯერ მარტო ამდენი ქონექშენის გახსნით და დახურვით სერვერს ტვირთავს, მით უმეტეს როცა მომხმარებლების რაოდენობა ძალიან დიდია. ბოლოს ვეღარ გაუძლებს იქით მხარეს სერვისი და მოკვდება :D

მიუხედავად იმისა, რომ push-ს ეს პრობლემა არ აქვს, აქ სხვა სახით გვაქვს სერვერზე დატვირთვა. მას ძალიან დიდი რაოდენობით გახსნილი ქონექშენის ხელში ჭერა უწევს.

გადატვირთვის თავიდან ასაცილებლად IE 6/7 -ში შეზღუდვაც კია დაუხურავ კავშირებზე. ამ ბრაუზერში კლიენტს არ შეუძლია ქონდეს ორზე მეტი ღია ქონექშენი სერვერთან. ანუ მაგალითად, თუ ორ ტაბში გვაქვს გახსნილი ერთი და იგივე საიტი, რომელიც ასეთ დაუხურავ კავშირს იყენებს და მესამე ტაბშიც გავხსნით, მესამე აღარ ჩაიტვირთება.

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

გასათვალისწინებელია გახსნილი ქონექშენის სტრიმის გამაჩერებლებიც – ეს შეიძლება იყოს პროქსი სერვერები, სხვადასხვა firewall-ები ან ვებ სერვერი.. მაგალითად აპაჩის mod_jk კონექტორი (ტომკეტისთვის) ხელს უშლის თურმე push-ის რეალიზაციას.

იმ ბრაუზერებისთვის, რომლებსაც ნამდვილი push-ის გაკეთებაზე ბევრი პრობლემა აქვთ, არის კიდევ ერთი მეთოდი – long polling. აქ push-იც გვაქვს და poll-იც. ბრაუზერი გზავნის მოთხოვნას სერვერთან და თუ მეორე მხარეს მისთვის ჯერ არაფერი არ არის, სერვერი არ პასუხობს და ქონექშენს ღიას ტოვებს, ხოლო როცა რამე გამოჩნდება, ნაკადად კი არ უშვებს არამედ მთელ პასუხს უგზავნის უკან და ხურავს კიდეც. შემდეგ კლიენტი ისევ თავიდან გზავნის მოთხოვნას და ასე შემდეგ.

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

თუმცა რა თქმა უნდა ამოცანას გააჩნია. Push , რომლის პატერნს Comet-საც ეძახიან გამოიყენება GMail-ში, GMail-ის ჩატში, GDocs-ში, Meebo-სა და სხვა ჩატის თუ collaborate რედაქტირების საიტებში.

პ.ს. long polling-ის თავიდან ასაცილებლად და სულ ღია კავშირების ხარჯზე ინფორმაციის მიმოცვლისთვის HTML 5-ის სპეციფიკაციაში შემოაქვთ WebSocket კლასი, რომლითაც ასეთი პატერნის რეალიზაციაა შესაძლებელი. http://dev.w3.org/html5/websockets/

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

რეკომენდირებული საყურებელი:

Interactive Websites with Comet and DWR  by Joe Walker

პოსტერის დიზაინის კონკურსი. პრიზი – ვაკომის პლანშეტი

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

შესაქმნელია www.freelancereview.net საიტის პრომო პლაკატი.

კონკურსის აღწერა, პირობები და პრიზები იხილეთ აქ:
http://99designs.com/contests/34680/brief