Month: March 2020

  • มาทำความรู้จักกับพื้นฐานการใช้งาน “TreeView” สำหรับมือใหม่กันดีกว่า

              เชื่อว่านักพัฒนาโปรแกรม Web application ด้วย .Net หลายๆท่านอาจจะเคยได้ยินชื่อของเจ้า “TreeView” กันมาบ้างแล้ว หรือบางท่านก็อาจจะเกือบลืมเจ้าเครื่องมือตัวนี้ไปแล้วก็ตามเพราะมันอาจจะไม่ใช่เครื่องมือที่ถูกหยิบมาใช้บ่อยนัก ในบทความนี้ผู้เขียนจึงขอหยิบยกเจ้า “TreeView” มาปัดฝุ่น แนะนำลูกเล่นการใช้งาน การกำหนดคุณสมบัติต่างๆ และวิธีการใช้งานกันอย่างคร่าวๆก่อน เพื่อเป็นการปูพื้นฐานให้กับมือใหม่หัดใช้ TreeView และรื้อความทรงจำให้กับผู้ที่เคยใช้ TreeView มาก่อนหน้านี้ เผื่อความสามารถที่ซ่อนอยู่จะไปเตะตาตรงใจท่านใดที่กำลังมองหาการทำงานแบบนี้อยู่พอดี จนอยากนำเครื่องมือตัวนี้ไปประยุกต์ใช้เป็นอีกหนึ่งทางเลือกในการแสดงผลข้อมูลในงานพัฒนาของท่านกันอีกครั้งได้ค่ะ
              แต่ก่อนจะพูดถึงลูกเล่นการทำงานของ TreeView คงต้องเกริ่นนำกันก่อนว่าเจ้าเครื่องมือตัวนี้ถูกจัดอยู่ในจำพวก Navigation Control ซึ่งบางคนอาจเกิดคำถามว่า ข้อมูลแบบใดบ้างจึงจะเหมาะนำมาใช้งานแสดงผลกับเจ้า TreeView นี้ ซึ่งโดยความเห็นส่วนตัวแล้วนั้น ผู้เขียนคิดว่าข้อมูลที่เหมาะจะมาแสดงผลด้วย TreeView ควรจะเป็นข้อมูลที่มีลักษณะเป็นแบบ Hierarchy หรือเป็นลักษณะโครงสร้าง มีลักษณะข้อมูลเป็นลำดับชั้นย่อยๆ เช่น โครงสร้างหน่วยงาน โครงสร้างองค์กร หรือข้อมูลที่เป็นประเภทหลักและประเภทย่อย เป็นต้น และเพื่อไม่ให้เป็นการเสียเวลา เรามาเรียนรู้วิธีจัดการกับ TreeView ของเรากันเลยดีกว่าค่ะ

    ขั้นตอนสร้าง TreeView อย่างง่ายจาก Tool box ของ Visual studio .Net สามารถทำได้ดังนี้

    1. สร้าง TreeView โดยเลือกจากแท็บเครื่องมือ ในกลุ่ม Navigation มาวางในหน้าจอ design ของเรา ดังรูป


    2. การเพิ่มและจัดการ node ให้กับ TreeView ได้โดยการคลิกเลือก “Edit Nodes…” ดังภาพ


    3. การจัดการเพิ่ม-ลดข้อมูล node ในระดับต่างๆ จะแสดงภาพดังหน้าจอต่อไปนี้ เพื่อใช้ในการจัดการเพิ่ม-ลดข้อมูล node ในระดับต่างๆ ดังนี้



      โดยขั้นตอนการเพิ่ม – ลด node อย่างคร่าวๆ มีดังนี้
      • การเพิ่ม node ที่เป็น root (ลำดับแรกสุด) โดยการกดปุ่ม
      • การเพิ่ม node ระดับย่อย(child node) โดยการกดปุ่ม
      • การลบ node ที่ไม่ต้องการ สามารถทำได้โดยการกดปุ่ม
      • ปรับเปลี่ยนระดับความลึกของ node โดยคลิกเลือก node ที่ต้องการจัดการและกดปุ่ม เพื่อเลื่อนระดับความลึกมากน้อยได้ตามต้องการ ซึ่งจะเห็นได้ว่ามีการทำงานคล้ายกับการเยื้องย่อหน้าใน MS Word ที่เราคุ้นเคยกันดี
      • การเลื่อนลำดับบน-ล่างให้กับ node สามารถทำได้โดยกดปุ่ม

        ตัวอย่าง หน้าจอการจัดการ node ใน TreeView



                      จากภาพตัวอย่าง มีการเพิ่มและจัดการ node ข้อมูลโครงสร้างองค์กรตั้งแต่ระดับมหาวิทยาลัย วิทยาเขต และคณะ โดยการกำหนดค่าตายตัวจากหน้าจอ design ด้วยการระบุเอง ไม่ได้ดึงจากฐานข้อมูล ซึ่งท่านสามารถทดลองเพิ่มและจัดการได้ด้วยตัวเองเพื่อให้เข้าใจการทำงานมากขึ้น โดยลองทำตามขั้นตอนการจัดการ node ข้างต้น
                      นอกจากการเพิ่ม-ลด node แล้ว ท่านยังสามารถกำหนดคุณสมบัติให้กับ node ได้ด้วย โดยคลิกข้อมูล node ที่ต้องการจัดการจากฝั่งซ้ายมือ และกำหนดคุณสมบัติของ node ดังกล่าวในฝั่งขวามือ ซึ่งรายละเอียดการกำหนดคุณสมบัติต่างๆ ในแต่ละ node จะขอพูดในหัวข้อถัดไป (ข้อ 4.)ค่ะ

    4. กำหนดคุณสมบัติให้กับแต่ละ node เราสามารถกำหนดคุณสมบัติ (Properties) เฉพาะให้กับแต่ละ node ได้ โดยจะขอพูดถึงคร่าวๆ ที่คิดว่าน่าจะใช้อยู่บ่อยๆและน่าสนใจ ดังนี้
      • ShowCheckBox : เป็นการระบุว่าจะให้ node ดังกล่าวแสดงช่องให้เลือกหรือไม่
      • Checked : เป็นการระบุว่า ต้องการให้มีการทำเครื่องหมายถูกไว้ในกล่อง check box หรือไม่ ซึ่งต้องมีการกำหนดควบคู่กับ ShowCheckBox = “true” นั่นเอง
      • Text : ระบุว่าต้องการให้ node ดังกล่าวแสดงข้อความอะไร
      • Value : ระบุค่าที่จะกำหนดให้กับ node ดังกล่าว และสามารถเลือกดึงค่าไปใช้งานได้(ในกรณีที่จะนำไปพัฒนาโปรแกรมต่อ)
      • NavigateUrl : กำหนดว่าเมื่อกด node ดังกล่าวจะให้ไปยังหน้าจอใด โดยระบุชื่อเพจหน้าจอนั้น
      • Target : เป็นการระบุการเปิดเพจในกรณีที่มีการกำหนด NavigateUrl ไว้ว่าจะให้เปิดเพจใหม่ หรืออยู่ในหน้าเดิมนั่นเอง
      • ImageUrl : เป็นการระบุว่าต้องการให้แสดงเป็นรูปภาพอะไรหน้าข้อความใน node นั้นๆ
      • Selected : เป็นการระบุว่าจะให้ node ดังกล่าวสามารถคลิกลิงค์ได้หรือไม่
      • SelectAction : กำหนด action ที่จะให้ทำตอนกดเลือกลิงค์ใน node นั้น
        1) Expand : เมื่อหากต้องการให้คลิกแล้วขยาย node ย่อย ซึ่งเมื่อคลิกแล้วจะย่อ-ขยาย node ย่อยได้
        2) SelectExpand : จะเป็นการระบุให้มีการขยาย node เช่นกัน แต่จะต่างกันตรงที่เมื่อขยาย node ย่อยแล้วจะไม่ย่อ-ขยายให้อีกแบบ Expand นั่นหมายถึงว่าจะสามารถคลิกลิงค์ของ node เพื่อขยายได้เท่านั้น แต่จะไม่สามารถย่อกลับมาได้นั่นเอง
        3) None : เมื่อไม่ต้องการให้คลิกได้
      • ToolTip : เป็นการระบุข้อความที่ต้องการให้แสดงเมื่อชี้ไปที่ node นั้นๆ
      • Expanded : เป็นการกำหนดว่า ตอนเริ่มต้นจะให้ node ย่อยของ node ดังกล่าวขยายไว้หรือไม่

        ตัวอย่าง ผลลัพธ์จากการกำหนดลองกำหนดค่าต่างๆให้กับบาง node


                      จากภาพ จะเห็นว่าแต่ละ node มีการแสดงผลแตกต่างกันตามที่เราระบุ เช่น บาง node มีการกำหนดให้แสดงภาพหน้าข้อความ บาง node ไม่สามารถคลิกลิงค์ได้ เช่น มหาวิทยาลัยสงขลานครินทร์ และบาง node มี check box อยู่หน้าข้อความให้เลือก และบาง node มีการยุบ node ย่อยไม่แสดงในตอนเริ่มต้น เป็นต้น
    5. กำหนดคุณสมบัติให้กับทุก node จาก properties ของคอนโทรล TreeView ซึ่งจะแตกต่างจากการกำหนดในแต่ละ node ในข้อ 4. เนื่องจากวิธีการกำหนดคุณสมบัติแบบนี้ จะเหมาะกับกรณีที่ไม่ต้องการระบุคุณสมบัติแยกในแต่ละ node แต่ต้องการให้เป็นไปในแบบเดียวกันทั้ง TreeView ทำให้ลดระยะเวลาที่จะต้องกำหนดรูปแบบให้กับทุก node ที่ต้องการให้แสดงผลเหมือนกัน โดยจะขอยกตัวอย่างให้กับคุณสมบัติบางตัวที่อาจจะจำเป็นต้องใช้ ดังนี้
      • ShowCheckBox : เป็นการกำหนดคุณสมบัติคล้ายกับที่กำหนดให้กับแต่ละ node แต่หากมากำหนดที่ตรงนี้ จะทำให้ทุก node แสดงหรือซ่อนกล่อง check box ได้จากจุดเดียว โดยมีให้เลือก 4 ตัวเลือก ดังนี้

        1) All : กำหนดให้ทุก node แสดง check box

        ตัวอย่าง ผลลัพธ์จากการกำหนด ShowCheckBox =”All”


        จากภาพจะเห็นว่า มี check box อยู่ในแต่ละ node ทั้งหมด โดยการกำหนดที่คุณสมบัติ ShowCheckBox =”All” นี้ที่จุดเดียว โดยไม่ต้องไปกำหนดที่แต่ละ node

        2) Leaf : กำหนดให้แสดง check box เฉพาะ node ลูกที่ไม่มี node ย่อย

        ตัวอย่าง ผลลัพธ์จากการกำหนด ShowCheckBox =”Leaf”


        จากภาพจะเห็นว่า จะแสดงผล check box เฉพาะ node ที่เป็นลูก และไม่มี node ย่อยอีก ซึ่งเรียก node แบบนี้ว่า “Leaf” นั่นเอง

        3) None : ไม่แสดง Checkbox ใน node ใดๆ เลย

        ตัวอย่าง ผลลัพธ์จากการกำหนด ShowCheckBox =”None”


        จากภาพจะเห็นว่า ไม่แสดงผล check box ใน node ใดๆเลย

        4) Parent : เป็นการแสดง check box เฉพาะตำแหน่ง node ที่มีลูก หรือ child node ที่ไม่ใช่ root node นั่นเอง

        ตัวอย่าง ผลลัพธ์จากการกำหนด ShowCheckBox =”Parent”


        จากภาพจะเห็นว่า จะแสดง check box เฉพาะ node ที่มีลูกในระดับย่อย และต้องไม่ใช่ root node นั่นเอง

        5) Root : จะแสดง check box เฉพาะตำแหน่ง root หรือ node ระดับแรกสุดเท่านั้น

        ตัวอย่าง ผลลัพธ์จากการกำหนด ShowCheckBox =”Root”

        จากภาพจะเห็นว่า จะแสดงผล check box ใน node ที่อยู่ในระดับ root หรือระดับแรกสุดนั่นเอง

      • ShowExpandCollapse : เป็นการระบุว่าต้องการให้แสดงตัวย่อ-ขยาย ที่เป็นเครื่องหมาย + และ – เพื่อย่อขยาย TreeView หรือไม่ หากกำหนดเป็น false จะไม่สามารถย่อ-ขยาย TreeView ดังกล่าวได้ โดยค่าตั้งต้นจะเป็น true ซึ่งหมายถึงสามารถย่อ-ขยายได้นั่นเอง

        ตัวอย่าง การกำหนดคุณสมบัติ ShowExpandCollapse =”false”

        จากภาพจะเห็นว่า ไม่สามารถย่อ-ขยายข้อมูลของ TreeView แต่ละ node ได้เลย

      • BorderStyle : เป็นการกำหนดรูปแบบของเส้นขอบของ TreeView ที่เราต้องการได้ เช่น solid dashed dotted เป็นต้น

        ตัวอย่าง การกำหนดคุณสมบัติของเส้นขอบ BorderStyle เป็น Double


      • CollapseImageUrl : เป็นการระบุ url ภาพที่ต้องการนำมาใช้แสดงแทนเครื่องหมาย – เพื่อให้กดแล้วย่อ node ย่อย
      • ExpandImageUrl : เป็นการระบุ url ภาพที่ต้องการนำมาใช้แสดงแทนเครื่องหมาย + เพื่อให้กดแล้วขยาย node ย่อย
      • NoExpandImageUrl : เป็นการระบุ url ภาพที่ต้องการนำมาใช้แสดงในกรณีที่ node ดังกล่าวไม่มี node ย่อย

        ตัวอย่าง ผลลัพธ์ของการระบุค่าของ CollapseImageUrl ให้เป็นรูปเครื่องหมายลบ กำหนดค่า ExpandImageUrl ให้เป็น url ของรูปที่เป็นเครื่องหมายบวก และกำหนด NoExpandImageUrl เป็นรูปไอคอนสีฟ้า ดังรูป

        หมายเหตุ : รูปภาพที่กำหนดในการย่อ-ขยายจะแสดงผลเมื่อ ShowLines เป็น false เท่านั้น

      • ImageSet : เป็นการกำหนดภาพที่ต้องการให้แสดงหน้า node ลักษณะคล้ายกับ bullet ดังตัวอย่างในภาพ



        จากภาพ จะเห็นว่าในฝั่งซ้ายมือ จะมี “ตัวเลือกรูปแบบ” ให้เลือกหลายแบบด้วยกัน และเมื่อเราคลิกแต่ละรูปแบบจะมีตัวอย่างผลลัพธ์แสดงให้ดูฝั่งขวามือ ซึ่งท่านสามารถเลือกให้เหมาะสมกับเนื้อหาในข้อมูลของท่านได้ หรือจะกำหนดรูปแบบเองจากคุณสมบัติที่กล่าวไว้ก่อนหน้านี้ได้นั่นเอง โดยท่านสามารถเลือกกำหนดคุณสมบัติเช่นนี้ได้จากการคลิกเลือก “Auto Format” ได้เช่นกัน ดังภาพ



        เมื่อเราคลิกเลือก “Auto Format…” จะปรากฎภาพหน้าจอดังนี้



        ซึ่งจะเห็นได้ว่า มีลักษณะการจัดการเดียวกับตอนเรากำหนดคุณสมบัติจาก ImageSet นั่นเอง

      • การกำหนด style ให้กับ node แต่ละแบบ ไม่ว่าจะเป็น LeafNodeStyle NodeStyle ParentNodeStyle หรือ RootNodeStyle ท่านก็สามารถกำหนดรูปแบบและตกแต่งความสวยงามให้กับ node แต่ละแบบได้ เช่น การใส่พื้นหลัง สีตัวอักษร หรือ แม้กระทั่งการระบุ style sheet ที่จัดทำไว้ก็สามารถทำได้เช่นกัน

      • LevelStyles : เป็นการกำหนด Style ให้กับแต่ละ level โดยจะเรียงตามลำดับ style ของแต่ละ node เริ่มจาก root ตามลำดับ ดังภาพ



        ตัวอย่าง ผลลัพธ์ของการกำหนด LevelStyles 3 ระดับข้างต้น โดยกำหนดให้ Level แรก มีสีตัวอักษรเป็นสีม่วง และ Level ที่ 2 มีสีตัวอักษรเป็นสีชมพู และ Level ที่ 3 มีตัวอักษรสีเขียว ดังภาพ



      • ExpandDepth : เป็นการกำหนดว่าจะให้การแสดงผล TreeView ขยายเริ่มต้นที่กี่ระดับ โดยค่าตั้งต้นจะเป็นแบบ FullyExpand ซึ่งหมายถึงขยายทั้งหมดตอนเริ่มต้น

        ตัวอย่าง ผลลัพธ์การระบุ ExpandDepth = “1”

      • DataSourceID : เป็นการระบุแหล่งข้อมูลให้กับการแสดงผล TreeView ให้มาจากการดึงข้อมูล ไม่ใช่การระบุค่า node ตายตัวจากหน้าเพจ
      • NodeIndent : ระยะการเยื้องหน้าของ node แต่ละระดับ โดยมีค่าตั้งต้นเท่ากับ 20 ซึ่งท่านสามารถลดหรือเพิ่มได้ตามความเหมาะสม
      • ShowLines : เป็นการระบุว่าต้องการให้แสดงเส้นโยงเชื่อมของ node แต่ละระดับหรือไม่
      • SelectedNodeStyle : เป็นการกำหนด style ให้กับ node ที่โดนเลือกคลิก เช่น การระบุพื้นหลัง หรือการกำหนดสีตัวอักษร เป็นต้น
        ตัวอย่าง ผลลัพธ์การระบุ SelectedNodeStyle ให้พื้นหลังเป็นสีม่วงและตัวอักษรสีขาว โดยเมื่อคลิกที่ node ใดก็ตามก็จะแสดงผลดังที่ได้ระบุไว้ที่ node นั้น

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

  • วิธีส่ง email ออกไปในนามหน่วยงาน ด้วย PSU Webmail

    เนื่องจาก ตอนนี้มีหลายหน่วยงาน มีความต้องการใช้ “email ส่วนกลาง” ที่เป็น Mailbox แยกจากบุคคล กันมามาก
    จึงขอเรียนให้ทราบถึงปัญหาที่หน่วยงานของท่านจะเจอ ก่อนจะตัดสินใช้วิธีการดังกล่าว

    1. ไม่รู้ใครอ่าน
    2. ไม่รู้ว่าใครส่งออกไป
    3. ไม่รู้ว่าใครลบ email สำคัญนั้น
    4. ไม่รู้ว่าใครเปลี่ยนพาสเวิร์ด

    วิธีที่ทำกันมาตลอด คือ การสร้าง Groupmail นั้น

    • แต่ละกลุ่ม มีสมาชิกผู้รับได้หลายคน ทำให้ช่วยกันดูแลได้
    • การส่งออก สามารถตั้งได้ว่า ส่งออกไปในนามหน่วยงาน และสามารถตรวจสอบได้ว่า ใครเป็นคนส่ง
    • สามารถสร้าง Archive ได้ หมายความว่า ย้อนกลับมาดูได้ว่า เรื่องเหล่านี้ พูดคุยกันไปว่าอย่างไรบ้าง
    • สมาชิกบางคน ลบ email ไป แต่ การสนทนา ยังอยู่
    • หมดปัญหา 1 account แต่รู้รหัสผ่านกันหลายคน

    สำหรับวิธีการตั้งค่า ให้ แต่ละคนในกลุ่ม ส่งออกไปในนามหน่วยงานได้ บน PSU Webmail

    1. คลิกที่ เมนู Options

    2. คลิก Personal Information

    3. คลิก Edit Advanced Identities

    4. จากนั้น กรอกข้อมูล Full Name, E-Mail Address และ Signature

    มีข้อที่ *** ต้องห้าม *** อยู่อย่างนึงคือ Fullname ต้องไม่มีเครื่องหมายพิเศษใด ๆ โดยเฉพาะ เครื่องหมาย “.” จากนั้น กดปุ่ม Save/Update

    5. เมื่อต้องการส่ง Email แบบ Compose สามารถเลือกได้ว่า ต้องการให้ออกไปนามหน่วยงาน

    เมื่อผู้รับได้รับ ก็จะเห็นแบบนี้

    ครับ

  • How to create LVM volume group and logical volume

    LVM ย่อมาจาก Logical Volume Manager ความสามารถของ LVM คือสามารถสร้าง logical partition ขยายไปบนฮาร์ดดิสก์หลายๆ ลูกได้ ขั้นตอนต่อไปนี้เป็นขั้นตอนที่ทำบน CentOS หรือ Oracle Linux หรือ ค่าย Redhat Enterprise Linux ส่วนฝั่ง Debian ก็สามารถใช้คำสั่งเดียวกันทำงานเหมือนกัน แต่อาจจะต้องติดตั้งโปรแกรมเพิ่ม

    โดยขนาดสูงสุดที่ LVM ทำได้ขึ้นกับชนิดของ CPU และ Kernel ที่ใช้งาน

    • สำหรับ Kernel 2.4 บน CPU 32-Bit มีขนาดได้ไม่เกิน 2TB
    • สำหรับ Kernel 2.6 บน CPU 32-Bit มีขนาดได้ไม่เกิน 16TB
    • สำหรับ Kernel 2.6 บน CPU 64-Bit มีขนาดได้ไม่เกิน 8EB
    • ป้จจุบัน Kernel รุ่น ? CPU 64-Bit ยังไม่มีคำตอบ

    แต่เมื่อ format ให้มีระบบไฟล์แบบ ext4 จะสร้างพาทิชั่นได้ไม่เกิน 1EB เท่านั้น

    ขึ้นกับ file system ใช้งานด้วย
    • เริ่มได้
    • เข้าระบบด้วยบัญชีผู้ใช้ที่มีสิทธิ์ของ root ซึ่งอาจจะเป็น root เอง หรือ user ที่อยู่ในกลุ่ม wheel หากเข้าด้วยบัญชีผู้ใช้อื่นๆ ที่ไม่ใช่ root ให้สั่งคำสั่ง
    su -
    ตามด้วยรหัสผ่านของ root

    หรือ

    sudo -i
    ตามด้วยรหัสผ่านของผู้ใช้ที่เรียกคำสั่งนี้

    จึงจะสามารถทำคำสั่งต่อไปได้

    • ตรวจสอบว่ามีฮาร์ดดิสก์ลูกไหนถูกใช้งานอยู่บ้างด้วยคำสั่ง
    df -h
    • ได้ผลลัพธ์ประมาณดังรูป
    df
    df
    • จากภาพข้างต้น /dev/sda ถูกใช้งานอยู่แล้วคือ /dev/sda1 และ /dev/sda2 ให้ตรวจสอบว่ามีดิสก์ลูกอื่นอีกหรือไม่ด้วยคำสั่ง
    fdisk -l|grep /dev
    fdsik
    fdisk
    • จะเห็นว่ามี /dev/sdb, /dev/sdc และ /dev/sdd ที่ว่างอยู่
    • จะใช้ /dev/sdb
    • เริ่มจากสร้างพื้นที่สำหรับทำ LVM ก่อนด้วยคำสั่ง
    fdisk /dev/sdb

    กด n ตามด้วย p ตามด้วย 1 แล้ว enter 2 ครั้ง

    กด t แล้วพิมพ์ 8e แล้วกด w ดังภาพ

    fdisk
    fdisk
    • สร้าง LVM physical volume โดยใช้คำสั่ง pvcreate
    pvcreate /dev/sdb1
    • สร้าง LVM volume group ชื่อ vg_u01
    vgcreate vg_u01 /dev/sdb1
    • สร้าง LVM logical volume group ชื่อ lv_u01 ใน volume group ที่ชื่อ vg_u01 โดยให้มีขนาดทั้งหมดที่มีอยู่ใน vg_u01
    lvcreate -n lv_u01 -l 100%FREE vg_u01

    ดังภาพ

    pvcreate, vgcreate, lvcreate
    pvcreate, vgcreate, lvcreate
    • ดูสถานะว่า LVM สร้างเสร็จแล้วด้วยคำสั่ง
     pvscan
    pvscan
    • ดูสถานะว่ามี Physical Volume เท่าไหร่ ด้วยคำสั่ง
    pvdisplay
    pvdisplay
    • ก่อนใช้งานอย่าลืม format โดย device ที่จะต้อง format จะกลายเป็น /dev/vg_u01/lv_u01 ให้มีชื่อว่า u01
    mkfs.ext4 -L u01 /dev/vg_u01/lv_u01
    mkfs.ext4
    • สร้าง mount point ให้กับ lv_u01
    mkdir /u01
    • mount lv_u01 เข้ากับ /u01
    mount LABEL=u01 /u01
    • ตรวจสอบว่า /u01 ถูกเรียกใช้งานแล้ว ใส่ -h เพื่อให้ระบุขนาดเป็น GMK
    df -h
    mkdir, mount, df
    • สั่งให้ mount อัตโนมัติทุกครั้งที่บูตเครื่องเพิ่มข้อความต่อไปนี้ในแฟ้ม /etc/fstab
    LABEL=u01       /u01    ext4    defaults 0 0
    fstab
    • จบขอให้สนุก
    • อาจจะยังไม่เห็นภาพว่าแล้วมันกระจายไปดิสก์หลายๆ ลูกได้อย่างไร อธิบายง่ายๆ /u01 สามารถอยู่ได้บนฮาร์ดดิสก์มากกว่าหนึ่งลูก โดยเห็นเป็นพื้นที่เดียวกันคือ /u01 ซึ่งอาจจะประกอบไปด้วย /dev/sdb1, /dev/sdc1 ใน vg_u01
    • ยังมีเรื่องการเพิ่มขนาดภายหลังให้ดูที่ http://portal.psu.ac.th/blog/howto/6281 ไปพลางก่อน
  • วิธีสร้าง Live Stream ด้วย Google Meet เพื่องานประชุมขนาดใหญ่ — Deprecated

    ต่อจาก ทุกคนใน PSU ใช้ Google Meet สำหรับประชุม / การเรียนการสอน ได้ใน 3 ขั้นตอน

    การประชุม มี 2 รูปแบบ

    1) แบบห้องประชุมเล็ก

    อาจจะเป็นการประชุมเล็ก ทุกคนสามารถพูดแทรกได้ (Discussion) เป็นแนวระดมความคิด (Brainstorm) นึกถึงห้องประชุมที่ทุกคนนั่งหันหน้าเข้าหากัน บนโต๊ะอาจจะมีไมโครโฟนของแต่ละคน ใครจะพูด ก็ยกมือ ขออนุญาตประธาน แล้วกดปุ่มพูด

    การประชุมแบบนี้ Google Meet ให้คนเข้าร่วมได้สูงสุด 250 คน

    ** ข้อแนะนำ ** ผู้เข้าร่วมประชุม ควรปิดไมค์ของตนเองไว้ก่อนเสมอ เพราะเสียงต่าง ๆ จะแทรกเข้าไปในห้องประชุมได้ ไว้เวลาอยากจะพูดอะไร ค่อยเปิดไมค์ แล้วพูด Google Meet จะสลับมายังหน้าของท่านเองอัตโนมัติ

    ปิดไมค์ใน Google Meet ทำงี้ครับ (แบบนี้คือเปิดอยู่ คลิกรูปไมค์เพื่อปิด)

    อย่างนี้ คือปิดเสียงแล้ว

    2) แบบห้องประชุมเปิดขนาดใหญ่

    AfricaBusinessConferernc.jpg
    Image Source: https://www.africastrictlybusiness.com/africa-business-club-at-harvard-spotlights-inclusion-innovation/

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

    ในกรณีนี้ Google Meet สามารถรองรับการเข้าชม “พร้อม ๆ กัน” ได้ถึง 100,000 คน เรียกว่า “Live Stream”

    ในทางเทคนิคการใช้งาน หากผู้เข้าร่วมประชุมท่านใด ต้องการพูดกับผู้บรรยาย ก็ค่อย สลับเข้าร่วม (Join Meeting) ได้ ซึ่งก็จะสอบถามได้พร้อมกัน 250 คน

    วิธีทำ Live Stream บน Google Meet

    Live Stream ต้อง “เริ่มต้น” จาก Google Calendar เท่านั้น

    1 สร้าง Event บน Google Calendar

    (ของ PSU เท่านั้น, Free Gmail ทำไม่ได้)

    เริ่มจาก คลิก วันที่ต้องการบรรยาย แล้ว ใส่ชื่อ Event เลือกช่วงเวลา แล้วคลิก More Options

    2 เลือก Add Conference > Hangout Meet

    3 เลือก Add live stream

    4 Copy live stream link

    เอาไปเผยแพร่ เช่น แปะเป็น Link บน Website เป็นต้น

    4 กดปุ่ม Save

    เป็นอันเรียบร้อย แล้วก็ รอเวลา ผู้จัดการบรรยาย ก็เข้าไปทำหน้าที่ครับ

    UPDATE:

    จากนั้น ก็เข้า Join Hangout Meet คลิก Join Now

    เสร็จแล้ว คลิกที่ Setting (3 จุดด้านขวาล่าง) แล้วคลิก Start Streaming

    วิธีการนี้ ทำให้ “คนในองค์กร” ของเรา สามารถเข้าฟังการบรรยายได้พร้อม ๆ กัน เป็นจำนวนมาก ดังนั้น ต้อง Login ด้วย PSU G Suite for Education Account ก่อน จึงจะสามารถเข้าดูได้ –> Free Gmail และ ผู้ที่ไม่ได้ Login ไม่สามารถดูได้นะครับ

    หวังว่าจะเป็นประโยชน์ครับ

  • ทุกคนใน PSU ใช้ Google Meet สำหรับประชุม / การเรียนการสอน ได้ใน 3 ขั้นตอน

    Google Meet เปิดให้บัญชีของ PSU Email “ทุกคน” สามารถใช้งานได้ (เพราะเราใช้บริการ G Suite for Education)

    • สร้างห้องประชุมได้ *
    • รองรับได้สูงสุด 250 คน ต่อห้อง **
    • สตรีมมิงแบบสด
    • บันทึก VDO ได้ โดยเก็บบน Google Drive ***

    * เราในฐานะผู้มีบัญชี G Suite สามารถ สร้าง ได้ และเชิญผู้เข้าร่วม โดย ผู้เข้าร่วมประชุม ไม่จำเป็นต้องมี Google Account ก็ได้ (ดูอย่างเดียว)

    ** ถ้าต้องการทำสำหรับงานประชุมที่มีคนดูอย่างเดียวจำนวนมาก เช่น เปิดสอนคลาสใหญ่ แนะนำ วิธีสร้าง Live Stream ด้วย Google Meet เพื่องานประชุมขนาดใหญ่

    *** สามารถบันทึกได้จนถึง 1 ก.ค.2020

    เริ่มกันเลย

    0: Login ด้วย PSU Email (หากยังไม่เคยใช้บริการมาก่อน ขอให้ดำเนินตามขั้นตอนตามนี้ https://gafe.psu.ac.th/support/1/1) และแนะนำให้เริ่มต้นจากหน้า Gmail

    1: คลิกที่ App หรือ 9 จุด จากนั้นคลิกที่ ไอออน Meet ดังภาพ (หรือจะเปิด website https://meet.google.com เลยก็ได้)

    2: คลิกที่ Join or start a meeting

    แล้วตั้งชื่อเป็นภาษาอังกฤษ แล้วคลิก Continue

    แล้วคลิก Allow

    คลิก Join Now

    3: เชิญคนเข้าร่วม

    ทำได้โดยการ ส่ง Link ไปให้ เช่น ส่งทาง LINE/Facebook/Email หรืออะไรก็แล้วแต่สะดวก หรือ จะ Add People ก็ได้ หากต้องการห้องเฉพาะกลุ่ม

    นอกนั้น …

    บันทึก VDO

    คลิกรูป 3 จุดด้านล่างขวา แล้ว เลือก Record meeting

    แล้วก็ Accept

    แสดง PowerPoint

    เริ่มจากเปิด PowerPoint ที่ต้องการ แล้วเข้าสู่โหมด Presentation

    แล้วคลิก Present now แล้ว เลือก A window

    แล้วเลือก window ที่ต้องการแสดง แล้วกดปุ่ม Share

    เลือกสลับหน้าจอได้ เลือกว่าให้จะนำภาพใครขึ้น Stage หรือ จะดูในส่วนของ Chat ก็ได้

    หยุดการบันทึก

    คลิกที่ 3 จุด ด้านล่างขวา แล้ว กด Stop recording

    หยุด Meeting

    คลิกที่รูป โทรศัพท์สีแดงตรงกลาง

    ไฟล์บันทึก Meeting อยู่ใน Google Drive ที่ My Drive > Meet Recordings

    หมายเหตุ: จะได้ไฟล์ ซึ่งสามารถ Download ออกมาเป็น .mp4 ได้ (รอสักครู่หลังสิ้นสุดการ Meeting) และ จะสามารถ Play ได้ เมื่อ Google Drive เตรียมไฟล์เสร็จ เช่น เอาไปแสดงในเว็บไซต์ ตามวิธีการ เค้าเอาไฟล์ MP4 บน Google Drive ไปแสดงใน Video Player บนเว็บได้อย่างไร

    วิธีการใช้งาน Google Meet
    https://support.google.com/meet/?hl=th#topic=7306097

  • [สภากาแฟ] ว่าด้วยเรื่องสายงานคนไอที 2020

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

    ด้วยความที่เทคโนโลยีมันเปลี่ยนแปลงอย่างรวดเร็วโดยเฉพาะสายโปรแกรมเมอร์ จนเกิดอาการซ๊อคตามไม่ทันไม่รู้จะจับอะไรก่อนดี มันดูสับสนวุ่นวายไปหมด จนกระทั่ง 2-3 ปี มานี้เริ่มจับทางถูกพอทำให้ไม่ตกขบวนบ้าง

    ได้รับอีเมล์จากไมโครซอฟท์ หัวข้อ “Join our Apps & Infrastructure sessions at the Open Source Virtual Summit” ลองเข้าไปอ่านรายเอียดดูว่ามีอะไรน่าสนใจบ้าง

    พบว่าหัวข้อการอบรมแบ่ง 3 track ใหญ่ๆ ได้แก่

    1. Apps & Infrastructure
    2. Developer
    3. Data & AI

    เห็นได้ชัดว่าสายงานคนไอที 2020 ถ้าแบ่งแบบหยาบน่าจะเป็น 3 ลู่วิ่งนี้… ลู่วื่งที่ 1. Apps & Infrastructure เป็นของสาย System Admin หรือ SysAdmin เกี่ยวกับการสร้างโครงสร้างพื้นฐาน ออกแบบ วางระบบ แน่นอนว่าต้องเกี่ยวข้องกับ Cloud ทำยังไงให้มีโครงสร้างระบบพื้นฐานที่ดีสามารถี่รันแอพที่ตอบโจทย์ผู้ใช้งานได้ และต้องมีความรู้เรื่องเทคโนโลยีคอนเทนเนอร์ เช่น Docker Kubernetes ฯลฯ

    …สังเกตว่าสายไอที Network เพียวๆ ที่เป็นฮาร์แวร์จะถูกแยกลู่ออกไปเลย คงเป็นผู้เชี่ยวชาญด้านๆ นั้น ได้แก้ Data Center คอนฟิก Switch ซึ่งไม่มาแตะซอฟแวร์มากนัก  

    ลู่วื่งที่ 2 Developer อันนี้สายโปรแกรมเมอร์ล้วนๆ รักไม่มุ่งแต่มุ่งโฟกัสที่พัฒนาแอพอย่างเดียว โค้ดคือชีวิตอย่าไปให้เค้าแตะเรื่อง Infrastructure มากนัก เทรนก็เลยมาแนว Serverless แบบไม่ต้องห่วงหน้าพะวงหลัง เน้นการพัฒนาแอพให้ดี เรื่องวุ่นวายปล่อยให้ Cloud จัดการให้

    ลู่วิ่งที่ 3 Data & AI ยุดสมัยนี้ของมันต้องมี… แยกมากันชัดๆโฟกัสไปเลยว่าจะเอาดีทางสายนี้ สำหรับผมความคิดเห็นที่จะพูดถึงลู่นี้ไม่มีเพราะไม่รู้ 555 เพราะไม่เคยแตะเลย แต่ใครมาเอาดีสายนี้รับรองว่าอนาคตสดใสแน่นอนครับ

    สุดท้ายฝากลิงค์งานสามารถเข้าคลิกดู agenda ได้ : https://info.microsoft.com/AP-AzureMig-WBNR-FY20-03Mar-18-OpenSourceVirtualSummit-4491_01Registration-ForminBody.html

  • วิธีการติดตั้ง OpenSSH Server บน Windows

    อยาก ssh เข้า Windows Server เพื่อเข้าไปรัน PowerShell หรือรัน script cmd ต้องทำอย่างไร
    (โดยปกติ Windows ปัจจุบันมี OpenSSH Client ติดตั้งมาโดย Default ถ้าใครต้องการแค่จะใช้ ssh/scp command ข้ามบนความนี้ได้เลยครับ)

    Reference :
    https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse Installation of OpenSSH For Windows Server 2019 and Windows 10

    Environment :

    – Windows Server 2019 หรือ Windows 10 1809 ขึ้นไป

    • วิธีการติดตั้ง OpenSSH Server ผ่าน GUI
      เปิด Settings > Apps > Apps and Features > Manage Optional Feature
      s (Windows 10 ใช้คำว่า Optional Features)
    • วิธีการติดตั้ง OpenSSH Server ผ่าน PowerShell (Run as Administrator)

    – ตรวจสอบ Version ของ OpenSSH ที่จะลงก่อน

    Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'

    – ทำการติดตั้งตาม Version ล่าสุด

    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
    • วิธีการสร้าง Service ให้ Start OpenSSH Server โดยอัตโนมัติเมื่อเปิดเครื่องผ่าน PowerShell Run as Administrator และทำการเปิด Firewall ให้เข้าถึงได้
    Start-Service sshd
    # OPTIONAL but recommended:
    Set-Service -Name sshd -StartupType 'Automatic'
    # Confirm the Firewall rule is configured. It should be created automatically by setup. 
    Get-NetFirewallRule -Name *ssh*
    # There should be a firewall rule named "OpenSSH-Server-In-TCP", which should be enabled
    # If the firewall does not exist, create one
    New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
    
    • ทดสอบเข้าใช้งาน (สำหรับเครื่องที่ join office365 แนะนำให้เข้าผ่าน local account ครับ)
    ssh [username]@[Windows Server IP]
    • การใช้งานต้องใช้คำสั่งของ powershell นะครับ ไม่ใช่ shell script ของ linux ดังนั้นการกดออกต้องใช้คำสั่ง exit

    ในแง่เดียวกันสามารถทำ ssh tunnel ไปมาระหว่าง Windows และ Linux ได้นะครับ แต่คงจะไม่ได้เขียน Blog ในส่วนนี้ครับ แต่จะไม่มี command ssh-copy-id ใน windows ให้ใช้คงต้อง ssh-keygen แล้ว copy key ไปสร้างในเครื่อง linux เองครับ

  • ฉันโดนแฮ๊กหรือเปล่า !?!?!

    หลายท่านอาจจะเคยได้รับ email หน้าตาประมาณนี้

    ข้อเท็จจริงคือ

    เราสามารถปลอมเป็นใคร ส่ง email ออกไปให้ใครก็ได้

    Truth …

    แล้ว จะรู้ได้อย่างไร !?!

    ต้องดูสิ่งที่เรียกว่า Header … โดยทำตามวิธีการต่อไปนี้

    1. คลิกที่ View Full Header

    จะได้ผลประมาณนี้

    จากภาพ จะเห็นว่า ส่งจาก (ดูจาก ล่าง ขึ้น บน)

    Received: from [154.117.164.59] (unknown [154.117.164.59])
         by mailscan.in.psu.ac.th (Postfix) with ESMTP id 69F2B150768
         for <kanakorn.h@psu.ac.th>; Thu, 5 Mar 2020 13:24:42 +0700 (ICT)

    แล้วจึงส่งเข้าระบบ PSU Email

    Received: from mailscan.in.psu.ac.th (unknown [192.168.107.12])
         by mail.psu.ac.th (Postfix) with ESMTP id A034D464FC7
         for <kanakorn.h@psu.ac.th>; Thu, 5 Mar 2020 13:24:46 +0700 (+07)

    แล้วจึงเข้า Mailbox ของ PSU (ข้อมูล version ของ cyrus เอาออกไม่ได้จริง ๆ ครับ ไว้รอ Upgrade)

    Received: from mail.psu.ac.th ([unix socket])
         by mail (Cyrus v2.4.18-Debian-2.4.18-3) with LMTPA;
         Thu, 05 Mar 2020 13:24:46 +0700

    จะเห็นได้ว่า ต้นทางคือ IP Address : 154.117.164.59

    ตรวจสอบว่าอยู่ที่ไหนในโลก ด้วย

    https://whatismyipaddress.com/ip/154.117.164.59

    ประมาณ South Africa

    สรุป ! ไม่ได้โดน Hack (ไม่ได้เข้ามาใช้ PSU Email ส่ง)

    ครับ

  • วิธีแจ้งเตือนจาก Google Forms เข้า LINE

    ต้องยอมรับว่า ปัจจุบันพฤติกรรมผู้ใช้ “ทั่วไป” จะเปิด LINE อ่านบ่อย และเร็วกว่าการเปิดอ่าน Email

    ต่อไปนี้ เป็นวิธีการ ตั้งค่าที่ Google Forms ว่า เมื่อมีคน Submit แบบฟอร์มมา ให้มา Alert ที่ LINE ของเรา หรือ ส่งเข้า LINE Group ก็ได้ โดยอาศัยความสามารถของ Google App Scripts ที่เรียก REST API ของ LINE

    สร้าง หรือ แก้ไข Google Forms ที่ต้องการ

    จากนั้น ไปที่ “More” หรือ ปุ่มสามจุดแนวตั้งด้านขวามือบน แล้ว คลิกที่ Script Editor

    จากนั้น ใส่ Google App Script

    ตามนี้ ในที่นี้ ตั้งชื่อ Function คือ sendLineNotification

    **** อย่าลืมเปลี่ยน YOUR-TOKEN-GO-HERE ที่จะได้จากขั้นตอนต่อไป ****

    function sendLineNotification(e)
    {
      // เลือกใช้ Form ที่กำลังใช้งานนี้
      var form = FormApp.getActiveForm() 
      
      // รับค่าจาก Form Response
      var itemResponses = e.response.getItemResponses();  
      
      // ข้อความที่แสดงในบรรทัดแรก
      var result="New Response" 
      
      // Loop แต่ละข้อคำถาม และ คำตอบ
      for (var i = 0; i < itemResponses.length; i++) {
        var itemResponse = itemResponses[i];
        
        // ต่อข้อความจากทุกคำถาม เป็นข้อความยาวข้อความเดียว
        // getTitle คือ Question Title แต่ละข้อ
        // getResponse คือ ถามตอบที่ส่งมา
        result += '\n'+itemResponse.getItem().getTitle()+': '+itemResponse.getResponse()
      }
      
      // สร้างรูปแบบที่จะส่งไปให้ LINE -- ในที่นี้คือข้อความอย่างเดียว
      var formData = {
        'message': result,
      };
      
      // LIINE token : ได้มาจาก https://notify-bot.line.me/my/
      // ในตัวอย่างนี้ เป็นแบบ Personal
      var token = 'YOUR-TOKEN-GO-HERE'
      
      // POST แบบใน Token ใน Header ไปยัง LINE Notify REST API
      var options = {
        'method' : 'post',
        'headers' : {'Authorization': "Bearer "+token},
        'contentType': 'application/x-www-form-urlencoded',
        'payload' : formData
      }
      UrlFetchApp.fetch('https://notify-api.line.me/api/notify', options)
    }
    

    ตั้งชื่อ Project, Save แล้ว Run

    ** อย่าลืม ตั้งชื่อ Project แล้ว Save ด้วย

    จากนั้น กดปุ่ม Run เพื่อให้เกิดการขอ Authorization ตาม OAuth Scope

    ซึ่งจะเจอ Error นี้ ก็ไม่เป็นไร (เพราะไม่มี ข้อมูลส่งมาจริง ๆ นั่นเอง) ให้กด Dismiss ไป

    ไปตั้ง Trigger

    ไปที่ เมนู Edit > Current project’s triggers

    ตั้งค่า Trigger ให้ทำงานทันทีที่มีการ Submit แบบฟอร์ม

    Trigger คือการตั้งค่าให้ Script นี้ทำงานอัตโนมัติ เมื่อมีการ Submit แบบฟอร์ม

    คลิก Add Trigger แล้วเลือก Function “sendLineNotification” เลือก “on form submit” และ “Notify me immediately” เพื่อให้เมื่อมีการ Submit แบบฟอร์ม ก็จะแจ้งทาง LINE ทันที

    จากนั้น กดปุ่ม Save

    ผลที่ได้คืออย่างนี้

    ขั้นตอนการขอ LINE Token

    ไปที่เว็บไซต์

    https://notify-bot.line.me/my/

    แล้ว Login ด้วย LINE Account ของท่าน

    จากนั้น คลิกปุ่ม Generate token

    ตั้งชื่อ และ เลือกว่าจะ Notify ไปที่ใด เราสามารถเลือกได้ว่า

    • ให้ Notify ไปที่เราคนเดียว
    • ให้ Notify ไปยัง Group Chat

    *** เราต้องเพิ่ม Line Notify เป็นเพื่อนก่อน และ Invite เข้าไปใน Group Chat นั้น ๆ ด้วย

    จากนั้น คลิกปุ่ม Generate Token

    ก็จะได้ Token ให้คลิกปุ่ม Copy แล้วคลิก Close

    จากนั้น นำไปแทนที่ YOUR-TOKEN-GO-HERE ใน Google App Script ข้างต้น แล้ว Save

    เราสามารถสร้าง Token สำหรับใช้งานในกิจกรรมที่แตกต่างกันได้ หลาย ๆ อัน เช่น อาจจะมี ต้องการให้แจ้งเตือนในกลุ่มที่แตกต่างกันออกไป เป็นต้น

    เมื่อมีคน Submit แบบฟอร์ม ก็จะมี LINE แจ้งเตือน

    อันนี้ แบบ Basic ง่าย ๆ เดี๋ยวค่อยมาเล่าการใช้งานที่ซับซ้อนกว่านี้

    หวังว่าจะเป็นประโยชน์ครับ