.NET Thai Developers | MCTS: SQL Server 2005 | MCSD: Microsoft.NET | MCAD: Microsoft.NET | MCPS: Microsoft Certified Professional
Saturday, May 10, 2014
คู่มือแนะนำการติดตั้ง OpenKM
วันนี้ผมได้ลองติดตั้งระบบจัดการงานเอกสาร (Document Management System) ตัวนึง จากที่ได้หาข้อมูลแล้ว ได้เลือก OpenKM. เป็นตัวทดสอบครับ
การติดตั้งทั้งหมด ผมแนะนำให้ติดตั้งลงใน VM นะครับ (ส่วนตัวผมใช้ Virtual Box) จะได้ทำอะไรโดยไม่กระทบกับ OS หลักของเครื่องนะครับ
ผู้สนใจเข้าไปดูรายละเอียดการติดตั้งได้ตามนี้นะครับ (คู่มือแนะนำการติดตั้ง OpenKM)
หวังว่าคงมีประโยชน์กันบ้างครับ
ปล. ตัวต่อไปจะลองติดตั้ง Alfresco ซึ่งเป็น Document Management ที่น่าสนใจอีกตัวนึงครับ
Wednesday, August 18, 2010
Database object naming standard
Use names that comply with the rules for forming SQL Server 2005 identifiers
ใน Microsoft SQL Server 2005 อ้างถึง database name ว่าเป็น identifiers ซึ่ง แบ่งเป็น 2 classes คือ delimited และ regular
Delimited identifiers คือ การครอบด้วย brackets ([]) หรือ double quotation marks (“”) ซึ่งสามารถใช้กับ characters ใดๆ ก็ได้
Regular identifiers มี กฏ ดังนี้
- Character แรกต้องเป็น Latin character จาก a ถึง z หรือ จาก A ถึง Z, ตัวอักษรจากภาษาอื่นๆ หรือ underscore (_) character ไม่สามารถใช้ @, # ใน character แรกได้ เนื่องจาก @ หมายถึง local variable ส่วน # และ ## ใช้กับ temporary table
- Characters อื่นๆ นอกจาก character แรก สามารถเป็นตัวอักษรใดๆ ก็ได้ เช่น ตัวเลข Latin, @, $, _ แต่ ช่องว่าง (space) และ character พิเศษไม่สามารถใช้ได้
- Identifier ต้องไม่ใช่คำสงวน (Reserved word) ของ Transact-SQL
Use descriptive terms
การตั้งชื่อ ควรสั้น และ มีความหมาย มีความชัดเจน เช่น ชื่อ table, view หรือ stored procedure ตัวอย่างการตั้งชื่อ table ที่ประกอบด้วย employee information การใช้ชื่อ Employees, Employee หรือ tblEmployee นั้น ดูมีความหมายกว่า TVHREMP (T=Table, V=Vase Project, HR=Human Resources, EMP=Employee) แม้ว่าตัวอักษรจะดูมีรูปแบบ แต่ไม่สามารถให้ความหมายได้ เมื่อใช้ชื่อที่ง่ายและมีความหมาย จะทำให้ users, developers และ database administrators สามารถจดจำได้ว่าเป็น identify ใด
Use only standard abbreviations in names
ในการตั้งชื่อ ควรใช้คำย่อที่รู้จักกันดี และหลีกเลี่ยงการใช้คำย่อที่ไม่เป็นมาตรฐาน ตัวอย่างเช่น Org เป็นคำย่อของ Organization
Name intersection tables consistently
เมื่อมีการสร้างมาตรฐานการตั้งชื่อ จะต้องระบุวิธีการตั้งชื่อ Intersection table ซึ่งเป็น table ที่ใช้สำหรับเป็นตัวแทนความสัมพันธ์ระหว่าง many-to-many โดยทั่วไปแล้วจะใช้วิธีรวมชื่อ entities ที่ refer กันเข้าไว้ด้วยกัน เช่น ความสัมพันธ์ระหว่าง Countries และ Languages อาจใช้คำว่า CountriesLanguages
Be consistent across all objects
เพื่อให้แน่ใจว่าการตั้งชื่อเป็นไปตามมาตรฐาน ทุกๆ Objects ใน database จะต้องมีการตรวจสอบชื่อของ objects โดยกำหนดเป็นส่วนหนึ่งของการทำการควบคุมคุณภาพ (quality-control) ถ้าชื่อไม่ได้เป็นไปตามมาตรฐาน จะต้องอยู่ใน bug list และจะต้องทำการแก้ไขก่อนที่จะเข้าสู่กระบวนการ development
Document and communicate naming standards
ควรกำหนดมาตรฐานในการตั้งชื่อและจัดทำเป็นเอกสารอย่างละเอียด และ ให้สมาชิกในทีมรวมทั้ง stakeholders รับทราบ ซึ่งมาตรฐานในการตั้งชื่อนั้นควรให้ stakeholders ทุกคนทำความเข้าใจอย่างชัดเจน
ในการจัดทำเอกสารนั้น ต้องมี “Quick Reference” กับ มีการอธิบายรายละเอียดของมาตรฐานในการตั้งชื่อและตัวอย่างด้วย อีกทั้งควรมีแทรกการสอนมาตรฐานการตั้งชื่อให้กับสมาชิกใหม่ในขณะที่ทำการฝึกอบรมด้วย
NooM
Database Auditing
การเพิ่ม application auditing จะช่วยในการควบคุมและป้องกัน non-repudiability ได้ โดยอาจใช้ DDL trigger และ การกำหนด permission ให้เหมาะสม
Audit patterns
การ audit เพื่อป้องกัน non-repudiability มีรูปแบบ ดังนี้
Simple audit in columns
ทำการเพิ่ม columns ใน table อย่างน้อย 4 columns ประกอบด้วย
1. user ผู้บันทึกข้อมูล
2. วัน เวลา ที่บันทึกข้อมูล
3. user ผู้ปรับปรุงข้อมูล
4. วัน เวลา ที่ปรับปรุงข้อมูล
รูปแบบนี้เป็นรูปแบบพื้นฐานที่สุดในการ audit และจะทราบได้เพียงผู้ปรับปรุงครั้งสุดท้ายเท่านั้น ซึ่งไม่สามารถทราบผู้ปรับปรุงก่อนหน้าได้
Simple audit in tables
ทำการเก็บข้อมูลการเปลี่ยนทั้งหมดของ table ต่างๆในฐานข้อมูล ลง table ที่เก็บ audit log รูปแบบนี้ช่วยให้สามารถทราบจำนวนของการปรับปรุง และ ผู้ทำการปรับปรุงแต่ละครั้งได้
History table
กรณีที่ต้องการเก็บการเปลี่ยนแปลงทั้งหมด (full audit log) อาจจะต้องสร้าง history tables ที่เหมือนกับ table ที่จะ audit เมื่อมีการ insert, update และ delete ข้อมูล ก็จะมีการเก็บข้อมูลไว้ใน history table ซึ่งใน history table จะประกอบด้วย columns ทั้งหมดเหมือน original table, long integer identity หรือ GUID column ที่เป็น primary key, user และ date columns
รูปแบบนี้มีประโยชน์มากสำหรับ table ที่ต้องการการควบคุมการเปลี่ยนแปลงข้อมูล และต้องการทราบประวัติของข้อมูลย้อนหลังด้วย
Audit log table with and XML column
โดยการสร้าง audit table ซึ่งประกอบด้วย 2 column ประกอบด้วย table name และ XML column ซึ่งเก็บข้อมูลการเปลี่ยนแปลงทั้งหมดในรูปแบบของ XML เนื่องจากว่า SQL Server 2005 มีการจัดการ XML ที่ดีขึ้น จึงสามารถจัดเก็บเป็น XML ได้
NooM
Data Protection and Data Encryption
บทความนี้เป็นบทความเกี่ยวกับการทำ Data Protection และ Data Encryption โดยอธิบายในแบบกว้างๆ เพื่อให้ได้เห็นภาพของรูปแบบต่างๆ ของการทำ Protection และ Encryption ข้อมูล
Data Protection
สำหรับ Database design นั้น การพิจารณาเรื่อง Security จะต้องตระหนักถึง performance ด้วย ถ้า design ให้มี security มากๆแล้ว ก็จะทำให้ performance ลดลงได้ ดังนั้น จึงควร design data protection methods ที่จะกระทบกับ database performance ให้น้อยที่สุด
จุดมุ่งหมายหลักของ database security คือ data protection ซึ่งประกอบด้วย 3 องค์ประกอบหลักคือ
- Confidentiality คือ การรักษาความลับของข้อมูล สามารถ access ได้เฉพาะ users ที่มีสิทธิเท่านั้น
- Integrity คือ ข้อมูลไม่มีการเปลี่ยนแปลง มีความบูรณภาพ แท้จริง สามารถเชื่อถือได้
- Non-repudiability คือ มีกลไกจัดการที่ users ไม่สามารถปฏิเสธได้
กลยุทธ์ในการทำ Designing data protection
Use views to hide data
ใช้ views เพื่อจัดการซ่อนข้อมูลที่ต้องการ protect ไว้ เช่น ถ้าไม่ต้องการให้ employees สามารถ access ข้อมูล invoices ย้อนหลังเกิน 24 ชั่วโมงไปแล้ว สามารถสร้าง view โดยระบุเงื่อนไขที่ต้องการไว้ใน WHERE ว่า InvoiceDate>DateAdd(day, -1, GetDate()) และ ให้สิทธิ (grant) ในการ access ได้เฉพาะ view ไม่ให้สิทธิในการ access ตัว table หลัก
Use the WITH CHECK OPTION in views
ถ้าใช้ WITH CHECK OPTION แล้ว จะสามารถจำกัดการแก้ไข rows ใน view ได้ เพราะถ้ามีการแก้ไขข้อมูลใน view การแก้ไขนั้นจะต้องเป็น row ที่อยู่ในเงื่อนไข WHERE เท่านั้น
** ถ้าไม่กำหนด Option นี้ไว้แล้ว users ก็จะยังสามารถแก้ไขข้อมูลที่ไม่ได้แสดงใน view ได้
Use stored procedures to protect data
สามารถใช้ stored procedures โดยการ ปฏิเสธ (deny) การ access แบบ direct ไปยังข้อมูลได้ นอกจากนี้ การใช้ stored procedures ยังมีประสิทธิภาพ (effective) มากกว่า views อีกด้วย
เนื่องจาก stored procedures นั้นใช้ภาษา Transact-SQL ในการ code จึงสามารถเขียน logic ที่ซับซ้อนกว่าที่ views สามารถทำได้
Data encryption
การทำ data encryption เป็นเทคนิคหลักที่ใช้ในการจัดการรักษาความลับของข้อมูล ในการวิเคราะห์ความต้องการสำหรับการทำ data encryption นั้นควรทำการวิเคาระห์จาก business requirements
SQL Server 2005 ได้จัดเตรียมการ encryption และ การจัดการ key infrastructure เพื่อให้ developers ใช้ใน Transact-SQL ในการ encrypt ข้อมูลได้
สามารถใช้ EncryptByAsymKey และ DecryptByAsymKey function เพื่อทำการ encrypt ข้อมูลแบบ asymmetric
และสามารถใช้ EncryptByKey และ DecryptByKey function เพื่อทำการ encrypt ข้อมูลแบบ symmetric
Asymmetric encryption ใช้ RSA algorithm โดยมี private keys แบบ 512, 1024 หรือ 2048 bytes
Symmetric encryption ใช้ TRIPLE_DES algorithm
Asymmetric keys มีความปลอดภัยสูงที่สุด แต่ก็ทำให้ performance ตกลงมากที่สุดเช่นกัน ต่างจาก Symmetric keys ที่ไม่มีปัญหาเรื่อง performance สามารถประมวลผลได้อย่างรวดเร็ว แต่ทั้งนี้ Symmetric keys มีความปลอดภัยน้อย ดังนั้น ควรเลือกใช้ประเภทของ keys ให้เหมาะสมกับความต้องการ และ ขนาดของ hardware infrastructure ด้วย
ตัวอย่างของข้อมูลที่ต้องการ encrypt
1. Password ของ users ที่ทำการจัดเก็บอยู่ในฐานข้อมูล
2. Sensitive data เช่น Credit card numbers, medical records
NooM
Wednesday, December 31, 2008
Saturday, May 3, 2008
Design Pattern for VB.NET and C#
Now, I'm looking for e-books those have details about "OO Design Pattern for VB.NET and C#".
I need to know in-deep for that. Today I'm downloading some e-books included
- Addison Wesley-Gang Of Four-Design Patterns, Elements Of Reusable Object Oriented Software
- Addison Wesley Design Patterns Elements of Reusable Object Oriented Software by GOF.RUS
- C# - Addison Wesley - Gang of Four - Design Patterns, Elements of Reusable Object Oriented Software
I don't know its have contexts I need. But if I have more details about OO Design Patterns, I will let you know.
P.S. on next month, I plan to exam for MCPD by upgrade from MCSD.NET before it expire on next year.
Monday, December 3, 2007
Preview Visual Basic 2008 Express Edition
เป็นไฟล์ ISO ประมาณ 800 MB ใช้เวลา download 2 ชั่วโมงครึ่ง กับความเร็ว 100 kbps
เมื่อ download มาแล้ว ก็ทำการแตกไฟล์ออกมาโดยใช้โปรแกรม DAEMON ก็จะได้ไฟล์ติดตั้งทั้งหมด 2.68 GB ใหญ่โตมากขนาดแค่ Express edition เท่านั้นนะ
หน้าตาขณะเริ่มติดตั้ง ซึ่งมีให้เลือกว่าจะติดตั้งตัวใดบ้าง
ผมเริ่มที่ตัว Visual Basic 2008 ก่อนละกัน

เมื่อติดตั้งเสร็จแล้วเปิดโปรแกรมขึ้นมา ยังไม่เห็นความแตกต่างกับ VS2005

เอาโลโก้ไปดูกันชัดๆ

เมื่อ New project จะเห็นได้ว่ามี WPF ซึ่งเคยเป็น Extension ของ VS2005 รวมอยู่ใน 2008 แล้ว

และเมื่อจะ Add Item เข้าใน Project จะเห็น Template ใหม่ๆ เพิ่มเข้ามา เช่น LINQ (อ่านว่า ลิ๊ง), Service-based Database, User Control (WPF)

และเมื่อเข้าไปยัง property ของ project จะพบกับ My Extensions ที่แปลกตา

นี่ยังแค่ Visual Basic 2008 Express นะครับ ยังไม่ได้ติดตั้ง Web Developer 2008 เลย ก็ยังพบว่ามีอะไรๆ มากมายให้เราศึกษาเพิ่มเติมจากเดิมอีกแล้วล่ะครับ
ส่งท้าย สำหรับ Web Developer จะมีลูกเล่นเพิ่มเติมจาก VS2005 มากมาย เช่น WCF, AJAX, JavaScript Intellizence ไว้จะ preview ให้ชมกันครับ
.
Wednesday, November 28, 2007
Theme Vista สำหรับ Windows XP
แล้วก็ค้นพบ Microsoft Vista Transformation Pack Version 6.0
เป็นโปรแกรมที่จะติดตั้งที่ Windows XP แล้วก็จะปรับการแสดงผลต่างๆ ให้มีหน้าตาใกล้เคียงกับ Vista
แล้วทำไมไม่ใช้ Vista ไปเลยล่ะ ?
ก็สำหรับคนที่ยังต้องใช้ Windows XP อยู่น่ะสิ ถามได้ มีอยู่เยอะแยะ
หน้าจอสวยๆ หลังจากติดตั้งแล้วครับ

ToolTip บน Task bar เมื่อเอาเมาส์ไปชี้

NotePad

Control Panel

Windows ของเราจะดูดีขึ้นทันทีโดยยังคงทำงานได้เหมือนเดิมทุกประการ ผมลอง run โปรแกรมต่างๆ มากมาย ไม่ว่าจะเป็น VS2005, MySQL Admin, SQL 2005 , Office ก็สามารถทำงานได้เหมือนเดิมครับ ยังไม่พบปัญหาอะไร
ขอให้ทุกท่านมีความสุขนะครับ
.
Monday, November 26, 2007
ไม่เขียนไม่ได้แล้ว 2008 ฟีเวอร์
รายละเอียดของมันผมขอยังไม่กล่าวถึง ไว้รอได้ดาวน์โหลดมาเล่นก่อน จะได้สัมผัสกับฟีเจอร์ใหม่จริงๆ (รอมานานกับ JavaScript Intellizence กับ LINQ ตัวจริงเสียงจริง)
ใครอยากลอง อยากเห็น ก็ดาวน์โหลดได้ที่ http://msdn2.microsoft.com/en-us/vstudio/default.aspx
รับรองไม่ผิดหวังอย่างแน่นอน ...
.
Thursday, November 22, 2007
คุณใช้ VS2005 หรือไม่
- ลงคะแนน ทั้งหมด 12 คะแนน
- ใช้อยู่แล้ว 8 คะแนน
- คิดว่าจะใช้นะแต่ไม่ใช่ตอนนี้ 1 คะแนน
- ไม่ใช้หรอกแพง 0 คะแนน
- มันคืออะไร ? 3 คะแนน
Friday, October 19, 2007
ครบรอบ 1 ปี ที่ narisa.com
Narisa.com ก็ยังคงเป็น webboard community ที่ดีมากๆ อยู่ แม้ตอนนี้อาจมีปัญหาเรื่อง maximum brandwidth อยู่บ้าง จึงต้องทำหน้าแรกเป็น page เปล่าๆ ซะอย่างนั้น
ถึงแม้ในส่วนของ Visual Studio .NET เดี๋ยวนี้ไม่ค่อยมีคนเข้ามาถาม (เพราะไม่ค่อยมีคนตอบ ฮา) แต่ในส่วนอื่นๆ ก็ยังมีการถาม-ตอบกันอย่างต่อเนื่อง ทั้งแบบสบายๆ กับรูปสวยๆ จนถึงแบบดุดันเผ็ดร้อนชวนเสียว (เสียวแทนเจ้าของกระทู้ครับ ฮา)
จนวันนี้ narisa.com ก็ยังคงเป็นสังคมที่ดีสำหรับทุกท่านครับ
Happy anniversary for me.
สถิติของผมใน narisa.com ตั้งแต่เริ่มแรกจนถึงวันที่ 19 ตค 2550
Post : 177
Average Posts Per Day : 0.48
.
Friday, October 12, 2007
ควันหลงจากงาน Hands-on Labs 10/10/2550
คือว่า หลังจากที่ทำ Labs กันเสร็จแล้ว ทางไมโครซอฟท์โดยคุณเอกราชได้ขออาสาสมัครประมาณ 5 ท่านร่วมรับประทานอาหารกลางวันฟรี พร้อมพูดคุยแลกเปลี่ยนความคิดเห็นกันเล็กน้อย เมื่อผมได้ยินว่าทานอาหารฟรีมือผมก็ถูกยกลอยขึ้นฟ้าทันที (อิ อิ)
โดยการพูดคุยครั้งนี้ผมไม่แน่ใจว่าสามารถเปิดเผยได้มากเพียงใด แต่ก็ไม่น่าจะมีปัญหาอะไรนะ เพราะพูดกันโดยทั่วไปมากกว่า ผมขอเล่าให้อ่านแบบสรุปก็แล้วกัน
โดยรวม คุณเอกราชต้องการทราบถึงเหตุผลในการตอบกลับแบบสอบถามของไมโครซอฟท์นั่นเอง ซึ่งประกอบด้วย ความพึงพอใจต่อผลิตภัณท์ของไมโครซอฟท์ ความรู้สึกต่อแหล่งความรู้ ความปลอดภัยของผลิตภัณท์ และ ความคุ้มค่าของผลิตภัณท์ โดยมีทั้งหมด 9 คะแนน ผมให้คะแนน ดังนี้
1. ความพึงพอใจ 8 เพราะผมค่อนข้างพอใจนะกับผลิตภัณท์ไมโครซอฟท์ไม่ว่าจะเป็น VS 2005, SQL Server 2005, Office 2007, Windows Vista แต่ก็ยังไม่ที่สุด คือ ยังไม่ให้ 9 ถ้าถามว่าทำไม เหตุผลก็คือเรื่องราคานั่นเองครับ เนื่องจากต้องใช้ในรูปแบบองค์กรณ์เป็นหลัก ก็เลยต้องคำนึงถึงงบประมาณเป็นพิเศษ ส่วนเครื่องที่บ้านนั้น ... กรุณาอย่ากล่าวถึงเลย ... เดี๋ยวจะชี้โพรงให้กระรอก
2. แหล่งความรู้ ข้อนี้ผมให้เต็ม 9 คะแนนเลย ปัญหาเกือบทุกอย่างของผมมีทางออกเสมอหากค้นหาได้อย่างถูกต้อง ซึี่งส่วนใหญ่ผมก็พบคำตอบนะครับ
3. ความปลอดภัยของผลิตภัณท์ ข้อนี้มองได้หลายประเด็น ซึ่งผมให้ 7 ครับ
4. ความคุ้มค่าของผลิตภัณท์ ผมให้ 7 เช่นกัน ในการมองความคุ้มค่านั้นต้องให้น้ำหนักหลายอย่าง ในความคิดผมประกอบด้วย ผลิตผลที่ได้จากผลิตภัณท์ ราคาของผลิตภัณท์ ระยะเวลาการใช้ผลิตภัณท์ ค่าใช้จ่ายอื่นๆ เช่น การอบรม เป็นต้่น ซึ่งถัวไปถัวมาก็ให้แค่ 7 เท่านั้นครับ
แล้วไมโครซอฟท์จะทำอย่างไรดีล่ะ เพื่อให้ผลตอบรับเป็น 8 และ 9 ทั้งหมด อันนี้ผมว่าไม่ยากหรอกครับ ถ้าไมโครซอฟท์จะทำ คือ
- เร่งให้ความรู้ความเข้าใจในผลิตภัณท์ใหม่ ตลอดเวลา โดยเน้นไปที่เข้าใจของลูกค้าหรือนักพัฒนา มากกว่ามีจุดประสงค์เพื่อการตลาดหรือขายของเท่านั้น ซึ่งอาจจะเปรียบเทียบกับคู่แข่งตรงๆ เลยก็ได้ (ถ้าแน่จริงนะ)
- กำหนดราคาที่เหมาะสมสำหรับประเทศไทยเสียทีเถอะ ปัจจุบันนี้ถ้าไม่ใช่องค์กร ก็แทบจะไม่มีใครใช้ของแท้หรอกครับ เพราะทางเลือกอื่นยังมี
- อื่นๆ ... คิดไว้มากมายแต่็ไม่สามารถออกอากาศได้ อิ อิ
แต่ถึงอย่างไรแล้วผมก็ยังคงต้องเดินหน้า (เดินตามหลัง) ไมโครซอฟท์ต่อไปอยู่ดี ... ก็มาทางนี้แล้วนะสิ T_T
สรุปโดยรวมคือ ผมสั่งแกงเผ็ดเป็ดย่างแต่กลับได้กินแพนงไก่ ซะงั้น แต่ก็อร่อยดีครับ .... อิ อิ
.
ิ
Wednesday, September 5, 2007
เปลี่ยน Template
GlossyBlue ตัวนี้ค่อนข้างพร้อมในส่วนของ Recent posts, Recent Comments ที่เราไม่ต้องทำอะไรมากเลย เพียงแต่แปะ javascript ลงไปเท่านั้น
แล้วก็ปรับรูปในส่วน Header นิดหน่อยครับ เพราะมันมีรูปดินสออยู่ข้างหน้า Header text เหมือนรูปด้านล่างนี้ ผมจึงขออนุญาตเอาออกครับ
เอาออกได้โดยการไป Edit HTML และ ลบโค้ดนี้บรรทัดนี้ครับ
background: url(http://newbloggertemplates.googlepages.com/glossyblue-header-icon.gif) no-repeat;
ก็จะได้ Header text เปล่าๆ ไม่มีรูปดินสอมากวนใจแล้วครับ
ปล.ในส่วนของ Recent Readers ขอเวลาผมศึกษาก่อนครับว่ามันจะขึ้นมาได้อย่างไร
Monday, September 3, 2007
สัมมนา MSDN - Thailand REMIX 07
วันที่ 26 กันยายน 2550 ณ โรงแรมเชงกรีล่า
งานสัมมนาครั้งนี้ได้แบ่งออกเป็น 2 ส่วน คือ
- Web Development
- Web Design
สงสัยต้องใช้วิชาแยกร่างแบบนารุโตะ
Friday, August 31, 2007
การทำ Popup help text โดยใช้ Javascript
<html>ผลลัพท์ เมื่อนำเมาส์ไปวางบน [?] จะขึ้น popup help text ขึ้นมาให้
<head>
<title>การแสดงกล่องข้อความแนะนำ</title>
<style type="text/css">
#hintBox{
position:absolute;
top:0;
background-color:white;
width:150px;
padding:3px;
border:1px solid black;
font:normal 11px Verdana;
line-height:18px;
z-index:100;
border-right:3px solid black;
border-bottom:3px solid black;
visibility: hidden;
}
.hint {
font-weith:bold;
color:navy;
margin:3px 8px;
}
</style>
<script language="javascript">
var horizontalOffset = "9px"
var verticalOffset = "0"
var ie = document.all
var ns6 = document.getElementById && !document.all
function getposOffset(elm, offsettype) {
var totalOffset = (offsettype == "left") ? elm.offsetLeft:elm.offsetTop;
var parentElement = elm.offsetParent;
while (parentElement != null) {
totalOffset = (offsettype == "left") ? totalOffset + parentElement.offsetLeft:totalOffset + parentElement.offsetTop;
parentElement = parentElement.offsetParent;
}
return totalOffset;
}
function ieTest() {
return(document.compatMode && document.compatMode != "BackCompat") ? document.documentElement:document.body;
}
function clearEdge(obj, whichedge) {
var edgeoffset = (whichedge == "rightedge") ? parseInt(horizontalOffset)*-1 : parseInt(verticalOffset)*-1
if (whichedge == "rightedge") {
var windowEdge = ie && !window.opera ? ieTest().scrollLeft + ieTest().clientWidth - 30 : window.pageXOffset + window.innerWidth - 30;
dropMenu.contentMeasure = dropMenu.offsetWidth;
if(windowEdge - dropMenu.x < dropMenu.contentMeasure)
edgeoffset = dropMenu.contentMeasure + obj.offsetWidth + parseInt(horizontalOffset);
}
else {
var windowEdge = ie && !window.opera ? ieTest().scrollTop + ieTest().clientHeight - 30 : window.pageYOffset + window.innerHeight - 30;
dropMenu.contentMeasure = dropMenu.offsetHeight;
if(windowEdge - dropMenu.y < dropMenu.contentMeasure)
edgeoffset = dropMenu.contentMeasure - obj.offsetHeight;
}
return edgeoffset;
}
function showhint(menuContent, obj, e, tipwidth){
if((ie||ns6) && document.getElementById("hintBox")) {
dropMenu = document.getElementById("hintBox");
dropMenu.innerHTML = menuContent;
dropMenu.x = getposOffset(obj, "left");
dropMenu.y = getposOffset(obj, "top");
dropMenu.style.left = dropMenu.x - clearEdge(obj, "rightedge") + obj.offsetWidth + "px";
dropMenu.style.top = dropMenu.y - clearEdge(obj, "bottomedge") + "px";
dropMenu.style.visibility = "visible";
obj.onmouseout = hideHint;
}
}
function hideHint(e) {
dropMenu.style.visibility = "hidden";
}
function createHint() {
var block = document.createElement("div");
document.body.appendChild(block);
block.setAttribute("id","hintBox");
}
if(window.addEventListener)
window.addEventListener("load", createHint, false);
else if(window.attachEvent)
window.attachEvent("onload", createHint);
else if(document.getElementById)
window.onload = createHint;
</script>
</head>
<body>
<form>
<b>ชื่อในการใช้งาน</b>
<input type="text" class="test" style="width: 152px" /><a href="#" class="hint" onmouseover=" showhint('พิมพ์ชื่อผู้ใช้ โดยให้เป็นอักขระจากแป้นพิมพ์เท่านี้น', this, event, '150px')"><font color="#6666FF">[?]</font></a><br />
<b>รหัสผ่าน</b><input type="text" class="test" /><a href="#" class="hint" onmouseover=" showhint('ใส่รหัสผ่าน โดยมีอย่างน้อย 8 ตัวอักษร', this, event, '200px')"><font color="#6666FF">[?]</font></a><br />
<br/>
<b>e-mail address</b><input type="text" class="test" style="width: 152px" ID="Text1" NAME="Text1" onmouseover=" showhint('กรุณาใส่ e-mail address', this, event, '200px')"/>
</form>
</body>
</html>
Function การแปลงตัวเลขเป็นตัวอักษร ด้วย Visual Basic .NET (ฉบับปรับปรุง 2014)
** แก้ไข 12/5/2014 ปรับปรุงไฟล์รูปภาพ **( ดาวน์โหลดซอร์สโค้ดได้ที่ https://github.com/noomdev/ThaiBaht )
การเขียน Function เพื่อเปลี่ยนจากตัวเลขเป็นตัวอักษร นั้น ถือว่าเป็นเรื่องสุดคลาสสิกที่โปรแกรมเมอร์ทุกคนต้องสามารถ “เขียนได้” ข้อสอบเข้าทำงานของบริษัทต่างๆ ก็มีให้เขียนโปรแกรมแปลงตัวเลขเป็นตัวอักษรทั้งนั้น ดังนั้นจะเป็นการดีไหมที่โปรแกรมทุกคนควรเขียน Function เหล่านี้เอง และทำความเข้าใจ Logic ของโปรแกรมให้ถ่องแท้และปรับแต่งให้ดีสุด ให้โปรแกรมมีขนาดเล็ก และทำงานได้อย่างถูกต้องตามต้องการ ในบทความนี้ผมได้เขียน Function ชื่อ ThaiBaht ขึ้นมา ซึ่งเป็น Function ที่แปลงจากตัวเลขเป็นตัวอักษร เช่น 10 เป็น สิบ, 121 เป็น หนึ่งร้อยยี่สิบเอ็ด, 150.25 เป็น หนึ่งร้อยห้าสิบบาทยี่สิบห้าสตางค์ ตาม Code Listing ด้านล่างนี้
Listing 1 : Function ThaiBaht
Public Shared Function ThaiBaht(ByVal pAmount As Double) As String
If pAmount = 0 Then
Return "ศูนย์บาทถ้วน"
End If
Dim _integerValue As String ' จำนวนเต็ม
Dim _decimalValue As String ' ทศนิยม
Dim _integerTranslatedText As String ' จำนวนเต็ม ภาษาไทย
Dim _decimalTranslatedText As String ' ทศนิยมภาษาไทย
_integerValue = Format(pAmount, "####.00") ' จัด Format ค่าเงินเป็นตัวเลข 2 หลัก
_decimalValue = Mid(_integerValue, Len(_integerValue) - 1, 2) ' ทศนิยม
_integerValue = Mid(_integerValue, 1, Len(_integerValue) - 3) ' จำนวนเต็ม
' แปลง จำนวนเต็ม เป็น ภาษาไทย
_integerTranslatedText = NumberToText(CDbl(_integerValue))
' แปลง ทศนิยม เป็น ภาษาไทย
If CDbl(_decimalValue) = 0 Then
_decimalTranslatedText = NumberToText(CDbl(_decimalValue))
Else
_decimalTranslatedText = ""
End If
' ถ้าไม่มีทศนิม
If _decimalTranslatedText.Trim = "" Then
_integerTranslatedText += "บาทถ้วน"
Else
_integerTranslatedText += "บาท" & _decimalTranslatedText & "สตางค์"
End If
Return _integerTranslatedText
End Function
Listing 2 : Function NumberToText
Private Shared Function NumberToText(ByVal pAmount As Double) As String
' ตัวอักษร
Dim _numberText() As String = {"", "หนึ่ง", "สอง", "สาม", "สี่", "ห้า", "หก", "เจ็ด", "แปด", "เก้า", "สิบ"}
' หลัก หน่วย สิบ ร้อย พัน ...
Dim _digit() As String = {"", "สิบ", "ร้อย", "พัน", "หมื่น", "แสน", "ล้าน"}
Dim _value As String, _aWord As String, _text As String
Dim _numberTranslatedText As String = ""
Dim _length, _digitPosition As Integer
_value = pAmount.ToString
_length = Len(_value) ' ขนาดของ ข้อมูลที่ต้องการแปลง เช่น 122200 มีขนาด เท่ากับ 6
For i As Integer = 0 To _length - 1 ' วนลูป เริ่มจาก 0 จนถึง (ขนาด - 1)
' ตำแหน่งของ หลัก (digit) ของตัวเลข
' เช่น
' ตำแหน่งหลักที่0 (หลักหน่วย)
' ตำแหน่งหลักที่1 (หลักสิบ)
' ตำแหน่งหลักที่2 (หลักร้อย)
' ถ้าเป็นข้อมูล i = 7 ตำแหน่งหลักจะเท่ากับ 1 (หลักสิบ)
' ถ้าเป็นข้อมูล i = 9 ตำแหน่งหลักจะเท่ากับ 3 (หลักพัน)
' ถ้าเป็นข้อมูล i = 13 ตำแหน่งหลักจะเท่ากับ 1 (หลักสิบ)
_digitPosition = i - (6 * ((i - 1) \ 6))
_aWord = Mid(_value, Len(_value) - i, 1)
_text = ""
Select Case _digitPosition
Case 0 ' หลักหน่วย
If _aWord = "1" And _length > 1 Then
' ถ้าเป็นเลข 1 และมีขนาดมากกว่า 1 ให้มีค่าเท่ากับ "เอ็ด"
_text = "เอ็ด"
ElseIf _aWord <> "0" Then
' ถ้าไม่ใช่เลข 0 ให้หา ตัวอักษร ใน _numberText()
_text = _numberText(CInt(_aWord))
End If
Case 1 ' หลักสิบ
If _aWord = "1" Then
' ถ้าเป็นเลข 1 ไม่ต้องมี ตัวอักษร อื่นอีก นอกจากคำว่า "สิบ"
'_numberTranslatedText = "สิบ" + _numberTranslatedText
_text = _digit(_digitPosition)
ElseIf _aWord = "2" Then
' ถ้าเป็นเลข 2 ให้ตัวอักษรคือ "ยี่สิบ"
_text = "ยี่" + _digit(_digitPosition)
ElseIf _aWord <> "0" Then
' ถ้าไม่ใช่เลข 0 ให้หา ตัวอักษร ใน _numberText() และหาหลัก(digit) ใน _digit()
_text = _numberText(CInt(_aWord)) + _digit(_digitPosition)
End If
Case 2, 3, 4, 5 ' หลักร้อย ถึง แสน
If _aWord <> "0" Then
_text = _numberText(CInt(_aWord)) + _digit(_digitPosition)
End If
Case 6 ' หลักล้าน
If _aWord = "0" Then
_text = "ล้าน"
ElseIf _aWord = "1" And _length - 1 > i Then
_text = "เอ็ดล้าน"
Else
_text = _numberText(CInt(_aWord)) + _digit(_digitPosition)
End If
End Select
_numberTranslatedText = _text + _numberTranslatedText
Next
Return _numberTranslatedText
End Function
อธิบาย
Function ThaiBaht เป็น function หลักในการทำงาน โดยมีหน้าที่จัดรูปแบบจำนวนเงินที่ส่งเข้ามาซึ่งมี data type เป็น double โดยทำการเปลี่ยนเป็น string ที่มีทศนิยม 2 หลัก และทำการแยกข้อมูล ตัวเลขจำนวนเต็ม กับ ตัวเลขทศนิยม ออกจากกัน จากนั้นจึงส่งข้อมูล ตัวเลขจำนวนเต็ม และ ตัวเลขทศนิยม ไปยัง function NumberToText ทีละตัว แล้วนำข้อความตัวอักษรมารวมกัน (concat) อีกครั้งก่อน return ตัวอักษรกลับไปทั้งหมด
ทดลองใช้งาน
1.สร้าง class ชื่อ sample.vb ใน Visual Basic .NET 2005 โดยมี function ทั้ง 2 ข้างต้น
2.สร้าง Form1 ให้มีหน้าตาตามรูป
3.เขียน code ดังนี้
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show(Sample.ThaiBaht(TextBox1.Text))
End Sub
4.ลอง run และทดสอบผลลัพธ์
ลองนำไปประยุกต์และปรับปรุงได้ตามความเหมาะสมนะครับ
-- NooM --
Monday, June 25, 2007
เขียนโปรแกรมสั่งให้ Shutdown วินโดว์
โดยปกติในระบบปฏิบัติการวินโดว์มี command-line สำหรับการสั่งให้เครื่อง shutdown คือ
>>shutdown
ผมจึงปิ้งไอเดียขึ้นมาทันทีครับ ก็สั่ง command-line ว่า shutdown ในโค้ดของโปรแกรม เมื่อทำงานเสร็จแล้วก็ได้นิครับ
Sub FunctionX()
...
Shell "shutdown -s -f"
End Sub
แค่นี้โปรแกรมนี้ก็จะสั่งให้วินโดว์ Shutdown ตัวเองแล้วล่ะครับ สำหรับ -s คือ Shutdown, -f คือการบังคับให้ shutdown แม้ว่ามีโปรแกรมใดเปิดค้างไว้ก็ตาม
ทั้งนี้ใน VB.NET ก็สามารถใช้คำสั่ง Shell นี้ได้ด้วยนะครับ
Monday, June 11, 2007
38th at the All Season
วิวสวยมากครับ จึงถ่ายรูปมาให้ชมกันครับ

รูปแรกถ่ายเห็นสวนลุมฯครับ ส่วนอาคารสีขาวรูปตัว L ด้านหน้าคือสถานฑูตสหรัฐฯครับ
ถ้าสังเกตดีๆ จะเห็นรางรถไฟฟ้า BTS ด้วยนะครับ

รูปนี้ดูเพลินๆครับ
ถ่ายมาได้ 2 รูปเองครับ เกรงใจครับ รปภ. ยืนจ้องตาเขม็งเลยครับ
