Month: April 2018

  • Ubuntu server 18.04 config static IP with ifupdown not netplan

    เดิมก่อนหน้า server 18.04 จะออกมาให้ใช้งานกันนั้น จะเป็น server 16.04 เราตั้งค่า (config) static IP ให้กับ server ด้วยไฟล์นี้ /etc/network/interfaces ซึ่งก็คือ package ชื่อ ifupdown และ DNS resolver ที่ใช้ก็คือ resolvconf

    แต่ใน server 18.04 นี้ เปลี่ยนไปใช้ package ชื่อ netplan แก้ไขที่ไฟล์ /etc/netplan/01-netcfg.yaml และใช้ DNS resolver คือ systemd-resolve ซึ่งจะ connect สอบถามชื่อ DNS จาก internal DNS ที่ IP 127.0.0.53 (ตรวจดูด้วยคำสั่ง cat /etc/resolv.conf)

    (ย้ำ) บทความนี้ไม่ได้บอกเล่าให้ทุกคนต้องทำแบบนี้ เพียงแต่หากท่านมีงานเฉพาะอย่างที่ต้องการใช้แบบก่อนหน้านี้

    หลังจากติดตั้ง Ubuntu server เสร็จ

    1.แก้ไขไฟล์ /etc/default/grub ดังนี้

    sudo nano /etc/default/grub

    เพิ่มบรรทัดนี้

    GRUB_CMDLINE_LINUX="netcfg/do_not_use_netplan=true"

    หรือหากต้องการใช้ชื่อ interface เป็น ethX เช่น eth0 เป็นต้น ก็ให้เพิ่มบรรทัดแบบนี้

    GRUB_CMDLINE_LINUX="net.ifnames=0 netcfg/do_not_use_netplan=true"

    ทำการ Save และ ออก

    2.ทำคำสั่งนี้เพื่อ update grub

    sudo update-grub

    3.ติดตั้ง ifupdown package

    sudo apt install ifupdown

    4.ติดตั้ง resolvconf package

    sudo apt install resolvconf

    5.รีบูต server

    เมื่อ login กลับเข้าไปใน command prompt สั่ง ping www.google.com สำเร็จ ก็แสดงว่าใช้งานได้ (เซิร์ฟเวอร์นี้ต้องได้รับอนุญาตออกเน็ตด้วยนะ) หรือไม่ก็ใช้คำสั่งตรวจสอบชื่อโดเมน ดังนี้ host www.google.com ก็จะต้องได้รับ output ที่แสดงว่าสำเร็จ

    สำหรับวิธีการตั้งค่าแบบ netplan ก็มีเว็บเพจที่เขียนไว้มากพอสมควร เช่น Ubuntu Bionic: Netplan posted by Joshua Powers on 1 December 2017 [ https://insights.ubuntu.com/2017/12/01/ubuntu-bionic-netplan ] ลองทำความเข้าใจรูปแบบใหม่นี้ได้เลย

    Output ของค่า default เมื่อติดตั้ง Ubuntu server 18.04 เสร็จใหม่ ๆ (/etc/resolv.conf, /etc/network/interfaces และ /etc/netplan/01-netcfg.yaml)

    Output ของไฟล์ที่ใช้ในการตั้งค่า static IP เมื่อใช้ ifupdown package (/etc/resolv.conf และ /etc/network/interfaces)

    References:
    Disable netplan on Ubuntu 17.10 Posted on January 10, 2018 by ruchi [ http://www.ubuntugeek.com/disable-netplan-on-ubuntu-17-10.html ]
    Predictable Network Interface Names [ https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ ]

  • Uploading Files into Database with ASP.NET MVC

    การ    upload  file มีหลายรูปแบบ ไม่ว่าจะเป็นการ upload file  แบบ copy ไว้บน server หรือจะเป็นการบันทึกลงในฐานข้อมูลเลยโดยตรง วันนี้จะขอนำเสนอในส่วนของการ upload   file  และบันทึกลงฐานข้อมูล     โดยใช้ ASP.NET MVC  ดังนี้

     

    กำหนดไฟล์ที่ต้องการ upload ให้มีรูปแบบดังนี้

          public class UploadModel

    {

    [Required]

    public HttpPostedFileBase File { get; set; }

    }

     

    ในส่วนของ    View

     

    <form id=”uploader” enctype=”multipart/form-data” method=”POST”>

    <a type=”submit” href=”#” onclick=”uploadConfirm();” class=”btn btn-info”><span class=”glyphicon glyphicon-save”></span>&nbsp;Upload</a>

    </form>

    ในส่วนของ java script (สำหรับเรียก Controller)

      function uploadConfirm() {

    $.ajax({

    type: ‘POST’,

    contentType: ‘application/json; charset=utf-8’,

    url: ‘@Url.Action(“CheckDataBeforeUpload”, “NoteUpload”)’,

    data: “{ ‘periodID’:’” + $(‘#selectedlistPeriods’).val() +

    “‘ ,’financeID’:’” + $(‘#selectedlistFinance’).val() +

    “‘ }”,

    success: function (resultSave) {

     

    },

    error: function (data) {

    alert(data);

    }

    });

    }

     

    ในส่วนของ Controller

    public async Task<ActionResult> UploadFile(UploadModel model, FormCollection form)

    {

     

    string fileName = Path.GetFileName(model.File.FileName); //แสดงชื่อไฟล์

    string strFileName = Path.GetFileNameWithoutExtension(fileName); //แสดงชื่อไฟล์

    string contentType = model.File.ContentType;  //แสดงนามสกุลไฟล์

     

    string FileExtension = fileName.Substring(fileName.LastIndexOf(‘.’) + 1).ToLower();

    using (Stream fs = model.File.InputStream) //

    {

    using (BinaryReader br = new BinaryReader(fs))

    {

    byte[] bytes = br.ReadBytes((Int32)fs.Length);

     

    //TO DO:  Code ในส่วนที่ต้องการ insert ข้อมูลลง Database

    }

    }

     

    return RedirectToAction(“Index”);

    }

     

    จากตัวอย่างข้างต้น จะเป็นการ upload file ลงฐานข้อมูลโดยตรงในส่วนของรูปแบบการพัฒนาแบบ MVC ผู้เขียนหวังว่าอาจจะเป็นอีกทางเลือกหนึ่งของผู้พัฒนา ในการนำไปพัฒนาโปรแกรมต่อไปนะคะ ^_^

    แหล่งอ้างอิง

    https://stackoverflow.com/questions/15106190/uploading-files-into-database-with-asp-net-mvc

    https://stackoverflow.com/questions/21677038/mvc-upload-file-with-model-second-parameter-posted-file-is-null/21677156

  • จดหมายลอกลวง 23/4/61

    ช่วง ศุกร์ที่ 20 ถึง เช้าวันนี้ จันทร์ที่ 23 เมษายน 2561 พบว่า มีผู้ใช้หลายท่านได้รับ email ลักษณะประมาณนี้

    แล้วมีคำถามว่า เป็นของมหาวิทยาลัยส่งจริงหรือไม่

    ตอบก่อนเลยว่า “ไม่ใช่อีเมลของทางมหาวิทยาลัย” เป็นจดหมายหลอกลวง

    ทางระบบของมหาวิทยาลัยจะไม่ส่ง email แจ้งเตือนใดๆอย่างนี้

    ข้อสังเกต

    1. ลิงค์ใน email ที่ให้คลิก จะเป็นอะไรที่ไม่ใช่ psu.ac.th (ทราบไม๊ครับ ? ว่าโดเมนเนมของมหาวิทยาลัยสงขลานครินทร์ คือ psu.ac.th ???)

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

    2. ผู้ส่ง (From) ในทางปฏิบัติ จะ “ตั้งค่า” ให้เป็นใครก็ได้ แต่ในที่นี้ เค้าจะไม่สามารถตั้งค่าเป็น @psu.ac.th ได้ เพราะเราได้ทำการจดทะเบียน DomainKeys Identified Mail (DKIM) และทำตามกระบวนการ Sender Policy Framework (SPF) แล้ว ซึ่งจะกำหนดว่า ต้องเป็น IP ที่ได้รับอนุญาตเท่านั้น จึงจะบอกว่า ส่งจาก @psu.ac.th ได้เท่านั้น …. แม้จะส่งได้และเข้ามาใน Inbox ของท่าน แต่อาจจะเป็นบน gmail.com, hotmail.com, yahoo.com ก็ตาม ก็จะถูกระบุว่า ไม่สามารถเชื่อถือได้

      ในที่นี้ จึงเลี่ยงไปใช้ @itservice.psu.ac.th ซึ่ง ก็ไม่มีอยู่จริงเช่นกัน

     

    หากหลงเชื่อ คลิก Link แล้วกรอกข้อมูลไปแล้วควรทำอย่างไร?

    ให้ทำการตั้งรหัสผ่าน PSU Email ใหม่ที่ ตามวิธีการนี้เท่านั้น

    http://gafe.psu.ac.th/support/1/1

     

    และ เว็บไซต์ที่จะทำการ ตั้งรหัสผ่าน PSU Email ได้ ต้องเป็นเว็บไซต์นี้เท่านั้น ซึ่งต้องยืนยันตัวจริง ด้วย PSU Passport อีกชั้นหนึ่งด้วย

    https://webmail.psu.ac.th/src/resetpassword.html

     

    ลืม PSU Passport / ไม่แน่ใจว่า PSU Passport คืออะไร ทำอย่างไร ???

    1. บุคลากรมหาวิทยาลัยสงขลานครินทร์ >>> ติดต่อการเจ้าหน้าที่ คณะ หน่วยงานของท่าน
    2. นักศึกษา >>> ติดต่อ ศูนย์คอมพิวเตอร์ ม.สงขลานครินทร์ วิทยาเขตหาดใหญ่ (email สอบถาม: passport@psu.ac.th)
    3. บุคลากรที่เกษียณ/ไม่ได้ทำงานที่มหาวิทยาลัยแล้ว >>> มหาวิทยาลัยยังคง email ของท่านไว้เสมอ สามารถใช้ต่อไปได้ แม้ เกษียณ/ลาออก ก็ตาม แต่ในกรณีที่ท่านต้องการเปลี่ยนรหัสผ่าน PSU Email แล้ว ไม่สามารถใช้งาน PSU Passport ได้แล้ว ให้มาติดต่อด้วยตนเองที่ศูนย์คอมพิวเตอร์ มหาวิทยาลัยสงขลานครินทร์ วิทยาเขตหาดใหญ่เท่านั้น
  • การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 2 : การบันทึกความต้องการ)

    อ้างอิงจากบทความก่อนหน้าในหัวข้อ “เริ่มต้นกับการบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 1 : Overview)” 

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

    ในกระบวนการ Software Process : SDLC ในขั้นตอน Planning หรือการวางแผน ผู้จัดการโครงการจะสามารถวางแผนได้ ก็ต่อเมื่อทราบรายละเอียดของความต้องการทั้งหมดหรือเกือบทั้งหมดของโครงการ ในที่นี่ขอเรียกว่า Backlog items  ดังนั้น TFS จะเป็นเครื่องมือที่ช่วยเก็บบันทึก รวบรวม Backlog items ต่างๆ ที่เก็บรวบรวมมา และสามารถตรวจสอบสถานะของแต่ละ Backlog items ว่าอยู่ในสถานะใด เช่น ยังไม่ดำเนินการ กำลังดำเนินการ หรือดำเนินการแล้วเสร็จ เป็นต้น

    อยากรู้รายละเอียดกันแล้วใช่ไม๊ค่ะ…มาติดตามกันเลยค่ะ

    ขั้นตอน 1 : การสร้าง Project Name

    ก่อนการบันทึก Backlog items แต่ละระบบก็จะมีชื่อของระบบ หรือโครงการ กันก่อน ดังนั้นจะต้องทำการ Add Project Name หรือชื่อโครงการ เข้าไปใน TFS กันก่อน ซึ่งผู้จัดการโครงการ 1 คน อาจจะต้องดูแลและรับผิดชอบ มากกว่า 1 โครงการ หรือ 1 Project ได้ ในที่นี้ขอยกตัวอย่าง FMIS Accounting Report นะค่ะ เป็นโครงการในการพัฒนาระบบสารสนเทศเพื่อรายงานงบแสดงฐานะการเงิน งบรายได้-ค่าใช้จ่าย และหมายเหตุประกอบงบการเงิน

    ขั้นตอน 2 : การบันทึกความต้องการ 

    ในขั้นตอนนี้ผู้จัดการโครงการ และทีมพัฒนา จะทำการรวบรวมความต้องการ หรือ Backlog items ด้วยวิธีการต่างๆ ได้แก่ การประชุม การสอบถามจากผู้มีส่วนได้ส่วนเสียหรือผู้ปฏิบัติงาน การศึกษาจากเอกสาร ฯลฯ เพื่อให้ได้มาซึ่ง Backlog Item เป็นข้อๆ และนำมาบันทึกใน Project Name ตามขั้นตอนดังนี้

    2.1 เลือก Project Name ที่ต้องการ

    2.2 เลือก WORK เลือก Backlog items และเลือก Backlog ดังรูปด้านล่าง

    2.3 ทำการ Add Backlog item โดย ระบุ Type = Product Backlog Item และ Title คือ ชื่อของความต้องการ หลังจากนั้น กดปุ่ม Add แสดงขั้นตอนดังรูปด้านล่าง

    2.4 เมื่อ Add แล้ว Backlog หรือความต้องการก็จะถูกบันทึกลงใน TFS โดยมีสถานะเริ่มต้น เป็น “New” ดังรูป

    2.5 ขั้นตอนข้างต้น เป็นการบันทึก Title ของ Backlog item เท่านั้น หากต้องการบันทึกรายละเอียดให้ Double click ที่รายการของ Backlog item ที่ต้องการ หน้าจอจะแสดง รายละเอียดของ Backlog item ดังกล่าว เพื่อให้ระบุรายละเอียดสำคัญ ๆ ดังรูป

    จากรูปด้านบน แต่ละส่วน มีรายละเอียด ดังนี้

    หมายเลข 1 : หมายถึง ประเภทเป็น Backlog item โดยมี No. ที่ running จาก TFS = 5796 ซึ่งส่วนนี้ไม่สามารถแก้ไขได้

    หมายเลข 2 : หมายถึง Title ที่ได้เพิ่มในข้อ 2.4

    หมายเลข 3 : หมายถึง Title เช่นเดียวกับ ข้อ 2 แต่สามารถแก้ไขได้ ในกรณีที่ต้องการเปลี่ยน Title

    หมายเลข 4 : หมายถึง คำอธิบายความต้องการนั้นๆ หรือที่มาของความต้องการ

    หมายเลข 5 : หมายถึง สิ่งที่ต้องการ หรือผลลัพธ์ที่จะได้รับจากความต้องการนั้น

    หมายเลข 6 : กรณีที่มีการเปลี่ยนแปลงแก้ไขรายละเอียด ให้กดปุ่ม save หรือ Save and close เพื่อบันทึกรายละเอียดที่เปลี่ยนแปลง

    ขั้นตอน 3 : การพิจารณา และคัดเลือกความต้องการ

    จากขั้นตอนที่ 2 เราจะได้ Backlog items เกือบทั้งหมดของระบบ (ที่กล่าวว่าเกือบทั้งหมด เนื่องจาก Backlog บางข้อ หรือความต้องการบางข้อ อาจจะมีเพิ่มขึ้นได้ระหว่างโครงการ ซึ่งสามารถบันทึกเพิ่มเข้าไปใน Project ได้) ในการจะเริ่มวางแผน ผู้จัดการโครงการ และเจ้าของระบบที่ต้องการให้พัฒนาระบบ จะมาวิเคราะห์ หรือพิจารณาคัดเลือก Backlog โดยให้เกณฑ์ต่างๆ สำหรับ Backlog items ที่ผ่านขั้นตอนการพิจารณา/คัดเลือกแล้ว ผู้จัดการโครงการจะดำเนินการจัดการ Backlog item แต่ละข้อ โดย

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

    1) State = Done

    2) เลือก History

    3) ระบุรายละเอียด หรือ ระบุเงื่อนไขที่ไม่ผ่านการพิจารณา

    4) กดปุ่ม Save หรือ Save and close เพื่อบันทึกรายละเอียด

    รายละเอียด ดังรูป

     

    Backlog ที่ผ่านการพิจารณาให้ดำเนินการ จะทำการกำหนด State = Approved ดังรูป

    ผู้จัดการโครงการสามารถดูภาพรวมของ Backlog items ทั้งหมดของ Project ในอีกมุมมอง ดังรูป

    1) New : Backlog item ที่ยังไม่ผ่านการพิจารณา หรือถูกคัดเลือกเพื่อจัดทำโครงการ

    2) Approved : Backlog item ที่ถูกเลือกให้พัฒนา แต่ยังไม่เข้ากระบวนการพัฒนา

    3) Commited : Backlog item ที่ถูกเลือกให้พัฒนา และอยู่ระหว่างการพัฒนา

    4) Done : Backlog item ที่ไม่ผ่านการพิจารณาให้พัฒนา หรือ Backlog item ที่ดำเนินการเสร็จเรียบร้อยแล้ว

     

    หมายเหตุ : สำหรับ Backlog items ที่ผ่านการคัดเลือกเพื่อให้พัฒนา จะเข้าสู่กระบวนการวางแผนต่อไป ซึ่งจะได้อธิบายรายละเอียดขั้นตอนการวางแผนโครงการใน Phase ถัดไปค่ะ (รอติดตามกันต่อนะค่ะ…อย่าเพิ่งเบื่อ…)

     

    บทสรุป : การนำ TFS มาใช้ในการบันทึกความต้องการ หรือ Backlog items มีประโยชน์ อย่างไร?

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

    1. เป็นเครื่องมือบันทึก และเก็บรวบรวมความต้องการ ทำให้ทราบว่ามีความต้องการจำนวนกี่รายการ
    2. สามารถตรวจสอบสถานะของความต้องการ หรือ Backlog items ที่
      • ยังไม่ผ่านการพิจารณา/คัดเลือก
      • ผ่านการอนุมัติเพื่อให้ดำเนินการแต่ยังไม่ดำเนินการ กี่รายการ
      • ผ่านการอนุมัติ และอยู่ระหว่างการดำเนินการ กี่รายการ (จะกล่าวรายละเอียดใน Pase เกี่ยวกับการวางแผนต่อไป)
      • ดำเนินการแล้วเสร็จ กี่รายการ (จะกล่าวรายละเอียดใน Pase เกี่ยวกับการวางแผนต่อไป)
    3. ความต้องการที่รวบรวมมาไม่หาย หรือตกหล่นไประหว่างทาง หรือระหว่างการดำเนินโครงการ
    4. สามารถนำข้อมูลมาเพื่อจัดทำเป็น Requirement Check list ได้ต่อไปในอนาคต

     

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

  • เริ่มต้นกับการบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 1 : Overview)

    บทความนี้เป็นลักษณะของการเล่าประสบการณ์ของการนำเครื่องมือ MS Team Foundation มาใช้เพื่อการบริหารโครงการ เพื่อให้ผู้อ่านหรือผู้สนใจได้เห็นภาพคร่าว ๆ หรือหากเป็นประโยชน์ก็สามารถนำไปใช้งานการทำงานได้จริง ^___^

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

    เบื้องต้นให้ผู้อ่านคิดถึงกระบวนการการพัฒนาระบบสารสนเทศทั่วไป จะมีขั้นตอนต่างๆ ตามกระบวนการ SDLC ซึ่งจะมีขั้นตอนหลักๆ คือ

    Software Process : SDLC

    • Planning
    • Requirement Analysis
    • Designing the product architecture
    • Building or Developing the Product
    • Testing the Product
    • Deployment and Maintenance

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

    เริ่มต้นมาทำความเข้าใจคำที่ใช้ใน TFS กันก่อนนะค่ะ ซึ่งจะเทียบให้เห็นกับคำทั่วๆ ที่ใช้กันในการพัฒนาระบบ นะค่ะ

    • Backlog items หมายถึง ความต้องการ หรือ Requirements
    • Sprint หมายถึง รอบระยะของโครงการย่อย หรือ รอบระยะเวลาของการพัฒนาระบบซึ่งแบ่งย่อยเป็นรอบๆ
    • Task หมายถึง งานย่อยๆ ที่จะมอบหมายให้สมาชิกดำเนินการ

    อ่านครั้งแรก อาจจะยังไม่เข้าใจ ขออธิบายรายละเอียดเพิ่มเติมนะค่ะ กล่าวคือ

    1. ในขั้นตอนของการวางแผน หรือ Planning สำหรับการพัฒนาระบบสารสนเทศจะเริ่มต้นด้วยการเข้าไปเก็บ รวบรวมความต้องการ หรือ Requirements จากลูกค้า ซึ่ง Requirements นี้ใน TFS จะเรียกว่า Backlog item โดยผู้จัดการโครงการจะนำ Backlog ที่ได้จากการรวบรวม มาเก็บไว้ใน TFS เพื่อเข้าสู่กระบวนการคัดกรอง Backlog items อีกครั้ง
    2. การคัดกรอง Backlog items คือ การพิจารณา Backlog item ว่าจะให้ดำเนินการ หรือไม่ดำเนินการ ด้วยเหตุผลใด
    3. หลังจาก Backlog items ผ่านขั้นตอนการคัดกรอง ก็จะมี Backlog items ที่พิจารณาให้ดำเนินการ ผู้จัดการโครงการก็จะต้องนำ Backlog Items มาวางแผน โดยพิจารณาตามระยะเวลา ในกรณีที่มี Backlog items จำนวนมาก นั่นก็หมายถึงระบบก็จะมีขนาดใหญ่ไปด้วยเช่นกัน จำเป็นจะต้องมีการแบ่งโครงการเป็นโครงการย่อยๆ เพื่อป้องกันความเสี่ยงของการพัฒนาระบบไม่เสร็จตามแผนที่วางไว้ การแบ่งโครงการออกเป็นโครงการย่อยๆ ใน TFS เรียกว่า Sprint ใน Sprint จะต้องระบุวันที่เริ่มต้น และ วันที่สิ้นสุด ซึ่งก็คือระยะเวลาของโครงการนั่นเอง
    4. จากนั้นผู้จัดการโครงการจะต้องพิจารณาร่วมกับลูกค้าเพื่อเลือก Backlog items ที่จะทำให้แล้วเสร็จใน Sprint นั้นๆ ในการคัดเลือก ก็จะนำปัจจัยหลาย ๆ ปัจจัย มาพิจารณา ซึ่งได้แก่ Backlog item ที่เป็นฟังก์ชันหลัก หรือมีความสำคัญจำเป็นต้องทำก่อน ความเร่งด่วนของการใช้งาน เป็นตน ผลจากการคัดกรอง หรือคัดเลือก ผู้จัดการโครงการก็จะทราบว่าในแต่ละ Sprint มี Backlog items อะไรบ้างที่จะต้องดำเนินการ ซึ่งจะเข้าสู่กระบวนการวางแผนและมอบหมายงานต่อไป
    5. โดยในแต่ละ Backlog item ของแต่ละ Sprint นั้น ผู้จัดการโครงการ จะต้องดำเนินการกำหนด งานย่อยๆ ซึ่งเป็นงาน ตามขั้นตอน หรือกระบวนการที่จะทำให้ Backlog item อันนั้นสำเร็จนั่นเอง โดยงานย่อยดังกล่าวเรียกว่า Task ซึ่งผู้จัดการโครงการเอง จะทำการบันทึกงานย่อยๆ ดังกล่าวลงใน TFS เพื่อเข้าสู่ขั้นตอนการมอบหมาย Task ต่อไป

    ตัวอย่าง รูปภาพ เพื่อความชัดเจนมากยิ่งขึ้นนะค่ะ

     

    ในครั้งต่อไป จะมาอธิบายวิธีการใช้เครื่องมือ TFS เพื่อทำการบันทึกข้อมูล Backlog items และอธิบายขั้นตอนการคัดกรอง Backlog items กันนะค่ะ อย่าลืมติดตามอ่านกันต่อนะค่ะ

     

    ข้อมูลอ้างอิง

    Team Foundation Overview : https://msdn.microsoft.com/en-us/library/ms242904(VS.80).aspx

    Software Process

  • การทดสอบแบบอัตโนมัติ ด้วย Robot framework กับ Selenium Library (ตอนที่ 1 การติดตั้ง)

    วันนี้จะมาเล่าเรื่องการทดสอบแบบ Automate ด้วย Robot framework ค่ะ Robot framework ก็คือการทดสอบการทำงานของระบบที่สร้างขึ้น ให้ง่ายและรวดเร็วด้วยการทำ Automate Testing ซึ่งจุดขายของมันคือ Robot Framework สามารถ Test data , executes test cases ออกมาเป็น report และ logs ได้

    Robot Framework implement มาจาก ภาษา Python ดังนั้นเราก็ต้อง install Python กันก่อน โดย Dowloadที่ https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi  ติดตั้งง่าย ๆ มี Next คลิก Next 

    เมื่อติดตั้งเสร็จแล้วมาลองใช้คำสั่งใน Command line ดังรูป ถ้าได้ผลลัพธ์ดังรูปแสดงว่าเราติดตั้ง Python เรียบร้อยแล้วค่ะ

    ต่อไปก็ทำการ Download get-pip.py โดย Download ได้ที่ https://bootstrap.pypa.io/get-pip.py จากนั้นเปิด Command line ใช้คำสั่งเพื่อติดตั้ง pip เรียกจากที่ไฟล์เก็บอยู่ ดังรูป

    Set Environment Variables ไปที่ This PC คลิกขวา à Properties à Advanced system settings à Environment Variables คลิก New ดังรูป จากนั้นคลิกปุ่ม OK

    ที่ Path ทำการ Double click ขึ้นมา จากนั้น New เพิ่มดังรูป

    จากนั้นเปิด Command line พิมพ์คำสั่งเพื่อติดตั้งส่วน library ที่จำเป็นในการทดสอบ คำสั่งดังนี้

    เมื่อเราลงเสร็จ ลองใช้ คำสั่ง pip freeze จะเห็นว่า มันมี library ตามที่เราติดตั้ง ดังรูป

    Tools หรือ IDE ที่จะใช้ในการเขียน Robot Framework จะเลือกเอาตามที่ถนัดเลยค่ะ บทความครั้งหน้าเราจะมาลองใช้งานกันค่ะ

  • Raspberry Pi 3 [Automated Relay Controller]

    ตอนที่แล้วเราได้ทดลองทำการสั่งงานรีเลย์แบบ Manual ผ่านหน้าเว็บไปแล้ว

    ครั้งนี้เราลองสั่งให้รีเลย์ทำงานโดยผ่านการประมวลผลค่าที่ได้จากเซนเซอร์ เพื่อให้ก้าวไปอีกขั้นของ IoT

     

    โดยเราจะใช้เซนเซอร์ที่เคยได้นำเสนอไปก่อนหน้านี้แล้ว นั่นคือ DHT22 Temperature & Humidity Sensor (ต่อที่ PIN: 32 [GPIO 12])
    และรีเลย์ 4 Channel ซึ่งสามารถนำไปต่อกับอุปกรณ์เครื่องใช้ไฟฟ้าได้ ต่อ PIN เดิมจากตอนที่แล้ว

     

    ความต้องการเบื้องต้นคือ
    1. เมื่ออุณหภูมิต่ำกว่าหรือเท่ากับ 28 องศา ให้เปิดพัดลมระบายอากาศ 1 (ที่ต่ออยู่กับ Relay 1)
    2. เมื่ออุณหภูมิสูงกว่า 28 องศา ให้ปิดพัดลมระบายอากาศ 1 และเปิดพัดลมระบายอากาศ 2 (ต่ออยู่กับ Relay 2)
    3. เมื่อความชื้นต่ำกว่า 50% ให้เปิดเครื่องสร้างความชื้น (Humidifier) (ต่ออยู่กับ Relay 3)  โดยไม่ต้องสนใจอุณหภูมิ

    เริ่มเขียนโค้ดเพื่อทำการประมวลผลกันเลย (โค้ดบางส่วน ได้อธิบายไว้ในตัวอย่างบทความก่อนหน้านี้แล้ว)

     

    ทำการติดตั้ง Library Adafruit จากบทความก่อนหน้านี้ Raspberry Pi 3 [Temperature & Humidity Sensor]

    จากนั้นทำการเขียน python ด้วยคำสั่ง

    sudo nano automated_relay.py

    ด้วยโค้ดต่อไปนี้

     

    import os
    import time
    import datetime

    while True :
     temperature = os.popen(‘sudo /home/pi/sources/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12 | cut -c 6-7’).read()
     humidity = os.popen(‘sudo /home/pi/sources/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 12 | cut -c 22-23’).read()
     now = datetime.datetime.now()

     print ”
     print ”
     print now.strftime(“%d-%m-%Y %H:%M:%S”)
     print ‘Temperature: ‘ + temperature + ‘Humidity: ‘ + humidity

     if int(temperature) <= 28:
      os.popen(‘sudo python /var/www/html/relay_off.py 2’).read()
      os.popen(‘sudo python /var/www/html/relay_on.py 1’).read()
      print ‘Temperature below 28C ==> Relay 1: ON. Relay 2: OFF’
     else:
      os.popen(‘sudo python /var/www/html/relay_off.py 1’).read()
      os.popen(‘sudo python /var/www/html/relay_on.py 2’).read()
      print ‘Temperature above 28C ==> Relay 1: OFF. Relay 2: ON’

     if int(humidity) < 50:
      os.popen(‘sudo python /var/www/html/relay_on.py 3’).read()
      print ‘Humidity below 50% ==> Relay 3: ON’
     else:
      os.popen(‘sudo python /var/www/html/relay_off.py 3’).read()
      print ‘Humidity above 50% ==> Relay 3: OFF’

     time.sleep(5)

     

     

    จากนั้นเซฟและทดลองรันด้วยคำสั่ง python automated_relay.py

    พบว่ารีเลย์ทำงานได้ตามต้องการและได้ผลดังรูปนี้

    จากรูปด้านบน เมื่ออุณหภูมิอยู่ที่ 24 องศา ความชื้น 48% จะทำการ ON Relay 1 และ OFF Relay 2 และ ON Relay 3
    จากนั้นทำการรอไป 5 วินาที จากนั้นจึงอ่านค่าใหม่ วนแบบนี้เรื่อยๆ
    และเมื่อความชื้นสูงกว่า 50% ก็จะทำการ OFF Relay 3 ขึ้นมา โดยไม่ได้สนใจอุณหภูมิ
    จากนั้นเมื่ออุณหภูมิสูงกว่า 28 องศา ก็จะทำการ OFF Relay 1 และ ON Relay 2 ตามโปรแกรมที่เราเขียนเอาไว้

     

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

     

    การนำไปประยุกต์ใช้ ขึ้นอยู่กับความต้องการเป็นหลัก ซึ่งมีเซนเซอร์ให้เลือกใช้มากมาย เช่น

    • หากเราต้องการให้เปิดไฟเมื่อมีคนเดินผ่าน เราสามารถใช้ Passive Infrared Sensor (PIR) มาจับความเคลื่อนไหวและความร้อนของวัตถุ (จากรังสี Infrared ที่ปล่อยออกมา) และนำไป Trig Relay ได้ทันที
    • ระบบรดน้ำอัตโนมัติ เมื่ออุณหภูมิหรือความชื้นหรือเวลา ตรงกับเงื่อนไขที่เราตั้งไว้ ให้ Trig Relay ที่ต่อกับ Solinoid Valve (วาล์วน้ำไฟฟ้า ที่จะเปิดเมื่อมีไฟไหลผ่าน) เพื่อรดน้ำต้นไม้
    • ระบบระบายความร้อน หรือ HVAC ที่จะทำงานตามเงื่อนไขอุณหภูมิและความชื้น โดยสามารถโปรแกรมให้มีการเปรียบเทียบอุณหภูมิจากภายในและภายนอก ให้พัดลมระบายอากาศทำงานตามที่กำหนด
    • ฯลฯ

     

    จากบทความเรื่อง Raspberry PI ทั้งหมดที่เขียนมา จะเห็นว่าเป็นเรื่องเกี่ยวกับการเล่นกับอุปกรณ์ Input/output เท่านั้น ซึ่งแท้จริงๆแล้ว Raspberry PI นั้นมีความสามารถมากกว่านี้อีกเยอะ ซึ่งหากว่าท่านต้องการทำแค่ระบบ Automation หรือ IoT ในบ้านง่ายๆ ยังมี Solution อื่น ที่ประหยัดงบประมาณมากกว่านี้คือการเลือกใช้ Arduino Board ซึ่งจะเป็นการทำงานแบบ Microcontroller เข้ามาทำงานในส่วนประมวลผลง่ายๆ ไม่ซับซ้อน ที่สำคัญหรือราคาถูกกว่าครึ่ง (เฉพาะบอร์ด)

     

    ผิดพลาดประการใด ขออภัยมา ณ โอกาสนี้ครับ

    ขอบคุณครับ

     

     

     

     

     

     

  • Raspberry Pi 3 [Relay Control via Web Interface]

    ตอนนี้เราจะมาสร้างหน้าเว็บสำหรับดูสถานะและควบคุมรีเลย์อย่างง่ายๆ

     

    ก่อนอื่น ผมได้ทำการเปลี่ยน PIN ของ GPIO บน Raspberry Pi 3 เพื่อให้เป็นระเบียบมากขึ้นจากครั้งที่แล้ว
    โดยผมได้เลือกใช้ PIN: 12 (GPIO 18), PIN: 16 (GPIO 23), PIN: 18 (GPIO 24) และ PIN: 22 (GPIO 25) สำหรับสั่งงานรีเลย์ตัวที่ 1-4 ตามลำดับ ดังรูปด้านล่างนี้

     

    หลังจากการทดสอบการทำงานของรีเลย์ทุกตัว (ในบทความที่แล้ว) จากนั้นเราจึงเริ่มขึ้นตอนการติดตั้ง Apache Web Server, PHP และเขียนหน้าเว็บ ดังขั้นตอนต่อไปนี้ครับ

     

    ติดตั้ง Apache Web Server และ PHP ดังนี้

    ใช้คำสั่ง sudo apt-get install apache2 เพื่อติดต้ัง apache web server

    (หากขึ้นว่า Package apache2 is not available ให้ใช้คำสั่ง sudo nano /etc/apt/sources.list  จากนั้น uncomment บันทัดสุดท้าย เซฟไฟล์และใช้คำสั่ง sudo apt-get update เมื่อเรียบร้อยแล้วให้ลองใช้คำสั่งด้านบนอีกครั้ง)

    จากนั้นทดสอบเปิดเว็บด้วย

    http://localhost/ หรือ http://{RASPBERRY_IP}/

     

    จากนั้นติดตั้ง PHP5 Module สำหรับ Apache

    sudo apt-get install php libapache2-mod-php

     

    เมื่อเรียบร้อยแล้ว ให้ใช้คำสั่งต่อไปนี้

    cd /var/www/html

    เนื่องจากไฟล์ index.html จะมีเจ้าของเป็น root ทำให้ไม่สามารถแก้ไขหรือลบได้ ให้ใช้คำสั่งเปลี่ยน owner ดังนี้

    sudo chown pi: index.html

    จากนั้นทำการลบไฟล์ index.html เพราะเราไม่ใช้

    ใช้คำสั่ง sudo nano index.php เพื่อสร้างไฟล์และเขียนโค้ดต่อไปนี้ เพื่อทดสอบการทำงานของ php

    <?php phpinfo(); ?>

    และลองเปิดหน้าเว็บดู จะพบกับหน้านี้ ถือว่าติดตั้งเสร็จเรียบร้อยแล้ว

     

    จากนั้นเพิ่ม user ของ apache นั่นคือ www-data ให้สามารถใช้คำสั่ง sudo ได้ ด้วยวิธีการต่อไปนี้

    sudo nano /etc/sudoers

    จากนั้นเพิ่มบันทัดต่อไปนี้ลงไปท้ายสุด

    www-data ALL=(ALL) NOPASSWD: ALL

    และเพื่อความสะดวก ทุกท่านสามารถดาวน์โหลดไฟล์ที่ผมได้ทำเอาไว้แล้ว ==> relay_control_via_web.zip
    (สามารถแก้ไขรูปแบบการแสดงผลให้สวยงามขึ้นได้ในภายหลังได้ด้วยตัวท่านเอง) และทำการ copy file ไปไว้ที่ /var/www/html

     

    โดยหลักการทำงานคือ

    เมื่อมีการเปิดหน้าเว็บขึ้นมา จะเรียกไฟล์ index.html และจะทำการ post ajax firstcheck.php เพื่อทำการตรวจสอบสถานะของรีเลย์ (ซึ่งภายใน firstcheck.php จะเป็นการเรียกคำสั่ง python firstcheck.py และส่งค่ากลับเป็น json)

    เมื่อมีการสั่งงานรีเลย์ จะทำการ post ajax changestate.php โดยที่ไปเรียกคำสั่ง relay_off หรือ relay_on (มี parameter คือชุดของรีเลย์ ที่ได้ทำการเซฟค่า BCM GPIO ID เอาไว้ในไฟล์ .py ดังกล่าวแล้ว) เพื่อเป็นการสั่งให้รีเลย์ดังกล่าว ทำงาน

    (เพื่อความปลอดภัย ในกรณีที่ท่านต้องการแยกไฟล์ .py ออกจาก web root directory /var/www/html ท่านสามารถทำได้ โดยท่านจะต้องทำการแก้ไขไฟล์ .php ให้เรียก path ที่ถูกต้อง – และตรวจสอบ permission execute ของไฟล์สำหรับ user: www-data ด้วย)

     

    ทดสอบลองเปิดหน้าเว็บ
    (เว็บถูกพัฒนาขึ้นด้วย bootstrap ดังนั้น จะสามารถใช้งานผ่านหน้าจอมือถือได้ทันที เพียงเรียก http://RASPBERRY_IP/)

             
    ทดสอบการแสดงผลและการสั่งงานบน Google Chrome ทั้งบน iOS และ PC

     

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

     

    ผิดพลาดประการใด ขออภัยมา ณ โอกาสนี้ครับ

    ขอบคุณครับ