Who dares, wins :D

June 14th, 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

February 27th, 2010

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

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

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

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

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

ნუ მაჭრით თმებს ;(

February 11th, 2010

არც ავტორის და არც ბავშვის ვინაობა არ ვიცი, მაგრამ საშინლად მიყვარს ეს ფოტო.. :girl_in_love: და აქ იყოს რომ ხშირად დავინახო ხოლმე..

nu-machrit-tmebs

File input ველი html-ში

February 5th, 2010

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

ყველაზე ბოლოს რაც მახსოვს, 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 აჯაქსით

February 1st, 2010

მივადექი საიტის შეტყობინებების (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

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

January 15th, 2010

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

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

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

კიდევ ერთი ლოდინი დასრულდა…

November 5th, 2009

ბლა ბლა ბლა მიზეზების გამო ბოლო ერთი თვე გზაში იყო და ახლახანს ჩამოვა ჩემთან ის რაღაცა, რაზეც 9 თვის წინ მქონდა პოსტი (Gadgets from my wishlist). მაშინაც და შეძენამდე ერთი დღით ადრეც არ ვფიქრობდი რომ მაგას ავირჩევდი.. მაგრამ ბოლოს გადავწყვიტე რომ არც თუ ბევრი რამ მინდა.. უფრო სწორედ არაფერი მინდა ამდენი ხნის განმავლობაში (ამის გამოკლებით) და გამოვიწერე Wacom Cintiq 12wx.

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

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

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

პლანშეტის ეკრანი ცალკე მონიტორად უერთდება კომპიუტერს და უფრო დიდი სივრცეა ^^

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

ეხლა მთავარია მოვიფიქრო, ლეკვას როგორ ვაჩვენო. თუ არა და მთის და მუჰამედის პრინციპით ვიმოქმედებ :D

wacom-copy

p.s. სურათს ხვალ დღის სინათლეზე გადავუღებ :)

კოდის წერის სიჩქარის მნიშვნელოვნად გაუმჯობესება

September 26th, 2009

არა მარტო კოდის :)

ალბათ უმეტესი თქვენგანი უკვე იყენებს მას ან მის ალტერნატივას. ზოგიერთ IDE-ს ჩადგმული აქვს მისი შესაძლებლობები.

მე კი მხოლოდ დღეს ვნახე Nettuts+ საიტზე და უკვე შემიყვარდა. ლაპარაკია Texter პროგრამაზე.

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

არა მარტო ტექსტს ვაბამთ. შესაძლებელია მაკროსების წერაც. მაგალითად, თუ წინადადების ბოლოს გაგვახსენდა, რომ წინადადება <p></p> პარაგრაფის ტეგებში უნდა ჩაგვესვა, Texter-ს შეუძლია ისევ რაღაც წინასწარ განსაზღვრული shortcut-ით ეს ტეგები ჩაუსვას, თუ ამ shortcuts განვსაზღვრავთ მაკროსით: {HOME}<p> {END}</p>

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

Hotstring-ის დამატება Texter-ში

Hotstring-ის დამატება Texter-ში

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

უტოპია

September 22nd, 2009

პოსტი არქივიდან…

4746 by CrazyTob
4746 by CrazyTob

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

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

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

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

მორალი: საჭიროა შეცდომებიც, საჭიროა სინანულიც, საჭიროა ტკივილიც, საჭიროა იმედგაცრუებაც :) იმიტომ რომ ესენი გვიბიძგებენ უკეთესობისკენ, სტიმულსაც გვაძლევენ რაღაც გაგებით, მთავარი გამოსავლის პოვნაა, გამკლავება : ) იმიტომ რომ ”რაც არ გვკლავს, გვაძლიერებს”…

Zend PHP Certification: PHP Basics, part 2

September 19th, 2009

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

Integer ტიპის ზომა პლატფორმაზეა დამოკიდებული.
32 ბიტიანი სისტემისთვის რიცხვი უნდა იყოს შუალედში -2^31 და 2^31-1
64 ბიტიანი სისტემისთვის -2^63 და 2^63-1

თექვსმეტობით (hexadecimal) წარმოდგენილი რიცხვისთვის ეს შუალედები განსხვავდება:
32 ბიტიანი სისტემისთვის 0-დან 2^31-1 -მდე
64 ბიტიანი სისტემისთვის 0-დან 2^63-1 -მდე.

თუ ინტერპრეტატორს შეხვდება რიცხვი ამ საზღვრებს გარეთ (overflow), ის რიცხვს float ტიპად მიიღებს.

$large_number =  2147483647;  // = 2^31-1
var_dump($large_number);
// output: int(2147483647)

$large_number =  2147483648;  // = 2^31
var_dump($large_number);
// output: float(2147483648)

Float ტიპის ზომაც პლატფორმაზეა დამოკიდებული თუმცა მაქსიმალური მნიშნველობა მიახლოებით 1.8e308-ია (64 ბიტიანისთვის, თუ სწორად გავიგე).

Float ტიპის რიცხვები შეიძლება წარმოვადგინოთ შემდეგი სინტაქსით (მთელის და წილადის გამოსაყოფად აუცილებლად წერტილია საჭირო და არა მძიმე):

<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>

გასათვალისწინებელია, რომ PHP-ის შემთხვევაში ამ ტიპის რიცხვები სიზუსტეს კარგავს ბინარულში გადასვლის შემდეგ. მაგალითად (int)((0.1 + 0.7) * 10) საბოლოო ჯამში მოგვცემს 7-ს და არა 8-ს. (0.1 + 0.7)*10 გვაძლევს 7.99999..-ს. (მთელ რიცხვზე (int) დაყვანის დროს, რიცხვი ქვედა ზღვრისკენ მრგვალდება.)

ამიტომ თუ მათემატიკური გამოთვლები ან შედარება გვჭირდება float ტიპით, ყოველთვის BC math ან gmp ფუნქციები უნდა გამოვიყენოთ.

ოპერატორები

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

ოპერატორები დაყოფილია ტიპებად (მხოლოდ რამდენიმე დეტალს ჩავუღრმავდები, დანარჩენი ჩვეულებრივი განმარტებები php.net-ზეა ან აგერ ქართულად ამ ლინკზე):

არითმეტიკული ოპერატორები

მინიჭების ოპერატორები

ბიტური ოპერატორები
გასათვალისწინებელია შესრულების მიმდევრობა. მაგალითად == შედარებას უფრო მაღალი პრიორიტეტი აქვს ვიდრე & ბიტურ ოპერაციას, ამიტომ  $a & $b  == true  შემთხვევაში ჯერ შედარება შესრულდება.

კიდევ ერთი რამ: რატომ ვწერთ ხოლმე შეცდომების რეპორტინგის ჩართვის დროს მაგალითად ასეთ რამეს? E_ALL & ~E_NOTICE

error_reporting-ი მიმდინარე სეთინგების შესანახად bitmask-ს იყენებს. თითოეულ ასეთი კონსტანტის უკან ბიტების ერთობლიობა დგას.

მაგალითად
E_ALL –ს შეესაბამება  00000000000000000111011111111111.
E_NOTICE  => 00000000000000000000000000001000
(ანუ ბოლოდან მეოთხე ბიტი როცა ”ჩართულია”, ეს ნიშნავს რომ E_NOTICE ჩართულია)
~E_NOTICE გამოვა => 11111111111111111111111111110111
E_ALL & ~E_NOTICE   => 00000000000000000111011111110111

საბოლოო ჯამში მოგცემს მთელ სიმრავლეს ოღონდ შენიშვნების (notice) გამოკლებით.

შედარების ოპერატორები
ამ ოპერატორებიდან and და && ზუსტად ერთნაირად მოქმედებენ. ასევეა or და ||. განსხვავება მათ შორის მხოლოდ შესრულების მიმდევრობის პრიორიტეტებშია. && და ||  ოპერატორებს უფრო მაღალი პრიორიტეტი აქვთ შესრულების დროს ვიდრე მათ შესაბამის სიტყვიერ ჩანაწერებს.

შეცდომების კონტროლის ოპერატორები
ასეთი php-ში მხოლოდ ერთია  -   @, რომელიც შეცდომის დასაფარად გამოიყენება. ეს არ ნიშნავს, რომ ის კოდში მომხდარ შეცდომას მიხედავს, არამედ უბრალოდ შეცდომის შეტყობინებას არ გამოიტანს. ამიტომ მისი გამოყენების დროს სიფრთხილეა საჭირო და ის არ არის try..catch -ის შემცვლელი (ჩვეულებრივ მოქმედებს ფატალური შეცდომების დროსაც, როცა სკრიპტი შესრულებას წყვეტს. შეცდომის შეტყობინებას მაინც არ გამოიტანს).

სისტემური ბრძანების შესრულების ოპერატორები
ასეთი ბრძანების გასაშვებად გამოიყენება ` ` ბრჭყალები (backticks). მაგალითად echo `ls -al`;

ისინი არ მუშაობენ თუ ჩართულია safe_mode ან გამორთულია shell_exec()

მნიშნველობის გასაზრდელი/შესამცირებელი ოპერატორები (++ –)
boolean ტიპზე არ მოქმედებს.

ლოგიკური ოპერატორები
აქ მხოლოდ იმას შევნიშნავ, რომ ოპერანდების მნიშვნელობიდან და ოპერატორიდან გამომდინარე შედეგის მისაღებად ყველა ოპერანდის შესრულება საჭირო არ არის და არც სრულდება. მაგალითად if (false && some_function()) { }  ასეთ შემთხვევაში some_function() არასდროს გამოიძახება, რადგან false და && უკვე ნიშნავს რომ საბოლოო შედეგიც false იქნება.

სტრიქონის ოპერატორები ( .   .= )

მასივის ოპერატორები

ტიპის ოპერატორები (instanceof)

შეკითხვები:

1. რა მნიშვნელობები იქნება float1 და float2 ცვლადებში? (php.net)

$float1 = (float) '1.5';
$float2 = (float) '1,5';

1.5
1

2. რა შედეგი ექნება კოდს? (php.net)

<?php
var_dump(25/7);
var_dump((int) (25/7));
var_dump(round(25/7));
?>

float(3.5714285714286) -> / ოპერატორი არ ასრულებს მთელ გაყოფას და ჩვეულებრივ float-ს გვაძლევს შედეგად.
int(3)
float(4)

3. რა შედეგი ექნება f() ფუნქციის გამოძახებას? (php.net)

int f()
{
  int a, b;
  a = 2, b = 4;

  return a;
}

პარსირების შეცდომა მოხდება. C ენისგან განსხვავებით php-ში მძიმის გამოყენება არ შეიძლება ესეთი კომბინირებული expression-ების დასაწერად. თუმცა for ციკლში დაშვებულია. ასეთი რამ იმუშავებს: for ($a = 2, $b = 4; $a < 3; $a++) { }

4. რა შედეგი ექნება კოდს?

$a = -10 % 3;
$a += "1";
echo $a;

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

5. რა შედეგი ექნება კოდს?(php.net)

$a=1;
$a  +=  $a++   +   ++$a;
echo $a;

1. ++$a is first incremented. Now $a is 2.
$a += $a++ + 2
$a is 2

2. $a++ is added to 2 then $a is incremented
$a += 2 + 2
$a is 3

3. now the value of 2 + 2 is added to $a ($a is 3)
$a = $a + 2 + 2

Answer: 3 + 2 + 2 = 7

6. რა მნიშვნელობა იქნება $a ცვლადში ამ სტრიქონის შესრულების შემდეგ (php.net)?

$a = true ? 0 : true ? 1 : 2; 

(true ? 0 : true) ? 1 : 2 = 2

7. რას დაბეჭდავს კოდი (php.net)?

echo 2 ^ "3";
echo "2" ^ 3;

1 1
ორივე შემთხვევაში int-ზე დაიყვანს
2 ^ ((int)”3″) => 1
((int)”2″) ^ 3 => 1

8. რას დაბეჭდავს კოდი?

function f(){
  echo 'I am inside f function\n';
  return false;
}

if (true | f()){
	echo 'bla bla bla';
}

I am inside f function
bla bla bla

| ოპერატორი || -ის მსგავსად short-circuit არ არის. ორივე მხარე შესრულდება, იმის მიუხედავად, რომ პირველი ოპერანდი true-ს უდრის.

9. რას დაბეჭდავს კოდი?

$a=true;
$a--;
echo $a;

1
++ და — ოპერატორები ბულის ტიპებზე არ მოქმედებს.