COBOL: structure

สำหรับ COBOL ใน Mainframe จะต้องมีโครงสร้าง column เข้ามาร่วมด้วย ดังนี้

  1. column 1-6 เป็น sequence number
  2. column 7 ไว้ใส่ตัวอักษรที่มีความหมายพิเศษ
    • * แสดงว่าบรรทัดนั้นเป็น comment
    • - แสดงว่าบรรทัดนี้ต่อมาจากบรรทัดข้างบน
  3. column 8-11 เป็น area A ซึ่งไว้ใส่ division ในโปรแกรม
  4. column 12-72 เป็น area B ไว้ใส่ code อื่นๆ นอกจาก division
  5. column 73-80 เป็น optional ที่แสดง program identification or comments
ซึ่งโครงสร้างด้านล่าง จะละ column 1-7 ไว้ (เนื่องจากไม่ได้ใส่ comment) code จะเริ่มที่ column 8 เป็นต้นไป


IDENTIFICATION DIVISION.
PROGRAM-ID
ProgName.
[AUTHOR
Desc.]
[INSTALLATION
Desc.]
[DATE-WRITTEN
Desc.]
[DATE-COMPILED
Desc.]
[SECURITY
Desc.]

[
ENVIRONMENT DIVISION.

[INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT
FileName
[ASSIGN [TO] DISK|PRINTER.]
[ORGANIZATION IS SEQUENTIAL|LINE SEQUENTIAL|RELATIVE|INDEXED.]
[ACCESS MODE IS SEQUENTIAL|RANDOM|DYNAMIC.]]]

DATA DIVISION.
[FILE SECTION.
FD
FileName [RECORD MODE [IS] BINARY|DECIMAL LOW|HIGH|HYPER DENSITY]
LABEL RECORD|RECORDS IS|ARE STANDARD|OMITTED
[VALUE OF FILE-ID IS [
DataName |Literal ]
[BLOCK CONTAINS
Integer CHARACTERS|RECORDS]
[RECORD CONTAINS
Integer CHARACTERS]
[DATA RECORD IS|RECORDS ARE
DataName1[, DataName2, ...]]

[
LevelNo DataName |FILLER
[REDEFINES
DataName ]
[PIC|PICTURE [IS]
Pattern ]
[OCCURS [
Interger TO] Integer TIMES
[DEPEND ON
DataName1 ]
[ASCENDING|DESCENDING [KEY] [IS]
DataName2 [, DataName3, ...]]
[INDEXED [BY]
IndexName1 [, IndexName2, ...]]
[RENAMES
DataName [THRU DataName2 ]]
[VALUE [IS|ARE]
Literal1 [THRU Literal2 ] [Literal3 [THRU Literal4]] ...
[JUST|JUSTIFIED RIGHT]
[SIZE [IS]
Integer CHARACTERS|DIGITS]
[CLASS [IS] NUMERIC|ALPHABETIC|ALPHANUMERIC]
[USAGE [IS] COMP|COMPUTATIONAL 1|COMP-1|COMPUTATION-1|DISPLAY|INDEX]
[BLANK WHEN ZERO]]

WORKING-STORAGE SECTION.
[77
DataName PIC|PICTURE [IS] Pattern.]
...
[
LevelNo DataName |FILLER
[REDEFINES
DataName ]
[PIC|PICTURE [IS]
Pattern ]
[OCCURS [
Interger TO] Integer TIMES
[DEPEND ON
DataName1 ]
[ASCENDING|DESCENDING [KEY] [IS]
DataName2 [, DataName3, ...]]
[INDEXED [BY]
IndexName1 [, IndexName2, ...]]
[RENAMES
DataName [THRU DataName2 ]]
[VALUE [IS|ARE]
Literal1 [THRU Literal2 ] [Literal3 [THRU Literal4]] ...
[JUST|JUSTIFIED RIGHT]
[SIZE [IS]
Integer CHARACTERS|DIGITS]
[CLASS [IS] NUMERIC|ALPHABETIC|ALPHANUMERIC]
[USAGE [IS] COMP|COMPUTATIONAL 1|COMP-1|COMPUTATION-1|DISPLAY|INDEX]
[BLANK WHEN ZERO]]
...

[LINKAGE SECTION.
[77
DataName PIC|PICTURE [IS] Pattern.]
...
[
LevelNo DataName |FILLER
[REDEFINES
DataName ]
[PIC|PICTURE [IS]
Pattern ]
[OCCURS [
Interger TO] Integer TIMES
[DEPEND ON
DataName1 ]
[ASCENDING|DESCENDING [KEY] [IS]
DataName2 [, DataName3, ...]]
[INDEXED [BY]
IndexName1 [, IndexName2, ...]]
[RENAMES
DataName [THRU DataName2 ]]
[VALUE [IS|ARE]
Literal1 [THRU Literal2 ] [Literal3 [THRU Literal4]] ...
[JUST|JUSTIFIED RIGHT]
[SIZE [IS]
Integer CHARACTERS|DIGITS]
[CLASS [IS] NUMERIC|ALPHABETIC|ALPHANUMERIC]
[USAGE [IS] COMP|COMPUTATIONAL 1|COMP-1|COMPUTATION-1|DISPLAY|INDEX]
[BLANK WHEN ZERO]]
...]

[SCREEN SECTION.
LevelNo [ScreenName] [BLANK-SCREEN]
[LINE [NUMBER] [IS] [PLUS]
Integer]
[LINE [NUMBER] [IS] [PLUS] Integer]
[BLANK LINE]
[BELL] [HIGHLIGHT|BLINK]
[VALUE [IS] Literal | PIC|PICTURE [IS]
Pattern FROM Literal2 | Identifier1 |TO Identifier2 |USING Identifier3
[BLANK WHEN ZERO]
[JUST|JUSTIFIED RIGHT]
[AUTO]
[SECURE]]

PROCEDURE DIVISION.

ParagraphName1.
Statement.
....

JCL Overview

JCL (Job Control Language) เป็น programming language ที่ใ้ช้ในการควบคุมการทำงานบน Mainfram JCL จะถูก interpret และำ execute โดย JES (Job Entry Subsystem) ฮับ ซึ่งเป็น subsystem ของ MVS อีกที ดังนั้นก่อนจะรู้จัก JCL เรามาทำความรู้จักกับ MVS กันคร่าวๆ กันก่อน

โครงสร้าง JCL จะประกอบไปด้วย
  1. // ทุกบรรทัีดของ JCL จะเริ่มต้นด้วย // ซึ่งบรรทัดไหนที่ไม่มี // ขึ้นต้น อาจจะเป็นส่วนของ data หรือว่าคำสั่งพิเศษ ที่ใช้กับ software อื่นๆ
  2. job name เริ่มต้นที่ column 3 JCL name สามารถยาวได้ 8 ตัวอักษร และสามารถประกอบด้วยตัวอักษร และตัวเลข และอักขระพิเศษอื่นๆ เช่น @, $, # แต่ไม่สามารถใช้ - หรือขึ้นต้นด้วยตัวเลขได้
  3. JCL operator เริ่มต้นได้ตั้งแต่ column 4 ซึ่งมีด้วยกัน 3 ตัว คือ JOB, EXEC และ DD
    • JOB จะถูกใช้เป็น statement แรก ที่ใช้ระบุข้อมูลของ job นั้นๆ
    • EXEC เป็น operator ที่ใช้ใันแต่ละ step ของแต่ละ job เป็นตัวบอกว่า ในแต่ละ step จะต้อง execute อะไร
    • DD (Data Definition) เป็น operator ที่ระบุที่อยู่ของข้อมูล และลักษณะของข้อมูล ที่จะใช้ในการ process ของ step นั้นๆ
  4. JCL parameter ซึ่งแล้วแต่ JCL Operator ที่ใช้ สำหรับในกรณีที่ parameter เยอะ สามารถขึ้นบรรทัดใหม่ได้ แต่ปิดบรรทัดด้วย , และจะต้องเริ่มต้นที่ column 4-16 เท่านั้น (โดยที่ column แรกยังคงต้องเป็น //) parameter ที่ใส่ใน JCL สามารถใช้แบบตามตำแหน่ง คือจะต้องใส่ให้เีรียงกันไปตามตำแหน่งให้ถูกต้อง หรือว่าจะใส่โดยใช้ parameter name เป็นตัวบอกและใส่ = ต่อท้ายก็ได้ ซึ่งโดยปกติก็จะนิยมแบบหลังมากกว่า เพราะว่า parameter ค่อยข้างเยอะ จำได้ยากว่าจะต้องตัวไหนมาก่อนมาหลัง
  5. อาจจะปิดท้ายด้วย sequence number 8 ตัว ซึ่งอาจจะมีหรือไม่มีก็ได้ เป็น optional ดังนั้น JCL name, operator และ parameter จะอยู่ใน column 3 - 71 เท่านั้น

สำหรับคนที่ีไม่ชินกับ Mainframe อาจจะไม่เข้าใจว่า column ที่ว่าคืออะไร มันก็คือ text ตัวที่เท่าไรในบรรทัดนั้นๆ นะเอง ใน editor บางตัวเราจะเห็นได้จาก status bar ที่โชว์ว่า ณ.ขณะนี้ cursor เราอยู่ที่ บรรทัดอะไร column อะไร ซึ่ง programming language ใน Mainframe ส่วนใหญ่จะต้องอิงตาม column และจะ้ต้องใช้ให้ถูกด้วย ม่ะงั้นมันจะ compile ไม่ผ่าน

ตัวอย่าง JCL ฮับ Job นี้ชื่อว่า IS198CPY มี step เดียวชื่อ COPY01 และก็มี parameter มากมายโดยใช้คู่กับ parameter name

//IS198CPY JOB (IS198T30500),'COPY JOB',CLASS=L,MSGCLASS=X
//COPY01 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=OLDFILE,DISP=SHR
//SYSUT2 DD DSN=NEWFILE,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(40,5),RLSE),
// DCB=(LRECL=115,BLKSIZE=1150)
//SYSIN DD DUMMY

Comment ใน JCL จะใช้ มี 2 แบบ
  1. all line comment จะใช้ //* ขึ้นต้น และ มันจะ ignore ข้อความหลังจากนั้นทั้งบรรทัด
  2. หรือ ถ้าเราเว้น space ด้านหลังของ parameter ก็จะถือเป็น comment เหมือนกัน ซึ่งนั้นก็หมายความว่า parameter ด้านหลังทั้งหมดจะต้องติดกัน ห้ามเว้น space เลยฮับ มิฉะนั้น parameter นั่นจะหายไปเลย... แง๊ว
แต่ถ้าเราใส่ // โดยไม่มี * จะหมายถึง หยุดการ process ทั้งหมดแค่นี้

JCL จะถูกอ่านโดย JES2 (subsystem หนึ่งของ MVS) เพื่อเช็ค syntax และเปลี่ยนให้เป็นงานที่อยู่ในคิว โดยงานแต่ละคิว จะถูกแบ่งตาม Class และ initiator จะเป็นตัวจัดการกับงานที่อยุ่ในคิวต่างๆ อีกที โดยเลือกงานตามลำดับความสำคัญ และ กำหนด I/O ตามที่งานนั้นต้องการ โดยใช้ MVS Service ช่วยอีกที

Reference:
Job Control Language - Wikipedia
JCL Study Material

Computer history ฉบับย่อ

ทุกวันนี้คนใ้ช้คอมพิวเตอร์กันเป็นเรื่องปกติ แต่จริงๆ แล้วก่อนหน้านี้คอมพิวเตอร์ไม่ได้หน้าตาแบบนี้ หุ่นเพียวบางแบบนี้ และคอมพิวเตอร์เครื่องหนาๆ เป็นตู้เสื้อผ้า ก็ยังคงมีใช้กันอยู่ในบางที่ กับบางงาน และเมื่อเราต้องเผชิญหน้ากับชื่อและคำศัพท์พวกนี้ เราก็มักจะงงว่าอะไรมันเป็นอะไรกันแน่ สรุปมาให้เห็นแบบสั้นๆ ง่ายๆ (เพราะว่า ยากๆ ก็ไม่รู้เหมือนกัน) แบบนี้



MainframeMinicomputerWorkstation (RISC)
1964-IBM System/360
1970-IBM System/370
1978-
IBM System/34
1980-
IBM System/38
1983-
IBM System/36
1986-

Sun SPARC
1988-
AS/400
late 1980s-

RISC System/6000 หรือ RS System/6000
1990-IBM System/390
mid 1990s-

DEC Alpha
2000-IBM eServer zSeriesIBM eServer iSeriesIBM eServer pSeries
2006-IBM System z (z Series)IBM System i
2008-

IBM System p

*ตัวที่ใส่ตัวหนาไว้ จะเป็นรุ่นที่ได้รับความนิยมอย่างมาก และมีการใช้กันแพร่หลาย ซึ่ง เป็นชื่อที่ให้เรียกกันมาจนถึงทุกวันนี้ อย่างเช่น AS/400 ข้อสังเกตุอีกอย่างหนึ่งก็คือ SUN ได้รับความนิยมจากเครื่อง workstation มากกว่า IBM

AS/400 มักจะมีคนสับสนกับเครื่อง mainframe แต่จริงๆ แล้วมันเป็นเครื่อง minicomputer ที่ IBM ผลิตขึ้นมา เมื่อกระแสความต้องการคอมพิวเตอร์ที่มีราคาถูกลง เครื่องเล็กลง ประสิทธิภาพอาจจะไม่เท่า Mainframe แต่ก็เพียงพอต่อความต้องการ จนกระทั่งมาถึง PC ซึ่งเป็น architecture แบบ CISC ซึ่งเกิดขึ้นมาพร้อมๆ กับ RISC บน workstation แต่ CISC สามารถผลิตได้ถูกกว่า เครื่อง CISC แรกๆ ก็คือ chip ตระกูล x86 เช่น 386, 486 เดิม ของ Intel

แม้ว่าเครื่อง mainframe และ minicomputer จะถูก IBM ครองตลาด แต่สำหรับเครื่อง workstation ซึ่งเป็น RISC กลับมีผู้ผลิตหลายรายที่ผลิตชิพของตัวเองและ design workstation ขึ้นมาขายแข่งกับ IBM ด้วย อย่างเช่น Sparc ของ Sun Microsystem ซึ่งค่อยข้างดัง และยังมี Alpha ของ DEC (Digital Equipment Corporation) ด้วย

นอกจากคำศัพท์ประเภทเครื่อง และรุ่น ของคอมพิวเตอร์แล้ว OS ก็อีกเป็นปัจจัยหลักที่มาคู่กับเครื่องคอมพิวเตอร์ ซึ่งบางครั้งเราก็จะได้ยิน คนเรียกชื่อ OS แทนชื่อเครื่อง แล้วก็ทำให้เราสับสนไปกันใหญ่ (ไม่รู้คนอื่นจะสับสนเหมือนกันหรือเปล่า) ว่ามันเป็นเครื่องรุ่นใหม่ แบบใหม่ หรืออย่างไร

MVS เกิดขึ้นไปปี 1974 ใชักับเครื่อง IBM System/370 และ System/390
OS/390 เกิดขึ้นมาปี 1995 นำมาใช้บน IBM System/390 แทน MVS
z/OS เป็นการ re-brand OS/390 เดิม ตามเครื่อง IBM System z

อย่างไรก็ตาม OS/390, z/OS หรือ OS อื่นๆ ที่ใช้กับเครื่อง mainframe ก็ยังมี core เป็น MVS จึงเป็นคำเรียกติดปากของคนทั่วไป เหมือนกับที่เราเรียก Redhat เป็น Linux

OS/400 เกิดขึ้นปี 1988 พร้อมกับ AS/400 ที่ใช้ร่วมกัน ซึ่งภายหลังได้ rename เป็น i5/OS และ IBM i ตาม IBM System i

AIX เป็น OS ที่ใช้บน IBM Workstation หรือเริ่มต้นใช้กับ System/6000 ซึ่งพัฒนามาจาก UNIX System V และ 4.3 BSD-compatible
OpenVMS เป็น OS สำหรับเครื่อง Alpha

นอกจากชื่อ computer ประเภทและรุ่นต่างๆ แล้ว ยังมีระบบคอมพิวเตอร์ที่เคยโด่งดังในสมัยหนึ่ง ของบริษัท Tandem Computers, Inc. ซึ่งใช้ชื่อบริษัทเป็นชื่อของระบบคอมพิวเตอร์ที่ออกแบบขึ้นโดยใช้แนวคิดแบบ fault-tolerant ซึ่งเป็นระบบที่สามารถรองรับงานได้ 24 ชม. ตลอดทั้งปี โดยออกแบบมาให้มีการรองรับ failure ที่จะเกิดขึ้นทั้งใน software และ hardward (ในขณะที่ mainframe จำเป็นจะต้องมีความเวลาในการ maintenence ซึ่งจะต้องหยุดระบบงานที่มีอยู่ทั้งหมด อย่างน้อย 1 ครั้งต่อปี และเป็นที่มาของวันหยุดธนาคารกลางปีนะเอง) ระบบของ Tandem ที่ออกมาตัวแรก ในปี 1975 ชื่อ Tandem-16 หรือ T/16 (ต่อมาเปลี่ยนชื่อเป็น NonStop I) ซึ่งออกเพื่อรองรับการทำงาน OLTP (On-Line Transaction Processing) ของธนาคาร ระบบ Tandem จะใช้ custom OS (เนื่องจากต้องมีการจัดการเรื่อง failure) โดย OS ตัวแรกชื่อ T/TOS และหลังจากนั้นระบบของ Tandem ก็แพร่หลายออกไป จนในปี 1997 บริษัท Compaq ก็ได้มาซื้อบริษัท Tamdem ไป

Reference:
Wikipedia
Tamdem - Wikipedia
Computer History Museum


TCP: default port

port number ก็คือเลข 16-bit (0 - 65535) ที่ใช้บอก application ที่จะใช้

เนื่องจากในการส่งข้อมูลภายใน internet (หรือเครือข่ายที่ใช้ TCP protocol) นั้นสามารถนำไปใช้กับ application ได้หลากหลาย ซึ่งแต่ละ application ก็สามารถใช้ protocol ที่แตกต่างกันออกไปในการตีความข้อมูลที่ส่งไป-มาใน network เช่น เราส่ง HTML โดยใช้ protocol HTTP หรือการส่งไฟล์โดยใช้ protocol FTP เป็นต้น ดังนั้นเพื่อจะบอก server ได้ว่าข้อมูลที่ส่งมานั้นเป็น application อะไร จะต้องใช้ protocol ตัวไหน จึงต้องมีการกำหนดหมายเลข port ขึ้นมา

ทั้งนี้ทั้งนั้น ตอนที่เรา config application เราสามารถกำหนดได้เองว่า จะใช้ application นั้นๆ ใช้ port หมายเลขอะไร แต่โดยทั่วไปแล้ว application ซึ่งเป็นที่รู้จักกันโดยทั่วไปจะมี ค่า default ของ application นั้นๆ อยู่ เช่น

port 21 เป็น FTP
port 22 เป็น SSH
port 23 เป็น Telnet
port 25 เป็น SMTP
port 80 เป็น HTTP
port 110 เป็น POP3
port 443 เป็น HTTPS

นอกจากนี้ยังมี applicatoin อื่นๆ อีก ซึ่ง port 0 - 1023 จะถูกสำรองไว้สำหรับ application ที่เป็นที่รู้จักเหล่านี้ ดังนั้นถ้าเรามีการสร้าง application ของเราเองที่ใช้อยู่บน TCP ก็ควรจะหลีกเลี่ยงการใช้ port เหล่านี้

HTTP and HTML introduction and architecture

อย่างที่เรารู้กันว่า เราส่ง HTML ไปด้วย protocol HTTP โดย HTML นั้นจะถูกหุ้มด้วย HTTP header อีกทีหนึ่ง ซึ่งตัว header ที่ว่านี้ก็อาจจะแตกต่างกันไปเล็กน้อยแล้วแต่ HTTP method

เช่น Get request method


GET /select/selectBeerTaste.jsp?color=dark&taste=malty
HTTP/1.1 Host: www.wickedlysmart.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4) Gecko/ 20030624 Netscape/7.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/ plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-aliv
e



หรือ Post request method

POST /advisor/selectBeerTaste.do HTTP/1.1
Host: www.wickedlysmart.com
User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4) Gecko/ 20030624 Netscape/7.1
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/ plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive


color=dark&taste=malty

ข้อแตกต่างของ get กับ post ที่เห็นได้ชัดๆ ก็คือ post จะสามารถมี body ได้ (บรรทัดสุดท้าย color=dark... คือส่วนของ body) โดย get method จะส่ง parameter ตามหลัง URL เลยทำให้ไม่สามารถส่งค่าที่มีความยาวมากๆ ได้ แต่ว่า post จะส่งโดยผ่าน body ทำให้มีความยาวได้ไม่จำกัด

นอกจาก post และ get แล้ว ยังมี HTTP method อื่นๆ อีก ดังนี้ HEAD, TRACE, OPTIONS, PUT,
DELETE และ CONNECT

ดูในส่วนของ request ไปแล้ว ทีนี้มาดูตัวอย่างของ response ที่ server ตอบกลับไปที่ client กันบ้าง


HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=0AAB6C8DE415E2E5F307CF334BFCA0C1; Path=/testEL
Content-Type: text/html
Content-Length: 397 Date: Wed, 19 Nov 2003 03:25:40 GMT Server: Apache-Coyote/1.1 Connection: close
<html>
...
</html>



ด้านล่างก็เป็นส่วน body ของ respond ซึ่งโดยส่วนใหญ่ก็จะเป็น HTML ที่นำมาแสดงในหน้า browser กันนะเอง โดย browser จะอ่าน message ในส่วนของ body และตีความและแสดงให้เราเห็น ดังนั้นเราจึงมี HTML standard ที่กำหนดว่า tag อะไรจะต้องแสดงผลแบบไหน ซึ่ง browser แต่ละ version ก็จะมีการบอกไว้ว่าตัวนี้ comply กับ HTML version อะไร ก็คือเป็น standard version นะเอง

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

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