I’m back!.

Posted by AnnoMundi on July 13, 2008

กลับมาเขียนบล็อกต่อแล้วครับ หายไปนานเลยไม่ได้อัพเดทบล็อกซะนาน ความจริงผมก็ยังอยู่แหล่ะ เพียงแต่ไปติดเกมส์บ้าง ติดงานบ้าง เลยไม่ได้มาเขียนบล็อกเลย ^^” แต่ยังคอยมาอัพเกรด WordPress ลบ Spam comment อยู่เรื่อยๆ เพราะกลัวทิ้งไว้ไม่อัพเกรด WordPress ปล่อยไว้อาจไม่ปลอดภัย

วันนี้ผมก็ใช้เวลาพักนึงในการปัดฝุ่น WordPress ด้วยการลบ Plugin และ Theme เก่าๆที่ไม่ได้ใช้ รวมถึงติดตั้ง reCaptcha เพราะ spam ค่อนข้างเยอะเลยเอาไว้เป็นด่านแรกกัน spam ถ้ายังผ่านได้ก็เจอกับ Akismet ซึ่งน่าจะเอาอยู่

คราวนี้กลับมาก็กะจะอัพเดทเขียนบล็อกเรื่อยๆ ครับ ว่าแล้วขอตัวไปคิดก่อนว่าจะเขียนเรื่องอะไรดี

Getting Started With Capistrano 2.0

Posted by AnnoMundi on August 02, 2007

หลังจากได้ลองศึกษาและเขียน Web Application ด้วย Ruby On Rails มาได้สักพัก ก็ได้เวลา เอา Web Application ที่ทำ ไปใช้งานจริง ซึ่งในช่วงแรก ผมอาศัยการก็อปปี้จากตัว Development ไปใช้งาน โดยเปลี่ยน config ให้รันในโหมด Production ทั้งนี้ผมรันทั้ง Development และ Production บนเครื่องตัวเองที่บ้านครับ เพราะต้องการศึกษา และทดสอบให้มั่นใจซะก่อน

และจากเดิมที่ใช้วิธีการก็อบปี้ ก็เปลี่ยนมาใช้ Subversion ช่วยซึ่งก็ทำให้สะดวกขึ้น และในที่สุดก็เลยมาลองใช้ Capistrano เพราะเห็นใครๆเขาก็ใช้กัน ^^ และพอได้มาลองใช้ดู ก็พบว่าวิธีการใช้งาน ที่มีคนเขียนไว้ตามเว็ปต่างๆนั้น ใช้แทบไม่ได้เลย - -” เพราะเวอร์ชั่น 2.0 นี้ต่างจากของเดิมเยอะพอสมควร ก็เลยต้องลองผิดลองถูก เดาๆเอาจากของเดิมที่มีคนเขียนอธิบายไว้ กับที่เว็ปของ Capistrano เขียนไว้ (น้อยจัง) พอทำสำเร็จเลยต้องมาเขียน Blog ไว้กันลืม ^^”

เริ่มต้นเลยใช้เช็คก่อนว่าเราได้ลง Capistrano 2.0 ไว้หรือยัง

gem list

ถ้ายังไม่ได้ลงก็จัดการลงเลยครับ

sudo gem install capistrano

จากนั้นก็ใน Project Root directory ซึ่งในกรณี้ของผมโปรเจคชื่อ inventory และอยู่ที่ Directory /home/my_local_username/aptana/workspace/inventory

cd ~/aptana/workspace/inventory

จากนั้นก็ทำการสร้างคอนฟิกไฟล์ของ Capistrano ใน Project ของเราด้วยคำสั่ง

capify .

จากนั้นถ้าจะดูว่าเราสามารถใช้คำสั่งอะไรได้บ้างให้ลองใช้คำสั่งนี้ดูครับ

cap -T

ทีนี้ให้เราไปเปิดไฟล์ config/deploy.rb เพื่อแก้ไขคอนฟิกให้ใช้งานได้ถูกต้องตามต้องการ ซึ่งปกติหน้าตาไฟล์คอนฟิกที่มันสร้างให้จะเป็นดังด้านล่างนี้

set :application, "set your application name here"
set :repository,  "set your repository location here" 

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}" 

# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "your app-server here"
role :web, "your web-server here"
role :db,  "your db-server here", :primary => true

ก็ให้แก้ตัวแปร

  • :application เป็นชื่อโปรเจค
  • :repository เป็น subversion repository ที่โปรเจคนี้ใช้งาน
  • :runner เป็น username ที่ใช้งานบน Remote Server
  • :runner เป็น username ที่ใช้งานบน Remote Server
  • :deploy_to เป็น path ที่เราจะ deploy web application บน Remote Server
  • :app, :web และ :db เป็นชื่อโดเมนของ Remote Server ที่เราจะ Deploy Web ซึ่งในกรณีของผม ผมจะ Deploy ไปยัง inventory.codesniper.org ซึ่งอยู่ในเครื่องที่ ผมทำงานนั่นแหล่ะ แต่ผมเซ็ตชื่อโดเมนไว้ใน /etc/hosts application

หลังจากแก้ไขไฟล์ config/deploy.rb เสร็จหน้าตาก็จะเป็นดังนี้

set :application, "inventory"
set :repository,  "http://localhost/svn/inventory/trunk"
set :runner, 'my_remote_username'
# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"
set :deploy_to, "/home/my_remote_username/RailsProjects/#{application}"
# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "inventory.codesniper.org"
role :web, "inventory.codesniper.org"
role :db,  "inventory.codesniper.org", :primary => true

task :after_setup do
  run "mkdir -p #{shared_path}/media"
  run "mkdir -p #{shared_path}/media/thumbnail"
end

task :after_symlink do
  run "rm -rf current/public/media"
  run "ln -s #{shared_path}/media #{current_path}/public/media"
end

แต่ทั้งนี้จะเห็นว่าผมใส่ Callbak Task ไว้ 2 Task คือ :after_setup ส่วนการทำงานเดี๋ยวผมจะ อธิบายทีหลัง ทีนี้หลังจากที่เราแก้ไขไฟล์ deploy.rb เสร็จแล้ว เราจะทำการเซ็ต ในส่วนที่เกี่ยวกับการ สั่งรัน Web Application บน Remote Server ซึ่งในที่นี้ผมจะรันด้วย Mongrel ดังนั้นเราต้องสร้างไฟล์ script/spin ขึ้นมา

nano -w script/spin

โดยในไฟล์ spin นี้ให้ใส่คำสั่งดังต่อไปนี้ (อย่าลืมแก้ไข Path ให้ถูกต้องด้วยนะครับ) ไฟล์นี้จะถูก Capistrono เรียกใช้โดยอัตโนมัติ

/home/my_remote_username/RailsProjects/inventory/current/script/process/spawner -p 5010 -i 2

โดยไฟล์นี้จะทำหน้านี้รัน Mongrel ในที่นี้ผมเซ็ตให้รัน 2 Process เพราะผมได้เซ็ต Apache/mod_proxy ไว้แล้ว และหลังจากนี้ ให้เราแก้ไขไฟล์ config/database.yml กันก่อน เนื่องจากผมใช้ sqlite3 เป็นฐานข้อมูล ดังนั้นเพื่อไม่ให้มีปัญหาตอน Deploy ผมเลยแก้ไขไฟล์ database.yml เป็นดังนี้

development:
  adapter: sqlite3
  database: db/development.sqlite3

test:
  adapter: sqlite3
  database: db/test.sqlite3

production:
  adapter: sqlite3
  database: /home/my_remote_username/RailsProjects/inventory/shared/production.sqlite3

ที่ต้องระบุ path ของ Production database ดังด้านบน ก็เพราะถ้าเราเก็บไฟล์ฐานข้อมูลไว้ใน Directory “db” ที่อยู่ใน Root Project เมื่อเราทำการแก้ไขโปรแกรมแล้วทำการ Deploy เพื่ออัพเดท Web App บน Remote Server ไฟล์ฐานข้อมุลก็จะหายไป
ทีนี้่ก่อนที่เราจะ Deploy ให้ทำการ commit ไฟล์ในโปรเจคก่อน

svn commit -m "Config Capistrano to Project"

จากนี้เราจะเริ่มทำการ Deploy Web Application กัน เริ่มด้วยคำสั่ง

cap deploy:setup

หลังจากเรียกคำสั่งนี้ใน Remote server จะมี Directory จำนวนนึงถูกสร้างขึ้นมา และที่เราได้เขียน Callback Task ไว้ใน deploy.rb

task :after_setup do
  run "mkdir -p #{shared_path}/media"
  run "mkdir -p #{shared_path}/media/thumbnail"
end

เมื่อลองเช็คดูใน Remote Server ใน Path ที่เราจะ Deploy จะมี Directory “current”, “releases”, “shared” และใน “shared” นั้นจะมี Directory “media” และ “media/thumbnail” ที่เราสั่งให้สร้างไว้

จากนั้นให้ส่ัง Deploy ด้วยคำส่ัง

cap deploy:cold

ซึ่งคำสั่งนี้ใช้ Deploy Web Application ในครั้งแรก ซึ่งจะมีการสั่งรัน db:migration สร้างฐานข้อมุลขึ้นมา และรัน Mongrel ให้เราโดยอัตโนมัติ ส่วน Web Application ของเราจะถูก Deploy ไปยัง Directory “Release”

$ pwd
/home/my_remote_username/RailsProjects/inventory
$ ls
current  releases  shared
$ls releases
20070802140742
$ls releases/20070802140742
app      components  db   lib  nohup.out  Rakefile  REVISION  test  vendor
Capfile  config      doc  log  public     README    script    tmp

จะเห็นว่าบน Remote Server นั้น Web Application Root จะอยู่ใน 20070802140742 ซึ่ง Directory “current” จะลิ้งก์ไปที่ Directory “20070802140742″
และจากในช่วงแรกที่ผมได้เขียน Callback Task :after_symlink ไว้ใน deploy.rb

task :after_symlink do
  run "rm -rf #{current_path}/public/media"
  run "ln -s #{shared_path}/media #{current_path}/public/media"
end

ซึ่ง Callback Task นี้จะถูกรันในขั้นตอนนี้ ซึ่งจะทำการลบ Directory “media” ทิ้ง ที่ต้องลบทิ้งเพราะใน Directory นี้ที่ใช้เก็บรูปภาพ อาจมีรูปต่างๆที่เราอัพโหลดในช่วงพัฒนา ซึ่งเราไม่ได้เอาไปใช้จริง และหลังจากลบ Directory นี้แล้วก็เป็น คำสั่งสร้าง Symbolic link ไปยัง “shared/media” ส่วนทำไมต้องทำแบบนี้ เดี๋ยวจะอธิบายในช่วงต่อไปครับ ^^”
ส่วนตอนนี้เราสามารถ เปิดดูเว็ปเราได้แล้วนะครับ และต่อไป ถ้าเราทำการพัฒนาเพิ่มเติม หรือแก้ไขบน Local แล้วต้องการอัพเทดบน Remote เราก็สามารถทำได้โดยง่ายด้วยคำสั่ง

cap deploy

ซึ่งจะทำการ deploy Web Application ที่เราพัฒนาเพิ่มเติมเสร็จ ่ไปยัง Remote Server และทำการ Restart Mongrel แต่จะไม่มีการสร้างฐานข้อมูลใหม่ให้เรา เพราะเป็นการ Deploy เพื่ออัพเดท Web Application บน Remote Server ถ้าเราลองดูใน Directory “releases” จะเห็นว่ามี Directory ใหม่สร้างขึ้นมา ภายในนั้นก็คือ Web Application Root ชุดใหม่ที่เราเพิ่งสั่ง Deploy มา และ Directory Current ก็จะถูกเปลี่ยนมาชี้ที่นี่แทน

นั่นเป็นสาเหตุที่ผมได้แก้ไขไฟล์ database.yml ที่ระบุ sqlite database file ไว้ใน shared แทนก็เพราะถ้าไว้ภายใน Web Application Root เมื่อเรา Deploy เพื่ออัพเดท Directory “current” จะถูกเปลี่ยนให้ลิ้งก์ไปที่ Web Application Root อันใหม่ซึ่งจะไม่มีไฟล์ฐานข้อมูล

ตอนนี้น่าจะเริ่มเข้าใจแล้วนะครับว่า ที่ผมเขียน Callback Task ให้สร้าง Directory “media”, “media/thumbnail” ไว้ใน “shared” ก็ด้วยเหตุผลเดียวกัน เนื่องจาก Directory เหล่านี้ผมเอาไว้เก็บรูปภาพสินค้า เมื่อเราใช้งานบน Remote Server มีการอัพรูปสินค้าไปบ้างแล้ว ถ้าเราสั่ง deploy เพื่ออัพเดทเว็ป แล้วเราดันเก็บรูปไว้ใน Diretory ที่อยู่ภายใน Web Application Root มันก็จะเกิดปัญหาขึ้น เพราะ Directory “current” ถูกเปลี่ยนลิ้งก์ไปยัง Web Application Root ชุดใหม่แทน ทำให้รูปเดิมที่เคยอัพไปแล้วใช้ไม่ได้

สุดท้ายนี้ ผมไม่ได้เขียนเกี่ยวกับ การเซ็ต Apache - Subversion - Mongrel นะครับ ถ้าใครสนใจก็ ลองอ่านได้ที่นี่ครับ เพราะผมก็ไปอ่านจากที่นั่นแหล่ะ :P
ความจริงการใช้งาน Capistrano ยังมีอะไรให้ศึกษาอีกเยอะครับ มันสามารถเซ็ต และทำงานได้มากมาย กว่าที่ผมเขียนมาทั้งหมด เพียงแต่ผมพิ่งศึกษาและเพิ่งทดลองใช้งานได้แค่นี้ ไว้ถ้าได้อะไรมากกว่านี้ก็จะมาเขียนเพิ่มเติม

หมายเหตุ : ทั้งนี้ที่ผมทดสอบนั้น Local และ Remote Server จะอยู่บนเครื่องเดียวกัน อาจทำให้บางท่าน ที่อ่านแล้วนำไปใช้ อาจไม่ได้ผลอย่างที่ผมเขียน ก็ต้องขออภัยด้วยครับ

อ้างอิง : Capistrano

เซฟภาพเว็ปเพจง่ายๆด้วย Screengrab! Version 0.93 3

Posted by AnnoMundi on July 08, 2007

ความจริงผมเคยเขียนเกี่ยวกับ Add-on ตัวนี้ไปแล้วครั้งนึง ที่นี่ แต่นั่นเป็นเวอร์ชั่นเก่า ซึ่งตอนนั้นเจ้า Add-on ตัวนี้ยังใช้ Java ในการเซฟภาพหน้าเว็ปเพจ ซึ่งมี Bug อยู่พอสมควร รวมถึงค่อนข้างช้า แต่ในเวอร์ชั่นใหม่นี่ เราสามารถเลือกที่จะใช้ Java หรือ Gecko Canvas ในการ Capture ภาพหน้าเว็ปเพจ ซึ่งปกติมันจะเซ็ตใช้ Gecko Canvas มาให้อยู่แล้ว ซึ่งการใช้ Gecko Canvas ทำให้เราสามารถ Capture ภาพหน้าเว็ปเพจได้ง่ายและรวดเร็วขึ้น เท่าที่ผมลองใช้ดูยังไม่เจอ Bug อะไรเลย

นอกจากนี้ Feature ที่เพิ่มเข้ามาก็คือสามารถ เลือกที่เซฟภาพบางส่วน จากหน้าเว็ปเพจได้ด้วย ซึ่งยิ่งทำให้สะดวกเข้าไปอีก แทนที่จากเดิมเราเซฟภาพทั้งหน้าจอแล้วต้องมา Crop ภาพในโปรแกรมแก้ไขรูปภาพอย่าง Photoshop หรือ Gimp ก่อนที่จะนำไปใช้งาน เราก็สามารถใช้ Add-on ตัวนี้ของ FireFox จัดการเลือกเซฟภาพ บางส่วนของหน้าเว็ปเพจ ซึ่งทำให้เราสะดวกขึ้นมากทีเดียว ทั้่งนี้ Feature ใหม่ๆนี้เพิ่มมาตอนเวอร์ชั่นไหนผมก็ไม่แน่ใจ เพราะผมพึ่งกลับมา ใช้งานมันได้ไม่นานนี่เอง เนื่องจากเวอร์ชั่นแรกๆมี Bug อย่างที่ได้เคยบอกไป ทำให้ผมเลิกใช้ไปช่วงนึง

และเนื่องจากวันนี้ว่างๆเลย ทำ Clip การใช้งานเจ้า ScreenGrab นี่มาให้ดูด้วยเลย ^^
http://www.annomundi.info/wp-content/uploads/screengrab.flv

ใครสนใจและใช้งาน FireFox อยู่ก็ลองไปโหลดมาใช้งานได้ครับ ที่นี่

Mini Review about Shared Host @ Joyent/TextDrive 1

Posted by AnnoMundi on June 20, 2007

หลังจากได้ลองเช่าโฮสท์ของ Joyent/TextDrive มาได้ราวๆ 2 เดือน โดย Plan ที่ผมเช่าคือ Shared Host Startup Plan ซึ่งถ้าจ่ายรายเดือนก็เดือนล่ะ $15และไม่ว่าจะ Plan ไหนก็เสียค่าเซ็ตอัพ (Setup Fee) $25 เหมือนกันหมด - -* ซึ่งนับว่าแพงมาก เมื่อเทียบกับโฮสท์ทั่วๆไป

Joyent Shared Plan Pricing

ใน Shared Host สิ่งที่เราได้มานอกจาก WebHosting แล้ว เราก็จะได้ Joyent Connector และ Strongspace มาใช้งานด้วย โดย Connector เจะเป็นชุดเว็ปซอฟท์แวร์ที่ ใช้ทำงงานร่วมกันเป็นทีมสามารถแชร์ Email, Calendar, Files, Bookmark ได้ ส่วน Strongspace ก็คือ Secure Filre Stroage & Sharing หรือก็คือเอาไว้เก็บและแชร์ไฟล์ ซึ่งทั้งหมดนี้ก็ดูเหมือนจะ คุ้มกับเงิน $15/เดือน และจากการใช้งานมา ผมจะรีวิวแยกกันในแต่ล่ะส่วน
อ่านต่อด้านในครับ…

Ubuntu 7.04 : วิธีสร้าง Self-Signed Certs สำหรับเว็ปไซต์

Posted by AnnoMundi on June 18, 2007

วิธีการสร้าง Self-Signed Certificate สำหรับเว็ปไซต์บนเครื่องที่ใช้ Ubuntu
Feisty Fawn สำหรับบทความนี้ผมขอไม่กล่าวถึงการลง Apache2, PHP5 และ
MySQL นะครับ จะกล่าวถึงเฉพาะการสร้าง Self-Signed Certificate เท่านั้น

  1. ถ้า Apache ที่ลงไว้แต่ยังไม่ได้ Enable mod_ssl ก็ให้เปิดใช้งานด้วยคำสั่ง
    sudo a2enmod ssl
  2. เริ่มด้วยการสร้าง Private Key สำหรับเครื่องเซิร์ฟเวอร์ หรือเครื่องที่เรารัน
    เว็ปเซิร์ฟเวอร์

    $ sudo openssl genrsa -des3 -out server.key 1024

    เมื่อโปรแกรมให้เราใส่ pass phrase ซึ่งเราจะใส่หรือไม่ใส่ก็ได้

  3. จากนั้นก็สร้าง Certificate File ขี้นมาด้วยคำสั่ง
    $ sudo openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt

    ซึ่งมันจะถาม Pass Phrase ที่เราตั้งไว้ในขึ้นตอนที่แล้วและให้เราใส่ชื่อโดเมนที่
    เราต้องการจะใช้งาน SSL ตอนที่โปรแกรมให้เราใส่ Common Name ในที่นี้ผม
    จะใส่เป็น *.mydomainname.com เผื่อไว้ใช้กับsubdomain ได้ด้วย

  4. ให้ทำการสร้างไดเร็กทอรี่ /etc/apache2/ssl แล้วคัดลอกไฟล์ทั้งสองไปยัง
    ไดเร็กทอรี่ที่สร้างขึ้น

    $ sudo mkdir /etc/apache2/ssl
    $ sudo mv *.crt /etc/apache2/ssl
    $ sudo mv *.key /etc/apache2/ssl
    $ sudo chmod 400 /etc/apache2/ssl/*.key
  5. ถ้าในขั้นตอนแรกเรากำหนด Pass Phrase ไปด้วย ทุกครั้งที่ทำการ
    restart apache จะมีการถาม pass phrase ทุกครั้ง ดังนั้นเพื่อให้เราไม่ต้องเสีย
    เวลาใส่ pass pharse ก็ให้้เราสร้างไฟล์ /etc/apache2/ssl/password.sh
    ขึ้นมา แล้วแก้ไขไฟล์โดยพิมพ์คำสั่งตามด้านล่างลงไป แต่ให้เปลี่ยน password
    เป็น pass pharse ที่เราได้ระบุไว้นะครับ

    #!/bin/bash
    echo "password";

    จากนั้นก็ให้แก้ไขไฟล์ /etc/apache2/mods-enabled/ssl.conf ให้มองหา
    บรรทัดตามด้านล่างนี้

    SSLPassPhraseDialog  builtin

    แล้วแก้เป็น

    SSLPassPhraseDialog  exec:/etc/apache2/ssl/password.sh

    ที่ทำแบบนี้เพื่อแทนที่ apache จะรอถาม pass pharse ทุกครั้งที่ start/restart
    ก็ให้มันไปรัน script ที่เราสร้างไว้แทน

  6. จากนั้นให้เราทำการแก้ไขไฟล์ /etc/apache2/ports.conf ตามด้านล่าง
    Listen 80
    Listen 443

    แล้วจึงแก้ไขไฟล์คอนฟิกของเว็ปไซต์ในที่นี้ของผมจะอยู่รวมกันในไฟล์
    /etc/apache2/sites-available/default ซึ่งบางคนอาจแยกคอนฟิกของแต่ล่ะ
    เว็ปเป็นไฟลๆ์แยกกัน ก็ให้เปิดแก้ไขคอนฟิกเว็ปที่ต้องการใช้งาน SSL โดยแก้ไข
    คอนฟิกดังนี้

    <VirtualHost *:443>
            ...
            SSLEngine on
            SSLCertificateFile /etc/apache2/ssl/server.crt
            SSLCertificateKeyFile /etc/apache2/ssl/server.key
            ...
    </VirtualHost>

    และในตอนต้นไฟล์ /etc/apache2/sites-available/default ต้องมีคำสั่งตาม
    ด้านล่างด้วยนะครับ

    NameVirtualHost *:80
    NameVirtualHost *:443

    จากนั้นก็สั่ง restart apache ได้เลย

    sudo /etc/init.d/apache2 restart

เสร็จแล้ว เราก็จะสามารทดสอบและพัฒนาเว็ปซึ่งจำเป็นต้องมีส่วนที่ใช้งานผ่าน SSL ได้

เอกสารอ้างอิง : Creating Self-Signed Certs on Apache 2.2