Category Archive programming

Linux: upgrade PHP version ล่าสุด

php ก็เหมือนโปรแกรมอื่น ๆ จะมีการอัพเดต อัพเกรดเวอร์ชั่นเป็นระยะเพื่อเพิ่มความสามารถและความปลอดภัย การอัพเดตใน linux และ wsl สามารถทำได้ง่าย ๆ

  1. Update ระบบโดยรวมก่อน

    sudo apt update && sudo apt -y upgrade
  2. เพิ่ม Surý PHP APT repository

    sudo apt update

    sudo apt install -y lsb-release gnupg2 ca-certificates apt-transport-https software-properties-common

    sudo add-apt-repository ppa:ondrej/php
  3. ติดตั้ง PHP ตัวล่าสุด

    sudo apt install php8.2
  4. เช็ค php version โดย

    php -v
  5. ติดตั้ง extension เพิ่มเติม เช่น

    sudo apt-get install -y libapache2-mod-php8.2 libphp8.2-embed mcrypt openssl php-bcmath php-cli php-common php-curl php-fpm php-gd php-gmp php-intl php-mbstring php-mysql php-tokenizer php-xml php-xmlrpc php-zip php8.2 php8.2-bcmath php8.2-cgi php8.2-cli php8.2-common php8.2-curl php8.2-dev php8.2-fpm php8.2-gd php8.2-imagick php8.2-imap php8.2-mbstring php8.2-mysql php8.2-phpdbg php8.2-soap php8.2-xml php8.2-xmlrpc php8.2-zip
  6. ผูก Apache และ PHP

    sudo apt install apache2 php-fpm

ดูเพิ่มเติม How To Install PHP 8.2 on Ubuntu 22.04|20.04|18.04

Swagger: การติดตั้ง Swagger Editor

การเขียน OpenAPI เครื่องมือที่สามารถช่วยตรวจสอบและ test ได้คือ swagger-editor โดยสามารถ download มาติดตั้งในเครื่องของตัวเองได้

  1. ดาวน์โหลดตัว zip file จาก https://github.com/swagger-api/swagger-editor มาแตกไว้ในโฟลเดอร์ C:\swagger-api หรือจะใช้คำสั่ง

    git clone https://github.com/swagger-api/swagger-editor.git
  2. เปิด PowerShell แล้วไปที่ C:\swagger-api\swagger-editor
  3. ติดตั้ง http โดยคำสั่ง

    npm install -g http-server
  4. จากนั้นกลับออกมา 1 ระดับโดยคำสั่ง

    cd ../
  5. เปิด server โดยคำสั่ง

    http-server swagger-editor -a 127.0.0.1 -p 8080
  6. จากนั้นเปิด browser โดยใช้ URL: http://127.0.0.1:8081

เท่านี้ก็สามารถใช้ swagger-editor ได้โดยไม่ต้องต่ออินเตอร์เน็ตแล้ว
Cr.

PowerBuilder:DataWindow.ShareData

shareData เป็นวิธีที่ใช้ data เดียวกันของ DataWindow โดยจะแชร์กันหมดทุกอย่างทั้ง primary buffer, delete buffer, filter buffer, sort order ประโยชน์เช่น มี DataWindow ตัวแรก ( dw_booking ) ไว้กรอกข้อมูลที่ติดต่อลูกค้าและออกรายงานในรูปแบบใบรับจองตั๋วรถทัวร์ โดยจะมีข้อมูลบางส่วนเป็นเวลานัด หมายเลขเที่ยว ที่นั่ง เวลาใส่กระดาษเล็ก ๆ ใน DataWindow ( dw_ticket ) แบบสวยงามกระทัดรัด ไม่จำเป็นต้องมีข้อมูลของลูกค้า แต่ร้านค้ามีข้อมูลครบถ้วนอย่าง ชื่อ นามสกุล เบอร์โทรศัพท์ไว้ติดต่อกรณีที่ลูกค้ามาสาย

การเขียนทำได้ด้วย code ง่าย ๆ

dw_original.ShareData(dw_shareing)
หรือ
IF dw_original.ShareData(dw_shareing) = -1 THEN MessageBox("Error !", "ShareData original and shareing")

ตัวอย่าง

dw_booking.ShareData(dw_dw_ticket)
หรือ
IF dw_booking.ShareData(dw_dw_ticket) = -1 THEN MessageBox("Error !", "ShareData booking and ticket")

เมื่อกรอกข้อมูลใน dw_booking จะเห็นว่าข้อมูลจะไปแสดงใน dw_ticket ตามรูปแบบในหน้าที่ design

ข้อควรระวังคือ source ของทั้งสอง Datawindow ต้องมีจำนวน column และ data type เท่ากัน ไม่อย่างนั้นฝั่ง replicate จะไม่แสดงข้อมูล ดูเพิ่มเติมได้จาก ShareData

PowerBuilder: DBMS not supported in your current installation

เห็น error DBMS not supported in your current installation ในขั้นตอนที่ connect database sql server ตอนแรกเข้าใจว่าตอนที่ติดตั้งไม่ได้ลงพวก adodb, jdbc, odbc driver ลอง install ใหม่ก็เหมือนเดิม กี่ครั้งก็เหมือนเดิม

รุ่นพี่บอกให้ลง sql server 2000 หลังจากนั้นก็ connect ได้ปกติเลย เข้าใจว่าในการติดตั้งมันจะลงไดร์เวอร์ให้เป็นตัวที่ยังใช้โปรโตคอลเดี่ยวกับตัว PB8

PowerBuilder: file extension

ในส่วนของ source code ของ PowerBuilder ประกอบด้วยไฟล์นามสกุลต่าง ๆ

ความหมายfile extension
Application source files.sra
Custom user object source files.sru
Data pipeline source files.srp
DataWindow source files.srd
Dynamic link library files.pdb
Function source files.srf
Library files.pbl
Menu source files.srm
Project files.srj
Query source files.srq
Structure source files.srs
Target files.pbt
Window source files.srw
Workspace files.pbw

SQL Server: update limit

เทสงานที่มีการบันทึกข้อมูลไว้ ถ้าจะทำอีกครั้งก็ต้อง update กลับไปเป็นเหมือนเดิม แต่เพราะว่าเงื่อนไขมันกว้างมาก ๆ เลยไปอัพเดตทั้ง table เลยมันช้าไป เปลืองทรัพยากร เลยหาวิธีอื่นดู

  • ROWCOUNT อย่างต้องการให้ update แค่ 100 รายการแรก
    • SET ROWCOUNT 100;
      UPDATE table_name
      SET colunm_name = …
      WHERE column_name = …
      SET ROWCOUNT 0;
  • TOP จะง่ายกว่าหน่อย
    • UPDATE TOP(100) table_name
      SET colunm_name = …
      WHERE column_name = …
  • CTE
    • ;WITH CTE AS
      (
      SELECT TOP 100 *
      FROM table_name
      ORDER BY colunm_name
      )
      UPDATE CTE SET colunm_name = …
  • Sub Query
    • UPDATE table_name
      SET column_name =…
      WHERE column_id IN (
      SELECT TOP 100 column_id
      FROM table_name
      WHERE column_name = 0
      )

เลือกเอาแบบที่ชอบได้เลยครับ ตัวที่ผมชอบที่สุดคือ ROWCOUNT เพราะว่าใช้ query จริง ๆ มาวางได้เลย

Linux: ติดตั้งฟอนต์ภาษาไทย

วิธีติดตั้งฟอนต์ภาษาไทยหลังจากที่ลง Linux ทำแค่ขั้นตอนที่ 1 จริงๆ ก็ทำให้อ่านเว็บภาษาไทยได้แล้ว แต่ถ้าอยากให้เห็นเหมือนที่ดูใน windows อาจจะทำขั้นตอนอื่น ๆ เพิ่ม

  1. ติดตั้ง Fonts-TLWG
    sudo apt install fonts-thai-tlwg
  2. ติดตั้ง SiPA thai fonts
    sudo wget ftp://ftp.psu.ac.th/pub/thaifonts/sipa-fonts/*ttf -P /usr/share/fonts/truetype/thai
  3. ติดตั้ง xfonts-thai
    sudo apt install xfonts-thai
  4. ติดตั้งหลาย ๆ ตัวพร้อมกัน
    sudo apt-get install fonts-thai-tlwg xfonts-thai xfonts-thai-etl xfonts-thai-manop xfonts-thai-nectec xfonts-thai-poonlap xfonts-thai-vor
  5. ติดตั้งของ MicroSoft ( มีลิขสิทธ์นะ )
    sudo apt-get install msttcorefonts

มีหลายท่านที่ได้ช่วยเขียนคู่มือแบบละเอียดไว้ให้

ติดตั้ง Poor Man’s T-SQL Formatter ใน SSMS รุ่นใหม่ ๆ

Poor Man’s T-SQL Formatter จะติดตั้งได้ใน SQL Server Management Studio ( SSMS ) เวอร์ชั่นเก่า ๆ ได้ แต่ตัวติดตั้งรุ่นใหม่ ๆ เมื่อติดตั้งแล้ว จะไม่สามารถคลิกเมนูของตัว extension ได้ แก้ได้ง่าย ๆ โดย

  1. ปิด SQL Server Management Studio
  2. ถ้ายังไม่ได้ติดตั้ง .Net 2.0 ให้ติดตั้ง .NET Framework 2.0 ก่อนโดยวิธี How-To How to Enable .NET Framework 2.0 and 3.5 in Windows 11
  3. ถ้าต้องการใช้กับ SSMS 19 ต้องติดตั้ง SSMS 18 ในเครื่องก่อน จากนั้นติดตั้ง plugin ตามปกติ แล้ว copy C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Extensions ไปเป็น C:\Program Files (x86)\Microsoft SQL Server Management Studio 19\Extensions
  4. เปิดไฟล์ C:\Program Files (x86)\Microsoft SQL Server Management Studio {version}\Common7\IDE\Ssms.exe.config เช่น
    • C:\Program Files (x86)\Microsoft SQL Server Management Studio 18\Common7\IDE\Ssms.exe.config
    • C:\Program Files (x86)\Microsoft SQL Server Management Studio 19\Common7\IDE\Ssms.exe.config
  5. ค้นหาบรรทัด <assemblyBinding
  6. เพิ่มข้อความใต้<probing privatePat
    <dependentAssembly><assemblyIdentity name="Microsoft.VisualStudio.Shell.12.0" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="2.0.0.0-15.0.0.0" newVersion="15.0.0.0"/></dependentAssembly>
  7. เปิด SQL Server Management Studio ใหม่

เท่านี้ก็สามารถใช้ Poor Man’s T-SQL Formatter จัดรูปแบบ sql ได้แล้ว

PowerBuilder: Target ( Template Application )

วิธีสร้าง target application จาก template

  1. เปิด workspace ที่ต้องการขึ้นมาเช่น งานชิ้นใหม่ก็เปิดจาก development.pbw
  2. คลิก file
  3. คลิก Open..
  4. Browse ไปไฟล์ *.pbw ที่ต้องการ
  5. คลิก OK
  6. คลิก file
  7. คลิก New…
  8. ที่เท็บ Target เลือก Template Application
  9. คลิก OK
  10. หน้า About the Template Application Wizard
  11. คลิก Next >
  12. หน้า What you will do
  13. คลิก Next >
  14. หน้า Specify New Application and Library
    • Application Name: ใส่ชื่อ เช่น prototype_pb8
    • Library: ใส่ชื่อ Library ตัวหลักเช่น C:\UsersDatas\ProjectsGit\PrototypesPowerBuilder8\Source code\main.pb
    • Target: เช่น C:\UsersDatas\ProjectsGit\PrototypesPowerBuilder8\Source code\prototype_pb8.pb
  15. หน้า Specify Template Type เลือกชนิดของ application ที่ต้องการ
    • MDI Application with Microhelp
    • SDI Application
    • PFC-base application
  16. เลือก MDI
  17. คลิก Next >
  18. หน้า Adjust Application Library Search Path
  19. คลิก Next >
  20. หน้า Name MDI Frame and Menu
    • MDI Frame: ใส่ชื่อ เช่น w_main
    • MDI Frame Menu: เช่น m_main
  21. คลิก Next >
  22. หน้า Name MDI Base Sheet, Menu and Service
    • Base Sheet Window: เช่น w_basesheet
    • Sheet Menu: เช่น m_sheet
    • Sheet Manager Service: เช่น n_sheetmanager
  23. คลิก Next >
  24. หน้า Name individual Sheets
    • Sheet 1: เช่น w_sheet1
    • Sheet 2: เช่น w_sheet2
    • Sheet 3: เช่น w_sheet3
  25. คลิก Next >
  26. หน้า Assign Display Name to Sheets
    • W_sheet1 Title (1) : เช่น Untitled for Sheet 1
    • W_sheet2 Title (2) : เช่น Untitled for Sheet 2
    • W_sheet3 Title (3) : เช่น Untitled for Sheet 3
  27. คลิก Next >
  28. หน้า Name About Box and Toolbar Window
    • About Window: เช่น w_about
    • Toolbar Window: เช่น w_toolbars
  29. คลิก Next >
  30. หน้า Specify Connectivity
    • Requires SQL Database connection
    • Requires EAServer connection
    • None
  31. เลือก Requires SQL Database connection
  32. คลิก Next >
  33. หน้า Choose Database Profile
    • เลือก database ที่ต้องการ
  34. หน้า Specify Connectivity Source Info
    • Application INI file คือเก็บไว้ในไฟล์ .ini
    • Registry Settings ฝากไว้ในความจำของ windows
    • Script
    • Connection Service Object: เก็บไว้ในชื่อ เช่น n_connectservice
  35. คลิก Next >
  36. หน้า Name Application INI File
    • Application INI File: เช่น C:\UsersDatas\ProjectsGit\PrototypesPowerBuilder8\Source code\main.ini
  37. คลิก Next >
  38. หน้า Create Project?
    • No. create project later
    • Yes, Create project now
  39. เลือก Yes ซิจะได้ไปต่อ
  40. คลิก Next >
  41. หน้า Specify Project Object
    • Project: เช่น p_prototype_pb8_exe
  42. คลิก Next >
  43. Specify Executable and Resource Files
    • Executable File Name เช่น C:\UsersDatas\ProjectsGit\PrototypesPowerBuilder8\Source code\prototype_pb8.exe
    • Option Resource File (.pbr) เว้นไว้ก่อน
  44. คลิก Next >
  45. Specify Build Options จากจุดนนี้ไปทำเหมือนตอน build เอา

PowerBuilder: Deploy

การ Deploy โปรเจกต์ powerbuilder ไปยัง user สามารถทำได้โดยมีส่วนประกอบ 2 ส่วนด้วยกัน

  1. ไฟล์ *.exe
    • ชื่อไฟล์โดยปกติจะโดนระบุไว้ในไฟล์ *.pbt
    • ถ้าไม่มีการเพิ่มหรือลด library ใน target ก็ไม่จำเป็นต้องส่งไฟล์นี้ให้ user
  2. ไฟล์ *.pbd
    • เป็นไฟล์ที่เกิดจากการแปลงไฟล์ library ( *.pbl ) โดยจะมีชื่อเดียวกันแต่นามสกุล .pbd โดยจะอยู่ใน path เดียวกัน
    • สามารถนำไฟล์ pbd ไปแทนที่ไฟล์เดิมในเครื่อง user ได้ทันที ตัว .exe จะสามารถใช้ datawindow, function, window และส่วนประกอบอื่น ๆ ที่อยู่ใน library version นั้น ๆ ได้ทันที
    • ไฟล์ pbd อื่น ๆ สามารถเรียกใช้สิ่งที่อยู่ใน pbd อื่น ๆ ได้ ถ้ายังเป็นชื่อเดิม มี parameter เหมือนเดิม ถึงตัวมันเองจะเก่ากว่า หรือว่าใหม่กว่าไฟล์ pbd ตัวนั้น ๆ

ข้อดีจากคุณสมบัติของไฟล์ pbd และ exe ทำให้เวลาที่ส่งโปรแกม update ให้ user สามารถส่งบางฟีเจอร์ ไปให้ user แต่ละกลุ่มได้โดยการส่ง pbd ให้ต่างกัน กลุ่ม a อาจจะได้รับไฟล์ pbd ที่ใหม่กว่าเพื่อทดลองใช้ฟีเจอร์ใหม่ ๆ ในเมนูเดียวกันกับกลุ่ม b ที่ได้รับไฟล์ pbd เวอร์ชั่นก่อนหน้าที่ใช้งานได้ อาจจะไม่ดีนัก แต่ทำงานได้อยู่