วันพุธที่ 22 ธันวาคม พ.ศ. 2553

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

Regular Expression

สัญลักษณ์พิเศษต่าง ๆ ในการใช้งาน Regular Expression

สัญลักษณ์พิเศษต่างๆ ของ Reg ช่วยให้คุณขยายขอบเขตของข้อความที่ต้องการค้นหาหรือแทนที่ได้ง่ายขึ้น โปรดอย่าคิดว่ามันเป็นตัวประหลาดหรือทำให้คุณยุ่งยากแต่อย่างใด เพราะมิเช่นนั้น มันจะเป็นอย่างนั้นจริงๆ(เอ๊ะ...ยังไง) สัญลักษณ์พิเศษต่างแบ่งออกได้เป็น 3 ประเภท

1. สัญลักษณ์พิเศษที่ใช้แทนที่อักษรหรือสัญลักษณ์ตัวหนึ่งในข้อความ(string)
2. สัญลักษณ์ที่ทำหน้าที่ทำซ้ำตัวอักษรหรือสัญลักษณ์
3. สัญลักษณ์พิเศษที่ใช้ระบุตำแหน่งอักษรหรือสัญลักษณ์


1. สัญลักษณ์พิเศษที่ใช้แทนที่อักษรหรือสัญลักษณ์ตัวหนึ่งในข้อความ(string)
\d หมายถึง เลขตัวใดตัวหนึ่งจาก 0 ถึง 9 สมมติว่าคุณต้องการค้นหาตัวเลข 100 ถึง 199 คุณสามารถเขียนเป็น Reg ว่า /1\d\d/
\D หมายถึง ตัวอักษรหรือสิ่งที่ไม่ใช่ตัวเลข
\w หมายถึง ตัวอักษรภาษาอังกฤษหรือตัวเลข และรวมถึงเครื่องหมายขีดล่าง( _ )
\W หมายถึง ตัวอักษรไทยหรือที่ว่างหรือสัญลักษณ์ต่างๆซึ่งไม่ได้อยู่ใน \w
\s หมายถึง ที่ว่าง(space) ซึ่งรวมถึง tabs และ carriage returns
\S หมายถึง ตัวอักษร ตัวเลขหรือสัญลักษณ์ต่างๆ ซึ่งไม่ใช่ที่ว่าง
. (จุด) หมายถึง ตัวอักษรหรือสัญลักษณ์ต่างๆหรือที่ว่าง (ครอบคลุมทุกสิ่งทุกอย่าง)
[. .] แสดงตัวอักษรหนึ่งตัว ซึ่งอาจจะประกอบด้วยอักขระมากกว่าหนึ่งตัวก็ได้ (เช่น [.ch.] ในภาษาสเปน) ใช้ในกรณีที่เราต้องการแทนตัวอักษรตัวใดๆ ในลำดับ เช่นในภาษาอังกฤษ จาก a ไปจนถึง c เราจะใช้ [a-c]
แต่ในบางภาษาตัวอักษรแต่ละตัวอาจจะไม่ได้ประกอบด้วยอักขระเพียงตัวเดียวดัง เช่น ch ในภาษาสเปน เราก็เลยต้องใช้ [..] ช่วยเช่นจาก a ถึง ch เราก็สามารถใช้ [a-[.ch.]] แทน
[: :] แสดงคลาสของตัวอักษร (เช่น [:alpha:]) โดยจับคู่กับตัวอักษรใด ๆ ในคลาสของตัวอักษรที่ระบุ
[:alnum:] ตัวอักษรและตัวเลขทุกตัว (alphanumeric)
[:alpha:] ตัวอักษรทุกตัว
[:digit:] ตัวเลขทุกตัว
[:blank:] ตัวช่องว่าง (Space) ทุกตัว
[:space:] ตัวช่องว่างที่ไม่สามารถพิมพ์ได้ (Nonprinting)
[:cntrl:] แสดงตัวอักษร Control ทุกตัว (ตัวอักษรที่พิมพ์ไม่ได้ - Nonprinting)
[:punct:] ตัวอักขระพิเศษทุกตัว
[:lower:] ตัวอักษรที่เป็นตัวเล็กทุกตัว
[:upper:] ตัวอักษรที่เป็นตัวใหญ่ทุกตัว
[:graph:] ตัวอักษรที่อยู่ในคลาส [:punct:], [:upper:], [:lower:] และ [:digit:] ทุกตัว
[:print:] ตัวอักษรทุกตัวที่พิมพ์ได้
[:xdigit:] ตัวอักษรที่เป็นเลขฐานสิบหกทุกตัว
คลาสเหล่านี้จะต้องใช้ภายใน Bracket เท่านั้นเช่น [[:alnum:]] หรือ [[:alpha:][:digit:]] เป็นต้น

[==] จับคู่กับตัวอักษรที่มีตัวอักษรฐาน (Base Character) ตรงกัน เช่น [=a=] จะจับคู่กับตัวอักษรที่มีตัวอักษรฐานเป็น a (เช่น ? และ ? เป็นต้น) จะต้องใช้ภายใน Bracket เท่านั้น
[...] เป็น รูปแบบที่ใช้บอกค่าต่างๆที่อาจเป็นไปได้ในตำแหน่งนั้นๆ เช่น หากคุณใช้ /[กจสห]ด/g นั่นจะหมายถึงคำว่า "กด" "จด" "สด" และ "หด"
[.-.] เป็น รูปแบบที่ใช้บอกค่าต่างๆที่อาจเป็นไปได้ในตำแหน่งนั้นๆ โดยใช้ตัวอักษรหรือตัวเลขที่ครอบคลุมเป็นช่วงๆ เช่น หากคุณใช้ /[ก-ส]ด/g นั่นจะหมายถึงคำว่า "กด" "จด" และ "สด" (ทดสอบแล้วครับ เชื่อผมได้
ใช้ได้ทั้งกับตัวอักษรภาษาอังกฤษและตัวเลข)
[^...] เป็น รูปแบบที่ใช้บอกการยกเว้นคำหรือสัญลักษณ์ต่างๆ เช่น หากคุณใช้ /[^ก-ส]ด/g นั่นจะหมายถึงอะไรก็ได้ที่มี ด เด็ก ติดอยู่ แต่ ไม่ใช่ "กด" "จด" และ "สด"


ฝรั่งบอกว่าพวกนี้เป็นเพียงสัญลักษณ์พื้นฐานพิเศษพื้นฐาน แสดงว่า ต้องมีตัวประหลาดมากกว่านี้อีก ซึ่งถ้าคุณอยากรู้ก็ขอให้ไปหาเอาเองนะครับ ผมจะเป็นกำลังใจให้ ลองมาดูตัวอย่างการใช้กันครับ... สมมติว่าคุณต้องการค้นหารหัสประจำตัวนักศึกษา(เป็นเลข 8 หลัก)จากข้อมูลกลุ่มใหญ่กลุ่มหนึ่ง คุณก็อาจจะเขียน Reg ว่า... /\d\d\d\d\d\d\d\d/gi ซึ่งมันยาวมากเลยใช่มั้ยครับ แล้วถ้าในข้อมูลดันมีเลข 10 หลักโผล่ออกมา ก็จะถูกรวมอยู่ในเลข 8 หลักที่ค้นเจอด้วย ซึ่งมันไม่ถูกน่ะครับ ...แต่เรามีวิธีช่วยให้การเขียนสั้นลงและมีความถูกต้องมากขึ้น ด้วยสัญลักษณ์พิเศษอีก 2 ประเภทที่เหลือ


2. สัญลักษณ์ที่ทำหน้าที่ทำซ้ำตัวอักษรหรือสัญลักษณ์
\ (Backslash) เป็นเครื่องหมาย Backslash ตรงตัวหรือทำให้ตัวอักษรซึ่งเป็น Operator (เช่นเครื่องหมายคูณ, หาร, บวก และลบ) กลายเป็นตัวอักษรธรรมดาตัวหนึ่ง เช่น \* จะหมายถึง ตัวดอกจันหนึ่งตัว ไม่ใช่เครื่องหมายคูณเป็นต้น
| ใช้เป็นตัวคั่นเพื่อแสดงตัวเลือก
^ แสดงว่าเป็นจุดเริ่มของข้อความ ถ้าใช้ร่วมกับ match_parameter 'm' จะใช้เป็นจุดเริ่มต้นของบรรทัดใด ๆ ใน source_string
$ แสดงว่าเป็นจุดสิ้นสุดของข้อความ ถ้าใช้ร่วมกับ match_parameter 'm' จะใช้เป็นจุดสิ้นสุดของบรรทัดใด ๆ ใน source_string
. แทนตัวอักษรใด ๆ หนึ่งตัวยกเว้น NULL และแทนตัวขึ้นบรรทัดใหม่ (New Line) ถ้า match_parameter เป็น 'n'
[ ] ใน Bracket นี้จะเป็นลิสต์ของตัวอักษร ซึ่งตัวใดตัวหนึ่งในลิสต์สามารถจับคู่ได้กับใน source_string ถ้าต้องการให้เป็นตรงกันข้ามคือต้องการ source_string ที่ไม่มีในลิสต์จะต้องใส่ ^ เข้าไปเช่นจากคิวรีข้างบนถ้าเปลี่ยน [aeiou]
เป็น [^aeiou] จะได้ข้อมูล last_name ที่เป็นตรงกันข้ามคือแสดงทุกเรคคอร์ดใน employees ยกเว้น 8 เรคคอร์ดนี้
( ) เครื่องหมายกลุ่ม, สัญญลักษณ์ทั้งหลายในนี้จะถือเป็นหนึ่งตัว
\n แทนการเกิดขึ้นซ้ำครั้งที่ n ของตัว ( ) ที่อยู่ข้างหน้าตัวมัน เช่น ([aeiou])\1 หมายถึงการเกิดขึ้นซ้ำของตัว a, e, i, o หรือ u ครั้งที่หนึ่ง เช่น aa, ee, ii, oo หรือ uu ตัว n สามารถเป็นได้จาก 1 ถึง 9
{n} หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องซ้ำ n ครั้ง เช่น คุณสามารถเขียน Reg แทนเลข 8 หลัก ว่า /\d{8}/
{n,} หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องซ้ำ n ครั้งหรือมากกว่า
{n,m} หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องซ้ำ n ครั้งหรือมากกว่า แต่ไม่เกิน m ครั้ง เช่น หากคุณต้องการทดสอบว่า password ที่ผู้ใช้พิมพ์เข้ามาในรูปภาษาอังกฤษและตัวเลข มีความยาวอยู่ระหว่าง 6 ถึง 12 ตัว คุณสามารถเขียนได้ว่า \w{6,12}/
? หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นอาจมีอยู่ครั้งเดียวหรือไม่มีเลยก็ได้ เช่น หากคุณต้องการค้นหา รหัสที่มีเลข 6 หลักและหน้าเลขอาจมีสัญลักษณ์หรือตัวอักษรนำหน้าตัวเดียว คุณอาจเขียนว่า /\D?\d{6}/ (แทนการเกิดขึ้น 0 หรือ 1 ครั้ง)
+ หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นต้องมีอยู่อย่างน้อยหนึ่งครั้ง (แทนการเกิดขึ้น1 ครั้งเป็นต้นไป)
* หมายถึง สิ่งที่อยู่ในตำแหน่งนั้นอาจไม่มีอยู่หรือมีอยู่กี่ครั้งก็ได้ ( แทนการเกิดขึ้น 0 ครั้งขึ้นไป )ซึ่งคุณควรใช้สัญลักษณ์นี้ด้วยความระมัดระวัง ยกตัวอย่างเช่น /a*/ อาจหมายถึง คำภาษาอังกฤษจำนวนมากที่มีอักษร a อยู่ซึ่งอาจครอบคลุมคำที่คุณไม่ต้องการค้นหาผมขอยกตัวอย่าง การใช้สัญลักษณ์ทำซ้ำที่ซับซ้อนขึ้นมา ในการค้นหาหรือกรอกหมายเลขบัตรประชาชน ซึ่งมี 13 หลัก และมีรูปแบบที่ควรเป็นไปได้ดังนี้...

0 1234 56789 12 3
หรืออาจมีคนใช้ 0123456789123
หรืออาจมีคนใช้ 0 1234 56789123
หรืออาจมีคนใช้ 0 1234 56789 123 . . . . . .

ในข้อมูลหมายเลขบัตรจำนวนมาก อาจมีการเว้นวรรคหรือไม่เว้นดังที่แสดง ในการเขียน Reg ให้ครอบคลุมทุกๆกรณี คุณอาจเริ่มต้นด้วย
/\d \d\d\d\d \d\d\d\d\d \d\d \d/g
ส่วนการเว้นวรรค อาจมีหรือไม่มีก็ได้ เราก็เพิ่มเครื่องหมาย ? เข้าไป :
/\d ?\d\d\d\d ?\d\d\d\d\d ?\d\d ?\d/g
เราอาจใช้สัญลักษณ์ทำซ้ำเพื่อให้เขียนและอ่านได้ง่ายขึ้น :
/\d ?\d{4} ?\d\{5} ?\d{2} ?\d/g


3. สัญลักษณ์พิเศษที่ใช้ระบุตำแหน่งอักษรหรือสัญลักษณ์
\b (ใช้ได้แต่กับภาษาอังกฤษ) ใช้ระบุขอบเขตของคำว่ามีการจำกัด เช่น หากคุณต้องการค้นหาแต่ on ที่อยู่เดี่ยวๆ ไม่ได้อยู่ภายในคำอื่น ให้คุณใช้ /\bon\b/gi
\B (ใช้ได้แต่กับภาษาอังกฤษ) ใช้ระบุขอบเขตของคำว่าไม่ได้จำกัด เช่น หากคุณต้องการค้นหาคำว่า "Paula" และ "Pauline" แต่ไม่เอา "Paul" ให้คุณใช้ /\bpaul\B/gi
^ ใช้ระบุเป็นสิ่งที่อยู่อันดับแรกในข้อความ(string) เช่น หากคุณต้องการตรวจว่า เลข 1 เป็นสิ่งที่อยู่หน้าสุดของข้อความหรือเปล่า ให้ใช้ /^1\b/
$ ใช้ระบุเป็นสิ่งที่อยู่อันดับสุดท้ายในข้อความ(string) เช่น หากคุณต้องการตรวจว่า "จบ" เป็นสิ่งที่อยู่ท้ายสุดของข้อความหรือเปล่า ให้ใช้ /จบ$/

pattern คือ รูปแบบทีเป็นไวยกรณ์ของ Regular Expression ที่เอาไว้จัดการ Text ใน source_string
match_parameter คือตัวที่กำหนดพฤติกรรมในการจับคู่ตาม pattern ที่กำหนด ตัวอย่างเช่น

'i' หมายถึงการจับคู่ตาม pattern ไม่สนใจเรื่องตัวอักษรใหญ่หรือเล็ก (Case Insensitive)
'c' หมายถึงการจับคู่ตาม pattern ที่จะต้องตรงกันตามอักษรตัวเล็ก-ใหญ่ (Case Sensitive)
'n' ทำให้สัญญลักษณ์จุด (Period)ใน Regular Expression ซึ่งโดยปกติหมายถึงตัวอักษรใด ๆ ก็ได้หนึ่งตัว กลายเป็นหมายถึงตัวขึ้นบรรทัดใหม่ (New Line Character)
'm' ทำให้เครื่องหมาย ^ และ $ เป็นจุดเริ่มต้นและจุดสิ้นสุดบรรทัดใน source_string ซึ่งหมายถึงทำให้มอง source_string เป็นหลาย ๆ บรรทัดได้ ถ้าไม่ได้กำหนดตัวนี้ source_string จะถูกมองเห็นเป็นบรรทัดเดียว และ ^ กับ $
จะหมายถึงเป็นจุดเริ่มต้นกับสิ้นสุดของ Text ทั้งหมดใน source_string

ถ้า เราระบุ match_parameter ที่ขัดแย้งกันเช่น 'ic' จะใช้ค่าตัวหลังสุดคือ 'c' ซึ่งหมายถึง Case Sensitive ตัวอักษรจะต้องเป็นตัวเล็ก-ใหญ่ตรงกัน หรือถ้าเราไม่ระบุ match_parameter เลย ค่าดีฟอลต์จะมีผลดังนี้
- การจับคู่จะเป็น Case Sensitive หรือไม่ขึ้นอยู่กับตัวแปร NLS_SORT
- จุด (Period) จะหมายถึงตัวใด ๆ หนึ่งตัว ไม่ได้แทนตัวขึ้นบรรทัดใหม่
- source_string จะถูกมองเป็นบรรทัดเดียว และเครื่องหมาย ^ และ $ จะหมายถึงจุดเริ่มต้นและสิ้นสุด Text ทั้งหมดใน source_string

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

การจัดการค่า Attribute ใน Header ของ SP Shibboleth

ค่า Attribute ใน HTTP Header ของ SP Shibboleth ที่ส่งไปให้โดย IdP เช่น uid, REMOTE_USER หรืออื่น ๆ จำเป็นจะต้องแก้ไขไฟล์ attribute-map.xml ใน opt/shibbolet-sp-2.0/etc/ โดยดูตัวอย่างได้ที่ sp1

วันพฤหัสบดีที่ 18 กุมภาพันธ์ พ.ศ. 2553

The Trust int Shibboleth

The Trust int Shibboleth
(ความไว้วางใจซึ่งกันและกันในระบบ SSO ที่นำ Shibboleth มาใช้งาน)

ความไว้วางใจในที่นี้คือ ความไว้วางใจของกันและกันระหว่าง IdP กับ SP โดย Shibboleth ได้กำหนดให้มีการจัดการความไว้วางใจกันโดยองค์ประกอบของระบบดังนี้
IdP โดยไฟล์ relying-party.xml
1. กำหนดให้ใช้

/opt/shibboleth-idp-2.0.0/credentials/idp.key
/opt/shibboleth-idp-2.0.0/credentials/idp.crt

โดยไฟล์ idp.crt จะต้องเป็น public-key ของ IdP เอง
2. จะต้องสร้างไฟล์ idp-metadata.xml โดยภายในไฟล์ จะต้องบรรจุ public key จากไฟล์ idp.crt เข้าไว้ด้วย เพื่อนำไปแจกก่ายให้แก่ SP ที่เข้าร่วมในวงเดียวกัน

SP โดยไฟล์ shibboleth2.xml
1. จะต้องกับหนดพาธของไฟล์ idp-metadata.xml ซึ่งต้องกำนดในไฟล์ shibboleth2.xml ให้ถูกต้อง