วันจันทร์ที่ 20 ธันวาคม พ.ศ. 2553

Ruby on Rails ติดตั้ง ImageMagick สำหรับการ Resize รูปภาพ

บางครั้งเราก็ต้องการ Ruby on Rails เว็บไซต์ที่มี การย่อขยายรูปภาพ ดังนั้น ก็ต้องลงโปรแกรมเกี่ยวกับตัวจัดการรูปภาพซะหน่อย

เริ่มต้นด้วย ImageMagick ก่อน

ImageMagick: /usr/ports/graphics/ImageMagick
[root@nginx81 ~]# cd /usr/ports/graphics/ImageMagick/

ติดตั้ง ruby-rmagick (A Ruby binding for ImageMagick)
# cd /usr/ports/graphics/ruby-rmagick
# make install clean

จากนั้น ลง gem mini_magick เพื่อให้ Ruby on Rails สามารถ เรียกใช้งานต่อได้
# gem install mini_magick -v=เวอร์ชั่นที่อยากได้ (ผมใช้ Rails 2.3.5 ใช้ mini_magick ได้ 1.2.5 ถึง 1.3.3)

ให้ลงตามลำดับที่เขียนมานะครับ ไม่งั้น มันไม่ work ทดลองอยู๋หลายครั้งหล่ะ ไม่รู้ว่าเป็นเพราะสาเหตุอะไร (คาดว่า ตอนลง gem mini_magick มันมา build จาก lib ในเครื่องอีกที ดังนั้นถ้าลง lib magick ไม่ครบ มันก็จะไม่สมบูรณ์มั้ง)

วันอาทิตย์ที่ 19 ธันวาคม พ.ศ. 2553

การติดตั้ง Git Server

บทความนี้เป็น บทความพื้นฐานก่อนที่จะไปยังเรื่องอื่นๆครับ

บทความนี้เป็นการทำ git repository ผ่าน ssh ใน home ของเราเองนะ

ติดตั้ง git ผ่าน port
# whereis git
# cd /usr/ports/devel/git
# make install clean

หลังจากการติดตั้งเรียบร้อย ก็ล็อกอินปกติเข้า home ของตัวเอง โดยเราจะ ทดลองสร้าง ตัวเก็บ repos ให้กับ project1

# เครื่อง Git Server

$ mkdir git
$ cd git
$ mkdir project1.git
$ cd project1.git
$ git --bare init

# เครื่อง Notebook (Git development)
$ mkdir project1 # สร้างโปรเจคใหม่ อยู่ใน folder นี้
$ touch readme.txt # สมมุติไฟล์ ขึ้นมา 1 ไฟล์
$ git add README # เพิ่มไฟล์ เข้าสู่ระบบ git (ในเครื่องตัวเอง)
$ git commit -m 'first commit' # บันทึกการเปลี่ยนแปลง
$ git remote add origin ssh://username@venus.demotest.com:1822/~/git/project1.git
# ตั้งค่า git server ให้ โปรเจคนี้รู้จัก
$ git push origin master # อัพเดตสถานะ ไฟล์ที่มีการเปลี่ยนแปลง กับ git server ที่ตั้งค่าไว้

จะได้ผลลัพธ์ประมาณนี้

Counting objects: 3, done.
Writing objects: 100% (3/3), 209 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://nutjang@venus:2022/~/git/project1.git
* [new branch] master -> master


ไปที่เครื่อง Git Server
$ cd ~/git/project1.git
$ git log

Author: User
Date: Wed Dec 15 21:50:04 2010 +0700

first commit

นั่นเหละ แปลว่า เครื่อง notebook อัพเดต status ของ source code มาเก็ยไว้ที่ Git Server เรียบร้อยแล้ว

วันศุกร์ที่ 17 ธันวาคม พ.ศ. 2553

การใช้งาน Git ทั้งครั้งแรก และ ครั้งต่อๆ ไป

First commit:

on local laptop:

mkdir example
cd example
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin ssh://git@gate.example.org:22111/~/example.git
git push origin master

When programming:

# we need to clone the repository for one time:
git clone ssh://git@gate.example.org:22111/~/example.git

# ====
# then every time we want to edit some files:

cd example
git pull # pull the newest version from the repository

# after changing some files:

git commit -a -m 'msg' # commit the changes with a message msg
git push # push the changes to the repository

วันพุธที่ 15 ธันวาคม พ.ศ. 2553

การ ssh เข้าเครื่อง โดยไม่ถาม password (public, private key)

ขั้นตอนนี้ถือเป็น การเตรียม SSH ให้พร้อม สำหรับ capistrano ครับ

บทความนี้จะสอนตรง การ ssh เข้าเครื่อง โดยไม่ถาม password (public, private key)

ในที่นี้จะสมมุติ เครื่องมา 2 เครื่องคือ
1. เครื่อง development (Notebook) อยู่ที่บ้าน ต่อเน็ตบ้าง ไม่ต่อเน็ตบ้าง
2. เครื่อง production (Server) วางไว้ที่ IDC เชื่อมต่ออินเตอร์เน็ตตลอดเวลา

กรณีนี้ ผมอยู่หน้าเครื่อง Notebook และ ต้องการจะเข้าเครื่อง production แบบไม่ต้องใส่ password ให้ทำตามขั้นตอนดังนี้ครับ

เครื่อง development
$ ssh-keygen -t rsa
Enter file in which to save the key (/home/xxxxxxx/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): enter
Enter same passphrase again: enter
Your identification has been saved in /home/xxxxxxx/.ssh/id_rsa.
Your public key has been saved in /home/xxxxxxx/.ssh/id_rsa.pub.
The key fingerprint is:
27:fa:3c:E7:2b:32:4d:75:08:89:0f:29:a2:33:d3:9d xxxxxxx@demo
The key's randomart image is:

+--[ RSA 2048]----+
| o. |
| .B..o |
| ..+.+ . |
| +..o E |
| o... S . |
| . . o |
| . . . |
| . +... |
| =o |
+-----------------+

เอาไฟล์ id_rsa.pub ไป ใส่ไว้ที่ .ssh ของเครื่อง production

$ scp ~/.ssh/id_rsa.pub xxxxxxxx@58.xxx.xxx.xx:.ssh/authorized_keys

เป็นอันเรียบร้อยคราวนี้ ที่เครื่อง development ควรจะ ssh username@เครื่อง production ควรจะ ไม่ถาม password

$ ssh xxxxxx@58.xxx.xxx.xx

>> ได้ prompt $ ของเครื่อง production

วันอังคารที่ 14 ธันวาคม พ.ศ. 2553

สั่งให้ nginx บีบอัด ไฟล์ ต่างๆ (เพื่อให้หน้าเว็บโหลดเร็วขึ้น)

สั่งให้ nginx บีบอัด ไฟล์ ต่างๆ (เพื่อให้หน้าเว็บโหลดเร็วขึ้น)

เพิ่ม config พวกนี้เข้าไปใน nginx.conf จากนั้น

#gzip
gzip on;
gzip_buffers 16 8k;
gzip_http_version 1.0;
gzip_comp_level 9;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/css;

แล้ว จะเห็นว่า header ของ ก่อนเปลี่ยนและหลังเปลี่ยน จะแตกต่างกันดังรูป และเมื่อลองดูขนาดของไฟล์ที่ ต้องโหลดระหว่าง บีบอัด กับ ไม่บีบอัด จะมีแตกกันอย่างชัดเจน จาก 7k เหลือ 2.1k



วันพุธที่ 8 ธันวาคม พ.ศ. 2553

การตั้งค่าใช้งาน Ruby on Rails ผ่าน Passenger + Nginx

สมมุติว่าเราเขียน Ruby on Rails มาได้ระดับหนึ่งแล้ว อยากจะเอาเว็บไซต์ที่เขียนขึ้นไปไว้บนอินเตอร์เน็ต นั่นก็หมายความว่าเราต้องทำเครื่อง server สำหรับ production ใช่ไหม ?

ทางเลือกที่ทำได้จะมีประมาณนี้ (จะใช้คู่กับ Apache หรือ Nginx ก็จะคอนเซปเดียวกัน ต่างกันเพียง ไฟล์คอนฟิก เท่านั้น)
1. Mongrel ธรรมดา (ข้อดี ง่ายสุด, ข้อเสีย ไม่ scale)
2. Mongrel cluster (ข้อดี ง่าย, scale)
3. Passenger (ข้อดี scale, ข้อเสีย ตั้งค่าในครั้งแรกยาก)

สำหรับตอนนี้จะสอน การตั้งค่าใช้งาน Ruby on Rails ผ่าน Passenger + Nginx
เข้าไปที่ gem passenger (จะ install ผ่าน # gem install passenger ก็ได้นะ แต่ผนคิดว่า ถ้าติดตั้งผ่าน port มันจะมีการตรวจสอบเรื่อง module ที่เกี่ยวข้องไว้ครบมากกว่า)

# cd /usr/ports/www/rubygem-passenger

ถ้ามีการติดตั้ง passenger เสร็จ จะได้ ที่อยู่ของโปรแกรมประมาณนี้
# whereis passenger
passenger: /usr/local/bin/passenger

[nutjang@nginx81 ~]$ /usr/local/bin/passenger --version
Phusion Passenger version 3.0.0

"Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.

[root@nginx81 /usr/local/etc/nginx]# passenger-config --root
/usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.0

[root@nginx81 /usr/local/etc/nginx]# whereis ruby
ruby: /usr/local/bin/ruby /usr/local/man/man1/ruby.1.gz
[root@nginx81 /usr/local/etc/nginx]#

หลังจากตรวจสอบการติดตั้งเรียบร้อยแล้ว ให้เข้าไปแก้ไข nginx.conf เพื่อเริ่มเปิดใช้งาน passenger

http {

...

passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.0;
passenger_ruby /usr/local/bin/ruby;

...


}

กรณี เครื่อง Server นี้ มี 1 เครื่อง 1 โดเมน (พูดง่ายๆ ก็คือ ไม่ทำ virtual host) ก็แก้ตรง server ใน ไฟล์ nginx.conf ได้เลย โดยใส่ parameter ตามข้างล่างนี้ (สังเกตุ ตรง root dir จะชี้ไปที่ rails_app/public นะ)

server {
listen 80;
server_name www.nutjang1.com;
root /home/nutjang/rails/2.3.5/test1/public;
passenger_enabled on;
rails_env development;
}

แก้ไขเรียบร้อย ลอง restart nginx ซักที จากนั้นเปิด browser ดูผล

# /usr/local/etc/rc.d/nginx restart




(ในกรณีของผม ผมแก้ ไฟล์ hosts ในเครื่องไว้แล้ว จ้ะ)
c:/windows/system32/drivers/etc/hosts

สำหรับเครื่อง เซิฟเวอร์ที่จะทำ Virtual host ด้วยก็รอตอนหน้าจ้ะ (แต่คิดว่า น่าจะทำกันเองได้ปแล้วนะ เพราะ concept เดียวกันเลย)

วันอังคารที่ 7 ธันวาคม พ.ศ. 2553

รัน Ruby on Rails App ไม่ขึ้น Error ประมาณนี้

/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- iconv (LoadError)
from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'


- ถ้ามีการลงเครื่อง Server ใหม่แล้ว รัน Ruby on Rails App ไม่ขึ้น Error ประมาณนี้ น่าจะเป็นปัญหาจาก Iconv ที่ยังไม่ได้มีการติดตั้งนั่นเอง
- หรือ บางที่อาจจะเป็น แค่ ruby-iconv ยังไม่ได้ติดตั้ง
- ดังนั้น ถ้าแก้ปัญหาบน FreeBSD ด้วย ports ก็ง่ายมากเพราะ มัน list software ที่ depend ให้หมดแล้ว


ruby-iconv: /usr/ports/converters/ruby-iconv
[root@nginx81 ~]# cd /usr/ports/converters/ruby-iconv/
[root@nginx81 /usr/ports/converters/ruby-iconv]# make install clean

วันเสาร์ที่ 4 ธันวาคม พ.ศ. 2553

การคอนฟิก DNS ให้รองรับการใช้งานที่เพิ่มมากขึ้น

# cat /var/log/message

Dec 2 22:30:20 web9 named[10761]: client 117.47.1.181#24101: no more recursive clients: quota reached
Dec 2 22:30:21 web9 named[10761]: client 27.130.63.253#26931: no more recursive clients: quota reached
Dec 2 22:30:22 web9 named[10761]: client 117.47.237.124#28708: no more recursive clients: quota reached

- เหมือนเดิม ถ้าเจออะไรหน้าตาประมาณนี้ แสดงว่า มีการเรียกใช้งาน DNS ที่มี concurrent มากกว่า 1000 query dns เรียบร้อยแล้ว
- แน่นอน ก็ต้องปรับขยาย ไม่ต้องไป เพืือเยอะ ไปแก้ named.conf เลย เพิ่ม recursive-clients เข้าไป ในที่นี้ แก้เพิ่มไป 10เท่าตัว จึงใส่ค่า 10000 <- ไม่ต้องใส่ตามผมเยอะขนาดนี้ก็ได้ เพราะมันจะเปลือง Ram

options {
...
recursive-clients 10000;
};

วันพฤหัสบดีที่ 2 ธันวาคม พ.ศ. 2553

ว่าด้วยเรื่อง ipfw ของเครื่อง DNS

# cat /var/log/message
Dec 2 22:33:56 web9 named[51075]: client 183.88.249.90#64256: error sending response: permission denied
Dec 2 22:33:56 web9 named[51075]: client 183.89.190.3#21126: error sending response: permission denied
Dec 2 22:33:56 web9 named[51075]: client 223.207.191.243#15863: error sending response: permission denied

Error ประมาณนี้ ลองไปถามพี่ google มาแล้ว มันตอบประมาณว่า เป็นเรื่องของ Firewall ที่ block port สำหรับการตอบกับ bind9.x ขึ้นไปจะมีการ random port เพื่อตอบกลับ

ก็ไม่รู้ว่าจริงหรือ ไม่จริงไม่รู้ก็ลองไปเพิ่ม rules เข้าไปใน firewall ดู โดยอนุญาติ ให้ใช้ udp ขาออก
หน้าตาจะออกมาประมาณนี้

# Add by nutjang
# Allow upd to use reply query.
# must insert in DNS server with bind 9.x+
$cmd 65 allow udp from any to any out

วันเสาร์ที่ 27 พฤศจิกายน พ.ศ. 2553

Rails + Nginx Setup ตอนที่ 2

ต่อจากคราวที่แล้วนะครับ ใครที่อยู่ดีๆ เปิดมาเจอตอนที่ 2 ให้กลับไปอ่านตอนที่ 1 ก่อน

เปิดไฟล์ /usr/local/etc/nginx/nginx.conf เพื่อเอา commentออก ตรงในส่วนของการเรียกใช้งาน php

เพิ่ม index.php เข้าไป

location / {
root /usr/local/www/nginx;
index index.html index.php index.htm;
}


เอา comment ออก เพื่อให้เรียกใช้งาน php ผ่าน fcgi

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME โฟลเดอร์ที่เก็บไฟล์$fastcgi_script_name;
include fastcgi_params;
}

เซฟไฟล์ให้เรียบร้อย จากนั้น ไปสร้างไฟล์ทดสอบการทำงานของ php ที่ /usr/local/www/nginx/ สร้างไฟล์ index.php ควรจะได้ผลลัพธ์ของ phpinfo.

phpinfo();
?>


ปล.
ถ้า ขึ้น error No input file specified. -> ให้ย้อนกลับไปดูว่า โฟลเดอร์ที่เก็บไฟล์ อ่ะ ตรงกับที่ ใส่ไปใน nginx.conf หรือเปล่า ?

เอ้าไปๆ มา ตอนนี้ก็เป็นเพียง การ config nginx ให้ใช้งาน php ได้เท่านั้น ยังไม่เกี่ยวกะ Rails เลย เอาเป็นว่าที่เหลือเอาไว้ตอนหน้าแล้วกัน

---ยังไม่จบ มีต่อ ตอนที่ 3---

วันศุกร์ที่ 26 พฤศจิกายน พ.ศ. 2553

Rails + Nginx Setup ตอนที่ 1

โจทย์
1. อยากจะได้เครื่อง ที่ deplyment สำหรับ Ruby on Rails
2. ไม่เอา Apache เป็น เว็บเซิฟเวอร์
3. ถ้าจะให้ดี ต้องเพื่อใช้งาน php ด้วย


# cd /usr/ports/lang/ruby18
# make install clean
# cd /usr/ports/www/nginx
# make install clean

(ตอนเลือก คอนฟิกให้เลือก http_uploadprogress, passenger ด้วย)

# cd /usr/ports/databases/
# cd mysql51-server/
# make WITH_CHARSET=tis620 WITH_XCHARSET=all WITH_COLLATION=tis620_thai_ci WITH_OPENSSL=yes install clean
# gem install rails -v=2.3.5
# gem install mysql
# gem install mini_magick
# gem install mongrel_cluster

อันนี้เป็นส่วน option เพิ่มเติม , ลงphp, และการทำให้ nginx เรียกใช้งาน php ได้
# cd /usr/ports/lang/php5
# make install clean
# cd /usr/ports/lang/php5-extensions
# make install clean

ติดตั้ง spawn-fcgi (สมัยก่อน spawn-fcgi จะไม่แยกออกมาเป็น ports เฉพาะ จะอยู่รวมกับ lighttpd ก็ให้ติด lighttpd ก่อนแล้วค่อย copy เอาเฉพาะ spawn-fcgi แต่ถ้าอัพเดต ports เป็นล่าสุด มันจะแยก ports เรียบร้อยแล้ว)

# cd /usr/ports/www/spawn-fcgi/
# make install clean

- เปิดการใช้งาน spawn-fcgi และ รัน service ทุกครั้งที่ reboot
แก้ไขไฟล์ rc.conf และ เพิ่มคำสั่งนี้เข้าไป
spawn_fcgi_enable="YES"

ลอง Restart ดู จากนั้น ทดสอบ จะได้ ผลลัพธ์ประมาณนี้
# sockstat -4 | less

www php-cgi 687 0 tcp4 127.0.0.1:9000 *:*
www php-cgi 686 0 tcp4 127.0.0.1:9000 *:*
www php-cgi 685 0 tcp4 127.0.0.1:9000 *:*
www php-cgi 684 0 tcp4 127.0.0.1:9000 *:*
www php-cgi 683 0 tcp4 127.0.0.1:9000 *:*
www php-cgi 682 0 tcp4 127.0.0.1:9000 *:*

กลับมาเข้าสู้การทำงานหลัก
- เปิดการใช้งาน nginx และ รัน service ทุกครั้งที่ reboot
แก้ไขไฟล์ rc.conf และ เพิ่มคำสั่งนี้เข้าไป
nginx_enable="YES"

---ที่เหลือ อ่านต่อตอนหน้า---

วันอังคารที่ 16 พฤศจิกายน พ.ศ. 2553

Error เวลาเรียกใช้ I18n.localize ตลอด

Error เวลาเรียกใช้ I18n.localize ตลอด นั่นเป็นเพราะ มันไปเรียกใช้ gem i18n เอามันออกซะ อาการนี้ก็จะหายไป

Erroe ประมาณนี้
missing interpolation argument in "%a, %{count} %b %Y %H:%M:%S %z" ({:object=>Mon, 13 Sep 2010 21:09:21 UTC +00:00} given)

เอามันออกโดยใช้คำสั่ง

#gem uninstall -v 0.4.1 i18n


แต่ว่า ตัวที่มันใช้ i18n ก็คือ Rails 3.0 นะถ้ามี App ที่ใช้ Rails 3.0 อยู่อาจจะ error ได้ (ผมไม่ได้ใช้ แต่ เคยกดล Rails 3.0 ดังนั้น gem i18n จึงติดมาด้วย)

วันจันทร์ที่ 15 พฤศจิกายน พ.ศ. 2553

Rails 2.3.5 การเปลี่ยน Date format

ปัญหาคือ เวลาเราต้องการแสดงวันที่ ใน Rails view นั้น มันจะ ประหลาดๆ อย่างนี้

Mon Nov 15 14:36:43 +0700 2010

ทั้งๆที่ใจเรา ไม่อยากได้อย่างนี้ (อยากได้ แบบแสดงวันที่ เป็นภาษาไทยเลย) แล้วเราจะเปลี่ยนรูปแบบของมันได้ไหม ? วันนี้เอาวิธีเปลี่ยนแบบง่ายๆมาก่อน คือ เปลี่ยนรูปแบบการแสดงผลก่อน ส่วนภาษาไทยเอาไว้คราวหน้า

สร้างไฟล์ใหม่ my_time_format.rb ในโฟลเดอร์ /config/initializers


ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!({
:quick => "%m %d, %Y at %I:%M %p",
:simple => "%A %B %d, %Y",
:end_date => "%B %d, %Y"
})


จากนั้น ทดสอบ ดูใน ./scripts/console


[nutjang@bsd-1279 ~/rails/demo_app]$ ./script/console
Loading development environment (Rails 2.3.5)
>> Time.now
=> Mon Nov 15 14:36:43 +0700 2010
>> Time.now.to_s(:simple)
=> "Monday November 15, 2010"
>> Time.now.to_s(:end_date)
=> "November 15, 2010"
>>


จบ.

วันศุกร์ที่ 12 พฤศจิกายน พ.ศ. 2553

ระลอก 2 ของ Google

ระลอก 2 ของ Google Update มาอีกแล้ว คราวนี้ ปรับปรุงในส่วนของการ Preview เว็บไซต์ แค่เอาเมาส์ไปวางเบาๆ ก็มี Preview โผล่ขึ้นมาทันที

สำหรับคนท่องเว็บคงคิดว่านี่ มันสะดวกสบายจริงๆ ที่ดูรูปคร่าวๆ ก่อนที่จะคลิ๊กได้ เว็บไหนที่โดนใจก็ค่อยคลิ๊กเข้าไปดู เว็บไหนไม่ถูกใจก็ไม่ต้องไปคลิ๊กมัน



การอัพเดตลักษณะนี้ สามารถคาดการณ์คร่าวๆได้ ว่า จะมี ผลกระทบอะไรกับ Google
1. คนจะอยู่ในเว็บไซต์ของ Google นานขึ้น (เพราะไม่ต้องคลิ๊กเพื่อออกไปดูผลลัพธ์ พี่ Google ทำ preview มาให้เสร็จ)
2. ผู้ใดที่ทำหน้าให้ Google เห็นอย่างนึง ลูกค้าเห็นอีกอย่างนึง ระวัง Google จะเอาหน้า ประหลาดๆ มาเป็น preview
3. Google สามารถต่อยอดได้อีก ประมาณ 2 - 3 step (ประมาณว่า ฉลาดได้กว่านี้)
4. Adsense เยอะขึ้น เพราะ คนอยู่ใน Google นานขึ้น เลยมีโอกาสแสดงโฆษณาได้เยอะขึ้น (โอ้วนี่หล่ะประเด็น)
5. ฯลฯ



แล้วสำหรับคนทำเว็บหล่ะ จะมีมุมมองยังไง ? การที่มี Preview จะกระทบกับเว็บไซต์ของเราหรือเปล่า ?

วันเสาร์ที่ 6 พฤศจิกายน พ.ศ. 2553

บันทึก Note ของ Rails Project

เมื่อโปรเจค Rails มันใหญ่ขึ้น แล้วตรวจสอบพบว่า มีจุดบกพร่องแต่ก็ยังไม่อยากแก้ตอนนี้ (ไม่ว่าจะด้วยสาเหตุใดก็ตาม) แต่ก็ต้อง Note ไว้ก่อน

หรือ ในกรณีที่คล้ายๆกัน ระหว่างที่เขียนโปรแกรมไปเรื่อยๆ นึง Feature ใหม่ๆ ขึ้นมาได้ แล้วก็อยากจะ Note ไว้ก่อนแล้วค่อยมาทำทีหลัง

แล้วพอ comment ไปเยอะๆเข้า หรือ ปล่อยไว้นานๆ ก็ยังไม่เข้าไปแก้ไข จนลืม (ต้องคอยมานั่งเปิดไฟล์ เพื่อหาตำแหน่ง ที่ comment ไว้)

ปัญหาเหล่านี้ Rails มีคำสั่งให้แล้วครับ อยู่ใน rake notes (ถ้าอยากดูว่า rake มีคำสั่งทั้งหมดใช้ rake -T)

โดยมีรายละเอียดดังนี้

rake notes # Enumerate all annotations
rake notes:custom # Enumerate a custom annotation, specify with ANNOTATION=WTFHAX
rake notes:fixme # Enumerate all FIXME annotations
rake notes:optimize # Enumerate all OPTIMIZE annotations
rake notes:todo # Enumerate all TODO annotations


ตัวอย่างการใช้งาน ในไฟล์ controller
def create
# TODO: need to implement
end

จากนั้นให้ออกมาที่ command ของ linux แล้วลองพิมพ์คำสั่ง

# rake notes
หรือ
# rake notes:todo

ทีนี้พอเราทำงานไปเรื่อยๆ ถ้าเจออะไรผิดพลาด หรือ ต้องย้อนกลับมาทำในภายหลังก็ให้ comment เอาไว้ก่อน แล้สพอว่างๆก็ใช้คำสั่ง rake เรียกกลับมาดูได้แล้วนะครับ

วันพุธที่ 3 พฤศจิกายน พ.ศ. 2553

อยากกลับไปใช้ Rails version ที่เก่ากว่าปัจจุบัน

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

ตอนนี้ Ruby on rails มันออกเวอร์ชั่น 3.0.2 เข้าไปแล้ว แต่ในความเห็นของผม็คือมันยังไม่นิ่ง และที่สำคัญ gem บางตัวมันก็ยังไม่ support ดังนั้นถ้าจะ สร้าง rails app ใหม่ๆ ก็คงต้องใช้ version เก่าไปก่อน

- Rails 2.3 ปัจจุยันมันก็ไปที่ 2.3.10 แล้ว ก็ยังไม่ถูกใจอีก อยากจะใช้ 2.3.5
- ลง FreeBSD ใหม่ พอกดลงโปรแกรมมันก็ install เวอร์ชั่นล่าสุดให้อย่างเดียว

ก็เลยหาคำตอบสำหรับคนที่อยากจะใช้เวอร์ชั่นที่เก่ากว่าปัจจุบันมาให้ครับ โดยใช้คำสั่งง่ายๆ ดังนี้

# gem install rails <- มันจะติดเวอร์ชั่นล่าสุดให้ตลอด
# gem install rails -v=2.3.5 <- ใช้คำสั่งนี้ มันจะติดเวอร์ชั่น 2.3.5 ให้

เวลาจะ สร้างโปรเจคใหม่ ในเครื่องที่มันมี rails หลายๆเวอร์ชั่น

# rails new_project <- มันเลือก เวอร์ชั่นล่าสุดให้ อัตโนมัติ
# rails _2.3.5_ new_project <- สร้างตามเวอร์ชั่นที่เราเลือก

สรุป ใครอยากจะใช้เวอร์ชั่นใหนก็ใช้คำสั่งให้ถูกต้องก็แล้วกันครับผม

วันจันทร์ที่ 1 พฤศจิกายน พ.ศ. 2553

Google กับ Door way website

คาดว่าเป็นที่แน่นอนแล้วสำหรับการปรับปรุง Algorithm ของ Google ที่มีผลกับเว็บไซต์ ที่ Google พิจารณาว่าเป็นประเภท doorway มากขึ้น, เห็นหลายๆเว็บไซต์ ก็เริ่มมีสถิติ ทยอยปรับลดกันอย่างต่อเนื่อง :(

ดังนั้น การทำเว็บไซต์ที่ รายได้ ผันตรงกับ จำนวนผู้เยี่ยมชมที่มาจาก Google เพียงอย่างเดียวจึงไม่น่าจะปลอดภัย

ทั้งนี้เพราะสำหรับเมืองไทย Google เกือบๆจะ = internet แล้วจะทำอะไรก็ต้องไปผ่าน Google ยิ่งตอนนี้อ่านข่าวเจอว่า Google เปิดบริการใหม่ Local Place Search

**อันนี้เ็ป็นความคิดเห็นส่วนตัว **
search keyword 'ร้านค้า เยาวราช' ก็จะแสดงผลร้านค้าในย่ายเยาวราช ออกมา (โอ้วแม่เจ้า) <- อีกหน่อย เว็บรวมร้านอาหาร ก็จะตายไป เพราะ ไม่มีคนเข้า

search keyword 'โรงแรม หัวหิน' ก็จะแสดง โรงแรมในย่าน หัวหิน <- อีกหน่อย เว็บรวมโรงแรม ก็จะตายไป เพราะ ไม่มีคนเข้า

เพราะ Google อยากได้ ค่าโฆษณา ใครที่เป็นเว็บทางผ่าน แล้วหาค่าโฆษณากิน อยู่ยากครับ เพราะ อีกหน่อย Google คงจะแทนที่คุณ แล้วทยอยหนีไปลงโฆษณา Adword กันเพราะ ทันทีที่จ่ายเงินเศษสตางค์ ก็อยู่เหนือ คนที่ SEO เก่งที่สุดแล้ว

แต่จะมี หลายๆกลุ่มที่มีผลกระทบไม่มากนัก (เท่าที่สำรวจมามีเพียงไม่กี่กลุ่มเท่านั้นจริงๆ) ดังนั้น เพื่อเป็นการป้องกันการถูก de-index จาก Google ทั้งหมดก็คงต้องมีการปรับแผนกันบ้าง

แล้วคุณหล่ะ จะรับมือกับ Google ในยกนี้ยังไง ?

วันเสาร์ที่ 23 ตุลาคม พ.ศ. 2553

เพื่อนๆ รู้ตัวกันหรือเปล่าว่า ชีวิต (เว็บไซต์) ขึ้นอยู่กับ Google เยอะเหลือเกิน

วันนี้เป็นวันที่ทำเอาตกใจมากๆ เพราะจู่ๆ Traffic ลูกค้าที่เข้าเว็บลไซต์ นั้นก็ลดลงฮวบ ไปกว่า 60% และในวันที่ 2 ยังคงลดลงไปอีกกว่า 45% สาเหตุเหรอ ตอนที่เขียนบทความนี้ยังไม่สามารถระบุสาเหตุที่แ่น่ชัดได้ ทั้งนี้ เนื่องจากเว็บไซต์ใกล้้เคียงที่อยู่ในกลุ่มเดียวกัน ก็มีผลกระทบเหมือนกัน

ในเมื่อยังไม่รู้สาเหตุ ก็ต้องสมมุติเอาเป็นว่า ถ้าสมมุติว่า Google เกิดหมั่นไส้เว็บไซต์ใดเว็บไซต์หนึ่งขึ้นมา อาจจะด้วยแนวคิดอะไรก็ตาม ไม่ทำลิงค์มายังเว็บไซต์นั้น จะเกิดอะไรขึ้นกับเว็บไซต์นั้นๆ

ในปัจจุบันมีซักกี่คนที่ เวลาเราอยากจะเข้าเว็บไซต์ใหม่ๆที่เราไม่รู้จักแล้ว ไม่ใช้ Search Engine ?
ถ้าเราไม่ใช้ Search Engine แล้วเราจะมีวิธีการยังไงในการ ค้นหาเว็บไซต์ที่เราอยากไป ?
ถ้าคุณเป็นเจ้าของเว็บไซต์ แล้ว Google มันไม่แสดงผลการค้นหาภายในเว็บไซต์ของคุณแล้ว คุณจะแก้ปัญหายังไง ?

สารพัดคำถามที่เกิดขึ้นมากมาย ทั้งนี้เพราะ Google มันได้เข้ามาเป็นส่วนหนึ่งของ Internet ไปซะแล้ว แล้วคุณหล่ะ ถ้าจู่ๆวันนึง Google มันไม่ทำตามที่คุณหวังไว้ มันจะสร้างปัญหาอะไรให้กับคุณบ้าง ?

วันอังคารที่ 19 ตุลาคม พ.ศ. 2553

อยากเป็น Network Administrator ก็ต้องทำงานตอนกลางคืน

แน่นอนครับ สำหรับตำแหน่ง Network Administrator ของระบบการใช้งานต่างๆ ก็มักจะต้องมีการปฏิบัติงานในช่วงเวลาที่ไม่ค่อยมีคนใช้งาน ... ก็แล้วมันช่วงไหนหล่ะ มันก็คือ ช่วงตอนกลางคืนไงครับ ตามสถิติจะมีคนใช้งานน้อยที่สุด

ไอ้เราก็ต้องตื่นขึ้นมานั่งย้าย Server แล้วก็อัพเดตระบบ .. โอ ทำงานที่แปลกกว่าชาวบ้านก็ต้องทำใจนะครับ

แต่ไม่รู้ทำไม คนอื่นชอบมองว่า Network Administrator = นั่งเฉยๆ เฝ้าเครื่องคอมฯ

อยากจะบอกเหลือเกินว่า ถ้า Network Administrator มีงานยุ่งหล่ะก็ แสดงว่า ระบบมีปัญหาโคตรเยอะเลยอ่ะ

วันอังคารที่ 12 ตุลาคม พ.ศ. 2553

ทำอย่างไรเมื่อไปไม่ถึงเป้าหมาย ?

เฮ้อ วันนี้ได้ยินเสียงบ่นมาแว่วๆ จากจึตใต้สำนึกว่า 'รายได้เดือนนี้อาจจะไม่เข้าเป้า' ...

แย่แล้วทำไมเราถึงคิดอย่างนี้ เอาหล่ะ คนเรามันต้องยอมรับความจริงกันบ้าง รายได้เดือนนี้ไม่เข้าเป้า แสดงว่ามีปัญหาเกิดขึ้น และ รอการแก้ไขแน่นอน ปัญหาในลักษณะนี้เกิดขึ้นบ่อยมากๆ สำหรับคนที่เพิ่มเริ่มทำอะไรบางอย่างแล้วก็พบอุปสรรค ทำอะไรก็ติดๆขัดๆ ไม่เป็นไปตามแผนที่วางไว้ ดังนั้นสิ่งที่ควรทำในลำดับแรก ก็คือ การเปลี่ยนครับ

ไม่ใช่เปลี่ยนเป้าหมายนะครับ ให้ลองเปลี่ยนมุมมอง แล้ว คิดวิเคราะห์ ดูให้ดีๆ ว่า ปัญหาที่เกิดขึ้นมาสาเหตุมาจากอะไร จากนั้น ทำใจเย็นๆ แล้วลองเสนอไอเดียเพื่อแก้ปัญหาเฉพาะหน้าดูซักนิด

แผนการตลาดจำเป็นต้องมีการปรับปรุงให้ เหมาะสมกับสถานการณ์ปัจจุบันครับ ดังนั้น หากทำตามแผนแล้ว ผลที่ได้ไม่เป็นไปตามหวัง ก็ให้ลองหาวิธีแก้ก่อนครับ อย่าเพิ่งท้อ... ลองคิดดู จะมีซักกี่คนที่วางแผนได้สุดยอดตั้งแต่ต้น โดยไม่มีข้อผิดพลาดเลย

วันเสาร์ที่ 9 ตุลาคม พ.ศ. 2553

Rails Rake Task + Cron Job

ทำงานไปด้วย Rails ซักพักนึงแล้ว คิดไหมว่า บางครั้งก็ต้องมีการรัน job schedule เรื่อยๆ เพื่อปรับปรุงเว็บไซต์

ตัวอย่างเช่น การปรับปรุง search index ของ xapian ถ้าจะ update กันด้วย rake command ก็จะเป็นดังนี้

# cd /path/to/rails_apps/
# rake xapian update_index RAILS_ENV=production

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

คำตอบก็คือ cron job ที่เรารู้จักกันดีอยู่แล้วนี่เอง ที่เราไม่ค่อยเห็น บทความการใช้งาน rake กับ cron job มากนักก็อาจเป็นเพราะว่า มันมีทริกนิดนึง ก็คือ เรื่องของ PATH ครับ กล่าวคือ ต้องใส่ path เต็มๆของ rake

path เต็มๆ ของ rake หาได้จากคำสั่งนี้
# whereis rake

แล้วในการเรียกใช้งาน rake เราก็ต้องตั้งค่า directory เริ่มต้นให้ถูกต้องด้วยนั่นเอง
# cd /path/to/rails_apps/

สรุป ก็จะได้คำสั่งสำหรับ run cronjob ดังนี้ (สั่งให้ทำงานทุกๆ 45 นาที)

45 * * * * cd /home/nutjang/rails && /usr/local/bin/rake xapian:update_index RAILS_ENV=production

วันอาทิตย์ที่ 3 ตุลาคม พ.ศ. 2553

You need a plan.

อืมขึ้นเดือนใหม่แล้ว เดือนนี้ประหลาดใจมากเพราะว่า ยังไม่รู้เลยว่าจะต้องทำอะไร หรือ ทำตามแผนที่วางไว้ เพราะว่า เดือนนี้ยังไม่ได้วางแผนนั่นเอง => เดือนนี้ต้องหันมาใส่ใจกับคำว่า 'แผน' ซักนิด

ผมคิดว่า การวางแผน นี่ช่วยให้งานมีความคืบหน้าได้เยอะทีเดียว ถ้าเรามีระเบียบวินัยมากพอ การลงมือทำไปตามแผนที่วางไว้ ย่อมทำให้เกิด progress ไปเรื่อยๆ ท้ายสุดเราก็จะไปถึงจุดหมายที่วางไว้

ลองคิดดู เจเจไทย ก่อนหน้านี้ ก็วางแผนเอาไว้นะ วางกันเป็น ปีเลยทีเดียว ซึ่งพบว่า ไม่มีความคืบหน้า หรือ ได้รับการปฏิบัติตามแผนซักเท่าไร

แต่พอลองปรับปรุงตัว นั่งคิดแล้วปรับลดเวลาของแผนให้สั้นลง แล้วตั้งใจลงมือทำอย่างจริงจัง พบว่า 2 เดือนทีี่ผ่านมาก็ทำได้ ผลงานดีกว่า แผนรายปีของปีที่แล้วซะอีก

เอาเป็นว่า ถ้าเราใส่ใจกับคำว่าแผนซักนิด ค่อยๆปรับแก้ไปเรื่อยๆ แก้ปัญหาไปเรื่อยๆ (แต่คำนึงถึงระยะเวลาตามแผน) ผมว่า งานจะสำเร็จ แน่นอน

วันศุกร์ที่ 1 ตุลาคม พ.ศ. 2553

บทสรุป JJthai ใน 2 เดือนที่ผ่านมา

หลังจากเริ่มจริงจังมากขึ้นกับการปรับปรุง JJthai.net เรียกว่า การเปลี่ยนแปลงของ JJthai.net ในรอบ 2 เดือนที่ผ่านมาช่าง มากมายอะไรอย่างนี้ ทั้งการเพิ่มตำแหน่งโฆษณา การปรับปรุงระบบการล็อกอิน การเพิ่ม Feature ใหม่ๆ การเพิ่มร้านค้าออนไลน์ สิ่งที่สะท้อนกลับมาก็คือ การมีผู้เยี่ยมชมที่เพิ่มขึ้นอย่างต่อเนื่อง

ในเดือนหน้า ตุลาคม รับรองว่าจะยังคงมีการพัฒนา อย่างต่อเนื่องแน่นอน + Feature ใหม่ๆ เช่น การค้นหา (Full Text Search) สำหรับ ร้านค้าออนไลน์ ก็จะทยอยอัพโหลด Theme เพิ่มเข้าไปเรื่อยๆนะครับ

สดท้ายก็ต้องขอขอบคุณ ทุกท่านที่มายังเว็บไซต์ JJthai.net ทุกท่านนะครับ
ทีมงาน JJthai.net

วันอาทิตย์ที่ 26 กันยายน พ.ศ. 2553

ปรับ Rails เป็น 2.3.9 เข้าใกล้ 3.0 เข้าไปทุกทีๆ

อืม Rails 3.0 ใกล้จะออกตัว Release เข้าไปทุกทีแล้ว ดังนั้น คาดว่าในอนาคตจะต้องมีการปรับเวอร์ชั่นของ jjthai ให้เป็น Rails 3.0 แน่นอน ดังนั้นก่อนที่จะปรับเป็น 3.0 ก็ปรับความเตรียมพร้อมให้เข้าใกล้ (เพราะว่าเวอร์ชั่น 2.3.9 จะมีคำเตือน deplicate เยอะ) ก็ลองดูปรับดู เพราะเท่าที่ตรวจสอบแล้ว ไม่ได้มีการปรับแก้ code เลย มีแต่การปรับ version gem ซะมากกว่า

ก่อนอื่นก็ อัพเดต gem
# gem update --system

จากนั้น เพื่อความชัวร์ นะ อยากจะใช้ Rails 2.3.9 ก็ติดตั้ง เข้าไปซะเลย
# gem install rails --version=2.3.9

หลังจากรัน Rails 2.3.9 มีคำเตือนขึ้นมา เกี่ยวกับ config.load_paths ก็แก้ซะ ตามนี้

# Rails 2.3.x deplicated
#config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )
# support Rails 2.3.x and Rails 3.x
config.autoload_paths += %W( #{RAILS_ROOT}/app/sweepers )

ตอนนี้กำลังทดสอบ Rails อยู่ตอนนี้ยังไม่พบปัญหาจ้า

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

อยากจะจัดการกับ log ให้มีประสิทธิภาพ

แก้ไข ไฟล์นี้ /etc/newsyslog.conf ไฟล์เดียว จบเกมส์เลย

/home/nutjang/log/xxx.log nutjang:wheel 640 10 * @T00 JN

FLAG ที่เป็นไปได้

J = bzip
N = ไม่ส่ง signal เมื่อ rotate log
Z = gzip

* ล่าสุด จากการทดสอบ พบว่า newsyslog สามารถ backup log ได้ แต่ ดูเหมือนว่า ต้องมีการส่ง signal เพื่อ ปิด process ด้วย ไม่งั้น ไฟล์ log อันใหม่มันไม่เก็บ ดังนั้น solution นี้ยังไม่พร้อมใช้งานจริง ต้องรอแก้ไขปรับ config ก่อน

วันอังคารที่ 14 กันยายน พ.ศ. 2553

ว่าด้วยเรื่อง subdomain ใน ruby on rails

อยากจะแจก subdomain ให้ user แต่ละคนไหม ?

ตัวอย่างเช่น เรามี user 2 คน มาเปิดร้านค้าย่อยที่ jjthai.net

user starwar1 ก็จะได้ URL ร้านค้าเป็น starwar1.jjthai.net
user starwar2 ก็จะได้ URL ร้านค้าเป็น starwar2.jjthai.net

อ่านนี่ซะ จะได้ทำเป็น

http://s2.diffuse.it/blog/show/49-Subdomain_routing_with_rails

ถ้าอยากอ่านเป็นภาษาไทยก็รอไปก่อน

1 Rails App สำหรับ หลายๆ โดเมน

โอ้วๆ หามานาน เรื่องมันมีอยู่ว่า นานมาแล้ว นั่งทำเว็บไซต์ด้วย Rails มาตั้งนาน เสร็จแล้วก็ออกแบบ ซะดิบดี ได้ออกมาเป็นเว็บหน้าตาดี 1 อัน ทีนี้ อยากได้เว็บที่มันใช้ Engine เดียวกันนี่เหละ แต่รายละเอียดมันต่างกันออกไปนิดนึง (อย่างเช่น layout ไม่เหมือนกัน) แต่ส่วนใหญ่ ใช้แนวคิดเดิมๆ ถ้าแยก Rails App กันซะ มันก็หมดเรื่อง แต่มันก็ ต้องแก้ bug ทั้ง 2 อัน

แล้วจะทำไงดีหล่ะ อยากจะรับจ้างทำเว็บไซต์ แต่ใครจะมานั่ง deploy & Bug fix ทุกๆอัน ก็เลยออกมาเป็น solution ดังนี้

1. ใช้ทริ๊กของ Rails Route โดยปรับให้รับเงื่อนไข เรื่อง request.host, request.domain เพิ่มเติมเข้ามา
2. จากนั้น สร้างเป็นไฟล์ เพื่อเข้าไปใน /config/initializers (ชื่อไฟล์อะไรก็ได้)

จากนั้นก็ลองทดสอบดูดิ ว่า ถ้า request host มาหลายๆแบบ แล้ว route ไปคนละ ทาง

# /config/initializers/multiple_domain_route.rb ################################

#
# This allows us to set up custom routes that depend on the domain or host of the request, ie:
# map.connect '', :controller => 'blah', :action => 'blah', :conditions => {:domain => 'blah'}
#

module ActionController
module Routing
class RouteSet
def extract_request_environment(request)
env = { :method => request.method }
env[:domain] = request.domain if request.domain
env[:host] = request.host if request.host
env
end
end
class Route
alias_method :old_recognition_conditions, :recognition_conditions
def recognition_conditions
result = old_recognition_conditions
result << "conditions[:domain] === env[:domain]" if conditions[:domain]
result << "conditions[:host] === env[:host]" if conditions[:host]
result
end
end
end
end

############################################################

# /cofig/route.rb ###############################################

ActionController::Routing::Routes.draw do |map|

map.connect '/', :controller => 'nutjang2', :action => 'index', :conditions=>{ :host=>'www.nutjang2.com' }
map.connect '/', :controller => 'nutjang3', :action => 'index', :conditions=>{ :host=>'www.nutjang3.com' }

map.root :controller => "welcome"

map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
end

############################################################

วิธีการทดสอบบน windows ที่จะชี้ไปว่าเป็น หลายๆ โดเมนก็ง่ายแสนง่าย c:/windows/system32/driver/etc/hosts

เพิ่มบรรทัดพวกนี้เข้าไป แล้วลองเปิด browser เรียก www.nutjang2.com, www.nutjang3.com ดู แล้วเทียบกับ log ของ Rails ว่า มัน route ถูกไหม

192.168.1.201 www.nutjang2.com
192.168.1.201 www.nutjang3.com

วันจันทร์ที่ 13 กันยายน พ.ศ. 2553

เพิ่มประสิทธิภาพของ Rails ด้วย Nginx + Gzip

ไม่พูดพล่ามทำเพลง คือ พอใช้งาน google webmaster มันบอกว่าเว็บเราโหลดช้าไป โดบให้คำแนะนำมาว่า ให้ใช้ module gzip ไฟล์ text ต่างๆ อืม... พอมานั่งคิดๆดู มันจริงนะ เพราะ browser + cpu สมัยนี้ ใช้แตก gzip หน้าเว็บเนี่ยเป็บเดียวเอง แล้วมันก็เป็นการประหยัด bandwidth ในการเชื่อมต่อเน็ตด้วย (ทำให้โหลดเร็วขึ้นอย่างเห็นได้ชัด) ok ว่าไงว่าตามกัน เพิ่ม config ข้างใต้นี้เข้าไปใน nginx.conf แค่นั้นเอง จากนั้นก็ restart service nginx ทีนึง จบ.

# output compression saves bandwidth
gzip on;
gzip_buffers 16 8k;
gzip_http_version 1.0;
gzip_comp_level 9;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/css;

วันพุธที่ 25 สิงหาคม พ.ศ. 2553

ว่าด้วยเรื่องการลบ /var/spool/clientmqueue

ลองเอาสคริปต์ง่ายๆ ข้างล่างนี้ไปอ่านดู รับรองว่า การลบ /var/spool/clientmqueue จะง่ายขึ้น

########################
ls -1 | while read fn
do
if grep -q postmaster "$fn"
then
echo "would delete $fn"
# rm $fn
fi
done
########################

การคอนฟิก php ให้กับ Apache

เปิดไฟล์ /usr/local/etc/apache22/httpd.conf

มองหา
DirectoryIndex index.html

ให้แก้เป็น
DirectoryIndex index.html index.php

และ ใส่ 2 บรรทัดนี้เพื่อให้ Apache เรียกใช้งาน php ให้ถูกต้อง (ใส่ตรงที่มันมีการ AddType .gz .zip นั่นแหละ)

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

จากนั้น อย่าลืม ควรจะกำหนดค่า php.ini ให้ด้วย ไม่งั้นมันจะใช้ค่า default ซึ่งประสิทธิภาพอาจจะไม่เต็มที่
# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

วันศุกร์ที่ 20 สิงหาคม พ.ศ. 2553

ประสบการณ์ /var เต็ม

ตอนนี้พอไปตรวจสอบเครื่อง เซิฟเวอร์พบว่า /var มันจะเต็ม อืม...ตอนแรกๆก็นึกว่า เราแบ่ง partition น้อยไปหรือเปล่า เออ เราก็ไม่น่าจะพลาดขนาดนั้นนะ.... พออ่านตัวเลขขนาด partition ดีๆอีกที เฮ้ย! /var อย่างเดียวมันตั้ง 20 กว่า กิ๊ก เป็นเรื่องหล่ะ

อะไรที่มันใช้เนื้อที่ใน /var มากขนาดนั้น

/var/db/mysql <- ผู้ต้องสงสัยแรก
/var/log/apache-log หรือ /var/log/nginx/access-log , error.log <- ผู้ต้องสงสัยรายที่ 2

ก็ลองเลย ย้าย 2 ผู้ต้องสงสัยไปไว้ที่ /usr/home/ เราแทน เฮ้ย ทำไมพื้นที่มันยังไม่ลดลงอย่างที่คาดการณ์

ก็ลองหาดู folder ไหนที่มันกินเนื้อที่เยอะๆ บ้าง

/var/spool/clientmqueue <- ต้นเหตุ

กรณีจะไปโทษว่าเป็นผู้ร้ายก็ไม่ได้นะครับ เพราะ สาเหตุที่แท้จริงแล้วคือ อีเมล์ที่เกิดจากการ ทำงาน cron job และ perodic daemon ของ freebsd ที่จะส่งอีเมล์ออกมาเมื่อทำงานเสร็จแล้ว (ทั้งนี้ก็เราดันไปปิด sendmail ใช่ไหมล่ะ)

พอเราปิด sendmail มันก็ส่งเมล์ไม่ได้ มันก็พยายามส่งอยู่นั่นเหละ ถึงได้ กินพื้นที่ไปเรื่อยๆ


แก้โดย /etc/periodic.conf
daily_output="/var/log/daily.log"
weekly_output="/var/log/weekly.log"
monthly_output="/var/log/monthly.log"

และ ใส่ MAILTO="" เหนือ crontab ของทุกคนที่เรียกใช้งาน cron


ก็เป็นอันว่า รอดตัวไปสำหรับคราวนี้

ปล. การลบ /var/spool/clientmqueue ยากกว่าที่คิดนะจ้ะ ถ้าไม่คิดอะไรมากก็ทยอยลบไปเรื่อยๆนั่นเหละ เดี๋ยวก็หมดเอง

วันพฤหัสบดีที่ 12 สิงหาคม พ.ศ. 2553

วันนี้วันแม่

มาอัพเดต blog ซะหน่อย หายไป 10 กว่าวัน ไม่ได้ไปไหนหรอก วันๆนั่งทำเว็บไซต์ให้มันดีขึ้น ปรับโน่นแต่งนี่ให้ัมัน commercial ให้มากขึ้น จนถึงวันนี้ ก็ยังไม่มีรายได้จากการขายโฆษณา

พอตอนดึก ภู โทรมาหา บอกว่าลูกค้าตัดสินใจซื้อแล้ว 1 ราย (โอ้วยอดมากๆ ลูกค้ารายแรกมาแล้ว)

แต่ที่แน่ๆ รายได้จาก Google Adsense เนี่ย หายไปเยอะเลย ไม่รู้ว่าเป็นเพราะอะไร เลยอยากจะทำ AB test นะ

วันอาทิตย์ที่ 1 สิงหาคม พ.ศ. 2553

แค่ลงมือทำ (อีกแล้ว)

ตอนนี้ทำเว็บไซต์เสร็จประมาณนึงแล้ว ก็ถึงเวลาเริ่ม แนวทางการสร้างรายได้เลย

แนวทางที่วางไว้ก็คือการขายตำแหน่งโฆษณา ซึ่งได้เห็นตัวอย่างจากเว็บไซต์ของแชมป์ ก็พบว่า มันสามารถทำได้แล้ว แชมป์ก็ได้ให้คำแนะนำมาหลายๆอย่าง เช่น 1.จำเป็นต้องมี Sale ที่ขายอย่างจริงจัง 2. ต้องทำให้โฆษณาเต็มๆไว้ก่อน เพื่อให้ดูเหมือนว่าลูกค้าเยอะ (ที่จำได้มีแค่นี้ - สงสัยต้องไปขอคำแนะนำเพิ่มอีกรอบนึง)

เอาเป็นว่าตอนนี้ก็เลยให้ ภูมี ทำหน้าที่ Sale อย่างเต็มตัว ให้ลองโทรศัพท์ หาลูกค้า ทดลองดู ก็พบว่า ได้ผลตอบรับอยู่ในระดับน่าพอใจสำหรับ Sale มือใหม่ (ยังขายไม่ได้นะ แต่แจกไปเรื่อยๆ) ก็คงต้องรอดูภายในอาทิตย์นี้ก่อน ว่าจะแจก ได้ตามเป้าีที่กำหนดหรือเปล่า

Step ถัดไปถึงจะเป็นการ ขาย จริงๆ ...... จะขายได้หรือเปล่าน้อ

วันพฤหัสบดีที่ 22 กรกฎาคม พ.ศ. 2553

ยอมถอยหลัง 1 ก้าว เพื่อให้ไปต่อได้

หลังจากมีการเปลี่ยนโฉมเว็บไซต์มา ยอดผู้เยี่ยมชมเว็บไซต์ก็ตกลงมาหน่อยนึง ก็ยังไม่เท่าไร แต่ ยอด adsense ที่ตกลงกว่า 20% นี่ซิ มันกระทบต่อรายได้ของเว็บไซต์เราอย่างจังเลย ซึ่งเราก็ต้องพยายามให้มันกลับคืนมาได้ซักระดับนึง จนบางครั้งเราก็อาจจะลืมไปว่า เป้าหมายใหญ่ที่เราเคยได้ตั้งใจไว้ในการเปลี่ยน layout เว็บไซต์ ใหม่นั่นก็คือ การตั้งเป้ารายได้จาก การขายโฆษณา เอง

ตอนนี้ก็ยังไม่รู้ว่า รายได้จากการขาย banner เองจะมากน้อยเท่าไร แต่ถ้าเราไม่คิดทำอะไรเลย รายได้จาก adsense ที่ได้วันละ 2 - 3 $ ก็ไม่เพียงพอที่จะเป็นรายได้หลักแน่นอน

เอาหล่ะบ่นพอแล้ว ทำงานต่อได้...

วันอาทิตย์ที่ 18 กรกฎาคม พ.ศ. 2553

ไปทำฝายชลอน้ำที่เขื่อนเขาแหลม

ศุกร์ เสาร์อาทิตย์ที่ผ่านมาได้ไปร่วมกิจกรรมกับที่บริษัท โดยร่วมกันไปทำฝายกั้นน้ำ (น่าจะใช้คำว่าชลอน้ำมากกว่า) ก็เหนื่อยสุดๆเลย ต้องขุดดิน ขุุดหิน ใส่ถุงปุ๋ย เอาไปวางเรียงๆกัน โอ้... เหนี่อยนะ บางช่วงถึงกับถอดใจว่า เมื่อไรมันจะเสร็จซะที แต่โชคดีที่ไปกันเยอะ เราเหนื่อยก็มาพัก คนอื่นก็ไปทำต่อ พลัดๆกัน ไม่นานฝายก็เสร็จสมบูรณ์

จากการที่ได้ถามเจ้าหน้าที่กรมอุทยานว่า ฝายนี่จะทำหน้าที่ได้นานไหม บางท่านก็ว่า 2 ปี แต่ถ้าน้ำมาแรงๆ ก็ไปหมด จากคำตอบนั่นทำเอาตะลึงไปตามๆกัน เอาหล่ะไม่เป็นไร ผมว่า ถึงสิ่งที่เราสร้างมันมีค่าทางรูปธรรมไม่มาก แต่ สิ่งที่เราได้กลับไปก็คือ เราได้มาเห็นธรรมชาติสวยๆ ที่เขื่อนเขาแหลม ได้มาบำเพ็ญประโยชน์ ได้เรียนรู้วิธีการอนุรักษ์แหล่งต้นน้ำ ได้เรียนรู้คุณค่าของน้ำ ได้ใช้ชีวิตอยู่ท่ามกลางป่า ไม่ต้องปากกัดตีนถีบแย่งกันขึ้นรถเมล์ ใช้ชีวิตแบบเรียบง่าย ซึ่งสิ่งต่างๆเหล่านี้ มันจะทำให้เราได้ เพิ่มประสบกาณ์ชีวิตที่แตกต่างจากการใช้ชีวิตอยู่แต่ในเมือง

* อย่างน้อย คนที่ได้ไปร่วมกิจกรรม ต่อไปนี้ก็คงจะ ใช้น้ำอย่างประหยัดกันมากขึ้นแน่นอน *

วันเสาร์ที่ 10 กรกฎาคม พ.ศ. 2553

"มันเกี่ยวกับรายละเอียด"

"มันเกี่ยวกับรายละเอียด" คำพูดนี้ได้ไปอ่านเจอมาในหนังสือ พอได้อ่านแล้วก็รู้สึกติดใจอยู่หน่อยนึง พอนั่งคิดๆไป โอ้หลายสิ่งรอบๆตัวเรา คนที่ทำบางสิ่งบางอย่างเหมือนๆกัน 2 คน แต่ทำไมได้ผลลัพธ์ไม่เท่ากัน ร้านค้า 2 ร้านขายสินค้าเหมือนๆกัน ตั้งอยู่ในละแวกเดียวกัน ทำไมจึงมีร้านค้าหนึ่งที่ ขายดีกว่าอีกร้าน ...... "มันเกี่ยวกับรายละเอียด" มันอาจจะเป็นคำตอบก็ได้เพราะ พอมองไปลึกๆแล้ว มันเป็นไปไม่ได้ที่ ทั้ง 2 คนจะทำได้เหมือนกันจริงๆ มันต้องมีข้อแตกต่างกันอยู่บ้าง ซึ่งข้่อแตกต่างเพียงเล็กน้อยที่มองเผินๆนี่เองอาจจะทำให้ ผลลัพธ์ที่ได้นั้นแตกต่างกันออกไป

วันเสาร์ที่ 3 กรกฎาคม พ.ศ. 2553

jQuery + Rails = สูตรสำเร็จ

หลังจากที่ แชมป์ ชอบออกมาเชียร์ jQuery กับ Ruby on Rails ว่าใช้แล้วดี ชอบมากๆ เราก็เลยแอบมาอ่านหนังสือเกี่ยวกับ jQuery ซะ เพราะถ้ามันดีจริง เราก็น่าจะเอามาประยุกต์ใช้กับเว็บไซต์ของเราได้เหมือนกัน โดยจุดหลักๆที่เรา คาดว่าจะเอา jQuery มาเติมเต็มก็คือ

1. การเพิ่มประสบการณ์ของผู้ใช้งานให้สูงขึ้น (เช่นการลงประกาศขายสินค้า, หน้าค้นหาสินค้า และ สมาชิก)
2. เพื่อเป็นการเพิ่มประสิทธิภาพของ เซิฟเวอร์ โดยการใช้ page_cache + dynamic data (by jQuery)

ส่วนเรื่อง jQuery UI นั้นคงยังไม่นำมาใช้เพราะ ต้องขอเวลาศึกษาอีกนิด ก่อนที่จะนำมาใช้งานจริง

วันศุกร์ที่ 2 กรกฎาคม พ.ศ. 2553

I'm HERO

กลับมาอีกครั้งกับ ปัญหาการล่มของ server คราวนี้เป็นที่เครื่องที่่เราไม่ได้รับผิดชอบ แต่ช่างมันเถอะ ประเด็นมันอยู่ที่ว่า แผนกเดียวกันยังไงมันก็ต้องช่วยกันอยู่แล้ว และ เรา็ยังคงเป็นไม้สุดท้าย ที่สามารถพึ่งพาได้ และ กู้ข้อมูล และ service ให้กลับมาให้บริการได้อีกครั้ง

วันนี้ เรามัีน ฮีโร่ จริงๆ เลย

วันศุกร์ที่ 25 มิถุนายน พ.ศ. 2553

การใช้งาน rails link_to แล้วให้ ลิงค์ไปยังหน้าต่างใหม่

มีอยู่ 2 วิธีนะครับ ลองเอาไปใช้กันดูได้

link_to 'nutjang blog', "http://nutjang.blogspot.com", :target => '_blank'

link_to "nutjang popup", { :action => "busy" }, :popup => ['new_window','height=300,width=600']

วันพุธที่ 23 มิถุนายน พ.ศ. 2553

ปรับปรุงประสิทธิภาพ mysql

หน้าที่ของ ผู้ดูแลระบบ ต้องดูแลให้ เครื่องเซิฟเวอร์ทำงานอย่างมีประสิทธิภาพสูงสุด ในกรณีนี่เป็น ไฟล์คอนฟิกขั้นต้นสำหรับเซิฟเวอร์ ที่กำหนดค่า resource ของระบบให้ mysql

my-huge.cnf For systems with more than 1GB memory that are mostly dedicated to MySQL.

my-large.cnf For systems with at least 512MB memory that are mostly dedicated to MySQL.

my-medium.cnf For systems with at least 32MB memory dedicated entirely to MySQL or with at least 128MB on a machine that serves multiple purposes (such as a dual web/database server).

my-small.cnf For systems with less than 64MB memory where MySQL cannot take up too much of the resources.

หลังจากนั้นก็ต้องไป ปรับจูนละเอียดกันอีกที

ติดตั้ง FreeRadius บน FreeBSD

FreeRadius เป็นโปรแกรมที่ผมต้องใช้บ่อยๆ เพราะใช้สำหรับจัดการระบบ authentication ให้กับ user ซึ่งอาจจะมีเพื่อนๆที่ต้องการใช้งานอย่างผมบ้าง ก็เลยจะขออธิบายไว้ ณ ที่นี้

การติดตั้ง FreeRadius ผ่าน ports

ก่อนการติดตั้งโปรแกรมผ่าน ports ทุกครั้ง ควรที่จะ อัพเดต ports ให้ล่าสุดก่อน ด้วยคำสั่ง cvsup

# cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/example/cvsup/port-supfile

FreeRadius ที่มีอยู่ใน ports นั้นจะมีอยู่ 2 เวอร์ชั่น คือ 1.x กับ 2.x ถ้าเอาตามความคุ้นเคยแล้ว ก็ยังงคงเลือก 1.x ครับ เพราะ Feature อื่นๆ และ โครงสร้างของ 2.x นั้นเปลี่ยนไป และยังไม่ได้ไปอ่านเลย

# whereis freeradius
/usr/ports/net/freeradius

# cd /usr/ports/net/freeradius
# make install clean

หลังจากติดตั้งเสร็จเรียบร้อยแล้ว ก็มาทดลองอย่าง คร่าวๆ นะครับ คือ start radius service ด้วยมือ ในโหมด debug

# /usr/local/sbin/radius -X

ถัดไปก็คือการ จำลอง client หรือ ใช้โปรแกรมทดสอบ ลองส่ง packet login ดู (ด้วย username, password ของ user ที่มีอยู่ใน FreeBSD system นั่นเหละ) ถ้าสำเร็จก็แปลว่า การติดตั้ง FreeRadius นั้นเสร็จเรียบร้อยครับ

วันอังคารที่ 22 มิถุนายน พ.ศ. 2553

Apache + SSL ตอนที่ 2 สร้าง Cert และ Config Apache

** ต้องผ่านตอนที่ 1 มาก่อนนะครับ ถ้ายังไม่ผ่านตอนที่ 1 ให้กลับไปตรวจสอบจนครบก่อนค่อยมา **

ขั้นตอนการสร้าง SSL request

# cd ~root/sslCA
# openssl req -new -nodes \
-out jjthai-req.pem \
-keyout private/jjthai-key.pem \
-config /etc/ssl/openssl.cnf

จะได้ผลลัพธ์ประมาณนี้ (ในช่วงท้ายจะมีการ ถาม challenge password ให้ เคาะ enter ผ่านเลย - คือไม่มี password เพราะ ถ้าใส่ challenge password ทุกครั้งที่ start apache มันจะขึ้น prompt เพื่อถาม password)

-------------------------------------------------
Generating a 1024 bit RSA private key
.............................++++++
.............................++++++
writing new private key to 'private/jjthai-key.pem'
-----
You are about to be asked to enter information that
will be incorporated
into your certificate request.
What you are about to enter is what is called a
Distinguished Name or a DN.
There are quite a few fields but you can leave
some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [TH]:
State or Province Name (full name) [NE]:
Locality Name (eg, city) [JJthai]:
Organization Name (eg, company) []: JJthai
Organizational Unit Name (eg, section) []: Development
Common Name (eg, YOUR name) []: JJthai
Email Address []: support@jjthai.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
-------------------------------------------------

ขั้นตอนการสร้าง SSL Certificate

# openssl ca
-config /etc/ssl/openssl.cnf
-out jjthai-cert.pem \
-infiles jjthai-req.pem

มันจะถาม password ของ CA (ที่บอกให้จำ password ในตอนที่ 1)

-------------------------------------------------
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /root/sslCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 4096 (0x1000)
Validity
Not Before: Aug 5 02:51:42 2006 GMT
Not After : Aug 2 02:51:42 2007 GMT
Subject:
countryName = TH
stateOrProvinceName = NE
organizationName = JJthai
commonName = JJthai
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
8B:48:A5:3A:C7:EA:9A:B3:61:9F:AC:B9
X509v3 Authority Key Identifier:
keyid:F8:D3:77:0C:78:6D:87:20:00:BF
DirName:/C=TH/ST=NE/L=JJthai
/O=JJthai
/CN=JJthai
serial:E5:A5:39:3F:6E:63:FA:7E

Certificate is to be certified until
Aug 2 02:51:42 2007 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
-------------------------------------------------

สร้างไดเรคทอรี่เพื่อเก็บ Certificate

# mkdir /etc/ssl/crt
# mkdir /etc/ssl/key

# cp ~/sslCA/jjthai-cert.pem /etc/ssl/crt
# cp ~/sslCA/private/jjthai-key.pem /etc/ssl/key

กำหนดค่า Apache 2.2 ให้ใช้งาน SSL

ในไฟล์ httpd.conf ด้านล่างๆ มันจะ มี comment ในการ include ไฟล์ ไว้ ให้มองหาบรรทัดนี้แล้วเอา comment ออก (ไดเรคทอรี่อาจจะมีไม่ตรงกันบ้างขึ้นอยู่กับวิธีการติดตั้ง Apache ของแต่ละคน)

# Secure (SSL/TLS) connections
Include etc/apache22/extra/httpd-ssl.conf

จากนั้นก็เข้าไปแก้ไขไฟล์ /usr/local/etc/apache22/extra/httpd-ssl.conf concept หลักๆ ก็คือ ตัวเข้มที่ต้องชี้ ตำแหน่ง cert, key ให้ถูกต้อง

SSLCertificateFile /etc/ssl/crt/jjthai-cert.pem
SSLCertificateKeyFile /etc/ssl/key/jjthai-key.pem


หากในเครื่องมีหลายเว็บ แล้วแต่ละเว็บก็ต้องใช้ SSL คนละอันก็ต้องกำหนดค่า ของ แต่ละ virtualhost ให้ถูกแค่นั้นเอง ข้างล่างนี้เป็นตัวอย่าง (ยังไม่ได้ทดลองนะครับ อาจจะ work หรือ ไม่ work ก็ต้องไปลองแก้กันดู)

-------------------------------------------------

ServerName ssl.jjthai.net
SSLEngine on
SSLCertificateFile /etc/ssl/crt/jjthai-cert.pem
SSLCertificateKeyFile /etc/ssl/key/jjthai-key.pem

DocumentRoot /usr/local/www/apache22/data
CustomLog /usr/local/www/logs/ssl-access_log combined
ErrorLog /usr/local/www/logs/ssl-error_log

-------------------------------------------------

จากนั้นให้ รีสตาร์ท apache service แล้วลอง ใช้ browser เรียก https:// เพื่อทดสอบ จะต้องใช้งานได้ ถ้าไม่ได้ แต่ทำตามขั้นตอนข้างบนทุกอย่างแล้ว ก็อาจจะเป็นที่ Firewall ที่ปิดพอร์ต หรือไม่ก็ Browser ที่ block certificate อยู่ แค่นั้นเอง

Apache + SSL ตอนที่ 1 ตั้งตัวเองเป็น CA

มีหลายๆครั้งที่ การใช้งานเว็บเซิฟเวอร์ก็ต้องการในส่วนของ SSL (Secure Socket Layer) ซึ่งใน การตั้งเซิฟเวอร์ production จริงๆ ก็จะใช้วิธีการ ซื้อ Cert มาจาก CA แล้วนำมาคอนฟิก ทีนี้แล้วถ้าเราจะทำการทดสอบเฉยๆ หรือ เป็นการใช้งานภายในองค์กร (ซึ่งอาจจะไม่ได้ใช้ IP จริง และ ไม่ได้เชื่อมต่ออินเตอร์เน็ต) จะทำยังไงหล่ะทีนี้ ?

หากว่าคุณซื้อไม่ได้ก็ไม่ต้องซื้อครับ ตั้งตัวเองเป็น CA ขึ้นมาเลย (บทความนี้ Assume ว่าคุณติดตั้ง FreeBSD + Apache 2.2 + openssl เรียบร้อยแล้วนะครับ)

ขั้นตอนแรก แก้ไขไฟล์ /etc/ssl/openssl.cnf ให้แก้อยู่ 2 ตำแหน่งคือ ตำแหน่งที่เก็บ Signature ต่างๆ และ วันหมดอายุของ Cert (อย่าลืมสร้างไดเรคทอรี่ /root/sslCA)

# vi /etc/ssl/openssl.cnf

-------------------------------------------
dir = /root/sslCA
default_days = 3650
-------------------------------------------

และถ้าคุณต้องการสร้าง Cert เยอะ ให้หลายๆเซิฟเวอร์ คุณอาจจะแก้ไขไฟล์ /etc/ssl/openssl.cnf ในส่วนของค่า Default อื่นๆได้เช่น

contryName_default = TH
stateOrProvinceName_default = NE
localityName_default = JJthai

ขั้นตอนต่อไปก็คือการสร้างไดเรคทอรี่ที่จำเป็น เพื่อเป็นการประหยัดเวลา และ เพื่อความเข้าใจที่ตรงกัน ก็ให้เซฟ shell script ข้างล่างนี้ไปรัน

createCA.sh

-------------------------------------------
#!/bin/sh
##############################################
# CA Creator
# http://www.freebsdmadeeasy.com/
#
# This Script creates a certificate of authority
# using OpenSSL. It was written and tested on
# FreeBSD 6.1-RELEASE Use at your own risk
#
#
##############################################


echo "Setting up the directories"
mkdir ~/sslCA
echo "sslCA"
mkdir ~/sslCA/certs
echo "sslCA/certs"
mkdir ~/sslCA/private
echo "sslCA/private"
mkdir ~/sslCA/newcerts
echo "sslCA/newcerts"

cd ~/sslCA
echo 1000 > serial
touch index.txt

echo "Setting the permission to 700 on sslCA"
chmod -R 700 ~/sslCA

echo "Creating the CA"
echo "Use a strong password and keep it safe!"
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -config /etc/ssl/openssl.cnf

more ~/sslCA/cacert.pem
more ~/sslCA/private/cakey.pem

echo "sslCA/cacert.pem"
echo "sslCA/private/cakey.pem"

echo "All Done!"
-------------------------------------------

เพื่อความปลอดภัย เมื่อรัน script เสร็จ ให้ เปลี่ยนสิทธิ์ในการเข้าถึง เป็น 700 ด้วย (ให้ root เข้าได้คนเดียว)

# cd /root
# chmod 700 sslCA

ถัดไปเป็นคำสั่ง ตั้งตัวเองเป็น CA

# cd ~root/sslCA
# openssl req -new -x509 -days 3650 -extensions v3_ca \
-keyout private/cakey.pem \
-out cacert.pem -config /etc/ssl/openssl.cnf

ผลลัพธ์ที่ได้จะออกมาเป็นประมาณนี้ (มีอยู่ช่วงนึงต้องใส่ password ห้ามลืม password อันนี้นะ เพราะมันคือ password ของ ca)

-------------------------------------------
Generating a 1024 bit RSA private key
...................++++++
.....................++++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that
will be incorporated
into your certificate request.
What you are about to enter is what is called a
Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [TH]:
State or Province Name (full name) [NE]:
Locality Name (eg, city) [JJthai]:
Organization Name (eg, company) []: JJthai
Organizational Unit Name (eg, section) []: Developemnt
Common Name (eg, YOUR name) []: JJthai
Email Address []: support@jjthai.net
-------------------------------------------

เมื่อเสร็จเรียบร้อย สิ่งที่ควรจะได้ก็คือ 2 ไฟล์นี้

/root/sslCA/cacert.pem
/root/sslCA/private/cakey.pem

เท่านี้ก็ให้ไปอ่าน ตอนที่ 2 ซึ่งเป็นการ Gen Cert และตั้งค่า Apache + SSL ได้แล้ว

ย้ายตำแหน่งเก็บ database mysql

ปัญหาที่จะพบอยู่เรื่อยๆสำหรับมือใหม่ที่ใช้ Mysql บน FreeBSD ตำแหน่งที่เก็บฐานข้อมูล ซึ่งเก็บอยู่ที่ /var/db ซึ่ง /var เนี่ย ถ้าตอนลง FreeBSD กดแบ่ง partition แบบ auto มันจะแบ่งเนื้อที่ไว้ค่อนข้างน้อย ซึ่งถ้าใช้งานไปเรื่อยๆ ก็จะเกิดปัญหาทำให้ /var เต็ม ดังนั้น Admin ที่ดีก็ควรจะหมั่นตรวจสอบอยู่เรื่อยๆว่า /var เต็ม หรือไม่ และเต็มด้วยสาเหตุอะไร

หากพบว่ามันเต็มเพราะ ข้อมูล database เริ่มมีขนาดใหญ่ ก็ควรจะย้าย ฐานข้อมูลออกไปเก็บไว้ที่อื่น ซึ่งเป็นไปได้ 2 วิธีคือ
1. ย้ายแบบเปลี่ยน ตำแหน่งเห็บฐานข้อมูล ใน Config ไฟล์ ของ Mysql
2. สร้าง logincal link ขึ้นมาเพื่อชี้ไปยังตำแหน่งเก็บฐานข้อมูลใหม่ (วิธีนี้มันจะไม่แก้ Config ไฟล์)

ในรอบนี้จะอธิบายเป็นวิธีที่ 2 นะครับ ขั้นตอนแรกก่อนอื่นก็ต้องปิด service ก่อนเพราะระหว่างการย้ายไม่ควรจะมีการใช้งาน database จากนั้นก็สร้าง Logical link ด้วยคำสั่ง ln -s

# /usr/local/etc/rc.d/mysql-server stop

# cd /var/db
# mv mysql /usr/local
# ln -s /usr/local/mysql mysql

ย้ายฐานข้อมูลเสร็จแล้วก็ เปลี่ยนสิทธิ์ให้เป็นของ mysql ให้เรียบร้อย

# cd /usr/local
# chown -R mysql mysql <- mysql แรกคือชื่อ user 'mysql' ส่วนอันหลัง คือ ชื่อ โฟลเดอร์

จากนั้นก็เปิด Service ใหม่อีกครั้งแล้วทดลองใช้งาน

# /usr/local/etc/rc.d/mysql-server start

วันจันทร์ที่ 21 มิถุนายน พ.ศ. 2553

FreeBSD การตั้งค่าให้รับ syslog มาจาก เครื่องอื่น

บางครั้งเราก็ต้องการทำ Centralize Log Server นะครับก็คือการเก็บ Log ที่มาจากเครื่องอื่นๆ มาไว้ที่เครื่องศูนย์การที่เดียว ซึ่งในกรณีนี้จะเครื่องศูนย์กลางเราจะใช้เป็น FreeBSD ซึ่งมีวิธีการ config ง่ายๆด้งนี้ครับ

แก้ไขไฟล์ /etc/syslog.conf (หากต้องการเก็บแยก log สำหรับแต่ละ เซิฟเวอร์ให้ใส่ +ip เข้าไปก่อน)

-----------------------------------------
+192.168.1.200
*.* /var/log/192.168.1.200.log

+192.168.1.201
*.* /var/log/192.168.1.201.log
-----------------------------------------

แก้ไขไฟล์ /etc/rc.conf โดยตั้งค่าให้ syslog เริ่มทำงานตั้งแต่บูตเครื่อง และ กำหนดให้ syslog รับค่า log ที่มาจาก เครื่องอื่นๆได้ด้วย การกำหนดค่า flag เป็น ค่าว่างๆ

-----------------------------------------
syslog_enable="YES"
syslogd_flags=""
-----------------------------------------

วันเสาร์ที่ 19 มิถุนายน พ.ศ. 2553

การลง FreeBSD พื้นฐาน STEP 2 - FAMP

พื้นฐานของการลงโปรแกรมเครื่องเซิฟเวอร์ในกรณีทั่วๆไป มักจะต้องลงเว็บเซิฟเวอร์นะครับ ดังนั้นจึงมีสูตรสำหรับลงโปรแกรมเป็น FAMP (FreeBSD Apache, MySQL, PHP) ซึ่งก็ให้ลงเรียงลำดับไปเลย สำหรับตอนนี้เอาแค่ Apache กับ MySQL ก่อน ที่เหลือเอาไว้ตอนหน้า

Apache Web Server

# whereis apache22

apache22: /usr/ports/www/apache22

# cd /usr/ports/www/apache22
# make install clean

เมื่อติดตั้งเสร็จ ให้ไปแก้ไข /etc/rc.conf โดยเพิ่มบรรทัดนี้เข้าไป (เพื่อให้ apache เริ่มสตาร์ท service เมื่อบูตเครื่อง)

----------------------------------------------
apache22_enable="YES"
----------------------------------------------

หากต้องการสตาร์ท Apache Service ด้วยมือให้ใช้คำสั่งต่อไปนี้

# cd /usr/local/etc/rc.d
# ./apache22 [start|stop|restart] <- เลือกเอาอย่างใดอย่างหนึ่ง

หากติดตั้งถูก จะต้องเปิดเว็บเพจทดสอบได้ แล้วพบข้อความว่า "It work!"

http://x.x.x.x <- ip เครื่องเซิฟเวอร์

วิธีการติดตั้ง MySQL

# cd /usr/ports/database/mysql51-server
# make WITH_CHARSET=tis620 WITH_XCHARSET=all \
WITH_COLLATION=tis620_thai_ci WITH_OPENSSL=yes \
install clean

หรือ (กรณีต้องการ ให้ support ndb, ทำเป็น sql api node)

# cd /usr/ports/database/mysql51-server
# make WITH_CHARSET=tis620 WITH_XCHARSET=all \
WITH_COLLATION=tis620_thai_ci WITH_OPENSSL=yes \
WITH_NDB=yes install clean

# cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf
# chown root:sys /etc/my.cnf
# chmod 0644 /etc/my.cnf

เมื่อติดตั้งเสร็จ ให้ไปแก้ไข /etc/rc.conf โดยเพิ่มบรรทัดนี้เข้าไป (เพื่อให้ mysql เริ่มสตาร์ท service เมื่อบูตเครื่อง)

----------------------------------------------
mysql_enable="YES"
----------------------------------------------

เพื่อความชัวร์ รีสตาร์ท 1 ครั้ง จานั้นให้กำหนดค่า password สำหหรับ root ของ mysql (คนละ root ของ FreeBSD นะ)

# mysqladmin -u root password newpassword

จากนั้น ทดลอง Login โดยใช้คำสั่งดังต่อไปนี้ (-p คือ ให้ขึ้น prompt เพื่อถาม password) ถ้า login สำเร็จก็หมายความว่า การติดตั้ง mysql สมบูรณ์ใช้ง้ายได้แล้วครับ

# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.22.22

Type 'help' for help.

mysql>

การลง FreeBSD พื้นฐาน STEP 1 - เริ่มต้น

1.ลง FreeBSD ในแบบ minimum
2.ลง cvsup ผ่าน pkg_add

สาเหตุที่ต้องลงแบบ pkg_add ก็เพราะว่า ตอนลงครั้งแรกจะยังไม่ได้อัพเดต ports collection ดังนั้น ถ้าลงผ่าน port ก็อาจจจะลง โปรแกรมอื่นๆ ที่เกี่ยวข้อง ที่เป็นเวอร์ชั่นเก่าได้ ดังนั้น จึงลง cvsup ในแบบ binary ดีกว่า

# pkg_add -r cvsup-without-gui

3.อัพเดต ports ด้วยคำสั่ง cvsup

# /usr/local/bin/cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile

4.เปลี่ยนไปใช้ bash shell

เนื่องจากความเคนชินนะครับ โปรแกรมแรกที่จะต้องลง หลังจากลง OS และ อัพเดต ports เสร็จใหม่ๆ ก็คือ bash

# whereis bash

/usr/ports/shell/bash

# cd /usr/ports/shell/bash
# make install clean

สำหรับ STEP แรก เอาแค่นี้ก่อน

วันศุกร์ที่ 11 มิถุนายน พ.ศ. 2553

JJThai.net Ver 3.0

ตั้งต้นกันใหม่กับ JJThai.net Ver 3.0 ที่จะต้องคิดถึงการวางโรดแมพกันใหม่ คิดว่าเวอร์ชั่นนี้จะมีการปรับปรุงและเปลี่ยนแปลงในรายละเอียดหลายเรื่อง เช่น การกำหนดพันธกิจ, การกำหนดเป้าหมายที่ต้องการสร้างรายได้, การประชาสัมพันธ์ และ การวางแผนทางการตลาดที่ต้องลงมือทำจริงๆ ส่วนเรื่อง Feature ที่จะเพิ่มขึ้นมาก็จะเป็นในส่วนของการอำนวยความสดวก และ ง่ายต่อการใช้งาน

- กำหนด พันธกิจของ JJThai.net
- ระบบ การสร้างรายได้ ที่มาจากช่องทางอื่นๆ นอกจาก Adsense
- แผนการทำการตลาด และการขายที่มีรายละเอียด และลงมือปฏิบัติได้
+ ข้อมูลสถิติเว็บไซต์
+ ต้องมี Sale โทรไปคุย
+ มีการให้ทดลองใช้งาน Banner, Smart Classified 2 สัปดาห์
- ปรับปรุง GUI การลงประกาศขายสินค้า
- เพิ่มในส่วนของการรับคำแนะนำ ติชม
- การปรับปรุง Layout โดยศึกษาแนวทางจากเว็บไซต์ที่ประสบความสำเร็จแล้ว
- เพิ่ม Feature การค้นหา

การใช้งาน Rack ในแบบ test, production

ตามปกติเวลาเราใช้คำสั่ง rake ใน Rails ก็มักจะใช้คำสั่งห้วนๆ ตัวอย่างเช่น rake สร้าง database หรือ การ migrate database

$ rake db:create

$ rake db:migrate

ซึ่งคำสั่งดังกล่าวก็จะสร้างให้กับ Environment development เพียงอย่างเดียว ทีนี้ก็เกิดคำถามว่า ถ้าเราต้องการทำใน Environment อื่นๆ เช่น test , production จะทำยังไง ?

วิธีแก้ไขง่ายๆ ก็คือ การเพิ่มตัวแปร RAILS_ENV=environment เข้าไป ด้งตัวอย่างต่อไปนี้

$ rake db:create RAILS_ENV=production

$ rake db:migrate RAILS_ENV=production

ซึ่งก็คือการสร้าง Database และ การ Migrate Database ให้กับ Rails ภายใน Environment Production นั่นเองครับ

วันเสาร์ที่ 5 มิถุนายน พ.ศ. 2553

สึกออกมาเรียบร้อยแล้ว

หลังจากไปบวชมา 15 + 1 วัน ก็เป็นอันเสร็จภาระกิจการบวชเป็นพระ ได้เรียนรู้อะไรหลายๆอย่างภายในวัดเยอะ

วันเสาร์ที่ 8 พฤษภาคม พ.ศ. 2553

เพิ่มเว็บไซต์ใหม่เข้า JJthai Group

เพิ่มเว็บไซต์ใหม่เข้ามาใน JJthai Group อีกหนึ่งเว็บไซต์ ก็คือ Channel.in.th นั่นเอง อันนี้ซุ่มทำมานาน ก็ยังทำไม่ค่อยเสร็จสมบูรณ์เลย ทำมานานมากจนคิดว่า เอาขึ้นทั้งที่ไม่เสร็จนี่เหละ รอไม่ไหวแล้ว

เพื่อนๆ ก็ลองเข้าไปเยี่ยมชมดูกันได้เลยนะครับ ที่ Channel.in.th เป็ยเว็บลงประกาศขายสินค้าฟรีเช่นเดียวกันกับ JJthai.net

วันเสาร์ที่ 1 พฤษภาคม พ.ศ. 2553

เดือนนี้ยอดไม่เข้าเป้า

อาจจะเป็นเพราะหยุดยาวเลยเฉื่อยไปหน่อย ไม่ค่อยได้ทำงาน วางแผนไว้ก็เพิ่งจะได้เริ่มเอาตอนปลายๆเดือนเอง แย่จัง แถมยังมาติด อารมณ์เสียเรื่องม็อบแดงอีก ...

วันพฤหัสบดีที่ 22 เมษายน พ.ศ. 2553

Nike บอกไว้ 'Just do it'

เอาหล่ะ อ่านหนังสือมาหลายเล่ม ถึงเวลาลงมือทำซะที ไม่มีข้ออ้างอะไรทั้งนั้น เลยยกคำขวัญของ nike มาเขียนไว้ตัวโตๆ หน้าโต๊ะเลย "Just do it" ส่วนผลลัพธ์ก็ให้ฟ้าเป็นคนกำหนดเอาก็แล้วกัน

วันจันทร์ที่ 19 เมษายน พ.ศ. 2553

มุมมองใหม่ๆ จากการพักผ่อนยาว

เกิดมุมมองขึ้นหลายๆไอเดีย แต่ที่เด็ดที่สุดเห็นจะหนีไม่พ้น ไอเดียการประยุกต์ สิ่งของที่ไม่ใช้แล้วให้กลายมาเป็นประโยชน์ อีกไอเดียที่ตามๆ กันมาคือ การเปิดโรงงานขนาดย่อมเพื่อ แปรรูปผลพลิตทางการเกษตร เพราะจากการที่ลองไปสัมพัสความเป็นอยู่แบบบ้านๆ ที่ต่างจังหวัดแล้วลองมองหาโอกาส ซึ่งมันก็มีอยู่จริง....

อันนี้นอกเรื่อง ถ้าเกิดเราไปเจอคนที่เขาน่าสงสาร เราจะทำอย่างไรดี เขาเองก็ไม่ได้แสดงออกว่าต้องการความช่วยเหลือ แต่ดูภายนอกก็ดูเหมือนมีความสุขดี แต่ภายในใจลึกๆ ก็คงรู้อยู่แก่ใจและคงกำลังคิดหาทางออกอยู่ แต่จะให้ทำอย่างไรได้ เพราะ ถามอะไรก็ได้แต่คำว่า "ก็เรียนมาน้อย ก็เลยไม่รู้จะทำอะไร" ใจจริงเราสงสารนะ อยากช่วยเหลือจริงๆ แต่ก็คงช่วยได้แค่ทีละ 1 คน แล้วที่เหลือหล่ะ จะทำยังไง ????

วันอังคารที่ 6 เมษายน พ.ศ. 2553

เมษายน เดือนแห่งการเตรียมพร้อม

ที่เป็นอย่างนี้เพราะ เดือนนี้ ผมหยุดเยอะเหลือเกิน ก็เลยมีเวลาว่าง พอที่จะได้ไปเที่ยวเชียงใหม่ บ้านเกิดของแม่ผม พอไปถึงวันๆก็ว่าง เลยต้องขนหนังสือไปอ่านแก้เซ็ง เรียกกว่าเป็นการพักผ่อน เพื่อ refresh สมองใหม่ ได้นั่งคิดคนเดียวเงียบๆ ได้นั่งวางแผน

วันศุกร์ที่ 26 มีนาคม พ.ศ. 2553

Attiny2313 tutorial ยังไม่ได้หายไปไหน

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

- คำนำ
- อุปกรณ์สำหรับการเริ่มต้น
- resource, link, data sheet
- การติดตั้งโปรแกรม
- สายโปรแกรม ISP
- digital output
- delay
- digital input
- serial port
- interrupt
- timer
- watch dog
- i2c
- spi
- sleep mode

Interface
- LCD 1602
- LCD Nokia 3310
- LCD Nokia 6610
- RF Module
- Sensor
- DC Motor
- Stepping Motor
- touch screen
- USB

ส่วน 2 หัวข้อนี้อาจจะต้องเปลี่ยน ชิป
- analog output
- analog input

วันศุกร์ที่ 19 มีนาคม พ.ศ. 2553

พับโครงการ Attiny2313 อย่างรวดเร็ว

ทั้งนี้เนื่องมาจาก ES ปรับขึ้นราคาชิป Microcontroller ATtiny2313 อย่างรุนแรง จาก 34 - 36 บาท เป็น 52.80 บาท โอ้ววววว ราคาปรับขึ้นกว่า 50% สำหรับ โปรเจคเล็กๆที่ ใช้ต้นทุนน้อยๆ นี่ถึงกับคิดหนักเลยทีเดียว ก็เป้นอันว่า โครงการที่คิดจะทำอุปกรณ์ขึ้นมาขายก็เป็นอันพับไปก่อน รอจนราคาชิปจะตกลงมา (อย่างกะหุ้นเลย) ส่วนเรื่อง บทความ tutorial ก็ถูกลดความสำคัญเช่นเดียวกัน

วันพุธที่ 17 มีนาคม พ.ศ. 2553

ถ้าชิป 1 ตัวสามารถทำงานแทนคนได้ 1 อย่าง

สมมุติว่า ชิป Microcontroller 8 bit ถูกๆ ที่มีขายตามบ้านหม้อ เมื่อเรียนรู้การใช้งานแล้วนำมาต่อเป็นวงจร เพื่อให้ทำงานเฉพาะอย่าง ที่เราต้องทำงานซ้ำๆ อย่างเช่น การเก็บค่า..... ทุกๆ 1 ชั่วโมง ถามว่า ถ้าต้องทำไปจนครับ 6 เดือน โออออ มนุษย์ที่ไหนจะทำได้แบบครบถ้วนละเนี่ย และเมื่อมนุษย์นั้นยากที่จะทำได้ก็ควรหาอย่างอื่นมาทำหน้าที่แทน จริงไหม

ตอนเรียน Microncontroller ก็ไม่ค่อยได้ทดลองอะไรมากมาย แถมอุปกรณ์ก็แพงมากซะด้วย มาตอนนี้พอนั่งนึกๆ ดูว่า งานเราก็งี่เง่า ทำอะไรซ้ำๆ ลองหาทางเปลี่ยนมาให้คอมพิวเตอร์ทำงานแทนเราไปเลยจะดีไหมนี่

นั่นเหละเป็นที่มาของการบ้าต่อวงจรรอบใหม่ของนัทจัง เอาเป็นว่า ผมขี้เกียจทำงาน เลยหาทางให้ อย่างอื่นทำแทน เช่น คอมพิวเตอร์ หรือ MCU

วันอาทิตย์ที่ 14 มีนาคม พ.ศ. 2553

เบื่อมากๆ กับ stringidaemon

หลังจากที่ลง PCBSD แล้วใช้ทำงานมากกว่า 2 สัปดาห์ ก็พบว่า จะมีบางช่วงที่อยู่ดีๆ ก็ CPU ขึ้นเป็น 100% พอตรวจสอบ process ก็พบว่า strigi ทำงาน และสร้าง daemon ขึ้นมาชื่อว่า stringidaemon ซึ่งพอไป google ดูก็พบว่าคนอื่นก็เจออาการนี้เหมือนๆกัน (คาดว่าเป็นที่KDE)

อย่าไปเอามันออกนะครับ ไม่แนะนำ สิ่งที่ควรจะทำก็คือ ไม่ต้องกำหนด directory ให้มันค้นหา โดยใช้คำสั่งนี้เพื่อ หาไฟล์คอนฟิก

$ ls -la

$ cd .strigi
$ vi daemon.conf

ลบ directory ออก แค่นี้เอง

วันพฤหัสบดีที่ 11 มีนาคม พ.ศ. 2553

AVR แบบง่ายๆ ด้วย ATtiny2313

สืบเนื่องมาจาก เรียนจบมาแล้วหลายปี มีงานทำก็พอจะมีเงินใช้บ้าง เลยเอาเงินไปซื้อของที่เคยอยากได้ เช่น อุปกรณ์อิเล็กทรอนิกส์ IC มาต่ออะไรเรื่อยเปื่อย แก้เซ็งไปงั้นๆ และ อยากทำตัวให้เป็นประโยขน์ต่อสังคมบ้างก็เลย จะเขียนบทความการใช้งาน AVR (ตอนเรียน ผมไม่ได้เรียนตัวนี้นะ เรียนแค่ Z80 ตอนนั้นไม่ค่อยมีสตางค์ บอร์ด CPU ยังหารกะเพื่อนซื้อเลย)



โดยตัว AVR เลือกเป็น Attiny2313 เพราะถูกดีตัวละ 35 บาท (ถ้าเป็นต่างจังหวัดราคาน่าจะถึง 40 บาท) สาเหตุที่ไม่เลือก ATmega8 หรือ Arduino เพราะเขาทำเอกสารกันเยอะแล้ว แล้วมันก็ง่าย ไปหาๆอ่านเอาที่อื่นก็คงพอเป็นเองได้

โดยเนื้อหาจะเน้นไปที่ Concept พื้นฐาน ที่สามารถ ต่อวงจรได้ โดยไม่ต้องทำ PCB (ซึ่งอุปกรณ์ต้องหาซื้อได้ง่ายๆ) เพราะ อยากเน้นไปที่ น้องๆที่อยู่ต่างจังหวัดสามารถทำตามได้

วันอาทิตย์ที่ 7 มีนาคม พ.ศ. 2553

ใช้เวลายามดึก ต่อวงจรอิเล็กฯ

หลังจากที่ ซื้อ บอร์ดจาก ETT มาดองไว้หลายบอร์ด วันนี้ก็ได้ฤกษ์เอามาปัดฝุ่น ทดลองต่อบอร์ด AVR ทดลองโดยใช้ chip Attiny2313 เรียบร้อยแล้ว

ตามสูตร วันนี้ต่อ โปรแกรมลง MCU ได้แล้ว, วงจรไฟกระพริบได้แล้ว พรุ่งนี้ 5 ทุ่ม ค่อยมาเล่นต่อ (แบ่งเวลาเล่นวันละชั่วโมง พอหล่ะ เอาเวลาไปทำงานเยอะดีกว่า)

วันเสาร์ที่ 6 มีนาคม พ.ศ. 2553

อยู่กับ PCBSD มา 1 สัปดาห์

นั่งทำงานด้วย PCBSD มากว่า 1 สัปดาห์แล้ว ก็รู้สึกชินมากขึ้น ตอนนี้เริ่มปรับแต่งส่วนต่างๆ ให้ใช้งานได้ค่อยข้างลงตัวแล้ว

วันพฤหัสบดีที่ 4 มีนาคม พ.ศ. 2553

ทำงานด้วย Ruby Language

ตอนนี้ต้องเขียน script ในการทำงานบ่อยมากๆ เขียนด้วย ruby นี่ประหยัดเวลาสุดๆ (เลยมีเวลาเหลือมานั่งอัพ blog)

รอบนี้เยอะหน่อยเพราะต้อง migrate ระบบ ข้อมูลทั้งหมด หลายล้าน record แต่ใช้เวลาเขียนโปรแกรมไม่นาน

วันเสาร์ที่ 27 กุมภาพันธ์ พ.ศ. 2553

PC-BSD 8.0 ออกใหม่แล้วจ้า



หลักจากประสบเคราะห์กรรม เกี่ยวกับ Harddisk แล้ว ในระหว่างที่กำลัง ก่อร่างสร้างตัวบน Harddisk ตัวใหม่ก็ลองคิดดูว่า เอ... ลองตัวอื่นที่ไม่ใช่ windows ดีบ้างไหม ? ว่าแล้วก็เข้าไป ดู PC-BSD อ่ะ ออกเวอร์ชั่นใหม่พอดี เลยโหลดมาลองดู

ผลจะเป็นยังไง ... ภาษาไทย จะ สระลอยหรือไม่... แล้วเราจะตัดขาดจาก windows เก่าได้หรือไม่ ติดตามชมกันได้



อันนี้เอามา preview กันก่อนเล็กน้อย ตรงที่ผมเน้นสีเหลืองไว้ เห็นไหมครับ มันคือ ชื่อไฟล์ ภาษาไทย โออออออ คาดว่า การย้ายไฟล์ที่ใช้อยู่ มาก็น่าจะเข้ากันได้กับ PC-BSD ใหม่แน่นอน

ถ้าอยากอ่าน Review ตัวเต็ม อาทิตย์หน้ากลับมาอีกครั้งรับรองได้อ่านแน่นอน ตั้งแต่วิธีติดตั้ง + ตั้งภาษาไทย เลย

วันพฤหัสบดีที่ 25 กุมภาพันธ์ พ.ศ. 2553

Harddisk เสีย 2 ลูก ภายใน 1 เดือน

โดนอีกแล้วครับ รอบที่แล้ว Harddisk ที่ส่งเครมไป เพิ่งกลับมา พอผ่านไป 1 วัน Harddisk ที่เครื่องหลักที่ใช้งานอยู่ที่บ้าน ก็เปิดไม่ขึ้นเลยซะงั้น ตรวจไปตรวจมา โดนอีกแล้วครับ Harddisk ลูกนี้ เซฟงานไว้เยอะด้วย เซ็งเป็ดเลย

คราวนี้คงต้องมานั่งคิดกระบวนการสำรองข้อมูลกันใหม่แล้ว ว่า จะใช้ เทคโนโลยีอะไรมาช่วยที ไม่งั้น ข้อมูลที่มูลค่ามากกว่านี้สูญไปนี่คงถึงกับพูดไม่ออกแน่ๆ

วันอังคารที่ 23 กุมภาพันธ์ พ.ศ. 2553

เอ้า โปรโมทเว็บไซต์ ลูกค้าหน่อย




ลูกค้าเปิดโรงแรม แถวถนนแจ้งวัฒนะ ตรงถนนเลี่ยงเมือง ตรงมาเรื่อยๆ ก็จะเห็ยป้าย 24@home (อยู่ใกล้ๆกับ บิ๊กหมี่เลย) ใครที่ต้องเดินทางไกลๆ ผ่านไปผ่านมาก็ลองแวะ หรือ จะลองแวะเข้ามาทานอาหาร ฝีมือสุดยอด (ฝีมือระดับ 5 ดาวเลย) ลองคลิ๊กเข้าไปเยี่ยมชมเว็บไซต์ได้เลยจ้า 24@home แจ้งวัฒนะ




วันอาทิตย์ที่ 21 กุมภาพันธ์ พ.ศ. 2553

อาทิตย์นี้ ยุ่งแน่ๆ

ทำเว็บไซต์ได้ไม่เยอะเลยครับ แถมยังต้องไปคุยเจ้าของร้านขายโทรศัพท์มือถืออีก สงสัย สัปดาห์นี้ อาจจะมีการอัพเดต blog แค่ 1 บทความแน่ๆ เลย ถ้าไม่ทันจริงๆ จะขอยกยอด บทความของ SMEmate ไป ทบในสัปดาห์ถัดไปแล้วกันครับ

วันพฤหัสบดีที่ 18 กุมภาพันธ์ พ.ศ. 2553

ผมว่า ผมคงต้องฝึกฝีมือด้านการ วาดรูป


ผมว่า ผมคงต้องฝึกฝีมือด้านการ วาดรูป ว่าแล้วก็หยิบหนังสือสอน Illustrator ที่ซื้อมานาน จนฝุ่นเกาะ มานั่งเปิดๆ ดู ในใจก็คิด อืม ต่อไปนี้เว็บไซต์ของเราจะได้สวยๆ กว่านี้แน่นอน ทดลอง อ่าน และ ค่อยๆ ทำไปทีละขั้นตอน ..... เอ ทำไปทำมาก็ยังไม่สวย ไม่รู้ว่า โปรแกรมมันห่วย หรือ หน้าจอ มัน สีเพี้ยนกันแน่ (หรือ ผมวาดไม่ได้เรื่องเอง) คิดไปคิดมา .... พวกที่เขาเรียน ศิลป นี่ มันต้องเก่งนะ ผมเรียนวิศวะ มา ถ้าใช้สูตรเดียวกันก็ย่อมได้ผลเหมือนกัน แต่ พวก หัวศิลป์ นี่เลียนแบบกัน ไม่ได้จริงๆ

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

วันอังคารที่ 16 กุมภาพันธ์ พ.ศ. 2553

นอกเรื่องไปหลายวัน

เอาอีกแล้ว ชอบอ้างโน่นอ้างนี่ ติดเทศกาล แล้วก็อู้งานไปเฉยๆ ซะงั้น แย่จริงๆเลยเรา สัปดาห์นี้ผ่านไป 2 วันแล้ว ยังไม่ได้งานเลยซักชิ้น สงสัยคงต้องอดนอนซัก วันแก้งานให้เรียบร้อย

งานส่วนตัวก็ไม่ได้ทำ แถมงานประจำยังจะมาเร่งอีก เซ็งจัง เซ็งจัง

วันเสาร์ที่ 13 กุมภาพันธ์ พ.ศ. 2553

Happy ตรุษจีน + Valentine

ช่างบังเอิญจัง ปีนี้ 2 เทศกาลตรงกันพอดี ขอให้ทุกท่านมีความสุข กับทั้ง 2 เทศกาลนี้นะครับ

วันพฤหัสบดีที่ 11 กุมภาพันธ์ พ.ศ. 2553

ชอบคอนเซ็บเว็บไซต์นี้

เป็นเว็บไซต์ขายของออนไลน์นะ เพื่อนเราทำขึ้นมาเอง พอได้ไปสอบถามเรื่อง คอนเซ็บก็ปิ๊งเลย

Where did you buy that

วันพุธที่ 10 กุมภาพันธ์ พ.ศ. 2553

ซุ่มนั่งทำเว็บไซต์ใหม่

กะว่าจะเปิดเว็บไซต์ใหม่พยายามวางคอนเซ็ปไว้แล้ว คราวนี้จะทำเป็นเว็ปไซต์ภาษาอังกฤษ ซุ่มทำมาเกือบ 1 อาทิตย์แล้ว คาดว่าคงจะเสร็จเร็วๆนี้

วันอังคารที่ 9 กุมภาพันธ์ พ.ศ. 2553

บอกตรงๆ ชอบ Ruby Language มาก

คือ ผมทำงานเกี่ยวกับ Server ครับ ต้องมีการเขียน utility เสมอ ให้ทำงานอย่างที่เราต้องการ แต่ก่อนก้เขียนเป็น shell script ซึ่งก็ ตอบโจทย์ได้ดี แต่ พอมาเจอ กับ ruby ชีวิตง่ายขึ้นเยอะเลย เขียนสั้น และเรื่อง syntag ก็ เรียนรู้ได้ง่าย

ชอบ มากๆ ครับ ขอขอบคุณ คนที่สร้าง ภาษา ruby มา ณ ที่นี้ด้วย

ผลการทดลองตั้งเป้าหมาย

จากการที่ได้ไปอบรม พัฒนาศักยภาพมา อาจารย์ได้มีการสอนถึง การตั้งเป้่าหมาย ไม่ว่าจะทำอะไรเราก็ควรจะตั้งเป้าหมายแล้ว พกติดตัวเอาไว้ เพื่อคอยย้ำเตือนเรา

กลับบ้านมาผมก็ทดลองตั้งเป้าหมายดู เอาเป็นเป้าหมายง่ายๆ เช่นการเข้ามาอัพเดตเว็บไซต์ สัปดาห์ละ 2 ครั้ง อ่านหนังสือ 1 เล่มให้จบภายใน 1 อาทิตย์ พอผ่านไป 1 อาทิตย์ ผลก็ออกมาว่า ผมสามารถทำได้มากกว่าเป้าหมายที่ตั้งไว้

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

วันจันทร์ที่ 8 กุมภาพันธ์ พ.ศ. 2553

อดทนนั่งเขียนโปรแกรมทั้งวัน

ผมเป็นคนที่คิดว่า ถ้าอยากจะทำอะไรที่มันต้องใช้เวลานานมากๆ หรือ อะไรที่มันยากมากๆ ถ้าเรามีความพยายามจริงซะอย่าง ก็สามารถทำได้แน่นอน

ลองย้อนหลังกลับไปตอนที่ยังเรียนอยู่ ผมอยากติดเมเจอร์ คอมฯ แต่คะแนนไม่ถึง ผมก็ยังฝึกทักษะทางคอมพิวเตอร์เอง จนตอนนี้พูดได้เลยว่า ทักษะที่ผมใช้ทำงานอยู่ เกิดมาจากความพยายามฝึกฝนตัวเองซะส่วนใหญ่้เลย

คิดไปคิดมา ก็ทึ่งตัวเองเหมือนกันว่า เก่งจริงๆนะเราเนี่ย

วันเสาร์ที่ 6 กุมภาพันธ์ พ.ศ. 2553

วันนี้ตื่นเช้าไปวัด ทำบุญ

โอ้ วันนี้เป็นวันดี ครับ ตื่นเช้ามาอากาศสดชื่นได้ ไปทำบุญที่วัด โอ้โห ไม่ได้ไปวัด นานมากๆแล้ว ต่อไปนี้จะพยายามไปวัดทำบุญทุกๆ เดือน

ทำบุญแล้วสบายใจจัง

Rails 3.0 จะออกแล้วจ้า

เห็นข้อความจากทาง Twitter แล้ว บอกว่า Rail 3.0 จะออกตัวจริงๆเร็วๆนี้ (ตอนนี้ยังเป็น beta อยู่) งานนี้ไม่ใช่ไม่ชอบนะ อยากใช้ Rails 3.0 อยู่เหมือนกัน แต่ไม่รู้ว่า Apps ที่ใช้อยู่จะ Migrate ขึ้นไปยังไงหล่ะ เห็น screen cast แล้ว มีแก้ไขอยุ่หลายจุดเลย

วันศุกร์ที่ 5 กุมภาพันธ์ พ.ศ. 2553

ETT ส่ง catelog 2010 มาล่อ อีกแล้ว

ผมชอบพวก อุปกรณ์อิเล็กทรอนิกส์ เอามาต่อทำโน่นทำนี่ เพื่ออำนวยความสดวก บางชิ้นซื้อมาก็ยังไม่ได้ทำอะไรเลย เก็บไว้ในกล่อง พอดีปีใหม่นี่ ETT ส่ง Catalog ใหม่มาอีกแล้ว

โอ้โห อยากได้ตั้งหลายแล้ว แต่คงต้อง List ไว้ก่อน เอาไว้ ทำรายได้จากธุรกิจมีกำไร(เยอะๆ) แล้วจะมาเลือกซื้อนะ

วันพุธที่ 3 กุมภาพันธ์ พ.ศ. 2553

อัพเดต Ruby เป็น 1.8.7

จากการทดลองเขียนโปรแกรม Ruby ก็พบว่า ต้องเป็น Version 1.8.7 ขึ้นไปถึงจะใช้ each_with_index ได้ เฮ้อออ เลยต้องอััพเกรดโปรแกรมที่เครื่อง sever หลักเลย .... ผลเป็นยังไงคงต้องมาลุ้นกัน

FreeBSD Force ลงโปรแกรมผ่าน ports

เคยมั่งไหม FreeBSD ที่ต้องการลงโปรแกรมผ่าน port แล้วพบว่ามีข้อ error จะ make deinstall ก็ไม่เอาออก จะ make install clean ก็ไม่ได้ ย้อนไปย้อนมา (โดยมากแล้วไม่ค่อยเจอกันหรอก ที่ผมเจอก็เพราะผมดันกด CTRL+C ยกเลิกการติดตั้งกลางคัน)

ก็เลยบังคับ FreeBSD ลงโปรแกรม แบบ Copy ทับไปเลย ให้ใช้คำสั่งนี้ครับ

#make install FORCE_PKG_REGISTER=yes

หวังว่าคงไม่ต้องไป search กันมาก

วันอังคารที่ 2 กุมภาพันธ์ พ.ศ. 2553

เซ็งสุดๆ กับ USB Harddisk เจ๊ง

หลักจากซื้อ USB Harddisk มาได้ประมาณ 3 เดือนกว่า มันก็ออกอาการอีกแล้ว วันนี้ขั้นหนักเลย เสียบแล้วมองไม่เห็น USB เลยต้องแวะเอาไปเครม ที่ร้านก็บอกว่าต้องรอ ตั้ง อาทิตย์นึงแน่ะ แล้วระหว่างนี้จะทำงานยังไงกันหล่ะ

คงต้องเปลี่ยนโหมดเป็นโหมดอ่านหนังสือ รวบรวมข้อมูลไปก่อน เฮ้ออออ เสียดายข้อมูล จังเลย

วันอาทิตย์ที่ 31 มกราคม พ.ศ. 2553

สร้าง Blog ขึ้นมาใหม่

แอบมาสร้าง Blog ใหม่ที่ Blog spot จ้า ไม่รู้เหมือนกันว่าจะมีคนตามมาอ่านไหม

สาเหตุที่มาสร้าง Blog ใหม่
- วันนี้ว่าง
- เอาไว้บ่นเรื่องเรื่อยเปื่อย
- เอาไว้บันทึกเรื่องไม่เป็นเรื่อง