Author: grianggrai.n

  • How to install Office Professional Plus 2019 in PSU

    • สามารถ download ได้จาก https://licensing.psu.ac.th
    Office Professional Plus 2019
    • ล็อคอินเข้าระบบให้เรียบร้อย
    • เมื่อเปิดหน้าของ Office Professional Plus 2019 เลื่อนลงมาล่างสุดจะมีให้ Download อยู่ 2 ส่วน
    Download
    • โดย Office pro plus 2019 setup คือส่วนที่จำเป็นต้องโหลด และสามารถเลือกโหลด Configuration Setup ได้ตามภาษาและสถาปัตยกรรมที่ต้องการ
    • เมื่อโหลดเสร็จแล้ว ติดตั้งโดยการเปิด cmd เรียกใช้ cmd ด้วยการกด windows+R
    • การติดตั้ง Office Professional Plus 2019 จะเป็นการติดตั้งผ่านอินเตอร์เน็ตเท่านั้น
    Run cmd
    cmd
    • พิมพ์ cd ไปยังโฟลเดอร์ที่ดาวน์โหลดทั้งสองไฟล์ไว้ (ในตัวอย่างโหลดไฟล์ไว้ที่ Desktop)
    Download location
    • พิมพ์คำสั่งดังต่อไปนี้ โดยเลือกตามรุ่นและสถาปัตยกรรมที่เลือก
    1. o2019proplussetup.exe /configure o2019proplus32en.xml
    2. o2019proplussetup.exe /configure o2019proplus32th.xml
    3. o2019proplussetup.exe /configure o2019proplus64en.xml
    4. o2019proplussetup.exe /configure o2019proplus64th.xml
    Setup command
    • จะมีหน้า User control ให้ตอบ Yes แล้วจะได้หน้าต่างติดตั้งขึ้นมา
    Installing
    • รอจนเสร็จ
    installation is finished!
    Finish
    • เปิด Microsoft word สร้างเอกสารใหม่
    Blank document
    • คลิกเมนู File แล้วเลือก account
    Account
    • มองไปด้านขวาในส่วนของ Product Information หากยังไม่มีข้อความว่า Product Activated ให้คลิก Change Product key
    Product Information
    • ให้นำคีย์จากเว็บ https://licensing.psu.ac.th มาใส่แล้วกด Activate Office
    • ต้องเชื่อมต่ออินเตอร์เน็ตให้เรียบร้อยก่อนทำขั้นตอนนี้
    Activate Office
    • สำหรับผู้ใช้ทั่วไปจบเพียงเท่านี้ ขอให้สนุก
    • สำหรับ Power Users และคนที่ต้องการใช้ Office ภาษาอื่นๆ มากกว่าภาษาไทย และ ภาษาอังกฤษ
    • หากเปิดดูในแฟ้ม o2019proplus64en.xml จะมีส่วนที่แก้ไขได้
    <Configuration>
      <Add SourcePath="https://bahamut.psu.ac.th/office2019-64" OfficeClientEdition="64"
     Channel="PerpetualVL2019">
          <Product ID="ProPlus2019Volume" PIDKEY="NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP">
             <Language ID="en-us" />
          </Product>
          <Product ID="ProofingTools">
            <Language ID="th-th" />
          </Product>
      </Add>
      <Property Name="AUTOACTIVATE" Value="1" />
      <Display Level="Full" AcceptEULA="TRUE" />  
      <Logging Level="Standard" Path="%temp%" /> 
    </Configuration>
    </code>
    • ได้แก่ SourcePath และ Language ID
    • โดยค่าที่เป็นไปได้ของ SourcePath คือ โฟลเดอร์ปลายทางที่จะได้เป็นที่เก็บตัวติดตั้ง Office Professional Plus 2019 เช่น d:\download ซึ่งแปลว่าโหลดตัวติดตั้งมาเก็บไว้ที่ d:\download
    • และค่าที่เป็นไปได้ของ Language ID ได้แก่ รหัสภาษาที่ไมโครซอฟท์กำหนดโดยสามารถดูได้ที่ https://docs.microsoft.com/en-us/DeployOffice/office2016/language-identifiers-and-optionstate-id-values-in-office-2016
    • ตัวอย่างไฟล์ที่แก้เสร็จแล้ว
    <Configuration>
      <Add SourcePath="d:\download" OfficeClientEdition="64" 
    Channel="PerpetualVL2019">
          <Product ID="ProPlus2019Volume" PIDKEY="NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP">
             <Language ID="ja-jp" />
          </Product>
          <Product ID="ProofingTools">
            <Language ID="ja-jp" />
          </Product>
      </Add>
      <Property Name="AUTOACTIVATE" Value="1" />
      <Display Level="Full" AcceptEULA="TRUE" />  
      <Logging Level="Standard" Path="%temp%" /> 
    </Configuration>
    </code>
    • วิธีใช้งานให้พิมพ์คำสั่งต่อไปนี้ใน cmd
    o2019proplussetup.exe /download o2019proplus64en.xml
    download
    • จะค้างอยู่จนกว่าจะ download เสร็จ
    downloading
    • เมื่อ download เสร็จแล้วสามารถพิมพ์คำสั่งต่อไปนี้ใน cmd เช่นเดิม เพื่อเริ่มกระบวนการติดตั้ง แบบที่กล่าวมาแล้ว
    o2019proplussetup.exe /configure o2019proplus64en.xml
    • จบขอให้สนุกครับ
  • Hardening your HTTP response headers

    Introduction

    HTTP Response headers คือ ค่าของสตริงที่ส่งกลับมาจากเซิร์ฟเวอร์ที่มีเนื้อหาตามที่ถูกร้องขอ โดยปกติจะใช้บอกข้อมูลทางเทคนิค เช่น เบราเซอร์ควรแคชเนื้อหา, ประเภทของเนื้อหาคืออะไร, ซอฟต์แวร์ที่ทำงานบนเซิร์ฟเวอร์ และอื่น ๆ   HTTP Response headers ถูกใช้เพื่อส่งต่อนโยบายความปลอดภัยไปยังเบราเซอร์  ทำให้การเปิดเว็บไซต์ของเรามีความปลอดภัยเพิ่มมากขึ้น

    Header ของ Apache2 ที่ควรต้องใส่เพื่อเพิ่มความปลอดภัยมีดังนี้

    Content Security Policy

    Header เรื่อง Content Security Policy (CSP) ช่วยให้กำหนดต้นทางของเนื้อหาที่อนุญาตสำหรับเว็บไซต์ โดยการจำกัดเนื้อหาที่เบราเซอร์สามารถโหลดได้ ได้แก่ js และ css

    สามารถสร้าง CSP ได้จาก https://report-uri.com/home/generate ทั้งนี้ต้องทดสอบการทำงานทุกครั้งเนื่องจาก การกำหนดค่าบางอย่างอาจทำให้เว็บไซต์ ทำงานไม่ถูกต้อง ดูรายละเอียดเพิ่มเติมได้ที่ https://scotthelme.co.uk/content-security-policy-an-introduction/ สำหรับ Apache2 เพิ่ม Header ต่อไปนี้ ในแฟ้มของไซต์ที่ต้องการ เช่น /etc/apache2/site-enabled/lsc-ssl.conf  หรือแฟ้ม .htaccess ในไซต์ที่ต้องการ (ซึ่งแนะนำว่าใช้ .htaccess จะได้ไม่ต้องรีสตาร์ทเซิร์ฟเวอร์) เพื่อเปิดการใช้งาน CSP


    Header always set Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"

    HTTP Strict Transport Security (HSTS)

    เว็บไซต์ ต้องมีการตั้งค่าให้ redirect จาก HTTP ไปยัง HTTPS เสมอ และ HSTS จะเป็น Header ที่กำหนดให้เบราเซอร์จำสถานะของ HTTPS เอาไว้แม้ว่าจะเป็นการเปิดจาก bookmark ที่เป็น HTTP ก็ตาม ก็จะถูกบังคับให้เป็น HTTPS รายละเอียดเพิ่มเติม https://scotthelme.co.uk/hsts-the-missing-link-in-tls/ เช่น เมื่อเปิด http://licensing.psu.ac.th ก็จะถูก redirect ไป https://licensing.psu.ac.th

    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    X-Frame-Options

    X-Frame-Options หรือ XFO header จะช่วยป้องกันผู้ใช้จากการโจมตีแบบ clickjacking ที่ผู้บุกรุกสามารถโหลด iframe จากไซต์ของเขาบนไซต์ของเราได้ ซึ่งทำให้ผู้ใช้งานเว็บไซต์ของเราเชื่อว่าไม่อันตราย!! รายละเอียดเพิ่มเติม https://www.troyhunt.com/clickjack-attack-hidden-threat-right-in/

    Header always set X-Frame-Options "SAMEORIGIN"

    X-Xss-Protection

    Header นี้ใช้กำหนดค่าการป้องกัน XSS ที่มีอยู่บนเบราเซอร์ต่างๆ โดยการตั้งค่าจะมี 0 คือ ปิดการทำงาน 1 คือเปิดการทำงาน และ 1; mode=block ซึ่งจะกำหนดให้เบราเซอร์ทำการบล็อคการกระทำใดๆ ก็ตามที่มากกว่าการล้างข้อมูลสคริปต์

    Header always set X-Xss-Protection "1; mode=block"

    X-Content-Type-Options

    X-Content-Type-Options ใช้ในการป้องกันการโจมตีผ่านทางช่องโหว่ MIME sniffing ซึ่งจะเกิดเมื่อ เว็บไซต์อนุญาตให้ผู้ใช้อัพโหลดเนื้อหาไปยังเซิร์ฟเวอร์ ซึ่งผู้ใช้อาจเปลี่ยนหรือซ่อนไฟล์อันตราย แล้วอัพโหลดขึ้นเซิร์ฟเวอร์ รายละเอียดเพิ่มเติม https://www.keycdn.com/support/x-content-type-options/

    Header always set X-Content-Type-Options "nosniff"

    เบื้องต้นแนะนำเท่านี้ก่อนครับ พิเศษ!! สำหรับผู้ใช้งาน wordpress มีปลั๊กอินชื่อ HTTP Headers ใช่ตั้งค่า Header ต่างๆ ที่เล่ามาข้างต้นได้อย่างสบายใจหายห่วง!!! ไม่ต้องแก้ .htaccess ไม่ต้องแก้ config ใด ๆ  เมื่อติดตั้งเสร็จแล้วจะพบว่ามี Header อีกมากที่สามารถตั้งค่าเพิ่มเติมได้ ซึ่งจะกล่าวอีกในครั้งต่อ ๆ ไป

    ต้นฉบับ

    https://scotthelme.co.uk/hardening-your-http-response-headers/

    มีวิธีการเซ็ตสำหรับ Nginx และ IIS สามารถดูเพิ่มเติมได้ครับ
    อย่าลืม!!

    ตรวจ HTTP Response ได้ที่ https://securityheaders.com

    จบขอให้สนุก

  • Oracle Label Security

    Oracle Label Security (OLS) เป็นส่วนขยายของเทคโนโลยี Virtual Private Database (VPD) ซึ่งเริ่มนำมาใช้ตั้งแต่ Oracle 8i  OLS อนุญาตให้มีการควบคุมการเข้าถึงลงในแถวต่างๆ ตามป้ายกำกับที่ระบุ ฟังก์ชันการทำงานที่คล้ายคลึงกันสามารถทำซ้ำโดยใช้ Fine Grained Access Control (FGAC) แต่ OLS ให้โซลูชันที่ง่ายกว่าสำหรับการรักษาความปลอดภัยระดับแถว (row-level security) ในบทความนี้ฉันจะนำเสนอตัวอย่างง่ายๆของการกำหนดค่า OLS

    ตั้งค่าฐานข้อมูล

    • หากไม่ได้เลือกตัวเลือก Label Security เมื่อครั้งติดตั้ง Oracle Database สามารถเรียกตัวติดตั้งและเลือกตัวเลือก Label Security เพิ่มเติมได้ภายหลัง
    • เข้าระบบด้วยบัญชีผู้ใช้ Oracle เปิด terminal พิมพ์ dbca (Database Server เป็น Linux)
    • เมื่อได้ Welcome Screen คลิก Next
    • ที่หน้า Operation คลิก Configure Database Options แล้วคลิก Next
    • หน้า Database เลือกฐานข้อมูลที่ต้องการ คลิก Next
    • ที่หน้า Database Features คลิกเลือก Label Security คลิก Next
    • คลิก Finish
    • เมื่อจบการตั้งค่าให้ restart database

    สร้างผู้ใช้ทดสอบ

    คำสั่งทั้งหมดทำภายใน sqlplus สร้างผู้ใช้ ols_test มีรหัสผ่านว่า password โดยให้สิทธิ์ CONNECT, RESOURCE, SELECT_CATALOG_ROLE

    sqlplus, / as sysdba
    CONN / AS SYSDBA
    
    CREATE USER ols_test IDENTIFIED BY password 
    DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp
    GRANT CONNECT, RESOURCE, SELECT_CATALOG_ROLE TO ols_test;

    ต่อไปเป็นการให้สิทธิ์ในแพ็คเกจ OLS แก่ผู้ใช้ ols_test จำเป็นต้อง unlock ผู้ใช้ lbacsys และตั้งรหัสผ่านว่า lbacsys เพื่อใช้เป็นคนกำหนดสิทธิ์ต่างๆ ให้ ols_test ได้แก่สิทธิ์ execute บน sa_components, sa_user_admin, sa_label_admin, sa_policy_admin, sa_audit_admin, sa_sysdba, to_lbac_data_label และให้ ols_test เป็น lbac_dba

    sqlplus, / as sysdba, lbacsys/lbacsys
    ALTER USER lbacsys IDENTIFIED BY lbacsys ACCOUNT UNLOCK;
    
    CONN lbacsys/lbacsys
    
    GRANT EXECUTE ON sa_components TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_user_admin TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_user_admin TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_label_admin TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_policy_admin TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_audit_admin  TO ols_test WITH GRANT OPTION;
    
    GRANT LBAC_DBA TO ols_test;
    GRANT EXECUTE ON sa_sysdba TO ols_test;
    GRANT EXECUTE ON to_lbac_data_label TO ols_test;

    สร้าง Policy

    ต่อไปจะสร้าง policy ชื่อ region_policy ด้วยผู้ใช้ ols_test และระบุชื่อของ column ที่จะเป็นที่เก็บ label ว่า region_label

    sqlplus, ols_test/password
    CONN ols_test/password
    
    BEGIN
    	SA_SYSDBA.CREATE_POLICY(
    	policy_name => 'region_policy',
    	column_name => 'region_label');
    END;
    /
    
    GRANT region_policy_DBA TO ols_test;

    กำหนด component ของ label

    สร้าง component ของ label เพื่อใช้สำหรับ policy ที่สร้างไว้ตอนต้น region_policy
    – สร้างระดับไว้ 3 ระดับ คือ 20, 40 และ 60 มีชื่อเรียกสั้น ๆ ว่า L1, L2 และ L3 ชื่อเรียกยาว ๆ ว่า Level 1, Level 2 และ Level 3 ตามลำดับ
    – สร้างสิทธิ์การใช้งานไว้ 2 ชนิดประกอบด้วย 100, 120 มีชื่อเรียกอย่างย่อว่า M และ E และชื่อเรียกยาวว่า Manage และ Employee ตามลำดับ
    – สร้างกลุ่มของ policy ไว้ 4 กลุ่ม 20, 40, 60 และ 80 ชื่อย่อ R20, R40, R60 และ R80 ชื่อยาว Region North, Region South, Region East และ Region West ตามลำดับ
    สุดท้ายกำหนดให้ ols_test เป็นผู้มีสิทธิ์สูงสุดใน policy region_policy

    sqlplus, ols_test/password
    EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',20,'L1','Level 1');
    EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',40,'L2','Level 2');
    EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',60,'L3','Level 3');
    
    EXECUTE SA_COMPONENTS.CREATE_COMPARTMENT('region_policy',100,'M','MANAGEMENT');
    EXECUTE SA_COMPONENTS.CREATE_COMPARTMENT('region_policy',120,'E','EMPLOYEE');
    
    EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',20,'R20','REGION NORTH');
    EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',40,'R40','REGION SOUTH');
    EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',60,'R60','REGION EAST');
    EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',80,'R80','REGION WEST');
    
    EXECUTE SA_USER_ADMIN.SET_USER_PRIVS('region_policy','ols_test','FULL,PROFILE_ACCESS');

    สร้าง Table ทดสอบ

    สร้าง table พร้อมข้อมูลทดสอบใน schema ols_test โดย table ชื่อ customers มีฟิลด์ id, cust_type, first_name, last_name, region, credit กำหนดให้ id เป็น Primary key และ insert ข้อมูลลง table ด้วย

    sqlplus, ols_test/password
    CONN ols_test/password
    
    CREATE TABLE customers (
    	id                  NUMBER(10) NOT NULL,
    	cust_type           VARCHAR2(10),
    	first_name          VARCHAR2(30),
    	last_name           VARCHAR2(30),
    	region              VARCHAR2(5),
    	credit              NUMBER(10,2),
    	CONSTRAINT customer_pk PRIMARY KEY (id));
    
    GRANT SELECT, INSERT, UPDATE, DELETE ON customers TO PUBLIC;
    
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 1, 'SILVER', 'Harry', 'Hill', 'NORTH', 11000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 2, 'SILVER', 'Vic', 'Reeves', 'NORTH', 2000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 3, 'SILVER', 'Bob', 'Mortimer', 'WEST', 500.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 4, 'SILVER', 'Paul', 'Whitehouse', 'SOUTH', 1000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 5, 'SILVER', 'Harry', 'Enfield', 'EAST', 20000.00);
    
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 6, 'GOLD', 'Jenifer', 'Lopez', 'WEST', 500.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 7, 'GOLD', 'Kylie', 'Minogue', 'NORTH', 1000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 8, 'GOLD', 'Maria', 'Carey', 'WEST', 1000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 9, 'GOLD', 'Dani', 'Minogue', 'SOUTH', 20000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (10, 'GOLD', 'Whitney', 'Houston', 'EAST', 500.00);
    
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (11, 'PLATINUM', 'Robbie', 'Williams', 'SOUTH', 500.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (12, 'PLATINUM', 'Thom', 'Yorke', 'NORTH', 2000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (13, 'PLATINUM', 'Gareth', 'Gates', 'WEST', 10000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (14, 'PLATINUM', 'Darius', 'Dinesh', 'EAST', 2000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (15, 'PLATINUM', 'Will', 'Young', 'EAST', 100.00);
    
    COMMIT;

    สร้าง label function

    เป็นการสร้าง function ชื่อ get_customer_label สำหรับสร้าง label ประกอบด้วย p_cust_type, p_region, p_credit
    – โดยกำหนด policy ระดับด้วย p_credit >2000 ก็จะมี v_label ว่า L3 ถ้า p_credit > 500 v_label คือ L2 และ p_credit < 500 v_label คือ L1
    – กำหนด p_cust_type เป็น platinum หรือไม่ถ้าเป็นก็จะอยู่ในจะมีิสิทธิ์ M ถ้าไม่ก็จะเป็น E โดยเอาค่าที่ได้มาต่อกับ v_label ข้อที่แล้ว
    – กำหนด p_region ถ้าเป็น north จะอยู่กลุ่ม R20 เป็นต้น และจะเอาค่าที่ได้ไปต่อกับ v_label ที่ได้จากข้อที่แล้ว
    – ค่าที่ return จา function นี้จะเป็นชื่อ policy และ v_label สุดท้ายที่ได้จากข้อกำหนดที่กล่าวมาข้างต้น

    sqlplus, ols_test/password
    CREATE OR REPLACE FUNCTION get_customer_label (
    	p_cust_type  IN  VARCHAR2,
    	p_region     IN  VARCHAR2,
    	p_credit     IN  NUMBER)
    RETURN LBACSYS.LBAC_LABEL AS
    	v_label  VARCHAR2(80);
    BEGIN
    	IF p_credit > 2000 THEN
    		v_label := 'L3:';
    	ELSIF p_credit > 500 THEN
    		v_label := 'L2:';
    	ELSE
    		v_label := 'L1:';
    	END IF;
    
    	IF p_cust_type = 'PLATINUM' THEN
    		v_label := v_label || 'M:';
    	ELSE
    		v_label := v_label || 'E:';
    	END IF;
    	IF p_region = 'NORTH' THEN
    		v_label := v_label || 'R20';
    	ELSIF p_region = 'SOUTH' THEN
    		v_label := v_label || 'R40';
    	ELSIF p_region = 'EAST' THEN
    		v_label := v_label || 'R60';
    	ELSIF p_region = 'WEST' THEN
    		v_label := v_label || 'R80';
    	END IF;
    
    	RETURN TO_LBAC_DATA_LABEL('region_policy',v_label);
    END get_customer_label;
    /
    
    SHOW ERRORS

    สั่งให้ Policy ทำงานกับ table ที่สร้าง

    เมื่อสั่งให้ Policy ทำงานจะเป็นการเพิ่ม column ที่เก็บ label ใน table เป้าหมาย

    sqlplus, ols_test/password
    CONN ols_test/password
    
    BEGIN
    	SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
    	policy_name   => 'REGION_POLICY',
    	schema_name   => 'OLS_TEST',
    	table_name    => 'CUSTOMERS',
    	table_options => 'NO_CONTROL');
    END;
    /

    เริ่มสร้าง label

    เป็นการกำหนดค่าเริ่มต้นสำหรับ region_label ลงไปใน table ซึ่งถ้าไม่มีข้อมูลในฟิลด์นี้จะไม่มีใครสามารถเข้าถึงได้

    sqlplus, ols_test/password
    UPDATE customers
    SET region_label = CHAR_TO_LABEL('REGION_POLICY','L1');
    
    COMMIT;

    สั่งให้ Policy ทำงานอีกครั้ง

    ต่อไปจะเป็นการสั่งให้ policy ทำงานอีกครั้งใน table customers เพื่อเปลี่ยนค่าเป็นค่าที่ได้จะเป็นค่าจาก function ที่สร้างไว้

    sqlplus, ols_test/password
    BEGIN
    	SA_POLICY_ADMIN.REMOVE_TABLE_POLICY('REGION_POLICY','OLS_TEST','CUSTOMERS');
    	SA_POLICY_ADMIN.APPLY_TABLE_POLICY (
    	policy_name => 'REGION_POLICY',
    	schema_name => 'OLS_TEST',
    	table_name  => 'CUSTOMERS',
    	table_options => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL',
    	label_function => 'ols_test.get_customer_label(:new.cust_type,:new.region,:new.credit)',
    	predicate => NULL);
    END;
    /

    สั่งให้ label ทำงานกับข้อมูลในแต่ละแถว

    ปรับปรุงข้อมูลให้เป็นตามฟังก์ชันที่สร้างไว้กับข้อมูลแต่ละแถว

    sqlplus, ols_test/password
    UPDATE customers
    SET    first_name = first_name;
    
    COMMIT;

    สร้าง user ทดสอบ

    สร้าง user อื่นๆ เพื่อทดสอบ label ได้แก่ sales_manager, sales_north, sales_south, sales_east, sales_west
    – sales_manager มี label ว่า L3:M,E:R20,R40,R60,R80 แปลว่า sales_manager สามารถอ่านและเขียนข้อมูลได้ทุก Region
    – sales_north มี label ว่า L3:E:R20,R40 แปลว่า sales_north สามารถอ่านข้อมูลที่อยู่ใน Region North และ South
    – sales_south มี label ว่า L3:E:R20,R40,R60,R80 แปลว่า sales_south อ่านข้อมูลได้ทุก Region
    – sales_east มี label ว่า L3:E:R60 แปลว่า sales_east อ่านข้อมูล Region East ได้อย่างเดียว
    – sales_west มี label ว่า L3:E:R80 แปลว่า sales_west อ่านข้อมูล Region West ได้อย่างเดียว

    sqlplus, / as sysdba, (sales_manager, sales_nort, sales_south, sales_east, sales_west, ols_test)/password
    CONN / AS SYSDBA;
    
    CREATE USER sales_manager IDENTIFIED BY password;
    CREATE USER sales_north IDENTIFIED BY password;
    CREATE USER sales_south IDENTIFIED BY password;
    CREATE USER sales_east IDENTIFIED BY password;
    CREATE USER sales_west IDENTIFIED BY password;
    
    GRANT CONNECT TO sales_manager, sales_north, sales_south, sales_east, sales_west;
    
    CONN ols_test/password
    
    BEGIN
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_manager','L3:M,E:R20,R40,R60,R80');
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_north','L3:E:R20,R40');
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_south','L3:E:R20,R40,R60,R80');
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_east','L3:E:R60');
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_west','L3:E:R80');
    END;
    /

    ทดสอบ Label Security 

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

    sqlplus, sales_manager, sales_north, sales_south, sales_east, sales_west

    จบขอให้สนุก

    ที่มา https://oracle-base.com/articles/9i/oracle-label-security-9i#Installation

  • WordPress Custom Error page

    เนื่องจากมีปัญหาเกี่ยวกับการแสดงผล error page ที่แสดงผลใน licensing.psu.ac.th จึงต้องหาทางแก้ไขการแสดง Error page 403 ใหม่

    1. Plug in ชื่อ Custom Error Pages ติดตั้งแล้วเปิดใช้งานให้เรียบร้อย
    2. เพิ่มข้อความต่อไปนี้ในแฟ้ม .htaccess
      ErrorDocument 403 /index.php?status=403
      ErrorDocument 401 /index.php?status=401
    3. แต่เนื่องจากไซต์ที่แสดง error 403 ไม่ใช่ licensing.psu.ac.th แต่เป็น bahamut.psu.ac.th ซึ่งอาจจะมีหลายท่านเคยเจอข้อความประมาณ
      Forbidden You don't have permission to access /licensing/SW_DVD5_Office_Professional_Plus
      _2013w_SP1_32-BIT_X64_English_X19-35900.ISO on this server.
    4. ฉะนั้นต้องไปสร้าง .htaccess ในพื้นที่ของไซต์ bahamut.psu.ac.th แทน ซึ่งอยู่ที่ /licensing มีข้อความว่า
      ErrorDocument 403 https://licensing.psu.ac.th/index.php?status=403 
      ErrorDocument 401 https://licensing.psu.ac.th/index.php?status=401
    5. จบขอให้สนุก
    6. ก่อนจาก licensing.psu.ac.th เป็นที่จัดเก็บ link ของไฟล์ที่อยู่บน bahamut.psu.ac.th เมื่อดาวน์โหลดไฟล์ต่างๆ นอกมหาวิทยาลัย จะแจ้ง error ในหน้าของ bahamut.psu.ac.th ทำให้ดูไม่เป็นหนึ่งเดียว ปรับแก้ด้วยวิธีข้างต้น
    7. ตัวอย่างหน้า error page เข้ารับชมได้ที่ https://licensing.psu.ac.th/index.php?status=403
    8. สรุปได้ว่า ErrorDocument จะชี้ที่ไหนก็ได้
  • เขียน PHP ใน wordpress

    1. สิ่งที่ต้องมี ไซต์ wordpress และ user ที่สามารถติดตั้งและใช้งาน Plugins ได้ ส่วนใหญ่คือ user ที่มีสิทธิ administrator
    2. ติดตั้ง Plugins ชื่อ PHP Code snippets (จริง ๆ Plugins ที่ทำหน้าที่นี้มีหลายตัว แต่ใช้ตัวนี้มานานแล้ว) แล้วเปิดการใช้งานให้เรียบร้อย

      PHP Code snippets
      PHP Code snippets
    3. เมื่อติดตั้งและเปิดใช้แล้วจะมีเมนู PHP snippets ปรากฏขึ้นที่แถบด้านซ้ายมือ

      PHP snippets
      PHP snippets
    4. เมื่อคลิกที่ PHP snippets จะได้ดังรูป (แต่อันนี้จะมี code ของผู้เขียนอยู่แล้วสาม code)

      PHP snippets
      PHP snippets
    5. คลิก Add snippet เพื่อสร้าง code

      PHP Snippet
      New Code
    6. ใส่ชื่อ code ในช่องแรก และใส่ code PHP ในช่องที่สอง

      PHP snippet
      Coding
    7. คลิก Where there is a shortcode เพื่อให้ code ทำงานเฉพาะหน้าที่มีการระบุ  shortcode แต่หากต้องการให้ code นี้ทำงานทุกหน้าสามารถคลิกที่ Run everywhere และสามารถเขียนคำอธิบายได้ในช่อง  Description

      PHP snippet
      Run at
    8. คลิก Publish เพื่อเปิดการใช้งาน code คลิก snippet เพื่อดูสถานะ ถ้าได้ดังรูปแปลว่า code ถูกเปิดใช้งานแล้ว

      PHP snippet
      Code status activated
    9. ถ้าต้องการปิดไม่ให้ code ทำงานสามารถคลิกปุ่ม Deactivate ได้

      PHP snippet
      Code status deactivated
    10. วิธีเรียกใช้งานให้สร้าง Pages หรือ Posts แล้วนำ shortcode ไปใส่ไว้ shortcode สามารถดูได้ในช่อง  Where use? ตัวอย่าง
    11. จาก code นี้ถ้าเรียกหน้า https://licensing.psu.ac.th/login โดย user ที่ยังไม่ login จะ redirect ไปหน้า login ก่อน
    12. จบขอให้สนุก

     

  • How to install PSU SSL VPN Client ubuntu 18.04

    • เปิด terminal
    • เริ่มด้วยการติดตั้งโปรแกรมที่จำเป็น
      sudo apt install -y openfortivpn
    • สร้างแฟ้ม /home/username/fortivpn.config มีข้อความว่า
      host = vpn2.psu.ac.th
      port = 443
      username = PSU Passport Username
      password = PSU Passport Password
      trusted-cert = 34df1a6bd3705782fd17152de0c4fe0b3e7f31302cbdcf737b113c17a5b9ff09
    • สั่งรันคำสั่ง
      sudo openfortivpn -c fortivpn.config
    • ได้ข้อความประมาณว่า
    • แปลว่าเชื่อมต่อได้แล้ว หากต้องการยกเลิกการเชื่อมต่อให้กด ctrl-c จะได้ข้อความประมาณว่า
    • แปลว่ายกเลิกการเชื่อมต่อแล้ว
    • ต้องเปิด terminal ที่รันคำสั่ง openfortivpn ไว้ตลอดเวลาที่เชื่อมต่อห้ามปิด
    • จบสไตล์คอมมานไลน์ ….

    หากอยากได้ง่ายกว่านี้

    • ติดตั้งโปรแกรม OpenFortiGUI โหลดที่ https://hadler.me/linux/openfortigui/ โดยเลือกโปรแกรมสำหรับ Ubuntu 18.04
    • โหลดมาแล้วติดตั้งด้วยคำสั่ง
      sudo dpkg -i openfortigui_0.6.2-1_bionic_amd64.deb
    • จะมี error message มากมาย ให้ต่อด้วยคำสั่ง
      sudo apt -f -y install
    • เริ่มใช้งานเปิดโปรแกรม openFortiGUI โดยกดที่ปุ่ม Show Applications เลือก openFortiGUI
    • จะได้หน้าต่าง
    • คลิกปุ่ม Add เลือก VPN จะได้
    • กรอกข้อความตามรูป ช่อง username และ password ก็ใส่ PSU Passport ลงไปเสร็จแล้วกด Save
    • ได้ดังรูป
    • เลือก PSU แล้วคลิก Connect ได้ผลดังรูป
    • คลิก x เพื่อปิดหน้าต่างสังเกตว่าจะมีรูป  ที่มุมบนขวา หากจะยกเลิกการเชื่อมต่อ คลิกขวาที่  เลือก PSU เพื่อ dissconnect
    • จบขอให้สนุก…

    ***  จากที่ลองทดสอบพบว่า เมื่อเชื่อมต่อ AIS 4G จะไม่สามารถใช้วิธี OpenFortiGUI ได้ แต่ใช้วิธีคอมมานไลน์ได้ครับ

  • Configuration of TCP/IP with SSL and TLS for Database Connections

    สิ่งที่ต้องเตรียม

    1. Oracle Database Server ในตัวอย่างนี้ใช้ Oracle database บน Oracle Enterprise Linux 7
    2. Oracle Database Client  ในตัวอย่างใช้ Windows Server 2008 R2

    เริ่ม

    • ฝั่ง Server
    • เข้าระบบด้วยบัญชีผู้ใช้ oracle หรือบัญชีที่เป็นเจ้าของ Oracle Database
    • เปิด terminal สร้าง Oracle Wallet ด้วยคำสั่ง
      • mkdir -p /u01/app/oracle/wallet

    • ต่อด้วย
      • orapki wallet create -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -auto_login_local

      • โดย -pwd WalletPasswd123 ตัว WalletPasswd123 คือรหัสผ่านที่ใช้ป้องกันการเข้าถึงข้อมูลต่างๆ ใน wallet กฎการตั้งมีอยู่คือ ยาวอย่างน้อย 8 ตัวอักษร ไม่จำกัดความยาว จำเป็นต้องตั้งให้ตัวเลขผสมตัวอักษร
    • สร้าง Certificate และใส่เข้าไปใน wallet ด้วยคำสั่ง
      • orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \
        -dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650

    • ตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณ
      • Oracle PKI Tool : Version 12.1.0.2
        Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=reis.psu.ac.th
        Trusted Certificates:
        Subject: CN=reis.psu.ac.th

    • Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Client ด้วยคำสั่ง
      • orapki wallet export -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \
        -dn "CN=`hostname`" -cert /tmp/server-certificate.crt

    • ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง
      • cat /tmp/server-certificate.crt

    • ได้ผลลัพธ์ประมาณว่า
      • -----BEGIN CERTIFICATE-----
        MIIBoTCCAQoCAQAwDQYJKoZIhvcNAQEEBQAwGTEXMBUGA1UEAxMOcmVpcy5wc3UuYWMudGgwHhcN
        MTgwMTA5MDcyNTA2WhcNMjgwMTA3MDcyNTA2WjAZMRcwFQYDVQQDEw5yZWlzLnBzdS5hYy50aDCB
        nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAj4x2/NviDaTlXuEJt0kZARY5fHiT2SiVX+a18hai
        I0stoUhKKefjOCgB85iuqjIk0rvcGXI0KXkbenTy2t40A+qGxB04mBhCLKaKeIe67BZKR6Zyw1dd
        oaesoaWChC01b+IW1X5WWtC53UxpIZQ4Zktj41sLGUnarIr9+9HFwncCAwEAATANBgkqhkiG9w0B
        AQQFAAOBgQAqSCF2Y8uyM4rSQHUC8MKEl3Ia3NJKnigMOUzDc2fP7grSaoeuQ4NvIntTD+s+IT5Y
        EpLVND4kSHFTwGRq0Py/ig8ybXZCXfHtvNZh7ZGziL/sYt5/8xYi/tOBKwVanBTUaseKIMovtmd7
        UyoOKrX8YBoFsB3UPRLudmFsksXRXw==
        -----END CERTIFICATE-----

    • ฝั่ง Client
    • เข้าระบบด้วยบัญชีผู้ใช้ administrator
    • เปิด cmd แล้วสร้าง wallet ด้วยคำสั่ง
      • mkdir c:\app\oracle\wallet

    สร้าง Certificate ด้วยคำสั่ง

      • orapki wallet add -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -keysize 1024 -self_signed -validity 3650

      • โดย WalletPasswd123 คือพาสเวิร์ดที่ใช้ล็อค wallet ไม่จำเป็นต้องเหมือนกับของ Server
    • ตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณว่า
      • Oracle PKI Tool : Version 12.2.0.1.0
        Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=ENERAZAN
        Trusted Certificates:
        Subject: CN=ENERAZAN

    • Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Database Server ด้วยคำสั่ง
      • orapki wallet export -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -cert c:\client-certificate.crt

    • ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง
      • more c:\client-certificate.crt
    • ได้ผลลัพธ์ประมาณว่า
      • -----BEGIN CERTIFICATE-----MIIBmTCCAQICAQAwDQYJKoZIhvcNAQEEBQAwEzERMA8GA1UEAxMIRU5FUkFaQU4wIhgPMDE1NTAxMDkwNzMzNDlaGA8wMTQ1MDEwNzA3MzM0OVowEzERMA8GA1UEAxMIRU5FUkFaQU4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJHEEnB4kiI82QVyt0/GlrILF9dwd/jVRlgCQkLmLrpF6RKrIUntzvygyVhtTybeaShH751gYvtl1NFxDUWkBnfS5u2DN6ATP2WpNQgGM/skPWZOxoewy6OeeFsDPNUJTsI8+F5DIwtNhZcdQtBexZ/D3ALkSboR87t2Vy8OJpD7AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAV7xLLslRn2srS4A4Ks1KiuUWI/ackyNK7UiWgWD/by5Vx4Zw+0x3hdLzQllDR2O5Nef9it5WyYWrDQ47RadqMEVVfTGuAqQn47n/t+v24ljwm2yZ36Tj2lDVaFbE/ZtRyzPKgIwUy6RIt9XVX39vXFJVaENCHzZ0R3hs2bx1K3o=-----END CERTIFICATE-----

    • ทำการส่งไฟล์ certificate แลกกันระหว่าง Server กับ Client โดยใช้วิธีการที่ชื่นชอบของแต่คน เมื่อแลกไฟล์กันเสร็จแล้ว
    • ฝั่ง Server import certificate ด้วยคำสั่ง
      • orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \ -trusted_cert -cert /tmp/client-certificate.crt

    • สามารถตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณ
      • Oracle PKI Tool : Version 12.1.0.2
        Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=reis.psu.ac.th
        Trusted Certificates:
        Subject: CN=ENERAZAN
        Subject: CN=reis.psu.ac.th

    • ฝั่ง Client import certificatae ด้วยคำสั่ง
      • orapki wallet add -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -trusted_cert -cert c:\server-certificate.crt

    • สามารถตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet “c:\app\oracle\wallet” -pwd WalletPasswd123
    • ได้ผลลัพธ์ประมาณว่า
      • Oracle PKI Tool : Version 12.2.0.1.0
        Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=ENERAZAN
        Trusted Certificates:
        Subject: CN=reis.psu.ac.th
        Subject: CN=ENERAZAN

    • ฝั่ง Server แก้ไขแฟ้ม $ORACLE_HOME/network/admin/sqlnet.ora ด้วย editor ที่ชื่นชอบ
      • เพิ่มคำสั่งต่อไปนี้
      • WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = /u01/app/oracle/wallet)
        )
        )

        SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS,BEQ)
        SSL_CLIENT_AUTHENTICATION = FALSE
        SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA)

    แก้ไขแฟ้ม $ORACLE_HOME/network/admin/listener.ora

      • เพิ่มข้อความส่วนที่เป็นตัวหนาตามตำแหน่งต่อไปนี้
      • LISTENER =
        (DESCRIPTION_LIST =
        (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = reis.psu.ac.th)(PORT = 1521))
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        (ADDRESS = (PROTOCOL = TCPS)(HOST = reis.psu.ac.th)(PORT = 2484))
        )
        )

        SSL_CLIENT_AUTHENTICATION = FALSE

        WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = /u01/app/oracle/wallet)
        )
        )

    • restart listener ด้วยคำสั่ง
      • lsnrctl stop
      • lsnrctl start
    • ฝั่ง Client แก้ไขแฟ้ม C:\app\client\Administrator\product\12.2.0\client_1\network\admin\sqlnet.ora โดยเพิ่มข้อความต่อไปนี้
      • WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = c:\app\oracle\wallet)
        )
        )

        SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS)
        SSL_CLIENT_AUTHENTICATION = FALSE
        SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA)

    • แก้ไขแฟ้ม C:\app\client\Administrator\product\12.2.0\client_1\network\admin\tnsnames.ora เพิ่มข้อความต่อไปนี้
      • REIS_SSL =
        (DESCRIPTION =
        (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCPS)(HOST = reis.psu.ac.th)(PORT = 2484))
        )
        (CONNECT_DATA =
        (SERVICE_NAME = reis.psu.ac.th)
        )
        )

    • ทดสอบใช้งาน
    • ที่ Client พิมพ์คำสั่ง
      • sqlplus scott/tiger@reis_ssl
    • ได้ผลลัพธ์ประมาณว่า
      • SQL*Plus: Release 12.2.0.1.0 Production on Wed Feb 7 16:54:05 2018
        Copyright (c) 1982, 2016, Oracle. All rights reserved.

        Last Successful login time: Wed Feb 07 2018 16:52:50 +07:00

        Connected to:
        Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
        With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
        ions

        SQL>

    • หรือต่อด้วย SQL Developer ต้องตั้งค่าการเชื่อมต่อเป็นดังภาพ
    • จากภาพเลือก Connection Type เป็น Advanced และใช้ช่อง Custom JDBC URL ใส่เป็น jdbc:oracle:oci:/@reis_ssl
    • เนื่องจากไม่สามารถเชื่อมต่อผ่าน tns ได้ ดังภาพ
    • วิธีเซ็ตค่าแบบนี้ใช้ได้กับ Oracle Database 10G R2 เป็นต้นมา
    • จบขอให้สนุก

    ที่มา:
    https://oracle-base.com/articles/misc/configure-tcpip-with-ssl-and-tls-for-database-connections

  • date นั้นสำคัญไฉน

    ที่ Shell prompt พิมพ์คำสั่ง man date

    ได้อะไรมาไม่รู้เยอะแยะ…

    man date
    man date

    จากคู่มือจะเอารูปแบบวันที่ 12-09-2017 ตัวเลือกที่เกี่ยวข้องได้แก่ %d %D %e %F %g %G %m %y %Y เป็นต้น ลองส่งคำสั่ง

    date +"%d-%m-%Y"

    ได้ผลลัพธ์

    12-09-2017

    ตรงตามที่ต้องการ มาเขียนสคริปต์กันหน่อย อยากได้เมื่อวานทำไง วันนี้เล่น tcsh shell สร้างแฟ้ม date.tcsh ด้วย editor ที่ชื่นชอบมีข้อความว่า

    #!/bin/tcsh -f
    set tday=`date +"%d"`
    set tmonth=`date +"%m"`
    set tyear=`date +"%Y"`
    echo "Today is ${tday}-${tmonth}-${tyear}."
    set yday=`expr ${tday} - 1`
    echo "Yesterday was ${yday}-${tmonth}-${tyear}."

    ทดสอบสคริปต์ด้วยคำสั่ง

    tcsh date.tcsh

    ไม่อยากพิมพ์ tcsh ทุกครั้งเพิ่ม execution bit ด้วยคำสั่ง

    chmod +x date.tcsh

    เรียกใช้ได้โดยพิมพ์

    ./date.tcsh (อ่านว่า จุด-ทับ-เดต-จุด-ที-ซี-เอส-เอช)

    ผลลัพธ์ที่ได้

    Today is 12-09-2017.
    Yesterday was 11-09-2017.

    อยากได้เมื่อวานทำไมมันยากอย่างนี้ ฮา… ซึ่งเมื่อกลับไปอ่านคู่มือ (man date) ให้ดี..อีกครั้งจะพบว่ามีตัวเลือก

    -d, –date=STRING
    display time described by STRING, not ‘now’

    และเมื่่อเลื่อนลงมาล่างสุดจะพบว่า

    DATE STRING
    The –date=STRING is a mostly free format human readable date string such as “Sun, 29 Feb 2004 16:21:42 -0800” or
    “2004-02-29 16:21:42” or even “next Thursday”. A date string may contain items indicating calendar date, time of day,
    time zone, day of week, relative time, relative date, and numbers. An empty string indicates the beginning of the day.
    The date string format is more complex than is easily documented here but is fully described in the info documentation.

    โอ้ววว มันเขียนไว้หมดแล้ว…

    เขียนใหม่ได้ว่า
    date -d yesterday

    ได้ผลลัพธ์

    Mon Sep 11 21:43:51 +07 2017

    เปลี่ยนให้ผลลัพธ์ออกมาในรูปแบบที่ต้องการได้ด้วยคำสั่ง

    date -d yesterday +"%d-%m-%Y"

    ก็จะได้ผลลัพธ์ว่า

    11-09-2017

    แก้สคริปต์ date.tcsh

    #!/bin/tcsh -f
    set tday=`date -d today +"%d-%m-%Y"`
    set yday=`date -d yesterday +"%d-%m-%Y"`
    echo "Today is ${tday}."
    echo "Yesterday was ${yday}."

    เจ็บมาเท่าไหร่แล้วกับคำว่าไม่อ่านเอกสาร….

    ยังใส่ข้อความอื่นๆ แทน string ได้เช่น
    date -d 'tomorrow'
    date -d '-1 days ago'
    date -d '200 days'
    date -d '1000 weeks'
    date -d '30 months'
    date -d '300 years'

    เรื่องนี้สอนให้รู้ว่า บางทีเอกสารก็มีให้หมดแล้ว ไม่ต้องทำเองก็ด้ายยยยย….

    จบขอให้สนุก

    man date
    ค้นเพิ่มเติม https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html

  • Fixed : KU$_RADM_FPTM_VIEW in invalid status

    • ฐานข้อมูลที่จะพบปัญหานี้ Oracle Database 12c Enterprise Edition Release 12.1.0.2.0
    • OS เป็น CentOS 7.3 หรือ Oracle Enterprise Linux 7.3
    • ปัญหานี้ข้อสำคัญทำให้ export ข้อมูลไม่ได้ คือไม่สามารถสำรองข้อมูลได้
    • เข้าระบบด้วยผู้ใช้ oracle สร้างแฟ้ม fix.sql ด้วยคำสั่ง

    cat >>fix.sql<<EOF
    CREATE OR REPLACE NONEDITIONABLE TYPE "SYS"."KU$_RADM_FPTM_T" as object
    (
    vers_major char(1), /* UDT major version # */
    vers_minor char(1), /* UDT minor version # */
    numbercol number, /* number */
    binfloatcol binary_float, /* binary float */
    bindoublecol binary_double, /* binary double */
    charcol char(1), /* fixed-size character */
    varcharcol varchar2(1), /* variable-size character */
    ncharcol nchar(1), /* fixed-size national character */
    nvarcharcol nvarchar2(1), /* variable-size national character */
    datecol date, /* date */
    ts_col timestamp, /* timestamp */
    tswtz_col timestamp with time zone, /* timestamp with time zone */
    fpver number /* version of default fixed point values */
    )
    /

    CREATE OR REPLACE FORCE NONEDITIONABLE VIEW "SYS"."KU$_RADM_FPTM_VIEW" OF "SYS"."KU$_RADM_FPTM_T"
    WITH OBJECT IDENTIFIER (fpver) AS
    select '1','0',
    numbercol, binfloatcol, bindoublecol,
    charcol, varcharcol, ncharcol, nvarcharcol,
    datecol,ts_col,tswtz_col, fpver
    from sys.radm_fptm$
    where fpver=1
    /
    EOF

    • เชื่อมต่อกับฐานข้อมูลด้วย sqlplus ด้วยบัญชีผู้ใช้ / as sysdba

    • ที่ prompt SQL> พิมพ์คำสั่ง @/home/oracle/fix.sql
    • ก็จะแก้ปัญหาได้
    • จบ
    • ขอให้สนุก

    ที่มา
    เว็บโดนปิดไปแล้ว