บทความ

กำลังแสดงโพสต์จาก 2019

PHP Print ค่าทศนิยมตามตำแหน่งจริงโดยไม่ต้องกำหนดค่า

วันนี้เจอปัญหาเรื่อง floating point ของ PHP เข้าไป คือผมมีโจทย์ว่า ต้องการแสดงค่า float ที่มีทศนิยมได้หลากหลายตำแหน่ง เช่น 0.01   0.001 0.0001 0.00001 0.000001 0.0000001 คือตำแหน่งของทศนิยมมันจะหลากหลายมาก ตอนนี้ลองใช้คำสั่งปรกติได้ผลว่า <?=myFloat?> คำสั่งแสดงผลง่ายๆ แบบนี้อ่ะนะ จะมีปัญหาว่าถ้าทศนิยมตั้งแต่ 5 ตำแหน่งเป็นต้นไป เช่น 0.00001 จะแสดงผลเป็น 1.0E-5  ผมเลยลองเอา number_format มาครอบดู <?= number_format( myFloat)?> ผลที่ได้จะกลายเป็น 0  ยกเว้นเราจะกำหนดตำแหน่งทศนิยมลงไปแบบนี้ <?= number_format( myFloat,5)?> ผลที่ได้จะกลายเป็น ผลที่ได้จึงจะเป็น  0.00001 ดูแล้วก็เหมือนจะได้ Solution แล้วอ่ะนะ แต่ .... ปัญหามันคือ ถ้าทศนิยมมันไม่ใช่ 5 ตำแหน่งเสมอไปล่ะ มันอาจเป็น 4 ก็ได้ หรือ 6 ก็ได้ ด้วยคำสั่งเดียวกัน ถ้า Value มันเป็น  0.000001  ผลที่ได้จะเป็น 0.00000 ทันที ในทางกลับกัน ถ้า Value มันเป็น 0.0001 ผลที่ได้ก็จะกลายเป็น 0.00010 เช่นกัน ซึ่งมันก้ไม่ได้ตรงกับที่เราต้องการเลย ชิมิ วันนี้มีวิธีแก้มาให้ตามนี้เลยครับ ใช้ rtrim เข้ามาช่วยตามตัวอย่าง

แก้ปัญหา ภาษาไทย PHP กับ MySQL ด้วย tis-620

รูปภาพ
บ่อยครั้งที่มักเจอปัญหาเวลาใช้ PHP Query ข้อมูลภาษาไทยจาก MySQL แล้วกลายเป็น ???? วิธีแก้ไขคือให้ทำการ Set ค่า Collation ให้เป็น tis620_thai_ci หรือจะเลือก Default ไว้ตั้งแต่ตอน create database เลยก็ได้เช่นกัน เสร็จแล้วตอนที่ PHP connect  MySQL Database ให้ทำการกำหนด Collation name ด้วยคำสั่งนี้ mysql_query("SET NAMES TIS620"); ตัวอย่างเช่น <? $username="test"; $password="test"; $database="test"; mysql_connect("localhost",$username,$password); @mysql_select_db($database) or die( "Unable to select database"); mysql_query("SET NAMES TIS620"); ?>  กรณีนี้เราสามารถใช้  UTF8 แทน TIS620 ได้ด้วยวิธีเดียวกันครับ ซึ่งหลังๆ ผมแนะนำให้เป็น UTF8 จะดีกว่านะ

Grid Bootstrap ทำความเข้าใจระบบ Grid ของ Bootstrap แบบเข้าใจง่าย

รูปภาพ
ก่อนอื่นให้เข้าใจก่อนครับว่าระบบ Grid ของ Bootstrap จะแบ่งเป็น 12 ช่อง มาเข้าใจระบบแบ่งช่องกันก่อนนะ CSS ของ Bootstrap จะให้เรากำหนดจำนวนช่องได้ด้วยคำสั่งนี้   col-sm-4  โดย sm หมายถึงขนาดหน้าจอ และเลข 4 คือสัดส่วน 4 จาก 12 ... งงมะ   ให้จำแบบนี้ละกัน ถ้าอยากให้ถ้าเราอยากให้แสดงกี่ช่องให้เอา 12 ตั้งแล้วหารด้วย ตัวเลขนั้น เช่น       อยากให้แสดง 1 ช่อง : col-sm-12 (12 หาร 12 =1)       อยากให้แสดง 2 ช่อง : col-sm-6       อยากให้แสดง 3 ช่อง : col-sm-4  ต่อมามาเข้าใจเรื่องของการกำหนดขนาดหน้าจอ โดย Bootstrap จะกำหนดขนาดไว้ทั้งหมด 4 Size ตามรูปด้านล่าง ตาม Concept การทำเว็บแบบ Responsive เรามักจะต้องกำหนดจำนวนช่องการแสดงผลของแต่ละหนาดหน้าจอแตกต่างกันเช่น PC ก็หลายช่องหน่อย รองลงมาก็ Notebook , Tablet และก็ Mobile ว่าแล้วเรามาลองกำหนดขนาดของ Grid ตามนี้ดู   col-xs-6    หน้าจอมือถือเล็กสุด จะให้แสดง 2 ช่อง   col-sm-4   หน้าจอ Tablet จะให้แสดง 3 ช่อง   col-md-2   หน้าจอ Notebook ให้แสดง 6 ช่อง   col-lg-1   ส่วนบน PC ให้แสดง 12 ช่อง 1. มาดูผลกัน เริ่มจากบน มือถือที่ความกว

เพิ่มความเร็วการ load page ด้วย Preload key request

รูปภาพ
การ load resource ต่างๆ เช่น javascript หรือ css ใน web page ปัจจุบันถือว่าเป็นเรื่องที่หลีกเลี่ยงไม่ได้ บาง page load กันที หลายสิบ ไฟล์ เลยทีเดียว หากเราไม่ทำอะไรเลย จะเจอว่าเป็นการทำงานแบบต่อเนื่องกัน มีผลทำให้ page load ช้ามาก จะดีกว่ามั้ยถ้าทุกไฟล์โหลดพร้อมๆ กันไปเลย ด้วยเทคนิคการใช้ Preload key request ตามตัวอย่างนี้เลย <head>   ...   <link rel="preload" href="styles.css" as="style">   <link rel="preload" href="ui.js" as="script">   ... </head> ลองใส่ tag rel="preload"  เข้าไปแล้วลองวัน performance ดูได้ที่ URL นี้เลย https://developers.google.com/speed/

Oracle create index field datetime ด้วย Function-based indexes

บ่อยครั้งที่เรามีข้อมูลเก็บใน field ที่เป็น data type Datetime และมีความจำเป็นต้อง search ด้วยเงื่อนไขของ field นี้ โดยปรกติ เราจะสร้าง index บน Oracle ใน field ที่เราใช้เป็นเงื่อนไข เช่น create index f_datetime_indx on my_table(f_datetime); หากเราทำการค้นหา เช่น select * from my_table where f_datetime = sysdate; คำสั่งแบบนี้ Oracle จะใช้ index ในการทำงาน แต่ถ้าหากเราต้องการ Query ข้อมูลทั้งวันเรามักจะใช้คำสั่ง trunc(d) เช่น select * from my_table where trunc(f_datetime) = trunc(sysdate) ปัญหาจะเกิดขึ้นทันทีเพราะ Oracle จะไม่ใช้ index และจะกลายเป็น Full table scan แนวทางแก้คือให้ใช้   Function-based indexes ตามตัวอย่าง create index f_datetime_indx on my_table(trunc(f_datetime)); เพียงเท่านี้เราสามารถ Query field date โดยใช้ function trunc ใน where condition ได้เลย และ oracle จะใช้ index ในการทำงาน

Short if java ตัวอย่าง Java Short Hand If .. Else

ตัวอย่างการเขียน If .. Else ใน Java แบบ Short Hand Syntax variable = (condition) ? expressionTrue :  expressionFalse; Example Code    public class Test {     public static void main (String args[]){         String condition="Test";         boolean result;                 //Example for Standard JAVA IF ELSE         if("Test".equals(condition)){             result=true;         }else{             result=false;         }         System.out.println("Result Standard Java IF ELSE : "+result);                 //Example for Short Hand JAVA IF ELSE         result="Test".equals(condition)?true:false;                  System.out.println("Result Short Hand Java IF ELSE : "+result);     } } ผลจากการ Run Java Program Result Standard Java IF ELSE : true Result Short Hand Java IF ELSE : true

ตัวอย่าง Java Base64 Encoding and Decoding

ตัวอย่าง Java Code ในการทำ Encode และ Decode   ด้วย Base64 เป็นการ Encode อย่างง่ายสุดนะครับ สำหรับข้อมูลที่ไม่ได้ต้องการปิดบังหรือ Privacy มาก เพราะว่า สามารถ Decode กลับมาเป็นข้อมูลจริง ได้ง่ายมากๆ import org.apache.commons.codec.binary.Base64; public class TestEncode {     /**      * @param args      */     public static void main(String[] args) {         String input="data_for_encode";         byte[] bytes = Base64.encodeBase64(input.getBytes());         System.out.println("Encode " + new String(bytes));         byte[] decodedBytes = Base64.decodeBase64(bytes);         System.out.println("Decode " + new String(decodedBytes));     } } ผลที่ได้จากการ Run ก็ตามรูปต้านล่างเลย Encode ZGF0YV9mb3JfZW5jb2Rl Decode data_for_encode 

วิธีป้องกัน SQL injection PHP กับ codeigniter

บ่อยครั้งคที่เราเขียนโปรแกรมโดยที่ไม่คำนึงถึงความปลอดภัย เปิดช่องโหว่ให้ผู้ไม่หวังดีสามารถใส่ SQL Injection เข้ามาได้ ยกตัวอย่างเช่น หน้าจอ login ถ้าเรา รับ parameter เป็น username กับ password แล้วนำไปใช้ใน SQL Query แบบง่ายๆ เช่น select * from muser where username='$user_name' and password='$passwrod' ดูแล้วก็ไม่น่าจะมีอะไรแต่ลองนึกภาพดูนะ ยกตัวอย่างจาก statement ข้างต้น สิ่งที่ได้คือคำสั่งนี้ select * from muser where username='admin' and password='admin1234' ถ้าหากผู้ไม่หวังดีส่งค่าของ $password เข้ามาแบบนี้ล่ะ    test' or '1'='1  ลองแทนค่าดูก็จะได้แบบนี้ select * from muser where username='admin' and password='test' or '1'='1' คำสั่ง or 1=1 เป็นจริงเสมอรับรองได้เลยว่าไม่ว่าจะใส่ username , password มั่วๆ เข้ามา ก็สามารถทะลุหน้าจอ login เราเข้าไปได้แน่นอน แบบนี้แหละเขาเรียกว่าปัญหา  SQL injection   แนวทางแก้แบบง่ายๆ เลยนะให้เปลี่ยนไปใช้คำสั่งนี้ครับ $dbResult = $this->db-&

Unix การใช้ คำสั่งลบไฟล์ ร่วมกับ คำสั่ง find

Unix การใช้ คำสั่งลบไฟล์ ร่วมกับ คำสั่ง find ใน Unix การ Delete file นั้นเรามักจะคุ้นเคยกับคำสั่ง  rm เช่น rm - f  *.end คือการลบไฟล์ที่นามสกุล .end ทั้งหมด แต่ถ้าหากเราต้องการที่จะทำการใช้คำสั่ง find ก่อนแล้วค่อยทำการลบ result นั้น ให้ใช้คำสั่งนี้ครับ find /var/tmp/stuff -mtime +90 | xargs  rm -f เริ่มจากการ find หา file ที่ modify เก่ากว่า  90 วัน ณ วันที่ค้นหา ( -mtime +90 ) จากนั้นให้ทำการ delete file ที่ได้จาก result ของการ find นั่นเอง