Frontend: ვებ და მობილური კლიენტები. სრული დაფის მდგომარეობის მიღება

21.02.2019

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

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

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

განათავსეთ პირველი გახსნის საათებში

„ადგილი“ გახდა ონლაინ სტიკერ დაფა, მაგრამ თითოეული მათგანი შრომისმოყვარეობით არის შექმნილი. მაგალითად, 48 x 68 პიქსელის ზომის ლინუქსის ლოგოს დასახატად და დასაცავად, 3264 ადამიანმა უნდა გააკეთოს ეს ერთდროულად.

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

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

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

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

72 საათიანი მუშაობის შემდეგ პროექტი დაიხურა. რესურსების ადმინისტრაციამ მადლობა გადაუხადა ყველას მონაწილეობისთვის და იმისთვის, რომ ხალხი გაერთიანდა „რაღაც მეტის შესაქმნელად“.

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

დასაწყისისთვის, უაღრესად მნიშვნელოვანი იყო პირველი აპრილის პროექტის მოთხოვნების დადგენა, რადგან ის უნდა გაშვებულიყო „გადატვირთვის“ გარეშე, რათა Reddit-ის ყველა მომხმარებელს დაუყოვნებლივ შეეძლო მასზე წვდომა. თავიდანვე იდეალურად რომ არ ემუშავა, ძნელად ბევრი ადამიანის ყურადღებას მიიპყრობდა.

    "დაფა" უნდა იყოს 1000x1000 ფილების ზომის, რომ ძალიან დიდი გამოიყურებოდეს.

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

    თქვენ უნდა მხარი დაუჭიროთ მინიმუმ 100000 ერთდროულ მომხმარებელს.

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

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

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

Backend

განხორციელების გადაწყვეტილებები

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


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


(x, y): („დროის შტამპი“: ეპოქები, „ავტორი“: მომხმარებლის_სახელი, „ფერი“: ფერი)

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


შემდეგ გადავწყვიტეთ მთელი დაფა შეგვენახა რედისში. ჩვენ ავიღეთ მილიონი ოთხბიტიანი რიცხვის ბიტის ველი, რომელთაგან თითოეულს შეეძლო ოთხბიტიანი ფერის დაშიფვრა, ხოლო x და y კოორდინატები განისაზღვრა ოფსეტით (ოფსეტი = x + 1000y) ბიტის ველში. დაფის სრული მდგომარეობის მისაღებად, მთელი ბიტის ველი უნდა წაიკითხოთ.


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


აი, როგორ ვინახავდით ფერებს Redis-ში 2x2 დაფის მაგალითის გამოყენებით:



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


მოთხოვნები სრული დაფის მდგომარეობაზე ქეშირებული იყო Fastly-ის მიერ წამის დროით. Თავიდან ასაცილებლად დიდი რიცხვიითხოვს, როდესაც ვადა ამოიწურა, ჩვენ გამოვიყენეთ stale-while-revalidate header. Fastly მხარს უჭერს დაახლოებით 33 POP-ს, რომლებიც დამოუკიდებლად ქეშირებენ ერთმანეთს, ამიტომ ველოდით, რომ მივიღებდით 33-მდე სრული დაფის სტატუსის მოთხოვნას წამში.


ყველა კლიენტისთვის განახლებების გამოსაქვეყნებლად, ჩვენ გამოვიყენეთ ჩვენი ვებსოკეტის სერვისი. ჩვენ ადრე წარმატებით ვიყენებდით Reddit.Live-ს 100000-ზე მეტ ერთდროულად მომხმარებელთან ერთად Live პირადი შეტყობინების შეტყობინებებისა და სხვა ფუნქციებისთვის. მომსახურებაც იყო ქვაკუთხედიჩვენი წარსული პირველი აპრილის პროექტები - The Button and Robin. r/Place-ის შემთხვევაში, კლიენტებმა მხარი დაუჭირეს ვებსოკეტის კავშირებს, რათა მიეღოთ რეალურ დროში განახლებები ფილების განთავსებაზე.

API

სრული დაფის მდგომარეობის მიღება


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




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



და როდესაც მოთხოვნამ მიაღწია განაცხადს, რედისმა ძალიან სწრაფად უპასუხა.

კრამიტის დახატვა


კრამიტის დახატვის ეტაპები:

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

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


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


მოთხოვნის განაკვეთები და პასუხების დრო, რომელიც იზომება Reddit აპლიკაციით:



ფილების განლაგების პიკი იყო თითქმის 200 წამში. ეს ჩვენს სავარაუდო ლიმიტს 333 ფილა/წმ-ზე დაბალია (საშუალოდ იმ ვარაუდით, რომ 100 000 მომხმარებელი ათავსებს ფილებს ყოველ ხუთ წუთში).


დეტალების მიღება კონკრეტული ფილისთვის


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


მოთხოვნის განაკვეთები და პასუხების დრო, რომელიც იზომება Reddit აპლიკაციით:



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



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

ვებსოკეტები

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


ვებსოკეტის სერვისთან კავშირების საერთო რაოდენობა:



საბაზისო დატვირთვა r/Place-ის გაშვებამდე იყო დაახლოებით 20000 კავშირი, პიკი იყო 100000 კავშირი. ასე რომ, პიკზე ჩვენ ალბათ გვყავდა დაახლოებით 80,000 კონკურენტი მომხმარებელი დაკავშირებული r/Place-თან.


Websocket სერვისის გამტარუნარიანობა:



r/Place-ზე დატვირთვის პიკზე, websocket სერვისმა გადაიტანა 4 გბიტ/წმ-ზე მეტი (150 Mbps თითო ინსტანციაზე, სულ 24 შემთხვევა).

Frontend: ვებ და მობილური კლიენტები

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


მომხმარებლის ინტერფეისს სამი მნიშვნელოვანი ფუნქცია უნდა შეესრულებინა:

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

ინტერფეისის მთავარი ობიექტი იყო ტილო და Canvas API იდეალური იყო მისთვის. ჩვენ გამოვიყენეთ ელემენტი ზომით 1000x1000 და თითოეული ფილა დახატული იყო როგორც ერთი პიქსელი.

ტილოს დახატვა

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

  1. დახაზეთ არსებული სურათი ტილოში drawImage()-ის გამოყენებით.
  2. ფორმების დახატვა გამოყენებით სხვადასხვა მეთოდებიხატვის ფორმები. მაგალითად, fillRect() ავსებს მართკუთხედს გარკვეული ფერით.
  3. შექმენით ImageData ობიექტი და დახატეთ იგი ტილოზე putImageData()-ის გამოყენებით.

პირველი ვარიანტი არ შეგვეფერა, რადგან არ გვქონდა დაფა მზა გამოსახულების სახით. ეს დარჩა 2 და 3 ვარიანტები. უმარტივესი გზა იყო ცალკეული ფილების განახლება fillRect()-ის გამოყენებით: როდესაც განახლება მოდის websocket-ის მეშვეობით, ჩვენ უბრალოდ ვხატავთ 1x1 ოთხკუთხედს (x, y) პოზიციაზე. ზოგადად, მეთოდი მუშაობდა, მაგრამ არ იყო ძალიან მოსახერხებელი რენდერისთვის საწყისი მდგომარეობადაფები. putImageData() მეთოდი ბევრად უკეთესი იყო: ჩვენ შეგვიძლია განვსაზღვროთ თითოეული პიქსელის ფერი ერთ ImageData ობიექტში და ერთდროულად დავხატოთ მთელი ტილო.

დაფის საწყისი მდგომარეობის დახატვა

putImageData()-ის გამოყენება მოითხოვს დაფის მდგომარეობის განსაზღვრას Uint8ClampedArray-ის სახით, სადაც თითოეული მნიშვნელობა არის რვა ბიტიანი ხელმოუწერელი რიცხვი 0-დან 255-მდე დიაპაზონში. თითოეული მნიშვნელობა წარმოადგენს ფერის არხს (წითელი, მწვანე, ლურჯი, ალფა) და თითოეული პიქსელს სჭირდება ოთხი ელემენტი მასივში. 2x2 ტილო მოითხოვს 16-ბაიტიან მასივს, რომელშიც პირველი ოთხი ბაიტი წარმოადგენს ტილოს ზედა მარცხენა პიქსელს, ხოლო ბოლო ოთხი წარმოადგენს ქვედა მარჯვენა პიქსელს.


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



ჩვენი პროექტის ტილოსთვის დაგვჭირდა ოთხი მილიონი ბაიტის მასივი - 4 მბ.


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

  1. გადაიტანეთ ორობითი მონაცემები ჩვენი API-დან კლიენტზე.
  2. ამოალაგეთ მონაცემები.
  3. გადაიყვანეთ ოთხბიტიანი ფერები 32-ბიტიანში.

ორობითი მონაცემების გადასატანად, ჩვენ გამოვიყენეთ Fetch API იმ ბრაუზერებში, რომლებიც მხარს უჭერენ მას. და მათ, ვინც მხარს არ უჭერს, ჩვენ გამოვიყენეთ XMLHttpRequest answerType-ზე დაყენებულია “arraybuffer”-ზე.


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


საბოლოოდ, ოთხი ბიტიანი ფერები უნდა გადაექცია 32 ბიტიანზე.



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


TypedArray ობიექტები არსებითად ArrayBuffer-ის მასივის წარმოდგენებია. აქ არის ერთი სიფრთხილე: რამდენიმე TypedArray ინსტანციას შეუძლია წაიკითხოს და ჩაწეროს იმავე ArrayBuffer მაგალითზე. ჩაწერის ნაცვლად ოთხი ღირებულებარვა-ბიტიან მასივში შეგვიძლია ჩავწეროთ ერთი მნიშვნელობა 32-ბიტიანში! წერისთვის Uint32Array-ის გამოყენებით, ჩვენ შევძელით ადვილად განვაახლოთ კრამიტის ფერები მხოლოდ ერთი მასივის ინდექსის განახლებით. თუმცა, ჩვენ უნდა შევინახოთ ჩვენი ფერის პალიტრა დიდი ბაიტის თანმიმდევრობით (ABGR), რათა ბაიტები ავტომატურად დასრულდეს სწორ ადგილებში Uint8ClampedArray-ის გამოყენებით წაკითხვისას.


მიმდინარეობს ვებსოკეტით მიღებული განახლებების დამუშავება

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


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

  1. შეწყვიტე drawRect()-ის გამოყენება - აღმოვაჩინეთ მოსახერხებელი გზაგანაახლეთ მრავალი პიქსელი ერთდროულად putImageData() გამოყენებით.
  2. ტილოს რენდერის გადატანა requestAnimationFrame ციკლში.

რენდერის ანიმაციის მარყუჟში გადატანით, ჩვენ შევძელით დაუყოვნებლივ ჩაგვეწერა ვებსოკეტის განახლებები ArrayBuffer-ზე, ხოლო რეალური რენდერის გადადება. ყველა websocket განახლება, რომელიც მოდის ჩარჩოებს შორის (დაახლოებით 16 ms) დაჯგუფებული და ერთდროულად გადაიცემა. requestAnimationFrame-ის გამოყენების წყალობით, თუ რენდერირებას ძალიან დიდი დრო დასჭირდა (16 ms-ზე მეტი), ეს გავლენას მოახდენდა მხოლოდ ტილოს განახლების სიხშირეზე (ვიდრე მთელი ბრაუზერის მუშაობის შემცირებას).

ტილოსთან ურთიერთობა

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


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

მასშტაბირება

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


ჩვენ განვახორციელეთ 40x მასშტაბირება, ანუ თითოეულ ფილას ჰქონდა ზომა 40x40. ჩვენ შევფუთეთ ელემენტი

, რომელზედაც გამოყენებული იყო CSS ტრანსფორმაცია: scale(40, 40). ეს იყო შესანიშნავი გამოსავალი ფილების დასაყენებლად, მაგრამ ართულებდა დაფის ყურებას (განსაკუთრებით მცირე ეკრანებზე), ამიტომ ჩვენ მას გავუკეთეთ ორეტაპიანი მასშტაბირება: 40x ფილების დასახატავად, 4x დაფის სანახავად.


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


გადიდების დაბინდვა:



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


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

ტილოზე გადაადგილება

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

, რომელზეც გამოყენებულია CSS ტრანსფორმაცია: translate(x, y). ცალკე დივის წყალობით, ჩვენ შევძელით ადვილად ვაკონტროლოთ ტილოზე ტრანსფორმაციების განხორციელების თანმიმდევრობა, რაც აუცილებელი იყო, რათა არ გადაადგილებულიყო „კამერა“ მასშტაბის შეცვლისას.


შედეგად, ჩვენ მივიღეთ მხარდაჭერა სხვადასხვა გზებიკამერის პოზიციის პარამეტრები:

  • „დააწკაპუნეთ და გადაათრიეთ“ (დაწკაპუნეთ-და-ჩაათრევთ, ან შეხებით გადაათრიეთ);
  • "დააწკაპუნეთ გადასატანად";
  • კლავიატურის ნავიგაცია.

თითოეული ეს მეთოდი განსხვავებულად ხორციელდება.

"დააწკაპუნეთ და გადაიტანეთ"

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

"დააწკაპუნეთ გადასაადგილებლად"

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

კლავიატურის ნავიგაცია

შეგიძლიათ ტილოზე გადაადგილება კლავიატურის ისრებით ან WASD-ით. ეს კლავიშები აკონტროლებდნენ შიდა მოძრაობის ვექტორს. თუ არ იყო დაჭერილი გასაღები, მაშინ ნაგულისხმევ ვექტორს ჰქონდა კოორდინატები (0, 0). რომელიმე ნავიგაციის ღილაკზე დაჭერით დაემატა 1 x ან y. მაგალითად, თუ დააჭერთ „მარჯვნივ“ და „ზევით“, ვექტორული კოორდინატები იქნება (1, -1). შემდეგ ეს ვექტორი გამოიყენებოდა ანიმაციის ციკლში „კამერის“ გადასატანად.


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


მოძრაობის სიჩქარე = maxZoom / currentZoom * speedMultiplier

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


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

მობილური აპლიკაციის მხარდაჭერა

iOS და Android აპლიკაციებში ტილოს ჩასმისას გარკვეული სირთულეები შეგვხვდა. პირველ რიგში, ჩვენ დაგვჭირდა მომხმარებლის ავთენტიფიკაცია, რათა მათ შეეძლოთ ფილების განთავსება. ვებ ვერსიისგან განსხვავებით, სადაც ავთენტიფიკაცია სესიაზეა დაფუძნებული, მობილური აპლიკაციებიჩვენ გამოვიყენეთ OAuth: ამ შემთხვევაში, აპლიკაციებმა უნდა მიაწოდონ სისტემაში შესული მომხმარებელი WebView წვდომის ნიშნით. ამის განხორციელების ყველაზე უსაფრთხო გზაა OAuth ავტორიზაციის სათაურების შეყვანა JS ზარის საშუალებით აპლიკაციიდან WebView-ზე. ეს მოგვცემს საჭიროების შემთხვევაში სხვა სათაურების მორგების საშუალებას. შემდეგ თქვენ უბრალოდ უნდა გაანალიზოთ ავტორიზაციის სათაურები API-ის ყოველ ზარზე:


r.place.injectHeaders(("ავტორიზაცია": "ტარი ’});

iOS-ის ვერსიაში ჩვენ დამატებით განვახორციელეთ შეტყობინებების მხარდაჭერა, როდესაც მომხმარებლის ფილა მზად იყო ტილოზე დასაყენებლად. ვინაიდან განთავსება მთლიანად განხორციელდა WebView-ში, ჩვენ უნდა განვახორციელოთ მშობლიური განაცხადის გამოძახება. საბედნიეროდ, iOS 8 და ზემოთ, ეს კეთდება მარტივი JS ზარით:


webkit.messageHandlers.tilePlacedHandler.postMessage(this.cooldown / 1000);

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


რაც ვისწავლეთ

ყოველთვის არის რაღაც, რაც გაკლია

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


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




ჩვენ ვნახეთ ეს მოდის. და ჩვენ ვემზადებოდით იმისთვის, რომ შედეგად ქსელი გახდებოდა ბოსტნეულობა ჩვენს სისტემაში. მაგრამ აღმოჩნდა, რომ დიდი მარაგი გვაქვს. თუმცა, CPU დატვირთვის დათვალიერებისას, ჩვენ ვნახეთ სრულიად განსხვავებული სურათი:



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


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


და შემდეგ მოხდა ეს:



ერთი შეხედვით, არაფერი განსაკუთრებული. რომ არა ის ფაქტი, რომ ეს იყო ჩვენი RabbitMQ წარმოების მაგალითი, რომელიც ამუშავებს არა მხოლოდ ვებსოკეტის შეტყობინებებს, არამედ ზოგადად ყველაფერს, რაზეც დამოკიდებულია reddit.com-ის ფუნქციონირება. და ეს არ იყო კარგი. Საერთოდ არ არის კარგი.


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


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


$ cat s****y_diamond.sh #!/bin/bash /usr/sbin/rabbitmqctl list_queues | /usr/bin/awk "$2~//(ბეჭდვა "servers.foo.bar.rabbit.rabbitmq.queues." $1 ".messages " $2 " " systime())" | /bin/grep -v "amq.gen" | /bin/nc 10.1.2.3 2013წ

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


სამწუხაროდ, მიუხედავად შემდეგი შეტყობინებებისა:



გადატვირთვის დროის ცვლილებები აქ ნახსენები იყო მხოლოდ ტექნიკური მიზეზები. თუმცა მათ შემდეგ საინტერესო იყო r/place/ახალი თემის ყურება:



ალბათ ეს იყო მომხმარებლების მოტივაციის ნაწილი.

ბოტები ბოტებად დარჩებიან

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


როდესაც ჩვენ გამოვრთეთ Place, ბოლო წერტილებმა, რომლებზეც წვდომა ბევრი ბოტი იყო, დაიწყეს "არა 200" შეცდომის დაბრუნება. ეს კოდი არ იყო ძალიან წარმატებული. საბედნიეროდ, ყველა ეს განმეორებითი მოთხოვნა ადვილად დაიბლოკა Fastly დონეზე.

კიდევ რაღაცის შექმნა

r/Place არ იქნებოდა ისეთი წარმატებული, რომ არა შეკრული გუნდური მუშაობა. გვინდა მადლობა გადავუხადოთ u/gooeyblob, u/egonkasper, u/eggplanticarus, u/spladug, u/thephilthe, u/d3fect და ყველას, ვინც დაგვეხმარა ამ პირველაპრილის ექსპერიმენტის რეალობად ქცევაში.

ფეისბუქი

Twitter

ჯიბე

Linkedin

ფბ მესენჯერი

არ შეიძლება ითქვას, რომ იუმორის დღეს კორპორატიული ხუმრობების 100% წარმატებული და მიმზიდველია. წელს Reddit-ის ადმინისტრაციამ გამოუშვა Place, ინტერაქტიული გრაფიკული ტილო, რომელიც ზომებს 1000 პიქსელზე 1000 პიქსელზე და მას ეძღვნება სექცია. ითვლებოდა, რომ საზოგადოების წევრები ერთობლივად დახატავდნენ ამ ტილოს, როგორც მოესურვებოდათ. მაგრამ შედეგად, ეს გადაიზარდა ადგილისთვის ბრძოლაში, ზოგჯერ ფილოსოფიურ დაპირისპირებაში. ჩვეულებრივი ხატვის სავარჯიშო ამაღელვებელ სოციალურ ექსპერიმენტად იქცა. ამბავი თავიდან ბოლომდე იყო დოკუმენტირებული Sudoscript ბლოგის მიერ.

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

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

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

შემქმნელები

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

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

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

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

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

დამცველები

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

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

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

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

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

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

მაგრამ ეს ჯერ არ არის ბედნიერი დასასრული

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

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

შემდეგ გამოჩნდა ვან გოგი.

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

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

დაიწყო სხვადასხვა ქვეყნის დროშების გამოჩენა - როგორც ისინი იზრდებოდა, ისინი აუცილებლად შეეჯახნენ ერთმანეთს. მაგალითად, გერმანიისა და საფრანგეთის დროშები ერთმანეთს შეეჯახა „არავის მიწაზე“.

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

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

გამანადგურებლები

სიცარიელე დადგა.

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

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

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

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

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

Reddit-ის ექსპერიმენტი მალე დასრულდა. ბოლო ტილოზე არ იყო არც ერთი რასისტული ნახატი ან სიძულვილის ერთი სიმბოლო.

Twitter

ჯიბე

Linkedin

ფბ მესენჯერი

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

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

ის, რაც მოხდა მომდევნო 72 საათის განმავლობაში, ორგანიზატორებს შოკში ჩააგდო. ეს გამოჩნდა ცარიელ ტილოზე:

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

როგორ მოხდა ეს ყველაფერი

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

შემქმნელები

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

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

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

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

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

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

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

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

მცველები

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

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

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

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

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

და რატომღაც მან შეცვალა ტალღა. Blue Corner-მა დაიწყო დებატები მათ როლზე შემოქმედებითი პროცესი. ერთ-ერთმა მონაწილემ ჰკითხა: „რადგან ჩვენი ტალღა გარდაუვლად იპყრობს სამყაროს, უნდა გამოვხატოთ თუ არა წყალობა ხელოვნების სხვა ფორმების მიმართ, რომლებსაც ვხვდებით?

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

გახდა გარდამტეხი წერტილი. უგუნური ფრაქციები მფარველებად იქცნენ.

მაგრამ ჯერ არ დასრულებულა

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

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

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

მეორე ჯგუფმა ხელახლა შექმნა ვან გოგის ვარსკვლავური ღამე.

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

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

დამცველებს შორის ჩხუბი სერიოზულად გაჩაღდა. Twitch-ის ლაივ სტრიმერებმა თავიანთ მიმდევრებს მოუწოდეს, თავს დაესხნენ Blue Corner-სა და Purple-ს. საბრძოლო გეგმები შედგა. მიმართა ემოციებს.

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

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

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

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

საჭირო იყო ყეყეჩები, რომელთანაც ყველას შეეძლო შეთანხმება.

გამანადგურებლები

ინტერნეტ საიტმა 4chan-მა გაამახვილა ყურადღება იმაზე, რაც ხდებოდა Reddit-ზე. და მათ ვერ გაიარეს. მათმა მომხმარებლებმა ყველაზე მეტად გულთან ახლოს - შავი აირჩიეს. ისინი გახდნენ სიცარიელე.

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

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

სიცარიელე არ იყო მფარველი. სხვა ფრაქციებისგან განსხვავებით, იგი არ ავლენდა ერთგულებას ხელოვნების მიმართ. Void-ის მიმდევრები აცხადებდნენ დესტრუქციულ ეგალიტარიზმს ლოზუნგით „სიცარიელე ყველაფერს შთანთქავს“. მათ არ ჰქონდათ კონტაქტი სხვებთან. მათ უბრალოდ სურდათ მთელი სამყარო შავად დაეხატათ.

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

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

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

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

მაგრამ სიცარიელემ ყველაფერი შეჭამა. ერთი ქმნილება მეორის მიყოლებით მხოლოდ აძლიერებდა მის ქაოსის მადას.

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

და ეს იდეა გახდა ამერიკის დროშა.

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

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

ძველები მართლები იყვნენ

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

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

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

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

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

საბოლოო ფერწერა



მსგავსი სტატიები
 
კატეგორიები