วิศวกรรมซอฟต์แวร์

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

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

4
ค่าคงที่ใน C #
ทำไมคอมไพเลอร์เก็บค่าคงที่ในข้อมูลเมตาแอสเซมบลี? พวกเขาฝังตัวโดยตรงกับรหัสภาษาระดับกลางจากข้อมูลเมตาแอสเซมบลีหรือไม่
9 c#  clr  compilation 

5
วิธีจัดการงานการตรวจสอบสตริงที่โลคัลไลซ์แล้วโดยผู้ที่ไม่ใช่ผู้พัฒนา
ใน. NET Framework สตริงที่แปลเป็นภาษาท้องถิ่นจะอยู่ในไฟล์ XML (หรือหลายไฟล์) ไฟล์เหล่านั้นเป็นส่วนหนึ่งของโครงการและมุ่งมั่นที่จะควบคุมแหล่งที่มาเป็นไฟล์รหัสอื่น ๆ โดยทั่วไปแล้ว Visual Studio จะใช้เพื่อแสดงไฟล์เหล่านั้นเป็นตารางและแก้ไขสตริงที่แปลแล้ว ฉันทำงานเป็นทีมเล็ก ๆ กับผลิตภัณฑ์ซึ่งควรมีส่วนต่อประสานหลายภาษา ในฐานะนักพัฒนาฉันร่างสายอักขระที่มีการแปลทั้งสองภาษาเนื่องจากการแปลอาจไม่แม่นยำ บุคคลอื่นจากทีม (ไม่ใช่ผู้พัฒนา) จะตรวจสอบเนื้อหาในทั้งสองภาษาและแก้ไขหากจำเป็น ปัญหาในปัจจุบันคือผู้ที่ไม่ใช่นักพัฒนาจะไม่ใช้ตัวควบคุมแหล่งที่มาหรือ IDE เนื่องจากมันจะยุ่งยากและยากเกินไป (การควบคุมเวอร์ชันเป็นเรื่องยากสำหรับผู้ที่ไม่ใช่นักพัฒนา) สำหรับบุคคลนี้ ทางเลือกอื่นสำหรับฉันในการส่งออกสตริงที่แปลเป็นไฟล์ Excel รอให้บุคคลนี้ตรวจสอบ Excel จากนั้นนำเข้าสตริงที่แก้ไขใหม่อีกครั้ง ข้อแม้ที่นี่คือฉันอาจจะสร้างสายอื่นเปลี่ยนชื่อที่มีอยู่ ฯลฯ ทำให้ยากที่จะแตกต่างรุ่นท้องถิ่นกับคนที่ผ่านการตรวจสอบ จะทำอย่างไร? มันเกิดขึ้นได้อย่างไรในทีมอื่น ๆ ?

8
ที่ผ่านมาถ้างบอาร์เรย์ลูป ... ตอนนี้อะไร
ฉันเลิกเขียนโปรแกรมเมื่อประมาณหนึ่งปีที่แล้วตอนที่ฉันกดปุ่มกำแพงนี้ต่อไป ฉันกำลังทบทวนหัวข้อนี้เพราะฉันต้องการสร้างแอปพลิเคชัน Android ขั้นพื้นฐาน แต่ฉันรู้สึกว่าความรู้ที่ จำกัด ของฉันจะไม่เพียงพอ นี่คือปัญหาของฉัน ฉันได้อ่านหนังสือสองสามเล่มและดูวิดีโอการสอนบน C # / Java แล้วทำตามตัวอย่างจากนั้นก็อ่านหนังสือจนจบ ในท้ายที่สุดพวกเขาดูเหมือนจะทิ้งฉันไปตะลึงกับสิ่งที่ต้องทำต่อไป หมายความว่าอย่างไรพวกเขาสอนคุณจากแอปพลิเคชัน "สวัสดีโลก" พื้นฐานของคุณไปจนถึงถ้าและอาร์เรย์นั้นดูเหมือนว่าคุณคาดหวังว่าคุณจะรู้วิธีที่จะออกไปสู่โลกแห่งการเข้ารหัสและสร้างอะไร ฉันทำอะไรบางอย่างหายไปหรือเปล่า ฉันรู้ว่าสิ่งเหล่านี้เป็นองค์ประกอบสำคัญของโปรแกรมทั้งหมด แต่หนังสือที่ฉันอ่านไม่เคยแสดงให้ฉันเห็นว่าต้องทำอะไรต่อไป คำตอบง่ายๆที่ฉันคิดว่าน่าจะเป็น 'เริ่มการเข้ารหัส' แต่ที่ไหน ฉันอ่าน "Head First Java" เป็นตัวอย่าง พวกเขาบอกว่าคุณทำทุกอย่างที่เรียนรู้และสร้างเกมแข่งสุนัข "พยายามที่จะไม่โกงและดูซอร์สโค้ดที่ให้ไว้คุณควรจะทำสิ่งนี้ได้ในตอนนี้" _ นั่นไม่ใช่คำพูดที่แน่นอน แต่โดยทั่วไปนั่นคือสิ่งที่ฉันบอก ....... ครึ่งชั่วโมงที่ผ่านมาพวกเขาแค่อธิบายถึงวิธีการทำอาร์เรย์แล้วถ้าไม่มีทฤษฎีใดที่ฉันตั้งใจจะสร้างเกมที่ใช้งานได้ เหตุผลที่ฉันถามสิ่งนี้เพราะฉันกลัวว่านี่คือทั้งหมดที่ฉันควรรู้อย่างน้อยก็เริ่มเขียนโค้ด แต่มันรู้สึกเหมือนฉันได้รับกล่องเครื่องมือขนาดเล็กและถูกสั่งให้สร้างตึกระฟ้า ขอบคุณสำหรับคำแนะนำใด ๆ

2
เครื่องมือหรือเทคนิคใดที่มีประโยชน์สำหรับการอธิบายรหัสฐานที่ไม่คุ้นเคย [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา เมื่อตรวจสอบรหัสที่ไม่คุ้นเคยด้วยตนเอง (เพื่อตรวจสอบหรือแก้ไข) ฉันดูเหมือนมีสามตัวเลือก การอ่านโค้ดจากบนลงล่างโดยเลือกไฟล์ต้นฉบับแต่ละไฟล์โดยดูว่าชื่อไฟล์พื้นฐานเป็นอย่างไร ฉันมักจะจบการอ่านเกือบทุกอย่าง บางไฟล์สองครั้ง อ่านกว้างแรกที่ฉันค้นหาและอ่านทุกวิธีที่กล่าวอ้างด้วยความเข้าใจน้อยที่สุด จากนั้นอ่านฟังก์ชั่นทั้งหมดที่ฟังก์ชั่นที่เรียกว่าและอื่น ๆ จิตสแต็คของฉันมีแนวโน้มที่จะล้นถ้าฉันทำให้มันสายไม่กี่ลึก การอ่านเชิงลึกครั้งแรกที่ฉันผ่านรหัสทั้งหมดในดีบักเกอร์ไม่แน่ใจว่าจะใช้เวลา 8 นาทีหรือ 8 ชั่วโมง เมื่อฉันได้อ่านพอของรหัสที่จะมีความเข้าใจที่มั่นคงเป็นธรรมของสิ่งที่มันทำฉันมักจะสะท้อนให้เห็นว่าผมเคยอ่าน 80% หรือมากกว่าของ codebase ในขณะที่รหัสพื้นฐานคือ 20% หรือน้อยกว่า ฉันเสียเวลาไปมาก เครื่องมือใดที่มีประโยชน์สำหรับการเข้าใจโค้ดที่ผิดปกติอย่างรวดเร็ว มีเครื่องมือใดบ้างที่สามารถให้ "ภาพรวม" ของเส้นทางโค้ดที่สำคัญและอนุญาตให้ฉันเจาะลึกรายละเอียดของส่วนใดส่วนหนึ่งได้หรือไม่

3
วิธีการอ้างถึงพื้นที่เฉพาะของรหัสในเอกสารประกอบ?
ฉันกำลังจะออกจากโครงการและก่อนที่เจ้านายของฉันจะขอให้ฉันทำเอกสารรหัส (ฉันยังไม่ได้บันทึกไว้เป็นอย่างดี) มันไม่ใช่เรื่องใหญ่โครงการไม่ซับซ้อนอย่างมาก แต่ฉันกำลังค้นหาสถานที่ในเอกสารของฉันที่ฉันอยากจะพูดว่า "แจ้งให้ทราบทางสาย XYZ ที่สิ่งนั้นเกิดขึ้นเช่นนั้น" ในกรณีนี้มันไม่เหมาะสมที่จะอ้างถึงหมายเลขบรรทัดที่ระบุเนื่องจากการเพิ่มหรือลบรหัสบรรทัดเดียวจะทำให้เอกสารในเอกสารล้าสมัยทันที มีวิธีปฏิบัติที่ดีที่สุดในการอ้างอิงบรรทัดรหัสเฉพาะโดยไม่อ้างอิงหมายเลขบรรทัดหรือไม่? ฉันได้พิจารณาทิ้งรหัสด้วยความคิดเห็นที่ชอบ: /* linetag 38FECD4F */ โดยที่ "38FECD4F" เป็นแท็กที่ไม่ซ้ำกันสำหรับบรรทัดนั้น จากนั้นฉันสามารถใส่เอกสาร "ในบรรทัดที่ติดแท็ก '38FECD4F' โปรดสังเกตว่าเกิดขึ้นเช่นนั้น" ความคิดอื่น ๆ ? ฉันรู้สึกเหมือนเป็นการดีกว่าที่จะจัดทำเอกสารรหัสหน่วยโดยรวมมากกว่าเฉพาะบางส่วนของพวกเขา แต่ในกรณีของโครงการนี้โดยเฉพาะมีการใช้รหัสขั้นตอนยาวซึ่งไม่เคยได้รับการปรับสภาพเป็นหน่วยเล็ก ๆ

4
การจัดการหน่วยความจำสำหรับการส่งข้อความอย่างรวดเร็วระหว่างเธรดใน C ++
สมมติว่ามีสองเธรดซึ่งสื่อสารโดยการส่งข้อความข้อมูลแบบอะซิงโครนัสซึ่งกันและกัน แต่ละเธรดมีคิวข้อความบางประเภท คำถามของฉันอยู่ในระดับต่ำมาก: สิ่งที่คาดว่าจะเป็นวิธีที่มีประสิทธิภาพที่สุดในการจัดการหน่วยความจำ? ฉันสามารถคิดถึงวิธีแก้ปัญหาต่าง ๆ : newผู้ส่งสร้างวัตถุผ่าน deleteโทรผู้รับ Memory pooling (เพื่อโอนหน่วยความจำกลับไปยังผู้ส่ง) การรวบรวมขยะ (เช่น Boehm GC) (ถ้าวัตถุมีขนาดเล็กพอ) คัดลอกตามค่าเพื่อหลีกเลี่ยงการจัดสรรฮีปอย่างสมบูรณ์ 1) เป็นคำตอบที่ชัดเจนที่สุดดังนั้นฉันจะใช้มันสำหรับต้นแบบ มีโอกาสที่มันจะดีอยู่แล้ว แต่เป็นอิสระจากปัญหาเฉพาะของฉันฉันสงสัยว่าเทคนิคใดมีแนวโน้มมากที่สุดหากคุณกำลังปรับประสิทธิภาพการทำงานให้ดีที่สุด ฉันคาดหวังว่าการรวมกันจะดีที่สุดในทางทฤษฎีโดยเฉพาะอย่างยิ่งเพราะคุณสามารถใช้ความรู้เพิ่มเติมเกี่ยวกับการไหลของข้อมูลระหว่างเธรด อย่างไรก็ตามฉันกลัวว่ามันเป็นการยากที่จะทำถูกที่สุด การปรับแต่งมากมาย ... :-( การรวบรวมขยะควรเพิ่มได้อย่างง่ายดายหลังจากนั้น (หลังจากโซลูชันที่ 1) และฉันคาดว่ามันจะทำงานได้ดีมาก ดังนั้นฉันคิดว่ามันเป็นวิธีแก้ปัญหาที่ใช้งานได้จริงหาก 1) กลายเป็นว่าไม่มีประสิทธิภาพเกินไป หากวัตถุมีขนาดเล็กและเรียบง่ายการคัดลอกตามค่าอาจเร็วที่สุด อย่างไรก็ตามฉันกลัวว่ามันจะบังคับให้มีข้อ จำกัด ที่ไม่จำเป็นในการใช้งานข้อความที่รองรับดังนั้นฉันจึงต้องการหลีกเลี่ยง

1
กำลังมองหาวิธีที่ดีกว่าในการรวมการปรับโครงสร้างเชิงลึกเข้ากับการพัฒนาตามคุณลักษณะ
คำชี้แจงปัญหา: ได้รับ: TFS เป็นการควบคุมแหล่งที่มา แอปพลิเคชันไคลเอนต์บนเดสก์ท็อปจำนวนมากที่มีรหัสดั้งเดิมที่มีการออกแบบสถาปัตยกรรมไม่ดีหรือขาดหายไป ลูกค้าต้องการคุณสมบัติใหม่ ๆ อย่างต่อเนื่องพร้อมคุณภาพเสียง การจัดส่งที่รวดเร็วและการบ่นกับ UI ที่ไม่เป็นมิตรของผู้ใช้ ปัญหา: แอปพลิเคชันต้องมีการปรับโครงสร้างอย่างล้ำลึก กระบวนการนี้ย่อมทำให้แอพพลิเคชั่นไม่เสถียรและจำเป็นต้องมีขั้นตอนการทำให้เสถียรโดยเฉพาะ เราได้ลอง: การสร้างใหม่ในต้นแบบที่มีการผสานเป็นระยะจากต้นแบบ (MB) ถึงคุณลักษณะสาขา (FB) (ความผิดพลาดของฉัน) ผลลัพธ์:มีสาขาไม่แน่นอนจำนวนมาก สิ่งที่เราได้รับคำแนะนำ: ลิงก์ไปยังบทความ (pdf) สร้างสาขาเพิ่มเติมสำหรับการเปลี่ยนโครงสร้าง (RB) เป็นระยะให้ตรงกันกับ MB ผ่านการผสานจาก MB ไปยัง RB หลังจาก RB มีความเสถียรเราจะเปลี่ยนต้นแบบเป็น RB และสร้างสาขาใหม่สำหรับการปรับโครงสร้างเพิ่มเติม นี่คือแผน แต่ที่นี่ฉันคาดหวังว่านรกที่แท้จริงของการรวม MB กับ RB หลังจากรวม FB เข้ากับ MB ข้อได้เปรียบหลัก: ผู้เชี่ยวชาญที่มีเสถียรภาพส่วนใหญ่เวลา มีทางเลือกใดที่ดีกว่าในการใช้ผลิตภัณฑ์นี้?

3
การนำเสนอเลเยอร์แอปพลิเคชัน VS ใน DDD
ฉันมีปัญหาในการวาดเส้นที่ชัดเจนระหว่าง Presentation และ Application layer ใน Domain Driven Design ไฟล์คอนโทรลเลอร์, มุมมอง, เลย์เอาต์, Javascript และ CSS ควรไปที่ใด มันอยู่ใน Application หรือเลเยอร์การนำเสนอหรือไม่? และถ้าพวกมันรวมกันในเลเยอร์เดียวกันสิ่งที่มีอีกอันหนึ่ง? มันว่างเปล่า

2
การแยกภาษาเพื่อค้นหาคำสำคัญ
ฉันกำลังมองหาข้อมูลและทฤษฎีเกี่ยวกับวิธีการเข้าถึงหัวข้อคำศัพท์ สมมติว่าฉันมีชุดของสตริงซึ่งอาจเป็นเพียงประโยคเดียวหรือหลายประโยค ฉันต้องการแยกสตริงเหล่านี้และตัดคำที่สำคัญที่สุดออกมาด้วยคะแนนที่แสดงว่าคำนั้นมีความสำคัญอย่างไร ลองดูตัวอย่างเล็ก ๆ น้อย ๆ ของสิ่งที่ฉันหมายถึง ตัวอย่าง # 1: "ฉันต้องการ Keurig จริงๆ แต่ฉันไม่สามารถซื้อได้!" นี่เป็นตัวอย่างพื้นฐานมากเพียงหนึ่งประโยค ในฐานะมนุษย์ฉันเห็นได้อย่างง่ายดายว่า "Keurig" เป็นคำที่สำคัญที่สุดที่นี่ นอกจากนี้ "จ่าย" ก็มีความสำคัญเช่นกันแม้ว่าจะไม่ชัดเจนว่าเป็นจุดเริ่มต้นของประโยค คำว่า "ฉัน" ปรากฏขึ้นสองครั้ง แต่มันก็ไม่สำคัญเลยเพราะมันไม่ได้บอกข้อมูลใด ๆ แก่เรา ฉันอาจคาดหวังว่าจะได้เห็นคำพูด / คะแนนแบบนี้: "Keurig" => 0.9 "afford" => 0.4 "want" => 0.2 "really" => 0.1 etc... ตัวอย่างที่ 2: "แค่หนึ่งในวิธีการว่ายน้ำที่ดีที่สุดในชีวิตของฉันฉันหวังว่าฉันจะสามารถรักษาเวลาของฉันให้แข่งขันได้ถ้าฉันจำได้ว่าต้องใช้นาฬิกาที่ไม่กันน้ำ" ตัวอย่างนี้มีหลายประโยคดังนั้นจะมีคำที่สำคัญมากกว่านี้ตลอด โดยไม่ต้องทำซ้ำแบบฝึกหัดจากตัวอย่างที่ 1 …

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

5
สิ่งที่เป็นรูปธรรมคือข้อดีของการทดสอบหน่วยที่เหมาะสมผ่านการทดสอบการใช้งานที่เรียกว่าการทดสอบหน่วย
โครงการที่ฉันกำลังทำอยู่นั้นมีการทดสอบแบบดั้งเดิมที่ไม่ได้ล้อเลียนอย่างถูกต้อง ด้วยเหตุนี้การพึ่งพาเพียงอย่างเดียวก็คือ EasyMock ซึ่งไม่สนับสนุนสถิตศาสตร์การก่อสร้างที่มีข้อโต้แย้ง ฯลฯ การทดสอบแทนอาศัยการเชื่อมต่อฐานข้อมูลและเช่น "รัน" การทดสอบ การเพิ่ม powermock เพื่อจัดการกับกรณีเหล่านี้กำลังถูกลดราคาลงเนื่องจากต้องมีการอัพเกรดโครงการที่มีอยู่เพื่อรองรับ (การอภิปรายอื่น) คำถามของฉันคืออะไรประโยชน์ที่จับต้องได้ในโลกแห่งความจริงของการทดสอบหน่วยที่ฉันสามารถใช้เพื่อผลักดันกลับได้ ยังมี .... บ้าง? ฉันแค่เป็นคนขี้เหนียวโดยพูดว่าการทดสอบหน่วยที่ไม่ดี (แม้ว่าพวกเขาจะทำงาน) นั้นแย่ใช่ไหม การครอบคลุมโค้ดมีประสิทธิภาพเพียงใด

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

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

1
Jenkins Paramerized Trigger + Copy Artifact
ฉันกำลังทำงานเพื่อจัดตั้งเจนกินส์เพื่อจัดการงานสร้างของเรา บิลด์ประกอบประกอบด้วยตัวติดตั้ง Windows ที่มีไบนารีบางตัวที่ต้องสร้างบน Linux นี่คือสิ่งที่ฉันมี: ส่วน Windows และ Linux ถูกตั้งค่าเป็นโครงการแยกเจนกินส์ โครงการ Windows ได้รับการกำหนดพารามิเตอร์โดยใช้แท็ก Subversion เพื่อสร้างและปล่อย ในฐานะส่วนหนึ่งของการสร้างโครงการ Windows จะเรียกใช้บิลด์ของ Subversion แท็กเดียวกันสำหรับโครงการ Linux (โดยใช้ปลั๊กอินParameterized Trigger ) จากนั้นคัดลอกส่วนจากโครงการ Linux (ใช้ปลั๊กอินCopy Artifact ) ไปยังพื้นที่ทำงานของโครงการ Windows เพื่อให้ สามารถรวมไว้ในตัวติดตั้ง Windows ได้ จุดที่ฉันติดอยู่: ตอนนี้ Copy Artifact ได้รับการตั้งค่าเพื่อคัดลอกงานสร้างที่สำเร็จครั้งล่าสุด ดูเหมือนว่าจะมีประสิทธิภาพมากกว่าในการกำหนดค่า Copy Artifact เพื่อคัดลอกจากบิลด์ที่แน่นอนที่ทริกเกอร์ Parameterized ทริกเกอร์ แต่ฉันมีปัญหาในการหาวิธีการทำงาน มีตัวเลือกสำหรับพารามิเตอร์ "build …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.