มาเล่น Laravel กัน – ตอนที่ 3: Routing

June 23rd, 2014

ต่อจาก:
ตอนที่ 1: Installation
ตอนที่ 2: Test-driven development

จากตอนล่าสุดเรามีปัญหาว่า Test fail อยู่ใช่มั้ยครับ โดยเนื้อหาที่เรา test จะเป็นประมาณนี้

ไฟล์ app/tests/ExampleTest.php

public function testGamePage()
{
    $crawler = $this->client->request('GET', '/game');
 
    $this->assertTrue($this->client->getResponse()->isOk());
}

สิ่งที่เราเขียนไปคือการทดสอบว่าถ้ามาการส่ง Reqeust แบบ GET Method ไปยัง URL /game จะต้องมี Response OK กลับมา (Response code 200)

ดังนั้นถ้าเราจะทำให้ test ผ่านเราก็ทำการ implement /game นั่นเอง ให้เปิดไฟล์ app/routes.php แล้วเพิ่ม code ดังนี้

Route::get('/game', function()
{
    return 'This is game page.';
});

พอ save ไฟล์ปุ๊บกลับไป test จะเห็นว่าผ่านแล้ว

สิ่งที่เราเขียนไปคือการ implement /game นั่นเอง ว่าถ้ามี request แบบ GET Method เข้ามาให้คืนข้อความว่า “This is game page.” กลับไป

Screen Shot 2014-06-23 at 12.08.51 PM

หากเราลองเปิด URL นี้ไป Web Browser ก็จะได้ผลลัพท์ตามภาพ

Screen Shot 2014-06-23 at 12.17.29 PM

ตอนต่อไปเราจะทำการ refactoring มันซะหน่อย เพราะลองคิดดูว่าถ้าเรามี URL เยอะขึ้นๆ ไฟล์ app/routes.php คงจะยาวเหยียดเป็นแน่แท้ และแน่นอนเราไม่กลัวที่จะต้อง refactoring มัน เพราะว่าเราใช้ TDD นั่นเอง

บันทึกการ upgrade OS X 10.7 (Lion) ไป 10.9 (Mavericks)

January 2nd, 2014

mac-os-x-lion-logo-logic copy

จดไว้ซะหน่อยครับว่า upgrade OS X 10.7 (Lion) ไป 10.9 (Mavericks) โดนอะไรบ้าง

1. iPhoto ใช้ไม่ได้ ต้อง upgrade ผ่าน App Store

2. Illustrator CS6 กดเปิดแล้วมันจะให้ install Java 6 ก่อนถึงจะใช้ได้ (แสดงว่า Mavericks ไม่มี Java?)

3. CCleaner ใช้ไม่ได้ ให้ install ใหม่จาก https://www.piriform.com/mac/ccleaner

4. Parallels Desktop 8 ใช้ไม่ได้ ให้ install ใหม่เป็น Parallels Desktop 9

5. ควร upgrade Xcode ผ่าน App Store เพราะมีผลกับ Dev Tools อื่นๆ

6. MacPorts จะเอ๋อๆ เช่น path ของ tar ของ Lion จะไม่ตรงกับ Mavericks ให้ install ใหม่จาก http://www.macports.org/install.php

7. Ports ใน MacPorts จะเอ๋อๆเหมือนกันเพราะ build ตอน 10.7 เช่น Apache2 ไม่ Auto Start ให้ใช้คำสั่งนี้เพื่อ upgrade

$ sudo port upgrade installed

มาเล่น Laravel กัน – ตอนที่ 2: Test-driven development

December 20th, 2013

ต่อจาก ตอนที่ 1: Installation

เราจะเริ่มเขียนโปรแกรมกับ Laravel กันแล้ว และเราก็จะเขียนแบบ TDD ด้วย คือเขียน Test ก่อน แล้วค่อยเขียน Code เพื่อให้ Test ผ่าน

โดย default แล้ว Laravel จะใช้ PHPUnit เป็น Unit Testing Framework โดยใน Laravel project จะมีไฟล์ phpunit.xml เตรียมมาให้ และ Test จะอยู่ใน app/tests โดยจะมีตัวอย่างไฟล์ชื่อ app/tests/ExampleTest.php มาให้ แล้วเราจะ TDD กับ Laravel ยังไง? ว่าแล้วก็ลุยกันเลย

1. Install PHPUnit:
ใช้คำสั่งดังต่อไปนี้

$ composer global require 'phpunit/phpunit=3.7.*'

จากนั้นกำหนด PATH เพิ่มเติมในไฟล์ ~/.bash_profile ดังนี้

export PATH=~/.composer/vendor/bin:$PATH

ทดสอบด้วยคำสั่งดังต่อไปนี้

$ phpunit --version
PHPUnit 3.7.28 by Sebastian Bergmann.

2. Run PHPUnit กับ Laravel
ใช้คำสั่งดังต่อไปนี้

$ cd /PATH_TO_YOUR_HTDOCS_DIR/mylaravel
$ phpunit

แล้วจะเห็น Test result ประมาณนี้
Screen Shot 2013-12-20 at 3.17.34 PM

3. Install guard/guard-shell:
guard/guard-shell เป็น ruby script ที่ช่วยในการทำ Continuous Testing คือคอย watch file changed แล้ว auto run Test ให้
ส่วนที่เลือก guard/guard-shell เพราะว่าเป็น Ruby ใช้ได้ทั้ง Mac และ Windows และไม่ยึดติดกับภาษา learning curve แทบจะไม่มี ศึกษาครั้งเดียวทำ TDD ได้กับทุกภาษา จะ run อะไรก็ได้ (ผ่าน shell) ส่วนการ install ก็ง่ายสุดๆ
ใช้คำสั่งดังต่อไปนี้

$ sudo gem install guard-shell

4. Config Guardfile:
Guardfile เป็น script ที่บอก guard ว่าจะ watch อะไร และเมื่อมีการเปลี่ยนแปลงให้ทำอะไร
ในการสร้าง Guardfile ใช้คำสั่งดังต่อไปนี้

$ cd /PATH_TO_YOUR_HTDOCS_DIR/mylaravel
$ guard init shell

จะเห็นว่ามีไฟล์ Guardfile เพิ่มเข้ามาใน project ให้เปิดไฟล์​ Guardfile แล้วแก้ไขดังนี้ เพื่อเป็นการ watch .php file และเมื่อมีการเปลี่ยนแปลง จะเรียก phpunit

guard :shell do
    watch(/(.*).php/) {|m| `phpunit` }
end

5. Run guard:
ใช้คำสั่งดังต่อไปนี้

$ cd /PATH_TO_YOUR_HTDOCS_DIR/mylaravel
$ guard
14:50:43 - INFO - Guard is using TerminalTitle to send notifications.
14:50:43 - INFO - Guard is now watching at '/PATH_TO_YOUR_HTDOCS_DIR/mylaravel'
[1] guard(main)>

6. ลองเพิ่ม Test Case:
เปิดไฟล์ app/tests/ExampleTest.php แล้วเพิ่ม code ดังนี้

public function testGamePage()
{
    $crawler = $this->client->request('GET', '/game');
 
    $this->assertTrue($this->client->getResponse()->isOk());
}

จะเห็นว่าพอ save file ปุ๊บ Test จะพังทันที

ตอนต่อไปเราจะมาดูกันว่า เราจะทำให้ Test ผ่านยังไง?
Screen Shot 2013-12-20 at 3.13.22 PM

มาเล่น Laravel กัน – ตอนที่ 1: Installation

December 18th, 2013

สืบเนื่องจากเห็นพี่รูฟกับน้องรุ่งเล่น Silex กัน ผมก็เลยหาอะไรมาเล่นบ้าง (จะใช้กับงานจริงด้วย) หวยมาออกที่เจ้า Laravel 

แนะนำสั้นๆ Laravel เป็น PHP Framework ตัวหนึ่งที่พัฒนามาตั้งแต่ปี 2011 (ปัจจุบัน version 4.X) Laravel มี slogan ว่า “The PHP framework for web artisans” โดย Laravel นั้นถูกสร้างขึ้นจาก components หลายตัวของ Symfony2 แต่ออกแบบเพื่อให้การพัฒนาได้ง่ายกว่า Symfony2 ว่าแล้วก็ลุยกันเลย

Note: บันทึกทุกอย่างทำอยู่บน Mac OS X 10.7.5 (Lion) โดยเริ่มตั้งแต่ศูนย์

1. Install MacPorts:
เอาไว้ช่วย install prerequisites อื่นๆได้ง่าย ให้ download ไฟล์ installer จาก http://www.macports.org/install.php#pkg แล้ว install
จากนั้นลองทดสอบด้วยคำสั่งดังต่อไปนี้

$ port -v
MacPorts 2.2.1

2. Install Apache2, PHP5.5, MySQL5.5, OpenSSL, และ Mcrypt:
ใช้คำสั่งดังต่อไปนี้

$ sudo port install php55-apache2handler php55-mysql php55-openssl php55-mcrypt mysql55-server

จากนั้นกำหนด PATH เพิ่มเติมในไฟล์ ~/.bash_profile ดังนี้

export PATH=/opt/local/bin:/opt/local/sbin:/opt/local/apache2/bin:/opt/local/lib/mysql55/bin:$PATH

สร้าง alias ของ php command ด้วยคำสั่งดังต่อไปนี้

$ sudo ln -s /opt/local/bin/php55 /opt/local/bin/php

3. Config MySQL:
เปิดไฟล์​ /opt/local/etc/mysql55/my.cnf แล้วเพิ่ม config ประมาณนี้ เพื่อกำหนด data directory

[mysqld]
datadir=/PATH_TO_YOUR_DATA_DIR

สร้าง database ตั้งต้นใช้คำสั่งดังต่อไปนี้

$ sudo mysql_install_db --user=mysql
$ sudo mkdir /opt/local/var/run/

กำหนด root password ใช้คำสั่งดังต่อไปนี้

$ sudo mysqladmin shutdown -u root password 'NEW_PASSWORD'

4. Autostart MySQL:
ใช้คำสั่งดังต่อไปนี้

$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql55-server.plist

5. Config PHP:
สร้างไฟล์ php.ini

$ sudo copy /opt/local/etc/php55/php.ini-development /opt/local/etc/php55/php.ini

เปิดไฟล์ /opt/local/etc/php55/php.ini แล้วกำหนด default_socket ดังนี้

mysql.default_socket=/opt/local/var/run/mysql55/mysqld.sock
mysqli.default_socket=/opt/local/var/run/mysql55/mysqld.sock
pdo_mysql.default_socket=/opt/local/var/run/mysql55/mysqld.sock

ทดสอบด้วยคำสั่งดังต่อไปนี้

$ php -v
PHP 5.5.7 (cli) (built: Dec 14 2013 00:44:43) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

6. Config Apache2:
เปิด PHP Module ใช้คำสั่งดังต่อไปนี้

$ cd /opt/local/apache2/modules
$ sudo apxs -a -e -n php5 mod_php55.so

เปิดไฟล์ /opt/local/apache2/conf/httpd.conf
เปลี่ยน DocumentRoot ใหม่

DocumentRoot "/PATH_TO_YOUR_HTDOCS_DIR/"

เพิ่ม config directory permissions

<Directory "/PATH_TO_YOUR_HTDOCS_DIR/">
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

เพิ่ม config PHP extension

AddType application/x-httpd-php .php

เพิ่ม index.php เป็น DirectoryIndex

DirectoryIndex index.html, index.htm, index.php

เปิด Virtual hosts confit ด้วยการ uncomment

Include conf/extra/httpd-vhosts.conf

เพิ่ม Virtual host ชื่อ mylaravel.local.net
เปิดไฟล์ /opt/local/apache2/conf/extra/httpd-vhosts.conf แล้วเพิ่ม config ดังนี้

<VirtualHost *>
    DocumentRoot "/PATH_TO_YOUR_HTDOCS_DIR/mylaravel/public"
    ServerName mylaravel.local.net
</VirtualHost>

7. สร้าง domain mylaravel.local.net:
เปิดไฟล์ /etc/hosts แล้วเพิ่ม config ดังนี้

127.0.0.1 mylaravel.local.net

8. Autostart Apache2:
ใช้คำสั่งดังต่อไปนี้

$ sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist

ทดสอบเปิด Web Browser เข้า

http://mylaravel.local.net

9. Install Composer:
เป็น Dependency Manager for PHP ใข้คำสั่งดังต่อไปนี้

$ sudo php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" -- --install-dir=/usr/local/bin
$ sudo mv /usr/local/bin/composer.phar /usr/local/bin/composer

ทดสอบ ด้วยคำสั่งดังต่อไปนี้

$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 0e9a9a3875c317d610d6a995d94dd598b7bececd 2013-12-16 21:58:46

10. Create Laravel project:
ใข้คำสั่งดังต่อไปนี้

$ cd /PATH_TO_YOUR_HTDOCS_DIR
$ composer create-project laravel/laravel mylaravel --prefer-dist
$ chmod -R 777 mylaravel/app/storage

ทดสอบเปิด Web Browser เข้า

http://mylaravel.local.net

ถ้าเห็นแบบนี้ ยินดีด้วยครับ คุณได้ไปต่อตอนที่ 2 แต่ถ้าไม่ ทิ้ง comment ไว้ด้านล่างเลยครับ

Screen Shot 2013-12-18 at 6.41.25 PM

10 การเปลี่ยนแปลงสำคัญใน Drupal 7

February 14th, 2012

“10 การเปลี่ยนแปลงสำคัญใน Drupal 7″ ตั้งใจจะเขียนนานแล้ว แต่เพิ่งได้มีโอกาสใช้ Drupal 7 แบบลึกซึ้งจริงจัง โดยผมคัดมาเฉพาะที่หัวข้อที่ส่วนตัวคิดว่าสำคัญๆนะครับ

  1. Secure มากขึ้นในการเปลี่ยน Password นั้น User ต้องใส่ Current Password (ถ้าเป็น Drupal 6 ต้องลง Password change confirm เสริม)
  2. สามารถ install/update modules ผ่านเว็บได้เลย (WordPress ทำได้นานแล้วนะ)
  3. Administrative links ทีแสดงด้านบนตลอดเวลาเพื่อให้เข้าถึง Admin functions ต่างๆได้เร็วขึ้น (ถ้าเป็น Drupal 6 ต้องลง Administration menu เสริม)
  4. มี Built-in Cron ไม่ต้องพึ่ง Server Config แล้ว (ถ้าเป็น Drupal 6 ต้องลง Poormanscron เสริม)
  5. มี RDF (RSS Feed) ในตัว (ถ้าเป็น Drupal 6 ต้องลง Views หรือ RDF เสริม)
  6. Content Construction Kit (CCK) หนึ่งใน Module ที่ขาดไม่ได้ ถูกรวมเข้ามาใน Drupal 7 Core Modules
  7. Custom Fields (แบบ CCK) นอกจากจะสามารถเพิ่มเข้าไปใน Node แล้ว ยังสามารถเพิ่มเข้าไปใน User, Comment, และ Taxonomy Terms ได้อีกด้วย
  8. Modules เสริมที่เกี่ยวกับ Images ถูกรวมเข้าไปใน Drupal 7 Core Modules - ImageAPIImageCacheImageField
  9. มีหน้า Dashboard แบบ WordPress แล้ว โดยสามารถดูสรุปต่างๆเกี่ยวกับ Site ได้อย่างรวดเร็ว
  10. เปลี่ยน jQuery จาก 1.3 เป็น 1.4 (jQuery ปัจจุบัน 1.7 แล้วนะ)

ส่วนด้านล่างนี่เป็นของแถม เป็นรายชื่อ Modules ที่ “จำเป็น” ต้องลงเสริม

  1. Views
  2. Chaos tool suite (ctools)
  3. Administration menu ยังไงก็ยังเจ๋งกว่า Administrative links ของ Drupal 7
  4. LoginToboggan
  5. Pathauto
  6. Webform
  7. Mobile Tools
  8. Zen
  9. Zenophile
  10. Devel

คนไทยส่ง SMS เข้ามือถือผ่าน Gmail ได้ฟรีแล้ว (ไม่ใช่ Google Calendar นะ)

October 18th, 2011

อย่างที่หลายๆคนน่าจะทราบว่า Google นั้นมีบริการส่ง SMS ฟรีในต่างประเทศเช่น US มานานแล้ว ส่วนในไทยนั้นก็ส่งฟรีเหมือนกันแต่ต้องเป็นการ Notification ต่างๆของ Google Calendar ซึ่งมีการหลายคนนำ API มาแปลงเป็นส่ง SMS หาตัวเองหรือคนที่รู้จักกันฟรี เพราะว่าเบอร์ที่จะรับ SMS ได้นั้นต้องทำการ Verify กับทาง Google ก่อน เราจึงไม่สามารถนำ Google Calendar มาใช้ส่งหาใครก็ได้

โดยนะล่าสุดเพื่งพบว่าเราสามารถเปิด SMS (text messaging) in Chat และ SMS in Chat gadget และ Labs Setting ของ Gmail ได้แล้ว

วิธีการใช้งานก็สุดแสนจะง่ายดาย แค่พิมพ์หมายเลขของผู้รับ SMS เช่น 0812223333 จากนั้นกด Enter จะเห็นว่าไม่ต้องใช้ Country code เช่น +66 ด้านหน้า

จากนั้น Gmail จะให้เราใส่รายละเอียดเพื่อสร้าง Contact จากหมายเลขนี้ (เฉพาะครั้งแรกเท่านั้น)

จากนั้นเราก็พร้อมที่จะส่ง SMS ไปหาหมายเลขนั้นแล้วล่ะครับ

ฝั่งผู้รับ

ส่วนในครั้งต่อไปถ้าอยากจะส่ง ก็สามารถกดได้ที่ชื่อ Contact ที่เราสร้างไปก่อนหน้านี้ได้เลยครับ

ส่วนข้อจำกับตอนนี้เท่าที่ทราบคือ:

  • ในประเทศไทย Operators ที่รองรับมีแค่ DTAC และ TrueMove นะครับ สาวก AIS หรือค่ายอื่นๆคงต้องรอไปก่อน – Reference
  • Credits ในการส่งคือ 50 ครั้ง โดยหลังจาก Credits เหลือ 0 แล้ว ระบบจะเติมกลับให้ภายใน 24 hrs นอกจากนี้ Credits จะเพิ่มขึ้น 5 Credits ทุกครั้งที่มีคน Reply กลับหาเรา (3 บาท ต่อ 5 SMS?) - Reference
  • การ Reply จาก Mobile นั้นสามารถส่งกลับมาหา Gmail ได้ แต่ผู้ส่ง (เจ้าของมือถือ) จะต้องเสียค่า SMS ให้กับ Operator เอง - Reference
  • หมายเลขของผู้ส่งนั้นจะเป็นของ Google แต่จะไม่มีื่ชื่อผู้ส่ง โดยทุก SMS จะมีข้อความการลงท้ายเพื่อบอกว่าผู้ส่งใช้ Email Address อะไร ดังนั้นถ้าผู้รับจำ Email Address เราไม่ได้ก็อาจจะงงๆเล็กน้อย

Check Me In – The Facebook App for check in to anywhere

August 6th, 2011

Check Me In allow you to check in to anywhere from any Web Browsers, Computers or Mobile Devices. It’s free.

The technologies behind Check Me In are:

  • HTML5 Geolocation API
  • Google Maps API
  • Google Gears
  • Facebook Checkin API
  • Facebook Search API

How to display all online friends in Facebook chat?

July 26th, 2011

As you know, Facebook has announced a new Chat UI. Unfortunately, the new UI is useless. It doesn’t show all your online friends.

But there is some secret, you can get the old chat UI back, just open this URL – https://www.facebook.com/presence/popout.php

ความจริง 9 ข้อเกี่ยวกับ Google+

July 3rd, 2011

หลายท่านคงได้เล่น Google+ กันมาพอสมควร ส่วนตัวผมเองเพิ่งมีโอกาสได้เล่น (วันหยุดพอดี) เลยขอสรุปสั้นๆให้เข้าใจกันง่ายๆ 9 ข้อดังนี้

  1. Google Plus = Facebook + Twitter คือไม่ต้องเป็น Friend กันก็ Follow กันได้ Comment กันได้ ด้วยเหตุนี้ Account ใน Google Plus ไม่น่าจะแบ่งแบบ Facebook ที่มี Pages ให้ Users ทั่วไป Follow
  2. เท่าที่ลองไม่มีการ Limit ตัวอักษรแบบ Twitter ที่ 140 หรือ Facebook ที่ 420 ตัวอักษร
  3. ความเจ๋งของ Stream ของ Google Plus อยู่ที่คุณสามารถแก้ไข Stream ที่ Share ไปแล้วได้ ซึ่งอย่างที่รู้กัน Facebook กับ Twitter ทำไม่ได้
  4. Google Plus มีการนำ GTalk, GMail, Picasa, Profile, +1, และ Buzz มารวมอยู่ด้วย (แต่ไม่ยักกะมี Youtube แฮะ)
  5. Circles เทียบเท่ากับ Following ใน Twitter โดยสามารถสร้าง Circle ย่อยๆเทียบเท่ากับ Lists ใน Twitter นั่นเอง
  6. +1 เทียบเท่ากับ Like นั้นเอง จริงๆเป็น Feature ที่ Twitter ควรจะมีมานานแล้ว เพราะเป็นการบอกถึงความ Popular ของ Post นั้นๆ
  7. Google Plus สามารถ Share ต่อได้ทุกอย่าง (เทียบเท่า Retweet หรือ Via ของ Facebook) แม้กระทั่ง Message ธรรมดา ที่ Facebook ไม่รู้ทำไมไม่ยอมให้ Share
  8. Hangouts มันคือการ Share Live Streaming ที่ Twitter และ Facebook ไม่มี (แต่เข้าใจว่า Facebook น่าจะมี 3rd Party Apps อยู่)
  9. Google Plus API กำลังจะมา ถ้าสนใจไปลงชื่อรอกันได้

Open Finder and Terminal from Eclipse on Mac

January 6th, 2011

อธิบายด้วยภาพละกันนะครับ

Finder

Terminal