รู้จักกับ Attributes ต่างๆของ Active Directory

ในการค้นหาข้อมูลใน AD(Active Directory) เราจำเป็นจะต้องรู้ว่า Attribute แต่ละตัวนั้นเรียกว่าอะไรซึ่งในรูปนี้จะสามารถอธิบายได้อย่างชัดเจนว่าแต่ละตัวมีชื่อเรียกว่าอะไรบ้าง
ldap_properties

เริ่มต้นจากชื่อ object หรือ objectClass จะเป็นชื่อของ Object ที่เราทำการค้นหาใน OU(Organiztion Unit) เช่น User, Group เป็นต้น

ตัวถัดมาก็เป็นชื่อซึ่งอาจเป็น CN(ย่อมาจาก Common Name) เป็นการเอา sn(นามสกุล) และ givenName(ชื่อ) มาต่อกัน ส่วน displayName นี่จะเป็น Attribute อีกตัวที่ทำการกรอกเข้าไปใน AD ดังนั้นบาง Server อาจไม่ได้กรอกค่านี้เอาไว้หรืออาจไม่เหมือนกับ sn และ givenName เวลา Query ออกมาเลยได้ค่าที่ไม่ตรงกับที่เราคิดไว้

ส่วน Attribute อีกตัวที่ใช้บ่อยมากๆคือ SAMAccountName จะเป็นชื่อ username(ไม่ต้องใส่ domain เช่น MyCompany\Somsri ก็ให้ใส่แค่ Somsri) เป็น Attribute ที่ไว้ทำการค้นหาเวลา login

สุดท้ายก็ userPrincipalName จะเป็น SAMAccountName ต่อด้วย @domainname

ดังนั้นใน ASP.net เราจะสามารถใช้ Attributes เหล่านี้ในการ filter และ ทำการดึง properties ออกมา

แต่ถ้าเราต้องการระบุ attribute หลายๆตัวให้เขียนแบบนี้แทน

แหล่งข้อมูลอ้างอิง

http://www.computerperformance.co.uk/Logon/LDAP_attributes_active_directory.htm

การใช้ while loop แทน foreach

ในการทำงานกับ array ถ้าในบางปัญหาเราอาจพบว่าการเขียนด้วย while loop จะง่ายกว่าการเขียน foreach(แน่นอนการทำงานแบบวน loop 99% ถ้าเขียนด้วย foreach จะเหมาะสมกว่า) แต่ในบางกรณีเราอาจไม่อยากใช้ foreach ในการทำงานแล้ว loop อะไรล่ะที่จะมาตอบโจทย์ได้ดีที่สุด

ถ้าทำงานกับ index array สิ่งที่เราเลือกต้องเป็น for อย่างไม่ต้องสงสัย แต่ถ้าต้องการทำงานกับ Associated Array(เป็น array ที่มี key เป็นอะไรก็ได้ตามใจฉัน) ล่ะ จะทำยังไงดีเพราะไม่มี key 0,1,2,… ให้ใช้งานแบบ Indexed Array คราวนี้จะแก้โจทย์นี้ยังไงกันดี

ก่อนอื่นมาวิเคราะห์กันก่อนว่า foreach มีข้อดีอะไรบ้าง

  1. ไม่ต้องระบุรอบที่ชัดเจนเหมือนกับ for loop
  2. ในแต่ละรอบจะสามารถเข้าถึง Value และ Key ของ Array นั้นๆได้

ดังนั้น ถ้าวิเคราะห์จากข้อที่ 1 เราคงต้องเลือก loop ที่ไม่จำเป็นต้องระบุรอบให้ชัดเจนอย่าง while หรือ do-while มาใช้ และข้อที่ 2 เราก็คงจะต้องมี function ที่สามารถดึง Value และ Key ของสมาชิกในรอบ Array ปัจจุบันได้ ซึ่งคำตอบของชื่อ function ที่ว่านี้ก็คือ current และ key

  • current() จะเป็นการเอาสมาชิกตัวปัจจุบันเอามาแสดงผล
  • key() จะเป็นการเอา key ของสมาชิกตัวปัจจุบันออกมาแสดงผล
  • next() จะเป็น function สำหรับเลื่อน pointer ไปยังสมาชิกตัวถัดไป

ดังนั้น code ที่ได้หน้าตาจะออกมาเป็นแบบนี้

ในแต่ละรอบจะทำการดึงค่า current(อย่าลืมใส่ parameter ด้วยนะ) ออกมา ถ้า current ยังคงมีค่าอยู่ก็จะวน loop ไปเรื่อยๆ เลยต้องมี next($arr) เพื่อเลื่อนไปยังสมาชิกตัวถัดไป

ที่สำคัญย้ำกันอีกครั้งว่า ในทุกๆ function ไม่ว่าจะเป็น current, key หรือ next ต้องใส่ parameter ที่เป็น Array เข้าไปด้วยหวังว่าคงจะได้เอาเทคนิคนี้ไปลองใช้กันบ้างจะได้เข้าใจการทำงานของ foreach กันมากขึ้น

คณิตศาสตร์สำหรับการเขียนโปรแกรม ตอนที่ 2

หลังจากย้อนความทรงจำกับการเรียน Logic กันไปแล้วในตอนที่แล้วเราจะมาดูกันต่อในเรื่องของการประยุกต์ใช้งาน Logic ในชีวิตจริง

เวลาเจอโจทย์ถ้าเราใช้ AND หรือ OR กับค่าของตัวแปรปกติ จะไม่มีผลอะไรมากเพราะไม่ค่อยซับซ้อนเท่าไหร่ เช่น

หรือ

จะเห็นว่าทั้ง 2 ตัวอย่างด้านบนจะเขียนเงื่อนไขแบบที่เป็นภาษาพูดได้เลย แต่ถ้าเมื่อไหร่ที่มี not เข้ามาเกี่ยวข้องการเขียนจะยากขึ้น เพราะจะต้องเรียบเรียงให้ใกล้กับภาษามนุษย์ได้ยากกว่าปกติ

ถ้าเราย้อนกลับไปสมัยเรียนคณิตศาสตร์ สูตรที่เราท่องกันอยู่คือ

ค่า not ของ p และ q จะเท่ากับ not p หรือ not q เป็นการกระจายเครื่องหมาย not เข้าไปในวงเล็บ และกลับจาก and หรือ or เป็นค่าตรงข้าม ถ้าเดิมเป็น and ให้เปลี่ยนเป็น or

เวลาเราเลือก logic ที่มีลักษณะนี้ให้เลือกเป็น “และ” เวลาอ่านจะง่ายที่สุด เช่น

ให้นิพจน์แรก (p) เป็น ลูกค้า และ q เป็น ซื้อเกิน 100000 บาท ถ้าเอา p และ q มาทำการเชื่อมกันจะแยกได้เป็น 4 กรณี

  1. เป็นลูกค้า และ ซื้อเกิน 100000
  2. เป็นลูกค้า และ ซื้อไม่เกิน 100000
  3. ไม่ใช่ลูกค้า และ ซื้อเกิน 100000
  4. ไม่ใช่ลูกค้า และ ซื้อไม่เกิน 100000

พยามใช้ Logic ที่มี และเป็นตัวเชื่อมในกรณีที่ต้องใช้ not ทั้งคู่ ดังนี้

  • ไม่ใช่ลูกค้าและซื้อไม่เกิน 100000 บาท (~p and ~q) มีกลุ่มที่ 4 กลุ่มเดียวเท่านั้นที่เข้าเงื่อนไข
  • ไม่ใช่ลูกค้าที่ซื้อเกิน 100000 บาท (~(p and q)) กลุ่มที่ 1, 2 และ 3 จะเข้าเงื่อนไขนี้ ซึ่งจริงๆแล้วประโยคนี้จะเขียนเป็น ไม่ใช่ลูกค้า หรือ ซื้อไม่เกิน 100000 บาท (~p v ~q) ก็ได้ แต่การอ่านทำความเข้าใจจะทำได้ยาก ดังนั้นเวลาเราเขียนโปรแกรมพยายามเลือกใช้ และ เป็นอันดับแรก

*** เมื่อไหร่ก็ตามที่ต้องมีการตรวจสอบที่มี 2 เงื่อนไขมาเชื่อมต่อกันให้พยายามเชื่อมด้วย “และ” เสมอ

เริ่มต้นรู้จักกับ Dynamic CSS

Style Sheet หรือ CSS เป็นส่วนที่ทำการตกแต่งให้หน้าเว็บของเราดูสวยงาม แต่ในการทำงานจริง Style Sheet จะมีความวุ่นวายเยอะมาก ซึ่งทำให้การจะแก้ไข Style Sheet ต้องใช้เวลาเป็นอย่างมาก

ดังนั้นจึงมีแนวคิดที่จะสร้าง Framework ขึ้นมาเพื่อที่จะทำการ generate Style Sheet ออกมาให้เรา โดยใช้วิธีการเขียนที่เรียบง่ายกว่า Style Sheet จริงๆมาก โดยในปัจจุบันจะมีอยู่ 2 ค่ายหลักๆ คือ

  • LESS
  • Sass

ทั้ง LESS และ Sass เป็น Dynamic Style Sheet ทั้งคู่ แต่ LESS จะมีข้อดีกว่าตรงที่ จะสามารถ render ในฝั่ง Client ด้วย JavaScript ได้ด้วย ส่วน Sass นั้นจะต้องทำการ render ที่ฝั่งของ server เพียงอย่างเดียว

ทั้ง LESS และ Sass นั้นถูกหยิบเอาไปใช้ใน Framework ต่างๆอย่างมากมาย เช่น Bootstrap หรือ JavaScript Framework อย่าง ExtJs

ข้อดีของการใช้ Dynamic Stylesheet คือเราสามารถเขียน Style Sheet ได้เหมือนกับการเขียนโปรแกรม มีการประกาศตัวแปร มีการใส่วงเล็บซ้อนกันได้ (Nested) โดยที่เราสามารถอ่านและทำความเข้าใจ LESS และ Sass ได้ไม่ยากนัก

 

การใช้งาน jQuery แทน Media Query ใน CSS3 ตอนที่ 2

จากที่เคยเขียนแนวทางการใช้งาน jQuery แทน media query ใน CSS3 เนื่องจาก IE 6,7,8 ยังไม่ support ดังนั้นเราอาจใช้ jQuery เข้ามาช่วยทำ Responsive Web แบบง่ายๆด้วย JavaScript ได้ แต่เนื่องจากตอนนั้นยังทำได้ไม่สมบูรณ์เลยเขียน code มาแบบเต็มๆให้ดู จริงๆอยากจะประยุกต์ Singleton Pattern ใน JavaScript มาด้วยแต่เดี๋ยวยากเกินไป เอาแค่นี้ก่อนละกัน ในบทความนี้จะเปรียบเทียบกับตัว CSS3 ด้วยจะได้เข้าใจมากขึ้น

เริ่มจาก code ส่วนแรกประกาศเป็น function ชื่อว่า checkDevice() เป็นfunction ที่รับ parameter เป็น  width ของ window

1
2
3
4
5
6
7
8
9
10
11
var checkDevice = function(width){
        console.log(width);        
        $('li').removeClass();
        if(width > 760){
             $('li:first-child').addClass('desktop');
        }else if(width > 480 ){
             $('li:nth-child(2)').addClass('tablet');
        }else if(width > 0){
             $('li:last-child').addClass('mobile');
        }
};

และใช้ jQuery ดึงขนาดความกว้างของ window แบบนี้

1
$(window).width()

และสุดท้ายก็ทำการ เรียก function นี้ทุกครั้งที่เกิดการย่อหรือขยายความกว้างของ browser

1
2
3
4
checkDevice($(window).width());
$(window).resize(function(){
     checkDevice($(window).width());
});​

ซึ่งโดยทั้งหมดนี้มีค่าเท่ากับ Style Sheet แบบนี้

1
2
3
4
5
@media screen and (min-width: 760px){
       li:first-child{
           border: 3px solid #41709B;
       }
   }
1
2
3
4
5
@media screen and (min-width: 481px and max-width: 760px){
       li:nth-child(2){
           border: 3px solid #41709B;
       }
   }
1
2
3
4
5
@media screen and (max-width: 480px){
       li:last-child{
           border: 3px solid #41709B;
       }
   }

ใน style sheet จะใช้ min-width และ max-width ในการกำหนดช่วงของความกว้างของ browser ถ้าตกอยู่ในช่วงไหนก็จะทำการกำหนด style sheet ในวงเล็บเข้าไปตาม selector ที่เราเลือก

โดยรอบนี้มี code ให้เข้าไปทดสอบกันได้ที่ http://jsfiddle.net/irobust/vgzvR/ 

แต่ถ้าต้องการดูผลลัพธ์ต้องดูแบบ Full Screen ถึงจะเห็นผลลัพธ์ที่ถูกต้องโดยเข้าไปที่http://jsfiddle.net/irobust/vgzvR/embedded/result/

อยากได้ setup แบบขั้นตอนเดียวจบต้อง bitnami

ถ้าต้องการตัว setup แบบ สำเร็จรูป มีหลากหลายค่ายให้เลือกไม่ว่าจะเป็น wordpress joomla หรือ drupal ไม่เฉพาะ CMS ยังมี open source ค่ายต่างๆอีกมากมาย อย่างเช่น sugarCRM เรียกได้ว่าขั้นตอนเดียวเสร็จ เป็นเหมือนบะหมี่กึ่งสำเร็จรูป แค่เทน้ำร้อนได้กินทันที

http://bitnami.org/stacks