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

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

9
โปรแกรมเมอร์ใหม่ควรเน้นที่เทคโนโลยีเดียวจนกว่าเขาจะเชี่ยวชาญหรือไม่ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ตกลงฉันได้สอนเพื่อน ๆ เกี่ยวกับวิธีการโปรแกรมในขณะนี้ เขาเป็นผู้เรียนที่เร็วมากและเขาเก่งในการเขียนโปรแกรมจนถึงตอนนี้ อย่างไรก็ตามเขามี "ปัญหา" หนึ่งฉันพยายามที่จะแก้ไข เขากระโดดเข้ามาและเริ่มทำการเขียนโปรแกรมระดับสูงโดยไม่ต้องเรียนรู้พื้นฐานบางอย่าง (เขาสร้างเว็บแอปพลิเคชั่นแบบเต็มรูปแบบ นี่ไม่ใช่ปัญหา เขายังคงกระโดดไปยังเทคโนโลยีใหม่ ๆ (Node.js, MongoDB, EC2 และอื่น ๆ ) ฉันพยายามบอกเขาว่าเขาควรเรียนรู้พื้นฐานบางอย่างเกี่ยวกับ RDMS ทางเลือกของเขา (MySQL) ในขณะที่เขาใช้มันทุกวันก่อนที่จะลงทุนเวลาในการเรียนรู้พื้นฐานของ MongoDB (และอาจย้ายไปหาสิ่งใหม่) ฉันเป็นคนผิดที่นี่หรือเขาควรจะพยายามจดจ่อกับสิ่งหนึ่งครั้งและทำสิ่งที่ดีจริงๆ

3
มีความคิดเห็นรหัสในโครงการ opensource หรือไม่ ถ้าเป็นเช่นนั้นเครื่องมืออะไรที่ใช้ในการทำเช่นนี้?
ฉันรู้ว่ามีแรงผลักดันอย่างมากสำหรับการรีวิวโค้ดในการพัฒนาเชิงพาณิชย์ อย่างไรก็ตามมีการตรวจสอบรหัสที่ใช้ในซอฟต์แวร์โอเพนซอร์ซ ถ้าเป็นเช่นนั้นแล้วพวกเขาจะปฏิบัติอย่างไร [มันเป็นการกระทำที่ล่าช้าหรือ "สภาพแวดล้อมที่กำหนดไว้ล่วงหน้า" มีเครื่องมือที่อนุญาตให้แพตช์ถูกส่งไปยังอุปกรณ์อื่น] หรือไม่? มีโครงการใดบ้างที่ใช้บทวิจารณ์โค้ด? จากความเข้าใจของฉันเคอร์เนลลินุกซ์ส่วนใหญ่ขึ้นอยู่กับความไว้วางใจของผู้เดินทาง MySQL ขึ้นอยู่กับการอนุมัติของผู้เขียนหลักและผลกระทบต่อประสิทธิภาพ

1
วิธีการสร้างเลเยอร์บริการที่ดีใน ASP.NET?
ฉันได้ดูคำถามเทคโนโลยีการสร้างเลเยอร์บริการที่ดี แต่ฉันมีคำถามบางอย่างเกี่ยวกับเรื่องนี้ที่ฉันต้องการความช่วยเหลือ ก่อนอื่นข้อมูลเกี่ยวกับสิ่งที่ฉันมีสำหรับความต้องการ ขณะนี้เรามีแอปพลิเคชั่นเว็บจำนวนมากที่พูดคุยกันในแบบแมงมุมใยแมงมุม (ทั้งหมดพูดคุยกันในลักษณะสับสนผ่านเว็บเซอร์และฐานข้อมูล) เราต้องการเปลี่ยนแปลงสิ่งนี้เพื่อให้แอปพลิเคชันทั้งหมดผ่านเลเยอร์บริการที่เราสามารถทำงานได้มากขึ้นด้วยแคชและแค็ปซูลฟังก์ชั่นทั่วไปและอีกมากมาย เราต้องการให้เลเยอร์นี้มี Web API เพื่อให้ลูกค้าบุคคลที่สามสามารถใช้ข้อมูลจากบริการได้ ปัญหาที่ฉันเห็นคือถ้าเราสร้างเลเยอร์บริการด้วยพูด MVC4 Web API เราไม่จำเป็นต้องสื่อสารระหว่างแอปพลิเคชันที่ใช้ webAPI ซึ่งหมายความว่าเราต้องสร้าง URL และใช้ JSON / Xml ที่ไม่ได้เสียงที่มีประสิทธิภาพเกินไป ฉันคิดว่าวิธีที่ดีกว่านี้คือการทำงานกับเอนทิตีและ WCF เพื่อสื่อสารระหว่างแอปพลิเคชัน แต่ถ้าอย่างนั้นเราอาจจะสูญเสียเวทย์มนตร์ Web API? ดังนั้นคำถามคือหากมีวิธีการใช้เลเยอร์บริการทั้ง Web API (JSON / XML) และเป็นเลเยอร์บริการแบ็คเอนด์ที่มีเอนทิตี้มากกว่า หากเราถูกบังคับให้ใช้ 2 ชั้นบริการที่แตกต่างกันเราอาจต้องทำซ้ำฟังก์ชั่นบางอย่างและสิ่งเลวร้ายอื่น ๆ หวังว่าคำถามจะชัดเจนเพียงพอและโปรดถามหากคุณต้องการข้อมูลเพิ่มเติม

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

3
บูรณาการอย่างต่อเนื่อง (กับโครงการ iOS และ Android) [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน4 ปีที่แล้ว ฉันกำลังพยายามเปลี่ยนแปลงในเชิงบวกใน บริษัท ของฉันและหนึ่งในการเปลี่ยนแปลงคือการนำการบูรณาการอย่างต่อเนื่อง เราพัฒนามือถือ (iOS / Android) ดังนั้นฉันต้องการ CI ที่รองรับโครงการทั้งสองประเภท อย่างที่คุณสามารถบอกได้ว่าฉันไม่ค่อยรู้เรื่อง CI มากนัก แต่ฉันก็ลองไปนิดหน่อยแล้วฉันก็คิดว่าเจนกินส์และฮัดสันเป็นที่นิยมที่สุดสองคน ฉันมีคำถามสองส่วน คุณคิดกับเจนกินส์ไหม? มีวิธีใดบ้างที่ CI จะตรวจสอบว่าโปรเจ็กต์กำลังรวบรวม มาตรฐานการเข้ารหัส (เช่นข้อต่อหลวมเป็นต้น) หรือไม่?

1
วัตถุประสงค์ของโฟลเดอร์ csx ในโครงการ Azure [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดเมื่อปีที่แล้ว ฉันค่อนข้างใหม่กับ Azure แต่ฉันสังเกตเห็นว่า Visual Studio สร้างโฟลเดอร์ต่อไปนี้โดยอัตโนมัติ ... /<nameOfAzureProject>/bin /<nameOfAzureProject>/obj /<nameOfAzureProject>/csx <== ... ตอนนี้โฟลเดอร์ bin และ obj นั้นค่อนข้างมาตรฐาน แต่ฉันไม่ชัดเจนเกี่ยวกับวัตถุประสงค์ของโฟลเดอร์csx ความคิดใด ๆ

1
วิธีการสร้าง Python“ god class” ใหม่ได้อย่างไร
ปัญหา ฉันกำลังทำงานในโครงการงูหลามซึ่งชั้นเรียนหลักเป็น“ พระเจ้าวัตถุ ” เล็กน้อย นอกจากนี้เพื่อให้ friggin' หลายลักษณะและวิธีการ! ฉันต้องการปรับโครงสร้างห้องเรียนอีกครั้ง จนถึงตอนนี้ ... สำหรับขั้นตอนแรกฉันต้องการทำสิ่งที่ค่อนข้างง่าย แต่เมื่อฉันลองใช้วิธีที่ตรงไปตรงมาที่สุดมันก็ทำลายการทดสอบและตัวอย่างที่มีอยู่ โดยทั่วไปชั้นเรียนมีรายการคุณลักษณะที่ยาวมาก - แต่ฉันสามารถมองข้ามพวกเขาอย่างชัดเจนและคิดว่า“ คุณลักษณะทั้ง 5 นี้เกี่ยวข้องกัน… 8 สิ่งเหล่านี้สัมพันธ์กัน…แล้วก็มีส่วนที่เหลือ” getattr โดยทั่วไปฉันแค่ต้องการจัดกลุ่มคุณลักษณะที่เกี่ยวข้องลงในคลาสผู้ช่วยแบบ dict ฉันมีความรู้สึก__getattr__จะเหมาะสำหรับงาน ดังนั้นฉันจึงย้ายคุณสมบัติไปยังชั้นเรียนอื่นและแน่นอน__getattr__ใช้เวทย์มนตร์ของมันได้อย่างสมบูรณ์แบบดี ... ในตอนแรก แต่จากนั้นฉันลองใช้หนึ่งในตัวอย่าง คลาสย่อยตัวอย่างพยายามตั้งค่าหนึ่งในแอ็ตทริบิวต์เหล่านี้โดยตรง (ที่ระดับคลาส ) แต่เนื่องจากแอตทริบิวต์ไม่ได้“ อยู่ในสภาพร่างกาย” อีกต่อไปในชั้นผู้ปกครองฉันได้รับข้อผิดพลาดที่บอกว่าไม่มีแอตทริบิวต์ @property ฉันอ่านเกี่ยวกับ@propertyมัณฑนากร แต่ฉันก็อ่านด้วยว่ามันสร้างปัญหาให้กับคลาสย่อยที่ต้องการทำself.x = blahเมื่อxเป็นคุณสมบัติของคลาสพาเรนต์ ที่ต้องการอยากมี ให้รหัสลูกค้าทั้งหมดยังคงใช้งานได้ต่อไปself.whateverแม้ว่าwhateverคุณสมบัติของผู้ปกครองจะไม่“ อยู่ตามร่างกาย” ในคลาส (หรืออินสแตนซ์) เอง จัดกลุ่มแอตทริบิวต์ที่เกี่ยวข้องลงในคอนเทนเนอร์เหมือน dict ลดเสียงดังสุด ๆ …

2
วิธีแนะนำคอมพิวเตอร์ที่ไม่รู้หนังสืออายุ 50 ปีในการเขียนโปรแกรม [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน8 ปีที่ผ่านมา เมื่อวันก่อนพ่อของฉันถามคำถามที่ฉันจะไม่คาดหวังจากเขา "ฉันจะเรียนรู้ C ++ ได้อย่างไร" พ่อของฉันอายุ 56 ปีและคอมพิวเตอร์เป็นแนวคิดที่ห่างไกลสำหรับเขา เขาไม่รู้ว่าจะใช้โทรศัพท์ยังไงดีนอกเหนือจากการโทรออกหมายเลข (ไม่มีโทรด่วน) แม้ว่าเขาจะเริ่มเรียนรู้คอมพิวเตอร์ดีขึ้นนิดหน่อย - จนถึงจุดที่เขารู้วิธีเปิดอินเทอร์เน็ต (ใน Windows) และเรียกดูไปรอบ ๆ (และสำเร็จแอปพลิเคชั่นงานหลายอย่างในออนไลน์ของเขาเองซึ่งเขาก็ได้รับตำแหน่งด้วย ) แต่ถึงกระนั้นเหล่านี้เป็นประสบการณ์ที่แคบเกินไปที่จะหมายถึงมากจริงๆ ในขณะที่เขาอาจไม่มีพื้นหลังพ่อของฉันรู้วิธีการอ่าน และฉันหมายถึงการอ่านเป็นทักษะไม่ใช่แค่ความสามารถ เขามีการศึกษาน้อยถึงไม่มีวิทยาลัย (ปัญหาทางการเงินครอบครัว ฯลฯ ) และโชคดีพอที่จะสำเร็จการศึกษาระดับมัธยม แต่ก็ยังสอนตัวเองให้เป็นช่างไฟฟ้ เขาทำเช่นเดียวกันกับกีตาร์เรียนรู้ที่จะเล่นในระดับมืออาชีพและได้รับการยกย่องในความสามารถของเขา ในโรงเรียนมัธยมเขาหยิบหนังสือยกน้ำหนักขึ้นมาและเป็นคนเดียวในโรงเรียนมัธยมของเขาในเวลานั้นที่จะมีคุณสมบัติเป็นทางการในฐานะ "นักกีฬา" ตามมาตรฐานแห่งชาติ ในทุกกรณีเขาแค่ต้องการอ่าน สิ่งที่จะสอนเขา เขาดูดซับข้อมูลเหมือนฟองน้ำ ฉันไม่สงสัยเลยในแรงจูงใจของพ่อหรือความสามารถในการทำสิ่งนี้ดังนั้นเป้าหมายทั่วไปของฉันก็คือ: พาพ่อของฉันเข้าสู่โลกของคอมพิวเตอร์และพาเขาไปที่การเขียนโปรแกรม ฉันเชื่อมั่นอย่างยิ่งว่าเมื่อฉันได้รับเขาผ่านพื้นฐานความสามารถในการขับเคลื่อนและการอ่านของเขาจะทำให้เขาไปด้วยตัวเอง ดังนั้นฉันขอให้คุณทั้งหมด: …
10 c++ 

3
แอปพลิเคชันที่ฉันเขียนมีสถานะเป็นมัลแวร์ จะแก้ไขได้อย่างไร?
ผมมีโปรแกรมที่ผมเขียนในDelphi สามารถดาวน์โหลดโปรแกรมได้ แต่โปรแกรมป้องกันไวรัสบางตัวเช่น Norton ตรวจพบว่าเป็นมัลแวร์ในขณะที่โปรแกรมป้องกันไวรัสอื่น ๆ เช่นAVGนั้นไม่มีปัญหา นอกจากนี้ Google Chrome ยังมีการเตือนมัลแวร์เมื่อคุณต้องการดาวน์โหลดโปรแกรมจากเว็บไซต์ของฉัน มีวิธีป้องกันไม่ให้นอกเหนือจากการวางไฟล์ EXE ในไฟล์ZIPหรือไม่?

1
สถิติเวอร์ชั่น / อุปกรณ์ iOS ปัจจุบัน?
คำตอบของคำถามนี้เป็นความพยายามของชุมชน แก้ไขคำตอบที่มีอยู่เพื่อปรับปรุงโพสต์นี้ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ คำตอบของคำถาม SO นี้ได้กลายเป็นสิ่งเก่าแล้ว: เวอร์ชั่น iOS / สถิติอุปกรณ์ - ฉันจะหาได้ที่ไหน เนื่องจากสกุลเงินเวลาไม่ได้เป็นส่วนหนึ่งของคำถามนั้นและการอัปเดตเวอร์ชัน iOS ได้เปิดตัวแล้วตั้งแต่มีการถามคำถามนี้ มีเว็บไซต์หรือแหล่งข้อมูลสาธารณะอื่น ๆ ที่เก็บรายชื่อเปอร์เซ็นต์ของอุปกรณ์ iOS และเวอร์ชั่น OS ที่ใช้อยู่ในปัจจุบันหรือที่ได้รับการปรับปรุงบ่อยครั้งหรือไม่โดยการตรวจสอบอย่างต่อเนื่องของแอพวิเคราะห์หรือบันทึกเว็บไซต์หรือวิธีอื่น ๆ ? และข้อมูลอุปกรณ์หรือระบบปฏิบัติการใดบ้างที่เป็นแอพการวิเคราะห์ iOS ที่ได้รับอนุญาตให้รายงานในปัจจุบันถ้ามี (... สมมติว่ามีนโยบายความเป็นส่วนตัวที่เหมาะสมและยึดมั่นในหลักสูตรดังกล่าว)
10 iphone  ios  appstore 

2
'กฎของ Demeter' ใช้กับลายเซ็นวิธีสาธารณะ / API หรือไม่
เนื่องจากการเปลี่ยนแปลงของ API / วิธีการลงนามสาธารณะควรมีเพียงเล็กน้อยเพื่อป้องกันการแตกรหัสลูกค้าที่ใช้วิธีการเหล่านี้ฉันสงสัยว่ากฎหมายของ Demeterนั้นมีผลบังคับใช้น้อยกว่านี้หรือไม่ ตัวอย่างง่ายๆ: class Account() { double balance; public void debit(Transaction t) { balance -= t.getAmount(); } } โปรดสังเกตว่าวิธีการเดบิตผ่านวัตถุการทำธุรกรรมมากกว่าเพียงแค่จำนวนสองเท่า ('กฎหมายของ Demeter' ตามที่ฉันเข้าใจว่าจะบอกให้ส่งผ่านข้อมูลที่ต้องการในกรณีนี้เพียงแค่จำนวนเงินไม่ใช่วัตถุธุรกรรม ... ) เหตุผลเบื้องหลังนี้เป็นเพราะวิธีการในอนาคตอาจต้องการคุณสมบัติการทำธุรกรรมอื่นนอกเหนือจากจำนวนเงิน จากสิ่งที่ฉันเข้าใจสิ่งนี้จะป้องกันไม่ให้ลายเซ็นวิธีการแตกหักโดยการเพิ่มพารามิเตอร์ใหม่ในอนาคต สิ่งนี้ทำให้เป็นตัวเลือกที่สมเหตุสมผลหรือไม่? หรือฉันกำลังพลาดอะไรอยู่?

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

4
เธรด Multi JavaScript
ทุกวันนี้ JavaScript เป็นผู้เล่นหลักในเทคโนโลยีการพัฒนาเว็บทั้งหมดในฝั่งไคลเอ็นต์เพื่อทำให้ส่วนต่อประสานผู้ใช้ดีขึ้นตรรกะฝั่งไคลเอ็นต์บนบางเว็บเซิร์ฟเวอร์เป็นฝั่งเซิร์ฟเวอร์ เพิ่มความจริงของคน (อย่างน้อยบางคน) เริ่มเคลื่อนไหวในการพัฒนาเกมบนเว็บตั้งแต่แฟลชจาวาสคริปต์และ HTML5 ถึงเวลาแล้วหรือยังที่จะรองรับมัลติเธรด! มีเบราว์เซอร์ที่อนุญาตให้ JavaScript เป็นแบบมัลติเธรดหรือมีมาตรฐาน HTML5 หรือเวอร์ชั่นในอนาคตหรือไม่!

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

2
การแคชแบบใช้คีย์ทำงานอย่างไร
ฉันเพิ่งอ่านบทความในบล็อก 37Signalsและฉันก็สงสัยว่าพวกเขาได้รับรหัสแคชอย่างไร ทุกอย่างดีและดีมีคีย์แคชที่มีการประทับเวลาของวัตถุ (ซึ่งหมายความว่าเมื่อคุณอัปเดตวัตถุแคชจะไม่ถูกต้อง) แต่คุณจะใช้แคชคีย์ในเทมเพลตได้อย่างไรโดยไม่ทำให้ DB มีผลกระทบต่อวัตถุที่คุณพยายามดึงข้อมูลจากแคช โดยเฉพาะสิ่งนี้มีผลต่อความสัมพันธ์แบบหนึ่งต่อหลายอย่างที่คุณแสดงความคิดเห็นของโพสต์อย่างไร ตัวอย่างใน Django: {% for comment in post.comments.all %} {% cache comment.pk comment.modified %} <p>{{ post.body }}</p> {% endcache %} {% endfor %} การแคชใน Rails นั้นแตกต่างจากการร้องขอเพื่อ memcached หรือไม่ (ฉันรู้ว่าพวกเขาแปลงแคชคีย์ของคุณเป็นอย่างอื่น) พวกเขายังแคชรหัสแคชหรือไม่

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