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

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

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

2
เมื่อใดจึงเหมาะสมที่จะทำการคำนวณในส่วนหน้า
ทีมของฉันกำลังพัฒนาแอพพลิเคชั่นทางการเงินบนเว็บและมีข้อโต้แย้งกับเพื่อนร่วมงานที่จะทำการคำนวณ - แบ็คเอนด์หมดจดหรือเก็บฟรอนท์เอนด์ไว้บ้างไหม? คำอธิบายสั้น ๆ : เราใช้ Java (ZK, Spring) สำหรับ front-end และ Progress 4gl สำหรับ back-end การคำนวณที่เกี่ยวข้องกับคณิตศาสตร์ไม่ยอมใครง่ายๆ & ข้อมูลจากฐานข้อมูลจะถูกเก็บไว้ในส่วนท้ายดังนั้นฉันไม่ได้พูดถึงพวกเขา ฉันกำลังพูดถึงสถานการณ์ที่ผู้ใช้ป้อนค่า X จากนั้นจะเพิ่มค่า Y (แสดงในหน้าจอ) และผลลัพธ์จะปรากฏในฟิลด์ Z การดำเนินการ jQuery-ish ที่เรียบง่ายและบริสุทธิ์ฉันหมายถึง ดังนั้นสิ่งที่จะเป็นแนวปฏิบัติที่ดีที่สุดที่นี่: 1) เพิ่มค่าด้วย JavaScript ที่บันทึกจากการไปที่ส่วนหลังและส่วนหลังจากนั้นตรวจสอบความถูกต้องที่ส่วนท้าย "ในการบันทึก"? 2) รักษาตรรกะทางธุรกิจทั้งหมดไว้ในที่เดียวกัน - นำค่าไปยังส่วนหลังและทำการคำนวณที่นั่น? 3) ทำการคำนวณในส่วนหน้า; จากนั้นส่งข้อมูลไปยังส่วนหลังตรวจสอบความถูกต้องที่นั่นทำการคำนวณอีกครั้งและหากผลลัพธ์นั้นถูกต้องและเท่าเทียมกันแสดงให้ผู้ใช้เห็นหรือไม่ 4) มีอะไรอีกไหม? หมายเหตุ: เราทำการตรวจสอบความถูกต้องเบื้องต้นใน Java แต่ส่วนใหญ่ยังอยู่ใน back-end …

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

2
ใครทำ async / รอก่อน
Python เพิ่ม async / await constructs ใน 3.5 ในปี 2015 ชุมชน Javascript ได้ทำตามขั้นตอนมาเป็นเวลากว่าพันล้านปีและในที่สุดก็เพิ่มการใช้งานที่คล้ายกันมากกับร่างใน ES8 ที่เปิดตัวในปี 2017 (จากความเข้าใจของฉัน) typescript ยังเพิ่มวิธีการ async ในปี 2015 ในรุ่น 1.7 ที่ดวงตาที่ไม่ได้รับการฝึกฝนดูเหมือนว่าวิธี js async C # วิธีการเพิ่ม async ในปี 2012 ที่ดูเหมือนว่าการใช้งานอื่น ๆ ของ async / await และขึ้นอยู่กับการทำงานที่คล้ายกันของ F # แต่เวิร์กโฟลว์แบบอะซิงโครนัสที่ดูแตกต่างกันซึ่งถูกนำมาใช้ใน F # 2.0 ในปี 2010 นี่เป็นตัวอย่างแรกสุด - …

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

4
เหตุใด Donald Knuth จึงเขียน TAOCP โดยใช้ภาษาแอสเซมบลี
ฉันไม่ได้เกลียดการใช้ภาษาแอสเซมบลีเนื่องจากฉันได้เขียนบางอย่างในหลักสูตรระบบปฏิบัติการของฉัน แต่เห็นได้ชัดว่าภาษาแอสเซมบลีขาดสิ่งที่เป็นนามธรรมคุณต้องให้ความสำคัญกับรายละเอียดมากขึ้น ภาษาแอสเซมบลีจำเป็นอย่างยิ่งที่จะเขียน TAOCP หรือไม่
20 assembly  taocp 

6
มีข้อได้เปรียบอะไรบ้างจากการใช้งาน LINQ ในลักษณะที่ไม่ได้แคชผลลัพธ์
นี่เป็นข้อผิดพลาดที่ทราบกันดีสำหรับผู้ที่เปียกปอนโดยใช้ LINQ: public class Program { public static void Main() { IEnumerable<Record> originalCollection = GenerateRecords(new[] {"Jesse"}); var newCollection = new List<Record>(originalCollection); Console.WriteLine(ContainTheSameSingleObject(originalCollection, newCollection)); } private static IEnumerable<Record> GenerateRecords(string[] listOfNames) { return listOfNames.Select(x => new Record(Guid.NewGuid(), x)); } private static bool ContainTheSameSingleObject(IEnumerable<Record> originalCollection, List<Record> newCollection) { return originalCollection.Count() == 1 && …

3
วิธีการอย่างมืออาชีพในการสร้างปัญหาใหญ่โดยไม่ต้องกรอกอาร์เรย์ขนาดใหญ่: C ++ หน่วยความจำฟรีจากส่วนหนึ่งของอาร์เรย์
ฉันกำลังพัฒนาแบบจำลองทางฟิสิกส์และเนื่องจากฉันค่อนข้างใหม่กับการเขียนโปรแกรมฉันยังคงพบปัญหาเมื่อผลิตโปรแกรมขนาดใหญ่ ฉันรู้เกี่ยวกับการจัดสรรและลบหน่วยความจำแบบไดนามิก (ใหม่ / ลบ ฯลฯ ) แต่ฉันต้องการวิธีที่ดีกว่าในการจัดโครงสร้างโปรแกรม สมมติว่าฉันกำลังจำลองการทดสอบที่ใช้งานมาสองสามวันด้วยอัตราการสุ่มตัวอย่างที่ใหญ่มาก ฉันต้องการจำลองตัวอย่างเป็นพันล้านตัวอย่าง ในฐานะเวอร์ชั่นที่เรียบง่ายที่สุดเราจะกล่าวว่าโปรแกรมใช้แรงดันไฟฟ้า V [i] และรวมเข้าด้วยกันเป็นห้า: ie NewV [0] = V [0] + V [1] + V [2] + V [3] + V [4] NewV [1] = V [1] + V [2] + V [3] + V [4] + V [5] ดังนั้น …
20 c++  data  memory  array  dynamic 

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

4
ควรใช้ฟังก์ชั่นที่ทำหน้าที่เป็นพารามิเตอร์หรือไม่และนำพารามิเตอร์ไปใช้กับฟังก์ชันเหล่านั้นเป็นพารามิเตอร์ด้วยหรือไม่
ฉันมักจะพบว่าตัวเองกำลังเขียนฟังก์ชั่นที่มีลักษณะเช่นนี้เพราะพวกเขาทำให้ฉันสามารถเข้าถึงข้อมูลได้อย่างง่ายดายและยังมีลายเซ็นที่ยอมรับพารามิเตอร์เพื่อกำหนดข้อมูลที่จะเข้าถึง public static string GetFormattedRate( Func<string, RateType>> getRate, string rateKey) { var rate = getRate(rateKey); var formattedRate = rate.DollarsPerMonth.ToString("C0"); return formattedRate; } หรือ public static string GetFormattedRate( Func<RateType, string> formatRate, Func<string, RateType>> getRate, string rateKey) { var rate = getRate(rateKey); var formattedRate = formatRate(rate); return formattedRate; } จากนั้นฉันก็ใช้สิ่งนี้: using FormatterModule; …

3
ฉันควรใช้ git stash เพื่อบันทึกการเปลี่ยนแปลงอย่างต่อเนื่องของโครงการและผลักไปที่ gitub เพื่อเข้าถึงในคอมพิวเตอร์เครื่องอื่น ๆ หรือไม่?
ฉันมักจะทำงานกับคุณสมบัติบางอย่างของโครงการของฉันที่ฉันต้องหยุดพักก่อนที่จะดีพอสำหรับการกระทำ อย่างไรก็ตามฉันใช้คอมพิวเตอร์สองเครื่องต่อวันในการเขียนโค้ด (แล็ปท็อปและเดสก์ท็อปแล็บการวิจัยของฉัน) เช่นฉันกำลังทำงานกับคุณสมบัติที่บ้านจากนั้นฉันหยุดและไปที่ห้องแล็บของฉัน ฉันไม่ต้องการผสมผสานการซิงค์บนคลาวด์ (เช่น Dropbox) กับการติดตามระยะไกลของ GitHub ฉันเพิ่งระบุรหัสของฉันที่ยังไม่เสร็จ (และยุ่ง) ก่อน (และผลักมัน) เฉพาะเพื่อจุดประสงค์ในการดึงสิ่งนั้นในคอมพิวเตอร์เครื่องอื่นเพื่อทำงานต่อไป ฉันค่อนข้างมั่นใจว่านี่เป็นการปฏิบัติที่ไม่ดี แต่วันนี้ฉันเจอgit stashGoogling นิดหน่อย ดูเหมือนเป็นโซลูชั่นที่สมบูรณ์แบบสำหรับสิ่งที่ฉันต้องการ อย่างไรก็ตามเอกสารไม่ได้บอกว่ามันจะไป GitHub เมื่อฉันผลักดันการเปลี่ยนแปลงของฉัน นอกจากนั้นฉันต้องการทราบว่ามีวิธีที่มีประสิทธิภาพมากขึ้นเพื่อให้บรรลุความคล่องตัวที่ฉันต้องการหรือไม่ ขอบคุณล่วงหน้า!
20 git  github  gitflow 

3
การจัดการแพ็คเกจ NuGet ภายใน บริษัท ด้วยการเข้าถึงซอร์สโค้ด
เรามีห้องสมุดมากมายที่เราต้องการแบ่งปันระหว่างโครงการต่างๆภายใน บริษัท ข้อกำหนดเหล่านี้คือ: แหล่งไลบรารีถูกเก็บไว้ในที่เก็บซึ่งแยกจากโครงการปลายทาง โครงการสุดท้ายรวมถึงห้องสมุดผ่าน NuGet ต้องเป็นไปได้ที่จะตรวจสอบซอร์สโค้ดสำหรับ libary ที่กำหนดได้อย่างง่ายดายในขณะที่ทำงานในโปรเจ็กต์ปลายทาง การตั้งค่าที่เก็บส่วนตัวของ NuGet ไม่ใช่ปัญหา แต่การจัดการแหล่งข้อมูลนั้น เราพยายามที่จะเปิดเผยแหล่งที่มาผ่านทางเซิร์ฟเวอร์ต้นทางและมันครับทำงาน แต่ไม่มาก: VS ดาวน์โหลดแหล่งที่มาในขณะที่การแก้จุดบกพร่องรหัสภายนอก แต่ไม่ได้เมื่อคุณพยายามที่จะนำทางนิยาม / การดำเนินงาน โดยทั่วไปคุณสามารถไปที่ซอร์สโค้ดเมื่อทำการดีบั๊กซึ่งไม่ใช่สิ่งที่เราต้องการ ดังนั้นคำถามคือ: มีวิธีใดที่จะให้การเข้าถึงซอร์สโค้ดของไลบรารีภายในโดยไม่จำเป็นต้องมีโค้ดใน repo / solution เดียวกัน มีวิธีในการตั้งค่าเซิร์ฟเวอร์ Symbol / คำสั่งผสม NuGet เพื่อให้ VS ใช้สัญลักษณ์สำหรับการนำทางไม่ใช่แค่สำหรับการดีบัก? ใช้ ReSharper / อื่น ๆ เพิ่มเติมเป็นตัวเลือก

3
วิธีการแยก UI จากตรรกะบนแอป Pyqt / Qt อย่างถูกต้อง?
ผมเคยอ่านค่อนข้างมากเกี่ยวกับเรื่องนี้ในอดีตและเฝ้าดูการเจรจาที่น่าสนใจบางเช่นเดียวจากนี้ลุงบ๊อบ ถึงกระนั้นฉันมักจะพบว่ามันยากที่จะออกแบบสก์ท็อปของฉันอย่างถูกต้องและแยกแยะความแตกต่างซึ่งควรเป็นความรับผิดชอบในด้านUIและสิ่งที่อยู่ในด้านตรรกะ สรุปโดยย่อเกี่ยวกับแนวทางปฏิบัติที่ดีคือสิ่งนี้ คุณควรออกแบบตรรกะของคุณแยกจาก UI ดังนั้นวิธีที่คุณสามารถใช้ (ในทางทฤษฎี) ไลบรารีของคุณไม่ว่าจะเป็นแบ็กเอนด์ / UI ใด ๆ สิ่งนี้หมายความว่าโดยพื้นฐานแล้ว UI ควรเป็นคนโง่ที่สุดและควรทำการประมวลผลอย่างหนักที่ด้านตรรกะ ถ้าอย่างนั้นฉันก็สามารถใช้ไลบรารี่ที่สวยงามของฉันกับแอพพลิเคชั่นคอนโซลเว็บแอพพลิเคชั่น นอกจากนี้ลุงบ๊อบแนะนำการอภิปรายที่แตกต่างกันของเทคโนโลยีที่ใช้จะให้ประโยชน์มากมาย (อินเทอร์เฟซที่ดี) แนวคิดการชะลอตัวนี้ช่วยให้คุณมีเอนทิตี้ที่ผ่านการทดสอบอย่างดีซึ่งฟังดูดี แต่ก็ยังยุ่งยาก ดังนั้นฉันรู้ว่าคำถามนี้เป็นคำถามที่ค่อนข้างกว้างขวางซึ่งมีการพูดคุยกันหลายครั้งผ่านอินเทอร์เน็ตทั้งหมดและในหนังสือที่ดีมากมาย ดังนั้นเพื่อให้ได้สิ่งที่ดีออกมาฉันจะโพสต์ตัวอย่างตัวอย่างเล็ก ๆ น้อย ๆ ที่พยายามใช้ MCV บน pyqt: import sys import os import random from PyQt5 import QtWidgets from PyQt5 import QtGui from PyQt5 import QtCore random.seed(1) class Model(QtCore.QObject): …
20 design  python  mvc  gui  coupling 

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

6
วิธีลบฟังก์ชั่นหรือคุณสมบัติเมื่อใช้ TDD
ในข้อความเกี่ยวกับ TDD ฉันมักจะอ่านเกี่ยวกับ "ลบการทำซ้ำ" หรือ "ปรับปรุงการอ่าน" ในระหว่างขั้นตอนการสร้างใหม่ แต่อะไรทำให้ฉันลบฟังก์ชันที่ไม่ได้ใช้ออก สำหรับการพูดเช่นขอให้มีชั้นเรียนCด้วยวิธีการและa() b()ตอนนี้ผมคิดว่ามันจะดีที่จะมีวิธีการที่จะขับรถเข้าไปf() Cในความเป็นจริงf()แทนที่ทุกสายที่จะb()มีข้อยกเว้นของการทดสอบหน่วยที่กำหนดไว้ / b()อธิบาย ไม่จำเป็นอีกต่อไป - ยกเว้นการทดสอบ มันเป็นการประหยัดเพียงแค่ลบb()และการทดสอบทั้งหมดที่ใช้หรือไม่ เป็นส่วนหนึ่งของ "ปรับปรุงการอ่าน" หรือไม่?

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