Solaris 10:Copy symbolic link

 今天在copy一個AP的目錄時,因為底下有一個symbolic link,因為出現cannot access,所以沒有copy成功。

於是試了加上 -P的參數後成功copy symbolic link,所以記錄一下。

例如:symbolic line的名稱是:jdk

指令: cp -R -P jdk /backup

Oracle PRAGMA RESTRICT_REFERENCES 簡易說明與測試

今天開發人員問我知不知道RESTRICT_REFERENCES()的功能,我也是第一次看到,所以到google尋找並記錄下來。

PRAGMA RESTRICT_REFERENCES(),它可以看做是對子程式做權限的控管,檢查子程式的純度(PURITY)。 可以避免例如A在DML上呼叫函式時,B因為不知情而修改該函式,雖然B在編譯上沒有問題,但是卻因為觸發到DML限制,進而導致A原本正常的DML發生錯誤。

語法:PRAGMA RESTRICT_REFERENCES(function_name | default , )RNDS, WNDS, RNPS, WNPS) | , TRUST);

RNDS,WNDS,RNPS,WNPS可以同時設定。但設定參數值為TRUST時,其它的值則全部失效。

  • function_name:應用的function

  • DEFAUT:是指應用在package的所有子程式、函式。

  • RNDS(Read No Database State):不能讀取任何資料庫的資訊,包括任何的表,連dual這個表也不行

  • RNPS(Read No Package State):不能讀取任何package的狀態資訊,如變數等。

  • WNDS(Write No Database State):不能在資料庫寫入任何資料(即不能修改表)。

  • WNPS(Write No Package State):不能向package寫入任何資訊(例如不能修改package變數的值)

  • TRUST,指出子程式是可以相信,故不受限。這個選項通常是用來PL/SQL在呼叫外部函數(如JAVA)時,因為PL/SQL是無法對外部函數進行限制。

    範例:

    create or replace package pkg_test is
      a number := 543;
      function test01 return number;
      function test02 return number;
      pragma restrict_references(test01, wnps);
      pragma restrict_references(test02, wnps);
    end;
    
    
    create or replace package body pkg_test is
    
        function test01 return number as
        begin
            a := 123;
            return a;
        end;
    
        function test02 return number as
        begin
            return a + 10 ;
        end;
    
        function test03 return number as
            b number ;
        begin
            b := 123;
            return b;
        end;
        
        function test04 return number as
        begin
            a := 9999;
            return a;
        end;
        
    end pkg_test;
    

    test01變更了package的變數a的值,故編譯錯誤:PLS-00452: Subprogram 'TEST01' violates its associated pragma

    test02只使用變數值,故未被限制;

    test03則未使用到package的變數,而是使用function內部的變數,所以未被限制住

    test04因為未定義restrict_references,故可以變更a的值

Websocket簡單範例

 Websocket是一種網路傳輸協定,可以在TCP連接上全雙工通訊,允許伺服器端主動向客戶端推播資料,只要一次的交握,就可以建立不中斷的連接,以進行雙工通訊。

例如為了取得數個球場上比賽的即時分數,因為每個球場比賽得分的時間都不相同,所以使用的方式是在client端每隔幾秒就向Server發送一次http request,向Server取回最新的訊息。

若改以Websocket,因為可以保持連線,所以不必像http request每一次的連線,都需要重送header等重覆的資料,可加快傳輸的速度。

另外,Websocket因為可以由Server來廣播資料,所以當server收到來自A球場的比數時,可以同時將比數發送給B球場、C球場的client。

以http request的方式,必需讓A、B、C球場每隔數秒就要連線一次,但是每次的連線都不一定會有新的資料,這樣的做法會增加Server的負擔。

以下是我測試Websocket的程式,我用node.js來架設server。

node.js:安裝ws套件,npm install ws

建立app.js,內容如下:

//import  ws 套件

const SocketServer = require('ws').Server


const express = require('express')

const path = require('path')


//設定port

const PORT = 80 


const routeAPI = express.Router();


const app = express()


app.use('/', express.static(__dirname + '/'));


routeAPI.route('/')

    .get((req, res) => {

        res.status(200).send("OK");

    })


routeAPI.route('/test01')

    .get((req, res) => {

        res.sendFile('test01.html', { root: path.join(__dirname) });

    })



app.use('/', routeAPI);



//創建 express 物件,綁定監聽  port , 設定開啟後在 console 中提示

const server = app.listen(PORT, () => {

    console.log("Listening on ${PORT}")

})



//將 express 交給 SocketServer 開啟 WebSocket 的服務

const ws = new SocketServer({ server })


//當client連線時

ws.on('connection', ws_conn => {

  console.log('Client connected')

  

  //收到client資料時

  ws_conn.on("message", data => {

    //client資料是Buffer格式,需要轉成字串

    data = data.toString()  

    console.log(data) 


    // 發送消息給client 

    ws_conn.send("server return:" + data)

    

    //取得所有連接中的 client

    let clients = ws.clients 

    //發送資料至每個client

    clients.forEach(client => {

      client.send("server return :" + data)  

    })

  })

})


//當連線關閉

ws.on('close', () => {

  console.log('Close connected')

})



建立test01.html,內容如下:


<!DOCTYPE html>

<html lang="zh-TW">


<head>

    <meta charset="utf-8">

    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title> WebSocket Test</title>

</head>


<body>

    <textarea id="txtShow" disabled></textarea>

    <input id="txtInput" type="text">

    <button id="btnSend">送出</button>

    <button id="btnClose">關閉</button>

</body>


</html>


<script src="jquery-3.4.1.min.js"></script>


<script>


    // 建立 WebSocket (本例 server 端於本地運行)

    let url = 'ws://192.192.192.10:9910'

    var ws = new WebSocket(url)

    // 監聽連線狀態

    ws.onopen = () => {

        console.log('open connection')

    }

    ws.onclose = () => {

        console.log('close connection');

    }

    //接收 Server 發送的訊息

    ws.onmessage = event => {

        console.dir(event)

        let txt = event.data

        $("#txtShow").val(txt)

    }


    

    $('#btnSend').on('click',() => {

        let txt = $('#txtInput').val()

        //發送訊息

        ws.send(txt)

    })


    $("#btnClose").on('click',() => {

        ws.close()

    })


</script>




 

EBS:啟用Request的Debug Options

今天遇到一個任務,要開啟Request的Debug Options功能,經一番查詢之後,找到開啟的方式,致於如何使用,待下次再來測試。

啟用後,Debug Options按鈕為可點選狀態



System Profile名稱: Concurrent: Allow Debugging,設定完後需重新登入EBS才能生效