Showing posts with label ทั่วไป. Show all posts
Showing posts with label ทั่วไป. Show all posts

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

สำหรับ Standard ในการตั้งชื่อ Object ในฐานข้อมูล SQL Server 2005 มีดังต่อไปนี้

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 มี กฏ ดังนี้
  1. Character แรกต้องเป็น Latin character จาก a ถึง z หรือ จาก A ถึง Z, ตัวอักษรจากภาษาอื่นๆ หรือ underscore (_) character ไม่สามารถใช้ @, # ใน character แรกได้ เนื่องจาก @ หมายถึง local variable ส่วน # และ ## ใช้กับ temporary table
  2. Characters อื่นๆ นอกจาก character แรก สามารถเป็นตัวอักษรใดๆ ก็ได้ เช่น ตัวเลข Latin, @, $, _ แต่ ช่องว่าง (space) และ character พิเศษไม่สามารถใช้ได้
  3. Identifier ต้องไม่ใช่คำสงวน (Reserved word) ของ Transact-SQL
ควรใช้ regular identifiers ในการตั้งชื่อ database objects เพื่อหลีกเลี่ยงที่จะต้องใช้ delimiters ในทุกๆ object name และ เพื่อง่ายในการ code และ อ่าน

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

เพื่อป้องกันการปฏิเสธการกระทำของ users (non-repudiability) เช่น ถ้า user บังเอิญลบรายการ และเขาปฏิเสธว่าไม่ได้กระทำ เราจะต้องมีกระบวนการที่จะทำให้ user ไม่สามารถปฏิเสธในสิ่งที่เขากระทำได้
การเพิ่ม 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

ส่งท้ายปีเก่าต้อนรับปีใหม่ 2552

ขอให้ทุกท่านมีความสุขตลอดปี 2552 และตลอดไปด้วยครับ
สุขสันต์ปีใหม่ 2552

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

Download เสร็จแล้วครับ VS2008 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

ด้วยความอยาก เล่น Vista แต่ยังไม่กล้าใช้ตัวจริง จึงเสาะหา Theme ที่ให้ Windows มีหน้าตาเหมือน Vista แต่ยังคงเป็น 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 ฟีเวอร์

ถ้าได้ลองเข้าไปในเว็ปต่างๆ ของนักพัฒนา .NET ตอนนี้คงได้เห็นการกล่าวถึง VS 2008 กันอย่างมากมาย เนื่องจากตอนนี้ ทางไมโครซอฟท์ ได้ปล่อยให้ดาวน์โหลดกันเล่นได้ ฟรี แต่ก็มีจำนวนวันจำกัดสำหรับบางเวอร์ชัน แต่ที่ฟรีแน่ๆ คือ Express Edition

รายละเอียดของมันผมขอยังไม่กล่าวถึง ไว้รอได้ดาวน์โหลดมาเล่นก่อน จะได้สัมผัสกับฟีเจอร์ใหม่จริงๆ (รอมานานกับ JavaScript Intellizence กับ LINQ ตัวจริงเสียงจริง)

ใครอยากลอง อยากเห็น ก็ดาวน์โหลดได้ที่ http://msdn2.microsoft.com/en-us/vstudio/default.aspx
รับรองไม่ผิดหวังอย่างแน่นอน ...

.

Thursday, November 22, 2007

คุณใช้ VS2005 หรือไม่

เป็นคำถามง่ายๆ ตอบสบายๆ ที่เริ่มถามตั้งแต่ประมาณเดือนที่แล้ว ตอนนี้ผลก็สรุปออกมาแล้วดังนี้
  • ลงคะแนน ทั้งหมด 12 คะแนน
  • ใช้อยู่แล้ว 8 คะแนน
  • คิดว่าจะใช้นะแต่ไม่ใช่ตอนนี้ 1 คะแนน
  • ไม่ใช้หรอกแพง 0 คะแนน
  • มันคืออะไร ? 3 คะแนน
ตอบผู้ที่ไม่รู้ว่ามันคืออะไร ซึ่งมีถึง 3 คะแนน ว่า VS2005 คือ Visual Studio 2005 นั่นเองครับ (จะได้รู้ซะทีนะ อิ อิ)

Friday, October 19, 2007

ครบรอบ 1 ปี ที่ narisa.com

ผมเริ่มสมัครไว้ตั้งแต่ 13 ตค 2549 วันนี้ 19 ตค 2550 ครบรอบ 1 ปี พอดี(เลยมาหน่อยๆ)

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

ขอโม้เพิ่มจากวันที่ 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

ผมได้เปลี่ยน Template จากเดิมที่ใช้ของ New Blogger Template เป็น Template ชื่อ GlossyBlue Blogger Template ซึ่งได้ link มาจาก blog ของคุณ iake อีกทีใน post นี้ครับ http://iake.blogspot.com/2007/05/25-itheme-for-new-blogger.html และก็ปรับแต่งนิดหน่อยเท่านั้นเอง

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

ไมโครซอร์ฟ ประเทศไทย จัดงานสัมมนาในหัวข้อ MSDN - Thailand REMIX 07
วันที่ 26 กันยายน 2550 ณ โรงแรมเชงกรีล่า

งานสัมมนาครั้งนี้ได้แบ่งออกเป็น 2 ส่วน คือ
  • Web Development
  • Web Design
รายละเอียดดูได้ที่นี่ครับ http://www.microsoft.com/thailand/msdn/thairemix07/agenda.aspx

สงสัยต้องใช้วิชาแยกร่างแบบนารุโตะ

Friday, August 31, 2007

การทำ Popup help text โดยใช้ Javascript

หลักในการทำ Popup help text 1.สร้าง object div ใน html document โดยกำหนดให้ visibility เป็น hidden 2.กำหนดให้ object div ยกเลิกการซ่อนและแสดงผลความตำแหน่งที่ต้องการเมื่อเกิด event onmouseover บน control ที่ต้องการ Code : popuptext.htm
<html>
<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>
ผลลัพท์ เมื่อนำเมาส์ไปวางบน [?] จะขึ้น popup help text ขึ้นมาให้ หรือเมื่อนำเมาส์ไปวางบน text box ของ e-mail address ก็จะขึ้น popup help text ขึ้นมาให้เช่นกัน

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 วินโดว์

เนื่องจากผมต้องเขียนโปรแกรมตัวหนึ่ง ซึ่งเมื่อ run เสร็จแล้ว ก็จะต้องสั่งให้เครื่องคอมพิวเตอร์ shutdown เองได้ ผมจึงต้องหาวิธีที่ทำให้โปรแกรม Visual Basic 6.0 ของผมสามารถ 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

หลายวันก่อนได้มีโอกาสไปสัมมนาที่ ไมโครซอฟท์ ประเทศไทย ณ อาคาร All Season (CRC) ชั้น 38
วิวสวยมากครับ จึงถ่ายรูปมาให้ชมกันครับ


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



รูปนี้ดูเพลินๆครับ

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