วันเสาร์ที่ 29 กันยายน พ.ศ. 2555

Nutjang กับ Arduino

พอดีไปเห็นเว็บหนึ่ง เปิดใหม่ ขายพวก บอร์ด arduino เห็นว่าถูกดี ก็เลยลองซื้อดูมา



พอซื้อมาปุ๋บ (จริงๆแล้วก็พอมีพื้นฐาน Micro Controller อยู่บ้างอยู่แล้ว) พบว่า บอร์ด และ sersor ทั้งหลาย สามารถ เซ็ตอัพ และ ทดสอบการใช้งาน sensor ทั้งหลายได้หมดเลยภายใน 2 ชั่วโมง ใช้งานง่ายมากๆ

โอววแม่เจ้า ทำไมมันง่ายขนาดนี้ เพราะมันมีทั้ง IDE , compiler, ตัวอย่างโปรแกรม  พร้อมเลย

สมัยนี้มันง่ายจริงเลย บอร์ด 500 บาท เสียบสาย USB แล้วก็เรียนรู้ Microcontroller ได้เลย อย่างนี้นะ ไม่ต้องรอให้ อยู่ มหาลัยฯ ปี 3 แล้วค่อยเรียน Micro ก็ได้ เด็ก ป. 4 ก็น่าจะทดลองทำได้แล้วครับ

ปล.ซื้อมากะทำ Monitor Alert สงสัยคงต้อง เสียตังเพิ่มอีกหน่อย ซื้อ ส่วน GSM มาให้มัน SMS มาหาเราด้วยดีกว่า

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

Install FreeBSD src ด้วย cvsup

พอดี ตอนแรกที่ลง FreeBSD 9.0 นั่นลงแบบ minimum พอทำงานไปเรื่อยๆ อ้าว! ต้อง compile freebsd kernel เพื่อ optimze ด้วย

วิธีการที่ง่ายที่สุดก็คือ การ ใช้ src จาก แผ่นติดตั้ง ไม่งั้นก็โหลดเลย ด้วยคำสั่งดังต่อไปนี้

cvpup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/stable-supfile

ถ้าจะเอาเฉพาะส่วน ก็ comment src-all ออกก่อน เท่านี้เราก็จะได้ freebsd source kernel มาไว้ในเครื่องโดยไม่ต้องเอาจากแผ่นติดตั้งด้วย 

วันจันทร์ที่ 24 กันยายน พ.ศ. 2555

Ruby 1.9 กับ Ruby-gem

อ้างอิง FreeBSD ที่ FreeBSD 9.0

สมมุติว่าเราลง ruby19 ก่อนแล้วทีนี้ เราจะลง ruby-gem มันจะย้อนกลับไปให้เราลง ruby18 อีกที ทำไมถึงเป็นอย่างนั้น

สาเหตุก็เพราะว่า ตอนนี้ FreeBSD ยัง default ruby version ไว้ที่ 1.8 นั่นเอง

วิธีแก้ปัญหา ไฟล์ /etc/make.conf ให้เพิ่ม บรรทัดนี้เข้าไปก็เป็นอันเรียบร้อย

RUBY_DEFAULT_VER=1.9

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

ค้นหา Serial ที่ซ้ำในตาราง และสร้าง index

ค้นหา Serial ที่ซ้ำกันในตาราง
mysql> SELECT serial,  COUNT(serial) AS NumOccurrences FROM users GROUP BY serial HAVING ( COUNT(serial) > 1 );
+-------------------+----------------+
| serial            | NumOccurrences |
+-------------------+----------------+
| WS011001-00007933 |              2 |
| WS011001-00008710 |              2 |
| WS011001-00008711 |              3 |
| WS011001-00008712 |              2 |
| WS011001-00008734 |              2 |
| WS041002-00000308 |              2 |
| WS051105-Rapeepor |              2 |
| WS051108-teeservi |              2 |
| WS051112-watchara |              3 |
| WS051203-12345678 |              2 |
+-------------------+----------------+
10 rows in set (58.78 sec)
เมื่อเตรียม ตารางเรียบร้อยแล้ว ก็ถึงเวลา เพิ่ม index เข้าไป เพื่อให้ ประสิทธิในการ query ด้วย field serial ดีขึ้น
create unique index serial_index on users (serial);

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

Ruby + Gmail ทำให้งานเราสบายขึ้น

ด้วยความขี้เกียจที่จะต้องมานั่งทำรายงาน ทุกเช้า เช่น ตรวจสถานะ CPU, แรม, เนื้อที่ Harddisk สถานะ บลา บลา กว่าจะเสร็จก็ปาไปร่วมชั่วโมง ก็เลยหาวิธี ให้มัน สรุปรายงานในเครื่องแล้วส่งเข้าอีเมล์ไปเลย

เพื่อให้คง concept ไว้ก็เลยเลือกใช้งาน Ruby ส่งผ่าน gmail Account ไปเลย (ลองทดสอบใช้กับ Google Apps ก็ได้นะ)

ขั้นตอนการเตรียมพร้อม ติดตั้ง Gems ให้เรียบร้อยก่อน

# gem install tmail
# gem install mime
# gem install ruby-gmail

จากนั้น ทดลองเขียนโปรแกรมง่ายๆ เพื่อส่งข้อความ


#!/usr/local/bin/ruby

require 'rubygems'
#require 'mime-types'
require 'gmail'

gmail = Gmail.new('xxxx@gmail.com', 'your_password')
# send commands

# or generate message and send it later
email = gmail.generate_message do
from "xxxxx@gmail.com"
to "xxxxxx_receive@gmail.com"
subject "Not feeling well"
body "I won't be coming in today. So you will eating lunch alone."
end

email.deliver!

gmail.logout
# logged out


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

[nutjang@dhcppc7 ~/ruby/gmail]$ ./test.rb
-> "220 mx.google.com ESMTP d2sm930264qcs.21\r\n"
<- "EHLO xxxxxxxxxxxxxxxx\r\n"
-> "250-mx.google.com at your service, [124.121.44.166]\r\n"
-> "250-SIZE 35882577\r\n"
-> "250-8BITMIME\r\n"
-> "250-STARTTLS\r\n"
-> "250 ENHANCEDSTATUSCODES\r\n"
<- "STARTTLS\r\n"
-> "220 2.0.0 Ready to start TLS\r\n"

บลา บลา บลา ....ย้าว ยาว

wrote 353 bytes
-> "250 2.0.0 OK 1308800894 d2sm930264qcs.21\r\n"
<- "QUIT\r\n"
-> "221 2.0.0 closing connection d2sm930264qcs.21\r\n"
[nutjang@dhcppc7 ~/ruby/gmail]$

จากนั้นก็ลองไปตรวจสอบ Inbox ปลายทางดู ก็จะเห็นอีเมล์ส่งมาจ้า

สรุปว่า Happy ทั้งคนทำงาน ไม่ต้องนั่งทำรายงานแล้ว , เจ้านาย ก็มีรายงานทุกเช้า เย้!

วันอาทิตย์ที่ 15 พฤษภาคม พ.ศ. 2554

Nginx Web Cluster (ตอนที่ 2)

ต่อจากตอนแรก ยังคงมีปัญหาค้างอยู่คือ เครื่องที่ทำหน้าที่ Load Balance นั้น มีแค่เครื่องเดียว ซึ่งเป็น Single point of failure อยู่
จำเป็นที่จะต้องทำให้ Load Balance นี้ มีตัวตายตัวแทน

วิธีแก้ปัญหา -> ใช้ Common Address Redundancy Protocol (CARP)

1. ที่เครื่อง Load Balance ทั้ง 2 เครื่อง ต้อง compile Kernel FreeBSD ใหม่

โดยเพิ่ม device carp เข้าไป

# cd /usr/src/sys/amd64/conf
# cp GENERIC GENERIC.carp

เพิ่ม device carp เข้าไป แล้วเซฟ

# config GENERIC.carp
# cd ../compile/GENERIC.carp
# make depend
# make
# make install

restart เครื่อง 1 รอบ

ทำอย่างนี้ที่ เครื่อง Loadbalance1 และ Loadbalance2

cloned_interfaces="carpXX"
ifconfig_carpXX="vhid advskew pass "

ตัวอย่างเครื่องที่ 1
/etc/rc.conf

ifconfig_bge1="inet 192.168.10.2 netmask 255.255.255.0"

cloned_interfaces="carp1"
ifconfig_carp1="vhid 10 advskew 50 pass password 192.168.10.1"

ตัวอย่างเครื่องที่ 2
/etc/rc.conf

ifconfig_bge1="inet 192.168.10.3 netmask 255.255.255.0"

cloned_interfaces="carp1"
ifconfig_carp1="vhid 10 advskew 80 pass password 192.168.10.1"


ขั้นตอนสุดท้าย แก้ไขไฟล์ /etc/sysctl.conf โดยเพิ่มบรรทัดต่อไปนี้เข้าไป

net.inet.carp.preempt=1


Restart แล้ว ทดลอง ดู ifconfig ที่เครื่องแรกดู จะเป็น interface carp up และมี IP เป็น 192.168.10.1


อ้างอิง

cloned_interfaces="carpXX"

Add an ifconfig variable for each CARP interface that was created.

ifconfig_carpXX="vhid advskew pass "

The is an identifier that groups the CARP interface with it's counterpart interface on the other hosts. The common IP address is shared with all interfaces that have the same . The may be anything but must match on all the hosts.
The should be different on each host. The value on the master host should be less than the backup hosts.
is a string used to validate the CARP exchanges between the hosts. This can be any string you want but must be the same on all hosts that share a common .
The is the virtual IP address that the CARP interface will have. This IP address must be in the network block assigned to one of the physical interfaces. CARP uses this IP address to figure out what physical interface to assign the CARP interface too.

วันพุธที่ 11 พฤษภาคม พ.ศ. 2554

Nginx Web Cluster (ตอนที่ 1)

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

1. ระบบจะต้อง รองรับการทำงานที่หนักขึ้น ซึ่ง เครื่องเดียวอาจจะรับ Load ทั้งหมดไม่ได้ ต้องกระจายระบบ ออกไป
2. สำหรับระบบใหม่นี้ จะต้องไม่มี Single point of failure.

เพื่อคง Concept จะยังคงใช้ FreeBSD อยู่เหมือนเดิม

ทางเลือกของเราคือ ใช้ Nginx ทำหน้าที่เป็น Load Balance ข้างหน้า 2 ตัว ส่วน Backend Server Cluster จะเป็น Apache หรือ Nginx ก็ได้
ในตอนนี้จะอธิบายในส่วนของการทำ Backend Server Clusterก่อน

- ในส่วน nginx.conf ให้เพิ่ม config ในลักษณะนี้เข้าไป จาก config จะเห็นว่า เรามี backend อยู่ 4 ตัว และ กำหนดให้ตัวที่ 1 ทำงานเป็น 3 เท่าของตัวอื่นๆ (weight 3)

- ในส่วนของการ config server ก็ ใช้ proxy_pass ไปยัง cluster ของเรา


http {
upstream backend_cluster {
server 192.168.1.10:80 weight=3;
server 192.168.1.11:80;
server 192.168.1.12:80;
server 192.168.1.13:80;
}

server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://backend_cluster;
}
}
}


- ในส่วนของ Backend Cluster ก็คือ เครื่องที่เป็น Web Server ปกติ นั่นเอง
- ลอง Restart nginx แล้ว ทดสอบการทำงานดูได้เลย
- การสลับการทำงาน ของ แต่ละ server จะเป็น แบบ Round Robin อยู่