วันพุธที่ 26 ตุลาคม พ.ศ. 2559

PHP อ่านค่าของ EXIF Metadata ของรูปภาพ

จะใช้ function ที่ชื่อว่า exif_read_data()  เช่นตัวอย่างนี้

<?php
$exif = exif_read_data('<filename>', 0, true);
echo "<filename>:<br />\n";
foreach ($exif as $key => $section) {
    foreach ($section as $name => $val) {
        echo "$key.$name: $val<br />\n";
    }
}
?>

โดย PHP จะไปอ่านค่าของ Metadata ของ รูปภาพและเอามาวนลูปแสดงผล

ทั้งนี้จะต้องไปเพิ่ม exetension ใน PHP.ini 
extension=php_exif.dll
และ Restart Web Server ก่อนถึงจะใช้ได้นะครับ

วันพฤหัสบดีที่ 15 กันยายน พ.ศ. 2559

ปัญหา PHP JSON ไม่แสดงภาษาไทย

ไปพบปัญหาของ Function json_encode ของ PHP ว่าจะไม่แสดงภาษาไทย  แต่จะแสดงเป็น Code แทนเช่น \u0e1a\u0e23\u0e34\u0e29\u0e31\u0e17  หากเข้าไปดูใน Web ต่างๆของคนไทยเขาขะให้ใช้ Function iconv() ในการแก้ปัญหา  ซึ่งลองแล้วไม่ได้ เลยลองหาที่อื่นดู  พบวิธีที่ง่ายกว่าโดยเป็น Custom Function ชึ้นมาเอง คือ

 function jsonRemoveUnicodeSequences($struct) {
   return preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($struct));
}

หรือ

function raw_json_encode($input, $flags = 0) {
    $fails = implode('|', array_filter(array(
        '\\\\',
        $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
        $flags & JSON_HEX_AMP ? 'u0026' : '',
        $flags & JSON_HEX_APOS ? 'u0027' : '',
        $flags & JSON_HEX_QUOT ? 'u0022' : '',
    )));
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
    $callback = function ($m) {
        return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
    };
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
}

โดยใช้ Function ใดก็ได้ครับ

หรือหากใช้ PHP Version ที่สูงกว่า 5.4 สามารถใช้ Code ตามนี้ไได้นะครับ

$json=json_encode([$json_data],JSON_UNESCAPED_UNICODE);

การใช้งาน Node.JS - การติดตั้ง express และสร้าง Project แรก

ในส่วนนี้จะเป็นการติดตั้ง library ชื่อ express เพื่อใช้สร้าง Web App ขึ้นมา โดยขั้นตอนคือ
  1. สร้าง Folder Project  ขึ้นมา 1 Folder และเปิด Folder ขึ้นมาจากนั้นกด Shift ค้าง และ Click Mouse ขวา เพื่อเข้าสู่หน้า Command Line
  2.  เมื่อเข้าหน้า Command แล้วให้พิมพ์ว่า  npm install -g express-generator
    เพื่อติดตั้ง Library Express เข้าแบบ ไปใน Project หากพิมพ์ถูกต้อง NPM ก็จะติดตั้ง Library express ดังรูป

  3. พิมพ์  express เพื่อให้ nodeJS สร้าง Folder และ copy file ที่จำเป็นต้องใช้เข้ามา ดังรูป

    หากไม่มีข้อผิดพลาด ใน Folder Project  ของเราจะมี Folder และ File ตามในรูป
  4. พิมพ์ npm install   เพื่อ download File ที่เกี่ยวข้องเข้ามาใน Project ของเรา ดังรูป


  5. เมื่อติดตั้งสำเร็จให้พิมพ์ npm start เพื่อทดสอบว่าใช้ๆด้หรือไม่  หากไม่มีปัญหาจะขึ้นมาดังรูป
  6. ลองเปิดหน้า Browser ขึ้นมาแล้วพิมพ์ URL ว่า http://127.0.0.1:3000 จะขึ้มมาดังรูป



  7. หากต้องการจะเปี่ยน Port นั้น สามารถเข้าไปเปลี่ยนได้โดยเข้าไปที่ Folder bin จะมี file ชื่อ www ที่ไม่มีนามสกุลอยู่  ลองเปิดดูและสามารถเปลี่ยน Port ได้ตามรูป

  8. Folder ต่างๆใน Project นั้นจะมีหน้าที่มต่างๆกันไปคือ
    ==>Folder - bin ทำหน้าที่ เก็บค่า config ต่างๆ
    ==>Folder - node_modules ทำหน้าที่ เก็บ File Library Modules ต่างๆที่ได้จาก npm install
    ==>Folder - public ทำหน้าที่ เก็บ resource ของ Project เช่น พวก Images หรือ javascript Client
    ==>Folder - routes ทำหน้าที่ เก็บ File JS
    ==>Folder - views ทำหน้าที่ เก็บ Template HTML ต่างๆของระบบ (นามสกุล .ejs)
    ==>Files - app.js ทำหน้าที่ เป็น File เริ่มต้นของระบบ
    ==>Files - package.json ทำหน้าที่ เก็บรายละเอียดต่างๆของ Project

  9. เนื่องจากเราใช้ File .ejs เป็น HTML Template ในการแสดงผลของ Project จึงต้องมีการแก้ค่า Config บางอย่างเพิ่มเติมคือ
    แก้ File package.json โดยการเปิดบน Notepad แล้วแก้ส่วนที่เป็น
    "jade": "~1.11.0", เป็น  "ejs":"*", ดังรูป

    แก้เป็น
  10. จากนั้นเข้า command line พิมพ์ npm install ejs เพื่อติดตั้ง ejs viewer module
  11. เพื่อเป็นการลดขนาดของ File ที่อยู่ใร Project เรา  ให้ uninstall module jade ออก โดยพิมพ์
    npm uninstall jade ดังรูป

  12. จากนั้นเข้าไปที่ File app.js เพื่อ Config ให้ใช้ File ejs ได้โดยลบบรรทัดที่เป็น
    app.set('view engine', 'jade');
    และเพิ่ม
    app.set('view engine', 'html');
    app.engine("html",require("ejs").renderFile);
    ดังรูป

  13. จากนั้นลอง start project ขึ้นมาอีกครั้งโดยใช้คำสั่ง npm start  และลองเข้า Browser และเรียก URL นี้ดู จะขึ้น Error ดังรูป

  14. สาเหตุที่ Error นั้นเนื่องจาก เรายังไม่มี file html template ในการแสดงผล  โดยเราจะสร้าง file .html เพื่อใช้ในการแสดงผล ซึ่ง File html เหล่านี้จะอยู่ใน Folder views ใน Project ของเรา ลองสร้าง file ชื่อ error.html โดยใน File ดังกล่าวจะมี Code ดังนี้
  15. ส่วนของ Tag Body ตามที่วงกลมไว้จะเป็นส่วนที่รับค่ามาแสดงบน Template

    โดยค่านั้นจะมาจาก File app.js ในการส่งค่า Error มา
  16. สร้างขึ้นมาอีก 1 file และให้ใช้ชื่อว่า index.html  โดยข้างใน File มี code ดังนี้

    ลองเรียกใหม่จะขึ้นหน้า Web Page แล้วมาดังรูป

วันพฤหัสบดีที่ 8 กันยายน พ.ศ. 2559

การใช้งาน Node.JS - การเรียกหน้า Page และการรับ-ส่งค่า

ในการรับและส่งค่าต่างๆ หรือการเรียก Page ต่างๆของ NodeJS และ Express นั้นจะใช้เป็น

http://sitename/route/action/parameter  เช่น 
http://127.0.0.1:3000/home/login/1  จะหมายถึง เรียกไปยัง site 127.0.0.1 ที่ Port 3000 โดยจะไปเรียก file script ที่ชื่อ home ที่อยู่ใน folder route และมี action ชื่อ login พร้อมทั้งส่ง Parameter =1 โดยที่ค่า action และ parameter จะส่งไปหรือไม่ก็ได้ 
ต่อไปก็จะลองสร้าง route ขึ้นมาใหม่อีก 1 route ใช้ชื่อว่า news.js อยู่ใน Folder routes โดยที่ข้างในจะมี code คือ

หลังจากนั้นให้เปิด file app.js และเพิ่มคำสั่ง
var news=require('./routes/news'); 
และ
app.use('/news',news); 
เพื่อให้ระบบรู้จัก route ใหม่ที่เราสร้างขึ้นมา ดังรูป

เมื่อ save app.js แล้วลอง run project ใหม่อีกครั้งโดยใช้คำสั่ง npm start ผ่านทาง command line อีกครั้ง
จากนั้นเปิด Browser และใส่ URL 127.0.0.1:3000/news จะขึ้นผลลัพธ์ดังรูป


จะเห็นว่าหน้า Browser จะแสดงข้อมูลเหมือนกับที่เป็นหน้า index.html   ทั้งนี้เนื่องจากใน file news.js นั้นเราสั่งเรียก file index.html มาแสดงผล

ทีนี้ลองเพิ่มในส่วนของส่งค่า Action เพิ่มลงใน file news.js  โดยการพิมพ์ code ต่อไปนี้
route.get('/feed',function(req,res,next){    res.send('Show Feed Action in Route News');})
เป็นการส่งค่า Action feed โดยจะส่งเป็นแบบ GET ไปให้ และProject จะส่ง Message "Show Feed Action in Route News" กลับมาแสดงลงบน WebPage 


ทีนี้สร้าง file ชื่อ news.html ไว้ใน Folder views  โดยข้างในมี code คือ

จากนั้นเข้าไปแก้ File news.js ใน Folder routes เป็นตามนี้
แล้วให้ลอง Run Project ใหม่  จากนั้นเปิด Browser เข้า URL เป็น http://127.0.0.1:3000/news จะได้หน้าตาเป็นแบบนี้

ลองพิมพ์คำค้นและกดปุ่ม Search และดูผลลัพธ์ที่เกิดขึ้น

เมื่อมาดูในส่วนของ Commandline จะพบว่ามีข้อมูลที่มาแสดงในรูปแบบของ JSON เยอะไปหมด แต่ที่หน้าสนใจคือ

ในส่วนของที่ขีดเส้นใต้จะเห็นว่าระบบนั้นรับค่าตัวแปรมาเป็น JSON แสดง  หากเราต้องการที่จะอ้างอิงก็ทำได้โดยการอ้างอิงผ่านตัวแปร req  เช่น 
req.body.txtkeyword

เราสามารถส่งค่าแบบ GET ในรูปแบบของ Pretty URL (SEO URL) เช่น 
http://127.0.0.1:3000/news/search/2016/
คือ เรียก route news ผ่าน Action search โดยส่ง Parameter หนึ่งตัวมีค่าเท่ากับ 2016
ใน Code ของ file news.js เพิ่มดังนี้
คือ เราจะสร้าง Action ขึ้นมา 2 ตัว ใช้ชื่อ Search เหมือนกัน  แต่จะรับ Parameter ต่างกัน โดยที่ Action แรกจะรับเพียง 1 Parameter ชื่อ keyword แต่อีกอันจะรับ 3 Parameter คือ keyword1 ,keyword2 และ keyword3  เมื่อเปิดผ่าน Browser จะเป็นดังนี้

แบบ 1 Parameter

แบบ 3 Parameter






วันจันทร์ที่ 15 สิงหาคม พ.ศ. 2559

การใช้งาน Node.JS - การติดตั้ง NodeJS และการใช้งานเบื้องต้น

      NodeJS  เป็นการเขียน Javascript ในฝั่งที่เป็น Server ไม่ว่าจะเป็น Web App หรือ Script บนฝั่ง Server นั่นเอง
      ข้อดีของ NodeJS คือความรวดเร็วในการประมวลผล ,การทำงานแบบ Async คือไม่ต้องทำงานเป็นลำดับ  แต่จะพยายามทำงานให้เสร็จเร็วที่สุด (ซึ่งเราสามารถที่จะให้รอการทำงานให้ส่วนอื่นๆแล้วค่อยให้ประมวลผลต่อได้) และที่สำคัญคือรองรับในทุก Platform หลัก  ไม่ว่าเป็น Windows ,MAC ,Linux
      ในการติดตั้ง NodeJS ให้ไป Download ตัวติดตั้งได้ที่ https://nodejs.org/en/download/ ให้เลือก Platform ให้ตรงกับ OS ที่เราไปติดตั้ง และถูกทั้งประเภทของ CPU ของเครื่อง  โดยการติดตั้งนี้จะทำการลงโปรแกรม 2 ตัวคือ NodeJS และ NPM

     เมื่อติดตั้งเสร็จแล้ว  ให้ลองเปิดหน้า command line และพิมพ์ว่า node -v หากไม่มีปัญหาจะขึ้นหมายเลข Version ของ NodeJS ที่เราติดตั้งไป ดังรูป


ในการใช้งานเบื้องต้นของ NodeJS ได้โดยผ่านหน้า command โดยพิมพ์ node และกด Enter ดังรูป
ลองพิมพ์ว่า console.log('hello') และกด Enter ก็จะขึ้นผลลัพธ์คำว่า hello ดังรูป

หรือจะประกาศตัวแปรขึ้มมาและใส่ค่าเข้าตัวแปรก็ได้ เช่น
ในส่วนนี้คือประกาศ ตัวแปร x ขึ้นมา และให้ตัวแปร x มีค่าเท่ากับ 1  จากนั้นก็ให้แสดงค่าตัวแปร x ออกมาบนหน้าจอ  จะเห็ได้ว่าในการพิมพ์คำสั่งแบบนี้จะได้ทีละบรรทัดเท่านั้น  หากต้องการที่จะเขียนเป็น Batch File ก็ได้  โดยจะต้องเขียนเป็น File .JS เช่น

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
โดยพิมพ์ลงไปใน nodepad แล้ว save เป็น file ชื่อ webserver.js  จากนั้นเข้าหน้า command และพิมพ์ว่า node webserver.js เพื่อเรียกใช้จะขึ้นมาดังรูป
คำสั่งนี้เป็นการสร้าง Web Server ขึ้นมาโดยจะใช้ Port ที่ 1337  หากเปิด Browser ขึ้นมาและพิมพ์ว่า http://127.0.0.1:1337 ก็จะขึ้นมาดังรูป


หากต้องการออกจาก nodeJS ให้พิมพ์กด ctrl+C

หมายเหตุ  จะต้องให้ Path ในส่วนของหน้า command อยู่ที่เดียวกับ File .JS เสียก่อนถึงจะสามารถใช้งานได้

  จะเห็นได้ว่าเราสามารถใช้ NodeJS ในการทำเป็น Web Server เพื่อที่จะรับ Request ของ Web ได้แต่ก็จะยุ่งยากเกินไป  แต่เราก็สามารถใช้ Library ช่วยได้

วันจันทร์ที่ 3 สิงหาคม พ.ศ. 2558

แก้ไข Timezone ของ PHP บน Windows Server และ IIS

พอดีมีความจำเป็นที่ต้องใช้ Opensource ที่เป็น PHP บนเครื่อง Windows Server  พบว่า หลังจากที่ทดสอบ Open Source ในการ Update ข้อมูลที่เป็น Date  ของ PHP จะให้ค่าที่เร็วกว่าเวลาในเครื่องประมาณ 1 ช.ม. ได้ตรวจสอบทุกอย่างไม่ว่าจะเป็น Timezone ของ Server หรือ ค่า Time ของ Server ดูแล้วพบว่าทุกอย่างนั้นปรกติดีไม่มีอะไรผิดเพี้ยนไป  จึงลองใช้คำสั่ง PHPinfo() เพื่อดูค่า Config ของ PHP ดูพบว่า timeZone ของ php.ini เป็น Asia/Krasnoyarsk

หากค้นจากใน Web จะมีวิธีแก้ว่าให้แก้ที่ PHP.ini ในส่วนของ [Date] ให้ใส่เพิ่มว่า date.timezone = Asia/bangkok ก็จะหาย


ซึ่งได้แก้ตามแล้วลอง PHPinfo() ดูใหม่อีกครั้ง  ก็ไม่หายทัังลอง Restart Service ของ IIS หรือ Restart Server เลยก็ไม่เปลี่ยน  เลยลองค้นใน Internet ดูอีกที พบว่าถ้าเป็น Windows Server นั้นจะต้องแก้ PHP.ini อีกที่นึงคือ ในหมวดของ [WebPIChanges]  นั้นก็ต้องใส่ date.timezone = Asia/bangkok เพราะว่าทาง Windows Server ที่เป็น IIS จะอ่านที่เป็น [WebPIChanges] แทน
ซึ่งหลังจากใส่แล้วลองใช้ PHPinfo() ดูก็จะเปลี่ยนแล้วตามค่า Config ที่ใส่ไป


วันจันทร์ที่ 4 สิงหาคม พ.ศ. 2557

เขียน VB.NET ให้ Monitor File ใน Folder

       ในการเขียนให้ VB.NET ทำการ Monitor การเปลี่ยนแปลงของ File ใน Folder ที่เรากำหนดไว้  เริ่มแรกเราจะต้องทำการ Import Class System.Diagnostics เข้ามาใน Project ของเราก่อน

Imports System.Diagnostics

ตากนั้นเราก็ประกาศตัวแปรขึ้นมา Type เป็น FileSystemWatcher ไว้ที่ด้านบนสุดของ Class เพื่อที่ทุก Function ใน Class สามารถที่จะเรียกใช้ได้  

Dim watchFolder As FileSystemWatcher

และเมื่อต้องการที่จะใช้งาน เช่น กดปุ่มเพื่อให้เริ่ม Monitor ก็จะเรียกใช้ดังนี้

Private Sub cmdCompare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCompare.Click
      watchFolder = New FileSystemWatcher
      watchFolder.SynchronizingObject = Me
      watchFolder.Path=[Path Folder ที่ต้องการ Monitor]
'กำหนดประเภทของ Monitor Folder
      watchFolder.NotifyFilter = NotifyFilters.DirectoryName
      watchFolder.NotifyFilter = watchFolder.NotifyFilter Or NotifyFilters.FileName
      watchFolder.NotifyFilter = watchFolder.NotifyFilter Or NotifyFilters.Attributes
'เพิ่ม Events ของการ Monitor ว่าหากเกิดการเปลี่ยนแปลงที่กำหนดไว้แล้วจะให้ทำอะไร
'กรณีที่เกิดการเปลี่ยนแปลง File
      AddHandler watchFolder.Changed, AddressOf [ชื่อ Function ที่จะให้ไปทำ]
'กรณีที่เกิดการ create File ใหม่
      AddHandler watchFolder.Created, AddressOf [ชื่อ Function ที่จะให้ไปทำ]
'กรณีที่เกิดการลบ File ทิ้ง
      AddHandler watchFolder.Deleted, AddressOf [ชื่อ Function ที่จะให้ไปทำ]
'เริ่มการ Monitor Folder เพื่อจับการเปลี่ยนแปลงของ File ต่างๆ
      watchFolder.EnableRaisingEvents = True
End Sub

หากเราต้องการที่จะหยุดการ Monitor ก็แค่สั่งให้ EnableRaisingEvents = false เท่านั้นเองครับ

ส่วนใน Funtion ที่เราจะให้มันทำงานเมื่อมีการเปลี่ยนแปลงนั้นก็มีการเพิ่มการรับค่าอีกนิดหน่อย  โดยตอนที่ประกาศ Function นั้นต้องมีการรับ Parameter e มาเป็น System.IO.FileSystemEventArgs ด้วย เช่น

Private Sub reCheckFile(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
       
End Sub

ส่วนในการตรวจเช็คค่าที่เกิดขึ้นนั้น จะใช้เป็น e.ChangeType เพื่อเป็นตัวบอกว่า File ที่มีการเปลี่ยนแปลงนั้นเป็นประเภทได้ เช่น Created, Changed, Deleted, Renamed เช่น

Select case e.ChangeType
       case WatcherChangeTypes.Created
              'Do Something
       case WatcherChangeTypes.Changed
              'Do Something
end Select

      นอกจากนั้น  หากเราต้องการที่จะทราบว่า File อะไรที่มีการเปลี่ยนแปลงก็ใช้ e.name หรือใช้ e.FullPath เพื่อแสดง Path เต็มของ File ที่มีการเปลี่ยนแปลง

แต่จากการใช้งานจะพบปัญหาอยู่ 2 อย่างคือ
  1. ในกรณีที่ File มีการ Change นั้นจะมีการ Raise Event ออกมา 2 ครั้ง
  2. เราจะไม่สามารถเรียกใช้ Function อื่นได้  เนื่องจากเป็นการ Run อยู่บนละ Process และ .NET นั้นไม่ยอมให้มีการเรียกใช้ Function กันข้าม Process ได้
แต่ก็มีวิธีการแก้ไขอยู่ทั้ง 2 วิธีคือ
  1. ปัญหาแรกนั้น ก็อาจจะประกาศตัวแปรที่เป็น Boolean เพื่อเช็คว่ามีการทำไปแล้วหรือยังก็ได้
  2. ปัญหาที่ 2 นั้นให้เรียก Function อื่นผ่าน Method Invoke ของโปรแกรม  เช่น
    Me.Invoke(New MethodInvoker(Function() [ชื่อ Function](Parameter) ) )

fanslave3

get-fans-468x60-2