ระบบควบคุมเวอร์ชันสำหรับโครงการฮาร์ดแวร์?


59

ระบบควบคุมเวอร์ชันที่ดีสำหรับโครงการฮาร์ดแวร์คืออะไร มีรหัสเทียบเท่า Google, CVS และ SVN หรือไม่ ระบบควบคุมเวอร์ชันดังกล่าวเหมาะสมกับโครงการฮาร์ดแวร์ที่เกี่ยวข้องกับไฟล์ PCB, แผนงานหรือไม่ (แม้แต่รหัสเฟิร์มแวร์)?


5
เป็นคำถามที่ดีมาก! ชอบที่จะเห็นตัวอย่างที่เก็บรวมอยู่ในคำตอบ
tyblu

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

1
ฉันใช้ Mercurial ไปยังแผงวงจรรุ่นมาระยะหนึ่งแล้วและมันก็ช่วยชีวิตฉันได้สองครั้ง เป็นความคิดที่ดีอย่างแน่นอน
Stephen Collings

1
ฉันใช้ชุดเครื่องมือ gEDA สำหรับ EDA และติดตามสิ่งต่าง ๆ ในคอมไพล์ ฉันเพิ่งเขียน hooks git ที่สร้างรูปภาพ. png ของแผนผังหรือ PCB ที่ได้รับการแก้ไขโดยอัตโนมัติและเพิ่มลงในคอมมิท นี่ทำให้ฉันสามารถใช้ประโยชน์จากภาพลักษณ์ของ GitHub ได้ PCB และ gschem ยังมีเครื่องมือ diff ทั่วไปที่ทำงานกับคอมไพล์ที่ทำสิ่งที่คล้ายกันในพื้นที่ ตะขอของฉันอยู่ที่นี่: github.com/BenBergman/.git_hooksโครงการตัวอย่างที่ใช้พวกเขาgithub.com/BenBergman/uJoypad
เบน

คำตอบ:


27

โดยทั่วไประบบ VCS ทั้งหมดสามารถจัดการไฟล์ข้อความและไบนารีได้อย่างสง่างาม แน่นอนคุณไม่สามารถรวมเลขฐานสอง

ดังนั้นตราบใดที่คุณไม่ได้ใช้สิ่งที่ล้าสมัยเช่น CVS คุณจะดีกับระบบใด ๆ


3
ฉันใช้ CVS สำหรับทุกโครงการของฉัน (ซอฟต์แวร์และฮาร์ดแวร์ที่มี PCB, เฟิร์มแวร์, เครื่องมือ, ฯลฯ ) และไม่มีปัญหา แน่นอน CVS ล้าสมัย แต่ฉันมีประวัติโครงการมา 20 ปีและไม่มีผู้ดำเนินการแปลงที่จะย้ายที่เก็บของฉันไปที่ Mercurial หรือ SVN
Axeman

12
แล้ววิธีปฏิบัติเป็นเพียงเกินไปปล่อยให้สิ่งเก่าใน CVS และจากนั้นจะนำสิ่งใหม่ ๆ ในระบบใหม่ ...
โจฮาน

CVS เป็นระบบที่สวยงามเมื่อเทียบกับสยองขวัญที่เป็น Microsoft Visual Source Safe ซึ่งฉันถูกล็อคไว้สำหรับโครงการที่ฉันกำลังทำงานอยู่ในขณะนี้ Blech
Kevin Vermeer

@ Kevin Vermeer คุณจะรู้ว่าคุณอยู่ในด้านลบในระดับที่เมื่อคุณกำลังเปรียบเทียบสอง "ไม่ว่าดี" สิ่งกับแต่ละอื่น ๆ ;)
โยฮัน

@KevinVermeer ฉันต้องใช้แหล่งข้อมูลที่ปลอดภัยความหายนะของโลกการควบคุมเวอร์ชัน เจ้านายคนสุดท้ายของฉันอนุญาตให้ละเลยการควบคุมเวอร์ชันอย่างสมบูรณ์เพราะมัน
Kortuk

17

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

สำหรับเฟิร์มแวร์การโค่นล้มหรือ Git นั้นยอดเยี่ยมมาก หากคุณไม่เคยใช้ Git มาก่อนลองโค่นล้มก่อน (แม้ว่ามันจะทำให้การเรียนรู้ Git ยากขึ้นในภายหลัง)

Altium เพิ่งเปิดตัวเครื่องมือ diff สำหรับ schematics และ PCBs ดังนั้นฉันจึงคาดว่าการโค่นล้มจะยอดเยี่ยมมาก modulo ความวิกลจริตตามปกติที่ผู้ขาย EDA จัดการเพื่อสร้างผลิตภัณฑ์ของตน

ฉันตั้งใจจะลองใช้เครื่องมือ diff ใหม่ ถ้าฉันทำฉันจะพยายามจำให้โพสต์ลิงก์ไปที่ repo ที่นี่เป็นตัวอย่าง

ปรับปรุง

ฉันลองสิ่งนี้และฉันต้องบอกว่าฉันรู้สึกผิดหวังเล็กน้อยกับเครื่องมือ Altium diff มันใช้งานได้ แต่การเปลี่ยนแปลงระหว่าง revs ของบอร์ดนั้นสำคัญพอที่จะไม่เป็นประโยชน์อย่างน้อยสำหรับฉัน เมื่อเห็นสิ่งนี้ฉันตัดสินใจที่จะลืมเครื่องมือ diff และใช้ Github นี่คือธุรกรรมซื้อคืนหากคุณสนใจ: https://github.com/rascalmicro/pcb


คุณใช้ SVN GUI ในตัว (กับ Altium) หรือสิ่งอื่นภายนอกหรือไม่
Nick T

Altium ใหม่ล่าสุดพร้อม SVN นั้นยอดเยี่ยมถึงแม้ว่าฉันจะเพิ่มว่าการแก้ไข PCB / schematic นั้นไม่สำคัญเท่าที่ควรในโค้ด หากคุณกำลังจัดการกับการเปิดตัววงจร / PCB มากกว่า 3-4 รุ่นการแก้ไขบางอย่างอาจผิดพลาดอย่างมากในขั้นตอนการออกแบบหรือข้อกำหนด
ทำเครื่องหมาย

@ Mark: คุณกำลังพูดถึง Release 10 beta หรือ Summer 09 หรือไม่?
Nick T

2
หากการเปลี่ยนแปลงระหว่าง revs ของคณะกรรมการมีมากพอที่จะไม่เป็นประโยชน์คุณไม่ได้กระทำบ่อย กระทำก่อนกำหนดส่งบ่อย! ใช้แท็กเพื่อติดตาม revs บอร์ด
Kevin Vermeer

3
ฉันใช้ SVN และมันก็คุ้มค่าแน่นอน ระบบของฉันคือ: ฉันกดปุ่มบันทึกฉันควรจะกระทำ ฉันติดตามการเปลี่ยนแปลงโดยการอ่านข้อความยืนยันเช่น "เพิ่มส่วน X ลงในไลบรารี" หรือ "เพิ่มแผ่นทดสอบลงในบัส I2C และ SPI" ข่าวที่ส่งออกมาเพื่อการผลิตนั้นแตกต่างกันโดยสิ้นเชิงใช้svn cp trunk/ tags/releaseX/เพื่อถ่ายภาพรวมของการเปิดตัว จากนั้นคุณสามารถแตกต่าง releaseX / ไฟล์และ releaseY / file หากคุณต้องการเห็นการเปลี่ยนแปลงระหว่างการเผยแพร่หรือคุณสามารถเรียกดูบันทึกการกระทำและดูการเปลี่ยนแปลงแต่ละรายการ สาขาช่วยทำให้เกิดการกระทำที่เป็นโมดูล
Kevin Vermeer


7

ฉันใช้ Google Code เพื่อโฮสต์Super OSDโครงการอิเล็กทรอนิกส์ของฉัน

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


3
+1 สำหรับการใช้รูปแบบข้อความสำหรับไฟล์ พื้นที่ดิสก์มีราคาถูกและการบีบอัดข้อความทำได้ง่าย ฉันหวังว่า blobs ไบนารีเป็นเรื่องธรรมดาน้อย
Kevin Vermeer

4

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

หากคุณไม่เคยใช้การควบคุมเวอร์ชันมาก่อนฉันแนะนำให้อ่านวิธีการทำงานต่าง ๆ และเลือกวิธีที่เหมาะสมกับความต้องการของคุณและ / หรือทีมงานของคุณ ระบบควบคุมเวอร์ชันแบบกระจายมอบประโยชน์มากมายเหนือระบบไคลเอนต์เซิร์ฟเวอร์ แต่มีแนวโน้มที่จะทำงานได้ซับซ้อนกว่า


3

ทำไมไม่ใช้เพียง Google Code หรือ SVN repo เช่นนี้เป็นระบบควบคุมการแก้ไข ไม่มีการใช้งานที่กำหนดไว้สำหรับมัน มันมีประโยชน์อย่างเหลือเชื่อสำหรับนักพัฒนาหลายคนและการตรวจสอบการเปลี่ยนแปลงในซอร์สโค้ด


1
คุณทำสิ่งนี้แล้วหรือ การใส่ไบนารีลงใน SVN หรือ Mercurial ทำให้ฉันเป็นบ้า
tyblu

2
ไม่ฉันยังไม่ได้ใช้ SVN ไม่ใช่แค่ซอร์สโค้ดเท่านั้น สิ่งต่างๆเช่นไฟล์ PDF และ. txt
ดี

2
@Tyblu คุณหมายถึงอะไรที่น่ากลัว? ฉันทำมันด้วยไฟล์แผนผังและเลย์เอาต์และมันใช้งานได้ดีสำหรับฉันกับการโค่นล้ม
Kellenjb

ฉันไม่สามารถติดตามการเปลี่ยนแปลงของไฟล์ EAGLE ด้วย Mercurial ดูเหมือนว่าไฟล์ทั้งหมดจะแตกต่างกัน คุณมีที่เก็บที่ฉันสามารถดูได้หรือไม่?
tyblu

5
@tyblu ที่ว่าทำไมคุณเพิ่มความคิดเห็นเมื่อคุณตรวจสอบในแฟ้ม :)
vicatcu

3

ฉันเคยใช้การโค่นล้มกับ Altium มาก่อน

ฉันใช้ SVN กับการรวม Altium สำหรับการจับภาพวงจร: ทำงานได้ดี ฉันต้องบอกว่าโปรแกรมดู diff ดีกว่าไม่มีอะไรเลยเพราะไฟล์ SchDoc ของฉันเป็นแบบไบนารี่คือไม่สามารถเปรียบเทียบเป็นอย่างอื่นได้! ฉันใช้ไคลเอ็นต์ SVN ที่รวมอยู่ใน Altium Designer พร้อมกับ TortoiseSVN โดยไม่มีปัญหา ลูกค้าของ Altium มีข้อ จำกัด เล็กน้อยในแง่ของคุณสมบัติ SVN ฉันทำ "แท็ก" กับ Tortoise

ความคิดเห็นของฉันขึ้นอยู่กับ Altium Designer 10 build 27009 และรุ่น 13.1 build 27559



1

ไม่ใช่ระบบควบคุมเวอร์ชันจริง แต่ Dropbox จัดการยังแก้ไขไฟล์และทำให้พวกเขาสามารถใช้งานได้สำหรับคนที่แตกต่างกันในระบบปฏิบัติการที่แตกต่างกัน - ระบบควบคุมเวอร์ชันแมนส์ไม่ดี;)


2
ในฐานะคนที่เคยทำงานกับทีมมาก่อน: โปรดอย่าทำเช่นนี้ Dropbox ไม่ได้เป็นระบบการควบคุมเวอร์ชันคนจน มันเป็นระบบแชร์ไฟล์ / เก็บถาวร คุณไม่จำเป็นต้องใช้คอมไพล์อย่างเต็มที่เพื่อให้มีประโยชน์มากขึ้นจริง ๆ ! Dropbox ไม่ทุกสิ่งที่ไม่ถูกต้องว่าแม้ CVS ไม่ขวา (วิธีการจัดการกับการแก้ไขใหม่วิธีการแลกเปลี่ยนการเปลี่ยนแปลงวิธีการทำเครื่องหมายการแก้ไขที่เฉพาะเจาะจง) ก็จริงๆไม่ได้เป็นระบบการควบคุมเวอร์ชัน
Marcus Müller

1

ผมเป็นคนที่ Faire ชงในซานมาเทโอนี้วันหยุดสุดสัปดาห์ที่ผ่านมาและได้พบกับตัวแทนจากใหม่ (ให้ฉัน) บริษัท ที่เรียกว่าขึ้น Verter โดยพื้นฐานแล้วพวกเขากำลังสร้างเครื่องมือ CAD ไฟฟ้าที่ทำงานใน "คลาวด์" (เช่นในเบราว์เซอร์ของคุณ) และสร้างแนวคิดเกี่ยวกับการทำงานร่วมกันดังนั้นควรจัดการกับการผสาน / การกระจายและการกำหนดเวอร์ชันตามปกติ

ฉันยังไม่ได้ลองเลยและมันก็ดูเป็นสีเขียวเล็กน้อย (อย่าคิดว่าคุณสามารถทำเลย์เอาต์ PCB ได้จริง ๆ แค่แผนผัง) แต่มันเป็นเรื่องที่น่าสนใจ พวกเขาอ้างว่าพวกเขาสามารถนำเข้าไฟล์ Eagle ซึ่งเป็นข้อดี

ฉันยังได้พูดคุยกับตัวแทนของ Eagle ที่เต็นท์ Element 14 และพวกเขาชี้ให้เห็นว่าพวกเขากำลังจะย้ายไปอยู่ในรูปแบบ XML ซึ่งเป็นขั้นตอนที่ยิ่งใหญ่ที่จะทำให้การกำหนดเวอร์ชันของแผนงานและเค้าโครงมีความเป็นไปได้มากขึ้น ... !


1

ข่าวดีสำหรับ Altium!

Altium เพิ่มการสนับสนุนการควบคุมเวอร์ชัน Gitเช่นคุณสามารถเห็นในบันทึกประจำรุ่นสำหรับโปรแกรมออกแบบของ Altium

หากต้องการทราบวิธีการใช้งานคุณสามารถปฏิบัติตามคำแนะนำการใช้การควบคุมเวอร์ชันได้


0

นี่เป็นคำถามที่ดีมาก เนื่องจาก FPGA จัดอยู่ในหมวดหมู่ของ "ฮาร์ดแวร์" คุณอาจสนใจโครงสร้างโครงการที่เป็นมิตรที่ควบคุมเวอร์ชันที่ฉันเสนอสำหรับโครงการ FPGA:

http://www.saardrimer.com/fpgaproj/

ฉันคิดว่าความคิดและแนวคิดสามารถนำไปใช้กับโครงการฮาร์ดแวร์อื่น ๆ และโดยทั่วไปได้อย่างง่ายดาย (ความเห็นเกี่ยวกับข้อเสนอนี้ยินดีมาก btw.)


2
ลิงค์ไม่ทำงานอีกต่อไป
tyblu

0

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

  1. มีไฟล์แผนผังไบนารีที่เปลี่ยนแปลงได้บ้างเมื่อมีการเปลี่ยนแปลง
  2. เปิดการปฏิบัติกับไบนารีเป็นข้อความ

3
อืม ... คุณควรมี repos เล็ก ๆ มากมาย repo ต่อโครงการ
Johan

1
@Johan - ...... ใช่ .... ขอให้โชคดีกับฝันร้ายในการซ่อมบำรุง อย่างไรก็ตามฉันมี 1 repo ต่อไคลเอนต์ (ประมาณ 4 ที่เก็บตอนนี้) กับโครงการย่อยมากมายและมันทำงานได้ดี อย่างน้อย SVN ดูเหมือนว่าจะสามารถจัดการกับข้อมูลไบนารีขนาด 5+ GB ได้โดยไม่มีปัญหามากเกินไป
Connor Wolf

1
@ConnorWolf ฉันสนใจที่จะทราบว่าคุณกำลังทำสิ่งนั้นอย่างไร เราทำหนึ่งที่เก็บ Git ต่อโครงการและไม่มีปัญหา การไม่มีที่เก็บเดียวต่อโครงการดูเหมือนเป็นฝันร้ายสำหรับฉัน
Matt Young

1
SVN อย่างน้อย (อาจเป็นคอมไพล์ด้วย) ดูเหมือนว่าจะเก็บ binary diffs แทนการทำสำเนาไฟล์ให้เสร็จสมบูรณ์ดังนั้นจึงประหยัดพื้นที่อย่างน่าประทับใจ
Connor Wolf

1
@ConnorWolf อีกครั้ง: ฝันร้ายการบำรุงรักษา: 8 ปีต่อมา: git-submodules อาจเป็นสิ่งที่คุณต้องการที่นี่ เหมาะสมโดยเฉพาะอย่างยิ่งถ้าคุณแบ่งปันเช่นเครื่องมือช่างมาตรฐานระหว่างหลายโครงการหรือลูกค้า
Marcus Müller

0

ฉันใช้ Mercurial (HG) repos หลายรายการ (หนึ่งรายการต่อโครงการ) สำหรับเรื่องนี้ แต่เนื่องจากระบบควบคุมเวอร์ชันส่วนใหญ่จะได้รับประสบการณ์ repos จะมีขนาดใหญ่ขึ้นเรื่อย ๆ


0

คุณควรพยายามหมูป่า มันถูกออกแบบมาให้รองรับไฟล์และที่เก็บขนาดใหญ่ ข้อมูลไบนารี 100 GB ขึ้นไปนั้นไม่มีปัญหา


0

ฉันต้องการเพิ่มลิงค์ไปยัง HgInit ซึ่งเป็นการแนะนำ Mercurial ที่ยอดเยี่ยมหากคุณตัดสินใจที่จะไปเส้นทางนั้น ส่วนตัวผมใช้ Git แต่มันคล้ายกันมากในแง่ของสถาปัตยกรรม (ทั้งคู่เป็นระบบควบคุมเวอร์ชันแบบกระจาย) ลักษณะการกระจายของพวกเขาทำให้พวกเขายอดเยี่ยมสำหรับการทำงานในทีม "กระจาย" ที่ดี :)

http://hginit.com/


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

0

OpenPLM ดูเหมือนจะเสนอแง่มุมบางอย่างของสิ่งที่คุณกำลังมองหาถึงแม้ว่ามันจะดูเหมือนไม่ได้อยู่ในการพัฒนาอย่างแข็งขัน ( http://www.openplm.org/trac/discussion/topic/93 )

อาจดูได้ที่https://discuss.erpnext.com/t/erpnext-git-github-for-open-source-hardware-call-for-beta-user-s/18006 ("ERPNext: Git / Github สำหรับ ฮาร์ดแวร์โอเพ่นซอร์ส - เรียกผู้ใช้รุ่นเบต้า ")


0

นี่เป็นสิ่งที่ควรพิจารณาสำหรับคำอธิบายเกี่ยวกับฮาร์ดแวร์ของ ASCII เมื่อคำอธิบายที่มนุษย์สามารถอ่านได้สำหรับฮาร์ดแวร์นั้นถูกนำมาใช้กับระบบควบคุมการแก้ไขที่ทันสมัย ​​(RCS) ที่ใช้งานได้ดี เลย์เอาต์วงจรมักจะอธิบายอย่างสมบูรณ์โดยไฟล์ Gerber, UML อธิบายส่วนอื่น ๆ ซึ่งเป็นคำอธิบาย ascii อย่างเต็มที่ มีรูปแบบ ascii มาตรฐานน้อยกว่าสำหรับ schematics เค้าโครงทางกลและอื่น ๆ (KiCAD เป็นต้น)

การยอมรับเป็นเรื่องที่ปฏิบัติได้จริงมันต้องการข้อกำหนดที่เป็นที่ยอมรับสำหรับการควบคุมการแก้ไขที่ดีรวมถึงความแตกต่างที่มีความหมาย ซึ่งมักหมายถึงการยกเลิก Word, Excel, PowerPoint และอื่น ๆ ข้อโต้แย้งที่ยากมากต่อผู้จัดการและ MBAs แต่อุตสาหกรรมที่มีการควบคุมอย่างเช่นอุปกรณ์การแพทย์การบินและการทหารนั้นต้องการการควบคุมการแก้ไขที่ดี

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


0

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

ในบริเวณนี้ Altium เป็นทางข้างหน้าของพรีเมี่ยม (Mentor และจังหวะ) เครื่องมือ

ฉันไม่ได้ทำงานกับ Altium แต่เครื่องมือนี้แม้จะมีปัญหาในปัจจุบันทำให้การกำหนดเวอร์ชันฮาร์ดแวร์โดยสมบูรณ์ง่ายมาก


และนั่นอาจเป็นสิ่งเดียวที่ Vault นั้นดีสำหรับ ...
Matt Young

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