วันศุกร์, กุมภาพันธ์ 24, 2549

bigger or stable

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

น่าแปลกคือร้านที่ดีจริงๆ เหล่านั้น บ่อยครั้งไม่อยู่ให้เราไปลองกันนานๆ บางครั้งถ้าร้านเกิดฮิตขึ้นมาหน่อย ก็ต้องเข้าคิวรอกิน

เรื่องนี้ในมุมของ IT ก็เป็นเหมือนกัน คือ มักจะมีการเสนอขอความสามารถใหม่ๆ สารพัด ไอเดีัยบรรเจิดกันกระจาย

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

Blogger อาจจะฟีเจอร์ไม่เยอะมากมาย แต่เมื่อคุณต้องการใช้ น้อยครั้งมากที่เซิร์ฟเวอร์มันจะล่ม

แมคก็แบบเดียวกัน มันอาจจะไม่อร่อยมาก แต่มันก็มีให้คุณกินทุกที่ และกินได้พอๆ กันในทุกๆ สาขาทั่วโลกของแมค

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

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

เป็นสิ่งที่เราต้องแลกเอา


cerdit: justcompany

วันพฤหัสบดี, กุมภาพันธ์ 23, 2549

เผยเคล็ดลับ... รักษาสิวเสี่ยน

เผยเคล็ดลับ... รักษาสิวเสี่ยน

ก่อนอื่นขอบอกก่อนนะว่า ลองทำแล้วได้ผลสุดๆ

ใครไม่เชื่อลองดูเลย เหมาะมากไม่ต้องไปเสียตังด้วย แนะนำเลย

พร้อมยัง.............เริ่ม

วิธีนี้อาจไม่เป็นผลดีต่อตัวเองนะคะ โปรดใช้วิจารณญาณการอ่าน

บอกทีละขั้นตอนเลยนะ
1. ตื่นเช้ามาวันแรกให้อดข้าว
2. ข้าวกลางวันก็ไม่ต้องกิน
3. พอถึงข้าวเย็นก็ไม่ต้องกิน ( อดทนหน่อยนะใกล้แล้ว )
4. นอนพักผ่อนให้เพียงพอ
5. ตื่นเช้ามาอีกวันก็อย่าเพิ่งกินข้าวเช้านะคะ

6. เมื่อเราไม่ได้กินข้าวมาทั้งวันพอถึงตอน "สายก็จะหิว"

lol

ทำไม 1 โหลต้องมีจำนวนนับได้ เป็น 12

เมื่อก่อนทั่วโลกก็ใช้ เลขฐาน5 (จำนวนนิ้ว1มือ), เลขฐาน10 (จำนวนนิ้ว2มือ), เลขฐาน12 (ข้อนิ้ว1มือ) ใช้กันกระจายกันไปในแต่ละพื้นที่ที่ทั่วโลก ...
จนมนุษย์เราติดต่อสื่อสารค้าขายกัน จึงเหลือแต่เลขฐาน 10 มาใช้เป็นหลักสากลดังปัจจุบัน ...
ส่วนไทยใช้ฐาน 10 กันมาแต่ยุคโบราณแล้ว เราจึงไม่เห็นการเปลี่ยนแปลงอะไรนัก ...

ปล. เลขฐาน5 เช่น เลขโรมัน, เลขฐาน12 เช่น โหล, กุรุส (12โหล = 12x12 = 144ชิ้น)

วันเสาร์, กุมภาพันธ์ 18, 2549

iptables for newbie

สมมุติว่าเราอยากจะปิดเครื่องเราโดยสมบูรณ์แบบ แบบว่าชาตินี้ข้าไม่ต้องการคุยกะชาวบ้าน ชาวช่องอีกเลย ก็ให้สั่งว่า
> iptables -A INPUT -i eth0 -j DROP
ถ้าสั่งแบบนี้ แปลว่าเราไม่รับ package ใดๆ ที่เข้ามาทาง eth0 เลย (ก็ไม่ฟังชาวบ้านหน่ะละ)

note: eth0 ก็คือ LAN Card ตัวที่ 1 ของเรา ถ้ามีตัวอื่นๆ อีกก็ไล่ไปเรื่อย
note2: ถ้าไม่ได้อยู่หน้า console อย่าไปสั่ง command นี้เชียว เดี๋ยวจะเป็นเรื่อง

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

> iptables -A INPUT -p icmp -j DROP

มันแปลว่า ถ้ามีอะไรก็ตามที่เป็น icmp เข้ามา ก็ให้ drop ทิ้งไป ไม่ต้องสนใจ ที่นี้ ถ้าสมมุติว่าเรามี LAN Card หลายตัว เกิดอยากปิดแค่บางตัวจะทำยังไง เราก็ต้องผสมคำสั่งเข้าไปซิครับ ย้อนกลับไปดูอันบนกันหน่อย ผมมี -i eth0 อยู่ใช่ม่ะ? เราก็เอาไอ้ -i eth0 นี่ละ มาใส่เข้าไปเลย กลายเป็น

> iptables -A INPUT -i eth0 -p icmp -j DROP

คราวนี้มันก็จะแปลได้ว่า ถ้ามี icmp เข้ามาทาง eth0 เมื่อไหรให้ drop ทิ้งไป แต่ถ้ามาทางอื่นๆ ก็ไม่ต้องทำอะไร (คือปล่อยไปตามปกติ)

คราวนี้มาดูความหมายกันมั่งว่าไอ้ parameter แต่ละตัวเนี่ย มันคืออะไรกันบ้าง? เริ่มจาก

: -A INPUT ไอ้เข้า -A INPUT เนี่ย มันหมายถึงขาเข้า ทีนี้มีขาเข้ามันก็ต้องมีขาออก ก็เปลี่ยนจาก -A INPUT เป็น -A OUTPUT เท่านั้นเองครับ ถ้าเราใช้ -A ต่อๆ กันหลายๆ คำสั่ง มันก็จะเอา rule ไปต่อท้ายเรื่อยๆ ถ้าหากต้องการแทรก ให้ใช้ -I INPUT 1 แทน ซึ่งถ้าใส่ 1 มันจะเติมเข้าไปเป็นตัวแรกสุดเลย

: -i eth0 ใช้ได้กะ -A INPUT เท่านั้น เอาไว้ระบุว่าจะให้ดู package ที่ LAN Card ตัวไหน อีกตัวที่เป็นไปได้คือ -o eth0 ก็จะใช้ได้กะ -A OUTPUT เท่านั้นเหมือนกัน

: -p icmp ไอ้ตัวนี้ละที่จะเป็นตัวกำหนดเลยว่าเราจะ monitor protocal ประเภทไหน เช่น icmp (ping), tcp, udp หรือว่าอื่นๆ ถ้าเป็น tcp หรือว่า udp เราสามารถกำหนด port เพิ่มเติมได้ด้วย parameter -dport 80 หรือ -sport 80 สองตัวนี้ต่างกันตรงที่ว่า ตัวนึงไว้ใช้กะ -A INPUT (-dport 80) ส่วนอีกตัวไว้ใช้กะ -A OUTPUT (-sport 80)

: -J DROP ไอ้เจ้าตัวนี้ละสำคัญที่สุด มันจะเป็นตัวที่บอกว่า ถ้ามี package เข้ามาตามเงื่อนไขที่ระบุไว้ในบรรทัดนี้แล้ว จะให้ทำยังไง เป็นไปได้คือ DROP, ACCEPT, REJECT, REDIRECT ซึ่งที่เราสนใจจะมีสองตัวคือ DROP กะ ACCEPT ความหมายก็ตามชื่อมันเลย DROPACCEPT ก็รับมาเข้ามาแล้วจะจัดการยังไงต่อเป็นอีกเรื่องนึง

: -F อันนี้รุนแรงสุดละ มันคือคำสั่งที่จะลบ rule ทั้งหมดที่เคยทำไว้ ถ้าเกิดทำๆ ไปแล้วเจ๊งก็สามารถ reset ได้ด้วยวิธีนี้ครับ
ก็ช่างหัวมัน ทิ้งไปโล้ด ส่วน

interview google

รอบแรก
1. Complexity ของ quicksort แบบเฉลี่ยกับแย่สุด
2. มี bitstring ยาวมาก ต้องการนับจำนวนบิตที่มีค่าเป็น 1 กำหนดให้มีที่เก็บไม่จำกัด

รอบสอง
1. tcp กับ udp ต่างกันยังไง
2. ถ้าต้องเลือก tcp/udp จะเลือกยังไง
3. firewall จัดการกับ tcp/udp ยังไง

รอบสาม
1. จะ reverse string ยังไงให้เร็วที่สุด
2. ออกแบบฟังก์ชั่นโอนเงินในธนาคาร


- -"

Firefox tune up

1.ไปที่ about:config พิมพ์ว่า config.trim_on_minimize
แล้วปรับเป็น true เพื่อไม่ให้หน่วยความจำมันจำมากไป

2 Ben Goodger ได้ตีพิมพ์วิธีการยับยั้งปัญหานี้ลงในบล็อกไฟร์ฟอกซ์ของเขา
ซึ่งใจความที่สำคัญนั่นก็คือ ปัญหาการเก็บแคชที่มากไป
ไม่มีความจำเป็นใดๆเลย ที่เมื่อเปิดไฟร์ฟอกซ์ แล้วท่องเว็บไป 8 หน้า
แต่ยังเก็บแคชในเว็บแรกที่ท่อง!!

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

โดย Ben ได้สร้างตารางง่ายๆขึ้นมา ซึ่งจะแปรผันตามแรมที่มี
RAM
32MB
64MB
128MB
256MB
512MB
1GB
2GB
4GB
จำนวนหน้าที่จะยังเก็บแคช
0
1
2
3
5
8
8
8

วิธีการก็ง่ายมาก
เพียงแค่ใส่ URL ว่า about:config
จากนั้นใส่โค้ดว่า
ดูนี่:
browser.sessionhistory.max_total_viewers
แล้วก็ดับเบิ้ลคลิกที่ค่า -1 แล้วเปลี่ยนเป็นค่าตามจำนวนแรมที่ใช้
แค่นี้ก็เสร็จสิ้นแล้วครับ

อ้อ อย่างไรก็ตาม มันจะตั้งค่าได้เต็มที่คือ 8 เท่านั้น
ถ้าใส่มากกว่านี้ เช่น 20 30 40 มันจะตั้งให้เป็น 0 ให้ทันที
นั่นคือฟังก์ชั่นการเก็บแคชจะถูกปิดการทำงาน

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

วันพฤหัสบดี, กุมภาพันธ์ 16, 2549

How-to Compile C บน linux

Turbo C มันเป็น IDE = Compiler + Editor + Debugger

gcc เป็น compiler อย่างเดียว
ถ้าอยากได้ IDE ด้วยก็ลองเล่น
พวก kdevelop หรือว่า anjuta

ส่วน debuger ก็ใช้ gdb

ปกติใช้ผ่าน command line เอาไม่ต้องเข้าโปรแกรม :-P
สมมุติว่าเราเขียน program ด้วย notepad ไว้ก่อน
แล้ว save ใส่ file ชื่อ toto.c

เรามาสั่งที่ shell ว่า gcc -o toto toto.c
แล้วว่าสั่ง run ก็สั่ง ./toto

( จริงๆ turbo c ก็ทำแบบนี้ได้นะ รู้สึกว่าใช้คำสั่ง tcc )

บน linux ไม่มี notepad เราใช้โปรแกรมอื่นๆ แทนได้
เช่น gedit ......

How-to mount USB Handy drive in *nix

ใน Linux มักจะใช้ device ชื่อ /dev/sda1
เราก็อาจจะเริ่มจากสร้าง directory ( folder )
ไว้รอเช่น mkdir /mnt/flash
แล้วก็สั่ง mount

mount -t vfat /dev/sda1 /mnt/flash
ก็น่าจะเป็นอันใช้ได้

ที่ http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/html_single/Flash-Memory-HOWTO.html
อธิบายละเอียดเลย ... แต่ถ้าทำง่ายแล้วมันได้ก็ไม่ต้องอ่าน :-)

เครื่องที่เคยลง Ubuntu Linux ไว้ เสีบ USB drive
เข้าไปแล้วใช้ได้เลย ( ไม่ได้ทำอะไรเลย )
ก็มี icon ขึ้นมาบนจอแล้ว clickๆ เอา


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

ส่วนนี้เป็นการเมาท์แฮนดี้ไดรฟ์ โดยเพิ่มพารามิเตอร์ iocharset=utf8 เพื่อให้สามารถอ่านภาษาไทยได้ และ umask=000 เพื่อให้ผู้ใช้ทุกคนสามารถอ่าน และ เขียนได้ และ /mnt/usbdisk นั้น ก็คือไดเรคเทอรี่ที่เราสร้างขึ้นมา เพื่อใช้ในการเมาท์

mkdir /mnt/usbdisk
mount -t vfat /dev/sda1 /mnt/usbdisk -o iocharset=utf8,umask=000

สำหรับ /dev/sda1 นั้น ก็เป็นที่อยู่ของแฮนดี้ไดรฟ์ ซึ่งตรวจสอบได้จากคำสั่ง fdisk -l ดังข้างล่าง

root@chatpong:~# fdisk -l

Disk /dev/hda: 30.0 GB, 30005821440 bytes
!
!
!

Disk /dev/sda: 63 MB, 63766528 bytes
122 heads, 1 sectors/track, 1020 cylinders
Units = cylinders of 122 * 512 = 62464 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 1021 62271+ 6 FAT16
Partition 1 has different physical/logical endings:
phys=(1020, 121, 1) logical=(1020, 103, 1)

ซึ่งเราสามารถประยุกต์ใช้กับอุปกรณ์ต่างๆ ได้

credit : http://chatpong.exteen.com/20050831/entry-1

วันอาทิตย์, กุมภาพันธ์ 05, 2549

RAM requirements

I gave it from http://squid-docs.sourceforge.net
and it so important


Squid keeps an in-memory table of objects in RAM. Because of the way that Squid checks if objects are in the file store, fast access to the table is very important. Squid slows down dramatically when parts of the table are in swap.

Since Squid is one large process, swapping is particularly bad. If the operating system has to swap data, Squid is placed on the 'sleeping tasks' queue, and cannot service other established connections. (? hmm. it will actually get woken up straight away. I wonder if this is relevant ?)

Each object stored on disk uses about 75 bytes (? get exact value ?) of RAM in the index. The average size of an object on the Internet is about 13kb, so if you have a gigabyte of disk space you will probably store around about 80 000 objects.

At 75 bytes of RAM per object, 80 000 objects require about six megabytes of RAM. If you have 8gigs of disk you will need 48Mb of RAM just for the object index. It is important to note that this excludes memory for your operating system, the Squid binary, memory for in-transit objects and spare RAM for for disk cache.

So, what should your sustained-thoughput of your disks be? Squid tends to read in small blocks, so throughput is of lesser importance than random seek times. Generally disks with fast seeks are high throughput, and most disks (even IDE disks these days) can transfer data faster than clients can download it from you. Don't blow a year's budget on really high-speed disks, go for lower-seek times instead - or add more disks.


คิดง่ายๆว่า ถ้ามี พื้นที่ 8gb จะต้องใช้ แรม 48mb ถึงจะครอบคลุมทุกอย่าง