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

Postgresql เมื่อ index bloat (บวม)

เมื่อเราใช้ Postgres ไปนาน ๆ แล้ว สิ่งที่ติดตามมาคือ
  1. จำนวน record ที่เพิ่มมากขึ้น
  2. ขนาดของ index ที่มากขึ้น
  3. ขนาดของ dead rows ที่มากขึ้น
  4. ค่า free space map ดูว่าจะไม่พอแล้ว ในเวอร์ชั่นที่ต่ำกว่า 8.4
  5. มันสายไปแล้วถ้าคุณลืมเปิด autovacumm

หลาย ๆ คน อาจต้องยอมทำ VACUUM FULL แต่ปัญหาก็ตามมาคือ ระบบผมหยุดไม่ได้!


ส่ิงที่ต้องรีบดำเนินการโดยด่วนคือ
  1. เพิ่ม free space map
  2. เปิด auto vacuum
  3. จากเดิมที่ใช้ DELETE TABLE tablename; ก็เปลี่ยนเป็น TRUNCATE TABLE tablename;

อ้างอิงจากอันนี้ http://gkoenig.wordpress.com/2009/11/24/postgres-and-bloated-table/

postgres and bloated table
November 24, 2009 in open source, PostgreSQL
From time to time there are news/messages about bloated tables in postgres and a thereby decreased performance of the database.
The postgres-wiki contains a view (extracted from a script of the bucardo project) to check for bloat in your database here
For a quick reference you can check your table/index sizes regularly and check the no. of tuples to assume where bloat comes in.
e.g. check size of your tables and indexes:

SELECT relname AS table_name,
pg_size_pretty(pg_relation_size(oid)) AS table_size,
pg_size_pretty(pg_total_relation_size(oid)) AS total_size
FROM pg_class
WHERE relkind in ('r','i')
ORDER BY pg_relation_size(oid) DESC;

check no. of tuples

SELECT relname, relkind, reltuples, relpages
FROM pg_class
ORDER BY relpages DESC;

If you’re facing such a situation you have to check your (auto)vacuum settings and if it’s working correctly.
Starting with Postgres 8.3.x the autovacuum daemon works reliable for most cases and should be enabled. On some workloads a manual vacuum is needed anyhow. In combination with setting the (auto)vacuum parameters you have to consider the Free Space Map (FSM) parameter.
Open your postgresql.conf and check it out (every parameter has a very good comment there):
* enable autovacuum and log every run > 1 sec.

autovacuum = on
log_autovacuum_min_duration = 1000

fine tune when autovacuum will check the tables. The number is the fraction of the table size which needs modified data to run an autovacuum.

Apart from the bloated-table/index stuff, for the query planner it is very important to have up-to-date statistics. If you need an analyze more often, shrink the number to e.g. autovacuum_analyze_scale_factor = 0.02 and the tables will be autoanalyzed more often

autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1

prevent autovacuum from running too often

autovacuum_naptime = 1min #time between two runs

And don’t forget to check your postgresql.log file for any hints the database system provides.
Regarding bloated tables I detected something like:

WARNING: relation "public.table_one" contains more than "max_fsm_pages" pages with useful free space
HINT: Consider using VACUUM FULL on this relation or increasing the configuration parameter "max_fsm_pages"

A “normal” vacuum wouldn’t help in this case because it doesn’t release the pages to the os, they will only be marked as free in the FSM (Free Space Map).
If your FSM isn’t big enough your tables will be bloated even with running autovacuum and perhaps manual vacuum, because the pages with no longer needed data cannot be marked as free and therefore never be overwritten.
One solution would be to run a

vacuum full verbose analyze table_name

This “defragment”-command marks unused pages as “can be overwritten” and moves pages from the bottom into this marked pages. => The table size will shrink
! But be aware: vacuum full locks the table exclusive. Consider running this command in maintenance windows or during night.

You should also keep in mind to “defragment” bloated indexes with

REINDEX INDEX indexname # recreate index explicitly
REINDEX TABLE tablename # recreate all indexes for this table

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

framework!

ช่วง 2-3 สัปดาห์ที่ผ่านมาใช้เวลาส่วนใหญ่กับการทำความเข้าใจกับระบบ ERP ซึ่ง หลาย ๆ คนคงหาหนังสืออ่าน แต่ผมมีเวลาน้อย ก็เลยอ่านผ่านการใช้งานโปรแกรม

นอกจากแนวทางการสร้าง Sofware ที่เป็นแบบ Opensource แล้ว เมื่ออ่านเสร็จแล้วก็ค้นพบว่า การวางรากฐานที่ดีในการพัฒนานั้น จะทำให้ การต่อยอดของ Software มีประสิทธิภาพดีด้วย และสิ่งที่เรียกว่ารากฐานนั้นก็คือ FrameWork นั้นเอง

หลาย ๆ คน พัฒนา Application ไป ก็พยายามสร้าง function ต่าง ๆ ขึ้นมามากมาย ท้ายสุดก็เกิดเป็น Framework ในการพัฒนาขึ้นมา ซึ่งผมก็เป็นอย่างนั้นเหมือนกัน

แต่ที่น่าแปลกใจคือ คนริเริ่มพัฒนา OpenERP นั้น เค้าศึกษาขบวนการทางธุรกิจ ได้อย่างมากมายได้อย่างไร

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

How to Install OpenERP on Leopard 10.6.4 with VirtualENV

Over 2 weeks i spent time to install OpenERP on my MAC.
Luckily i found the way.

First i try to install all with python2.6. Unfortunately OpenERP 5.0.14 work well with python2.5. Please try my step

  1. you need python2.5!
  2. you need postgres
  3. install VirtualENV from fink
  4. cd
  5. virtualenv openerp-py25
  6. source openerp-py25/bin/activate
  7. install these packages by pip or easy_install
    • Babel
    • Beaker
    • CherryPy
    • FormEncode
    • Mako
    • MarkupSafe
    • PIL
    • PyChart
    • PyXML
    • pydot
    • pyparsing
    • reportlab
    • simplejson
    • psycopg2
  8. # Download openerp server
  9. $ bzr branch lp:openobject-server/5.0 openerp-server-5.0
  10. # Install openerp server
  11. $ cd openerp-server-5.0
  12. $ python setup.py install
  13. # Download openerp web
  14. $ bzr branch lp:openobject-client-web/5.0 openerp-web-5.0
  15. # Install openerp web
  16. $ cd openerp-web-5.0
  17. $ python setup.py install
  18. # Start Open Server and web
  19. $ openerp-server --db_user=openuser --db_password=
  20. $ openerp-web
  21. #Open Safari > http://localhost:8080 with username admin password admin

ref: http://devteam.taktik.be/index.php?/archives/9-How-to-install-Open-ERP-5.0.0-on-Mac-OS-X-10.5-Leopard.html

วันจันทร์ที่ 23 สิงหาคม พ.ศ. 2553

ดูสถานะของ HW RAID ผ่าน Linux

วันนี้หลังจากติดตั้ง Linux Debian เรียบร้อยแล้ว สิ่งที่ตามมาคือเราจะรู้ได้อย่างไรว่า HW-RAID ของเรานั้นทำงานเป็นปกติดี

อันดับแรกก็ต้องตรวจสอบก่อนว่า เรามี HW รองรับหรือไม่

Server# dmesg |grep mpt
[ 2.174757] mptbase: ioc0: Initiating bringup
[ 3.369272] mptbase: ioc0: PCI-MSI enabled

เมื่อแน่ใจแล้วก็ติดตั้ง mpt-status (mpt-status - get RAID status out of mpt (and other) HW RAID controllers)

Server # aptitude install mpt-status

แต่เมื่อลองใช้งานดูปรากฏว่า ยังไม่มี device และยังไม่ได้โหลด module นี้ไว้ใน Kernel เลย
Server # mpt-status
open /dev/mptctl: No such file or directory
Try: mknod /dev/mptctl c 10 220
Make sure mptctl is loaded into the kernel

ดังนั้นก็เริ่มโหลดกัน

Server # mknod /dev/mptctl c 10 220
Server # modprobe mptctl

ดูหน่อยว่ามี module โหลดแล้วแน่
Server# dmesg |tail -n 3
[ 1786.460073] Fusion MPT misc device (ioctl) driver 3.04.06
[ 1786.460073] mptctl: Registered with Fusion MPT base driver
[ 1786.460073] mptctl: /dev/mptctl @ (major,minor=10,220)

Server# mpt-status

You seem to have no SCSI disks attached to your HBA or you have
them on a different scsi_id. To get your SCSI id, run:

mpt-status -p

Server# mpt-status -p
Checking for SCSI ID:0
Checking for SCSI ID:1
Found SCSI id=1, use ''mpt-status -i 1`` to get more information.

Server# mpt-status -i 1
ioc0 vol_id 1 type IM, 2 phy, 465 GB, state OPTIMAL, flags ENABLED
ioc0 phy 0 scsi_id 4 ATA ST3500514NS BB23, 465 GB, state ONLINE, flags NONE
ioc0 phy 1 scsi_id 2 ATA ST3500320NS BB12, 465 GB, state ONLINE, flags NONE


เท่านี้เราก็รู้ว่า RAID เราทำงานหรือยัง

สุดท้ายก็ต้องให้ mptctl โหลดตอน Boot

Server # vi /etc/modules

แล้วเพิ่ม mptctl เข้าไปอีก 1 บรรทัด

ที่มา http://linuxhostingsupport.net/blog/open-devmptctl-no-such-device-make-sure-mptctl-is-loaded-into-the-kernel

วันจันทร์ที่ 9 สิงหาคม พ.ศ. 2553

SMTP relay with authenticate


เวลาเราใช้ SPF ในการตรวจสอบที่มาของการส่ง email เราก็จะพบว่าต้องคอยไปเพิ่ม ip ของเครื่อง server ที่เราใช้ส่งอยู่บ่อยไป ดังนั้น มาวันนี้ก็ขอใช้ความรู้เรื่องการทำ authenticate relay smtp มาใช้งานดู ซึ่งสามารถใช้ได้กับ smtp ของ gmail ได้ด้วย (นี่ยิ่งทีเข้าไปใหญ่)

ก่อนอื่นเราต้องแน่ใจก่อนว่าเรามีการใช้งาน sasl ก่อน

# sudo apttitude install postfix libsasl2-2 ca-catificate libsasl2-modules








แล้วก็ต้องมาแก้ main.cf ตามมา โดยให้มีการกำหนดค่าสำคัญ ๆดังต่อไปนี้

[สร้างไฟล์ /etc/postfix/sasl_passwd.db]
Server # vi /etc/postfix/sasl_passwd
 # [smtp.mydomain.com]:25 user.name@mydomain.com:password
Server # chmod 400 /etc/postfix/sasl_passwd
Server # postmap /etc/postfix/sasl_passwd #เราก็จะได้ไฟล์ sasl_passwd.db ออกมาใช้งาน

[สร้างไฟล์เพื่อใช้สำหรับการตรวจสอบ certificate]
Server # cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem | tee -a /etc/postfix/cacert.pem

[main.cf]
relayhost=[mail.mydomain.com]:25
smtp_use_tls=yes
smtp_sasl_auth_enable = yes
smtp_tls_loglevel=1
smtp_sasl_security_options = noanonymous
smtp_sasl_local_domain =
broken_sasl_auth_clients = yes # ไว้สำหรับ MS Outlook ดีนักแล
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_authenticated_header = yes # สำหรับบอกว่า email นี้ได้ผ่านการตรวจสอบผู้ใช้แล้วนะ
smtp_tls_CAfile = /etc/postfix/cacert.pem # ไฟล์ Certificate

ที่มา : http://ubuntu-tutorials.com/2008/11/11/relaying-postfix-smtp-via-smtpgmailcom/

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

DNS Postfix กับ SPF

ช่วงนี้งานพวกการติดตั้งระบบหรือปรับปรุงระบบเพื่อทำให้การใช้งานมีประสิทธิภาพดูเหมือนว่าจะทยอยมาให้ทำเรื่อย ๆ เช่นคราวนี้ เป็นคราวของ EMAIL

ในการติดตั้ง email server นั้นปกติแล้วหากเราไม่ได้กำหนดอะไรไว้มากนักเราก็จะเจอว่ามีผู้ประสงค์ดีคอยส่ง email พวกโฆษณาให้เราเยอะมาก เอาเป็นว่าวันละหลาย ๆ รอบ

วันนี้เลยต้องพึ่ง SPF (Sender Policy Framework) หลักการของ spf นั้นง่ายมาก มันเริ่มด้วยเครื่องที่รับ email เวลาที่ได้รับการติดต่อมานั้นก็ทำการถามไปยัง dns ที่ควบคุม domain ที่ส่งมา ถามว่า "email ที่กำลังรับอยู่นี้ ได้ถูกส่งมาจากเครื่องที่กำหนดไว้หรือไม่"

มาดูรูปแบบที่กำหนดไว้ DNS กัน

mydomain.com TXT "v=spf1 a mx a:mydomain.com mx:mydomain.com mx:mail.mydomain.com ip4:xxx.xxx.xxx.0/24 ip4:xxx.xxx.xxx.xxx ~all"

อธิบายได้ดังนี้
  • v=spf1 แสดงว่า TXT นี้เป็นการกำหนด SPF
  • a แสดงว่า เครื่องนี้เป็นเครื่อง ส่ง email ของ mydomain.com ด้วย
  • mx แสดงว่า MX server นี้ ส่ง email ของ mydomain.com ด้วย
  • ip4:xxx.xxx.xxx.0/24 แสดงว่า ทุกเครื่องที่มีช่วงของ ip นี้ เป็นเครื่องที่ใช้ส่ง email ของ mydomain.com (อันนี้มีประโยชน์มากสำหรับคนที่ใช้ smtp ของ ISP เป็นคนส่ง)
  • ip4:xxx.xxx.xxx.xxx แสดงว่า เครื่องที่มี ip นี้ เป็นเครื่องที่อนุญาติให้ส่ง email ได้
  • ~all แสดงว่า SPF ที่ได้รับมาหากตรวจสอบแล้วไม่ตรงก็จะทำการบอก mail server ว่า ให้กำหนดเป็น softfail
หากเราทำการกำหนดดังกล่าวแล้ว เวลาเปิด email ดู เช่นใน gmail เราก็จะได้ header ว่า
Received-SPF: pass (google.com: domain of user@mydomain.com designates xxx.xxx.xxx.xxx as permitted sender) client-ip=xxx.xxx.xxx.xxx;

อ้างอิง: http://old.openspf.org/wizard.html?mydomain= เอาไว้สร้าง spf
อ้าวอิง: http://www.debianhelp.co.uk/dnsrecords.htm เอาไว้อ่านความหมายของ DNS record

แถมในส่วนของ postfix อีกหน่อย ...

ปกติแล้ว postfix นั้นไม่ได้มีการตรวจสอบ spf ไว้ก่อน เราต้องทำเอง ด้วยวิธีดังนี

  1. อันแรกเอาเป็นว่าก็ต้องติดตั้ง postfix ก่อน (อันนี้ไปทำเอง)
  2. จากนั้นก็ติดตั้ง tumgreyspf ด้วย $ aptitude install tumgreyspf
  3. แล้วก็แวะไปอ่าน /usr/share/doc/tumgreyspf/README.Debian เพื่อมากำหนดค่าต่าง ๆ
  4. แล้วก็ reload postfix
เท่านี้เอง

อ้างอิง: http://workaround.org/ispmail/lenny/spf

วันจันทร์ที่ 10 พฤษภาคม พ.ศ. 2553

TTS กับเพชรพระอุมา

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

หลังจากที่ได้ฟังการอ่านบางตอนแล้วก็พบว่า คิดถึง "นกน้อย" หรือคณะพากษ์ละคร ที่มีในสมัยก่อนมาก

แต่ในฐานะนักพัฒนาระบบแล้ว ผมกลับอยากพัฒนาระบบ Text to Speech เพื่ออ่านหนังสืออื่น ๆ ด้วย เพราะจะพึ่งการอ่านจากคนต้องใช้เวลาและความร่วมมือค่อนข้างสูง

ที่ดูไว้ก็มี pyTTS, pyTTSx นั่นแหละ

วันอังคารที่ 4 พฤษภาคม พ.ศ. 2553

vi ไวเป็นลิง

แต่ก่อนมี เพื่อนเคยพูดไว้ว่า "vi ไวเป็นลิง" ภายหลังได้ลองเล่นเองแล้ว ก็เห็นด้วยเป็นอย่างยิ่ง โดยเฉพาะเมื่อต้องทำงานกับ ไฟล์ที่มีขนาดใหญ่ (เคยเป็น 100 MB มาแล้ว) แต่ว่าพอไม่ได้ใช้นาน ๆ ไหง ลืมซะอย่างนั้น ก็เลยขอบันทึกไว้กันลืม ดังนี้

การเลื่อนตำแหน่ง
  • ^f = เลื่อนลง 1 หน้า
  • ^b = เลื่อนขึ้น 1 หน้า
  • ^d = เลื่อนลงครึ่งหน้า
  • ^u = เลื่อนขึ้นครึ่งหน้า
การลบ
  • x = ลบ 1 อักขระ
  • dw = ลบตั้งแต่เคอร์เซอร์จนถึงต้นคำหน้า
  • d$, D = ลบตั้งแต่เคอร์เซอร์จนถึงท้ายบรรทัด
  • dL = ลบตั้งแต่บรรทัดปัจจุบันจนถึงท้ายจอภาพ
  • dh = ลบ 1 อักขระก่อนถึงเคอร์เซอร์
  • dd = ลบบรรทัดปัจจุบัน
  • dG = ลบจากบรรทัดปัจจุบันจนถึงท้ายไฟล์
  • d1G = ลบจากบรรทัดปัจจุบันจนถึงต้นไฟล์
  • ใช้ร่วมกับตัวเลข

    • d3w, 3dw = ลบ 3 คำ
    • 5dd, 4dj = ลบ 5 บรรทัด จากบรรทัดปัจจุบัน ( 4dj=ลบบรรทัดปัจจุบัน และอีก 4 บรรทัดถัดไป )
    • 4dk = ลบบรรทัดปัจจุบัน และอีก 4 บรรทัดก่อนหน้า
    • 5Gdd = ลบบรรทัดที่ 5

When you need to ssh to server without entering password.

Loggin into server without password is stupid way. But sometime we need to do that e.g. Cron

So

# CREATE DSA AT CLIENT
user1@client:~$ ssh-keygen -t dsa

Generating public/private dsa key pair.
Enter file in which to save the key (/Users/user1/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/user1/.ssh/id_dsa.
Your public key has been saved in /Users/user1/.ssh/id_dsa.pub.
The key fingerprint is:
9a:30:11:3c:3c:cf:89:01:3a:e1:5d:bd:49:c9:50:f4 user1@client
The key's randomart image is:
+--[ DSA 1024]----+
|. .+.o*o. |
|.o. B. =. |
|o. ..B..oE |
| . ..+o |
| o S |
| o o |
| o |
| |
| |
+-----------------+

# COPY PUBLIC DSA TO SERVER

user1@client:~$ scp ~/.ssh/id_dsa.pub user1@some.server.com:/home/user1/.ssh

user1@some.server.com's password:
id_dsa.pub 100% 642 0.6KB/s 00:00


# SETUP AUTHORIZED_KEY FROM CLIENT TO SERVER
user1@some.server.com:~$ cd ~/.ssh
user1@some.server.com:~$ touch authorized_keys
user1@some.server.com:~$ chmod 600 authorized_keys
user1@some.server.com:~$ cat id_dsa.pub >> authorized_keys


DONE!

Secure TCP/IP Connections with SSH Tunnels กับ PostgreSQL

ผมชอบ SSH ตรงที่มันสามารถทำ SSH Tunnels ได้นี่แหละ และก็อีกครั้งที่ผมได้ประสบการณ์ดี ๆ เกี่ยวกับการใช้งาน Database ระยะไกลอีกครั้ง

|---------------------|
| 222.222.22.222 |
| Postgres:5432 |
|----------|----------|
|
|
|---------------------|
| 10.0.0.01 |
| Firewall |
|----------|----------|
|
|
|---------------------|
| 10.0.0.20 |
| local web server |
|----------|----------|


ดูจากรูป เครื่อง Server ของผมฝากไว้ที่ ISP โดยได้ทำการ ติดตั้ง PostgreSQL และ run ไว้ที่พอร์ต 127.0.0.1:5432 เพราะว่าไม่อยากให้ใครมาต่อ นอกจากที่ตัวมันเอง

คราว นี้ก็เป็นประเด็นว่า แล้วถ้าอยากต่อ Database ไปยังเครื่อง Server จากที่อยู่หลัง FireWall หละ จะทำอย่างไร อย่างแรกที่นึกออกก็คือ VPN

หลัง จากติดตั้ง OpenVPN แล้ว ปัญหาก็ตามมา คือ มันช้า แล้วก็หลุดบ่อยด้วย หาทางแก้อยู่ตั้งนาน สุดท้ายก็มาจบที่ SSH Tunnel อีกตามเคย


เอกสาร ที่ผมนำมาเล่าให้ฟังนั้นสามารถอ่านแบบภาษาอังกฤษได้ที่ http://developer.postgresql.org/pgdocs/postgres/ssh-tunnels.html


ขั้น แรกก็ SSh เข้าไปที่เครื่อง local ก่อน
$ ssh username@10.0.0.20

ต่อ มาก็ต้องลุยด้วยการสร้าง Tunnel
$ ssh -L 63333:localhost:5432 username@222.222.222.222
# อธิบายได้ดังนี้
# จะทำการสร้าง Tunnel ที่ 10.0.0.20:63333 (เค้าเรียกว่า End of Tunnel) ไปยัง 222.222.222.222:5432 (เรียกว่า End of Remote Tunnel) และก็เป็นพอร์ตที่เปิดให้บริการ Database อยู่ด้วย
# โดยใช้ผู้ใช้งาน username ต่อไปยัง 222.222.222.222

ที่เครื่อง local web server ตรวจดูความเรียบร้อยหน่อยว่า มีการเปิดพอร์ต 63333 ไว้จริงหรือไม่ด้วย
$ netstat -an |grep 63333

จากนั้นก็ลองดูว่าสามารถใช้งาน postgres ได้จากเครื่อง local หรือไม่
$ psql -h localhost -p 63333 -U postgresuser -l

Postfix กับการส่ง email ด้วยหลาย ๆ Relay





Normally when you need to send massive emails via shared gateway. The possibility way is to set your gateway to relay to ISP's smtp. But what happen if a huge destination emails is in local network. You have to send every local email by local relay?

Please try this

# Create a hash transport map
# touch /etc/postfix/transport
# Add this lines to /etc/postfix/transport
mydomain.com relay:10.0.0.25:25
# Create Map
#postmap /etc/postfix/transport
# Add your transportation to /etc/postfix/main.cf
# postconf -e "transport_maps = hash:/etc/postfix/transport"
# Then reload your postfix
#/etc/init.d/postfix reload

การใช้งาาน PostgreSQL ในส่วนงานต่าง ๆ OLTP, DW, WEB

คราวก่อนนำเนื้อหามาแปะไว้ (PostgreSQL กับการกำหนดค่าที่น่าสนใจของ WEB, OLPT, DW ) กะว่าจะอธิบายต่อที่ตรงนี้ แต่เท่าที่ดูแล้วคิดว่านำออกมาอธิบายต่างหากดีกว่า

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

งานที่ต่าง ๆ กันก็ขอแบ่งออกเป็น 3 อย่างดังนี้ก่อน
  1. WEB - Web Transactional
  2. OLTP - Online Transactional Processing
  3. DW - Data Warehouse
งานทั้ง 3 ประเภทนี้ต่างกัน ทำให้การกำหนดค่าต่าง ๆ ของ Database แตกต่างกันด้วย ลองนึกถึงว่าถ้าหากเราต้องการขับรถ ไปยังที่แตกต่างกัน เราจะเลือกรถอย่างไรดี

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

ก่อนอื่นเราต้องทำความเข้าใจกับ ประเภทของงานทั้ง 3 กันก่อน
"WEB" การเรียกใช้งานส่วนใหญ่เป็นการแสดงผล มีการเรียกการใช้งาน Database บ้าง แต่ส่วนใหญ่จะถูกออกแบบมาเพื่อบริการข้อมูล ไม่ค่อยมีการทำ Transaction
"OLTP" มีการเรียกใช้งานข้อมูลเพื่อประกอบการใช้งาน และมีการบันทึกข้อมูล Transaction กลับไปยัง ฐานข้อมูล มีรายงานที่เกี่ยวกับทางด้าน Tranaction ในแต่ละวัน
"DW" Datawarehouse มีลักษณะเฉพาะ โดยมีจุดประสงค์เพื่อนำข้อมูลที่เก็บไว้มาทำเป็นการวิเคราะห์ และตัดสินใจ และบางครั้งส่งผลที่ได้กลับไปยัง OLTP เพื่อกำหนดวิธีการทำงานต่าง ๆ รายงานส่วนใหญ่ถูกออกแบบมาเพื่อ ทำเป็นข้อมูลเพื่อการตัดสินใจ

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


CPU
ปัจจุบันเท่าที่ประสบมา จำนวน CPU 4-8 cores ก็เพียงพอกับงานที่เกี่ยวกับ Database แล้ว และแต่ละ CPU ก็มีความเร็วที่ค่อนข้างมากแล้วด้วย

MEMORY
หลักง่าย ๆ คือ ถ้าอยากให้เร็วก็ใส่ เยอะ ๆ ปัจจุบันเท่าที่เห็นคือ 16GB

HARDDISK
"many spindles are better" หมายความว่า ถ้าทำ RAID ให้ใช้ HD หลาย ๆ ตัวทำ RAID ใน 1 Volume ในส่วนนี้มีผลต่อ การทำงานของ Database เป็นอย่างมาก เพราะว่า งานส่วนใหญ่ให้ Load Data แล้วประมวลผลใน MEMORY ไม่พอหรอก

NETWORK
หลาย ๆ คนซื้อ Server ที่มี Networks Interface เยอะ ๆ แต่ว่าใช้อันเดียวเอง (เป็นเพราะว่า ไม่เคยเจอ Traffice เยอะ ๆ อย่างผม)


คราวนี้มาดูการปรับแต่งของ Database กัน

max_connections หมายถึงจำนวน connection ที่สามารถเข้ามาใช้งานได้เมื่อขนาดที่มีการใช้งานมากที่สุด โดยแต่ละ connection นั้นจะใช้ ทรัพยากร shared_buffer ที่กำหนดไว้ แน่นอนว่า ถ้ากำหนดไม่ดีจะมีอาการที่บอกว่า "out of memory" นะ

max_connections = 200  # small server   max_connections = 700  # web application database   max_connections = 40   # data warehousing database
shared_buffer หมายถึงปริมาณของหน่วยความจำที่ต้องใช้งานเพื่อการประมวลผล process ก่อนที่จะมีการใช้ disk เพื่อทำ operation ประมาณว่ามี active operations ได้มากเท่าไหร่

# shared_buffers = ( Available RAM / 4 ) # shared_buffers = 512MB   # basic 2GB web server # shared_buffers = 8GB     # 64-bit server with 32GB RAM

work_mem หมายถึงปริมาณของหน่วยความจำที่สามารถใช้ในแต่ละ query ได้ ถ้า Query อะไรที่ซับซ้อนก็ต้องเพิ่มค่านี้เลยครับ
# Most web applications should use the formula below, because their  # queries often require no work_mem.  # work_mem = ( AvRAM / max_connections ) ROUND DOWN to 2^x # work_mem = 2MB  # for 2GB server with 700 connections    # Formula for most BI/DW applications, or others running many complex # queries: # work_mem = ( AvRAM / ( 2 * max_connections ) ) ROUND DOWN to 2^x # work_mem = 128MB   # DW server with 32GB RAM and 40 connections 
ในส่วนตัวแล้ว กว่าจะปรับค่านี้ลงตัวก็ต้องลองหลาย ๆ รอบเหมือนกัน บางทีดูรูปแล้วน่าจะเข้าใจมากขึ้น ref: http://momjian.us/main/presentations.html

SVN proxy repository server!





















แล้วงานก็เข้าอีกทีเมื่อเกิดปัญหาดังนี้

มีการติดตั้งการใช้งาน Application Server ที่ Data Center โดยที่ผู้ใช้งานสามารถเข้าใช้งานผ่านทาง Internet

แต่แล้วเมื่อทางเราทำการแก้ไข Application ที่บริษัท และต้องการ Update Application ผ่านทาง SVN ก็เกิดปัญหาขึ้นดังนี้


ทาง Data Center ไม่สามารถทำการกำหนด Firewall โดยให้สิทธิ์การ SVN ผ่าน Dynamic DNS ได้ ต้องใช้ IP อย่างเดียว ซึ่งงานนี้ไม่สะดวกแน่
ถึงแม้จะทำการต่อ VPN จาก Local Network ไปยัง Application Server ได้ ก็ต้องขอเปิด Port เพื่อทำการ SVN มายัง Local Network ผ่านทาง VPN อยู่ดี ก็ไม่สะดวกอีก ตามข้อ 1
ถ้าหากใช้การ Upload code ที่ทำการ Release version ไว้แล้ว ก็จะทำให้ใช้ Bandwidth มาก เพราะว่าไฟล์มีขนาดใหญ่ อีกทั้ง เราก็มี SVN Repository นี่นา
โชคดีที่เมื่อก่อนทำงานเป็น System Engineer มาบ้าง วิธีแก้ของผมก็มีดังนี้นะครับ

เนื่องจากเรามี Server ที่ใช้งานเป็น Application อยู่ ก็เลยขอนำมาทำเป็น SVN proxy repository โดยจะต้องให้ทาง Data Center ทำการกำหนดให้สามารถทำการเชื่อมต่อ มายังเครื่องนี้ผ่านทาง protocal ที่กำหนด

จากนั้นเครื่องที่ SVN proxy repository ก็ทำการสร้าง Tunnel ที่เชื่อมต่อมายังเครื่อง Repository Server ตามนี้ Tunnel


แล้วเครื่อง Application ก็ทำการ SVN update ผ่านทาง SVN proxy ได้แล้ว

สร้าง Tunnel ระหว่าง SVN proxy repository (2.2.2.2) มายังเครื่อง Local Network (1111.dyndns.org)
svn-proxy:$ ssh -L 2.2.2.2:8443:localhost:443 username@1111.dyndns.org

Update SVN ผ่านทาง SVN proxy repository
application-server:$ svn up https://2.2.2.2:8443/ssvn/project/trunk

ซึ่งเราก็จะใช้งานได้แล้ว

สรุป: ผู้พัฒนาระบบนอกจากจะต้องเข้าใจในเรื่องของ Application Software แล้ว ควรจะเข้าใจในส่วนของ โครงสร้างเครือข่ายด้วย

ปล. (น้อยใจนิด ๆ ) เนื่องจากเราเป็น local company จึงไม่รู้ว่า เวลาที่เป็น international company ถ้าต้องการเปิดสิทธิ์นี้ ทาง Data Center เค้าจะรีบทำกันขนาดไหน อิ อิ

Sphinx! then with Thai Latex on Mac snow leopard

อ้างอิง: http://vuthi.blogspot.com/2005/03/thai-latex-mac-os-x.html

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

มาคราวนี้เห็นเค้าพูดกันหนักหนาว่า Sphix นั้นมันดีทีเดียวสำหรับการเขียนคู่มือ โดยเฉพาะอย่างยิ่ง สำหรับการเขียนเอกสารโดยโปรแกรมเมอร์

แต่พอทำเสร็จแล้วลูกค้าอยากได้เป็น PDF ซะงั้น เอา! ตามเค้าไป

แน่นอนคงไม่พ้น Latex แต่ปัญหามันอยู่ว่า ต้องทำให้เครื่อง Mac Book ผมใช้งาน Latex ภาษาไทยได้ด้วยสิ

มาเร่ิมกันครับ


  1. ติดตั้ง Fink ก่อน
  2. จากนั้นก็ติดตั้ง sphinx
  3. แล้วก็มาถึงคราว Latex
    ปกติแล้วการติดตั้ง sphinx จะมี latex มาให้ด้วยแต่ก็ติดตรงที่ว่า ไม่สามารถใช้งานภาษาไทยได้ดี สุดท้ายต้องติดตั้ง thailatex
    1. ติดตั้ง Thai latex จาก ftp://linux.thai.net/pub/thailinux/software/thailatex/thailatex-0.4.3.tar.gz
      $ tar xzvpf thailatex-0.4.3.tar.gz
      $ cd thailatex-0.4.3
      $ ./configure --prefix=/sw #ติดตั้งไว้ที่ fink
      $ sudo make
      $ sudo make install
    2. แล้วตามด้วยการตัดคำภาษาไทย ผมใช้ swath เพราะว่าหา cttext ไม่เจอ ติดตั้งจาก ftp://linux.thai.net/pub/thailinux/software/swath/swath-0.4.0.tar.gz
      $ tar xzvpf swath-0.4.0.tar.gz
      $ cd swath-0.4.0
      $ ./configure --prefix=/sw
      $ sudo make
      $ sudo make install
    3. อย่าพึ่งดีใจไป ปัญหาที่บอกจากเว็บข้างบนต้องแก้ไขก่อน
      $ updmap --disable thai.map --nohash --nomkmap
      $ updmap --enable Map thai.map
พอเราติดตั้งเสร็จก็เป็นอันเสร็จสำหรับ Latex แต่พอมาใช้กับ sphinx ดันมีบางสิ่งที่ต้องทำแฮะ

ไปแก้ไข conf.py ที่ source directory โดยเพิ่มอันนี้เข้าไปต่อจาก Latex Output

# Latex Elements
latex_elements = {
'babel': '\\usepackage[thai,thainumber]{babel}',
'inputenc': '\\usepackage[utf8x]{inputenc}',
}

เมื่อเราทำการ make latex ที่ source directory แล้ว ก็ทำดังนี้
_build/latex $ swath -u u,u -f latex <> file2.tex # ตัดคำให้สวยงาน
_build/latex $ mv file2.tex file.tex # เปลี่ยนชื่อซักหน่อย
_build/latex $ make all-pdf
เท่า นี้เราก็จะได้ file.pdf แล้ว

Extend User Model in Django

ref: http://docs.djangoproject.com/en/dev/topics/auth/
ในระบบทั่ว ๆ ไปก็ต้องการ Login เพื่อตรวจสอบการใช้งานของผู้ใช้งาน และด้วย Django นั่นมีระบบจัดการ User ให้แล้ว ดังนั้นจะเป็นการดีมากหากเรานำมาใช้งานต่อได้

ใน Django นั้นมีระบบที่เรียกว่า User authentication มาให้ดวย โดยระบบดังกล่าวประกอบด้วย

  1. Users
  2. Permission
  3. Groups
  4. Messages
ใน Class models.User นั่นประกอบด้วยข้อมูลไว้สำหรับทำการ Login แต่ว่าด้วยระบบส่วนใหญ่ที่ผมทำนั้นจะประกอบด้วย Organization, Company, Department, Team ... ดังนั้นก็เลยต้องทำการ extend models นั่นเอง

ผมก็สร้าง app มาใหม่ชื่อว่า user แล้วทำการสร้าง model ดังนี้

from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
code = models.CharField(max_length=100, null=True)
prefix = models.ForeignKey(Prefix, null=True)
email2 = models.EmailField(null=True)
gender = models.ForeignKey(Gender, null=True)
home_phone = models.CharField(max_length=100, null=True, db_index=True)
mobile_phone = models.CharField(max_length=100, null=True, db_index=True)
work_phone = models.CharField(max_length=100, null=True, db_index=True)
pic_url = models.ImageField(upload_to='emp', max_length=200, null=True)
signature = models.TextField(null=True)

def __unicode__(self):
return self.user.get_full_name()


เท่านี้เราก็จะได้การจัดการ User แล้ว

pyCon ที่ Asia

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

http://apac.pycon.org/

ปฏิทินวันหยุด

วันนี้มีน้องที่บริษัท มาให้ลงชื่อเอกสารลาหยุด สิ่งที่ต้องทำเสมอคือ


  1. เปิด iCal ขึ้นมาแล้วตรวจสอบว่ามีวันหยุดของคนอื่นตรงกันหรือไม่ เผื่อลูกค้าต้องการบริการ จะได้มีคนคอยช่วยเหลือหน่อย
  2. คนนี้หยุดไปแล้วกี่ครั้งในปีปฏิทิน
  3. ตรวจดูว่าตรงกับวันหยุดตามปฏิทินหรือไม่

ก็นึกขึ้นได้ว่าปกติที่บริษัทจะยึดปฏิทินของธนาคารเป็นหลัก แต่ว่าจะเอาวันหยุดประจำปีจากปฏิทินธนาคารมาใส่ไว้ใน iCal อย่างไรเนี่ย

ค้นใน Google ก่อน ถ้าไม่มีใครรวบรวม ก็คงเขียน App ขึ้นมาเผื่อแผ่คนอื่นใช้กันบ้างแล้ว!

Updated: 17:36 - เป็นเล่นน่า ไม่มีเป็น iCal ที่ Share ให้ใช้แฮะ มีอันนี้ที่พอดูได้ (icalshare.com)
Updated: 17:38 - ต้องทำไว้ใช้ซะแล้ว
Updated: 17:51 - เจอแล้ว อันนี้ครับ http://icalshare.com/calendars/48 , webcal://ical.mac.com/ical/Thai32Holidays.ics

มันเป็น App ที่ธรรมดา แต่ว่ามีประโยชน์เหมือน "swiss-army knife"

My First Blog Again.

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

วันนี้ 27 ตุลาคม 2555 ขออันเชิญ คุณธรรม ในการทำงานมาไว้ที่นี้

“…คุณธรรมห้าประการที่เป็นพละกำลังส่งเสริม และหนุนนำให้บุคคลประสบผลสำเร็จในการทำงาน…อย่างแรกคือ 

  1. ความมีศรัทธาที่ถูกต้อง ได้แก่ ความเชื่อถืออันประกอบด้วยความเพ่งพินิจด้วยใจที่มั่นคง เป็นกลาง จนเกิดความกระจ่างแจ่มแจ้ง 
  2. อย่างที่สองคือความอุตสาหะพ
    ากเพียรที่กล้าแข็งและไม่ขาดสาย ในอันที่จะกำจัดความเสื่อมและเสริมสร้างความดีความเจริญ 
  3. อย่างที่สามคือ ความระลึกรู้เท่าทันระมัดระวังการกระทำของตัวเองอยู่ตลอดเวลา ไม่ให้ประมาทพลาดพลั้งจนการงานต้องบกพร่องเสียหาย 
  4. อย่างที่สี่คือความตั้งใจมั่นคง ให้ความคิดอ่านเป็นระเบียบ รวมลงในการงานที่จะต้องกระทำ ไม่ฟุ้งซ่านไปในเรื่องอื่น ๆ ที่มิใช่จุดประสงค์ 
  5. อย่างที่ห้าคือปัญญาความรู้ชัด หรือความรู้ตลอดแจ่มแจ้งในงาน และวิธีที่จะปฏิบัติบริหารงานโดยถูกต้องเที่ยงตรง…”

พระบรมราโชวาท ของ พระบาทสมเด็จพระเจ้าอยู่หัว

ในพิธีพระราชทานปริญญาบัตร ของมหาวิทยาลัยรามคำแหง

วันที่ ๑๓ ธันวาคม ๒๕๒๒