วันพฤหัสบดีที่ 4 กรกฎาคม พ.ศ. 2556

มาทำรายงานกัน (ต่อ)


มาทำรายงานกัน (ต่อ)


บทความที่แล้วพูดถึง  “วิธีการคิด” ภาพรวม ... อาจจะดูซับซ้อนไปนิด (ดูบ่อยๆ ก็คุ้นๆน๊ะครับ)
ตย.1 สร้างรายงาน  ที่อ่านข้อมูล  100 %) ต่อไปนี้  
รายงานที่ต้องการ

วิเคราะห์  รูปแบบรายงาน

               จากแนวคิด  ต้องออกแบบรายงาน โดยแบ่งพื้นที่ออกเป็นส่วนๆ ได้แก่  ส่วนหัวกระดาษ  (Head)   ส่วนรายละเอียด (Detail)   และ ส่วนท้ายรายงาน   (ในที่นี้  ผมไม่ได้ควบคุม Footer)
ส่วนหัว   แยกเป็น  ส่วนที่เป็น Standard (ประกาศให้รู้ว่า report มาจากอะไร) + ชื่อ Column 


  • แสดงชื่อโปรแกรมที่เรียก  (ให้ใช้ ตัวแปรจาก I-spec ด้วย  SDS)
  • Description
  • วัน/เวลา ที่สั่งพิมพ์                วันที่ใช้ ตัวแปรพื้นฐานได้ *DATE
  • หน้า (page)           O-Spec มีตัวแปรให้
  • ชื่อ Column           (ขึ้นกับ data)

Tip  ใน RPG/400 กำหนด Font ชนิด Underline ไม่ได้   ต้องสั่งพิมพ์  2 ครั้ง  (อักษร, เส้นใต้)   มักจะใช้เทคนิคสั่งพิมพ์บรรทัดเดิม  (บรรทัดแรก  สั่งพิมพ์  โดย “ไม่ขึ้นบรรทัดใหม่” ->  บรรทัดที่ 2 ตีเส้นใต้  แล้วขึ้นบรรทัดใหม่)

ส่วนรายการ                         ขึ้นกับ data
ส่วนท้ายรายงาน                 บอกให้รู้ว่า  สิ้นสุดแล้ว (ถ้าไม่แสดง  ทำให้รู้ว่า  โปรแกรมหยุดทำงานแบบผิดปรกติ)
                                             บางโปรแกรมจะเพิ่ม  การแสดงสรุปที่จุดนี้  (จำนวนรวม)

ก่อนเขียน โปรแกรม

Q1: จะพิมพ์บน  รูปแบบกระดาษอย่างไร ?         (ยุคใหม่  คือ  กระดาษ A4)  
A1: เครื่อง Main Frame. Mini Comp จะมี  Line Printer ซึ่งพิมพ์ได้เร็ว และใช้งานได้นาน (แพงด้วย)  เช่น พิมพ์ pay slip, รายงานสรุป (ที่ต้องเก็บไว้อ้างอิง) เป็นต้น
      รูปแบบกระดาษ ของ AS/400 ที่มีมาให้คือ  QPRINT, QSYSPRT, QUSRPRT
      ดูรายละเอียดได้ด้วยคำสั่ง  DSPFD   QPRINT 
  (ปรกติจะดูช่องที่แสดง)
Q2: จะพิมพ์ตำแหน่ง อะไร ?  (ดูไม่ auto – ถ้าไปลองทำให้เหมือนใน MS Office ก็ต้องกำหนดยุ่งยากคล้ายกัน)
A2: การสั่งพิมพ์  ต้องควบคุมทีละ บรรทัด!   เช่น
         “เมื่อกระดาษ  พร้อมจะพิมพ์”   
         เริ่มต้นพิมพ์  ส่วนหัวกระดาษ  ให้เลื่อนกระดาษขึ้นไป  2 บรรทัด  ก่อนพิมพ์
         ส่วนหัวกระดาษ  ให้พิมพ์ข้อความ,ตัวแปร  ที่ตำแหน่ง ... (นับจากท้าย หรือ นับถัดไป)
         ส่วนหัวกระดาษ  พิมพ์บรรทัดแรกเสร็จ  ต้องพิมพ์ “ซ้ำ” อีกครั้ง   แล้วจึงขึ้นบรรทัดใหม่

Source Code



คำอธิบาย Source Code

Format ของ Date ใช้แบบ YYYYMMDD
ใช้ File=SQ010L1 ,Input = อ่านอย่างเดียว ,Field อ้างอิงจาก External      (ไม่กำหนดใน I-Spec) ,เปิดใช้ Key
ใช้ Printer File=QPRINT ,Output = บันทึกอย่างเดียว  ,Field กำหนดในเอง (ใน O-Spec)
     , 
ความกว้าง 132 อักษร, ใช้ *inOF เป็นตัวบอกว่าถึง OverFlow ของ Printer File แล้ว
     , ควบคุมการเปิด
/ปิด Printer File เอง (User Control)
ดึงชื่อ โปรแกรมผ่าน เป็นตัวแปร  (ไม่ต้องไป fix ค่าใน O-spec)
ประกาศ F-Spec … UC ต้องสั่ง OPEN ก่อนใช้งาน Printer File
ก่อนพิมพ์ HED010 (Skip Before) เลื่อนกระดาษ 3 บรรทัด

ก่อนพิมพ์ HED010 (Space Before) เลื่อนกระดาษ (0 บรรทัด)
หลังพิมพ์ HED010 (Space After) เลื่อนกระดาษ 1 บรรทัด (ขึ้นบรรทัดใหม่)
B = Blank ให้ Clear ค่านี้หลังพิมพ์
2= Edit Code(2) รูปแบบการพิมพ์  (มี comma, ไม่แสดงเครื่องหมาย -, ถ้าค่าเป็น 0 จะแสดงช่องว่าง, … (ดูตารางด้านล่าง)

 รายงานที่ดูจาก OutQ


สังเกต เนื่องจากใช้เทคนิค  พิมพ์ทับ 2 ครั้ง  หัวกระดาษจะมองไม่เห็น 
       (ทางแก้ไขคือ  พิมพ์เส้นใต้  "ก่อน"  พิมพ์อักษร)




วันพุธที่ 26 มิถุนายน พ.ศ. 2556

Subfile Advance 1

Sub-File Advance -1

อ่านข้อมูลจาก Sub-File

จาก ตย. ก่อนนี้ เราสร้าง Subfile Refer ได้แล้ว
บทความนี้เราจะปรับให้  Subfile Refer รับค่าได้

(ทบทวน) หลักการ

A. จะแสดงอะไร  (เช่น 3 Field, แสดงครั้งละ 10 row, เริ่มต้นที่ row ที่ 8)
B. นำข้อมูลไป ใส่ใน ข้อ A
C. จัดการแสดงผล

เมื่อเทียบกับ หลักการ เราจะปรับแต่ละหัวข้อ  ดังนี้
A.  กำหนดให้มี field    ที่ "รับค่า" (เลือก,ไม่เลือก)
B.  ค่าดังกล่าวใส่ไว้ใน  Subfile
C. (หลังจากแสดงผลแล้ว)  ทำการอ่านข้อมูลจาก Subfile (ตรวจว่ามีการ  เลือก หรือ ไม่)

เมื่อมีการเลือก (โดย  ป้อนค่า)  ใน sub-file  ให้นำค่าที่เลือก  ไปใช้งาน
(เช่น เปิดหน้าจอ  แสดงรายละเอียดเพิ่มเติม)
สิ่งที่ต้องทำ  เพิ่มเติม   มีดังนี้

A. กำหนดให้มี field    ที่ "รับค่า" (เลือก,ไม่เลือก)
     ส่วนการ deign
     ส่วน Code ที่เพิ่ม
B. ใส่ค่าดังกล่าวใส่ไว้ใน  Subfile
     เพิ่ม Code

C. (หลังจากแสดงผลแล้ว)  ทำการอ่านข้อมูลจาก Subfile (ตรวจว่ามีการ  เลือก หรือ ไม่)
เนื่องจาก Sub-file มีผลต่อหลาย rows
ทำให้  เราต้อง "ค้นหา" ว่า  มีการกระทำกับ row ไหน ?
หลังจาก Exfmt  ต้องเพิ่มขั้นตอน ดังกล่าว   กรณีนี้เราใช้ ReadC  (Read Next Change)

แต่เนื่องจากว่า  การป้อน แก้ไขใน Sub-file   รวมถึงการป้อน blank เข้าไปด้วย
ซึ่ง  เราจะเข้าใจตรงกันว่า  ป้อน blank คือ ไม่ได้เลือกอะไร
เพื่อจะแยกกรณีดังกล่าวจึงต้อง"ยกเว้น"  การเปลี่ยนแปลงที่  ป้อน Blank

สรุป

เมื่อเข้าใจหลักการ  การพัฒนาในขั้นต่อไป  ก็ปรับในจุดที่ต้องการ 



วันจันทร์ที่ 24 มิถุนายน พ.ศ. 2556

SubFile แบบง่าย

SubFile แบบง่าย

Subfile-Refer

SubFile เป็นการแสดงผลหลาย record ในหนึ่งหน้าจอ

เทียบกับ DotNet ก็คือแสดงผลแบบ GridView ครับ (แต่ GridView ง่ายกว่ามาก)

20 ปีที่แล้ว เป็นเทคนิคที่สุดยอดมาก  แต่  ณ.ปัจจุบัน เป็นงานพื้นฐาน (ต้องเขียนได้เร็ว)
แต่เนื่องจาก ยังต้องใช้เครื่องมือ (Tool) พื้นฐาน รุ่นเก่า  การสร้างจึ่งต้องมีขั้นตอน

ผู้เขียนโชคดีที่ได้อ่านเอกสารการเขียนโปรแกรมชุดหนึ่ง  (เอกสารจากญี่ปุ่น)
ได้อธิบายแนวทางที่ชัดเจน  สามารถนำไปประยุกต์ต่อได้  มาลองดูกันครับ

หลักการ Subfile (อีกแล้ว)

A. จะแสดงอะไร  (เช่น 3 Field, แสดงครั้งละ 10 row, เริ่มต้นที่ row ที่ 8)
B. นำข้อมูลไป ใส่ใน ข้อ A
C. จัดการแสดงผล

เตรียม data ที่จะใช้งานดังนี้

A. จะแสดงอะไรใน subfile (เช่น 3 Field, แสดงครั้งละ 10 row, เริ่มต้นที่ row ที่ 8)


a.1 รายละเอียดข้างต้น เป็นการกำหนดที่ Display-File
     อยากออกแบบแล้วแสดงผลแบบนี้  (แสดง 2 field, page ละ 4 rows)
     ออกแบบหน้าจอ  จะได้หน้าตาแบบนี้ (ใน STRSDA)
     การ Code ส่วน Sub-File จะระบุดังนี้
     เทคนิค - ใช้ Indicator ตัวเดียว คือ *IN55
     ในส่วน  "รับค่า" และข้อความ  ด้านบน  จะระบุ ถัดไปตามนี้
      การออกแบบ  แยกเป็น 2 record format
- ชนิด Subfile-Data     ใช้บอกโครงสร้าง File (คล้าย File/Field Description) =  SQ0110S1
- ชนิด Subfile-Control    ใช้กำหนด การแสดงผล (คล้าย File Description) = SQ0110C1
     Subfile อ้างอิงไปยัง Subfile Data อะไร
     Subfile Page จำนวนที่แสดงที่หน้าจอ เช่น 4
     Subfile Size  เลือกให้ค่าเท่ากับ Subfile Page หรือ Subfile Page +  1 ก็ได้ครับ
     Subfile End  เหมาะกับ ตย.นี้มาก (อ่านข้อมูลจนหมด)  
        ถ้ายังมีข้อมูลต่อ (next page) ให้แสดงเครื่องหมาย "+" ที่มุมขวาล่างของจอ
     Subfile Record Number ต้องระบุ "ตัวแปร" เพื่อติดต่อ
     กรณีนี้  เมื่อระบุ  ค่า row ใน page จะแสดงที่หน้าจอ page นั้น (เช่น SubFile Page = 4 เมื้อป้อน RRN = 6  Subfile จะแสดงใน page ที่ 2 เป็นต้น)


a.2 กำหนดใน F-spec ต้องประกาศ เพื่อเรียกใช้ Sub-file และระบุ RRN ให้กับมัน
      (ในระบบ DB2 ทุก file ต้องมี RRN กำกับ)


     สำหรับคนที่อยากเข้าใจ Code
     K = Continue Line
            SFILE = ประกาศจะใช้ Sub-File กับ Record Format (DSPF) = SQ0110S1
                     กำหนด RRN ให้กับตัวแปร RRN01 (ยังไม่ได้กำหนดขนาด)

B. นำข้อมูลไป ใส่ใน Subfile (ข้อ A)

b.1 reset ก่อนใช้งาน
      ใน DSP-F เราใช้ *IN55 ควบคุม  การแสดงผล กับ reset (delete)
      RRN01 (อ้างอิงจาก F-Spec) ขนาด 4,0  เริ่มต้นมีค่าเป็น 0 (ไม่มีข้อมูล)


b.2 Loop  อ่านข้อมูลใส่ใน A
      จุดสำคัญ   ต้อง  เพิ่ม RRN ให้ทุกครั้งที่ write Subfile-Data

C. คำสั่งแสดงผล Subfile

แต่เนื่องจาก Subfile มีข้อมูลหลาย rows
การดูผล ก็ใช้ page up/down ได้ หรือ  เลือกการแสดงผลไปที่ page ใดก็ได้ โดยระบุ บรรทัดที่ (RRN)
เช่น  ต้องการให้แสดงที่ page ที่ 2 (RRN= 5 ถึง 8)


หลายคนอาจจะมองว่า จัดแบบนี้ดูแปลกๆ
ในบทต่อๆไป  การจัดแบบนี้จะช่วยให้เรา "ปรับ" แต่งได้ง่ายครับ

สรุป

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



วันพุธที่ 12 มิถุนายน พ.ศ. 2556

Tips:ใช้ PSDS และ INFDS

PSDS และ INFDS  เป็นวิธีการดึงค่าจาก memory ขณะ run มาใช้งาน
แยกเป็น ข้อมูลของ Program กับ ข้อมูลของ File (แต่ละตัว  ต้องระบุ)

PSDS = Program status data structure

ประกาศ SDS ใน I-Spec



ตย. สไตล์การเขียน Report ใน RPG มักจะแสดงชื่อโปรแกรม  ที่มุมบนซ้าย หรือ ขวา
      (เพื่อให้รู้ว่า report นี้มาจากโปรแกรมตัวไหน)  วิธีพื้นฐาน  ก็คือ Fix ค่าใน O-spec เช่น

      code ทั่วไปจะเป็นลักษณะนี้
OQSYSPRT E  2 3           HED010                     
O                                    7 'PG0160R'   

      เคยพบมั๊ยครับ  copy/เปลี่ยนโปรแกรม เป็น PG0161R แล้วลืมเปลี่ยนชื่อตาม
      ???  เวลาตรวจสอบโปรแกรม "ผิดตัว" ทำให้ "เสียเวลามาก" ... แป่ว

ทางแก้ไข   ทำให้เป็น  ตัวแปรซะ  (แล้วทุกครั้งที่เขียนโปรแกรมใหม่  ให้  copy ไปใช้)  ประกาศดังนี้
I           SDS                                      
I                                     *PROGRAM PGMID
I                                      244 253 JOBNAM
I                                      254 263 USR
I                                      264 269 JOBNBR
...
OQSYSPRT E  2 3           HED010                     
O                         PGMID     10 

เราสามารถเพิ่ม  รายละเอียดที่จำเป็น (ในด้าน Securityได้)
เช่น ข้อมูลที่บ่งบอกว่า job อะไรที่เรียกใช้ report

    JOBNAM = ชื่อ Job ที่ทำงานใน iSeries เช่น ชื่อจอ เป็นต้น
    USR = ชื่อ User ที่ Log On เข้าใช้ใน iSeries เช่น  SOMCHAI เป็นต้น
    JOBNBR = run no (มักใช้แยก  กรณีที่ User 1 คนเข้าใช้งาน  )

วิธีประกาศใน RPG-ILE (แตกต่างเล็กน้อย)
D          SDS
D  PROC_NAM    *PROC
D  JOB_NAME    244   253
D  USER        254   263

Keyword อื่นๆที่น่าสนใจ  - (บทความใน internet จะพูดถึงตัวนี้กันมาก)
*STATUS  ใช้ดักจับ Error (คล้าย Try ...Catch ... ใน Dot Net)
ใช้เพื่อดักจับปัญหา  โปรแกรมที่จะเกิด Dump
เช่น อ่านข้อมูล  ชนิด "ตัวเลข"  แต่บางครั้ง  อาจจะพบ อักษรติดเข้ามา (มักพบใน data transfer)
หรือ การอ่านข้อมูลเพื่อ update แต่โปรแกรมอื่น lock record ไว้
Refer
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/books/c092508381.htm
http://wiki.midrange.com/index.php/Program_Status_Data_Structure


INFDS = File Information data structure

ประกาศ  INFDS ใน F-Spec และ I-Spec (เรียก Feedback areas)
INFDS เองจัดกลุ่มข้อมูลไว้ 5 แบบ (ทำให้เลือกใช้ง่ายขึ้น) ได้แก่ File,Open,Input/Output,Device,Get Attribute  ในที่นี้จะเลือก,แนะนำบางตัวที่ควรใช้บ่อยครับ


ตย. สร้าง sub-file Select ไว้มีข้อมูล    5 page
เมื่อ User เลือกตัวเลือก ใน page ที่ 3  แล้วให้โปรแกรม  ไปแสดงผล DSPFW2
เมื่อ DSPFW2 ทำงานเสร็จ  ต้องการให้   ให้กลับไปที่ Page ที่ 3
        ... ถ้าไม่ควบคุม  ตำแหน่งที่แสดงผล จะไปอยู่ที่ page แรกหรือสุดท้าย
        >> code ด้านล่าง  เป็นการเก็บค่า sub-file RRN ไว้  แล้วนำมาบังคับแสดงผล


ตย. Display File : MYDSPF
A          R MYDSPFC1                  SFLCTL(MYDSPFS1) 
...
A            S1RRN1         4S 0H      SFLRCDNBR

ตย  RPG เรียกใช้ INFDS กับ Display File
FMYDSPF CF  E                    WORKSTN      KINFDS WSID 
...

   กำหนด Data Structure เพื่อดึงค่า
IWSID       DS
I                                    B 370 3710CURLOC
I                                    B 376 3770CURRRN
...
C           STP010    TAG
C*          -------------            
C                     EXFMTMYDSPFC1
...                       Select -> show DSPFW2
C                     Z-ADDCURRRN    S1RRN1
C           CURLOC    DIV  256       CURROW
C                     MOD            CURCOL
C*                    ---F4 => *IN04 = '1'
C     04    CURROW    IFEQ 12
C           CURCOL    IFGE 15
C           CURCOL    ANDLE25
C                     EXSR ITEMREF
C                     END

C           CURCOL    IFGE 30
C           CURCOL    ANDLE40
C                     EXSR TERIREF
C                     END
C                     END

C                     GOTO STP010
...


ตย. การสร้าง Help, Prompt จากตำแหน่ง Cursor
ถ้าวางอยู่ตำแหน่ง  Row=12, Col. ระหว่าง   15-25  เมื่อกด F4 = Item No Refer
ถ้าวางอยู่ตำแหน่ง  Row=12, Col. ระหว่าง   30-40  เมื่อกด F4 = Teritory Refer


... หลังแสดงหน้าจอ
ตัวแปร CURRRN จะเก็บตำแหน่ง  RRN ที่เลือกไว้ทำให้เรารู้ว่า User เปิด SubFile Page ไหนล่าสุดไว้ได้
ตัวแปร CURROW,CURCOL จะเก็บตำแหน่ง Cursor สุดท้าย  (ROW,COL) ไว้
(ถ้าเป็น RPGILE ไม่ต้องมา  หาร 256  ดึงค่าได้โดยตรงครับ)

Refer
http://www.ilerpgprogramming.com/2010/11/exploring-program-status-and-file.html


วันศุกร์ที่ 26 เมษายน พ.ศ. 2556

มาคุยเรื่อง Security เป็นเรื่องง่ายกัน


มาทำให้ Security เป็นเรื่องง่าย

หลายๆท่านคงคิดเหมือนผม  หัวข้อนี้มัน  “มั่ว/ยาก” จริงๆ  และมักปรึกษา/ถามใคร ไม่ค่อยได้
ผมจำได้แม่นเลยว่า   ผมข้องใจกับเรื่องนี้มากจนยอมไปอ่านหนังสือ ของ IBM  ขนาดเล่มไม่ใหญ่  แต่เนื้อหาส่วนใหญ่เป็นบรรยาย ... สำหรับคนที่ชอบดูแต่ภาพ (ภาษาไม่แข็งแรง)  ถือว่า งานหนัก
บทความนี้จะตอบคำถามนี้ครับ
Q: มีหลักการ (ย่อ) อย่างไร (ถ้าเข้าใจ น่าจะเดาต่อได้ง่าย)
Q: มี Template อธิบายเข้าใจง่ายๆ หรือไม่ ? (อยากได้ทางลัด)

อยากเข้าใจ  แบบย่อ

ระบบรักษาความปลอดภัย = ใคร   มีสิทธิ์ใช้  Resource  อย่างไร ?
            “นีราพร   ไม่มีสิทธิ์ใช้    Web  ABC  ได้              แต่ ชนิดาภรณ์, จุฑามาศ สามารถใช้ได้”
            “เด็ก   ไม่มีสิทธิ์  ดูทีวีหลัง 22:00                         แต่ผู้ใหญ่ (ทำงานแล้ว)  มีสิทธิ์”
            “ศศศรันย์  ดู File ได้ แต่แก้ไขไม่ได้                     ประทีป  ดูและแก้ไข File ได้”
ประโยคข้างต้น  จัดกลุ่ม  ต้องมี  “นิยาม” กันเล็กน้อย = User, Role (กลุ่ม), Resource (สิ่งที่ควบคุม), Function (รายละเอียดการควบคุม)  ลองจัดกลุ่มจาก ต.ย. ข้างต้นดูจะได้ตามนี้ครับ
            “นีราพร   ไม่มีสิทธิ์ใช้    Web  ABC  ได้              แต่ ชนิดาภรณ์, จุฑามาศ สามารถใช้ได้”
ใคร  (User)
นีราพร , ชนิดาภรณ์, จุฑามาศ
กลุ่ม (Role)
นีราพร

ชนิดาภรณ์, จุฑามาศ
Resource
Web ABC
Function
เปิดใช้
                 
            “เด็ก   ไม่มีสิทธิ์  ดูทีวีหลัง 22:00                         แต่ผู้ใหญ่ ดูได้”
ใคร  (User)
(ไม่มี)
กลุ่ม (Role)
เด็ก

ผู้ใหญ่
Resource
ทีวี
Function
เปิดใช้

             “ศศศรันย์  ดู File ได้ แต่แก้ไขไม่ได้                     ประทีป  ดูและแก้ไข File ได้”              
ใคร  (User)
ศศศรันย์  ,ประทีป
กลุ่ม (Role)
(ไม่มี)
Resource
File
Function
เปิดใช้

กลับมาเรื่อง IT ต่อ

            ผู้ใช้งาน IT  ระดับสังคม (องค์กร) ได้ “เข้าใจ”  ไม่ทางตรง/ทางอ้อม  ของ  “กฏ”  แล้ว   เช่น  
บัตร ATM,รหัสเข้าคอมพิวเตอร์, ระบบฯ, internet       แต่ละคนมี UserID  และรหัสผ่าน    เมื่อสิ่งนั้นมีความสำคัญ (เงินของเรา)   ก็ไม่ควรให้  คนอื่น  ยืมบัตร, บอกรหัสผ่าน  (เรามีสิทธ์ใช้   คนอื่นไม่มีสิทธิ์)
ผู้ที่เริ่มต้น IT มักจะได้รับ  “คำแนะนำ” (คำเตือน)  “ก่อน” เริ่มใช้  
หมายเหตุ  บริษัทฯที่มีมาตรฐาน  จะอธิบายในขั้นตอนก่อนเริ่มทำงาน (Orientation) ... บริษัทได้อธิบาย/เตือนแล้ว  ต่างจาก เรื่องง่ายๆคุณน่าจะคิดได้เอง
            คนที่สั่งให้ทำ Security ก็ต้องเป็น  ผู้นำ(ระดับสูง)   เช่น  เพื่อป้องกันเงิน,ข้อมูลความลับ  เป็นต้น   โดยมอบหมายให้ คนจัดการ Security (Admin)  มักจะมี 1-3 คนเท่านั้นประกาศกฎ   ส่วนคนที่เหลือทั้งหมด (99%) คือ  ผู้ใช้งานตามกฏ   ดังนั้นภาระจะตกกับ Admin     ... คุ้นๆกับ กฏระเบียบในบริษัทฯ , กฏหมายของประเทศมั๊ยครับ   (เรื่องใกล้ตัวมากเลย)

แล้วทำอย่างไร ล่ะ

1.       จัดกลุ่ม แบบง่าย  
    a.       กลุ่ม Role, User  เช่น  { Admin, User }  ,  { Account, Marketing, …  } , { Manager, Member }
    b.      กลุ่ม Resource   เช่น   { Folder, File  } , { Menu , Program }
     Tip : จัดให้หยาบ , Level ไม่เกิน 3 ระดับ  (อย่านำ  ภาพ Org  ที่ซับซ้อนทั้งหมดมาใส่)
            ใช้
Mind Map, Organize Chart  ช่วยวาดรูป
             ถ้าทำงานสไตล์  “ไทย” 
Organize
เขียนไว้แบบหนึ่ง  แต่ทำงานจริง ทำข้ามกลุ่ม  ให้จัดกลุ่มตามที่ทำงานจริ
2.       กำหนด Function
    a.       ทำ Function แบบง่ายก่อน    ใช้ได้ (Access), ใช้ไม่ได้ (Deny)
    b.       Function อย่างละเอียด จะทำภายหลัง จะใช้กับ  กลุ่ม “ใช้ได้”  (ดูได้, แก้ไขได้,  คัดลอก/ลบ File ได้) 
3.       จากการจับคู่  (1.a.) และ (1.b.)  ภายใต้ Function  (2)
    a.       รวบรวม “ข้อยกเว้น” เฉพาะไว้  เช่น  Manager ของทุก Role  ทำได้ทุกอย่าง
     Tip : ไม่มีแบบไหน ที่ดีที่สุด  อาจจะต้องรวม หลายแบบเข้าด้วยกัน
            อาจจะต้องจัดกลุ่ม  (1.a.) และ (1.b.)    ใหม่  (ถ้าทำไม่ซับซ้อน และเร็ว  จะทำใหม่กี่รอบก็ได้)
4.       เช็ค ว่า  “กฏ” ที่กำหนด  ตรงตามต้องการหรือไม่ ?

Template

จาก Organize Chart



1. จัดกลุ่มแบบง่าย
1.a เปลี่ยนกำหนด  Role/User   เริ่มต้นจาก “ง่าย” ไปซับซ้อน  ดังนี้
Figure 1
      มี 3  Role  Level     
-      Manager และ  Assistant  Manager   เป็นสมาชิกของ ทุก Role 
-      ทุกคนใน Role : Account มีสิทธิ์เหมือนกัน
หรือ เพิ่ม  Role : Manager  (ดูดี)  4 Role 2 Level        
ถ้าเลือก  ภาพนี้สุดท้ายต้องทำ
1. สร้าง 3 Role 
2. จัด User ทุกคนเข้าไปที่ Role  (ถ้ามีพนักงาน 50 คนก็ป้อน 50 ครั้ง)
Figure 2
มี 7  Role  Level  คือ  แยก Account เป็น  Account_Head  กับ  Account_Member
1.b กำหนด/จัด Resource  
Figure 3
                จัด 3 กลุ่ม   Resource ตามแผนก  เช่น แยก Folder , ชุดโปรแกรม  ไว้ใน Folder, Lib, Database, …
อาจจะเพิ่ม   Role : All ไว้ด้านบน (ดูเป็น Organize)
ถ้าเลือกภาพนี้   สุดท้าย IT ต้องรวบรวมจัด Folder  Program,Library, Database ให้
ตย. เช่น  สร้างโปรแกรม
Account ไว้ 1 Path เท่านั้น 
Figure 4
                จัด 5 กลุ่ม โดยแยก Resource  ที่อนุญาตให้ทุกคนเข้าได้  ไว้ที่ Share  เช่น  โปรแกรมดูรายงานพื้นฐาน, Table ที่ทุกคนต้องใช้ร่วมกัน (Master)
Figure 5
                10 กลุ่ม  โดยแทนที่จะแยก Share ไปเพิ่มกลุ่มย่อย
2.  กำหนด Function แบบง่าย (ที่สุดก่อน)
Figure 6
                ใน ASP.net การ ACL  แบบง่ายกำหนดไว้แค่นี้ (ผมว่าเพียงพอแล้ว)
                เมื่อเริ่มต้น งานที่ซับซ้อน  ก็จัดการยากแล้ว   ขอให้ทดลองเล่นๆดูก่อน  ว่า “จัดการได้หรือไม่”  ก่อนจะเปิดใช้จริง  ใน Windows, iSeries รองรับรายละเอียดดังนี้ ได้    เรียกใช้ (ดู,แก้ไข),  จัดการ(สร้าง, คัดลอก,ลบ)
3. จับคู่ Mapping  โดยมองเป็นตาราง ดังนี้
Table 1

Resource
Account
Marketing
HR
Role
Account
Access
Deny
Deny
Marketing
Deny
Access
Deny
HR
Deny
Deny
Access
แบบนี้  เข้าใจง่าย และ สร้าง ง่ายที่สุด  (ต้องระบุ/ป้อน 9 ช่อง)
ในระบบการกำหนดค่ามักจะอนุญาตให้ Default ค่าเริ่มเป็น “Deny”  ทำให้ต้องป้อนแค่ 3 ช่องเท่านั้น (เร็ว + ง่าย)
แทนที่จะบอกว่า พนักงาน 50 คนเข้าใช้อะไรได้บ้าง  ก็บอกเป็น “กลุ่ม Role” อะไร ใช้กับ “กลุ่ม Resource” อะไรได้บ้าง
เริ่มเห็นภาพน๊ะครับว่า  ถ้าทำข้อ 1,2 ไว้  ซับซ้อน  ข้อ 3. จะยุ่งยากมาก
Table 2

Resource
Account
Marketing
HR
Role
Manager
Access
Access
Access
Account
Access
Deny
Deny
Marketing
Deny
Access
Deny
HR
Deny
Deny
Access
เมื่อเลือกใช้  Role:Manager  จะเพิ่ม การกำหนด (ป้อน 12 ช่อง)
Table 3

Resource
Account
Marketing
HR
Role
Manager
Manger
Access
Access
Access
Account
Account_Head
Access
Deny
Deny

Account_Member
Access
Deny
Deny
Marketing
Marketing_Head
Deny
Access
Deny

Marketing_Member
Deny
Access
Deny
HR
HR_Head
Deny
Deny
Access

HR_Member
Deny
Deny
Access
จากตารางข้างต้น  ถ้าแบ่ง Head และ Member โดยที่มีสิทธิ ใช้  “เท่ากัน”    ไม่จำเป็นต้องแบ่ง  Head, Member ให้เสียเวลา (ป้อนรวม 21 ช่อง)
ตารางข้างต้น อาจจะมีประโยชน์  ถ้ากำหนด  หน้าที่แบบนี้  Account_Head  สามารถเข้าไปดู Marketing ได้
Table 4

Resource
Account
Marketing
HR
Role
Manager
Manger
Access
Access
Access
Account
Account_Head
Access
Access
Deny

Account_Member
Access
Deny
Deny
Marketing
Marketing_Head
Deny
Access
Deny

Marketing_Member
Deny
Access
Deny
HR
HR_Head
Deny
Deny
Access

HR_Member
Deny
Deny
Access
จำได้มั๊ยครับรวมรวม  อะไรที่ยกเว้นเฉพาะ ไว้   
ตย. ข้างต้น  กรณีพิเศษ เดียว   เราจะไม่เพิ่มโครงสร้าง  “เผื่อไว้”  (เพิ่ม 9 ช่อง เพื่อแก้ปัญหา ช่องเดียว)
เราจะแก้ปัญหาเฉพาะ โดย   ระบุเพิ่ม ว่า 
User-K  (ใน Role:Account)  มีสิทธิใช้ Resource: Marketing 
ใน iSeries เรียกตัวนี้ว่า Grant Authorize   (คำเตือน   ห้ามใช้  โดยที่ไม่เข้าใจเป็นอันขาด   ตย. Grant ให้ User-J มีสิทธ์เท่า Admin  สิ่งที่มันทำคือ  เข้าไปทีละ Object แล้วเพิ่มสิทธิ   ในขณะที่เข้าไป  “มันจะหยุดการใช้ Object ทั้งหมด”  พูดง่ายๆ เครื่องจะ Hang ไป )

FAQ

Q: สร้าง Security เป็นของตนเอง หรือใช้ของ IBM, Microsoft ดี
A: (ความเห็นของผม)  ใช้ของผู้ผลิตดีที่สุด   ลด/เพิ่มได้   (สร้างเอง   ไม่มีทางทำได้ครอบคลุม)
Q: สร้างไว้ใช้เอง อยู่แล้ว   ต้องเปลี่ยนมั๊ย ?
A: ถ้าคุณไม่โดน Audit หรือระบบคุณไม่มีปัญหา  ไม่ต้องเปลี่ยนครับ   ที่แนะนำไว้จะทำให้คุณชั่งน้ำหนักได้ว่าคุณขาดอะไร ?
Q: มีเรื่องอื่น อีกมั๊ย ?
A: มีครับ  แต่จุกจิกและซับซ้อนตามสิ่งที่คุณพบ   เช่น  Role แยกกลุ่มใหญ่อีก (อ่านไม่ผิดกลุ่มใหญ่)  ต้องจัดเข้าไปอยู่ใน AD (windows) ของบริษัทแม่,   ใช้หลาย Server  OS  มี Role ของตนเอง  และ หลากหลาย Role ใน DB เป็นต้น

ไม่ง่ายที่จะสื่อสาร  

คนส่วนใหญ่ไม่ค่อยอยากฟังเรื่องยาก/ปวดหัว   กลายเป็น “หนีปัญหา”  ไปผมเชื่อว่า  ถ้าเรา “หนี” ไม่ได้  ก็วิ่งเข้าใส่  เลยดีกว่า (ถ้ามันไม่ยาก  แล้วมากลัวมัน   ก็ต้องหนีกันชั่วชีวิต)
การบอก “กฏ”(วิธี)   หรือ  เปลี่ยนสิ่งที่รู้สึกว่า  “ได้” / “ห้าม” เป็นการ “เขียน”  มันไม่ง่าย 
“ไม่มีสิทธิ์ใช้” ... ต้องป้องกัน  ไม่ให้รู้เลยว่ามี  หรือ บอกให้รู้  แต่ห้ามไม่ให้ใช้
“ดูได้ แต่แก้ไขไม่ได้” ... File ใน Computer ถ้าดูได้   ก็ต้อง Copy ได้น๊ะ  แก้ไขนับรวม Copy หรือไม่ ?
เขียนสั้นไป  ก็ตีความได้หลากหลาย, เขียนบรรยายยาวเกินไป  ก็ทำให้มากเกิน (ไม่อยากอ่าน = ไม่รู้กฏ)
Q: คุณเคยอ่านหนังสือ “กฏ” ของบริษัท,กฏหมาย รัฐธรรมนูญ มั๊ยครับ ?  (สิ่งที่ต้องรู้  แต่มันมีมาก)
A: มันน่าเบื่อ  (เข้าใจยาก + ต้องใช้เวลา)
Tip : หลายที่ใช้เทคนิค เพื่ออธิบาย ดังนี้ 
            พูด/อธิบาย  แทนการ  ให้อ่านเอง
ช่วงอธิบายยาว  ก็พูดให้ “สั้น”  โดย พูดโดยเน้นเฉพาะเรื่องที่ “ไม่คุ้นเคย”   เช่น “เน้น” กฏการขับรถ  พูดให้คนต่างชาติ (ประเทศเขาขับรถชิดเลนขวา)  แต่คนไทย  ไม่ต้องอธิบาย  
            ย้ายบางเรื่องไปพูดแทรก  ในขณะอธิบาย  ชีวิตประจำวัน  เช่น การใช้เครื่องจักร,  ใช้ห้องสมุด  ก็แทรก “กฏ”
ค้นหา  สิ่งผิดปรกติ   เช่น  การใช้ห้องน้ำ ของคนต่างจังหวัด กับในเมือง (นั่งยอง, นั่งโถ, มีระบบไฟฟ้า)
                Q: คนไทยชอบคิดแบบ “ศรีธนชัย” – ดูเป็นเรื่องสนุกดี (คนรุ่นใหม่ รู้จักกันหรือเปล่าครับ  ถ้าไม่ได้เรียน  คงเคยได้ยิน “กฏ มีไว้แหกกฏ”  หรือ  ขอ “แถ” ไปจนได้)
A: ถ้า “กฏ” ถูกสร้างบนความจำเป็น + เข้าใจ   คนส่วนใหญ่คงไม่  “แถ” ออกไปครับ
ความเห็นส่วนตัว
ทุกคนที่อยู่ในสังคม  มีส่วนในการทำตาม “กฏ”  และมีโอกาศเป็นคน “สร้าง” กฏ  ...  เข้าใจซะ (อย่า ละเลย)
เมื่อเป็น “ผู้สร้าง” กฏ   ก็สร้าง “กฏ ที่ดี” เข้าใจง่าย/รัดกุม
เมื่อต้อง “ทำตาม” กฏ  ก็ทำด้วยความเข้าใจ  (มากกว่า จะแหกกฏ)
---คิดแบบนี้  “สังคม”  จะเป็นระเบียบ---

จริงหรือไม่ ?

ในชีวิตประจำวัน ก็มี “กฏ” เต็มไปหมด  ถ้าเขียนออกมาคงมีมาก 
“กฏ” = ข้อมูล  ที่การถ่ายทอด/สอน  จาก  คนหนึ่ง  ไปอีก คนหนึ่ง   วิธีถ่ายทอด “ที่ง่าย + ดี” คือ  การถ่ายทอด  ผ่านชีวิตประจำวัน
“กฏ”  พื้นฐาน   จะสอนผ่าน  “สังคม” ครอบครัว – เด็กๆ ที่ถูกเลี้ยงด้วยทีวี, เกมส์   ไม่ค่อยมีเวลาคุยกับครอบครัว  ก็จะไม่รู้ “กฏ” ดังกล่าว  ...  คุ้นตามั๊ยครับ   คนรุ่นใหม่ (Gen Y) ใช้มือถือขณะกินข้าวเป็นเรื่องปรกติ   คนรุ่นเก่า ถือว่าเป็น “กฏ” ห้ามทำ ... ระหว่างกินข้าว
ระดับถัดไป คือ “สังคม” ในโรงเรียน/มหาวิทยาลัย
                และสุดท้าย  “กฏ” เฉพาะด้าน  จะถูกอธิบาย  “ก่อน” การใช้  เช่น การขับขี่มอเตอร์ไซต์, ขับรถ, ใช้คอมพ์, เครื่องจักร  เป็นต้น   เป็นหน้าที่ของ ผุ้สอน ที่ต้อง “อธิบาย”  (เริ่มต้นที่  ผู้สอน ก่อน)
                ถ้าในแต่ละ ช่วงเวลา – ไม่คุยกัน-   -หนี/ไม่ฟัง-   -เลี่ยง/ไม่สอน-   จะเกิดอะไร
วันนี้  “คุณ” ได้ทำหน้าที่  “สื่อสารที่ดี”  หรือยัง ?  (เริ่มที่ตนเองก่อน)

สรุป

ถ้ามองอย่างกลางๆ  จะพบว่า  “หลักการ” ไม่ยากอะไร   ขั้นตอนการ “เลือก” แบบที่จะทำ   ต้องแยกแยะสิ่งที่อยากได้(คุ้นเคย) กับ สิ่งที่ต้องทำ ออกจากกัน (ตย. ข้างต้นแสดงให้เห็นว่า  เริ่มทำจาก Organize Chart ของบริษัท  แต่สุดท้ายไม่จำเป็นต้องเหมือน)  และเพื่อให้จัดการง่าย   ควรเน้นความเข้าใจ รวมทั้งปรับวิธีการสื่อสารที่เหมาะสม