Mainframe: TSO and ISPF

ทั้ง TSO และ ISPF เป็น application software เหมือนกับ software ทั่วๆ ไปบน windows แต่สองตัวนี้จะใช้เป็น software หลักๆ บน Mainframe

TSO (Time Sharing Option)
TSO เป็น software ที่เทียบได้กับ command.exe บน windows ที่คอยรับคำสั่งจาก user ไปทำงาน โดยใช้หลักการ time sharing คือ คอมพิวเตอร์ที่ต่อกับ terminal หลายตัว จะแบ่งทำงานตามคำสั่งที่ได้รับ โดย ณ.เวลาหนึ่งจะทำงานแค่คำสั่งเดียวเท่านั้น แต่การทำงานจะเป็นไปอย่างรวดเร็ว ทำให้ดูเสมือนว่าทำงานสนับสนุน terminal หลายตัวไปพร้อมกัน

เนื่องจาก Mainframe แต่ละเครื่องจะมีการ config การเข้าใช้งานที่แตกต่างกัน ตัวอย่างการใช้งาน เช่น เปิดให้เลือกเครื่องก่อน



หลังจากนั้นก็ log in โดยใส่ user id



จากหน้าจอ log in เมื่อจะเข้าใช้ TSO (Time Sharing Option) จะเห็นหน้าจอ Log On Parameter คล้ายๆ กันดังนี้



เมื่อเข้ามาแล้ว ก็เป็นอันเสร็จ เราสามารถ run command ต่างๆ ต่อไป หรือถ้าต้องการดู help ให้พิมพ์ help ก็จะได้หน้าจอประมาณนี้ (ทั้งนี้แตกต่างกันไปแล้วแต่ config ของเครื่องนั้นๆ )




ISPF (Interactive System Productivity Facility)
เนื่องจากความยากในการใช้งานของ TSO ซึ่งจะต้องจำ coommand และลำดับของ parameter ต่างๆ ISPF จึงเกิดขึ้นเพื่อช่วยให้สามารถใช้คำสั่งต่างๆ ได้อย่างสะดวกขึ้น

สำหรับ ISPF ซึ่งจะต้องเรียกผ่าน TSO อีกที โดยพิมพ์ command ISPF ที่หน้าจอ TSO หลังจากที่ มันแสดง TSO ready prompt



เมื่อเข้าหน้าจอ ISPF แล้ว จะแสดงหน้าจอประมาณนี้



ซึ่งเมนูมีอะไรบ้างนั้น ก็จะขึ้นอยู่กับแต่ละเครื่องจะ config อีกเ่ช่นเดียวกัน ISPF จะเปรียบเหมือนหน้า desktop บน windows แต่ละเมนู คือ application ซึ่งแต่ละเครื่องก็จะมี application ให้ใช้แตกต่างกันไป

การจะใช้ ISPF จะใช้ร่วมกับ program function keys (PF keys) หรือ ไอ้ปุ่ม F1 - F12 บนแป้น keyboard เรานั่นแหละ ซึ่ง user แต่ละคนสามารถกำหนดหน้าที่ของแต่ละ function key ได้เอง แต่โดยมาตรฐานแล้วจะกำหนดไว้คล้ายๆ กัน ดังนี้
  • PF1 = Help
  • PF2 = Split: Split the session (lets you use two functions of TSO at the same time.)
  • PF3 = End
  • PF4 = Return
  • PF5 = Rfind (repeat last find)
  • PF6 = Rchange (repeat last change)
  • PF7 = Move Backward
  • PF8 = Move forweard
  • PF9 = Switch between screeens during a split session; goes with PF 2
  • PF10 = Move left
  • PF11 = Move right
  • PF12 = Retrieve last command
นอกจาก PF1 - 12 แล้วใน ISPF และอีกหลายๆ โปรแกรมบน Mainframe ยังมีการใช้ Program Function Key ถึง 24 keys ซึ่ง PF13 - 24 ก็จะใช้ Shift + Function key เช่น
PF13 <-- Shift + PF1 PF14 <-- Shift + PF2 ... เราสามารถให้มันแสดง function key ไว้ข้างใต้หน้าจอ โดยพิมพ์ PFSHOW ON หรือถ้าจะไม่ให้แสดงก็พิมพ์ PFSHOW OFF ได้เช่นกัน


Reference:
Using TSO and ISPF

Oracle: Account is locked

นอกจาก profile จะสามารถกำหนดระยะเวลา เพื่อบังคับให้ user เปลี่ยน password ก็ยังสามารถกำหนดได้ว่า ถ้า user login ผิดติดต่อกันกี่ครั้ง account ก็จะถูก lock เหมือนเรากดรหัส ATM ผิด 3 หน แล้วถึงยึดบัตรนะแหละค่ะ แต่สำหรับใน profile จะกำหนดในตัวแปร FAILED_LOGIN_ATTEMPTS (เช็คได้จาก resource_name column ใน dba_profiles table) ซึ่ง error ที่แสดงตอนที่ login ก็จะแสดงดังนี้

ORA-28000: The account is locked

หรือถ้าต้องการเช็คสถานะ ก็ทำได้ดังนี้

> select account_status, lock_date from dba_users where username = '<username>';

ตัวอย่างของ account ที่ถูกล็อคเป็นดังนี้

ACCOUNT_STATUS LOCK_DATE
----------------------------- ---------
LOCKED 11-SEP-09



ถ้า account ปกติ ค่า account_status จะเป็น OPEN

ถ้าจะ unlock (หรือ lock) ก็ใ้ช้คำสั่งนี้เลยค่ะ

> ALTER USER <username> ACCOUNT <UNLOCK | LOCK>;

สำหรับ วิธีจะแก้ FAILED_LOGIN_ATTEMPTS ใน profile ทำได้ดังนี้ค่ะ

> ALTER PROFILE <profile>
LIMIT failed_login_attempts <value | UNLIMITED | DEFAULT >;



Reference:
Oracle profile

Oracle: Password has expired

ใน Oracle สามารถกำหนด profile ให้แต่ละ user ได้ ซึ่งใน profile นั้นจะกำหนดลักษณะของ user account ได้ โดยผ่าน resource และใน resource นี้เอง DBA สามารถกำหนดได้ว่า จะให้ user นี้จะต้องเปลี่ยน password บ่อยแค่ไหน งงม่ะค่ะ

เช่น userA ใช้ profileA ซึ่งใน profileA กำหนดว่า user จะต้องเปลี่ยน password ทุกๆ 180 วัน แบบนี้เป็นต้น

ดังนั้น user ไม่มีการเปลี่ยน password ในเวลาที่กำหนด password ก็จะ expired และเมื่อ log in ก็จะได้ error แบบนี้

ORA-28001: The password has expired

เราจะรู้ได้อย่างไร ว่า user ไหนใช้ profile ไหน และ profile set ไว้อย่างไร ดูได้ดังนี้ค่ะ

> select profile
from dba_users
where username = '<username>';


ซึ่งตัวอย่างคำสั่งข้างต้นเราจะได้ชื่อของ profile ที่ user นั้นๆ ใช้อยู่ จาก profile ถ้าอยากรู้ว่า profile set ไว้อย่างไร ก็ sql command นี้ค่ะ

> select resource_name, resource_type, limit
from dba_profiles
where profile = '<profile>';


แทนที่ชื่อ profile ที่ได้จากคำสั่งข้างต้น ก็จะได้ผลลัพธ์ออกมาประมาณนี้

RESOURCE_NAME                    RESOURCE LIMIT
-------------------------------- -------- ----------------------------------------
COMPOSITE_LIMIT KERNEL UNLIMITED
SESSIONS_PER_USER KERNEL UNLIMITED
CPU_PER_SESSION KERNEL UNLIMITED
CPU_PER_CALL KERNEL UNLIMITED
LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
LOGICAL_READS_PER_CALL KERNEL UNLIMITED
IDLE_TIME KERNEL UNLIMITED
CONNECT_TIME KERNEL UNLIMITED
PRIVATE_SGA KERNEL UNLIMITED
FAILED_LOGIN_ATTEMPTS PASSWORD 10
PASSWORD_LIFE_TIME PASSWORD 180
PASSWORD_REUSE_TIME PASSWORD UNLIMITED
PASSWORD_REUSE_MAX PASSWORD UNLIMITED
PASSWORD_VERIFY_FUNCTION PASSWORD NULL
PASSWORD_LOCK_TIME PASSWORD 1
PASSWORD_GRACE_TIME PASSWORD 7

16 rows selected.

สำหรับการดูว่า user จะ expired ภายในกี่วัน ดูจาก resouce_name ที่ชื่อ PASSWORD_LIFE_TIME ซึ่งในกรณีข้างต้น password จะ expired ภายใน 180 วัน และ user จะต้องเปลี่ยน password ภายในเวลาที่กำหนดไว้ใน PASSWORD_GRACE_TIME ซึ่งก็คือ 7 วัน มิฉะนั้นแล้ว ก็จะ error ดังข้างต้น

ในกรณีที่ ถ้าเกิด error แล้ว ต้องการจะแก้ไข จะต้องใช้ DBA เป็นคนเข้าไปเปลี่ยน password ของ user คนนั้นค่ะ โดย sql command ดังนี้

> alter user <username> identified by <new_password>;


Reference:
ORA-28001: The password has expired
Oracle profile

State Pattern

The State Pattern allows an object to alter its behavior when its internal state changes. The object will appear to change its class.




ดูแค่ structure จะเห็นว่า state pattern คล้ายกับ strategy pattern มากเลย เรียกว่าเหมือนกะเป๊งเลยดีกว่า แต่ว่า จุดประสงค์ของ 2 pattern ไม่เหมือนกัน state pattern จะเน้นที่ context object หรือ ตัว object หลักของแต่ละ state มีการเปลี่ยนพฤติกรรม ได้ โดยที่ context ไม่รู้ คือตัว state จะเปลี่ยนไปตามแต่ method ที่ถูกเรียก ในขณะีที่ strategy จะถูกโปรแกรมกำหนดให้

Unix, Linux: vmstat command

vmstat เป็นคำสั่งที่ไว้แสดงรายงาน CPU activity, memory, paging รวมๆ ก็คือไว้สำหรับดู performance ของระบบนะเอง

parameter โดยทั่้วไปของ vmstat ก็ีมี
interval หมายถึงระยะเวลาห่างแต่ละที่จะให้แสดงผล
count หมายถึงให้แสดงทั้งหมดกี่ครั้ง

ถ้าเราใช้คำสั่ง vmstat เฉยๆ โดยไม่มี parameter ต่อท้ายเลย จะหมายถึงแสดงค่าเฉลี่ยของทั้งหมดตั้งแต่เครื่องทำงานมา

$ vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 0 79744 255584 861836 0 0 0 2 1 1 1 1 98 0

ถ้าเราใส่ parameter ตัวเดียวหมายถึง จะหมายถึง interval คือ vmstat จะแสดงผลไปเรื่อยๆ (สามารถ ctrl+c ออกมา) โดยบรรทัดแรกยังแสดงค่าเฉลี่ยของระบบ ส่วนข้อมูลบรรทัดถัดไปจะเป็นข้อมูลของระบบ ณ ขณะนั้น ซึ่งจะห่างกันเท่ากับ interval เช่นตัวอย่างด้านล่าง แ่ต่ละครั้งจะแสดงห่างกัน 2 วินาที

$ vmstat 2

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 78876 255584 861844 0 0 0 2 1 1 1 1 98 0
0 0 0 79068 255584 861848 0 0 0 0 63 297 0 0 100 0
0 0 0 79116 255584 861848 0 0 0 0 27 308 0 0 100 0
0 0 0 79116 255584 861848 0 0 0 18 15 301 0 0 100 0
...

ถ้าเราใส่ parameter 2 ตัวก็หมายถึงให้แสดงผลกี่ครั้งเช่น ตัวอย่างด้านล่างให้แสดงผลทุกๆ 2 วินาที และแสดงผลแค่ 5 ครั้ง (รวมที่แสดงค่าเฉลี่ยของระบบด้วย)

$ vmstat 2 5

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 79412 255584 861852 0 0 0 2 1 1 1 1 98 0
0 0 0 79480 255584 861852 0 0 0 10 6 275 0 0 100 0
0 0 0 79480 255584 861852 0 0 0 0 3 272 0 0 100 0
0 0 0 79480 255584 861852 0 0 0 0 3 276 0 0 100 0
0 0 0 79480 255584 861856 0 0 0 0 143 389 3 1 96 0

การอ่านผล

kthr - kernel thread
r - runnable thread คือจำนวนเฉลี่ยของ thread ที่สามารถทำงานได้ ถ้ามีมากกว่าจำนวน CPU ก็แปลว่า thread ที่เหลืออยู่ในสถานะ waiting กำลังรอ CPU ว่าง ซึ่งถ้าจำนวน thread ที่ waiting ว่างๆ มีจำนวนมาก ก็แสดงว่า performance ต่ำ (ก็แปลว่า user อาจจะกำลังรอผลการทำงานของ CPU อยู่ก็ได้)
b - blocked thread คือ thread ที่กำลังรออะไรสักอย่าง อาจจะเป็น filesystem, I/O, memory load ถ้าเยอะๆ ก็แสดงว่า performance ม่ะดี
p - thread ที่รอ I/O แต่ไม่รวมถึง filesystem เช่นเดียวกัน ยิ่งมากยิ่งไม่ดี

cpu - CPU time

us - user mode เปอร์เซนเวลาที่ CPU ใช้ในการทำงานใน user mode ซึ่งเป็นเวลาที่ CPU ทำงานกะ application ที่ไม่ต้องการ kernel resource ในการคำนวณ จัดการ memory หรือการเก็บค่าตัวแปร
sy - system (kernel) mode เปอร์เซนเวลาที่ CPU ใช้ในการทำงานกับ kernel resource เช่นการเรียก system ให้ทำงานอ่านหรือเขียนไฟล์
id - idle คือเปอร์เซนเวลาที่ CPU ไม่มีอะไร และไม่มี pending local disk I/O
wa - คล้ายกับ id แต่ว่า รวมที่มี pending local disk I/O ด้วย


Reference:
IBM System Information Center - vmstat command

Unix, Linux: Bourne shell, C shell, Bourne shell and Bash Shell

Bourne shell เป็น default shell ของ Unix version 7 ขึ้นไป พัฒนาขึ้นในปี 1977 (ก่อนหน้านั้นเป็น Thompson shell ซึ่งเป็น shell ตัวแรก) ชื่อ Bourne ได้ชื่อตามชื่อคนสร้าง Stephen Bourne โดย AT&T Bell Lab

ส่วน C shell (csh) พัฒนามาจาก Thompson shell ที่ได้จาก Unix version 6 ก่อนที่จะเริ่มใช้ Bourne shell ซึ่ง syntax จะคล้ายกับ C แต่เดี๋ยวนี้เค้าไม่ค่อยนิยมใช้กันแล้ว เนื่องจากมีการพัฒนาเป็น Tenex C shell (tcsh) และ Korn shell ก็ได้มีการเลียนแบบ function ต่างๆ ของ C shell ไปพัฒนา

Korn shell (ksh) พัฒนาขึ้นในปี 1980 โดย David Korn จาก AT&T Bell Lab เช่นเดียวกับ Bourne จึงไม่น่าแปลกใจที่ Korn shell จะเป็น backward compatible กับ Borne shell และได้นำ function ต่างๆ ที่มีอยู่ใน C shell ใส่เข้าไปใน Korn shell ตอนแรกตัว Korn shell ยังเป็น software ที่มี license เหมือนกับ software ทั่วไปอยู่ จนกระทั่ง release 93q (ksh93) จึงได้กลายเป็น open source software เต็มตัว และตอนหลังก็ได้ มีการนำมาไว้ใน Linux ด้วย (ลองไปดูกันได้ที่ /bin/ksh) และต่อมาก็ยังมีลูกหลายอีกหลายตัวด้วยกัน เช่น pdksh, mksh, dtksh, tksh ซึ่งสองตัวหลังมีการพัฒนาเป็น GUI ด้วย

Bash shell ย่อมาจาก Bourne-Again Shell เป็น free software shell ซึ่งเกิดมาจาก GNU project สร้างขึ้นเพื่อเลียนแบบ Bourne shell บน Unix ในปี 1987 ดังนั้น Bash shell จึงเป็น default shell ของ OS ทุกตัวที่มาจาก GNU OS เช่น Linux, Mac OS X รวมถึงที่เราใช้ POSIX บน Cygwin ด้วย ข้อสังเกตุนะค่ะ คือ Bash shell เค้าไม่ได้พัฒนามาให้ใช้บน Unix ซึ่งบน Unix ตัว Bourne shell ได้พัฒนาไปเป็น Korn shell ส่วนตัว Bash shell จะใช้แค่บน Linux เป็นหลักเท่านั้น

โดยทุกคำสั่งใน Bourne สามารถใช้ได้บน Bash แต่ว่าไม่สามารถทำในทางกลับกันได้ (คือเสมือนว่า Bash พัฒนา่ต่อจาก Bourne อีกที ดังนั้นก็จะมี function เพิ่มขึ้นมาจากของเดิม) ดังนั้น shell script ของ Bourne จะสามารถใช้ได้บน Bash shell (ยกเว้นว่าใน script มีการใช้ตัวแปรพิเศษที่มีใน Bourne shell เท่านั้น) สำหรับ bash shell script จะขึ้นต้นด้วย # !/bin/sh และยังมีการนำแนวความคิดบางอย่างของ Korn shell และ C shell มาใช้ด้วย เช่น command line editing, command history (เช่นสามารถใช้คำสั่ง history เพื่อดูคำสั่งย้อนหลัง หรือใช้คำสั่ง !! เพื่อ run คำสั่งล่าสุดได้) นอกจากนั้นยังมีความสามารถในการ automatic command line completion (คือการใช้คีย์ tab เพื่อให้ shell เติมชื่อไฟล์ให้ครบถ้วน) และอื่นๆ อีก เช่นการคำนวณ integer ซึ่งเค้่าว่าใน bash shell จะไม่ต้องแตก process เพื่อใช้คำนวณ

Default prompt ของ C shell จะเป็น % ในขณะที่ Bourne shell, Korn shell, Bash shell เป็น $ (ก็ไม่น่าแปลกใจนะค่ะ เพราะว่า ตัว Korn shell กับ Bash shell ได้พัฒนาขึ้นมาจาก Bourne อีกที)

และสำหรับการ redirect standard output และ standard error ก็ต่างกันดังนี้
คำสั่งC shellBourne shell
Redirect standard output>>
Redirect standard errorไม่มีคำสั่งนี้2>
Redirect standard output and standard error>&ไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้ เช่น ls >test 2>test จะ redirect ไปที่ไฟล์ test เหมือนกัน
Redirect standard error to standard outputไม่มี แต่สามารถใช้ >& แทน เพื่อ redirect ไปที่เดียวกันได้2>&1 (ตอนใช้ต้องใช้ติดกันแบบนี้เลยค่ะ ม่ะงั้นมันจะเพี้ยน)
Redirect standard input<<
Redirect standard output; overwrite file if it exists>! หรือ > ให้ผลเหมือนกัน>
Redirect standard output and standard error; overwrite file if it exists>&! หรือ >& ให้ผลเหมือนกันเช่นเดียวกับข้างต้นไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้
Redirect standard output to another command (pipe)||
Append standard output>>>>
Append standard output and standard error>>&เช่นเดียวกับข้างต้นไม่มีในคำสั่งเดียว แต่สามารถใช้แยกทีละอันมาต่อกันได้ เช่น ls >>test 2>>test
Pipe standard output and standard error to another commandไม่มี2>&1|


สำหรับ Korn shell และ Bash shell น่าจะเหมือนกับ Bourne shell นะค่ะ ยังไม่มีโอกาสได้ลอง ไว้ถ้าได้ลองแล้วจะมาใส่ไว้ให้ค่ะ

Reference:
Wikipedia - Bourne shell
Wikipedia - C shell
Wikipedia - Korn shell
Unix Sys Admin
Standard Input and Output Redirection

Unix, Linux: Check CPU and Memory information

สำหรับ CPU ให้คำสั่งนี้

$ cat /proc/cpuinfo

สำหรับ memory

$ cat /proc/meminfo

ผลลัพธ์ก็ดูกันเอาเองละกันค่ะ บางอันก็ไม่ค่อยรู้ความหมายเท่าไร

JIRA: Screen Adjust

เรื่องนี้ค่อยข้างซับซ้อนนิดนึง แต่ก็ไม่ยากเกินความเข้าใจ
เริ่มต้นจาก แต่ละ issue เราสามารถกำหนดได้ว่าจะให้เป็น issue ประเภทไหน หรือว่า เป็น issue type ไำหน เมื่อกำหนดแล้ว เราก็สามารถกำหนดได้ด้วยว่า แต่ละ issue type จะให้แสดงผลอย่างไร นี่คือที่มาบอก issue type screen scheme

สมมุติเริ่มแรก เราก็จะต้อง design ก่อนว่า จะให้หน้าตา JIRA เราีมี screen อะไรบ้าน มีหน้าตาอย่างไร เราสามารถเข้าไปดูหน้าตาที่เราเคยกำหนดไว้ใน JIRA ก่อนได้ โดยจาก tool bar ด้านบน click Administrator
และ เลือกเมนู Issue Fields > Screens ทางด้านซ้าย



จะเห็นว่ามี screen เดิมอยู่บางส่วน เราสามารถ add screen ใหม่ หรือว่าเลือก config screen เดิมก็ได้ ถ้าหลังจากเรา add screen ใหม่เรา เราก็สามารถ config screen ได้ ดังรูป



เราสามารถเลือกใส่ฟิลด์ใหม่ๆ เข้ามาแสดงผลบนหน้าจอ หรือว่าจะแก้ไขลำดับการแสดงผลของแต่ละฟิลด์ก็ได้

กำหนด screen สำหรับแต่ละ operation
เมื่อเราสร้าง screen เรียบร้อยแล้ว เราก็ต้องมากำหนด screen scheme ซึ่งเป็นการกำหนดว่า operation แต่ละอย่าง เช่น create, view และ ตอน edit issue จะให้แสดงหน้าจอแแบบไหน ( โดยไปที่ Administrator เลือกเมนู Issue Fields > Screen Scheme



เช่นเดียวกัน เราสามารถสร้าง screen scheme ใหม่ หรือว่า config อันเดิมก็ได้ ถ้าเรา config อันเดิม ก็จะแสดงหน้าตาดังนี้



จะเห็นว่าด้านล่าง เราสามารถเพิ่มได้ว่า operation อะไร แสดงหน้าจออย่างไร

สำหรับ function นี้ จะไม่มีใน Enterprise Edition ค่ะ เพราะว่าใน Enterprise จะใช้ Issue Type Screen Scheme แทน ถึงกำลังจะกล่าวถึงต่อไปค่ะ

กำหนด screen สำหรับแต่ละ issue type
เช่นเดียวกับ operation เราสามารถกำหนดว่าแต่ละ issue type จะแสดงผลอย่างไรได้ ผ่านทาง issue type screen scheme โดยเลือกเมนู Issue Fields > Issue Type Screen Scheme เช่นเดิม



จากหน้านี้ถ้าเราแก้ไข config ของ screen scheme เดิม เราก็จะเห็นว่าในหน้าจอเปิดให้เราสามารถเลือกได้ว่า issue type อะไรจะแสดงผลโดยใช้ screen ไหน



ก็เอาเป็นว่าคร่าวๆ เป็นดังนี้แล ก็จะเห็นได้่ว่า JIRA ค่อนข้างจะสามารถปรับแต่งได้เยอะทีเดียว ก็คงพอเข้าใจกันมากขึ้นนะค่ะ

Oracle: USER_SEGMENTS กับการเช็ค allocated space

ได้รู้จักกับ segment ใน Oracle ไปแล้วนะค่ะ อย่างที่เคยบอกไปว่า segment จะเก็บโครงสร้างของข้อมูลที่เหมือนกัน หรือว่าก็คือ table หนึ่งๆ นั่นเอง แต่ว่าก็ไม่ใช่ว่า segment จะเก็บ table อย่างเดียว เพราะ index ก็เป็นข้อมูลอีกส่วนหนึ่งของ table ที่จะต้องเก็บด้วย แหละเนื่องจากแต่ละ index มีโครงสร้างไม่เหมือนกัน แหละก็ไม่เหมอืนกับ table ด้วย ดังนั้น index แต่ละ index ก็จะถูกเก็บใน segment ของมันเอง เราสามารถดูข้อมูลของ segment ต่างๆ ได้จาก USER_SEGMENTS ที่เป็น system view ข้อมูลที่ view นี้จะบอกก็มีดังนี้

SEGMENT_NAME - เป็นชื่อของ segment หรือชื่อของ table หรือ index ที่มันเก็บใน segment นั้น เช่นถ้าเรา create table test1 ขึ้นมา ก็จะมี segment ที่ชื่อว่า test1 โผล่มาด้วย

SEGMENT_TYPE
- ประเภทของ segment ซึ่งอาจมีค่าดัีงนี้ TABLE, INDEX segment ประเภทนี้จะเก็บข้อมูลของ table และ index ตามลำดับ แต่เก็บ table หรือ index อะไร นั้นดูได้จาก SEGMENT_NAME) นอกจากนี้ ก็ยังมีประเภท CLUSTER, ROLLBACK, DEFERRED ROLLBACK, TEMPORARY, SPACE HEADER, TYPE2 UNDO และ CACHE

SEGMENT_SUBTYPE - คอลัมน์นี้ก็จะบอก ข้อมูลอีกประเภทหนึ่งของ segment คือ ASSM (Automatic Segment Space Management) ซึ่งระบบจะเป็นตัวจัดการเรื่อง space ที่จะใช้เอง หรือ MSSM (Manual Segment Space Management) ที่ผู้ใช้สามารถระบุ pctused เองได้ นอกจากนี้ก็มีประเภทอื่นอีก แต่ไ่ม่รู้ความหมายเหมือนกันค่ะ เช่น SECUREFILE, NULL ถ้าใครรู้เขียนมาบอกด้วย ก็จะขอบคุณมาก จะได้ไว้ update เผื่อเป็นความรู้ให้คนอื่นๆ ต่อไป

TABLESPACE_NAME - อัีนนี้ก็เป็น tablespace ที่ segment นี้ถูกสร้างขึ้นมา ซึ่งอย่างที่เคยเขียนไว้ก่อนหน้านี้ว่าตอนที่เราสร้าง table เราสามารถระบุ tablespace ได้ว่าจะให้สร้างไว้ที่ tablespace ไหน ซึ่ง segment ที่เก็บข้อมูลของ table ก็จะต้องถูกสร้างไว้ที่ tablespace ที่ระบุไว้

BYTES, BLOCKS, EXTENTS - จำนวนไบต์, block, extent ที่ allocated ให้กับ segment นี้ ไม่ใช่ขนาดของข้อมูลจริงๆ นะค่ะ เหมือนขนาดที่จองไว้

ตัวอย่าง

> select segment_name, bytes, blocks, extents from user_segments where segment_name = 'TEST'

SEGMENT_NAME BYTES BLOCKS EXTENTS
------------------- --------- --------- ----------
TEST 65536 8 1

จากตัวอย่างจะเห็นได้่ว่า table test จองไว้ 8 block ซึ่งคิดเป็น 65536 byte (1 block = 8 KB)

INITIAL_EXTENT - ขนาดของ initial extent
NEXT_EXTENT - ขนาดของ extent ถัดไปที่จะถูก allocate มาให้
MIN_EXTENTS - จำนวน extent ต่ำสุดที่จะมีได้ ซึ่งปกติก็จะเป็น 1
MAX_EXTENTS - จำนวน extent สูงสุดที่จะมีได้ใน segment นั้นๆ
MAX_SIZES - จำนวน block มากที่สุดที่จะมีใน segment นั้นๆ ซึ่งแน่นอน MAX_SIZES ก็จะต้องมีค่ามากกว่าหรือเท่ากับ MAX_EXTENTS ก็คือทุก block จะต้องอยู่ใน extent

นอกจากนี้ก็ยังมีอีกหลายฟิลด์ เช่น RETENTION, MINRETENTION, PCT_INCREASE, FREELISTS, FREELIST_GROUPS, BUFFER_POOL แต่ขอไม่กล่าวถึง เพราะว่าไม่ค่อยเข้าใจมากนัก

Reference:
USER_SEGMENTS view tips

Oracle: Overview for Architecture

อย่างที่ทุกคนรู้โดยทั่วๆ ไปนะคะ่ database ก็จะต้องมี table อาจจะมี view, store procedure หรือ ฯลฯ แต่ลักษณะการเก็บข้อมูลของ table หรือ schema object พวกนี้ทำยังไง

ในทาง physical Oracle เก็บข้อมูลใน database เป็นไฟล์บนฮาร์ดดิสต์ เหมือนข้อมูลของโปรแกรมอื่นๆ (แน่นอนอ่ะนะ เพราะว่าจะเก็บลงดิสต์ ก็คงต้องเป็นไฟล์่ละนะ ยังไม่เคยเห็นวิธีอื่นนิ) หรือที่ Oracle เรียกว่า data files

แต่สำหรับในทาง logical ข้อมูลพวกนี้จะถูกเก็บอยู่ใน data blocks ซึ่งอยู่ใน extents ซึ่งอยู่ใน segments ซึ่งอยู่ใน tablespaces หลายชั้นเหลือเกิน ดูรูปดีกว่า


data blocks หรือจะเรียกว่า logical blocks, Oracle blocks หรือ pages นั่นเอง เป็นหน่วยเล็กที่สุดในการเก็บข้อมูล ซึ่ง 1 blocks โดย default คือ 2 KB (ของ Sybase 1 page = 2 KB)

extents
จะเป็นชุดของ data blocks ที่อยู่ติดกันในเนื้อที่บนฮาร์ดดิสต์

segments
ก็จะเป็นชุดของ extents อีกที แต่เป็น extents ที่เก็บชุดของข้อมูลประเภทเดียวกัน ที่บอกว่าเป็นข้อมูลประเภทเดียวกัน ก็คือข้อมูลที่มีโครงสร้างเหมือนกัน หรือก็คือ table นั่นเอง ดังนั้นใน extents ใดๆ ใน segment หนึ่ง ก็จะเก็บข้อมูลของ table A เหมือนกัน หรือ table B เหมือนกัน แบบนี้เป็นต้น สำหรับ non-cluster table จะถูกเก็บอยู่ใน 1 segment ซึ่ง segment นี้จะถูกสร้างขึ้นมาพร้อมกับคำสั่ง create table/snapshot
ใน 1 segments จะต้องมีอย่างน้อย 1 extent เรียกว่า initial extent ไว้สำหรับเก็บข้อมูล ซึ่งเวลาที่ segments เต็ม หรือก็คือ extents ที่อยู่ใน segment เต็มหมดแล้ว Oracle จะ allocate เนื้อที่ให้เป็น extent ใหม่ ซึ่ง extent ใหม่อาจจะเป็นเนื้อที่ที่ติดกัน หรือไม่ติดกัน บนฮาร์ทดิสต์ก็ได้ หรือขยาย extent เดิมที่มีอยู่แล้วก็ได้

tablespaces
เป็นหน่วยใหญ่สุดของ logical storage unit ซึ่งใน 1 tablespace ก็จะมีหลายๆ segments และใน 1 tablespaces นี้อีกเหมือนกันจะประกอบไปด้วย data files ซึ่งอาจจะมี 1 data files หรือมากกว่านั้นก็ได้

Oracle จะใช้ tablespace เนี้ยะแหละในการควบคุมโควต้าการใช้เนื้อที่ของ user และการใช้เนื้อที่ในดิสต์ของ database เช่นในตอนที่ create user ได้ว่าจะใช้ user คนนี้ใ้ช้ tablespace อะไรที่โควต้าเท่าไร เช่น ตัวอย่างนะค่ะ

CREATE USER &username
IDENTIFIED BY &password
DEFAULT TABLESPACE &user_tablespace
QUOTA 100M on &user_tablespace
TEMPORARY TABLESPACE TEMP
QUOTA 5M on SYSTEM

แต่คิดว่าน่าจะมีอย่างอื่นอีก ถ้ารู้เพิ่มเติมแล้วจะมีอัพเดตให้อีกนะค่ะ

Data Block

กลับมาพูดถึง data blocks ที่เป็นหน่วยย่อยสุดกันบ้าง เพราะว่า data block ก็คือกลุ่มของ physical byte บน ดิสต์นะเอง แต่ว่าเป็นคนละตัวกับ I/O block ของ OS โครงสร้างของ block ก็เป็นตามรูปเลยฮับ

Header (Common and Variable) เป็นส่วนที่เก็บข้อมูลของ block นั้นๆ เช่น address, ประเภทของ segment (data, index) ขนาดของ header จะไม่คงที่

Table Directory เก็บข้อมูลของ tables ที่มีข้อมูลอยู่ใน block นั้นๆ

Row Directory เป็นส่วนที่เก็บข้อมูลของแต่ละ row ใน block นั้น และ address ที่เก็บ row นั้นๆ ด้วย

Row Data ส่วนนี้เป็นส่วนที่เก็บข้อมูลจริงๆ ของ row แล้วค่ะ ซึ่งเค้าบอกว่า ใน 1 row อาจจะใหญ่กว่า block ก็ได้ก็คือมีข้อมูลอยู่ในหลายๆ block

Free Space เหมือนชื่อเลยคะ่ เป็นที่ว่างๆ ที่ไว้สำหรับใส่ข้อมูลของ row ที่เพิ่มเข้ามา หรือว่าไว้สำหรับข้อมูลที่จะ update ใน row เดิมที่อยู่ใน block นั้นๆ อยู่แล้ว


มีตัวแปรอยู่ 2 ตัวที่ใช้ในการควบคุมการใช้พื้นที่ใน block คือ PCTFREE และ PCTUSED


PCTFREE เป็นตัวบอกเปอร์เซ็นพื้นที่ว่าง เพื่อบอกว่า block นี้เต็มหรือยัง เช่น ถ้า pctfree 20 ก็คือถ้า block นั้น มีพื้นที่ว่างน้อยกว่า 20% จะถือว่าเต็มแล้ว และจะไม่อนุญาตให้ insert ข้อมูลเพิ่มเข้ามา แต่ยังคงให้ update ข้อมูลที่อยู่ใน block ได้

PCTUSED เป็นตัวบอกเปอร์เซ็นพื้นที่ที่ใช้ไป เพื่อบอกว่า block นี้ว่างแล้ว และพร้อมที่จะรับข้อมูล insert เข้ามาใหม่ได้ เช่น ถ้า pctused 40 ก็คือถ้า block นั้นจะต้องมีพื้นที่ใช้ไป น้อยกว่า 40% จะถือว่า block นี้ว่างและพร้อมจะกลับมารับข้อมูลที่จะ insert เข้ามาใหม่ได้อีก

ตัวอย่างการใช้ pctfree, pctused บน create table script
CREATE TABLE EMP1
( EMPNO NUMBER(4,0),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4,0),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2,0)
) tablespace test PCTFREE 50 PCTUSED 30

แต่การใช้ pctused ใช้ได้เฉพาะกับ table ที่ไม่ได้สร้างใน ASSM tablespace (automatic segment space management) เท่าันั้น สำหรับ version 10 table ที่สร้างใน ass managed tablespace ค่า pctused จะเป็น null เสมอ (ในตัวอย่างก็เลยสร้าง table ใน tablespace อื่น)
และสำหรับ version 9 ลงไป มันจะไม่สนใจค่านี้เลย แต่ว่าจะใส่ค่าที่ระบบกำหนดลงไปแทน

Reference:
Oracle Architecture & Terminology
pctfree, pctused - Database Forum

Sybase: sp_spaceused <table> กับการคำนวณ row per page

คำสั่ง sp_spaceused ถ้าใช้โดยไม่ใส่ parameter ด้านหลังจะเป็นการแสดงค่าประมาณของ disk space ของทั้ง database ซึ่ง result ที่ได้มีสองส่วน คือ

> sp_spaceused

1. เนื้อที่ที่ database จองไว้ จึงเป็นค่าคงที่ ยกเว้นมีการเพิ่มเนื้อที่ให้กับ database นั้นๆ

database_name   database_size
--------------- ---------------------------
master          5 MB


2. แสดงค่าประมาณของเนื้อที่การใช้งานของ database

reserved    data        index_size  unused
---------   ---------   ----------- --------
2176 KB     1374 KB     72 KB       730 KB


ผลรวมในข้อ 2 จะประมาณใกล้เคียงกับข้อ 1 ซึ่ง แต่ทั้งนี้เพราะว่าเป็นผลแค่การประมาณเท่านั้น แต่ก็สามารถนำมาใช้ในอ้างอิงได้

สำหรับการใช้ sp_spaceused ที่ตามด้วยชื่อ table จะเป็นการดูการประมาณการใช้เนื้อที่ของ table นั้นๆ

> sp_spaceused xxx

name     rowtotal  reserved  data    index_size unused
-------- --------- --------- ------- ---------- ----------
xxx          42955 97554 KB  4340 KB 92140 KB   1074 KB


ซึ่งเราสามารถนำค่าที่ได้มาหาจำนวน row per page ได้ เช่นตัวอย่างข้างต้น
table นี้ใช้เนื้อที่เก็บ data 4340 KB / 2 KB (default 1 page = 2 KB) = 2170 pages
ดังนั้น row / page = 42955 rows / 2170 pages = 19.79
หรือใน 1 page ของ table จะมีประมาณ 19 หรือ 20 rows

หรือถ้าเราใส่ parameter ต่อท้ายเข้าไปอีก ก็จะเป็นการแสดงการประมาณการใช้เนื้อที่ของ index ของ table นั้นๆ

> sp_spaceused blurbs,1

index_name           size       reserved   unused
-------------------- ---------- ---------- ----------
blurbs               0 KB       14 KB      12 KB
tblurbs              14 KB      16 KB      2 KB


name       rowtotal reserved    data    index_size unused
---------- -------- ----------- ------- ---------- ----------
blurbs            6 30 KB       2 KB    14 KB      14 KB



Reference:
Sybase System Procedures: sp_spaceused

Sybase: sp_help <table>

sp_help เป็นคำสั่งที่ช่วยแสดงข้อมูลหลายๆ อย่าง สำหรับ คำสั่ง sp_help โดยไม่ใส่ parameter ด้านหลัง ผลลัพธ์แรกที่ได้คือมันจะแสดงรายการ sysobjects ซึ่งก็คือพวก ชื่อ table, view และ owner ของ table หรือ view มันยังให้ผลลัพธ์ต่อมาอีกหลายอัน เช่น รายการ systypes หรือก็คือ user-defined datatype ต่อมาอีก

แต่สำหรับ คำสั่ง sp_help ที่ตามด้วย ชื่อ table นั้น จะแสดงรายละเอียดที่เกี่ยวกับ table นั้นๆ มากมาย
> sp_help test

1. แสดงข้อมูลของ table คล้ายกับข้อมูลตอนที่ไม่ใส่ parameter คือ ชื่อ table, owner ของ table, ประเภทของ table หรือ object นั้น (user_table, stored procedure, etc.)

Name                  Owner             Object_Type     Create_date
--------------------- ---------------    -----------     -----------------
publishers             dbo                user table     Oct 7 2005 11:14AM

ข้อมูลส่วนที่น่าสนใจ ก็คือ owner ของ table และวันที่สร้าง table ซึ่งข้อมูลพวกนี้ทั้งหมดมีอยู่ใน sysobjects


select crdate from sysobjects where name = 'test'

แต่ว่า sp_help จะช่วยให้เราอ่านข้อมูลได้ง่ายขึ้น ตั้งแต่การตั้งชื่อ column ที่สามารถเข้าใจได้ การแสดง owner เป็นชื่อ แทนที่จะแสดงเป็น id เหมือนกับใน sysobjects ซึ่งถ้าเราอยากรู้ว่าเป็นใครก็จะต้องไป query ต่อที่ sysusers อีกทีฮับ

2. แสดงข้อมูล column ที่อยู่ใน table นั้น

Column_name Type  Length  Prec  Scale  Nulls  Default_name  Rule_name
Access_Rule_name  Computed_Column_object    Identity
----------  ----  ------  ----- -----  -----  ------------  -----------
----------------  -----------------------    --------
pub_id     char       4    NULL    NULL     0  NULL         pub_idrule
           NULL                    NULL          0
pub_name   varchar   40    NULL    NULL      1           NULL
           NULL                    NULL          0
city       varchar   20    NULL    NULL      1           NULL
           NULL                    NULL          0
state       char      2    NULL    NULL      1           NULL
           NULL                    NULL          0

อันนี้ช่วยได้มากค่ะ ถ้าเราอยู่หน้าจอ console ที่เราไม่มี GUI สำหรับดูว่า table นั้นมี columns อะไรบ้าง ข้อมูลเหล่านี้จะบอกเราได้ ซึ่งมีตั้งแต่ชื่อ column, data type, size ซึ่งเราก็สามารถคำนวณขนาดของ row ได้แบบคร่าวๆ จากขนาดของแต่ละ column มาบวกกันด้วย

3. index ของ table นั้นๆ

index_ptn_name        index_ptn_seg
--------------------  ---------------
p1                     default
p2                     default
p3                     default
title_idx_98505151     default

เช่นเดียวกับ column นอกจากจะบอกว่ามี column อะไรแล้ว ยังบอกด้วยว่า table นี้มี index อะไรบ้าง

8. ผลลัพธ์ที่ 8 จะแสดงจำนวน page ที่ใช้สำหรับเก็บข้อมูล ซึ่งมีทั้งที่แบบเฉลี่ย จำนวนมากสุด ต่ำสุดของ page (default Sybase 1 page = 2 MB)

Avg_pages  Max_pages  Min_pages  Ratio(Max/Avg)  Ratio(Min/Avg)
---------  ---------  ---------  --------------  --------------
1          1          1  1.000000        1.000000

จริงๆ sp_help ยังแสดงข้อมูลอีกหลายอย่าง แต่เท่าที่อ่านได้และเป็นประโยชน์ก็มีดังนี้แล

Reference:
Sybase System Procedure sp_help

Oracle: Listener

ที่เคยทำงานมา มีบางครั้งที่เราก็ start Oracle ขึ้นมาแล้ว แต่ก็ยังไม่สามารถ connect ได้ หาไปหามาก็รู้ว่า เป็นเพราะว่า ตัว listener ไม่ได้ start ก่อนจะ start listener ก็ควรจะต้องเช็คดูก่อนว่า listener ทำงานอยู่หรือเปล่า โดยใช้คำสั่ง

> lsnrctl status

ถ้าเห็นแล้วว่า lsnrctl ไม่ได้ทำงานอยู่ ก็ start listener ด้วยคำสั่ง

> lsnrctl start


และ ถ้าเช็ค status อีกทีจะได้ผลดังข้างล่าง

LSNRCTL for Linux: Version 11.1.0.6.0 - Production on 29-JUL-2009 10:57:29

Copyright (c) 1991, 2007, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.1.0.6.0 - Production
Start Date 29-JUL-2009 10:40:20
Uptime 0 days 0 hr. 17 min. 8 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /apps/oracle/product/11.1.0/db_1/network/admin/listener.ora
Listener Log File /apps/oracle/diag/tnslsnr/wtsdev02/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost6.localdomain6)(PORT=1521)))
Services Summary...
Service "DEV20" has 1 instance(s).
Instance "DEV20", status READY, has 1 handler(s) for this service...
Service "DEV20XDB" has 1 instance(s).
Instance "DEV20", status READY, has 1 handler(s) for this service...
Service "DEV20_XPT" has 1 instance(s).
Instance "DEV20", status READY, has 1 handler(s) for this service...
Service "SIT20" has 1 instance(s).
Instance "SIT20", status READY, has 1 handler(s) for this service...
Service "SIT20XDB" has 1 instance(s).
Instance "SIT20", status READY, has 1 handler(s) for this service...
Service "SIT20_XPT" has 1 instance(s).
Instance "SIT20", status READY, has 1 handler(s) for this service...
The command completed successfully


หรือถ้าเราต้องการจะ stop listener ก็ใช้ command lsnrctl เหมือนดัง

> lsnrctl stop

คำสั่ง lsnrctl ยังมีคำสั่งอื่นๆ อีก สามารถหาอ่านเพิ่มเติมได้จาก reference ด้านล่างเลยฮับ

Jira: Project management

เราสามารถใช้ Jira ในการบริหารงานต่างๆ ในโปรเจคได้ แต่ก่อนที่จะใช้โปรเจคควบคุมงานต่างๆ ก็จะต้องกำหนดโปรเจคก่อน สามารถกำหนดได้หลายอย่าง
  • Issue Type Scheme เป็น scheme ที่บอกว่าใน scheme ประเภทนี้จะมี issue type อะไรบ้าง
  • Notification Scheme ลักษณะการ notify เช่นอยากให้ส่งเมล์เมื่อมีการส่งงานไปให้สมาชิกในโปรเจค
  • Permission Scheme กำหนดการเข้าขึ้นข้อมูลในโปรเจค
  • Issue Security Scheme กำหนดระดับการป้องกัน
  • Issue Type Screen Scheme เป็นการบอกว่า แต่ละ issue ที่เราใช้จะแสดงผลอย่างไร อันนี้รายละเอียดค่อนข้างยาว ไว้จะลองเขียนถึงครั้งถัดไปนะฮับ (ถ้ามีเวลา)
  • Workflow Scheme กำหนดลำดับการเปลี่ยน issue status ของแต่ละ issue type
  • Project Team กำหนดสมาชิกในโปรเจคว่าจะทำหน้าที่ใน role อะไร ซึ่งจะเชื่อมโยงกับการให้สิทธิ์ใน Permission Scheme ด้วย
  • Component ว่าในโปรเจคที่ทำอยู่จะประกอบไปด้วย module อะไรบ้าง
  • Version กำหนด version ของโปรแกรมที่จะออกมา ซึ่งในส่วนนี้จะช่วยในการทำ release notes ของแต่ละ version ได้ด้วย
ก็จะเริ่มเห็นเป็นรูปเป็นร่างบ้างแล้วว่า Jira ไว้ทำอะไร ถ้าอยากรู้รายละเอียดก็ต้องลองหามาใช้กันดูนะจ๊ะ แต่ว่าโปรแกรม Jira ไม่ได้ฟรีนะ บริษัทไหนอยากใช้ก็ต้องลงทุนกันหน่อย

ก็จะขอจบในส่วนนี้ไว้เท่านี้แหละ เนื่องจากโปรแกรมไม่ฟรี ก็จะมี document ค่อยข้างดี ที่บริษัททำไว้ให้สำหรับลูกค้าอยู่แล้ว

Reference
Jira project mangement

MVC บน Servlet

การนำ MVC มาใช้กับ Servlet และ JSP นั้น เราจะให้

Java object เป็น model
JSP เป็น view
Servlet เป็น controller

ง่ายๆ แบบนี้แหละ จบ.

Tomcat: Web Container

Web Container มีำไว้สำหรับรับ request เพื่อส่งต่อให้กับ servlet แต่ละตัว และยังช่วยการทำงานด้านอื่นๆ เพื่อให้การเขียน servlet ทำได้ง่ายขึ้น และผู้พัฒนาสามารถมุ่งไปที่ business ที่ต้องการจัดการมากกว่าจะต้องมาจัดการกับสิ่งรอบข้าง

ส่วนที่ Web container จัดการให้มีดังนี้
- Communication support ช่วยจัดการเรื่อง socket และ network ต่างๆ
- Lifecycle management จัดการ life cycle ของ servlet
- Multithreading support จัดการการทำงานของ thread เนื่องจากแต่ละ request หมายถึงการสร้าง thread 1 ตัวขึ้นมาเพื่อรับ request
- Declarative security จัดการเรื่อง security ซึ่งสามารถกำหนดได้จาก deployment descriptor (web.xml)
- JSP support


Tomcat คือเป็น web container ตัวหนึ่ง ซึ่งมีความสามารถทำงานพื้นฐานของ HTTP web server แต่ Tomcat จะทำหน้าที่นี้ไม่ได้ดีเท่า Apache (Apache ถือเป็น web server แต่ว่าไม่ได้เป็น web container)
ส่วนพวก WebLogic, Websphere, JBoss เป็น J2EE application server หรือเรียกย่อๆ ว่า application server ซึ่งสามารถทำหน้าที่ web container และ EJB container ได้ด้วย

แต่อย่างไรก็ตามสำหรับการทำงานของ Servlet สามารถใช้แค่ web container ได้ ไม่จำเป็นต้องใช้ application server

รูปด้านข้างจะแสดงโครงสร้างเวปใน Tomcat

ข้อควรรู้เสริมนิดหน่อยสำหรับการ implement JSP และ JSTL ใน Tomcat

Tomcat VersionServletJSP VersionJSTL Version
62.52.11.2
52.42.01.1

สำหรับการ config อีกเรื่องหนึ่งของ Tomcat ก็คือ Authentication ซึ่ง Tomcat ใช้ tomcat-users.xml ที่อยู่ใน conf/ directory ในการกำหนดผู้ใช้ ตัวอย่างเช่น Tomcat manager ที่เป็น web application ที่มากับ tomcat ก็จะใช้ตัวนี้ในการ Authenticate ผู้ใช้ ซึ่งผู้ที่จะใช้ web application นี้ได้จะต้องมี role เป็น manager ดังนี้

<tomcat-users>
<role rolename="manager"/>
<user username="admin" password="xxxx" roles="manager"/>
</tomcat-users>

นอกจากนี้เรายังสามารถกำหนด role และ user เพิ่มเติมได้

reference:
Jstl Tag Lib Definitions
Apache Tomcat - Which Version Do I Want?

Jira: Start, stop process and check status

Jira has start/stop script in $JIRA_HOME/bin directory. So it's easy.

To start, just run (on Linux or Windows use startup.bat instead)

> ./startup.sh

To stop, just run (on Linux or Windows use shutdown.bat instead)
> ./shutdown.sh

To check jira process, you can check process with grep jira that has –Datlassian.standalone=JIRA

> ps -ef | grep jira

Jira: Workflow

ตัวอย่าง flow ด้านซ้ายเป็นการทำงาน สำหรับ Issue, Change Request หรือ Risk ส่วน flow ด้านขวาเป็นการทำงานของ Defect

Jira: Overview

Jira คือโปรแกรมที่ช่วยจัดการงานต่างๆ ในโปรเจค ใน Software Development project ส่วนใหญ่ก็จะประกอบไปด้วยงานหลายๆ งาน งานพัฒนาฟังก์ชั่นงานต่างๆ หรืองานทดสอบฟังก์ชั่นงานที่ได้พัฒนาขึ้น ซึ่ง Jira ช่วยในการติดตามงานต่างๆ และยังสามารถแบ่งงานออกเป็นเฟสต่างๆ หรือที่เรียกว่าเป็นแต่ละรีลิส (release) นอกจากนั้นยังสามารถสร้าง release notes ที่จะใช้เป็นเอกสารร่วมกันการ release

งานในแต่ละงานใน Jira แ่บ่งเป็นแต่ละประเภท ตัวอย่างเช่น
  • Bug ปัญหาการทำงานของโปรแกรม
  • Improvement งานที่จะ้ต้องพัฒนาให้ดีขึ้น
  • New feature ฟังก์ชั่นงานที่ต้องการจะเพิ่มเข้ามาในระบบ
  • Task งานทั่วไปที่จะต้องทำให้สำเร็จ
แต่ในการใช้งาน Jira เราสามารถปรับแต่งประเภทของงานได้ตามที่เราต้องการ ไม่จำเป็นต้องใช้ตามนี้ ตัวอย่างการปรับแต่งประเภทของงานนะค่ะ
  1. Project management type
    • Task - หมายถึงงานทั่วๆ ไป หรือปัญหาที่ต้องได้รับการแก้ไขในโปรเจ็ค
    • Risk - งานที่ทำเพื่อป้องกันปัญหาที่จะเกิดขึ้นในอนาคต
    • New Feature - หมายถึง การทำงานของโปรแกรมที่ต้องการให้มีการเปลี่ยนแปลง แก้ไข

  2. Analysis and Design type
    • Story - งานที่เกี่ยวข้องกับการวิเคราะห์ระบบ เช่นการทำ Use Case, Activity Diagram
    • Model - งานที่เกี่ยวข้องกับการออกแบบระบบ เช่น การทำ Class Diagram, Database Diagram

  3. Development type
    • Code - หมายถึงงานพัฒนาโปรแกรม

  4. Testing type
    • Test Event - หมายถึงการทำ Test Script
    • Test Execution - หมายถึงการตรวจสอบการทำงานของโปรแกรม โดย Test Script ที่ได้ทำจาก Test Event
    • Bug - ในกรณีที่ตรวจสอบแล้วพบข้อบกพร่องในการทำงาน ก็จะต้องสร้างเป็น Defect เพื่อส่งกลับไปให้นักพัฒนาระบบแก้ไข

  5. Deployment type
    • Release Task - เมื่อทดสอบและแก้ไขแล้ว ก็จะต้อง release หรือติดตั้งโปรแกรมบน server ซึ่งอาจจะเป็น development server หรือ production server ก็แล้วแต่ เรียกว่าเป็น Release Task

และความสำคัญ (Priority) ของแต่ละงานสามารถแบ่งได้ตามตัวอย่าง
  • Blocker เป็นงานที่ถ้าไม่ทำให้เสร็จ ก็จะกันไม่ให้งานอื่นๆ สำเร็จได้ คือเป็นงานที่ block ชาวบ้านนั่นเอง
  • Critical เป็นงานที่มีความสำคัญมาก ซึ่งทำให้การทำงานในฟังก์ชั่นใดๆ ไม่สามารถทำงานได้
  • Major เป็นงานที่มีผลกระทบกับการทำงานโดยรวม
  • Minor เป็นงานที่กระทบกับการทำงาน แต่น้อย ซึ่งโปรแกรมยังสามารถทำงานต่อไปได้
  • Trivial เช่นการแก้ไขคำผิด หรืองานใดๆ ที่ไม่มีผลต่อการทำงานของฟังก์ชั่น
งานแต่ละงานใน Jira จะเก็บรายละเอียดดังกล่าวข้างต้นแล้วยังเก็บ หัวข้อ, รายละิเีอียดของงาน, ความคิดเห็นที่โต้ตอบไปมาเกี่ยวกับงานนั้นๆ และยังสามารถ attach file รายละเอียดหรือข้อมูลเพิ่มเติมในงานแต่ละงานได้ และเก็บเวลาที่ใช้ในการทำงานของแต่ละในงานหนึ่งๆ ได้ เพื่อใช้ในการประเมินงาน และเป็นสถิติของโปรเจคต่อไป

Jira ยังมีความสามารถอื่นๆ ที่ช่วยในการทำงานของโปรเจคได้ ดังจะเห็นว่าหลายๆ โปรเจค รวมทั้ง open source project ก็ยังนำโปรแกรมตัวนี้มาช่วยในการทำงาน เนื่องจากเป็น web application ทำให้ user ไม่ต้องลำบากในการลงโปรแกรม และยังเข้าถึงได้ง่าย

Reference:
Jira User's Guide: What's an Issue?

Query Optimizer

ก่อนจะพูดถึงเรื่อง optimizer เราจะต้องทำความเข้าใจในเรื่อง index ก่อนดังนี้
Primary Index หรือ clustered index คือ index บน column ที่ระบุ physical sequence ของ table
หมายถึงว่า table นั้นได้ถูกเรียงไปในทางเดียวกัน index

Secondary Index หรือ non-clustered index คือ index บน column ที่ไม่ได้ระบุ physical sequence ของ table

Statistic ใน database จะเก็บ

  • nr จำนวน tuple in relation r
  • br จำนวน block containing tuples of relation r
  • sr ขนาดของ tuple ของ relation r
  • fr จำนวน tuple ใน 1 block
  • V(A, r) จำนวนของ distinct value ใน attribute A ใน relation r
  • SC(A, r) คือ selection cardinality ของ attribute A ของ relation r


optimizer จะเลือกแต่ะละ plan นั้นดูจาก cost แต่ละ plan
สำหรับ basic algorithms มีด้วยกัน 2 algorithm
A1 (linear search) หรือเรียกว่า table scan
A2 (binary search) โดยจะใช้ได้ต่อเมื่อ table ถูก physically sort เท่านั้น

สำหรับกรณีที่มี index ร่วมด้วย มีด้วยกันอีก 3 algorithm
A3 (primary index on candidate key, equality) cost จะเท่ากับ HTi + 1
A4 (primary index on non-key) cost จะเท่ากับ HTi + number of blocks containing retrieved records
A5 (secondary index) สำหรับ candidate key cost จะเท่ากับ HTi + 1 แต่ละสำหรับ non-key จะเท่ากับ HTi + number of records retrieved

algorithm ที่กล่าวไปแล้ว สำหรับการ select แบบ equal แต่ในกรณีที่มีการ comparison เข้ามาด้วยจะมีอีก 2 algorithm
A6 (primary index, comparison)
A7 (secondary index, comparison)

ซึ่งแต่ละ algorithm ก็จะมี วิธีการคิด cost ที่แตกต่างกันไป ซึ่ง