Upgraded WordPress and Changes Permalink

Posted by AnnoMundi on July 16, 2008

หลังจากที่ WordPress 2.6 เพื่งออกมาเมื่อวานวันนี้ผมก็ถือโอกาสอัพเกรดเว็ปไซต์ซะเลย เนื่องจากในเวอร์ชั่น 2.6 นี้ มี Feature เพิ่มเข้ามาเยอะเลยครับ เช่น

  • Post Revisions  จะบันทึกการแก้ไขบทความของเราไว้ คล้ายๆกับ WikiPedia หรือ Version Control System ซึ่งทำให้การเขียนและแก้ไขบทความจากหลายคนทำได้ง่ายขึ้น สามารถดูได้ว่าใครแก้ไขบทความตรงจุดไหนบ้าง
  • Support Google Gears อันนี้ทำให้ทำงานในส่วน Admin เร็วขึ้นเพราะจะ Cache พวก Javascript และ CCS ไว้ในเครื่องเราเองทำให้ในส่วน Admin จะทำงานเร็วขึ้นเพราะไม่ต้องโหลดไฟล์พวกนี้
  • Press This! อันนี้ผมชอบมาก เพราะทำให้เราสามารถเขียนบล็อกอ้างอิงจากเว็ปอื่นๆได้สะดวกขึ้น
  • Theme Preview ทำให้เราสามารถพรีวิวดู Theme ก่อนจะใช้ Theme นั้น ฟีเจอร์นี้ผมก็รอมานานแระ
  • นอกจากนี้ยังมีฟีเจอร์อย่าง Word Count, Image Captions, Bulk management of Plugin และฟีเจอร์อื่นๆอีก

และหลังจากอัพเกรด WordPress เสร็จผมก็เลยจัดการเปลี่ยน Permalinks ของเว็ปซะ เนื่องจาก FireFox 3 และ Opera รองรับ URL ที่เป็น unicode แล้ว ทำให้ใน URL สามารถแสดงภาษาไทยได้ ผมก็เลยเปลี่ยน Permalinks ให้ URL ของแต่ล่ะบทความมันสื่อความหมาย ซึ่งอาจเป็นได้ท้้งภาษาไทยภาษาอังกฤษ ตัวอย่างเช่น Link ด้านล่างนี่ครับลองเปิดด้วย FireFox 3 แล้วดูที่ URL ดูนะครับ

http://www.annomundi.info/2007/07/08/เซฟภาพเว็ปเพจด้วย-screengrab/

การเปลี่ยน Permalinks นี่น่าจะทำให้ลิงก์จากหน้าเว็ปที่ถูก Index ใน Search Engine เข้ามาแล้วไม่เจอหน้าที่ถูกต้อง แต่ก็น่าจะทำให้ Page Rank สูงขึ้นในระยะยาว(มัง) ^^”

สำหรับคนที่ใช้ WordPress สามารถดู Feature เต็มๆได้ที่นี่ครับ WordPress 2.6

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/เดือน และจากการใช้งานมา ผมจะรีวิวแยกกันในแต่ล่ะส่วน
อ่านต่อด้านในครับ…