การวาดสถานะเริ่มต้นของบอร์ด ส่วนหน้า: เว็บและไคลเอนต์มือถือ


กฎกติกานั้นเรียบง่าย ผู้ใช้แต่ละคนสามารถเลือกหนึ่งใน 16 สีและวาดภาพหนึ่งพิกเซลที่ใดก็ได้บนผืนผ้าใบด้วย คุณสามารถทาสีพิกเซลได้มากเท่าที่คุณต้องการและด้วยสีใดก็ได้ที่คุณต้องการ แต่เพื่อที่จะทาสีพิกเซลถัดไปใหม่ คุณต้องรอ 5 นาที

จริงอยู่ กฎกล่าวไว้ว่า “โดยการประสานงานกับผู้อื่น คุณสามารถสร้างสรรค์ได้มากกว่าการกระทำเพียงลำพัง”

สิ่งที่เกิดขึ้นในช่วง 72 ชั่วโมงข้างหน้าทำให้ผู้จัดงานตกตะลึง สิ่งนี้ปรากฏบนผืนผ้าใบที่ว่างเปล่า:

แต่ละพิกเซลบนผืนผ้าใบถูกวางด้วยตนเอง ทุกไอคอน ทุกธง ทุกมีม ถูกสร้างขึ้นอย่างอุตสาหะโดยผู้คนหลายแสนคนที่ไม่มีอะไรเหมือนกันเลย ยกเว้นการเชื่อมต่ออินเทอร์เน็ต ดังนั้นไม่ทางใดก็ทางหนึ่งสิ่งที่เกิดขึ้นบน Reddit ถือได้ว่าเป็นแหล่งกำเนิดของศิลปะอย่างถูกต้อง

มันเกิดขึ้นได้อย่างไร

เป็นไปไม่ได้ที่จะอธิบายสิ่งนี้ด้วยคำไม่กี่คำ ละครนับไม่ถ้วนเกิดขึ้นบนผืนผ้าใบ - การต่อสู้การต่อสู้และสงครามบางครั้งก็ไม่ทราบสาเหตุด้วยซ้ำ พวกเขาดำเนินการในฟอรัมเล็ก ๆ ในแชทส่วนตัว มีจำนวนมากและทั้งหมดเกิดขึ้นพร้อมกัน ดังนั้นจึงเป็นไปไม่ได้ที่จะติดตามทุกอย่าง โดยทั่วไปแล้ว ผืนผ้าใบนี้ติดตามเรื่องราวนิรันดร์ของพลังทั้งสามที่จำเป็นสำหรับมนุษยชาติในการสร้าง

ผู้สร้าง

ผู้สร้างมาก่อน พวกเขาเป็นศิลปินที่ผืนผ้าใบว่างเปล่ามีแรงดึงดูดที่ไม่อาจต้านทานได้

ผู้สร้างเริ่มเปลี่ยนสีพิกเซลแบบสุ่มเพื่อดูว่าพวกเขาสามารถทำอะไรได้บ้าง ดังนั้นภาพวาดแรกจึงชวนให้นึกถึงภาพวาดในถ้ำมากขึ้น - ศิลปินเพิ่งเริ่มกางปีกออก

พวกเขาก็ตระหนักได้อย่างรวดเร็วว่าการทำงานคนเดียวและวางพิกเซลเพียงพิกเซลเดียวทุกๆ 5-10 นาที เป็นไปไม่ได้เลยที่จะสร้างสิ่งที่สำคัญขึ้นมา มีคนผูกพันที่จะทำลายงานของพวกเขา เพื่อสร้างสิ่งที่ยิ่งใหญ่กว่านั้น พวกเขาต้องร่วมมือกัน

จากนั้นมีคนแนะนำให้วาดภาพบนตาราง ซึ่งจะแสดงให้เห็นอย่างชัดเจนว่าต้องทาสีพิกเซลถัดไปที่ไหนเพื่อสร้างภาพที่สอดคล้องกัน นี่คือลักษณะที่ Dickbutt ปรากฏในส่วนล่างซ้ายของผืนผ้าใบ - มีมอินเทอร์เน็ตที่มีชื่อเสียงซึ่งเป็นผลไม้แห่งอารมณ์ขันของวัยรุ่น มันกลายเป็นการทำงานร่วมกันครั้งแรก

แต่ผู้สร้างไม่ได้หยุดเพียงแค่นั้น พวกเขาเริ่มเพิ่มองค์ประกอบต่างๆ ให้กับ Dickbutt โดยเติมสีเข้าไป สีที่ต่างกันและยังพยายามแปลงร่างมันให้เป็นดิ๊กบัตเตอร์ฟลายอีกด้วย เบื้องหลังความคิดโง่ๆ นี้เป็นสัญญาณของสึนามิเชิงสร้างสรรค์ที่กำลังจะเกิดขึ้น

อย่างไรก็ตาม สิ่งนี้ไม่ได้เกิดขึ้นในทันที ผู้สร้างรู้สึกมึนเมากับพลังของพวกเขา Pokemon Charmander ปรากฏตัวถัดจาก Dickbutt และแทนที่จะเป็นอุ้งเท้า อวัยวะเพศชายก็เริ่มโตขึ้น และอีกสองตัว

มันไม่ใช่การออกแบบอีกต่อไป ผู้สร้างบางคนพยายามอย่างยิ่งที่จะลบส่วนเพิ่มเติมที่เร้าใจออก โดยเรียกร้องให้มีงานศิลปะที่ "สะอาดตา" แต่คนอื่นๆ ก็ยังคงสานต่อผลงานของตัวเองต่อไป แต่นั่นไม่เป็นเช่นนั้น

เห็นได้ชัดว่าอิสรภาพที่มากเกินไปนำไปสู่ความสับสนวุ่นวาย ความคิดสร้างสรรค์จำเป็นต้องมีข้อจำกัดมากพอๆ กับที่ต้องการอิสรภาพ เมื่อมีคนวางพิกเซลตรงไหนก็ได้ จะไม่ทำให้เกิดความโกลาหลได้อย่างไร?

การ์เดี้ยน

ปัญหานี้ได้รับการแก้ไขอย่างรวดเร็วโดยผู้ใช้ประเภทอื่น – ผู้ดูแล พวกเขามาโดยมีเป้าหมายเดียว - เพื่อพิชิตโลกทั้งใบ

เมื่อก่อตั้งกลุ่มตามสีแล้ว พวกเขาก็เริ่มพิชิตอวกาศโดยวาดภาพให้เป็นสีใดสีหนึ่ง หนึ่งในกลุ่มแรกและใหญ่ที่สุดคือกลุ่ม Blue Corner ปรากฏที่มุมขวาล่างแพร่ระบาดเหมือนโรคระบาด ผู้ติดตามของเธอประกาศว่าด้วยวิธีนี้พวกเขาควรครอบคลุมพื้นที่ทั้งหมดของผืนผ้าใบ พวกเขาเริ่มแปลแนวคิดของตนให้กลายเป็นความจริงทีละพิกเซล และในไม่ช้าก็จับภาพพื้นที่ขนาดใหญ่ได้

Blue Corner ไม่ได้อยู่คนเดียวที่มีแรงบันดาลใจ อีกฟากหนึ่งของผืนผ้าใบมีอีกกลุ่มหนึ่งปรากฏขึ้น - มุมแดง (มุมสีแดง) ผู้เข้าร่วมระบุว่าพวกเขาเป็นผู้สนับสนุนฝ่ายซ้าย มุมมองทางการเมือง- อีกกลุ่มหนึ่ง - Green Lattice (ตาข่ายสีเขียว) - เริ่มกระจายพิกเซลสีเขียวและสีขาวไปทุกที่ เธอแสดงให้เห็นประสิทธิภาพสูง เนื่องจากเธอจำเป็นต้องวาดพิกเซลให้มากที่สุดเท่าที่ฝ่ายอื่นๆ ครึ่งหนึ่ง

เหล่าการ์เดี้ยนโจมตีผู้สร้างด้านหน้า Charmander กลายเป็นสถานที่แรกของการต่อสู้ เมื่อค้นพบว่า Blue Corner ได้เริ่มเติม Pokemon ด้วยพิกเซลสีน้ำเงินแล้ว ผู้สร้างก็ตระหนักถึงภัยคุกคามและหยุดสงครามภายใน

พวกเขาต่อสู้กลับ โดยแทนที่แต่ละพิกเซลสีน้ำเงินด้วยพิกเซลของตัวเอง แต่กำลังไม่เท่ากัน ด้วยความมุ่งมั่น Blue Corner ได้รวบรวมกองทัพที่ใหญ่กว่าผู้สร้างมาก และสิ่งเดียวที่ผู้สร้างสามารถทำได้ในสถานการณ์เช่นนี้คือการร้องขอชีวิต

และอย่างใดมันก็พลิกกระแสน้ำ The Blue Corner เริ่มถกเถียงเกี่ยวกับบทบาทของพวกเขาใน กระบวนการสร้างสรรค์- ผู้เข้าร่วมรายหนึ่งถามว่า “ในขณะที่คลื่นของเราเข้ายึดครองโลกอย่างหลีกเลี่ยงไม่ได้ เราควรแสดงความเมตตาต่องานศิลปะรูปแบบอื่นที่เราเผชิญหรือไม่”

นี่เป็นคำถามที่เกิดขึ้นไม่ช้าก็เร็วต่อหน้าทุกฝ่าย ด้วยความกระตือรือร้นในการขยายขอบเขต พวกเขาควรทำอย่างไรกับงานศิลปะที่ขวางทางพวกเขา?

นี่เป็นจุดเปลี่ยน กลุ่มที่ไร้สติได้กลายเป็นผู้พิทักษ์

แต่มันก็ยังไม่จบ

ในโลกที่เต็มไปด้วยสีนักล่า ผู้สร้างสามารถกลับไปสู่การสร้างสรรค์ของพวกเขาได้ ด้วยการเพิ่มองค์ประกอบทีละองค์ประกอบ พวกเขาเริ่มทำให้มันซับซ้อนมากขึ้น เราเริ่มเขียนข้อความโดยใช้แบบอักษรสามพิกเซล หนึ่งในการสร้างสรรค์ที่โด่งดังที่สุดคือภาคก่อนของสตาร์วอร์ส

ผู้สร้างรวมตัวกันเป็นกลุ่มที่ทำงานอยู่ โครงการทั่วไป- พวกเขาแบ่งปันกลยุทธ์และรูปแบบระหว่างกัน หนึ่งในผู้ที่ประสบความสำเร็จมากที่สุดคือกลุ่มที่สร้างแผง Windows 95 โดยมีปุ่ม Start อยู่ที่มุม

คนอื่นๆ สร้างบล็อกหัวใจเหมือนกับในวิดีโอเกมเก่าๆ อย่าง Zelda มีเพียงไม่กี่คนเท่านั้นที่เริ่มโครงการนี้ แต่คนอื่นๆ ก็เข้าร่วมอย่างรวดเร็ว และในที่สุดหัวใจที่วาดด้วยธงหลากสีก็กางไปครึ่งผืนผ้าใบ

อีกกลุ่มหนึ่งได้สร้าง Starry Night ของ Van Gogh ขึ้นใหม่

อย่างไรก็ตาม ไม่ใช่ทุกอย่างเป็นไปอย่างราบรื่น ผู้สนับสนุนที่เคยเฉลิมฉลองการสร้างสรรค์ผลงานศิลปะกลายเป็นเผด็จการที่บงการแฟชั่น พวกเขาเริ่มระบุว่าอะไรสร้างได้และสิ่งไหนสร้างไม่ได้ มันเริ่มต้นไม่นานก่อนที่ผู้สร้างจะเริ่มสร้างตามกฎเกณฑ์ของตนเอง

ฝ่ายต่างๆ หันมามองกันและกัน โดยเรียกร้องให้ผู้ติดตามของพวกเขาเข้าข้างฝ่ายในการต่อสู้ครั้งยิ่งใหญ่ พวกเขาไม่มีเวลาใส่ใจกับคำวิงวอนอันน่าสมเพชของผู้สร้างที่ต้องการอนุมัติแนวคิดเกี่ยวกับงานศิลปะใหม่

การต่อสู้ระหว่างกองหลังก็ปะทุขึ้นอย่างจริงจัง สตรีมเมอร์สดของ Twitch สนับสนุนให้ผู้ติดตามโจมตี Blue Corner และ Purple มีแผนการต่อสู้แล้ว อุทธรณ์ไปยังอารมณ์

มีการโจมตีปลอมด้วยซ้ำ โดยที่ผู้ติดตามที่มีสีเดียวกันวางพิกเซลของฝ่ายตรงข้ามไว้ภายในของตนเอง เพื่อที่พวกเขาจะได้บ่นเกี่ยวกับการละเมิดและโจมตีกลับ

อย่างไรก็ตามมากที่สุด ปัญหาใหญ่มีกฎที่เข้มงวด - ไม่สามารถขยายผืนผ้าใบได้ ทั้งฝ่ายที่ทำสงครามและผู้สร้างเริ่มตระหนักว่าพวกเขาไม่มีที่ว่างสำหรับงานศิลปะใหม่

ตั้งแต่เริ่มแรก ธงของประเทศต่างๆ ปรากฏบนผืนผ้าใบ พวกเขาเติบโตและชนกัน การต่อสู้ครั้งยิ่งใหญ่ที่แท้จริงเกิดขึ้นระหว่างธงของเยอรมนีและฝรั่งเศส เห็นได้ชัดว่าจำเป็นต้องมีตัวกลางเพื่อพัฒนาพื้นที่ใหม่

ทันใดนั้นโลกที่รอดพ้นจากการโจมตีแบบดึกดำบรรพ์ตั้งแต่แรกเริ่ม ก็พร้อมสำหรับสงครามเต็มรูปแบบ ความพยายามอย่างสิ้นหวังในการแก้ปัญหาอย่างมีชั้นเชิงทำให้ไม่มีที่ไหนเลย การพบกันในการแชท ผู้นำของผู้สร้างและผู้ปกป้องต่างตำหนิกันเท่านั้น

สิ่งที่จำเป็นคือพังพอนที่ทุกคนสามารถตกลงกันได้

เรือพิฆาต

เว็บไซต์อินเทอร์เน็ต 4chan ดึงความสนใจไปที่สิ่งที่เกิดขึ้นใน Reddit และพวกเขาก็ผ่านไปไม่ได้ ผู้ใช้เลือกสีที่ใกล้เคียงกับหัวใจมากที่สุด - สีดำ พวกเขากลายเป็นความว่างเปล่า

ขณะที่น้ำตาค่อยๆ กระจายไปทั่วพื้นผิว พิกเซลสีดำก็เริ่มปรากฏขึ้นตรงกลางผืนผ้าใบ ทำลายทุกสิ่งที่ขวางหน้า

ในตอนแรก กลุ่มอื่นๆ พยายามสร้างพันธมิตรกับพวกเขา โดยเชื่อว่าการทูตจะใช้ได้ผล แต่พวกเขาล้มเหลวเพราะเดอะวอยด์แตกต่างออกไป

ความว่างเปล่าไม่ใช่เครื่องปกป้อง ต่างจากกลุ่มอื่นๆ เธอไม่แสดงความจงรักภักดีต่อศิลปะ ผู้ติดตาม The Void ยอมรับลัทธิทำลายล้างที่เท่าเทียมภายใต้สโลแกน "The Void จะกลืนกินทุกสิ่ง" พวกเขาไม่ได้ติดต่อกับผู้อื่น พวกเขาแค่อยากจะทาให้โลกทั้งใบเป็นสีดำ

และนี่คือสิ่งที่จำเป็นจริงๆ เมื่อพบว่าตัวเองจวนจะสูญพันธุ์ ผู้เข้าร่วมโครงการทั้งหมดจึงรวมตัวกันเพื่อต่อสู้กับเดอะวอยด์เพื่อรักษางานศิลปะของพวกเขา

แต่ความว่างเปล่านั้นไม่ใช่เรื่องง่ายที่จะเอาชนะ เพราะมันจำเป็น จำเป็นต้องทำลายทุกสิ่งเพื่อให้งานศิลปะใหม่ที่ดีที่สุดสามารถเกิดใหม่จากเถ้าถ่านได้ และหากไม่มีความว่างเปล่า สิ่งนี้ก็เป็นไปไม่ได้

ดังนั้นความว่างเปล่าจึงกลายเป็นตัวเร่งให้เกิดการสร้างสรรค์ งานที่ใหญ่ที่สุดศิลปะ.

มีการต่อสู้ที่ดื้อรั้นเพื่อส่วนกลางของผืนผ้าใบตั้งแต่แรกเริ่ม ผู้สร้างอ้างสิทธิ์ในดินแดนนี้เพื่อผลงานของพวกเขา ในตอนแรกพวกเขาพยายามทำสิ่งนี้โดยใช้ไอคอน จากนั้นจึงประสานกันเพื่อสร้างปริซึมแบบเดียวกับบนปกอัลบั้ม พิงค์ ฟลอยด์ « ด้านหลังดวงจันทร์."

แต่เดอะวอยด์กินทุกอย่าง การสร้างสรรค์ครั้งแล้วครั้งเล่าได้กระตุ้นให้เธอกระหายความวุ่นวายเท่านั้น

แต่นี่คือสิ่งที่จำเป็นจริงๆ หลังจากทำลายงานศิลปะ The Void ได้บังคับให้ผู้ใช้คิดสิ่งที่ดีกว่าขึ้นมา พวกเขารู้ว่าพวกเขาสามารถเอาชนะสัตว์ประหลาดสีดำได้ พวกเขาแค่ต้องการไอเดียที่มีศักยภาพดีที่จะดึงดูดผู้ติดตามได้เพียงพอ

และความคิดนี้ก็กลายเป็นธงชาติอเมริกัน

ในวันสุดท้ายของโครงการทุกคนร่วมกันขับไล่ความว่างเปล่าออกไปให้หมด แนวร่วมถูกสร้างขึ้นจากผู้คนที่อยู่ในสถานการณ์ที่แตกต่างกันที่จะแยกออกจากกัน - จากผู้สนับสนุนและฝ่ายตรงข้ามของทรัมป์, จากพรรคเดโมแครตและรีพับลิกัน, จากชาวอเมริกันและชาวยุโรป

พวกเขามารวมตัวกันเพื่อสร้างสรรค์บางสิ่งร่วมกันในมุมเล็กๆ ของอินเทอร์เน็ต ซึ่งพิสูจน์ให้เห็นว่าในยุคที่การทำงานร่วมกันดังกล่าวดูเหมือนเป็นไปไม่ได้ พวกเขาก็ยังสามารถทำได้

คนสมัยก่อนพูดถูก

หลังจากนั้นไม่นาน การทดลอง Reddit ก็สิ้นสุดลง วันนี้เขามาพร้อมกับเรื่องราวมากมายที่เล่าผ่านการแชทหลายสิบครั้ง งานศิลปะแต่ละชิ้นที่สร้างขึ้นในโครงการนี้ถูกปกคลุมไปด้วยชิ้นใหม่หลายร้อยชิ้น ซึ่งมีเพียงไม่กี่ชิ้นเท่านั้นที่ยังคงอยู่บนผืนผ้าใบขั้นสุดท้าย

แต่สิ่งที่น่าประหลาดใจที่สุดก็คือ แม้ว่าจะไม่เปิดเผยตัวตนและไม่มีข้อห้าม แต่ก็ไม่มีสัญลักษณ์เหยียดเชื้อชาติหรือเกลียดชังมนุษย์บนผืนผ้าใบสุดท้าย มันเป็นวงจรที่สวยงามของศิลปะ ชีวิตและความตาย และเขาไม่ใช่คนแรกในประวัติศาสตร์ของเรา

เมื่อหลายพันปีก่อน เมื่อมนุษยชาติ (ของจริง ไม่ใช่แค่ใน Reddit) ยังอยู่ในช่วงเริ่มต้น นักปรัชญาฮินดูตั้งทฤษฎีว่าสวรรค์ประกอบด้วยเทพ 3 องค์ที่แข่งขันกันแต่จำเป็น ได้แก่ พระพรหมผู้สร้าง พระวิษณุผู้ปกป้อง และ พระศิวะ. ผู้ทำลาย.

แม้ว่าจะไม่มีหนึ่งในนั้น จักรวาลก็ไม่สามารถทำงานได้ การจะมีแสงสว่าง จำเป็นต้องมีความมืด การที่ชีวิตจะดำรงอยู่ได้ ความตายเป็นสิ่งจำเป็น สำหรับการสร้างสรรค์และศิลปะจะต้องมีการทำลายล้าง

หลายวันของโครงการแสดงให้เห็นว่าแนวทางนี้กลายเป็นคำทำนาย ด้วยวิธีที่น่าทึ่งที่สุด Reddit ได้พิสูจน์แล้วว่าการสร้างสรรค์ต้องใช้องค์ประกอบทั้งสามอย่าง

การวาดภาพครั้งสุดท้าย

เฟสบุ๊ค

ทวิตเตอร์

กระเป๋า

ลิงค์ดิน

ผู้ส่งสารเอฟบี

ไม่สามารถพูดได้ว่าเรื่องตลกขององค์กร 100% ในวันอารมณ์ขันนั้นประสบความสำเร็จและมีส่วนร่วม ในปีนี้ ฝ่ายบริหารของ Reddit ได้เปิดตัว Place ซึ่งเป็นผืนผ้าใบกราฟิกเชิงโต้ตอบขนาด 1,000 x 1,000 พิกเซล และส่วนที่ทุ่มเทให้กับมันโดยเฉพาะ สันนิษฐานว่าสมาชิกในชุมชนจะร่วมกันวาดภาพผืนผ้าใบนี้ตามที่ตนต้องการ แต่ด้วยเหตุนี้ สิ่งนี้จึงพัฒนาไปสู่การต่อสู้เพื่อชิงสถานที่ ซึ่งบางครั้งก็กลายเป็นการเผชิญหน้าเชิงปรัชญา แบบฝึกหัดการวาดภาพธรรมดากลายเป็นการทดลองทางสังคมที่น่าตื่นเต้น เรื่องราวได้รับการบันทึกตั้งแต่ต้นจนจบโดยบล็อก Sudoscript

กฎของสถานที่นั้นเรียบง่าย ผู้เข้าร่วมแต่ละคนสามารถเลือกหนึ่งพิกเซลจาก 16 สีและวางไว้ที่ใดก็ได้บนผืนผ้าใบ คุณสามารถวางพิกเซลได้มากเท่าที่คุณต้องการ แต่คุณต้องรอ 5 นาทีระหว่างแต่ละตำแหน่ง หลังจาก 72 ชั่วโมงนี้มาก กฎง่ายๆนำไปสู่การสร้างผืนผ้าใบส่วนรวมที่น่าทึ่ง:

แต่ละพิกเซลที่เห็นด้านบนถูกวางด้วยตนเอง ทุกไอคอน ทุกธง ทุกมีมถูกสร้างขึ้นอย่างระมัดระวังโดยผู้คนหลายพันคนที่ไม่มีอะไรเหมือนกันยกเว้นการเชื่อมต่ออินเทอร์เน็ต

ในระหว่างการสร้างสรรค์ ละคร ความคิด การต่อสู้ หรือแม้แต่สงครามมากมายก็เกิดขึ้น แต่โดยทั่วไปแล้ว ประวัติศาสตร์ของสถานที่แห่งนี้เป็นละครนิรันดร์เกี่ยวกับพลังทั้งสามที่จำเป็นสำหรับมนุษยชาติในการสร้างและสร้างสรรค์ และพัฒนาเทคโนโลยี

ผู้สร้าง

ในตอนแรกมีผู้สร้าง เหล่านี้เป็นศิลปินที่ผืนผ้าใบว่างเปล่าดูเหมือนเป็นโอกาสที่ไม่อาจต้านทานได้ ศิลปินยุคแรกวางพิกเซลแบบสุ่มเพื่อดูว่าพวกเขาสามารถทำอะไรได้บ้าง ในนาทีแรก ภาพร่างแรกก็ปรากฏขึ้น หยาบและยังไม่บรรลุนิติภาวะ มีลักษณะคล้ายกับภาพวาดในถ้ำของมนุษย์ถ้ำ

ผู้สร้างมองเห็นได้ทันทีว่าพิกเซลซ่อนพลังและศักยภาพอะไรไว้บ้าง แต่การทำงานโดยลำพัง พวกเขาสามารถวางหนึ่งพิกเซลทุกๆ 5 หรือ 10 นาที การสร้าง การวาดภาพที่มีความหมายจะใช้เวลาตลอดไป เพื่อจะวาดอะไรบางอย่าง พวกเขาต้องทำงานร่วมกัน

จากนั้นมีคนมีความคิดที่ยอดเยี่ยมที่จะใช้ตารางในการวาดภาพ ซึ่งจะวางซ้อนบนภาพวาดและแสดงว่าพิกเซลถัดไปควรอยู่ที่ใด คนแรกที่ได้รับการทดลองนี้คือมีมชื่อดังของอินเทอร์เน็ตที่พูดภาษาอังกฤษ Dickbutt และผู้อยู่อาศัยในสถานที่นั้นก็ต้องทำงาน: Dickbutt ปรากฏตัวขึ้นอย่างแท้จริงในไม่กี่นาทีที่มุมซ้ายล่างของผืนผ้าใบ การสร้างความคิดสร้างสรรค์ร่วมกันครั้งแรกปรากฏบนเว็บไซต์

จากนั้น เมื่อผู้สร้างเริ่มมึนเมาเล็กน้อยกับความเป็นไปได้ต่างๆ Pokémon Charmander ก็ปรากฏตัวขึ้น ซึ่งในไม่ช้าก็มีองคชาตแทนที่จะเป็นขา และความขัดแย้งครั้งแรกเริ่มต้นขึ้น: ผู้สร้างบางคนพยายามอย่างขยันขันแข็งที่จะทำความสะอาดภาพวาดที่ไม่เหมาะสม แต่คนอื่น ๆ ก็เพิ่มความหยาบคายอย่างต่อเนื่อง

ผู้สร้างต้องเผชิญกับปัญหาทางปรัชญาพื้นฐาน: เสรีภาพที่มากเกินไปนำไปสู่ความสับสนวุ่นวาย ความคิดสร้างสรรค์จำเป็นต้องมีข้อจำกัดพอๆ กับที่ต้องการอิสรภาพ

ผู้พิทักษ์

ผู้ใช้ประเภทอื่นปรากฏตัวขึ้นในสถานที่ซึ่งต้องจัดการกับปัญหานี้ แต่พวกเขาเริ่มต้นด้วยเป้าหมายดั้งเดิมที่มากกว่า นั่นคือการพิชิตโลก พวกเขาแบ่งออกเป็นฝ่ายตามสี พวกเขาพยายามยึดครองสถานที่นี้ หนึ่งในคนแรกคือมุมสีฟ้า เกิดขึ้นที่มุมขวาล่างและแพร่กระจายเหมือนโรคระบาด

อีกกลุ่มหนึ่งก่อตั้ง Red Corner เมื่อ ฝั่งตรงข้ามผืนผ้าใบพวกเขาเอนเอียงไปทางฝ่ายซ้ายทางการเมือง อีกกลุ่มหนึ่งที่เรียกว่า Green Grid วาดภาพผืนผ้าใบผ่านพิกเซล - เซลล์สีเขียวสลับกับเซลล์สีขาว เนื่องจากพวกเขาต้องลงสีเพียงครึ่งพิกเซล พวกมันจึงมีประสิทธิภาพมากกว่ากลุ่มอื่นๆ

ใช้เวลาไม่นานก่อนที่ฝ่ายต่างๆ จะปะทะกับผู้สร้าง Charmander กลายเป็นหนึ่งในเป้าหมายแรกของการต่อสู้ มุมสีน้ำเงินเริ่มวาดภาพโปเกมอนด้วยพิกเซลสีน้ำเงิน และผู้สร้างได้เปลี่ยนจาก "สงครามลึงค์" (ซึ่งสามารถดึงดูดจู๋ได้มากที่สุด) ไปสู่ภัยคุกคามที่ร้ายแรงยิ่งขึ้น พวกเขาต่อสู้กัน โดยวาดภาพพิกเซลสีน้ำเงินทุกอันด้วยตัวของพวกเขาเอง แต่ข้อได้เปรียบเชิงปริมาณไม่เข้าข้างพวกเขา

ดังนั้นผู้สร้างจึงยอมจำนนต่อความเมตตาของผู้ชนะและสิ่งนี้ก็ทำร้ายความรู้สึกของชาวบลูส์ ในหมู่พวกเขาปรากฏผู้ที่สงสัยในบทบาทของตนในโลกแห่งสถานที่ “คลื่นของเราจะปกคลุมโลกทั้งใบอย่างหลีกเลี่ยงไม่ได้ หากเราแสดงความเมตตาต่องานศิลปะอื่นๆ ที่เราพบเจอ” หนึ่งในกลุ่มถาม

แต่ละฝ่ายต้องเผชิญกับคำถามนี้ และทุกคนก็ตัดสินใจบันทึกภาพวาดอื่นๆ ดังนั้นคลื่นสีจึงเริ่มไหลไปรอบๆ ภาพวาดโดยไม่ได้ทาสี

นี่เป็นจุดเปลี่ยน กลุ่มที่มีสีไร้เหตุผลกลายเป็นผู้พิทักษ์ที่มีประโยชน์

แต่มันยังไม่ใช่ตอนจบที่มีความสุข

ในที่สุด คลื่นสีที่ไม่รู้จักพอก็หยุดลง และผู้สร้างก็สามารถกลับคืนสู่ความคิดสร้างสรรค์ได้ ภาพวาดมีความซับซ้อนมากขึ้นเรื่อยๆ ข้อความที่เขียนเป็นพิกเซลปรากฏขึ้น

ผู้สร้างได้จัดตั้งกลุ่มเล็กๆ โดยสร้าง subreddits ที่พวกเขาจะได้พูดคุยเกี่ยวกับศิลปะร่างและกลยุทธ์ กลุ่มที่ประสบความสำเร็จมากที่สุดกลุ่มหนึ่งวาดแถบงานในรูปแบบของ Windows 95 อีกกลุ่มหนึ่งวาดภาพสถานที่ด้วยหัวใจ

จากนั้นแวนโก๊ะก็ปรากฏตัวขึ้น

แต่มันไม่ง่ายขนาดนั้น ผู้ปกป้องกลายเป็นผู้เผด็จการโดยกำหนดรูปแบบการวาดภาพ พวกเขาตัดสินใจว่าอะไรวาดได้และอะไรวาดไม่ได้ กลุ่มต่างๆ เริ่มแบ่งแยกผู้ใช้ระหว่างกัน เรียกร้องฝ่ายต่างๆ ในขณะที่ผู้สร้างกำลังรอการอนุมัติแนวคิดใหม่ๆ

การต่อสู้ระหว่างฝ่ายปกป้องเริ่มดุเดือดมากขึ้น สตรีมเมอร์ Twitch คนหนึ่งกระตุ้นให้ผู้ติดตามของเขาโจมตี Blue กลยุทธ์การต่อสู้ได้รับการพัฒนา มีการยั่วยุด้วยซ้ำ: แฟน ๆ ที่มีสีเดียวกันเองก็วาดภาพพิกเซลสีของศัตรูในอาณาเขตของตนเพื่อที่จะมีข้อแก้ตัวสำหรับการโจมตีตอบโต้ ในขณะที่ฝ่ายต่าง ๆ ต่อสู้กันเอง ผู้สร้างก็พบว่าไม่มีที่ว่างเหลือสำหรับภาพวาดใหม่

ธงก็เริ่มปรากฏ ประเทศต่างๆ– เมื่อพวกเขาโตขึ้น พวกเขาก็มักจะชนกันอย่างหลีกเลี่ยงไม่ได้ ตัวอย่างเช่น ธงของเยอรมนีและฝรั่งเศสชนกันใน "ดินแดนที่ไม่มีมนุษย์"

ดูเหมือนว่าโลกใบเล็กนี้จวนจะเกิดสงคราม ทุกฝ่ายพยายามแก้ไขข้อขัดแย้งอย่างมีชั้นเชิง ผู้นำของผู้สร้างและผู้ปกป้องสื่อสารกันในการแชท แต่มักจะจบลงด้วยการกล่าวหาร่วมกัน

สถานที่แห่งนี้ต้องการผู้ร้ายที่ทุกคนสามารถรวมตัวกันเพื่อต่อต้านได้

เรือพิฆาต

ความว่างเปล่าได้มาเยือนแล้ว

มันเริ่มต้นด้วย 4chan ซึ่งเป็นบอร์ดรูปภาพที่มีชื่อเสียงที่สุดในโลก พวกเล่นแผลง ๆ ที่อาศัยอยู่ในนั้นสังเกตเห็นสิ่งที่เกิดขึ้นใน Reddit และไม่สามารถเพิกเฉยได้ พวกเขากลายเป็นความว่างเปล่า

จุดพิกเซลสีดำเริ่มเติบโตตรงกลางสถานที่ ในตอนแรก ฝ่ายต่างๆ พยายามที่จะสรุปสนธิสัญญากับเดอะวอยด์โดยใช้การทูต แต่พวกเขาล้มเหลว The Void ทำหน้าที่แตกต่างออกไป เธอไม่ใช่หนึ่งในผู้พิทักษ์ เธอไม่ได้ปกป้องงานศิลปะ ผู้ติดตามของเธอเทศน์ว่า The Void จะกลืนกินทุกสิ่ง พวกเขาไม่ได้รวมตัวกัน พวกเขาเพียงต้องการทาให้โลกทั้งใบเป็นสีดำ

นี่เป็นการเตะเข้าที่ตูดที่เพลสต้องการ เมื่อต้องเผชิญกับภัยคุกคามร่วมกัน ผู้สร้างและผู้ปกป้องจึงรวมตัวกันอีกครั้งเพื่อปกป้องงานศิลปะ แต่จุดประสงค์ของ the Void ไม่ใช่แค่การทำลายล้างเท่านั้น แต่ยังก่อให้เกิดงานศิลปะใหม่ที่ดีกว่าอีกด้วย

ตัวอย่างเช่น ตำแหน่งตรงกลางเป็นหนึ่งในตำแหน่งที่ผู้สร้างโต้แย้งกันมากที่สุด และเมื่อมันกลายเป็นสีดำ เหล่าผู้พิทักษ์ก็ตระหนักว่าพวกเขาจะต้องคิดไอเดียที่ดีกว่าที่จะดึงดูดผู้ติดตามให้มากพอที่จะต่อสู้กับสัตว์ประหลาดสีดำ หนึ่งในแนวคิดเหล่านี้คือธงชาติสหรัฐอเมริกา

ในวันสุดท้ายของการดำรงอยู่ของสถานที่นี้ แนวร่วมที่น่าทึ่งที่สุดได้ก่อตั้งขึ้นในนั้น ซึ่งออกแบบมาเพื่อต่อสู้กับความว่างเปล่า - มีแฟน ๆ ของทรัมป์และฝ่ายตรงข้ามของทรัมป์ รีพับลิกันและเดโมแครต ชาวอเมริกันและชาวยุโรป

การทดลอง Reddit สิ้นสุดลงในไม่ช้า ไม่มีภาพวาดเหยียดเชื้อชาติหรือสัญลักษณ์แห่งความเกลียดชังแม้แต่ภาพเดียวบนผืนผ้าใบสุดท้าย

ทวิตเตอร์

กระเป๋า

ลิงค์ดิน

ผู้ส่งสารเอฟบี

ประการแรก การกำหนดข้อกำหนดสำหรับโปรเจ็กต์ April Fool's นั้นเป็นสิ่งสำคัญอย่างยิ่ง เนื่องจากจะต้องเปิดตัวโดยไม่ต้อง "โอเวอร์คล็อก" เพื่อให้ผู้ใช้ Reddit ทุกคนสามารถเข้าถึงได้ทันที ถ้ามันทำงานได้ไม่สมบูรณ์แบบตั้งแต่เริ่มแรก มันคงไม่ดึงดูดความสนใจของคนจำนวนมากได้

    "กระดาน" ควรมีขนาด 1,000x1000 แผ่นเพื่อให้ดูใหญ่มาก

    ไคลเอนต์ทั้งหมดควรซิงโครไนซ์และแสดงสถานะของบอร์ดเดียวกัน ท้ายที่สุดแล้ว หากผู้ใช้ต่างกันมีเวอร์ชันที่แตกต่างกัน ก็จะเป็นการยากสำหรับพวกเขาในการโต้ตอบ

    คุณต้องรองรับผู้ใช้พร้อมกันอย่างน้อย 100,000 ราย

    ผู้ใช้สามารถวางหนึ่งไทล์ทุกๆ ห้านาที ดังนั้นจึงจำเป็นต้องรักษาอัตราการอัพเดตเฉลี่ย 100,000 ไทล์ต่อห้านาที (333 อัพเดตต่อวินาที)

    โครงการไม่ควรส่งผลเสียต่อการดำเนินงานของส่วนอื่นๆ และฟังก์ชันอื่นๆ ของไซต์ (แม้ว่าจะมีการรับส่งข้อมูลบน r/Place สูงก็ตาม)

  • ต้องจัดให้มีการกำหนดค่าที่ยืดหยุ่นในกรณีที่เกิดปัญหาคอขวดหรือความล้มเหลวที่ไม่คาดคิด นั่นคือคุณจะต้องสามารถปรับขนาดของบอร์ดและความถี่ในการวาดที่อนุญาตได้ทันทีหากปริมาณข้อมูลมากเกินไปหรือความถี่ในการอัปเดตสูงเกินไป

แบ็กเอนด์

โซลูชั่นการดำเนินงาน

ปัญหาหลักในการสร้างแบ็กเอนด์คือการซิงโครไนซ์การแสดงสถานะของบอร์ดกับไคลเอนต์ทั้งหมด มีการตัดสินใจว่าให้ลูกค้าฟังเหตุการณ์การวางตำแหน่งไทล์แบบเรียลไทม์ และสอบถามสถานะของกระดานทั้งหมดทันที การมีสถานะเต็มล้าสมัยเล็กน้อยเป็นที่ยอมรับได้หากคุณสมัครรับการอัปเดตก่อนที่จะสร้างสถานะเต็ม เมื่อไคลเอนต์ได้รับสถานะเต็ม มันจะแสดงไทล์ทั้งหมดที่ได้รับขณะรอ ไทล์ที่ตามมาทั้งหมดจะต้องปรากฏบนกระดานทันทีที่ได้รับ


เพื่อให้โครงการนี้ทำงานได้ตามคำขอ สภาพเต็มบอร์ดควรจะแล้วเสร็จโดยเร็วที่สุด ในตอนแรก เราต้องการจัดเก็บบอร์ดทั้งหมดไว้ในแถวเดียวใน Cassandra และให้แต่ละคำขออ่านแถวนั้น รูปแบบของแต่ละคอลัมน์ในบรรทัดนี้คือ:


(x, y): ('timestamp': epochms, 'author': user_name, 'color': color)

แต่เนื่องจากกระดานมีหนึ่งล้านช่อง เราจึงต้องอ่านหนึ่งล้านคอลัมน์ ในคลัสเตอร์การผลิตของเรา การดำเนินการนี้ใช้เวลานานถึง 30 วินาที ซึ่งเป็นที่ยอมรับไม่ได้และอาจส่งผลให้ Cassandra มีภาระงานมากเกินไป


จากนั้นเราตัดสินใจจัดเก็บกระดานทั้งหมดไว้ใน Redis เราใช้ฟิลด์บิตของตัวเลขสี่บิตจำนวนหนึ่งล้านตัว ซึ่งแต่ละตัวสามารถเข้ารหัสสีสี่บิตได้ และพิกัด x และ y ถูกกำหนดโดยออฟเซ็ต (ออฟเซ็ต = x + 1,000y) ในช่องบิต เพื่อให้ได้สถานะเต็มของบอร์ด จะต้องอ่านฟิลด์บิตทั้งหมด


สามารถอัปเดตไทล์ได้โดยการอัปเดตค่าที่ออฟเซ็ตเฉพาะ (ไม่จำเป็นต้องบล็อกหรือดำเนินการตามขั้นตอนการอ่าน/อัปเดต/เขียนทั้งหมด) แต่รายละเอียดทั้งหมดยังต้องถูกจัดเก็บไว้ใน Cassandra เพื่อให้ผู้ใช้สามารถค้นหาได้ว่าใครเป็นผู้วางแต่ละไทล์และเมื่อใด นอกจากนี้เรายังวางแผนที่จะใช้ Cassandra เพื่อกู้คืนบอร์ดเมื่อ Redis ขัดข้อง การอ่านกระดานทั้งหมดใช้เวลาน้อยกว่า 100 มิลลิวินาที ซึ่งค่อนข้างเร็ว


ต่อไปนี้คือวิธีที่เราจัดเก็บสีใน Redis โดยใช้ตัวอย่างบอร์ด 2x2:



เรากังวลว่าเราอาจประสบปัญหาความเร็วในการอ่านใน Redis หากไคลเอนต์จำนวนมากเชื่อมต่อหรืออัปเดตในเวลาเดียวกัน พวกเขาทั้งหมดจะส่งคำขอสถานะเต็มของบอร์ดไปพร้อมๆ กัน เนื่องจากบอร์ดเป็นตัวแทนของสถานะส่วนกลางที่ใช้ร่วมกัน วิธีแก้ปัญหาที่ชัดเจนคือการใช้แคช เราตัดสินใจแคชที่ระดับ CDN (เร็ว) เนื่องจากง่ายต่อการนำไปใช้ และแคชนั้นได้รับมาใกล้กับไคลเอนต์มากที่สุด ซึ่งช่วยลดเวลาในการรับการตอบกลับ


คำขอสถานะเต็มบอร์ดถูกแคชโดย Fastly โดยหมดเวลาเพียงเสี้ยววินาที เพื่อป้องกันไม่ให้คำขอจำนวนมากหมดเวลา เราใช้ส่วนหัวเก่าขณะตรวจสอบใหม่ รองรับ POP ประมาณ 33 POP อย่างรวดเร็วซึ่งแคชซึ่งกันและกันอย่างอิสระ ดังนั้นเราจึงคาดว่าจะได้รับคำขอสถานะบอร์ดเต็มรูปแบบสูงสุด 33 รายการต่อวินาที


เพื่อเผยแพร่การอัปเดตไปยังไคลเอนต์ทั้งหมด เราใช้บริการ websocket ของเรา ก่อนหน้านี้เราใช้มันอย่างประสบความสำเร็จในการเพิ่มพลังให้กับ Reddit.Live โดยมีผู้ใช้พร้อมกันมากกว่า 100,000 รายสำหรับการแจ้งเตือนข้อความส่วนตัวแบบ Live และคุณสมบัติอื่น ๆ การบริการยังเป็นรากฐานสำคัญของโปรเจ็กต์วันเอพริลฟูลที่ผ่านมาของเราอย่าง The Button และ Robin ในกรณีของ r/Place ลูกค้ารองรับการเชื่อมต่อ websocket เพื่อรับการอัปเดตแบบเรียลไทม์เกี่ยวกับตำแหน่งไทล์

เอพีไอ

รับสถานะเต็มกระดาน


ในตอนแรกคำขอไปที่ Fastly หากมีสำเนาบอร์ดที่ถูกต้อง ก็จะส่งคืนทันทีโดยไม่ต้องติดต่อกับเซิร์ฟเวอร์แอปพลิเคชันของ Reddit หากไม่เป็นเช่นนั้น หรือสำเนาเก่าเกินไป แอป Reddit จะอ่านกระดานทั้งหมดจาก Redis และส่งคืนไปที่ Fastly เพื่อแคชและส่งกลับไปยังไคลเอนต์




โปรดทราบว่าอัตราการร้องขอไม่เคยถึง 33 ต่อวินาที หมายความว่าการแคชด้วย Fastly มีประสิทธิภาพมากในการปกป้องแอป Reddit จากคำขอส่วนใหญ่



และเมื่อคำขอมาถึงแอปพลิเคชัน Redis ก็ตอบกลับอย่างรวดเร็ว

วาดกระเบื้อง


ขั้นตอนของการวาดกระเบื้อง:

  1. การประทับเวลาของตำแหน่งสุดท้ายของไทล์ของผู้ใช้จะถูกอ่านจาก Cassandra หากเป็นเวลาน้อยกว่าห้านาทีที่แล้ว เราจะไม่ทำอะไรเลยและจะส่งคืนข้อผิดพลาดให้กับผู้ใช้
  2. รายละเอียดไทล์เขียนถึง Redis และ Cassandra
  3. เวลาปัจจุบันจะถูกบันทึกใน Cassandra เป็นครั้งสุดท้ายที่ผู้ใช้วางไทล์
  4. บริการ websocket ส่งข้อความเกี่ยวกับไทล์ใหม่ไปยังไคลเอนต์ที่เชื่อมต่อทั้งหมด

เพื่อรักษาความสอดคล้องที่เข้มงวด การเขียนและการอ่านทั้งหมดใน Cassandra ดำเนินการโดยใช้เลเยอร์ความสอดคล้อง QUORUM


ที่จริงแล้ว เรามีการแข่งขันกันที่นี่ซึ่งผู้ใช้สามารถวางไทล์หลายอันพร้อมกันได้ ไม่มีการบล็อกในระยะที่ 1–3 ดังนั้นการพยายามจั่วแผ่นกระเบื้องพร้อมกันจึงสามารถผ่านการตรวจสอบในระยะแรกและจั่วได้ในระยะที่สอง ดูเหมือนว่าผู้ใช้บางคนค้นพบจุดบกพร่องนี้ (หรือพวกเขาใช้บอทที่เพิกเฉยต่อขีดจำกัดความถี่ของคำขอ) - และด้วยเหตุนี้ มีการวางไทล์ประมาณ 15,000 แผ่นโดยใช้มัน (~ 0.09% ของทั้งหมด)


อัตราคำขอและเวลาตอบสนองที่วัดโดยแอป Reddit:



อัตราการวางไทล์สูงสุดอยู่ที่เกือบ 200 ต่อวินาที ซึ่งต่ำกว่าขีดจำกัดโดยประมาณของเราที่ 333 แผ่น/วินาที (โดยเฉลี่ยสมมติว่าผู้ใช้ 100,000 รายวางแผ่นทุกๆ ห้านาที)


การรับรายละเอียดสำหรับไทล์เฉพาะ


เมื่อร้องขอไทล์เฉพาะ ข้อมูลจะถูกอ่านโดยตรงจาก Cassandra


อัตราคำขอและเวลาตอบสนองที่วัดโดยแอป Reddit:



คำขอนี้ได้รับความนิยมอย่างมาก นอกเหนือจากคำขอของลูกค้าทั่วไปแล้ว ผู้คนยังได้เขียนสคริปต์เพื่อดึงข้อมูลทั้งกระดานทีละไทล์ เนื่องจากคำขอนี้ไม่ได้แคชไว้ใน CDN คำขอทั้งหมดจึงให้บริการโดยแอปพลิเคชัน Reddit



เวลาในการตอบสนองต่อคำขอเหล่านี้ค่อนข้างสั้นและยังคงอยู่ที่ระดับเดิมตลอดอายุของโครงการ

เว็บซ็อกเก็ต

เราไม่มีตัวชี้วัดส่วนบุคคลที่แสดงให้เห็นว่า r/Place ส่งผลต่อบริการ websocket อย่างไร แต่เราสามารถประมาณค่าได้โดยการเปรียบเทียบข้อมูลก่อนเริ่มโครงการและหลังเสร็จสิ้น


จำนวนการเชื่อมต่อกับบริการ websocket ทั้งหมด:



โหลดพื้นฐานก่อนการเปิดตัว r/Place มีการเชื่อมต่อประมาณ 20,000 ครั้ง ยอดสูงสุดอยู่ที่ 100,000 การเชื่อมต่อ เมื่อถึงจุดสูงสุด เราอาจมีผู้ใช้ประมาณ 80,000 รายที่เชื่อมต่อกับ r/Place


ปริมาณงานบริการ Websocket:



ที่จุดสูงสุดของการโหลดบน r/Place บริการ websocket ถ่ายโอนมากกว่า 4 Gbps (150 Mbps ต่ออินสแตนซ์ รวมทั้งหมด 24 อินสแตนซ์)

ส่วนหน้า: เว็บและไคลเอนต์มือถือ

ในกระบวนการสร้างส่วนหน้าของ Place เราต้องตัดสินใจมากมาย งานที่ซับซ้อนที่เกี่ยวข้องกับการพัฒนาข้ามแพลตฟอร์ม เราต้องการให้โปรเจ็กต์ทำงานเหมือนกันบนแพลตฟอร์มหลักทั้งหมด รวมถึงเดสก์ท็อปและ อุปกรณ์เคลื่อนที่บน iOS และ Android


อินเทอร์เฟซผู้ใช้ต้องทำหน้าที่สำคัญสามประการ:

  1. แสดงสถานะของบอร์ดแบบเรียลไทม์
  2. อนุญาตให้ผู้ใช้โต้ตอบกับบอร์ด
  3. ทำงานบนทุกแพลตฟอร์ม รวมถึงแอปพลิเคชันบนมือถือ

ออบเจ็กต์หลักของอินเทอร์เฟซคือแคนวาส และ Canvas API ก็เหมาะอย่างยิ่งสำหรับอินเทอร์เฟซนี้ เราใช้องค์ประกอบ ขนาด 1,000x1000 และแต่ละไทล์ถูกวาดเป็นพิกเซลเดียว

วาดภาพผืนผ้าใบ

ผืนผ้าใบต้องสะท้อนสถานะของบอร์ดแบบเรียลไทม์ จำเป็นต้องวาดทั้งกระดานเมื่อโหลดหน้าและเสร็จสิ้นการอัปเดตที่มาจากเว็บซ็อกเก็ต องค์ประกอบแคนวาสที่ใช้อินเทอร์เฟซ CanvasRenderingContext2D สามารถอัปเดตได้สามวิธี:

  1. สี รูปภาพที่มีอยู่บนผืนผ้าใบโดยใช้ DrawImage()
  2. วาดรูปทรงโดยใช้ วิธีการที่แตกต่างกันแบบฟอร์มการวาดภาพ ตัวอย่างเช่น fillRect() เติมสีลงในสี่เหลี่ยม
  3. สร้างวัตถุ ImageData และวาดลงบนผืนผ้าใบโดยใช้ putImageData()

ตัวเลือกแรกไม่เหมาะกับเราเนื่องจากเราไม่มีกระดานในรูปแบบของภาพที่เสร็จแล้ว ซึ่งเหลือตัวเลือกที่ 2 และ 3 วิธีที่ง่ายที่สุดคือการอัปเดตแต่ละไทล์โดยใช้ fillRect() : เมื่อมีการอัปเดตมาถึงผ่าน websocket เราก็เพียงวาดรูปสี่เหลี่ยมขนาด 1x1 ที่ตำแหน่ง (x, y) โดยทั่วไปวิธีนี้ใช้งานได้ แต่ไม่สะดวกในการวาดสถานะเริ่มต้นของบอร์ด เมธอด putImageData() ดีกว่ามาก: เราสามารถกำหนดสีของแต่ละพิกเซลในออบเจ็กต์ ImageData เดียวและวาดทั้งผืนผ้าใบได้ในคราวเดียว

การวาดสถานะเริ่มต้นของบอร์ด

การใช้ putImageData() จำเป็นต้องกำหนดสถานะของบอร์ดเป็น Uint8ClampedArray โดยที่แต่ละค่าเป็นตัวเลขแปดบิตที่ไม่ได้ลงนามในช่วง 0 ถึง 255 แต่ละค่าแสดงถึงช่องสี (แดง เขียว น้ำเงิน อัลฟา) และแต่ละค่า pixel ต้องมีสี่องค์ประกอบในอาร์เรย์ ผืนผ้าใบ 2x2 ต้องใช้อาร์เรย์ 16 ไบต์ โดยที่สี่ไบต์แรกแสดงถึงพิกเซลด้านซ้ายบนของผืนผ้าใบ และสี่ไบต์สุดท้ายแสดงถึงพิกเซลด้านขวาล่าง


นี่คือวิธีที่พิกเซลแคนวาสเชื่อมโยงกับการเป็นตัวแทน Uint8ClampedArray:



สำหรับผืนผ้าใบของโปรเจ็กต์ของเรา เราต้องการอาร์เรย์สี่ล้านไบต์ - 4 MB


ในแบ็กเอนด์ สถานะของบอร์ดจะถูกจัดเก็บเป็นฟิลด์บิตสี่บิต แต่ละสีจะแสดงด้วยตัวเลขตั้งแต่ 0 ถึง 15 ซึ่งช่วยให้เราบรรจุพิกเซลสองพิกเซลลงในแต่ละไบต์ได้ หากต้องการใช้สิ่งนี้บนอุปกรณ์ไคลเอนต์ คุณต้องทำสามสิ่ง:

  1. ถ่ายโอนข้อมูลไบนารีจาก API ของเราไปยังไคลเอนต์
  2. แกะข้อมูล
  3. แปลงสีสี่บิตเป็น 32 บิต

ในการถ่ายโอนข้อมูลไบนารี เราใช้ Fetch API ในเบราว์เซอร์ที่รองรับ และในส่วนที่ไม่สนับสนุนเราก็ใช้ XMLHttpRequestโดยที่ responseType ตั้งค่าเป็น “arraybuffer”


ข้อมูลไบนารีที่ได้รับจาก API มีสองพิกเซลในแต่ละไบต์ ตัวสร้าง TypedArray ที่เล็กที่สุดที่เรามีช่วยให้คุณสามารถทำงานกับข้อมูลไบนารีในรูปแบบของหน่วยไบต์เดียว แต่สิ่งเหล่านี้ใช้งานบนอุปกรณ์ไคลเอนต์ได้ยาก ดังนั้นเราจึงแตกแพ็กข้อมูลเพื่อให้ทำงานได้ง่ายขึ้น กระบวนการนี้ง่ายดาย: เราวนซ้ำข้อมูลที่แพ็ก ดึงบิตลำดับสูงและลำดับต่ำออกมา จากนั้นคัดลอกพวกมันลงในไบต์เดี่ยว ๆ ลงในอาร์เรย์อื่น


สุดท้ายต้องแปลงสีสี่บิตเป็น 32 บิต



โครงสร้าง ImageData ที่เราจำเป็นต้องใช้ putImageData() ต้องการให้ผลลัพธ์สุดท้ายเป็น Uint8ClampedArray พร้อมไบต์ที่เข้ารหัสช่องสีตามลำดับ RGBA ซึ่งหมายความว่าเราจำเป็นต้องทำการคลายการบีบอัดอีกครั้ง โดยแบ่งแต่ละสีออกเป็นไบต์ของช่องส่วนประกอบ และวางไว้ในดัชนีที่ถูกต้อง การเขียนสี่ครั้งต่อพิกเซลไม่สะดวกนัก แต่โชคดีที่มีอีกทางเลือกหนึ่ง


อ็อบเจ็กต์ TypedArray เป็นตัวแทนอาร์เรย์ของ ArrayBuffer เป็นหลัก มีข้อแม้ประการหนึ่งที่นี่: อินสแตนซ์ TypedArray หลายรายการสามารถอ่านและเขียนไปยังอินสแตนซ์ ArrayBuffer เดียวกันได้ แทนที่จะเขียนค่าสี่ค่าลงในอาร์เรย์ 8 บิต เราสามารถเขียนค่าหนึ่งค่าลงในอาร์เรย์ 32 บิตได้! ด้วยการใช้ Uint32Array ในการเขียน เราสามารถอัปเดตสีไทล์ได้อย่างง่ายดายเพียงอัปเดตดัชนีอาร์เรย์เดียว อย่างไรก็ตาม เราต้องจัดเก็บจานสีของเราตามลำดับไบต์ขนาดใหญ่ (ABGR) เพื่อให้ไบต์ไปอยู่ในตำแหน่งที่ถูกต้องโดยอัตโนมัติเมื่ออ่านโดยใช้ Uint8ClampedArray


กำลังประมวลผลการอัปเดตที่ได้รับผ่าน websocket

เมธอด DrawRect() นั้นดีสำหรับการอัปเดตแต่ละพิกเซลเมื่อได้รับ แต่มีจุดอ่อนประการหนึ่ง นั่นคือ การอัปเดตจำนวนมากที่มาถึงพร้อมกันอาจทำให้เบราว์เซอร์ช้าลง และเราเข้าใจดีว่าการอัปเดตสถานะของบอร์ดอาจเกิดขึ้นบ่อยมาก ดังนั้นปัญหาจึงต้องได้รับการแก้ไขด้วยวิธีใดวิธีหนึ่ง


แทนที่จะวาดภาพแคนวาสใหม่ทันทีทุกครั้งที่ได้รับการอัปเดตผ่าน websocket เราตัดสินใจที่จะดำเนินการดังกล่าวเพื่อให้สามารถอัปเดต websocket ที่มาถึงในเวลาเดียวกันเป็นชุดและแสดงผลพร้อมกันได้ เพื่อให้บรรลุเป้าหมายนี้ จึงมีการเปลี่ยนแปลง 2 ประการ:

  1. หยุดใช้ DrawRect() - เราพบแล้ว วิธีที่สะดวกอัปเดตหลายพิกเซลในแต่ละครั้งโดยใช้ putImageData()
  2. การถ่ายโอนการเรนเดอร์แคนวาสไปยังลูป requestAnimationFrame

ด้วยการย้ายการเรนเดอร์ไปยังลูปแอนิเมชั่น เราสามารถเขียนการอัปเดต websocket ไปยัง ArrayBuffer ได้ทันทีในขณะที่เลื่อนการเรนเดอร์จริงไปด้วย การอัปเดต websocket ทั้งหมดที่มาถึงระหว่างเฟรม (ประมาณ 16 ms) ได้รับการจัดกลุ่มและแสดงผลพร้อมกัน ต้องขอบคุณการใช้ requestAnimationFrame หากการเรนเดอร์ใช้เวลานานเกินไป (นานกว่า 16 ms) จะส่งผลต่ออัตราการรีเฟรชแคนวาสเท่านั้น (แทนที่จะลดประสิทธิภาพของเบราว์เซอร์ทั้งหมด)

การโต้ตอบกับผืนผ้าใบ

สิ่งสำคัญคือต้องทราบว่าจำเป็นต้องใช้ Canvas เพื่อให้ผู้ใช้สามารถโต้ตอบกับระบบได้สะดวกยิ่งขึ้น สถานการณ์การโต้ตอบหลักคือการวางไทล์บนผืนผ้าใบ


แต่การเรนเดอร์ทุกพิกเซลอย่างแม่นยำในระดับ 1:1 จะเป็นเรื่องยากอย่างยิ่ง และเราจะไม่หลีกเลี่ยงข้อผิดพลาด ดังนั้นเราจึงต้องการการซูม (ใหญ่!) นอกจากนี้ ผู้ใช้จำเป็นต้องสามารถนำทางไปยังผืนผ้าใบได้อย่างง่ายดาย เนื่องจากมีขนาดใหญ่เกินไปสำหรับหน้าจอส่วนใหญ่ (โดยเฉพาะเมื่อใช้การซูม)

ซูม

เนื่องจากผู้ใช้สามารถวางไทล์ทุกๆ ห้านาที ข้อผิดพลาดในการวางตำแหน่งจึงน่าหงุดหงิดเป็นพิเศษสำหรับพวกเขา จำเป็นต้องใช้การซูมขนาดเพื่อให้กระเบื้องมีขนาดใหญ่เพียงพอและสามารถวางในตำแหน่งที่ถูกต้องได้อย่างง่ายดาย สิ่งนี้สำคัญอย่างยิ่งกับอุปกรณ์หน้าจอสัมผัส


เราใช้การซูม 40 เท่า กล่าวคือ แต่ละไทล์มีขนาด 40x40 เราห่อองค์ประกอบ วี

ซึ่งใช้การแปลง CSS: ขนาด (40, 40) นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับการวางแผ่นกระเบื้อง แต่ทำให้ยากต่อการดูกระดาน (โดยเฉพาะบนหน้าจอขนาดเล็ก) ดังนั้นเราจึงทำให้การซูมแบบสองขั้นตอน: 40x สำหรับการวาดชิ้นส่วน และ 4x สำหรับการดูกระดาน


การใช้ CSS เพื่อปรับขนาดผืนผ้าใบทำให้ง่ายต่อการแยกโค้ดที่รับผิดชอบในการวาดบอร์ดออกจากโค้ดที่รับผิดชอบในการปรับขนาด แต่วิธีนี้กลับกลายเป็นว่ามีข้อเสียหลายประการ เมื่อปรับขนาดรูปภาพ (แคนวาส) เบราว์เซอร์จะใช้อัลกอริธึมการปรับให้เรียบของรูปภาพเป็นค่าเริ่มต้น ในบางกรณีสิ่งนี้จะไม่ทำให้เกิดความไม่สะดวก แต่เพียงทำลายกราฟิกพิกเซลและเปลี่ยนให้กลายเป็นข้าวต้มสบู่ ข่าวดี- มีคุณสมบัติ CSS ในการเรนเดอร์รูปภาพ ซึ่งเราสามารถ "ถาม" เบราว์เซอร์ไม่ให้ใช้การป้องกันนามแฝงได้ ข่าวร้ายก็คือไม่ใช่ว่าทุกเบราว์เซอร์จะรองรับคุณสมบัตินี้ได้อย่างเต็มที่


ซูมเบลอ:



สำหรับเบราว์เซอร์ดังกล่าว เราจำเป็นต้องหาวิธีอื่นในการขยายขนาด ฉันได้กล่าวไปแล้วว่ามีสามวิธีในการวาดภาพบนผืนผ้าใบ ประการแรก DrawImage() รองรับการวาดภาพที่มีอยู่หรือผืนผ้าใบอื่น นอกจากนี้ยังรองรับการปรับขนาดรูปภาพเมื่อเรนเดอร์ (ซูมเข้าหรือออก) และแม้ว่าการซูมจะมีปัญหาเรื่องการเบลอเช่นเดียวกับ CSS ที่กล่าวมาข้างต้น แต่ก็สามารถแก้ไขได้ด้วยวิธีที่เป็นสากลมากขึ้นในแง่ของการรองรับเบราว์เซอร์ โดยยกเลิกการเลือกแฟล็ก CanvasRenderingContext2D.imageSmoothingEnabled


ดังนั้นเราจึงแก้ไขปัญหาการเบลอของแคนวาสโดยเพิ่มขั้นตอนอื่นให้กับกระบวนการเรนเดอร์ สำหรับสิ่งนี้ เราได้สร้างองค์ประกอบอีกหนึ่งอย่าง ซึ่งขนาดและตำแหน่งสอดคล้องกับองค์ประกอบคอนเทนเนอร์ (นั่นคือกับพื้นที่ที่มองเห็นได้ของกระดาน) หลังจากวาดภาพผืนผ้าใบใหม่โดยใช้ DrawImage() ส่วนที่มองเห็นได้จะถูกวาดบนผืนผ้าใบใหม่ตามขนาดที่ต้องการ เนื่องจากขั้นตอนพิเศษนี้เพิ่มต้นทุนเล็กน้อยในการเรนเดอร์ เราจึงใช้ขั้นตอนนี้เฉพาะในเบราว์เซอร์ที่ไม่รองรับคุณสมบัติ CSS เรนเดอร์รูปภาพเท่านั้น

เคลื่อนไหวบนผืนผ้าใบ

ผืนผ้าใบเป็นภาพที่ค่อนข้างใหญ่ โดยเฉพาะอย่างยิ่งเมื่อซูมเข้า ดังนั้นเราจึงจำเป็นต้องสามารถเคลื่อนที่ไปรอบๆ ได้ ในการปรับตำแหน่งของผืนผ้าใบบนหน้าจอ เราใช้วิธีการเดียวกันกับในกรณีของการปรับขนาด: เราห่อองค์ประกอบไว้ ไปที่อื่น

ซึ่งการแปลง CSS: แปล(x, y) ถูกนำไปใช้ ด้วย div ที่แยกจากกัน เราจึงสามารถควบคุมลำดับการเปลี่ยนแปลงที่ใช้กับแคนวาสได้อย่างง่ายดาย ซึ่งจำเป็นเพื่อป้องกันไม่ให้ "กล้อง" เคลื่อนที่เมื่อเปลี่ยนการซูม


ด้วยเหตุนี้เราจึงให้การสนับสนุน วิธีการที่แตกต่างกันการตั้งค่าตำแหน่งกล้อง:

  • “คลิกแล้วลาก” (คลิกแล้วลากหรือแตะเพื่อลาก)
  • “คลิกเพื่อย้าย”;
  • การนำทางด้วยแป้นพิมพ์

แต่ละวิธีการเหล่านี้มีการใช้งานที่แตกต่างกัน

"คลิกและลาก"

นี่เป็นวิธีการนำทางหลัก เราเก็บพิกัด x และ y ของเหตุการณ์การเลื่อนเมาส์ไว้ สำหรับแต่ละเหตุการณ์เหล่านี้ เราพบออฟเซ็ตของเคอร์เซอร์ของเมาส์ที่สัมพันธ์กับตำแหน่งเริ่มต้น จากนั้นจึงเพิ่มออฟเซ็ตนี้ให้กับออฟเซ็ตของแคนวาสที่มีอยู่ ตำแหน่งกล้องได้รับการอัปเดตทันที ดังนั้นการนำทางจึงตอบสนองได้ดีมาก

"คลิกเพื่อย้าย"

เมื่อคุณคลิกบนไทล์ ไทล์นั้นจะถูกวางไว้ตรงกลางหน้าจอ ในการใช้กลไกนี้ เราต้องติดตามระยะห่างระหว่างเหตุการณ์การเลื่อนเมาส์และเลื่อนเมาส์เพื่อแยก "การคลิก" ออกจาก "การเคลื่อนไหว" หากระยะห่างที่เมาส์เคลื่อนที่ไม่เพียงพอที่จะถือเป็น "การเคลื่อนไหว" ตำแหน่งของ "กล้อง" จะเปลี่ยนไปตามความแตกต่างระหว่างตำแหน่งของเมาส์และจุดที่อยู่ตรงกลางของหน้าจอ ต่างจากวิธีการนำทางก่อนหน้านี้ ตำแหน่ง "กล้อง" ได้รับการอัปเดตโดยใช้ฟังก์ชันความราบรื่น แทนที่จะกำหนดตำแหน่งใหม่ทันที เราบันทึกตำแหน่งนั้นเป็น "เป้าหมาย" ภายในวงจรแอนิเมชั่น (แบบเดียวกับที่ใช้ในการวาดแคนวาสใหม่) ตำแหน่ง “กล้อง” ปัจจุบันจะถูกย้ายเข้าใกล้ตำแหน่งเป้าหมายมากขึ้นโดยใช้ฟังก์ชันความราบรื่น ทำให้สามารถกำจัดผลกระทบของการเคลื่อนไหวกะทันหันเกินไปได้

การนำทางด้วยแป้นพิมพ์

คุณสามารถเคลื่อนที่ไปรอบๆ ผืนผ้าใบได้โดยใช้ลูกศรบนแป้นพิมพ์หรือ WASD ปุ่มเหล่านี้ควบคุมเวกเตอร์การเคลื่อนไหวภายใน หากไม่มีการกดปุ่ม เวกเตอร์เริ่มต้นจะมีพิกัด (0, 0) การกดปุ่มนำทางใดๆ จะเป็นการเพิ่ม 1 ถึง x หรือ y ตัวอย่างเช่น หากคุณกด "ขวา" และ "ขึ้น" พิกัดเวกเตอร์จะเป็น (1, -1) จากนั้นเวกเตอร์นี้จะถูกใช้ภายในลูปภาพเคลื่อนไหวเพื่อย้าย "กล้อง"


ในระหว่างกระบวนการสร้างภาพเคลื่อนไหว ความเร็วในการเคลื่อนที่จะถูกคำนวณขึ้นอยู่กับระดับการซูมโดยใช้สูตรต่อไปนี้:


movementSpeed ​​​​= maxZoom / currentZoom * speedMultiplier

เมื่อปิดการซูม การใช้งานปุ่มต่างๆ จะเร็วขึ้นและเป็นธรรมชาติมากขึ้น


จากนั้นเวกเตอร์การเคลื่อนไหวจะถูกทำให้เป็นมาตรฐาน คูณด้วยความเร็วของการเคลื่อนไหว และนำไปใช้กับตำแหน่ง "กล้อง" ในปัจจุบัน การทำให้เป็นมาตรฐานถูกนำมาใช้เพื่อให้แน่ใจว่าความเร็วของการเคลื่อนที่ในแนวทแยงและมุมฉากจะเท่ากัน สุดท้าย เราได้ใช้ฟังก์ชันความเรียบกับการเปลี่ยนแปลงของเวกเตอร์การเคลื่อนที่ สิ่งนี้ทำให้การเปลี่ยนแปลงทิศทางและความเร็วราบรื่นขึ้น ดังนั้น "กล้อง" จึงเคลื่อนที่ได้มากขึ้น นุ่มนวลขึ้น.

รองรับแอพมือถือ

เมื่อฝัง Canvas ลงในแอปพลิเคชัน iOS และ Android เราประสบปัญหาบางประการ ขั้นแรก เราต้องตรวจสอบสิทธิ์ผู้ใช้เพื่อให้สามารถวางไทล์ได้ ต่างจากเวอร์ชันเว็บที่การรับรองความถูกต้องเป็นไปตามเซสชัน แอปพลิเคชันมือถือเราใช้ OAuth: ในกรณีนี้ แอปพลิเคชันจะต้องจัดเตรียมโทเค็นการเข้าถึงให้กับผู้ใช้ที่เข้าสู่ระบบด้วย WebView วิธีที่ปลอดภัยที่สุดในการดำเนินการนี้คือการฉีดส่วนหัวการอนุญาต OAuth ผ่านการเรียก JS จากแอปพลิเคชันไปยัง WebView ซึ่งจะช่วยให้เราปรับแต่งส่วนหัวอื่นๆ ได้หากจำเป็น จากนั้นคุณเพียงแค่ต้องแยกวิเคราะห์ส่วนหัวการอนุญาตในการเรียก API ทุกครั้ง:


r.place.injectHeaders(('การอนุญาต': 'ผู้ถือ' ’});

ในเวอร์ชัน iOS เราได้ใช้การสนับสนุนเพิ่มเติมสำหรับการแจ้งเตือนเมื่อไทล์ของผู้ใช้พร้อมที่จะวางบนผืนผ้าใบ เนื่องจากการวางตำแหน่งเสร็จสิ้นใน WebView เราจึงต้องใช้การเรียกกลับแอปพลิเคชันแบบเนทีฟ โชคดีที่ใน iOS 8 ขึ้นไป ทำได้ด้วยการเรียก JS แบบง่ายๆ:


webkit.messageHandlers.tilePlacedHandler.postMessage (this.cooldown / 1,000);

วิธีการมอบหมายในแอปพลิเคชันจะส่งการแจ้งเตือนตามตัวจับเวลาคูลดาวน์ที่ส่งไป


สิ่งที่เราเรียนรู้

มีบางอย่างที่คุณขาดหายไปเสมอ

เราวางแผนทุกอย่างไว้อย่างสมบูรณ์แบบ เรารู้ว่าจะเปิดตัวเมื่อใด ทุกอย่างต้องเป็นไปเหมือนเครื่องจักร เรามีการทดสอบโหลดส่วนหน้าและส่วนหลัง มนุษย์เราไม่สามารถทำผิดพลาดได้อีกต่อไป ขวา?


การเปิดตัวเป็นไปอย่างราบรื่นจริงๆ ตลอดช่วงเช้า เมื่อ r/Place ได้รับความนิยมมากขึ้น จำนวนการเชื่อมต่อก็เพิ่มขึ้น และการรับส่งข้อมูลไปยังอินสแตนซ์ websocket ก็เพิ่มขึ้น:




เราเห็นสิ่งนี้กำลังมา และเรากำลังเตรียมตัวสำหรับข้อเท็จจริงที่ว่าผลที่ตามมาคือเครือข่ายจะกลายเป็นคอขวดในระบบของเรา แต่ปรากฎว่าเรามีอุปทานจำนวนมาก อย่างไรก็ตาม เมื่อดูที่โหลดของ CPU เราเห็นภาพที่แตกต่างไปจากเดิมอย่างสิ้นเชิง:



เหล่านี้เป็นเครื่องแปดคอร์ ดังนั้นจึงเห็นได้ชัดว่าพวกเขามาถึงขีดจำกัดแล้ว เหตุใด “กล่อง” เหล่านี้จึงมีพฤติกรรมที่ไม่คาดคิดเช่นนี้ เราตัดสินใจว่าภาระงานที่เกิดจาก Place มีลักษณะที่แตกต่างไปจากเมื่อก่อนมาก นอกจากนี้ ยังมีการใช้ข้อความขนาดเล็กจำนวนมาก ในขณะที่เรามักจะส่งข้อความขนาดใหญ่ เช่น การอัปเดตกระทู้สดและการแจ้งเตือน โดยทั่วไปแล้ว เรายังไม่ค่อยมีผู้ใช้จำนวนมากที่ได้รับข้อความเดียวกัน สภาพการทำงานจึงแตกต่างไปจากปกติมาก


เราตัดสินใจว่าไม่มีอะไรเลวร้ายเกิดขึ้น: เราขยายขนาดและนั่นคือจุดสิ้นสุดของมัน พนักงานที่รับผิดชอบเพียงเพิ่มจำนวนครั้งเป็นสองเท่าและไปพบแพทย์โดยไม่ต้องตื่นเต้นแม้แต่น้อย


แล้วสิ่งนี้ก็เกิดขึ้น:



เมื่อมองแวบแรกไม่มีอะไรพิเศษ หากไม่ใช่เพราะนี่คืออินสแตนซ์ RabbitMQ ที่ใช้งานจริงของเรา ซึ่งไม่เพียงประมวลผลข้อความเว็บซ็อกเก็ตเท่านั้น แต่โดยทั่วไปทุกอย่างขึ้นอยู่กับการทำงานของ Reddit.com และมันก็ไม่ดี ไม่ดีเลย.


หลังจากการตรวจสอบ การแก้ไขด้วยมือ และการอัปเกรดอินสแตนซ์ เราได้จำกัดการค้นหาแหล่งที่มาของปัญหาให้แคบลงเหลือเพียงอินเทอร์เฟซการจัดการ ดูเหมือนว่ามันจะช้าอยู่เสมอ และเราตัดสินใจว่านักสะสม Rabbit Diamond ของเราร้องขอมันเป็นประจำ เราคิดว่าการสื่อสารเพิ่มเติมที่เกี่ยวข้องกับการเปิดตัวอินสแตนซ์ websocket ใหม่ รวมกับข้อความจำนวนมากที่ได้รับจากการแลกเปลี่ยนนี้ ทำให้ 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/new ก็น่าสนใจ:



บางทีนี่อาจเป็นส่วนหนึ่งของแรงจูงใจของผู้ใช้

บอทจะยังคงเป็นบอท

ในขั้นตอนสุดท้ายของโครงการ เราพบปัญหาอีกประการหนึ่ง เรามักประสบปัญหากับลูกค้าที่มีพฤติกรรมไม่ดีในแง่ของการพยายามทำซ้ำ เมื่อพบข้อผิดพลาด ลูกค้าจำนวนมากก็แค่ส่งคำขอซ้ำๆ และอีกครั้ง และอีกครั้ง นั่นคือเมื่อเกิดปัญหาขึ้นบนไซต์ก็จะนำไปสู่ คำขอซ้ำแล้วซ้ำอีกจากลูกค้าที่ไม่รู้ว่าความชราคืออะไร


เมื่อเราปิดการใช้งาน Place จุดสิ้นสุดที่บอทจำนวนมากเข้าถึงได้เริ่มส่งคืนข้อผิดพลาด "ไม่ใช่ 200" รหัสนี้ไม่ประสบความสำเร็จมากนัก โชคดีที่คำขอซ้ำๆ เหล่านี้ถูกบล็อกอย่างง่ายดายในระดับ Fastly

สร้างสรรค์บางสิ่งบางอย่างมากขึ้น

r/Place จะไม่ประสบความสำเร็จเท่าที่ควรหากไม่ประสานกัน การทำงานเป็นทีม- เราขอขอบคุณ u/gooeyblob, u/egonkasper, u/eggplanticarus, u/spladug, u/thephilthe, u/d3fect และคนอื่นๆ ที่ช่วยเราทำการทดลองวันเอพริลฟูลนี้ให้เป็นจริง

เพื่อเป็นเกียรติแก่วัน April Fools Reddit ได้เปิดเพจให้ผู้ใช้ได้แสดงออก แต่โปรเจ็กต์นี้สร้างขึ้นเป็นเรื่องตลก กลายเป็นกำแพงสำหรับกราฟฟิตี้โดยรวมจากผู้เข้าร่วมจากทั่วทุกมุมโลก แสดงให้เห็นว่าพวกเขาต้องการทิ้งร่องรอยอะไรไว้ในประวัติศาสตร์ .

เมื่อวันที่ 1 เมษายน Reddit ได้เปิดตัวโปรเจ็กต์ Place ซึ่งเป็นเพจที่มีพื้นที่ว่างเปล่าซึ่งผู้ใช้ฟอรัมแต่ละคนสามารถวาดภาพใดก็ได้ ศิลปินมีข้อจำกัด: พวกเขาสามารถวาดได้เพียงหนึ่งพิกเซลจาก 16 สีทุกๆ ห้านาที และขนาดผืนผ้าใบก็มีจำกัดเช่นกัน พิกเซลอื่นๆ สามารถวาดทับพิกเซลที่วาดได้ (จากนั้นผู้เขียนคนแรกสามารถวาดพิกเซลของตัวเองบนพิกเซลของคู่ต่อสู้ได้อีกครั้ง) ซึ่งเป็นเหตุผลว่าทำไมผู้เขียนภาพถึงขัดแย้งกัน ตามที่ระบุไว้ในคำอธิบายของผืนผ้าใบโครงการนี้ออกแบบมาเพื่อความคิดสร้างสรรค์ร่วมกัน - “ คุณแต่ละคนสามารถสร้างบางสิ่งที่เป็นส่วนตัวได้ คุณสามารถสร้างสิ่งที่ยิ่งใหญ่กว่านี้ร่วมกันได้"

ในขณะที่โปรเจ็กต์เริ่มต้น ทุกคนโจมตีผืนผ้าใบอย่างแท้จริง - ทุกพิกเซลบนผืนผ้าใบถูกเติมเต็ม ในตอนแรก ผู้ใช้เพียงเติมสีลงในพิกเซลฟรี แต่จากนั้นทีมก็เริ่มสร้างรูปแบบที่เริ่มวาดภาพที่ง่ายที่สุด ความคิดที่เป็นไปได้, ตามหาคนที่มีใจเดียวกัน - ธงชาติ- ยิ่งผู้ใช้ทำงานบนผืนผ้าใบมากเท่าใด แนวคิดที่น่าสนใจและซับซ้อนก็เข้ามาในใจพวกเขามากขึ้นเท่านั้น และ "The Place" ได้เติบโตขึ้นจากโปรเจ็กต์วันเอพริลฟูล มาสู่สถานที่ที่ผู้ใช้ทั่วโลกรวมตัวกันเป็นชุมชนจริงเพื่อแสดงบางสิ่งให้โลกเห็น และสนับสนุนการสร้างสรรค์ของพวกเขาจากกลุ่มผู้บุกรุกที่แค่อยากจะวาดรูปแบบของตัวเองจริงๆ การวาดภาพ.

สถานที่ในช่วงเวลาเปิดทำการแรก

"Place" ได้กลายเป็นบอร์ดสติกเกอร์ออนไลน์แล้ว แต่แต่ละอันก็ถูกสร้างขึ้นมาอย่างอุตสาหะ ตัวอย่างเช่น ในการวาดและป้องกันโลโก้ Linux ขนาด 48 x 68 พิกเซลจากผู้บุกรุก คน 3,264 คนจะต้องทำพร้อมกัน

ผู้ใช้รวมตัวกันเพื่อนำแนวคิดที่เล็กลงและเรียบง่ายขึ้นไปใช้ แต่ยังเป็นแนวคิดที่เป็นทีม เช่น หัวใจแถวนี้ที่มีธงของประเทศต่างๆ (และไม่เพียงเท่านั้น): ทุกคนมีความรับผิดชอบต่อหัวใจ "ของตนเอง" แต่ทุกคนรวมตัวกันรวมกันเป็นทีมโดยไม่สมัครใจ

และคนอื่นๆ ก็เขียนข้อความทั้งผืน เช่น แฟนคลับกลุ่มนี้” สตาร์วอร์ส” ผู้เขียนและสนับสนุนบทพูดคนเดียวที่มีชื่อเสียงของ Supreme Chancellor Palpatine เกี่ยวกับ Sith Darth Plagueis จากตอนที่สามของเทพนิยายอวกาศ

อย่างไรก็ตาม ผู้ใช้บางคนบ่นว่าผู้เข้าร่วมโครงการแทนที่ตัวเองด้วยบอทที่จะอัปเดตพิกเซลที่ผู้เขียนครอบครองโดยอัตโนมัติทุกๆ ห้านาที แม้ว่าเมื่อวาดแต่ละพิกเซล ผู้ใช้จำเป็นต้องทำซ้ำชุดของการกระทำ (เช่น การเลือกสีเฉพาะ) บางคนสามารถข้ามกลไกความปลอดภัยและสร้างบอทที่วาดภาพให้พวกเขาได้

อย่างไรก็ตาม ยังมีคนที่ยังคงสร้างกระทู้พิเศษ โดยพยายามสนับสนุนคนที่มีความคิดเหมือนกันซึ่งจะช่วยวาดและทิ้งไว้สำหรับคนรุ่นต่อๆ ไป เช่น... Rick Sanchez อาเจียนจากการ์ตูนเรื่อง Rick and Morty อย่างจริงจัง? คุณแน่ใจหรือว่าสิ่งเหล่านี้ไม่ใช่บอท?

หลังจากทำงานครบ 72 ชั่วโมง โครงการก็ปิดลง ฝ่ายบริหารทรัพยากรขอบคุณทุกคนที่มีส่วนร่วมและความจริงที่ว่าผู้คนรวมตัวกัน "เพื่อสร้างบางสิ่งที่มากกว่า"

Reddit มักจะกลายเป็นสถานที่สำหรับต่างๆ กิจกรรมทางสังคม- ตัวอย่างเช่น ผู้ใช้ทรัพยากรที่น่าเศร้าเมื่อเร็วๆ นี้ ตัดสินใจถามว่าการตื่นขึ้นมาทุกวันด้วยรอยยิ้มเป็นอย่างไร และก่อนหน้านั้นผู้อ่าน Reddit ได้แบ่งปันเรื่องราวเกี่ยวกับเด็กผู้หญิงกัน ไม่ใช่แค่คนนิรนามเท่านั้นที่ใช้แหล่งข้อมูลยอดนิยม: นักแสดงใช้เวลาหลายชั่วโมงในการตอบคำถามจากผู้ใช้เกี่ยวกับภาพยนตร์เรื่อง "Trainspotting"