Month: November 2020

  • การสลับข้อมูลจาก Column เป็น Row ใน Excel

    ท่านผู้อ่านที่ใช้งาน Excel น่าจะเคยเจอปัญหาหรือมีความต้องการที่ว่า มีข้อมูลที่มีลักษณะเป็น Column แต่ต้องการย้ายให้มาแสดงในรูปแบบ Row ถ้าต้อง copy แล้วมา paste ทีละตัวคงไม่สะดวกอย่างแน่นอน แต่ Excel ได้จัดเตรียมเครื่องมือสำหรับแก้ปัญหาเหล่านี้เอาไว้แล้ว ลองไปดูกันเลย

    1.สมมติเรามีข้อมูลชื่อเดือนเก็บอยู่ในเ Excel ในคอลัมน์เดียวกันเรียงกันลงมาดังรูป

    2. เลือกข้อมูลที่ต้องการย้ายทั้งหมดแล้ว copy เก็บไว้

    3. ไปยัง sheet หรือ cell ที่ต้องการ จากนั้นคลิกขวา ใต้เมนู Paste Options เลือกไอคอนที่ 4 (Transpose)

    4. ก็จะได้ข้อมูลมาอยู่ในรูปแบบแนวนอน ดังรูป

    5. จากข้อ 2 ถ้าเราเลือกเมนู Paste Special… จะปรากฏ dialog ดังรูป ให้เลือก Transpose จากกดปุ่ม OK เพื่อยืนยัน ก็จะได้ผลลัพธ์เหมือนกัน

    นอกจากนี้ เรายังสามารถใช้ฟังก์ชัน TEXTJOIN() โดยฟังก์ชันนี้จะทำหน้าที่รวมข้อความจากช่วงข้อมูลหรือข้อความหลายๆ ส่วนเข้าด้วยกันและสามารถระบุตัวคั่นระหว่างข้อมูลได้ด้วย โดยฟังก์ชันนี้จะมี parameter สามส่วนหลักๆ คือ

    TEXTJOIN(ตัวคั่น, ignore_empty, text1, [text2], …)
    พารามิเตอร์คำอธิบาย
    ตัวคั่นสตริงข้อความไม่ว่าจะเป็นสตริงข้อความว่าง, ประกอบอักขระอย่างน้อย 1 ตัวในอัญประกาศ หรือมีการอ้างอิงไปยังสตริงข้อความที่ถูกต้อง ถ้ามีตัวเลขอยู่ก็ถือว่าเป็นข้อความ
    ignore_emptyถ้าเป็นค่า TRUE ให้ละเว้นเซลล์ว่าง
    text1รายการข้อความที่จะถูกรวมเข้าด้วยกัน สตริงข้อความ หรืออาร์เรย์ของสตริง เช่น ช่วงเซลล์
    [text2, …]รายการข้อความเพิ่มเติมที่จะถูกรวมเข้าด้วยกัน สามารถมีอาร์กิวเมนต์ข้อความสำหรับรายการข้อความได้สูงสุด 252 รายการ รวมถึง text1 แต่ละรายการสามารถเป็นสตริงข้อความหรืออาเรย์ของสตริงได้ เช่น ช่วงเซลล์

    ตัวอย่างการใช้งานดังรูป

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

    ก่อนจะจากไป ขอแถมอีกวิธีบน MS Word เผื่อใครอยากทำอะไรคล้ายๆ แบบนี้ วิธีการคือ

    1. ข้อมูลแยกกันอยู่คนละบรรทัด ดังตัวอย่าง

    2. เลือกข้อมูลทั้งหมด จากนั้นกด Ctrl + H จะปรากฏ dialog “Find and Replace” ดังรูป

    3. ป้อน ^p ในช่อง Find what: และป้อน , ลงในช่อง Replace with: จากนั้นกด Replace All ข้อมูลทั้งหมดจะถูกยุบมาอยู่ในบรรทัดเดียวกัน โดยมี , คั่นอยู่ระหว่างข้อมูลแต่ละบรรทัด ดังรูป

    ซึ่งเทคนิคนี้ก็คือการแทนที่อักขระขึ้นบรรทัดใหม่ ด้วย , นั่นเอง

    ก็หวังเป็นอย่างยิ่งว่าบทความนี้น่าจะมีประโยชน์ต่อผู้อ่านไม่มากก็น้อย จนกว่าจะพบกันใหม่

    สวัสดีครับ


    อ้างอิง

    https://superuser.com/questions/240858/convert-a-column-into-a-comma-separated-list
    http://www.saranitus.com/2018/10/ย้ายข้อมูลจาก-row-เป็น-column-ใน-excel-2016.html
    https://www.it-guides.com/training-a-tutorial/office-tutorial/transpose-microsoft-excel-2007
    https://support.microsoft.com/th-th/office/textjoin-ฟังก์ชัน-textjoin-357b449a-ec91-49d0-80c3-0e8fc845691c

  • คลายข้อสงสัย “ทำไมสแกนบาร์โคดจากเครื่องอ่านแล้วไม่ enter หรือ tab ให้”

    ในการพัฒนาระบบที่ต้องมีการอ่านข้อมูลจากเครื่องสแกนบาร์โคดแบบสองมิติ (แบบแท่งหรือแบบเส้น) รูปแบบในการทำงานมักจะเป็นการอ่านข้อมูลจากตัวบาร์โคด จากนั้นตามด้วยอักขระ Enter หรือ Tab เพื่อเป็นการระบุว่าให้ส่งข้อมูลที่อ่านได้จากบาร์โคดให้กับฟังก์ชันใดฟังก์ชันหนึ่งเพื่อนำไปใช้งานต่อ แต่ในบางครั้งอาจจะเคยเจอปัญหาว่าทำไมเมื่อสแกนบาร์โคดแล้วไม่มีการ Enter หรือ Tab โดยอัตโนมัติ ทำให้ต้องกดปุ่ม Enter หรือ Tab เองทุกครั้งจากคีย์บอร์ด หรือต้องปรับแต่ง code เพื่อเพิ่มอักขระ Enter หรือ Tab ต่อหลังข้อมูลที่อ่านได้จากเครื่องสแกนบาร์โคด

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

    ตัวอย่างการตั้งค่าเครื่องอ่านบาร์โคด Honeywell รุ่น Xenon Model 1900

    1. หาคู่มือการตั้งค่าตามรุ่น ซึ่งรุ่นนี้ คือ Xenon Model 1900 (ถ้าไม่มีคู่มือที่ให้มาพร้อมกับอุปกรณ์ อาจจะสามารถค้นหาคู่มือได้จากทาง internet โดยค้นตามรุ่น หรือตามบริษัทผู้ผลิต)
    2. ในคู่มือที่เกี่ยวกับการตั้งค่าเพื่อแก้ปัญหานี้ จะมีรหัสบาร์โคดที่ให้เราทำการสแกนเพื่อตั้งค่าอุปกรณ์ดังนี้

    กรณีต้องการให้ลงส่งอักขระ Enter หลังสแกนบาร์โคด สามารถทำได้โดยการสแกนบาร์โคดด้านล่าง

    กรณีต้องการให้ลงส่งอักขระ Tab หลังสแกนบาร์โคด สามารถทำได้โดยการสแกนบาร์โคดด้านล่าง

    สรุปควรแก้ปัญหาด้วยการเขียน Code หรือตั้งค่าอุปกรณ์

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

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

  • [บันทึกกันลืม] วิธีติดตั้ง django-auth-ldap

    การจะใช้ ldap backend บน django นั้น จะต้องติดตั้ง django-auth-ldap ซึ่งจะใช้คำสั่ง

    pip install django-auth-ldap

    แต่ว่า อาจจะเจอ Error ประมาณนี้

    เหตุเพราะ ใน container ที่ใช้ อาจจะไม่มีเครื่องมือในการ build

    วิธีแก้ไขคือ (ใน docker python:3.8) ให้ติดตั้ง package

    apt-get install -y python-dev libldap2-dev libsasl2-dev libssl-dev python-ldap build-essential

    แล้วจึงค่อยติดตั้งผ่าน pip

    pip install django-auth-ldap

    ก็จะเรียบร้อยครับ

  • วิธีสร้าง reverse proxy ด้วย Apache2 docker ด้วย subpath ใน Domain Name เดียวกัน

    ในการเขียน web application บน docker (ผมชอบใช้ django / flask) เมื่อต้องการ deploy ไว้บนเครื่อง Production Server ซึ่งแต่ละ application ก็จะเปิด port ต่าง ๆ กัน เช่น 8080, 8081, 8082 … ว่ากันไป

    เช่น จะมี URL เป็น IP Address แล้วตามด้วย Port อย่างนี้

    192.168.x.y:8080
    192.168.x.y:8081
    192.168.x.y:8082

    การสร้าง Reverse Proxy ทำให้ผู้ใช้สามารถ เข้าถึง web application เหล่านี้ได้ง่ายขึ้น โดยใช้วิธีการ เช่น ใช้ Web Server อย่าง Apache, Nginx ทำงานร่วมกับ DNS Server เพื่อจด Domain Name มายัง IP Address เช่น

    app1 IN A 192.168.x.y
    app2 IN A 192.168.x.y
    app3 IN A 192.168.x.y

    แล้วที่ Web Server ค่อยมากำหนดว่า เมื่อ ServerName เป็น app1.xxx.psu.ac.th จะส่งไปยัง 192.168.x.y:8080 อะไรทำนองนี้

    ปัญหาคือ ถ้าต้องจดทะเบียน DNS ไปเรื่อย ๆ ก็คงไม่ไหว อีกทั้ง เมื่อต้องใช้ HTTPS ก็ต้องไปทำทีละ domain name อีกด้วย

    แล้วจะทำอย่างไร ให้สามารถรวบ web application ที่อยู่บน production server ตัวเดียวกันนี้ ให้อยู่ใน domain name เดียวกัน แต่ แยกกันด้วย URL Path ด้านหลังแทน เช่น

    xxx.psu.ac.th/app1/
    xxx.psu.ac.th/app2/
    xxx.psu.ac.th/app3/

    และ ในเมื่อเราใช้ Docker บน Production Server อยู่แล้ว ก็ใช้ Web Server เป็น container ซะ

    วิธีการทำมีดังนี้

    1. สร้าง apache2 container ให้ชื่อว่า httpd รับการเชื่อมต่อที่ port 80 ด้วยคำสั่ง
    docker run -dit --name httpd -p 80:80 httpd:2.4

    2. ตอนนี้ เราจะได้ container ชื่อ httpd มาแล้ว ต่อไป copy ไฟล์ httpd.conf ออกมา ด้วยคำสั่ง

    docker cp httpd:/usr/local/apache2/conf/httpd.conf .

    3. ตอนนี้ เราจะได้ไฟล์ httpd.conf ออกมา ให้แก้ไขไฟล์ด้วย Text Editor ตามถนัด โดยการทำ Reverse Proxy ด้วย apache2 นั้น ต้องเปิดใช้ module ดังนี้ (ค้นหา และ uncomment) แล้ว Save

    LoadModule proxy_html_module modules/mod_proxy_html.so
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so

    4. เพิ่ม Directive “ProxyPass” และ “ProxyPassReverse” ตามด้วย URL Path ที่ต้องการของแต่ละ Application แล้ว URL ที่สร้างไว้ เสร็จแล้ว ก็ Save

    ProxyPass "/app1/"  "http://192.168.x.y:8080/"
    ProxyPassReverse "/app1/"  "http://192.168.x.y:8080/"
    ProxyPass "/app2/"  "http://192.168.x.y:8081/"
    ProxyPassReverse "/app2/"  "http://192.168.x.y:8081/"
    ProxyPass "/app3/"  "http://192.168.x.y:8082/"                
    ProxyPassReverse "/app3/"  "http://192.168.x.y:8082/"          

    5. ต่อไป ก็ copy file httpd.conf ที่แก้ไขแล้ว กลับเข้าไปใน container ด้วยคำสั่ง

    docker cp httpd.conf httpd:/usr/local/apache2/conf/httpd.conf

    6. สุดท้าย restart container ด้วยคำสั่ง

    docker restart httpd

    ก็ประมาณนี้ เวลาจะเพิ่ม หรือ เปลี่ยนอะไร ก็ ทำซ้ำขั้นตอน 4,5,6 ครับ

    หมายเหตุ: ในบาง web application อย่างเช่น Grafana ก็จะต้องไปแก้ไข root_url ให้ใช้ subpath ด้วย ในพวก django, flask ต้อง ALLOWED_HOST อีกเล็กน้อย ครับผม