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

iptables

การติดตั้ง และการใช้งาน IPTABLES

Firewall คือ อุปกรณ์ที่ใช้เพิ่มระดับความปลอดภัยให้กับ network โดยเป้นตัวกันระหว่าง network ภายในหน่วยงานกับ networkภายนอกหน่วยงาน เช่น Internet และคอยป้องกันแพ็กเก็ตอันตรายไม่ให้วิ่งเข้ามายังเน็ตเว็คภายในได้ เราสามารถใช้ Linux ทำเป็นFirewall IPTABLES ได้โดยการติดตั้ง IPTABLES

ไอพีเทเบิล(iptables) เป็นคำลั่งบนลีนุกซ์ ที่ใช้ปรับแต่งให้กับระบบ เพื่อให้สามารถกรองแพ็กเก็ต (filter)และสามารถทำการแปลงแอดเดรสได้อีกด้วยโดยคำสั่งนี้มีมาพร้อมกับลี นุกซ์ เคอร์เนลเวอร์ชั่น 2.4 ขึ้นไป สามารถใช้งานได้โดยไม่ต้องคอมไพล์เคอร์เนลใหม่

ประวัติความเป็นมา/ทฤษฏีพื้นฐานที่เกี่ยวข้อง

Linux สามารถใช้งานเป็นไฟร์วอลล์ได้ตั้งแต่เคอร์เนล 1.1 ซึ่งเป็นเวอร์ชันแรก โดย Alan Cox ใช้ชื่อว่า ipfw (จาก BSD)ต่อมา Linux 2.0 ได้ถูกพัฒนาและปรับปรุงได้เครื่องมือที่มีชื่อว่า ipfwadm โดยเครื่องมือชิ้นนี้อนุญาตให้ผู้ใช้สามารถควบคุม filtering ruleได้ และต่อมา Linux 2.2 ก็ได้สร้างเครื่องมือตัวใหม่ชื่อ ipchains ซึ่งเผยแพร่ในปี 1998 โดย Rusty Russelและทีมงานทั้งนี้ ipchains นี้ถือได้ว่าเป็นพัฒนาการขั้นที่สามของ Linux Firewall จวบจนกระทั่งในปัจจุบัน ก็มี netfilter และ iptablesซึ่งถือว่าเป็นพัฒนาการขั้นที่สี่ของ Linux Firewall Netfilter นั้นเป็นชื่อใหม่ของโค้ดที่ทำหน้าที่เป็น packet handler(stateful inspection) ใน Linux kernel 2.4จริงคือเวอร์ชัน 2.3.15 และเวอร์ชันต่อๆ มา) ซึ่งได้ถูกออกแบบและปรับปรุงใหม่จากเวอร์ชันก่อนหน้านี้ เป็นเรื่องที่น่ายินดีคือ netfilter นั้นสามารถทำงานย้อนหลังร่วมกับ ipchains และ ipfwadm ได้ และคำสั่งในการเรียกใช้งานคือ iptables

การใช้คำสั่งไอพีเทเบิล (iptables)

รูปแบบการใช้งาน iptables เบื้องต้น จะมีรูปแบบการใช้งานดังนี้คือ iptables โดยกฎ (rule)ที่เขียนขึ้นจะเป็นเป็นตัวบอกเคอร์เนลว่าให้กระทำอย่างไรในกรณีที่พบ แพ็กเก็ตตรงตามที่ระบุไว้ หมายถึง ตาราง ที่ต้องการระบุ มี 3 ตาราง คือ ฟิลเตอร์เทเบิล (Filter table) แนตเทเบิล (Nat table) และ แมงเกิล (Mangle table) เช่น iptables -t nat หมายถึงให้ทำงานกับแนตเทเบิล ในกรณีที่ไม่ได้ระบุตาราง ไอพีเทเบิล จะถือว่าคำสั่งดังกล่าวระบุถึงฟิลเตอร์เทเบิล โดยอัตโนมัติ
จะเป็นตัวสั่งให้ไอพีเทเบิลทำในสิ่งที่ต้องการ เช่น iptables -A INPUT ซึ่งหมายถึงให้สร้างกฎต่อท้ายอินพุตเชน (INPUT chain) ในฟิลเตอร์เทเบิล
เป็นส่วนที่ใช้ตรวจสอบว่าแพ็กเก็ต มีข้อมูลตรง (match) กับที่ระบุไว้หรือไม่ เช่น มีไอพีแอดเดรสต้นทาง (source ip address) เป็น 1.2.3.4
เป็นตัวระบุว่าเมื่อเจอแพ็กเก็ต ที่ตรง (match) ก็จะกระทำ (action) ตามที่ระบุไว้ เช่น ถ้าแพ็กเก็ตใดมีไอพีแอดเดรสต้นทาง (source ip address) เป็น 1.2.3.4 ให้ทิ้งแพ็กเก็ตนั้น (DROP packet )

ตัวอย่างคำสั่งไอพีแอดเดรส


• -A เพิ่มกฎใหม่ ต่อท้ายเชน (chain) (Append rule) เช่น

iptables -A INPUT -p ALL -i eth0 -j ACCEPT

• -D ลบกฎ (Delete rule) เช่น

iptables -D INPUT --dport 80 -j DROP

• -I เพิ่มกฎใหม่ ในเชน (Insert rule) เช่น

iptables -I OUTPUT -p ALL -s 127.0.0.1/32 -j ACCEPT

• -R แทนที่กฎเดิม ด้วยกฎใหม่ (Replace rule)

• -L แสดงกฎทั้งหมดในเชน (ถ้าไม่ระบุเชนจะแสดงกฎ ทั้งหมดในฟิลเตอร์เทเบิลทั้งสาม built-in chain) เช่น

iptables -L
iptables -L -t nat
iptables -L INPUT

• -F ลบกฎทั้งหมดในเชน ทิ้ง เช่น

iptables -F INPUT
iptables -F mychain

• -Z ใช้ reset byte counter สำหรับทุกกฎ ในเชน ที่กำหนด เช่น

iptables -Z INPUT

• -N ใช้สร้างเชน ใหม่ เช่น

iptables -N mychain

• -X ลบเชน ที่ไม่มีกฎ ซึ่งสามารถลบ user-defined chain ที่ไม่มีกฎ ได้ แต่ไม่สามารถลบ built-in chain ได้ เช่น

iptables -X emptychain

• -P เปลี่ยน default policy ของเชน ค่าที่ใช้ได้คือ ACCEPT, DROP ทั้งนี้ค่านี้มีความสำคัญอย่างมากเพราะหากแพ็กเก็ตถูกส่งเข้ามาในเชน แล้ว และไม่ตรงกับกฎ ใดๆ เลย แพ็กเก็ตนั้นก็ต้องถูกตัดสินใจโดย policy ของเชน นั้นๆ เช่น

iptables -P FORWARD DROP

ซึ่งหากแพ็ก เก็ตถูกส่งเข้ามายังฟอร์เวิร์ดเชน (FORWARD chain) และไม่ตรงกับกฎใดๆใน ฟอร์เวิร์ดเชน นี้เลย แพ็กเก็ตนั้นถูกทิ้งทันที • -E ใช้เปลี่ยนชื่อ chain ใหม่ เช่น

iptables -E myoldchain mynewchain

การ ใช้คำสั่ง ด้านบนนั้นสามารถใช้ร่วมกับออปชันบางอย่างได้ คือ • -V, --verbose ใช้ร่วมกับ -L, -A, -I, -D, -R เพื่อให้แสดงจำนวนไบต์ ที่ ตรงกับกฎ ออกมาด้วย (หน่วยเป็นได้ทั้ง K(x1,000),M(x1,000,000),G(x1,000,000,000)) เช่น

iptables -L –v

• -x, --exact ใช้ร่วมกับ -L และ -v เพื่อให้แสดงจำนวนแพ็กเก็ต และจำนวนของไบต์ ข้อมูลที่ตรงกับกฎ โดยไม่ให้แสดงผลในหน่วยของ K,M,G เช่น

iptables -L OUTPUT -v –x

• -n, --numeric ใช้ร่วมกับ -L เพื่อสั่งให้ไอพีเทเบิล แสดงข้อมูลไอพีแอดเดรสและพอร์ต เป็นตัวเลขเท่านั้น เช่น

iptables -L OUTPUT -n

• --line-numbers ใช้ร่วมกับ -L เพื่อแสดงเลขบรรทัดของกฎ ซึ่งตัวเลขที่แสดงนี้จะสามารถใช้ได้กับคำสั่งเพิ่มกฎใหม่ในเชน ( insert rule) ที่ระบุเป็นลำดับที่ของกฎ เช่น

iptables -L --line-numbers

• --modprobe=command เพื่อโหลดโมดูล (module) ที่เกี่ยวข้อง


Match

การตั้งเงื่อนไขของการ match นั้นจะต้องอาศัยความเข้าใจในเรื่อง IP, TCP, UDP, และ ICMP มาบ้างพอสมควร จึงจะสามารถตั้งเงื่อนไขที่เหมาะสมและตรงตามความต้องการได้ ซึ่งมีรายละเอียดดังนี้

การระบุไอพีแอดเดสของต้นทางและปลายทาง

สามารถระบุไอพีแอดเดรสต้นทาง (source ip address) ของแพ็กเก็ต โดยใช้ -s หรือ --source หรือ --src และสำหรับไอพีแอดเดรสปลายทาง (destination ip address) ก็ใช้ -d หรือ --destination หรือ –dst

การทำ Inversion
ในบางกรณีนั้นหากต้องการระบุเป็นอินเวิร์ส (inverse) เช่น อนุญาตให้ทุกไอพียกเว้นไอพีที่ระบุไว้ ซึ่งการใช้คำสั่งดังกล่าวสามารถทำได้โดยใช้เครื่องหมาย ! นำหน้า argument ที่ต้องการ (เครื่องหมาย ! หมายถึง NOT) เช่น -p ! TCP ซึ่งจะตรง กับโพรโตคอลทุกๆ ตัวที่ไม่ใช่ทีซีพี หรือ -s ! localhost ซึ่งหมายถึงแพ็กเก็ต ที่มีไอพีแอดเดรสต้นทาง อื่นๆ ยกเว้น localhost (127.0.0.1)

การระบุโพรโตคอล
สามารถระบุโพรโตคอลที่ต้องการได้ดังนี้คือ ทีซีพี (TCP), ยูดีพี (UDP), ไอซีเอ็มพี (ICMP) หรือสามารถใช้ตัวเลขแทนได้ (สำหรับ *NIX อ้างอิงได้จาก /etc/protocols) และยังสามารถใช้ได้ทั้งตัวอักษรเล็กหรือใหญ่ (ใช้ได้ทั้ง tcp และ TCP) เช่น -p TCP หรือ -p ! tcp

การระบุ interface

-i หรือ --in-interface ตามด้วยชื่ออินเตอร์เฟส ( interface) ใช้เพื่อระบุ incoming interface ซึ่งหมายถึงว่า แพ็กเก็ต ที่จะตรงกับกฎ นี้ต้องเข้ามาจากอินเตอร์เฟส ที่กำหนด เช่น -i eth0 หมายความว่า ทุกแพ็กเก็ต ที่เข้ามาทาง eth0 จะ ตรงกับกฎ นี้ ทั้งนี้ชื่ออินเตอร์เฟส ที่สามารถใช้ได้นั้น สามารถตรวจสอบได้โดยใช้คำสั่ง ifconfig และ -o หรือ --out-interface ตามด้วยชื่อของอินเตอร์เฟส ใช้เพื่อระบุ outgoing interface ซึ่งหมายถึงว่า แพ็กเก็ต ที่จะ ตรงกับกฎ นี้ กำลังจะเดินทางผ่านอินเตอร์เฟส ที่ระบุไว้ เช่น -o eth1 หรือ -o ! eth1
ragment packet

ในการส่งข้อมูลใน ip network นั้นเป็นเรื่องปกติที่จะ เกิดการแฟรกเมนต์ (fragment)ของแพ็กเก็ตเนื่องจากขนาดของแพ็กเก็ต มีขนาดใหญ่เกินไปที่จะส่งไปในครั้งเดียว จำเป็นต้องมีการแบ่งแพ็กเก็ต ออกเป็นหลายๆ ชิ้นทยอยส่งไป ซึ่งเรียกกันว่าการทำแฟรกเมนต(fragment)โดยเครื่องปลายทางจะทำหน้าที่ประกอบ แฟรกเมนต์แพ็กเก็ต(fragment packet)รวมกันเป็นแพ็กเก็ต ที่สมบูรณ์ดังเดิม ข้อมูลที่เป็นแฟรกเมนต์แพ็กเก็ต นั้นจะมีเฮดเดอร์ (header)ที่สมบูรณ์แค่แพ็กเก็ต แรกเท่านั้น ส่วนแพ็กเก็ต ที่ตามมาจะมีแค่เฮดเดอร์ บางส่วนคือ ไอพีแอดเดรสเท่านั้น ไม่มีข้อมูลของโพรโตคอลแนบมาด้วย ดังนั้นการตรวจสอบข้อมูลเฮดเดอร์ ของ ทีซีพี ยูดีพี ไอซีเอ็มพี จึงไม่สามารถทำได้ในแพ็กเก็ต ที่สองเป็นต้นมา หากใช้แนต (NAT)แพ็กเก็ตประเภทแฟรกเมนต์แพ็กเก็ต จะถูกประกอบเข้าด้วยกันจนสมบูรณ์ก่อนที่ แพ็กเก็ต จะเข้าไปถึง แพ็กเก็ตฟิลเตอร์ริ่ง (packet filtering) ดังนั้นจึงไม่มีความจำเป็นที่จะต้องกังวลเกี่ยวกับ แฟรก-เมนต์แพ็กเก็ต ในกรณีที่ไม่ได้ใช้แนต (NAT) แพ็กเก็ตประเภทแฟรกเมนต์แพ็กเก็ตก็จะไม่ถูกประกอบเข้าด้วยกัน ไอพีเทเบิล จะมีกระบวนการในการทำงานกับ แฟรกเมนต์แพ็กเก็ตดังนี้ หลังจากที่แฟรกเมนต์แพ็กเก็ตแรกผ่านเข้ามาแล้วไอพีเทเบิล สามารถตรวจสอบได้ว่าจะอนุญาตให้ผ่านหรือไม่ ในขณะที่แฟรกเมนต์แพ็กเก็ต ที่สองและหลังจากนั้นที่ตามมานั้น จะไม่สามารถนำไปตรวจสอบกับกฎ ใดๆ เลย เช่น -p TCP --sport www หรือแม้แต่ -p TCP --sport ! www แต่ยังสามารถเขียนกฎ ให้ตรวจสอบทั้งแฟรกเมนต์แพ็กเก็ต ตัวที่สองและหลังจากนั้นที่ตามมาได้ด้วยการใช้ -f หรือ --fragment ทั้งนี้อาจจะเขียนในทางตรงข้ามคือไม่ต้องตรวจสอบแฟรกเมนต์แพ็กเก็ต ที่สองและหลังจากนั้นโดยใช้ ! -f ก็ได้ โดยปกติแล้วมักจะปล่อยให้แฟรกเมนต์แพ็กเก็ต ผ่านไป เนื่องจากถ้าสามารถทิ้งแฟรกเมนต์แพ็กเก็ตแรกได้แล้ว แพ็กเก็ตทั้งหมดก็จะไม่สามารถถูกประกอบที่เครื่องปลายทางได้ แต่ทั้งนี้แฟรกเมนต์แพ็กเก็ต ที่ถูกปล่อยไปดังกล่าวอาจจะทำให้เครื่องที่ได้รับนั้นเกิดการชะงัก หรือเกิดความเสียหายได้ หรืออาจจะเกิดการโจมตีแบบดีไนอัลออฟเซอร์วิส (Denial of Service) โดยใช้แฟรกเมนต์แพ็กเก็ตได้

การระบุ target

user-defined chain

เนื่องจากไอพีเทเบิล อนุญาตให้ผู้ใช้สามารถสร้างเชน (chain) ขึ้นมาได้ใหม่นอกเหนือจากเชนที่มีมาอยู่แล้ว (built-in chain) ทั้งสามตัว (INPUT, OUTPUT, FORWARD) ทั้งนี้จะต้องใช้ตัวอักษรตัวเล็กทั้งหมดสำหรับเชน ที่ผู้ใช้สร้างขึ้นเอง เมื่อแพ็กเก็ตตรงกับกฎ ที่เป็นเชนที่ผู้ใช้กำหนดขึ้น (user-defined chain) แพ็กเก็ตนั้นจะถูกนำไปตรวจสอบใหม่โดยเชนที่ผู้ใช้กำหนด นั้นๆ และถ้าในเชนนั้นๆ ไม่มีการตัดสินใจใดๆ แพ็กเก็ตนั้นก็สามารถย้อนกลับมายังกฎ ถัดไปในเชนที่เริ่มต้นเดินทางได้

new target

เป็น target ที่สร้างเพิ่มเติมขึ้นมาคือ

LOG เป็น โมดูลที่มีความสามารถในการเก็บข้อมูลลงล็อก (มี syslog facility เป็น kernel) สำหรับแพ็กเก็ตที่ตรงกับกฎที่ระบุปลายทาง เป็น LOG มีออปชันให้เลือกใช้งานดังนี้คือ--log-level เป็นการระบุ priority level ของ log ซึ่งกำหนดได้ตั้งแต่ debug, info ,notice, warning, crit, alert, emerg--log-prefix ตามด้วยชุดของตัวอักษรยาวไม่เกิน 29 ตัว ซึ่งชุดของตัวอักษรดังกล่าวจะปรากฏอยู่บนล็อกไฟล์
ความสำคัญของ 3 ตารางหลัก ในคำสั่งไอพีเทเบิล

1.Filter Table เป็น ตารางที่ใช้งานมากที่สุด เป็นจุดที่ใช้ในการตรวจสอบและควบคุมการผ่านเข้าออกของแพ็กเก็ต ถ้าหากจะพิจารณาการไหลเวียนของแพ็กเก็ต เฉพาะใน ส่วนของฟิลเตอร์เทเบิล (filter table) โดยไม่สนใจเทเบิล อื่นๆ นั้น ก็พอจะแสดงให้เห็นได้ดังรูปที่ 2.20 โดยเมื่อแพ็กเก็ต เข้ามาในระบบ มันจะเข้าไปยัง routing decision เพื่อตัดสินใจว่า แพ็กเก็ต จะถูกส่งไปที่ใด
2.Mangle Table เป็นตารางที่ใช้สำหรับแก้ไข ข้อมูล TOS, TTL, MARK ของแพ็กเก็ต ซึ่งโดยปกติแล้วแทบจะไม่ได้ใช้งาน และไม่ควรทำ packet filtering หรือกรองแพ็กเก็ต ที่ตารางนี้ รวมทั้งไม่ควรทำ DNAT, SNAT หรือ Masquerading ที่ตารางนี้อย่างเด็ดขาดด้วย
3.Nat Table เป็น ตารางที่ใช้สำหรับทำการแปลงแอดเดรส (network address translation) เช่น เปลี่ยนค่าไอพีแอดเดรสต้นทางและปลายทาง (source ip address, destination ip address) จุดสำคัญอีกอย่างหนึ่งที่ต้องรู้ก็คือ มีเพียงแพ็กเก็ต แรกเท่านั้นที่เข้ามาที่เชน นี้ ส่วนแพ็กเก็ต ถัดไปนั้นจะถูกกระทำเหมือนที่แพ็กเก็ต แรกได้รับ ดังนั้นจึงไม่ควรทำ packet filtering ที่เชน เหล่านี้

การใช้งาน Nat table นั้นก็เพียงแต่ใช้ออปชัน -t nat เท่านั้น และ target ที่สามารถใช้งานได้คือ SNAT, DNAT, Masquerade, Redirect ซึ่งมีรายละเอียดดังนี้

SNAT

การทำ source NAT จะทำที่ POSTROUTING chain โดย หลักๆ คือทำการเปลี่ยนแอดเดรสต้นทาง (source address) ก่อนที่จะส่งแพ็กเก็ตนั้นออกไป ซึ่งสามารถใช้ออปชัน -o (outgoing interface) ร่วมด้วยได้ นอกจากนี้ยังใช้ -j SNAT และ --to--source หรือ --to เพื่อเปลี่ยนไอพีแอดเดรสหรือ port ไปตามต้องการได้ เช่น

เปลี่ยน source ip address เป็น 1.2.3.4

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

เปลี่ยน source address เป็น 1.2.3.4, 1.2.3.5 หรือ 1.2.3.6

iptables -t nat -A POSTROUING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6

เปลี่ยน source address เป็น 1.2.3.4 port 1-1023

iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023

Masquerading
การ ทำ masquerade นั้นเป็นหนึ่งในรูปแบบของการทำ source NAT แบบพิเศษ ซึ่งใช้สำหรับ กรณีที่ได้รับไอพีแบบไม่ซ้ำ(dynamically-assigned IP address) เช่น ผู้ที่ใช้โมเด็มล็อกอินเข้าไปยัง isp (สำหรับผู้ที่ใช้ static IP address ให้ใช้ SNAT ดังตัวอย่างด้านบน) ซึ่งข้อดีของการทำ masquerading คือไม่จำเป็นต้องระบุค่าของไอพีแอดเดรสที่จะใช้ในการเปลี่ยน เช่น

ทำ masquerade สำหรับทุก packet ที่วิ่งผ่าน ppp0

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

DNAT

การ ทำ Destination NAT จะทำภายใต้ PREROUTING chain หลักๆ คือการเปลี่ยนค่า destination address หรือ port ก่อนที่จะส่งpacket ไปยัง routing decision โดยปกติการใช้งานจะระบุ -j DNAT และใช้ --to-destination หรือ --to และยังสามารถใช้ -i(incoming interface) ร่วมด้วยได้ เช่น

เปลี่ยน destination address เป็น 192.168.1.20

iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.1.20

เปลี่ยน destination address เป็น 192.168.1.20, 192.168.1.21 หรือ 192.168.1.22

iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.1.20-192.168.1.22

เปลี่ยน destination address ของ web traffic เป็น 192.168.1.50 port 8080

iptables -t nat -A PREROUING -p tcp --dport 80 -ieth0 -j DNAT --to 192.168.1.50:80

Redirection

การทำ redirect นั้นเป็นหนึ่งในรูปแบบของการทำ Destination NAT แบบพิเศษ เช่น

เปลี่ยน web traffic ธรรมดาให้ผ่านไปยัง squid proxy (transparent)

ip tables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j REDIRECT --to-port 3128

ตัวอย่าง การทำ Masquerading

ตัวอย่าง การใช้งาน masquerading ที่เห็นได้ชัดเจนในประเทศไทยก็คือ ร้านอินเทอร์เน็ตคาเฟ่(แบบประหยัด) ซึ่งนิยมใช้โมเด็ม 1 ตัว ติดต่อ(connect)ไปยัง ไอเอสพี (Internet Service Provider) แล้วใช้ NAT เพื่อให้เครื่องลูกที่มีอยู่หลายๆ เครื่องนั้น สามารถใช้งานอินเทอร์เน็ตผ่านโมเด็มตัวนั้นได้ โดยเครื่องลูกจะต้องใช้ private ip ซึ่งมีให้เลือกหลายคลาส (class) เช่น 10.x.x.x 192.168.x.x เป็นต้น จากนั้นก็ตั้งเกตเวย์ให้ชี้ไปยัง linux box ที่ทำหน้าที่หมุนโมเด็มและรันไอพีเทเบิล ซึ่งสามารถใช้คำสั่งง่ายๆ ดังด้านล่างก็ทำให้เครื่องลูกสามารถใช้งานอินเทอร์เน็ตได้แล้ว คือ
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo "1" > /proc/sys/net/ip_forward

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

driver compaq c700tu

เอาหมายเลขไปค้นใน www.hp.com C700TU Series

1. Intel Chipset Installation Utility for ICH8
sp36880.exe (1.9 MB)
http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareDescription.jsp?lang=en&cc=us
&prodTypeId=321957&prodSeriesId=3357377&prodNameId=3357378&swEnvOID=1093&swL
ang=8&mode=2&taskId=135&swItem=ob-54070-1


2. Microsoft Universal Audio Architecture (UAA) Bus Driver for High Definition Audio
sp33566.exe 1/1 (54.24M)

3. Conexant High Definition Audio Drive
sp33443.exe INSTALL MANUAL

4. Conexant HDAUDIO Soft Data Fax Modem with SmartCP
sp33442.exe INSTALL MANUAL

5. Graphic Download From www.Intel.com Chipset Mobile Intel965
http://downloadcenter.intel.com/confirm.aspx?httpDown=http://downloadmirror.intel.com/14397
/a08/win2k_xp14311.zip&agr=N&ProductID=2800&DwnldId=14397&strOSs=All&OSFullName
=All%20Operating%20Systems&lang=eng

6. HP Quick Launch Buttons
sp33258.exe 1/1 (14.55M)

7. Synaptics Touchpad
sp35444.exe 1/1 (16.93M)

8. Realtek RTL8139/810x Family Fast Ethernet NIC Driver
sp33444.exe 1/1 (5.01M)

9. Broadcom Wireless LAN Driver
sp34152.exe 1/1 (4.29M)

10. Intel PRO/Wireless Drivers
sp35426.exe 1/1 (6.73M)

11. HP Wireless Assistant
sp33575.exe 1/1 (4.22M)

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

ตรวจสอบสถานะ ppp

ดูผ่าน putty ใช้คำสั่ง cat /var/log/syswatch |grep detected

เขียน firewall ให้ตรวจสอบว่า squid ทำงาน ก็ให้ 80 วิ่งไป squid ถ้าไม่ทำงานก็ วิ่งออก 80 เลย

if [ -f /var/run/squid.pid ]; then
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
else
iptables -t nat -I PREROUTING -p tcp --dport 80 -j ACCEPT

- ความหมายของ Code ก็คือ ถ้า squid ทำงานอยู่ให้ทุก Packet ที่จะออกไป Port 80 ให้ไปที่ Port 3128 ซึ่งเป็น Port ของ squid ก่อน แต่ถ้า squid ไม่ได้ทำงานอยู่ให้ทุก Packet ที่จะออกไป Port 80 ผ่านไปได้เลย

- Firewall จะมีการตรวจสอบ Code ทั้งหมดใหม่เมื่อพิมพ์คำสั่ง service firewall restart ,. /etc/rc.d/rc.firewall.local หรือเมื่อมีการตัด-ต่อของเน็ต เพื่อเช๊ค service ต่างๆ เช่น squid ,frox และทำการจัดสรรเส้นทางให้กับ Packet ตาม Firewall ที่เขียนไว้

- ถึงเรา stop squid ไปแล้ว Firewall ก็ยังทำงานเหมือนเดิมคือถ้าจะออกไป Port 80 ก็ต้องไปที่ squid แต่ squid มันถูกหยุดทำงานไปแล้วมันก็เลยออกไปไหนไม่ได้

- ดังนั้นเราจะทำยังไงให้ Firewall มันรู้ว่า Squid หยุดทำงานไปแล้ว เพื่อที่มันจะได้จัดสรรเส้นทางใหม่ให้กับ Packet ว่า ถ้าจะออกไป Port 80 ไม่ต้องผ่าน Squid แล้วให้ออกไปได้เลย ก็คือ Restart Firewall ครับ

เขียน firewall ให้ตรวจสอบว่า squid ทำงาน ก็ให้ 80 วิ่งไป squid ถ้าไม่ทำงานก็ วิ่งออก 80 เลย

if [ -f /var/run/squid.pid ]; then
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
else
iptables -t nat -I PREROUTING -p tcp --dport 80 -j ACCEPT

- ความหมายของ Code ก็คือ ถ้า squid ทำงานอยู่ให้ทุก Packet ที่จะออกไป Port 80 ให้ไปที่ Port 3128 ซึ่งเป็น Port ของ squid ก่อน แต่ถ้า squid ไม่ได้ทำงานอยู่ให้ทุก Packet ที่จะออกไป Port 80 ผ่านไปได้เลย

- Firewall จะมีการตรวจสอบ Code ทั้งหมดใหม่เมื่อพิมพ์คำสั่ง service firewall restart ,. /etc/rc.d/rc.firewall.local หรือเมื่อมีการตัด-ต่อของเน็ต เพื่อเช๊ค service ต่างๆ เช่น squid ,frox และทำการจัดสรรเส้นทางให้กับ Packet ตาม Firewall ที่เขียนไว้

- ถึงเรา stop squid ไปแล้ว Firewall ก็ยังทำงานเหมือนเดิมคือถ้าจะออกไป Port 80 ก็ต้องไปที่ squid แต่ squid มันถูกหยุดทำงานไปแล้วมันก็เลยออกไปไหนไม่ได้

- ดังนั้นเราจะทำยังไงให้ Firewall มันรู้ว่า Squid หยุดทำงานไปแล้ว เพื่อที่มันจะได้จัดสรรเส้นทางใหม่ให้กับ Packet ว่า ถ้าจะออกไป Port 80 ไม่ต้องผ่าน Squid แล้วให้ออกไปได้เลย ก็คือ Restart Firewall ครับ

ลง squid 2.6 r13 แทน squid 2.5

apt-get remove squid
apt-get clean
apt-get update

rpm -Uhv squid >>>>ทีื่จะติดตั้ง
service squid restart
ทำตามนี้นะครับ

cd /var/spool
chown -R squid:squid squid
chmod 777 squid
cd /var/log
chown -R squid:squid squid
cd squid
touch access.log
touch store.log
touch cache.log
chmod 777 access.log
chmod 777 store.log
chmod 777 cache.log

เสร็จแล้วก็ squid -z
service squid restart

วันพุธที่ 8 กันยายน พ.ศ. 2553

จำักัด bandwidth ด้วย squid

Delay pools ทำหน้าที่ใช้เพื่อควบคุมปริมาณการใช้Trafficในเครือข่ายหรือควบคุมการวิ่งของข้อมูล เพื่อไม่ให้ Bandwidth เต็มหรือพูดอีกอย่างหนึ่งได้ว่าใช้ squid เป็นการทำ Traffic Shaper

ชื่อเรื่อง: Squid (Delay pools)

ที่มา : www squid-cache.org, www.thaifast.com, www.thaicert.nedtec.or.th, www.squid.visolve.com, www.tng.prirate.dk/how -squid.html

เรียบเรียงโดย :
1. นางสาวรัตนา โพธิบัติ
2. นางสาวลลิตา ธงชัย
3. นางสาววาสนา ช่างถม
4. นางสาวสกาวรัตน์ เขาแก้ว
5. นางสาวอุมา ชัยสุวรรณ์

เผยแพร่เมื่อ: 26 กุมภาพันธ์ 2547

Proxy

ทำหน้าที่เป็นที่พักข้อมูลที่ถูกดึงมาจาก Server ภายนอก ไม่ว่าจะเป็นภาพ , เสียง , เอกสาร , html เป็นต้น

การใช้ Proxy server โดยทั่วไปผู้บริหารระบบจะทำการกำหนดให้เครื่อง client ในเครึอข่ายค้นหาไฟล์หรือข้อมูลจาก proxy server ก่อนที่จะไปค้นหา server ภายนอก เพื่อเป็นการประหยัด ช่องทางการจารจร เพื่อให้การเล่นอินเทอร์เน็ตจัดการได้เร็วขึ้นโดยการทำงานของ proxy server จะถูกจัดการโดยโปรแกรม squid

Squid

คือโปรแกรมที่ทำหน้าที่เป็น Proxyและ Cache เซิร์ฟเวอร์ที่มีประสิทธิภาพสูง เราสามารถค่า configuration ต่าง ๆ ของ squid เพื่อทำเป็น Proxy server เช่น การกำหนดขนาดของพื้นที่ที่ใช้ในการเก็บข้อมูล ทั้งในดีสก์และในแรม นอกจากนี้แล้ว เรายังสามารถทำการบริหารช่องทางที่เรียกว่า Bandwidth โดยใช้ squid ได้อีกด้วยโดยใช้ delay pools

Delay pools

Delay pools ทำหน้าที่ใช้เพื่อควบคุมปริมาณการใช้Traffic หรือการวิ่งของข้อมูลเพื่อไม่ให้ Bandwidth เต็มหรือพูดอีกอย่างหนึ่งได้ว่าเป็นการทำ Traffic Shaper

การกำหนดค่า Squid

ใช้คำสั่ง#pico squid.conf

http_port 8080 #เป็นตัวกำหนด squid เพื่อฟังการร้องขอมากจาก client โดยกำหนดมาที่ port 8080

# หลีกเลี่ยงการเก็บ cgi scripts ลงในแคช
acl QUERY urlpath_regex cgi-bin
no_cache deny QUERY

#ส่วนนี้ใช้ทำ transparent proxy
httpd_accel_host virtual httpd_accel_port 0
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

# ขนาดแรมที่มีอยู่จริงในเครื่องหาร 3
cache_mem 350 MB #กำหนดขนาดหรือการจองพื้นที่ใน Ram มาทำเป็น cache memory เพราะว่า CPU สามารถดึงข้อมูลใน Ram ได้เร็วกว่าใน Disk

# ที่เก็บ log files ถ้าไม่เก็บล็อกไฟล์ก็ /dev/null แทนไดเร็กทอรีนั้น ๆ
cache_dir diskd /cache 1000 16 256 Q1=72 Q2=64 #หมายเลข 1000 นี้เป็นขนาดดิสก์ที่ squid ที่จองไว้ใช้ทำดิสก์แคชมีขนาด 1000 เมกะไบต์
cache_access_log /var/log/squid/access.log #มีไว้เก็บข้อมูลการร้องขอ client สำหรับทุก ๆ http และ icpquery
cache_store_log /var/log/squid/store.log #แสดงถึง log-file ที่เก็บไว้ใน cache
cache_log /var/log/squid/cache.log #เก็บขนาดของ object ที่ถูกดาวโหลดเข้าใน server

# กำหนดวิธีการแทนที่ข้อมูลเดิมในแคช
cache_replacement_policy GDSF #เป็นวิธีการแทนที่ไฟล์ที่เก็บไว้ใน cache
dns_testnames 202.29.14.1
logfile_rotate 10 #กำหนดให้ logfile ทำงานแบบครบ 10 ไฟล์ค่อยแทนของเดิม

#acl = Access List เป็นการตั้งส่วนควบคุมการใช้งาน Proxy/cache เซิร์ฟเวอร์
acl all src 0.0.0.0/0.0.0.0 #all เป็นชื่อ ที่กำหนดให้ต้นทางคือทุกเครื่อง
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255 # localhost เป็นชื่อคือต้นทางคือเครื่องตัวเอง
acl rinet src 202.29.14.0/255.255.255.0 # rinet เป็นชื่อ ที่ใช้กำหนดให้ต้นทางคือ ip ในเน็ตเวิร์คขององค์กร
acl SSL_ports port 443 563
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

#อนุญาตหรือไม่อนุญาต acl ที่ตั้งไว้ http_access allow manager
http_access allow localhost
http_access allow rinet
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

icp_access allow localhost
icp_access allow rinet
#ส่วน acl ก่อนการทำ Delay pools

acl magic_words1 url_regex -i 202.29.14.1
#กำหนด acl กลุ่มที่มีสิทธิ์ทุกอย่าง acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .tar.gz .gz .rpm .zip .rar .avi .mpeg .mpe .mpg .qt .ram .rm .iso .raw .wav .mov #กำหนด acl กลุ่มที่ต้องควบคุม traffic คือไฟล์บางประเภทที่ใหญ่ ๆ

การกำหนดค่า Squid(Delay Pool)
# สำหรับ delay pool ที่คุณต้องการ --enable-delay-pools
delay_pools 2 #กำหนดให้มี 2 pool ที่ต้องใช้

#สมมุติมี link ขนาด 2Mbits ซึ่ง 2 mbits == 256 kbytes ต่อวินาที เราจะจำกัดให้ใช้ได้ไม่เกิน 5 KB/s ต่อโหนด
delay_class 1 2 #กำหนดให้ pool ที่ 1 เป็น class 2 ที่ถูกกำหนดค่าไว้ใน magic_word2 แบบจำกัด
delay_parameters 1 256000/256000 5000/256000
delay_access 1 allow magic_words2 #กลุ่มที่ดาวน์โหนดไฟล์ต่าง ๆ ที่กำนดไว้
delay_access 1 allow rinet #กลุ่มที่มี ip ต้นทางเป็นเครือข่ายภายใน

# -1/-1 หมายความว่าไม่มีการจำกัดขนาดของ traffic.
delay_class 2 2 #กำหนดให้ pool ที่ 2 เป็น class 2 ที่ถูกกำหนดค่าไว้ใน magic_word1 แบบไม่จำกัด
delay_parameters 2 -1/-1 -1/-1
delay_access 2 allow magic_words1

# ไม่จำกัดขนาด
reply_body_max_size 0 allow all


#ส่วน snmp เพื่อเอาไว้ใช้วัดการใช้งาน traffic
acl snmppublic snmp_community public
snmp_access allow snmppublic localhost
snmp_access deny all

# Change domain
cache_mgr noc@ribr.ac.th
cachemgr_passwd secret_password all
visible_hostname proxy1.ribr.ac.th
unique_hostname proxy1.ribr.ac.th
#******************************* End of squid.conf file *********************************

สร้าง Cache Directory

ใช้คำสั่ง#mkdir /cache

#cdmod 755 /cache/

#chown -R squid:squid /cache/

#mkdir /var/log/squid/

#chmod 755 /var/log/squid/

#chown -R squid:squid /cache/

#squid -z

#service squid start

ถ้าถูกต้องจะขึ้น[OK] ที่บรรทัด startting squid

ใช้คำสั่ง#tail -f/var/log/squid/access.log เพื่อติดตามการทำงานของ squid ูว่ามีการร้องขอใช้ proxy หรือยัง

ลองหาดาวน์โหลดไฟล์พวก .zip ดูว่าความเร็วในการดาวน์โหลดไม่เกิน 5 Kb จริงหรือไม่ ...

พื้นฐาน iptables

http://www.thaicert.nectec.or.th/paper/firewall/iptables.php

แก้ปัญหา iptables หลังเปลี่ยน version cc
http://www.thaicert.nectec.or.th/paper/firewall/iptables.php

รวมหัวข้อ squid

http://www.visolve.com/squid/squid24s1/contents.php

เรื่อง ACL ของ squid


เข้าไปดูรายละเีอียดที่ http://www.visolve.com/squid/squid24s1/access_controls.php
และ http://kom.homelinux.org/node/241

เพิ่มเติ่ม refresh pattern

#525960 = 1year
#43200 = 1 month
#1440 = 1 day
#7200 = 5 day

อ่านดูเพิ่มเติมที่

refresh_pattern

1.ทำความเข้าใจกับคำว่า " refresh_pattern "
2.แก้ไขไฟล์ คอนฟิก squid.conf.tmpl
3.รีสตาร์ทเซอร์วิส ของ Squid

1.ทำความเข้าใจกับคำว่า " refresh_pattern "

ข้อมูลอ้างอิงจากเว็บ http://star-internet.com/SMF115/index.php?topic=74.0

refresh pattern เป็นตัวกำหนดว่าจะให้อะไรเก่าอะไรใหม่สำหรับแคชและการตอบกลับ ซึ่งโดยหลักการแล้ว คุณควรจะให้ squid เชื่อตาม HTTP header ต่าง ๆ ที่เว็บเซิร์ฟเวอร์ตอบกลับมา ว่าอะไรเก่าอะไรใหม่ขนาดไหน แต่โชคไม่ดีที่ค่าต่าง ๆ เหล่านี้มักตอบมาตามค่า default ของเว็บเซิร์ฟเวอร์ ซึ่งไม่ช่วยอะไรนักสำหรับการทำแคช ดังนั้น การปรับ refresh pattern จึงช่วยได้ในเรื่องนี้

refresh pattern ใน squid.conf จะอยู่ในรูปแบบ:

refresh_pattern [-i] regex min percent max [options]

โดยที่

regex คือนิพจน์เรกิวลาร์แทน URL ที่จะเข้ากฎ โดยปกติจะ case sensitive ยกเว้นเมื่อมีตัวเลือก -i
min คืออายุที่ต่ำที่สุด (เป็นนาที) ของอ็อบเจกต์ที่จะเริ่มพิจารณาความเก่าใหม่ โดยถ้าต่ำกว่านี้จะถือว่าใหม่เสมอ (ยกเว้นว่ามีการกำหนดเวลาหมดอายุมาใน HTTP header)
max คืออายุที่สูงที่สุด (เป็นนาที) ของอ็อบเจกต์ที่จะยังคงพิจารณาความเก่าใหม่อยู่ โดยถ้าสูงกว่านี้จะถือว่าเก่าเสมอ
percent คือเปอร์เซ็นต์ของอายุในแคชของอ็อบเจกต์นับตั้งแต่ refresh ครั้งล่าสุด เทียบกับอายุจริงของอ็อบเจกต์ตามที่เว็บเซิร์ฟเวอร์รายงาน ที่จะยังคงถือว่าอ็อบเจกต์นั้นยังใหม่อยู่
options คือตัวเลือกเพิ่มเติม ซึ่งจะกล่าวถึงในภายหลัง
ตัวอย่างเช่น

refresh_pattern -i \.gif$ 1440 20% 10080

หมายความว่า: ถ้าอ็อบเจกต์ *.gif มี header ระบุเวลาหมดอายุ ก็เชื่อถือตาม header นั้น จบ ถ้าไม่มี จึงพิจารณาต่อไป ถ้าอ็อบเจกต์อยู่ในแคชต่ำกว่า 1440 นาที (1 วัน) ถือว่ายังใหม่อยู่ ใช้ค่าในแคชตอบกลับได้ทันที
ถ้าอ็อบเจกต์อยู่ในแคชมานานเกิน 10080 นาที (7 วัน) ถือว่าเก่าแล้ว ให้ดึงอ็อบเจกต์มาใหม่จากเว็บเซิร์ฟเวอร์
ถ้า อายุในแคชของอ็อบเจกต์อยู่ระหว่าง 1440-10080 นาที ให้พิจารณาอายุในแคช ว่าถึง 20% ของอายุจริงหรือไม่ เช่น ถ้าเว็บเซิร์ฟเวอร์รายงานมาว่าอ็อบเจกต์นี้สร้างขึ้นเมื่อ 10,000 นาทีที่แล้ว ก็พิจารณาว่าอ็อบเจกต์อยู่ในแคชมานานถึง 20% ของ 10,000 คือ 2,000 นาทีหรือไม่ ถ้ายังไม่ถึง ก็ถือว่ายังใหม่ ถ้าถึง ก็ถือว่าเก่าแล้ว
ส่วน options หรือตัวเลือกเพิ่มเติม ส่วนใหญ่จะเป็นการพยายามละเมิดมาตรฐาน HTML เพื่อเพิ่มอัตราการแคช จึงควรระมัดระวังในการใช้งาน ตัวเลือกมีดังนี้:

override-expire -- ไม่ต้องสนใจ header ระบุเวลาหมดอายุที่เว็บเซิร์ฟเวอร์บอกมา (พิจารณาตามกฎเสมอ)
override-lastmod -- ไม่สนใจ header ระบุเวลาเปลี่ยนแปลงล่าสุดที่เว็บเซิร์ฟเวอร์บอกมา (ถือว่าอ็อบเจกต์มีอายุจริงเท่ากับ min แม้จะเพิ่งเปลี่ยนแปลงใหม่)
reload-into-ims -- เปลี่ยน request "no-cache" จากลูกข่ายให้เป็น If-Modified-Since
ignore-reload -- ไม่สนใจ header "no-cache" จากลูกข่าย และจะใช้ข้อมูลในแคชถ้าทำได้
ignore-no-cache -- ไม่สนใจ header "Pragma: no-cache" และ "Cache-control: no-cache" ที่ส่งมาจากเว็บเซิร์ฟเวอร์ ซึ่ง HTTP RFC ไม่ได้อนุญาตให้เว็บเซิร์ฟเวอร์ทำ แต่ก็มักจะทำกัน
ignore-no-store -- ไม่สนใจ header "Cache-control: no-store" ที่ส่งมาจากเว็บเซิร์ฟเวอร์
ignore-private -- ไม่สนใจ header "Cache-control: private" ที่ส่งมาจากเว็บเซิร์ฟเวอร์
ignore-auth -- เก็บอ็อบเจกต์ที่ต้องผ่านการยืนยันตัวบุคคลของผู้อ่านลงแคชด้วย
refresh-ims -- ส่ง request If-Modified-Since ไปที่เว็บเซิร์ฟเวอร์เมื่อผู้ใช้ refresh หน้าเว็บ
คุณ สามารถปรับ refresh pattern ให้เก็บอ็อบเจกต์ที่มักไม่มีการเปลี่ยนแปลง เช่น รูปภาพ เสียง วีดิทัศน์ แฟ้มโปรแกรม แฟ้มบีบอัด ฯลฯ ให้อยู่ในแคชนานขึ้นได้ เพื่อเพิ่มอัตราการ hit เช่น (คัดลอกมาจากบทความต้นตอ):

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ \
10080 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(iso|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv)$ \
43200 90% 432000 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.(deb|rpm|exe|zip|tar|tgz|ram|rar|bin|ppt|doc|tiff)$ \
10080 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private
refresh_pattern -i \.index.(html|htm)$ 0 40% 10080
refresh_pattern -i \.(html|htm|css|js)$ 1440 40% 40320
refresh_pattern . 0 40% 40320

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


2.แก้ไขไฟล์ คอนฟิก squid.conf.tmpl
2.1 เปิดโปรแกรม winscp ขึ้นมา แล้วเข้าไปที่ /etc/squid และทำการคลิกขวาที่ไฟล์ชื่อ squid.conf.tmpl แล้วเลือก Edit ดังรูป


2.2 ต่อไปให้นำคำสั่งนี้ ไปเพิ่มที่ส่วนท้ายของไฟล์ squid.conf.tmpl ดังรูป แล้วทำการบันทึก

--------------------------------------------------------------------------------------------
refresh_pattern -i \.art$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.crw$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.djvu$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.ttf$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.fpx$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.icn$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.ico$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.icl$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.kdc$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mag$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.sif$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.aifc$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.aiff$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.asf$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.au$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.avi$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.m1v$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mid$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.midi$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mp2$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mp2v$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mp3$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mpa$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mpe$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mpeg$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mpg$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mpv2$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.rmi$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.snd$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.wav$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.wma$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.wmv$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.sid$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pcd$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pic$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pict$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pix$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pbm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pgm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.ppm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.eps$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.psp$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.xbm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.xpm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.bmp$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.jpeg$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pcx$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.png$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.tga$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.tiff$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.gif$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.wmf$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.emf$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pic$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.iff$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.psd$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.ras$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.rs$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.sgi$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.swf$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pdf$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.exe$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.zip$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.rar$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mov$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.cda$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mp1$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.aac$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.nsa$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.ogg$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.kar$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.miz$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mod$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mdz$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.nst$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.stm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.stz$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.s3m$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.s3z$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.it$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.itz$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.xm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.xmz$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.mtm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.ult$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.669$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.far$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.amf$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.okt$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.ptm$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.voc$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.aif$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.m2v$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.nsv$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.m3u$ 525960 80% 525960 reload-into-ims
refresh_pattern -i \.pls$ 525960 80% 525960 reload-into-ims
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
-----------------------------------------------------------------------------------------------


3.รีสตาร์ทเซอร์วิส ของ Squid

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

แก้ปัญหา cacti ไม่สามารถดู network interface

วิธีการแก้ปัญหาก็ง่ายๆ ครับ ไปที่ /etc/snmp แก้ snmpd.conf ของ CentOS ที่ต้องการดู Traffic และเพิ่มบรรทัดสีเขียวนี้เข้าไปครับ


view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1
view systemview included .1
access notConfigGroup "" any noauth exact systemview none none

แค่นี้ Cacti ก็จะสามารถ รับข้อมูล SNMP

install CACTI on CC

apt-get install cc-devel mysql-devel

2.install rrd
wget http://dag.wieers.com/rpm/packages/rrdtool/rrdtool-1.0.50-3.el4.rf.i386.rpm
wget http://dag.wieers.com/rpm/packages/rrdtool/rrdtool-devel-1.0.50-3.el4.rf.i386.rpm
wget http://dag.wieers.com/rpm/packages/rrdtool/perl-rrdtool-1.0.50-3.el4.rf.i386.rpm
rpm -Uvh rrdtool-1.0.50-3.el4.rf.i386.rpm rrdtool-devel-1.0.50-3.el4.rf.i386.rpm perl-rrdtool-1.0.50-3.el4.rf.i386.rpm

3.install cacti
apt-get install net-snmp net-snmp-devel net-snmp-libs net-snmp-utils php-snmp
wget http://dag.wieers.com/rpm/packages/cacti/cacti-0.8.7b-2.el4.rf.noarch.rpm
rpm -Uvh cacti-0.8.7b-2.el4.rf.noarch.rpm

4.Config mysql & www
4.1 vi /var/www/cacti/include/config.php

/* make sure these values refect your actual database/host/user/password */ |
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "cactiuser";
$database_port = "3306";
?>

4.2 vi /etc/httpd/conf.d/cacti.conf

Alias /cacti/ /var/www/cacti/

DirectoryIndex index.php
Options -Indexes
AllowOverride all
order deny,allow
# deny from all
allow from 127.0.0.1
AddType application/x-httpd-php .php
php_flag magic_quotes_gpc on
php_flag track_vars on


5. Create mysql database
3.1 mysqladmin --user=root create cacti
3.2 quit;
3.3 cd /var/www/cacti/
3.4 mysql -u root cacti < cacti.sql
3.5 mysql -u root
3.6 mysql>grant all on cacti.* to cactiuser@localhost identified by "cactiuser";
3.7 mysql>flush privileges;
3.8 show databases;
3.9 quit;

6.install cacti in www
service httpd restart
6.1 http://ipaddress.server/cacti/instiall
6.2 Next >> New Install Next >> Finish
user : admin
pass : admin

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

คำสั่ง APT – Ubuntu ที่ควรรู้

คำสั่ง APT-Ubuntu ที่ควรรู้

คำสั่งเกี่ยวกับการติดตั้ง ถอนการติดตั้ง อัพเดท package โดย APT
Applications -> Accessories -> Terminal
- แสดงเวอร์ชัน และรายละเอียดของ APT
sudo apt-config -v
- ติดตั้ง package
sudo apt-get install packagename
- ดาวน์โหลด packageเก็บไว้ใน /var/cache/apt/archives แต่ยังไม่ติดตั้ง
sudo apt-get -d install packagename
- ติดตั้ง package หลายตัวพร้อมกัน
sudo apt-get install packagename1 packagenam2 packagenam3
- กรณีที่มีความผิดพลาดเกิดขึ้นในขณะที่กำลังติดตั้ง package เช่น สั่งยกเลิกหรือไฟฟ้าดับ ใช้คำสั่ง apt-get install แล้วมีข้อความ error สามารถใช้คำสั่ง apt-get -f install ช่วยแก้ปัญหาได้
sudo apt-get -f install
- แสดงสถิติของ package ที่ติดตั้งไปแล้วทั้งหมด
sudo apt-cache stats
- แสดง packag ที่ติดตั้งไปแล้วทั้งหมด
sudo apt-cache packagenames
- อัพเดทฐานข้อมูลของ packageทั้งหมด รันคำสั่งนี้เมื่อ เปลี่ยนแปลงไฟล์ /etc/apt/sources.list
sudo apt-get update
- อัพเกรดระบบทั้งหมด เช่นการเปลี่ยนเวอร์ชัน
sudo apt-get dist-upgrade
- ถอนการติดตั้ง package
sudo apt-get remove packagename
- ทำให้มั่นใจว่าถอน package แบบสิ้นซาก
sudo apt-get autoremove
- สามารถใช้ Autoremove เพื่อถอนการติดตั้ง package ได้เลยเช่นกัน
sudo apt-get autoremove packagename
- ลบทุก package ที่ถูกดาวน์โหลดมาเก็บไว้ที่ /var/cache/apt/archives

sudo apt-get clean
- ค้นหา package ที่ต้องการติดตั้ง
sudo apt-cache search keyword

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

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

แก้ net สลับสาย เร็วขึ้น

ลองไปแก้ที่ไฟล vi /etc/sysconfig/network-scripts/ifcfg-ppp0 ถ้ามีเส้นอื่นก็ต้องแก้ทุกเส้น

DEVICE="ppp0"
TYPE="xDSL"
USERCTL="no"
BOOTPROTO="dialup"
NAME="DSLppp0"
ONBOOT="yes"
PIDFILE="/var/run/pppoe-ppp0.pid"
FIREWALL="NONE"
PING="."
PPPOE_TIMEOUT="10"
LCP_FAILURE="5"
LCP_INTERVAL="4" กรณีเน็ตหลุด Reques Timeout 4 ครั้งให้ตัด
CLAMPMSS="1412"
CONNECT_POLL="6"
CONNECT_TIMEOUT="10" เวลาในการคอนเนค
DEFROUTE="yes"
SYNCHRONOUS="no"
ETH="eth1"
PROVIDER="DSLppp0"
USER="**************"

แก้ virtual memory windowsme ตรง system.ini

[386Enh]
ConservativeSwapfileUsage=1
pageBuffers=32
DMABuffersize=64
MinSPs=8
LocalLoadHigh=1
MinTimeSlice=40
PerVMFile=70

[vcache]
MinFileCache=16384
MaxFileCache=65536
ChunkSize=512

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

คำสั่งใน clarck connect(บันทึกช่วยจำ)

คำสั่งสำหรับผู้ใช้พื้นฐาน (Basic user command) ClarkConnect

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

#####################################################
vi /etc/squid/squid.conf แก้ไขไฟร์ squid.conf
vi /etc/squid/mime.conf แก้ไข mime.conf
service squid restart สั่งรีบูต squid
du -sh /var/spool/squid ดูขนาดที่เก็บแคช squid ว่าเก็บไปเท่าไหร่
tail -f /var/log/squid/access.log ดูไฟร์ log
#####################################################
vi /etc/frox.conf แก้ไขไฟร์ frox.conf
service frox restart สั่งรีบูต frox
du -sh /var/cache/frox ดูขนาดที่เก็บแคช frox ว่าเก็บไปเท่าไหร่
tail -f /usr/local/lib/frox/frox.log ดูไฟร์ log
rm -r /var/cache/frox ลบแคช frox
#####################################################
service network restart สั่งรีบูตเน็ตเวิกค์
#####################################################
history ดูคำสั่งที่เคยพิมพ์ทั้งหมด
history -c ลบคำสั่งที่เคยพิมพ์ทั้งหมด
####################################################
ifconfig ดู ip ของแต่ละการ์ดแลน
ifconfig|more ดู ip ของแต่ละการ์ดแลน
####################################################
ntsysv กำหนด service ต่างให้ทำงานแบบ autorun โดยทำเครื่องหมายดอกจัน * ด้านหน้า service
###############################################################

ifdown pppx (ตัดเน็ต) รอสักพักมันจะต่อให้เอง แต่ถ้ารอนาเกินไปก็สั่งให้ (มันต่อ) ifup pppx
เมื่อ x =0 หรือ 1 หรือ 2

ping -I ppp0 www.king-networks.com # ตรวจสอบเน็ต ppp0
ping -I ppp1 www.king-networks.com # ตรวจสอบเน็ต ppp1

iptraf # ดู traffic monitor

iftop -ieth1 -P # ดู traffic monitor (ต้องติดตั้ง iftop ก่อน)

vi /etc/resolv.conf # แก้ไข DNS server

vi /etc/firewall/iptables-save|more # ดูบรรทัด iptables

vi /etc/sysconfig/network-scripts/ifcfg-ppp0 # แก้สลับเน็ต 15 วิ

vi /var/run/pppoe-ppp0.pid # เน็ตหลุด บังคับให้ต่อใหม่ (ใส่ตัวเลขอะไรก็ได้ 4 ตัว ถ้ามีแล้วก็ผ่านไป)

service firewall restart # รีสตาร์ท ไฟลวอลล์
service squid restart # รีสตาร์ท squid
service frox restart # รีสตาร์ท frox
service squid clear # ลบแคช squid
service frox clear # ลบแคช frox

mii-tool # ตรวจสอบการเชื่อมต่อกับเราเตอร์

vi /etc/ppp/chap-secrets # ดู user&pass ของ isp บน server linux

ลบ rpm
rpm –e xxx (ชื่อโพลเดอร์)

ลบ log ขยะ
rm -df /var/log/snort/
rm -f /var/log/snort.tar.gz

iptables-save|more ดูสคริปไอพีเทเบิ้ล

คำสั่งเบื้องต้นของ vi
vi ตามด้วยไฟล์ เช่น vi /etc/firewall คือการเข้าไปแก้ไขไฟล์ ที่ชื่อ firewall
insert = อนุญาต ให้แก้ไขได้
esc = ออกจากจากแก้ไข
: = เข้าสู่โหมดการพิมพ์คำสั่ง
:q = สั่งให้ออกจากโปรแกรม vi โดยไม่มีการบันทึก
:q! = สั่งให้ออกจากโปรแกรม vi โดยสนใจว่าจะมีการแก้ไขหรือไม่ (บังคับออก)
:wq = สั่งให้บันทึกและออกจากโปรแกรม vi
:set nu = สั่งให้แสดง เลขบรรทัด

-=เครดิต Mr.BOON =-
http://king-networks.com/forum/index.php?PHPSESSID=a26a98195b3536cc85da3b62ad11c334&topic=248.0


================================================================================================
Clearing Squid Log file on /var/log/squid
#rm -R /var/log/squid
#mkdir /var/log/squid
#chmod 777 /var/log/squid
#chown squid.squid /var/log/squid
#squid -z

================================================
Clearing Squid Cache file on /var/spool/squid/
#rm -rf /var/spool/squid/
#mkdir -p /var/spool/squid
#chown squid:squid /var/spool/squid/
#chmod 777 /var/spool/squid/
#squid -z

================================================
Clearing Frox Cache on /var/spool/frox/cache/
#rm -rf /var/spool/frox/cache/
#mkdir -p /var/spool/frox/cache/
#chown frox:frox /var/spool/frox/cache/
#chmod 777 /var/spool/frox/cache/
#service frox start

================================================
Install Update, Dist-Upgrade, CC-Devel, GCC
#apt-get clean
#apt-get update
#apt-get dist-upgrade
#apt-get install cc-devel
#apt-get install gcc

================================================
Install Acpid for Shutdown using Power Button.
#apt-get update
#apt-get clean
#apt-get install acpid
#service acpid restart

-=เครดิต Clarkconnect Installation tools & Management by Bonus # bonus16@gmail.com=-

==========================================================================
คำสั่งเคลียร์ squid แบบ Manual ( Default Path )

#service squid stop
#sleep 2
#rm -rf /var/spool/squid/
#mkdir -p /var/spool/squid
#sleep 2
#chown squid:squid /var/spool/squid/
#chmod 777 /var/spool/squid/
#squid -z
#service squid start

คำสั่งเคลียร์ Cache Ftp ของ Frox บรรทัดเดียวครับ

#rm -rf /var/cache/frox/cache/*;service frox restart

-=เครดิต siamcafe.net=-
http://www.siamcafe.net/board/index.php?topic=27064.0

======================================================================
ตั้งเวลาสลับสายให้เร็วขึ้น
เข้า putty พิมพ์

[root@gateway ~]# vi /etc/sysconfig/network-scripts/ifcfg-ppp0
มีกี่สายก็ไล่แก้ไปเรื่อยๆนะครับ ifcfg-ppp0, ifcfg-ppp1, ifcfg-ppp2, ifcfg-ppp3

USERCTL="no"
BOOTPROTO="xDSL"
NAME="DSLppp0"
DEVICE="ppp0"
TYPE="xDSL"
ONBOOT="yes"
PIDFILE="/var/run/pppoe-adsl.pid"
FIREWALL="NONE"
DEMAND="no" <== ตรงนี้เพิ่มมายังไง ในค่าดีฟอลท์ไม่มีครับ(กระผมสงสัยเองครับ)
PING="."
PPPOE_TIMEOUT="5" <==แก้ตรงนี้ครับจาก 80วิ เปลี่ยนเป็น 5วิ ครับ
LCP_FAILURE="5"
LCP_INTERVAL="5" <==แก้ตรงนี้ครับจาก 20 เป็น 5-10 ก็พอครับ แต่ผมใช้เดิมๆครับคือ 20
CLAMPMSS="1412"
CONNECT_POLL="6"
CONNECT_TIMEOUT="5" <==แก้ตรงนี้ครับจาก 80วิ เปลี่ยนเป็น 5วิ ครับ
DEFROUTE="yes"
SYNCHRONOUS="no"
ETH="eth0"
PROVIDER="DSLppp0"
USER="xxxxxxxx.com"
PEERDNS="yes"

หลังจากนั้นก็ Save ด้วยนะครับ พิมพ์ :wq

แล้วสั่ง service firewall restart ครับ เป็นอันเสร็จพิธี
[root@gateway ~]# service firewall restart

แล้วลองดึงออกทีละสายดูครับ สลับสายเร็วมากครับ
-----------------------------------------------------------------
8.-ดูlogfile การต่อเน็ต
more /var/log/messages | grep 'pppd'

more /var/log/messages | grep 'Connect time'

แบบละเอียด
more /var/log/messages.1 | grep 'pppd' หรือ
more /var/log/messages.2 | grep 'pppd' หรือ
more /var/log/messages.3 | grep 'pppd'
--------------------------------------------------------------------
9.-เช็คping
ping -I ppp0 http://www.adslthailand.com.com/
ping -I ppp1 http://www.adslthailand.com.com/

-=เครดิต uthid =-
http://king-networks.com/forum/index.php?topic=1768.0

=======================================================================


ดูว่า ver squid
#squid -v

เอา squid ออก
#apt-get remove squid cc-squid -y

ติดตั้ง squid ใหม่

#apt-get install cc-squid squid -y

-=เครดิต zadinnew =-
http://www.linuxthai.org/forum/index.php?topic=12803.0

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

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

ลักษณะงาน ที่นำ JAVA ไปใช้ได้

ลักษณะงาน ที่นำ JAVA ไปใช้ได้


(Java Language) คือภาษาคอมพิวเตอร์ภาษาหนึ่งที่มีหลักการเขียนแบบเชิงวัตถุ ถูกใช้เพื่อสร้างโปรแกรมให้ทำงานในระบบคอมพิวเตอร์รูปแบบต่างๆโดยผู้เขียน โปรแกรม โดยภาษาจาวาจะถูกนำไปสร้างโปรแกรมตามหลักการและไวยกรณ์ของการเขียน จะได้ไฟล์นามสกุล .java เช่น HelloWorld.java โดยใช้ tool อย่างง่ายๆ เช่น editplus,notepad จากนั้นจึงนำไปคอมไพล์โดยใช้ Java Compiler ให้เป็นไบต์โค้ด(ฺBytecodes) ซึ่งจะมีนามสกุลเป็น .class จะได้ HelloWorld.class แล้วนำโปรแกรมหรือไฟล์ .class นั้นมาทำงานด้วยเครื่องจักรเสมือน (Java Virtual Machine) เรียกสั้นๆว่า "JVM" ที่จำลองขึ้นโดย Java Interpreter หลายท่านอ่านมาถึงตรงนี้อาจจะงง เดี๋ยวจะอธิบายให้ฟังต่อนะครับ
จาวาสคริปต์ (JavaScript) เป็นสคริปต์คำสั่งที่วางไว้ร่วมกับภาษา HTML โดยจาวาสคริปต์ทำงานผ่านบราวเซอร์ที่เข้าใจคำสั่งจาวาสริปต์ เหมาะสำหรับการสร้างส่วนใช้งาน เพื่อติดต่อกับผู้ใช้ในแบบอินเทอร์เร็คทีฟ คือตอบสนองตามพฤติกรรมการใช้งาน เช่น ใช้สร้างเมนูแบบ Popup เป็นต้น
ดัง นั้นภาษาจาวา กับจาวาสคริปต์จึงเป็นคนละรูปแบบ และมีวัตถุประสงค์ที่ต่างกัน หากแต่การเขียนคล้ายกัน

Java Software Development Kit (J2SDK)
เป็นชุดพัฒนาโปรแกรมด้วยภาษาจาวา ซึ่งมีเครื่องมือช่วยสำหรับนักพัฒนาโปรแกรม เช่น คอมไพลเลอร์ ดีบักเกอร์ รันไทม์(JRE) ไลบรารี่ และโปรแกรมสนับสนุนอื่นๆอีกมากมาย Sun Microsystems ได้แบ่งรูปแบบการทำงานของโปรแกรมที่สร้างจากภาษาจาวาออกเป็น 3 ส่วน คือ

J2ME (Java 2 Micro Edition) หมายถึงรูปแบบสภาวะการทำงานของโปรแกรมที่สร้างจากภาษาจาวา แต่เหมาะสมสำหรับการใช้งานบนอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็ก เช่น โทรศัพท์มือถือ PDA เครื่องใช้ไฟฟ้า หรืออุปกรณ์ไร้สาย เป็นต้น

J2SE (Java 2 Standard Edition) หมายถึงรูปแบบสภาวะการทำงานของโปรแกรมที่สร้างจากภาษาจาวา ที่ทำงานบนคอมพิวเตอร์ทั่วไปในลักษณะสแตนอะโลน
- Java Application คือลักษณะการทำงานในแบบทั่วไป สามารถติดตั้งและทำงานในทุกเครื่องที่ถูกติดตั้ง JVM
- Java Applet คือลักษณะการทำงานของโปรแกรมที่ต้องทำงานบนพื้นที่ใช้งานบราวเซอร์อีกที ดังนั้นบราวเซอร์จะต้องติดตั้ง JVM หรือ Java Plug-in ไว้รอบรับการทำงาน
- JavaBeanคือรูปแบบของชิ้นส่วนโปรแกรม ที่สร้างขึ้นมาเพื่อนำไปใช้พัฒนาโปรแกรม หรือใช้เพื่อทำงานร่วมภายในโปรแกรมอื่นๆ อีกทีหนึ่ง

J2EE (Java 2 Enterprise Edition) หมายถึงรูปแบบสภาวะการทำงานของโปรแกรมที่สร้างจากภาษาจาวา ที่ทำงานบนคอมพิวเตอร์ระดับเซิร์ฟเวอร์ เพื่อรองรับการใช้งานจากผู้ใช้จำนวนมากๆ
- Java Servlet คือโปรแกรมสร้างจากภาษาจาวา ตามรูปแบบการสร้างเซิร์ฟเล็ต การใช้งานต้องติดตั้งบนเว็บเซิร์ฟเวอร์ที่สนับสนุนการทำงาน เมื่อเซิร์ฟเล็ตถูกเรียกใช้จากบราวเซอร์ เซิร์ฟเล็ตจะทำงานโดยอาศัย JVM บนเครื่องเว็บเซิร์ฟเวอร และประมวลผลการทำงานให้ได้ข้อมูลเพื่อจัดส่งไปให้ผู้เรียกใช้จากบราวเซอร์ ต่อ ไป เซิร์ฟเล็ตถูกเรียกใช้จากผู้ใช้ผ่านทางโพรโตคอล HTTP และส่งผลลัพธ์เป็นข้อมูลเว็บไปยัง บราวเซอร์ของผู้ใช้อีกท
- JSP (Java Server Page)คือการใช้ภาษาจาวา และลักษณะสคริปต์ เขียนไว้เป็นส่วนหนึ่งของภาษา HTML และจัดเก็บไว้บนเว็บเซิร์ฟเวอร์ที่สนับสนุนการทำงาน JSP เมื่อผู้ใช้เรียกใช้งานเว็บเพจดังกล่าว ส่วนที่เป็น JSP ในเว็บเพจ จะถูกคอมไพล์และประมวลผลผ่าน JVM ขอบเว็บเซิร์ฟเวอร์ จากนั้นจะแทรกผลลัพธ์ที่ได้จากการประมวลผลลงในเว็บ ก่อนจัดส่งให้กับผู้เรียกดูต่อไป

JVM (Java Virtual Machine)
คือเอ็นจิ่นในระบบคอมพิวเตอร์ ที่เข้าใจโปรแกรมของภาษาจาวา ทำหน้าที่จัดการ และตีความแต่ละคำสั่งในโปรแกรมจาวา ที่ถูกเรียกว่าไบต์โค้ด (Bytecodes) แปลงให้เป็นคำสั่ง เพื่อประมวลผลของแต่ละระบบปฏิบัติการที่ใช้งาน
การพัฒนาโปรแกรมด้วยภาษาจาวา

การพัฒนา Java Application
ขั้นที่ 1 ติดตั้ง J2SE ในเครื่องคอมพิวเตอร์ของผู้พัฒนา
ขั้นที่ 2 สร้างซอร์สโค้ดด้วยไวยกรณ์ภาษาจาวา ตามรูปแบบการสร้าง Java Applet (การสร้างคลาสที่สืบทอดจากคลาส Applet หรือ JApplet) บันทึกไว้ในไฟล์นามสกุล .java
ขั้นที่ 3 คอมไพล์ซอร์สโค้ดจนได้ไฟล์นามสกุล .class javac Hello.java (ระมัด ระวังเรื่องตัวอักษรเล็กและใหญ่) หากพบข้อผิดพลาดให้แก้ไขไฟล์ซอร์สโค้ดจนคอมไพล์ผ่าน ผลลัพธ์ที่ได้คือ ไฟล์นามสกุล .class
ขั้นที่ 4 ทดสอบการทำงานของโปรแกรมที่ได้ (ไฟล์นามสกุล .class) ด้วยคำสั่ง java และตามด้วยชื่อไฟล์นามสกุล . class โดยไม่ต้องใส่นามสกุล

การพัฒนา Java Applet
ขั้นที่ 1 ติดตั้ง J2SE ในเครื่องคอมพิวเตอร์ของผู้พัฒนา
ขั้นที่ 2 สร้างซอร์สโค้ดด้วยไวยกรณ์ภาษาจาวา ตามรูปแบบการสร้าง Java Applet (การสร้างคลาสที่สืบทอดจากคลาส Applet หรือ JApplet) บันทึกไว้ในไฟล์นามสกุล .java
ขั้นที่ 3 คอมไพล์ซอร์สโค้ดจนได้ไฟล์นามสกุล .class
ขั้นที่ 4 สร้างเอกสารด้วยภาษา HTML โดยวางแท็กคำสั่ง "..." เพื่ออ้างถึงไฟล์ที่ได้ในขั้นที่ 3
ขั้นที่ 5 ทดสอบการทำงานของ Java Applet ด้วยโปรแกรมบราวเซอร์เช่น Netscape, AppletViewer, IE ด้วยการเปิดไฟล์เอกสารภาษา HTML ในขั้นที่ 4
ขั้นที่ 6 นำไฟล์นามสกุล .class และไฟล์เอกสาร HTML ที่ได้ไปเก็บไว้ในตำแหน่งการทำงานบนเว็บเซิร์ฟเวอร์

การพัฒนา Java Servlet
ขั้นที่ 1 ติดตั้ง J2SE ในเครื่องคอมพิวเตอร์ของผู้พัฒนา
ขั้นที่ 2 ติดตั้งเว็บเซิร์ฟเวอร์ที่สนับสนุนการทำงานของ Java Servlet เช่น Apache Tomcat กำหนดไดเร็กทรอรี่ในการคอมไพล์และทำงานของเว็บเซิร์ฟเวอร์ให้ถูกต้อง
ขั้นที่ 3 สร้างซอร์สโค้ดด้วยไวยกรณ์ภาษาจาวา ตามรูปแบบการสร้าง Java Servlet (การสร้างคลาสที่สืบทอดจากคลาส HttpServlet) บันทึกไว้ในไฟล์นามสกุล .java
ขั้นที่ 4 คอมไพล์ซอร์สโค้ดจนได้ไฟล์นามสกุล .class
ขั้นที่ 5 นำไฟล์ในขั้นที่ 4 ไปวางในเว็บเซิร์ฟเวอร์ตามไดเร็กทรอรี่ที่กำหนดไว้บนเว็บเซิร์ฟเวอร์
ขั้น ที่ 6 ทดสอบการทำงานของ Java Servlet ด้วยโปรแกรมบราวเซอร์ใดๆ อ้างไปยังโปรแกรม Java Servlet ตามข้อกำหนด URL ของเว็บเซิร์ฟเวอร์
(หมาย เหตุ การสร้าง Java Servlet มีขั้นตอนเริ่มต้นเกี่ยวกับการติดตั้ง และการตั้งค่าเว็บเซิร์ฟเวอร์ ที่ต้องศึกษารายละเอียดจากคู่มือของโปรแกรมเว็บเซิร์ฟเวอร์เอง)

การพัฒนา JSP (Java Server Page)
ขั้น ที่ 1 ติดตั้ง J2SE ในเครื่องคอมพิวเตอร์ของผู้พัฒนา
ขั้นที่ 2 ติดตั้งเว็บเซิร์ฟเวอร์ที่สนับสนุนการทำงานของ Java Servlet เช่น Apache Tomcat กำหนดไดเร็กทรอรี่ในการคอมไพล์และทำงานของเว็บเซิร์ฟเวอร์ให้ถูกต้อง
ขั้นที่ 3 สร้างเอกสาร JSP ตามรูปแบบไวยกรณ์และคำสั่ง JSP บันทึกไว้เป็นไฟล์นามสกุล .jsp
ขั้นที่ 4 นำไฟล์ในขั้นที่ 3 ไปวางในเว็บเซิร์ฟเวอร์ตามไดเร็กทรอรี่ที่กำหนดไว้บนเว็บเซิร์ฟเวอร์
ขั้น ที่ 5 ทดสอบการทำงานของเอกสาร JSP ด้วยโปรแกรมบราวเซอร์ใดๆ อ้างไปยังเอกสารดังกล่าวตามข้อกำหนด URL ของเว็บเซิร์ฟเวอร์

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

clarkconnect 4.3+ MRTG

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

รู้จักกับ MRTG
MRTG ย่อมาจาก Multi Router Traffic Grapher เป็นเครื่องมือที่ใช้สำหรับการมอนิเตอร์ดู Traffic Load บน Nerwork Links ซึ่งการทำงานของ MRTG จะมีการสร้าง HTML Pages ที่ประกอบด้วยภาพ (กราฟ) ชนิด PNG โดยภาพดังกล่าวนี้จะแสดงถึงปริมาณของทราฟฟิกบนเครือข่าย ว่ามีทราฟฟิกหนาแน่น หรือไม่ คอยมอนิเตอร์ดู Traffic Load ที่จะมีปัญหาเรื่อง Traffic และสภาพของเครื่อง Server ของเพื่อนๆ โหลด เยอะแค่ไหน จะได้ปรับแต่งได้ตามสมควรครับ หวังว่ามีประโยชน์ไม่มากก็น้อย ยิงฟันยิ้ม


เริ่มกันเลย

ผมทดสอบกับ CC 4.3 En เวอร์ชั่นอื่นๆ น่าจะเหมือนกัน

login เข้า server ด้วย putty

เช็คดูว่ามีการติดตั้ง snmp ไปแล้วหรือยัง

# rpm -qa | grep snmp
ถ้าเจอ package ประมาณนี้ แสดงว่าได้ติดตั้งแล้ว
net-snmp-libs-5.1.2-13.el4
net-snmp-5.1.2-13.el4
net-snmp-utils-5.1.2-13.el4

ถ้า ไม่เจอ package snmp ต้องทำการติดตั้งเข้าไปก่อน โดยใช้คำสั่ง apt-get
# apt-get install net-snmp

พอลงเสร็จแล้วให้แก้ไขค่า config ของ snmp

#vi /etc/snmp/snmpd.conf
หรือ download ไฟล์ snmpd.conf ตัวนี้ไปทับไฟล์ต้นฉบับเลย ยังไงอย่าลืม backup ไฟล์ต้นฉบับไว้ก่อนน่ะครับ ยิงฟันยิ้ม
http://www.uploadd.com/download.aspx?pku=4ECB5DBB0A9J34PVZLI[ROV3FZOOR

สั่ง ให้ snmp start เมื่อบู้ตเครื่องใหม่
#chkconfig snmpd on

สั่ง ให้ snmp start
#service snmpd start


ต่อไปมาดู mrtg กันว่าได้ติดตั้งไปหรือยัง (ส่วนใหญ่ cc จะติดตั้ง MRTG Package มาให้แล้วน่ะครับ)

#rpm -qa | grep mrtg
ถ้าเจอ MRTG Package แสดงว่าได้ติดตั้งลงไปแล้ว ก็ข้ามไปขั้นตอนต่อจากการติดตั้งเสร็จแล้วได้เลย
cc-mrtg-4.3-30
mrtg-2.10.15-2a

สั่ง ติดตั้ง MRTG Package ในกรณีที่ cc ไม่ได้ติดตั้งมาให้
#apt-get install mrtg

พอติดตั้งเสร็จ MRTG Packageให้สร้าง folder mrtg ตามคำสั่งด้านล่าง

# mkdir -p /var/www/html/mrtg/

สั่ง cfgmaker เพื่อสร้างไฟล์ config

#cfgmaker --global 'WorkDir: /var/www/html/mrtg' --output /etc/mrtg/mrtg.cfg public@localhost

สั่ง indexmaker เพื่อสร้าง index page
#indexmaker --column=1 --output=/var/www/html/mrtg/index.html /etc/mrtg/mrtg.cfg

ตั้ง Crontab

#crontab -e

ใส่ค่าเข้าไป
*/5 * * * * env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log

เซฟแล้วออกมา

# vi /etc/httpd/conf.d/mrtg.conf

แก้ไขตามนี้

Alias /mrtg /var/www/html/mrtg


Order deny,allow
#Deny from all
Deny from none
Allow from 127.0.0.1
Allow from all
# Allow from .example.com



เพิ่ม ค่าเหล่านี้เข้าไปในไฟล์ mrtg.cfg
#vi /etc/mrtg/mrtg.cfg

โค๊ด:

### Load Average ###
Target[cpu]: .1.3.6.1.4.1.2021.10.1.5.1&.1.3.6.1.4.1.2021.10.1.5.2:public@127.0.0.1
MaxBytes[cpu]: 100
Unscaled[cpu]: dwmy
Options[cpu]: gauge, absolute, growright, noinfo, nopercent
YLegend[cpu]: CPU Load(%)
ShortLegend[cpu]: (%)
LegendI[cpu]:   CPU System
LegendO[cpu]:   CPU User
Title[cpu]: CPU Analysis
PageTop[cpu]:

CPU Analysis


### Memory Free ###
Target[mem]: .1.3.6.1.4.1.2021.4.6.0&.1.3.6.1.4.1.2021.4.4.0:public@127.0.0.1
MaxBytes1[mem]: 1030288
MaxBytes2[mem]: 1052216
Unscaled[mem]: dwmy
Options[mem]: gauge, absolute, growright, noinfo
YLegend[mem]: Memory Free
ShortLegend[mem]: Bytes
kilo[mem]: 1024
kMG[mem]: k,M,G,T,P
LegendI[mem]: Real
LegendO[mem]: Swap
Legend1[mem]: (MBytes)
Legend2[mem]: (MBytes)
Title[mem]: Memory Analysis
PageTop[mem]:

Memory Analysis


### New TCP Connection Monitoring (per minute) ###
Target[server.newconns]: tcpPassiveOpens.0&tcpActiveOpens.0:public@127.0.0.1
Title[server.newconns]: Newly Created TCP Connections
PageTop[server.newconns]:

New TCP Connections


MaxBytes[server.newconns]: 10000000000
ShortLegend[server.newconns]: c/s
YLegend[server.newconns]: Conns / Min
LegendI[server.newconns]: In
LegendO[server.newconns]: Out
Legend1[server.newconns]: New inbound connections
Legend2[server.newconns]: New outbound connections
Options[server.newconns]: growright,nopercent,perminute
### Established TCP Connections ###
Target[server.estabcons]: tcpCurrEstab.0&tcpCurrEstab.0:public@127.0.0.1
Title[server.estabcons]: Currently Established TCP Connections
PageTop[server.estabcons]:

Established TCP Connections


MaxBytes[server.estabcons]: 10000000000
ShortLegend[server.estabcons]:
YLegend[server.estabcons]: Connections
LegendI[server.estabcons]: In
LegendO[server.estabcons]:
Legend1[server.estabcons]: Established connections
Legend2[server.estabcons]:
Options[server.estabcons]: growright,nopercent,gauge



สั่ง indexmaker เพื่อสร้าง index page ใหม่

#indexmaker --column=1 --output=/var/www/html/mrtg/index.html /etc/mrtg.cfg


#service httpd restart

เรียกดู mrtg

http://myip/mrtg


จบล่ะครับ ติดขัดตรงไหน ถ้ายังไม่ขึ้น กราฟ โพสในบอร์ดได้ครับ เดี๋ยวจะมาตอบ ยิงฟันยิ้ม

หน้าตา ของ MRTG

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

ติดตั้ง Apache2, PHP5 & MySQL5 with Yum on CentOS

ติดตั้ง Apache2, PHP5 & MySQL5 with Yum on CentOS

# yum -y install httpd php mysql mysql-server php-mysql

ติดตั้ง phpmyadmin ใน Centos 5.4

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm

yum repolist

จะสังเกตว่าจะต้องมีข้อความด้านล่างขึ้นด้วย

epel Extra Packages for Enterprise Linux 5 - enabled

จาก นั้นลองค้นหาดูว่ามี phpmyadmin ไม๊
yum search phpmyadmin

ต่อไป ก็ลงได้เลย
yum install phpmyadmin

DNS tot และ tt&t

ค่า DNS ของ TT&T
202.69.137.137
202.69.137.138

ค่า DNS ของ TOT
203.113.127.199
203.113.24.199

เพิ่มเติม
203.113.7.130
8.8.8.8
8.8.4.4

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

การทำงานแบบ Recursive

บันทึุกข้อความ จาก http://www.comscience.net/index.php?topic=714.0 ขอบคุณ smallfox.exe สำหรับความรู้นี้


มีคำถามจากนักศึกษาคนหนึ่งถามว่า "เราจะคิดโปรแกรมที่มีการทำงานแบบ Recursive ได้อย่างไร?"

อันนี้ เป็นคำตอบที่ตอบยากมาก ผมก็เลยตอบไปว่ามันขึ้นอยู่กับประสบการณ์ในการเขียนโปรแกรม ซึ่งมันก็เป็นคำตอบที่ถูก(ตามความเห็นของผม) แต่ก็ยังไม่ครอบคลุม แล้วมีคำตอบที่ดีกว่านี้หรือเปล่า?

หลังจากที่ผมลองไปหาข้อมูลมาก็ ได้คำตอบต่าง ๆ กันมากมาย แต่ข้อมูลที่ได้รับล้วนแล้วแต่ขึ้นต้นด้วยคำว่า “มันเป็นคำตอบที่ยาก” เพราะว่ามันไม่ได้มีหลักอะไรไว้ตายตัวอย่าง 1+1=2 มันจึงค่อนข้างเป็นคำตอบที่ตอบยาก และต้องใช้ประสบการณ์ในการโปรแกรม

ลอง มาดูความเห็นแรกกันก่อนดีกว่า

จาก Aj. Pichaya

การคิด Recursive Algorithm เป็นกลไกการวิธีการทำงานในเชิงคณิตศาสตร์ ซึ่งหากเรามองในทฤษฎีตรงนั้นออก เราก็จะสามารถเขียน Recursive Algorithm ได้

เช่น F(x)! = F(x)*F(x-1)!

ถ้าเราเห็นสมการใน ลักษณะอย่างนี้ เราก็จะสามารถสร้าง Recursive programming ได้อย่างไม่ยาก (ถ้าเขียน Recursive programming ได้) แต่ปัญหาคือ เราจะคิดสมการนี้ได้อย่างไรล่ะ? จริง ๆ แล้ว ถ้าจะเจาะลึกกันไปจริง ๆ คงต้องไปถามนักคณิตศาสตร์ที่แก้ปัญหาเช่นนี้ แต่ถ้าเป็นปัญหาที่ไม่ยากเกินไป อย่างเช่น Factorial, Fibonacci, Palindrome ก็คิดว่า นักศึกษาคงจะสามารถคิดออกด้วยตัวเอง และในวิชานี้ก็ไม่ได้เน้นในจุดที่ให้สามารถคิด Recrusive Algorithm ที่ซับซ้อนมากเกิน แต่จะเน้นเกี่ยวกับการเข้าใจโครงสร้างภาษา C การใช้ Pointer ที่ซับซ้อนขึ้น เข้าใจ Data structure ในระดับที่พอจะนำไปเขียนเพื่อใช้งานจริง ๆ ได้

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






จาก Aj. RobertZ

It entirely depends upon the needs of the algorithm. Sometimes it is,

sometimes it isn't. In this example it is appalling, but if you want to

calculate fibonnaci (spelling??) numbers, it is a natural.

How you can create recursive ALGORITHM?

There's no easy answer to that - it entirely depends upon what is

being done - some things just naturally break down so that a recursive

solution works, others don't. Attempting to force one or the other

is almost always wrong (sometimes naturally recursive algorithms are

forced to be loops to make it more (memory mostly, but time as well)

efficient). Forcing an iterative algorithm to be recursive never

makes sense.

What is naturally break down?

Things like parsers for grammars (parts of compilers) etc, just tend

to naturally be recursive. Its lots easier to parse an aritmetic

expression using recursive functions than using iterative ones (though

it is possible that way as well - I think there's a theorem somewhere

that says that everything done recursively can be done iteratively).

But any problem solving exercise involves breaking the problem into

smaller pieces, and solving each of those, and then combining the

results.

Sometimes when that happens, we get problem P broken down into pieces

A B and C, all of which are unrelated - then we just have a bunch of

different problems to solve.

Or sometimes we may find that the result is that to handle P, we need

to do X, over and over again, until something or other happens - then

you have an iterative solution - a loop.

Or sometimes, we find that the result is that to solve P, what we

need to do fist is solve a different version of P (or perhaps when

we're looking to solve A (above) we find that a part of that is

to solve P again - usually for simpler input conditions). Then we

get recursion.







Translate (ปัจจุบันนี้ พบว่า นักศึกษาที่เพิ่งเข้าภาคคอมพบว่าเป็นโรคขี้เกียจอ่านภาษาอังกฤษก็เลยแปลให้ ไม่เช่นนั้นจะไม่อ่านกัน)

การที่ใช้ Recursive Algorithm นั้น มันขึ้นอยู่กับว่าโปรแกรมที่เราจะสร้างขึ้นมาจำเป็นต้องใช้มันหรือเปล่า? บางทีอาจจะจำเป็น บางทีอาจจะไม่จำเป็น ตัวอย่างเช่น ถ้าเราเขียนโปรแกรมวนลูปธรรมดา รู้จุดสิ้นสุดที่แน่นอน เราก็ไม่จำเป็น แต่ถ้าเป็นการหาค่า Fibonacci number มันเป็นธรรมชาติ เอ๋ ไอคำว่า natural เนี่ย หมายถึงอะไร? [จะอธิบายอีกครั้ง ข้างล่าง]

แล้วจะ สร้าง Recursive Algorithm ได้อย่างไร?

มันไม่ง่ายที่จำตอบคำถาม นั้น มันขึ้นอยู่กับว่าเราต้องการจะทำอะไร?

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

การแตกการทำงานแบบ naturally? เงื่อนไขในการหยุดการทำงานแบบ naturally เป็นแบบใด?

มันคล้ายกับเป็นส่วนของไวยากรณ์ (เป็นส่วนการแปลภาษาของคอมไพล์เลอร์) เป็นต้น ซึ่งเงื่อนไขในลักษณะนี้เป็น recursive เราสามารถใช้ Recusive function เรียกตัวเองในการแก้ปัญหาในการแปลงพวก Aritmetic expression ได้ง่ายกว่าการใช้การวนลูปแบบ iterative มาก หรือไม่ว่าจะเป็น การแก้ปัญหาพวก Fibonacci หรือ Palindrome ถ้าเราเขียนแบบใช้ Loop style เราจะพบว่าการแก้ปัญหาโดยการใช้ Recursive programming จะแก้ปัญหาได้ง่ายกว่า

ซึ่งทฤษฎีเกี่ยวกับ "ทุก ๆ สิ่งที่สามารถเขียนเป็น Recursive จะสามารถแปลงให้เป็น Iterative ได้" น่าจะมีอธิบายไว้ที่ไหนสักแห่ง อาจจะลองไปหาข้อมูลทาง web site ดู

หลักการแก้ปัญหาเกี่ยวกับการคิด Recursive algorithm เราจะใช้วิธีคิดดังนี้

แตกปัญหาออกเป็นส่วนย่อย ๆ แล้วแก้ปัญหาแต่ละส่วน ๆ ไป จากนั้นก็รวมเข้าด้วยกันเป็นผลลัพธ์สุดท้าย

บางครั้งเมื่อมีปัญหาเกิดขึ้น (P) เราจะแยกปัญหาใหญ่ ๆ (P) ออกเป็นส่วนย่อย ๆ คือ A B และ C ซึ่งไม่ได้มีความสัมพันธ์กัน ต่อมาเราก็ทำการแก้ปัญหาต่าง ๆ( A B และ C)

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

หรือบางครั้งเราพบว่าวิธีการในการแก้ปัญหาคือเราจะต้องแก้ปัญหา P ในแบบต่าง ๆ (หรือบางทีต้องแก้ปัญหา A ก่อน) แล้วเราพบว่าการแก้ไขปัญหา A นั้นเป็นส่วนที่ช่วยแก้ปัญหา P อีกครั้ง โดยมีเงื่อนไขในการ input แบบง่าย ๆ นั่นแสดงว่าเราใช้การ Recursion ในการแก้ปัญหา


การเขียนใน โปรแกรมในลักษณะ Loop style และ Recursive style

ก่อนที่จะอ่านวิธีการเขียนในโปรแกรมในลักษณะ Loop style และ Recursive style ผมจะขอชี้แจงไว้ก่อนเลยว่า การเขียนโปรแกรมแบบ iterative แล้วมาแปลงเป็น recursive ไม่ได้ make sense!! (ไม่ใช่สิ่งที่ถูกต้อง) การทำ function ที่เป็น recursive จะใช้หน่วยความจำมากกว่า iterative ดังนั้นถ้าเราสามารถเขียนในลักษณะของ iterative ได้จะดีกว่า recursive

แต่ บางครั้งเราพบว่า Algorithm บางอย่าง ถ้าเราจะต้องเปลี่ยนจาก recursive มาเป็นเขียนโปรแกรมแบบวนลูปตรวจสอบ จะทำได้ยากกว่ามาก เช่นในส่วนการแปลภาษาของ compiler หรือการเดิน หมากรุก เป็นต้น แต่ที่ทำไว้ดูตรงนี้เพื่อที่จะให้เข้าใจการทำงานของ Recursive function มากขึ้น และพอจะมีแนวคิดในการสร้าง Algorithm แบบ Recursive


เรา พบว่าถ้าเป็นลูป 1 ชั้น และภายในไม่ได้มีการทำงานที่ซับซ้อนเราสามารถเขียนแทนกันได้ดังนี้

// 1 loop style

int function(int a,int b){

for(index=0;index<5;index++)

printf("index = %d\n",index);

index = a;

return index;

}


//recursive style

int function(int a,int b,int index){

if(index<5 ) {

printf("index = %d\n",index);

return function(a,b,index+1);

}

index = a;

return index;

}


ถ้ามีการทำงาน 2 ลูป เราสามารถเขียนแทนกันได้ดังนี้


// 2 for loop style

int function(int a,int b){

int index,j;

for(j=0;j<5;j++){

for( index=0;index<5;index++) {

printf("index = %d\n",index);

}

}

index=a;

return index;

}



// recursive style.....

// Use index, and j as counter

int function(int a,int b,int index,int j){

printf("index = %d\n",index);

if (++index < 5)

function(a,b,index,j);

else if (++j < 5)

function(a,b,0,j);

return index;

}


จะ เห็นว่าตัว index ที่ใช้ในการทำลูปจะต้องส่งเป็น parameter ให้กับ function recursive เสมอ ๆ

ตัวอย่างในการแปลงจะไม่ถูกต้องในทุกกรณี เช่นถ้าเปลี่ยนจากคำสั่ง printf("index = %d\n",index); เป็นคำสั่งอื่นที่มีผลเกี่ยวข้องกับตัวแปรที่เป็นผลลัพธ์สุดท้าย ก็อาจจะทำให้ผลลัพธ์ของ function มีค่าที่แตกต่างกันไป ซึ่งจุดนี้เองที่ทำให้การยากในการคิด Recursive programming
Logged
เรื่อ

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

แก้ปัญหา หา modem nokia ไม่เจอ

เริ่มด้วย uninstall nokai pcsuite ออกก่อนนะครับ จากนั้น ก็ download file
mdmcpq.inf หาใน google copy ไปยัง c:\windows\infแล้ว install nokia pc suite อีกครั้ง

ปัญหา wordpad ใน windows 11 หาย แก้ไขแบบนี้

 https://win7games.com/#wordpad download มาติดตั้งซะ