標籤

4GL (1) 人才發展 (10) 人物 (3) 太陽能 (4) 心理 (3) 心靈 (10) 文學 (31) 生活常識 (14) 光學 (1) 名句 (10) 即時通訊軟體 (2) 奇狐 (2) 爬蟲 (1) 音樂 (2) 產業 (5) 郭語錄 (3) 無聊 (3) 統計 (4) 新聞 (1) 經濟學 (1) 經營管理 (42) 解析度 (1) 遊戲 (5) 電學 (1) 網管 (10) 廣告 (1) 數學 (1) 機率 (1) 雜趣 (1) 證券 (4) 證券期貨 (1) ABAP (15) AD (1) agentflow (4) AJAX (1) Android (1) AnyChart (1) Apache (14) BASIS (4) BDL (1) C# (1) Church (1) CIE (1) CO (38) Converter (1) cron (1) CSS (23) DMS (1) DVD (1) Eclipse (1) English (1) excel (5) Exchange (4) Failover (1) Fedora (1) FI (57) File Transfer (1) Firefox (3) FM (2) fourjs (1) Genero (1) gladiatus (1) google (1) Google Maps API (2) grep (1) Grub (1) HR (2) html (23) HTS (8) IE (1) IE 8 (1) IIS (1) IMAP (3) Internet Explorer (1) java (4) JavaScript (22) jQuery (6) JSON (1) K3b (1) ldd (1) LED (3) Linux (120) Linux Mint (4) Load Balance (1) Microsoft (2) MIS (2) MM (51) MSSQL (1) MySQL (27) Network (1) NFS (1) Office (1) OpenSSL (1) Oracle (131) Outlook (3) PDF (6) Perl (60) PHP (33) PL/SQL (1) PL/SQL Developer (1) PM (3) Postfix (2) postfwd (1) PostgreSQL (1) PP (50) python (5) QM (1) Red Hat (4) Reporting Service (28) ruby (11) SAP (234) scp (1) SD (16) sed (1) Selenium (3) Selenium-WebDriver (5) shell (5) SQL (4) SQL server (8) sqlplus (1) SQuirreL SQL Client (1) SSH (3) SWOT (3) Symantec (2) T-SQL (7) Tera Term (2) tip (1) tiptop (24) Tomcat (6) Trouble Shooting (1) Tuning (5) Ubuntu (37) ufw (1) utf-8 (1) VIM (11) Virtual Machine (2) VirtualBox (1) vnc (3) Web Service (2) wget (1) Windows (19) Windows (1) WM (6) Xvfb (2) youtube (1) yum (2)

2026年7月20日 星期一

將shared pool 裡面的SQL execution plan 拿掉

1.
SELECT address, hash_value, sql_text
   FROM v$sql
WHERE sql_id = 'gy4mvy9rkpmfu';


2.
BEGIN DBMS_SHARED_POOL.PURGE('00007FFBC18DC578, 1865076186', 'C'); END;

抓 Oracle full table scan

SELECT * FROM (

    SELECT 

        --s.parsing_schema_name as "執行Schema",

        p.OBJECT_OWNER,p.OBJECT_NAME,

        s.sql_id,

        

        -- 執行週期核心指標

        TO_CHAR(TO_DATE(s.first_load_time, 'YYYY-MM-DD/HH24:MI:SS'), 'YYYY-MM-DD HH24:MI') as "SQL首次載入時間",

        TO_CHAR(TO_DATE(s.last_load_time, 'YYYY-MM-DD/HH24:MI:SS'), 'YYYY-MM-DD HH24:MI') as "SQL最後載入時間",

        s.executions as "總執行次數",

        ROUND(s.executions / DECODE(ROUND((SYSDATE - TO_DATE(s.first_load_time, 'YYYY-MM-DD/HH24:MI:SS')) * 24, 2), 0, 1, ROUND((SYSDATE - TO_DATE(s.first_load_time, 'YYYY-MM-DD/HH24:MI:SS')) * 24, 2)), 2) as "平均每小時執行次數",

        --ROUND((((SYSDATE - TO_DATE(s.first_load_time, 'YYYY-MM-DD/HH24:MI:SS')) * 86400) / DECODE(s.executions, 0, 1, s.executions)), 1) as "平均每隔幾秒執行一次",

        --ROUND((((SYSDATE - TO_DATE(s.first_load_time, 'YYYY-MM-DD/HH24:MI:SS')) * 86400) / DECODE(s.executions, 0, 1, s.executions)) / 60, 1) as "平均每隔幾分執行/次",

        

        -- I/O 與時間指標

        s.disk_reads as "累積硬碟讀取(Blocks)",

        ROUND(s.disk_reads / DECODE(s.executions, 0, 1, s.executions), 2) as "單次平均硬碟讀取",

        ROUND(s.elapsed_time / 1000000, 2) as "累積消耗時間(秒)",

        ROUND(s.elapsed_time / 1000000 / DECODE(s.executions, 0, 1, s.executions), 2) "平均消耗時間(秒)",

        ROUND(s.cpu_time / 1000000 / DECODE(s.executions, 0, 1, s.executions), 2) "平均CPU時間(秒)",

        

        s.sql_text as "SQL縮略文本"

    FROM v$sql_plan p

    JOIN v$sql s ON p.sql_id = s.sql_id AND p.child_number = s.child_number

    WHERE 1 = 1

      AND p.operation = 'TABLE ACCESS' 

      AND p.options = 'FULL'

      AND s.parsing_schema_name NOT IN ('SYS','SYSTEM','SYSMAN','DBA','EXFSYS')

      AND s.executions > 0  

      --AND s.SQL_TEXT LIKE '%select att.value  || %'

    ORDER BY "單次平均硬碟讀取" DESC

) WHERE ROWNUM <= 100;


Oracle SQL 的 exution plan and statistics

 
1. 需要知道exution plan and statistics 的SQL
select /*+ GATHER_PLAN_STATISTICS */ max(verson) from ESP_NDE_NEW.SYS_LOG t where t.verson !='singleton ver.';

2.
SELECT sql_id, child_number, sql_text, last_active_time
   FROM v$sql
 WHERE UPPER(sql_text) LIKE '%GATHER_PLAN_STATISTICS%' -- 抓有GATHER_PLAN_STATISTICS字眼的
      AND sql_text NOT LIKE '%v$sql%'
 ORDER BY last_active_time DESC;

 3. 查詢 結果
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('71d3ck9v8vtb4', NULL, 'ALLSTATS LAST'));

2025年11月26日 星期三

postfix + procmail + spamassassin

 CentOS 6 已經EOL,所以要增加yum repository
1. cd /etc/yum.repos.d/
2. sed -i 's|#baseurl=http://mirror.centos.org/centos/$releasever|baseurl=http://vault.centos.org/6.10|g' CentOS-Base.repo

安裝spamassassin相關package
3.yum install spamassassin spamassassin-tools procmail perl-Mail-DKIM
4.service spamassassin restart
5.chkconfig spamassassin on

設定spamassassin
6.vim /etc/mail/spamassassin/local.cf
# These values can be overridden by editing ~/.spamassassin/user_prefs.cf
# (see spamassassin(1) for details)
# These should be safe assumptions and allow for simple visual sifting
# without risking lost emails.
required_hits 5
report_safe 0
rewrite_header Subject [SPAM]
# -----------------------------
# 測試設定:標記 X-Spam-Status
# -----------------------------
report_safe 0      # 直接顯示原始信件分析結果,方便測試
required_score 5.0 # 分數達到 5 才算垃圾信
# -----------------------------
# 自訂規則:Display Name + domain
# -----------------------------
# 標記寄件人 domain
header LOCAL_NOT_COMPANY From !~ /\@zzz\.com$/
# 標記寄件人 Display Name
header LOCAL_BAD_NAME From =~ /xxx/
# 綜合規則:同時符合以上兩個條件
meta LOCAL_1 (LOCAL_BAD_NAME && LOCAL_NOT_COMPANY)
# 分數設定
priority LOCAL_1 10
score LOCAL_1 5.0
# 標記寄件人 Display Name
header LOCAL_BAD_NAME2 From =~ /yyy/
# 綜合規則:同時符合以上兩個條件
meta LOCAL_2 (LOCAL_BAD_NAME2 && LOCAL_NOT_COMPANY)
# 分數設定
priority LOCAL_2 10
score LOCAL_2 5.0

安裝 procmail

Procmail 是一款用於過濾和處理電子郵件的工具,其主要功能是在郵件伺服器(如 Postfix)接收到新郵件後,根據使用者設定的規則自動進行分類、轉寄、刪除或存檔等動作

7.yum install spamassassin procmail -y
8.vi /etc/procmailrc
MAILDIR=/var/mail
LOGFILE=/var/log/procmail.log
SPAMFOLDER=$MAILDIR/spam

# ---- 過濾垃圾信件 (經由 SpamAssassin 標記的 X-Spam-Flag: YES) ----
:0 fw
| /usr/bin/spamc

:0:
* ^X-Spam-Flag: YES
$SPAMFOLDER

create spam信件存放 file
9.sudo touch /var/mail/spam
10.sudo chown postfix:mail /var/mail/spam
11.sudo chmod 666 /var/mail/spam

create spam信件存放 file
12.sudo touch /var/log/procmail.log
13.sudo chown postfix:mail /var/log/procmail.log
14.sudo chmod 666 /var/log/procmail.log

設定postfix
15.vim /etc/postfix/main.cf
## 設定postfix使用procmail處理分類、轉寄、刪除或存檔
mailbox_command = /usr/bin/procmail -a "$EXTENSION"
# 使用系統預設的本地傳送方式
local_transport = local:$myhostname
relay_transport = smtp
virtual_transport = virtual
content_filter =
receive_override_options =
16.vim /etc/postfix/master.cf (搞錯,不用設定)
#每個參數要換行縮排兩個空格(或一個 tab)
#不要在 argv 內拆成多行,整個命令必須在同一行
#將以下加在最後
#spamassassin unix - n n - - pipe
#  user=nobody                                                                # 使用运行 spamd 的用户 (通常是 spamd 或 nobody)
#  argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} # SpamAssassin 客户端

重啟service
17.service spamassassin restart
18.service postfix reload

cron job 加上清空spam & log
19. crontab -l > cronfile ; vim cronfile ; crontab cronfile
1 23 * * */3 cat /dev/null > /var/mail/spam
2 23 * * */3 cat /dev/null > /var/log/procmail.log

2025年6月4日 星期三

Oracle RAC installation using Vmware Sphere ESXi

環境:
A - cluster
N1 - 實體機
N2 - 實體機

1.N1 / N2 進入 Vmware client設定node1 / node2 網路
1-1 virtual switch 就是虛擬node之間的switch ,做高速網路流量用
1-2 連接埠擇像是網段,意思是node之間要用virtual switch的這個網段互通



 


 

2 設定HD,注意紅框設定




 


 





















2025年4月15日 星期二

產生ssh-key並且透過key進行免密碼登入

Summary:
1.產生ssh key 在client 端 (就是要發出ssh的那台機器,會有公
鑰和私鑰)
2.將公鑰設定放到伺服器上 (在client端產生公鑰後,將公鑰放到server,也就是接受ssh要求的機器)
3.產生的私鑰和金鑰可以提供給client端其他user使用


 來源:https://xenby.com/b/220-%E6%95%99%E5%AD%B8-%E7%94%A2%E7%94%9Fssh-key%E4%B8%A6%E4%B8%94%E9%80%8F%E9%81%8Ekey%E9%80%B2%E8%A1%8C%E5%85%8D%E5%AF%86%E7%A2%BC%E7%99%BB%E5%85%A5

[教學] 產生SSH Key並且透過KEY進行免密碼登入

一般我們登入伺服器可以透過密碼進行登入,但是安全性的程度會比較沒有像SSH key那個安全,而且如果使用SSH key登入的話可以就不用每次手動輸入密碼,會方便許多,本篇教如何產生SSH key並且設定到伺服器上。

產生ssh key

首先輸入指令來產生 key

ssh-keygen

接著會詢問產生的ssh key要存放的位置

這時選擇要放的位置 預設為 /home/username/.ssh/id_rsa

如果不同伺服器會使用不同的key 則改變key的位置 (例如: /home/username/.ssh/id_rsa_ubuntu)

Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):

接著會詢問要不要設定 passphrase,空白表示不設定

如果有設定passphrase,則每次用此key登入都需要輸入這個密碼 (安全性較高,可依個人需求設定)

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

接下來就會產生key到指定位置了

會有兩個key 一個有副檔名 .pub 為公鑰,而沒有副檔名的為私鑰

注意私鑰要保存好 絕對不能被竊取

Your identification has been saved in /home/username/.ssh/id_rsa_ubuntu.
Your public key has been saved in /home/username/.ssh/id_rsa_ubuntu.pub.
The key fingerprint is:
SHA256:nNnQckFbuegUs4WD3y+7YqwCaDhfUlX2J17jxF7X3FU xenby@demo.com
The key's randomart image is:
+---[RSA 2048]----+
|       .o++ ..  E|
|      .  *o+.  ..|
|     .  = *+ o ..|
|    .  . Ooo+ * +|
| . o    Soo..B o.|
|o + o     . ..o  |
| + o .   .  . .  |
|  .   .   +  o   |
|       ..o .o.   |
+----[SHA256]-----+

將公鑰設定放到伺服器上

有幾個方法可以把公鑰放到伺服器上,可以依據自己的使用狀況選擇

方法一、透過 ssh-copy-id

輸入指令以下指令
(將 username 與 server_host 換成自己的帳號與伺服器IP或host,而 your_key_path 換成自己的剛剛產生的key位置)

ssh-copy-id -i your_key_path username@server_host

成功後會顯示如下的訊息

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys         

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'username@server_host'"
and check to make sure that only the key(s) you wanted were added.

方法二、直接將公鑰資料複製到 server 的 ~/.ssh/authorized_keys 中

先記下剛剛產生的公鑰資料

cat ~/.ssh/ubuntu_id_rsa.pub 

會顯示公鑰資料,把它複製下來

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOZypQABxuCschD6jjRZFr1iPCqzrpo40Mzw6vXRfPlFwF9QJhLm3YYdtnpVekj9e1Y4kUduM924PAiLgfRw/6AJ1ueDR1BEDLeH8gAV1Cc90oPUvitYItPN8F1HrqiT37GZ3wKWKIFw70NL8Hs6BL61F+LgFmfXQDRyp7IIcyK9rmk24yqLSue/DiSbA0y85E4uvV7ekZD2NXeA9AnKHFe/cy614SQv2NNQCwi2ZRuP25du9xGVv0QvCwrZ4ANJky9V7xlO4dFFHqcNXUPQUm8EeRxySVCdTbenqiEQ3flLVBCCCxvnc7ApHlLNc/CZSpcft96xfGB3qOCrRvjb2/ xenby@demo.com

連線到伺服器上後

將公鑰資料複製到 ~/.ssh/authorized_keys 中 (下面指令的 public_key_string 要換成剛剛複製的公鑰資料)

如果該檔案已經存在就將資料新增到新的一行,如果不在就自己創建一個

echo "public_key_string" >> ~/.ssh/authorized_keys

假如剛剛自己是建立一個新的檔案,因為安全性的關係要改變 permission

輸入以下兩個指令 (username需要換成自己的帳號)

chmod -R go= ~/.ssh
chown -R username:username ~/.ssh

測試是否成功

試試看是否能正常登入使用key登入

ssh username@server_host

如果能夠不需要輸入密碼 就表示已經成功了

 

 

2024年10月18日 星期五

Python certificate_verify_failed-解決方法

 https://www.jeffcodingmentor.com/python%E5%AD%B8%E7%BF%92/certificate_verify_failed-%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95

 

CERTIFICATE_VERIFY_FAILED 解決方法

for Windows + Anaconda + Python 3

用 Python requests 要到台北科技教育網抓取網站資料時,會遇到 SSL: CERTIFICATE_VERIFY_FAILED 錯誤,而瀏覽器(如Chrome)都沒有問題,原因是環境中 (windows + anaconda) 沒有台北科技教育網 SSL 所要的憑證

import requests

requests.get("https://techpro.tp.edu.tw/manager/cms/taipei-edu/scartch.html")


SSLError: HTTPSConnectionPool(host='techpro.tp.edu.tw', port=443): Max retries exceeded with url: /manager/cms/taipei-edu/scartch.html (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))

如果只是測試,那關掉認證就可以解決,但還是有警告提示。

requests.get("https://techpro.tp.edu.tw/manager/cms/taipei-edu/scartch.html", verify=False)


C:\Users\ManaTsao\.conda\envs\tensorflowenv\lib\site-packages\urllib3\connectionpool.py:986: InsecureRequestWarning: Unverified HTTPS request is being made to host 'techpro.tp.edu.tw'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

InsecureRequestWarning,

若要徹底解決問題,就要將憑證加到環境中。步驟如下:

1. 先更新 certifi :

在 andaconda prompt 中執行

pip install certifi

pip install -U pyopenssl

若此時再執行 requests.get 沒有出錯,那就不必繼續下面的步驟。

2. 找出台北科技教育網所用的認證:

在 Chrome 中打開台北教育網後,按 F12 進入開發人員工具模式,並選擇 Security


找到用的是 RapidSSL RSA CA 2018。點 View Certificate 進去找一下是哪一家公司發行的,是 digicert 這家公司。

3. 接著到 Google 搜尋 “RapidSSL RSA CA 2018 download” 並找到 digicert 的網頁


注意是digicert的網頁

一路可以找到下載的地方



點選 Download PEM 下載 RapidSSLRSACA2018.crt.pem , 用文字編輯器打開,大概長這樣:


RapidSSLRSACA2018.crt.pem 的內容

4. 回到 Jupyter Notebook 執行

import certifi

certifi.where()

執行結果:

'C:\\Users\\ManaTsao\\.conda\\envs\\tensorflowenv\\lib\\site-packages\\certifi\\cacert.pem'

找到該檔案,也用文字編輯器打開,內容會像是這樣:


cacert.pem 的內容

5. 接著把網頁上 Rapid SSL RSA 的說明,copy 到 cacert.pem 的最下方,再 copy RapidSSLRSACA2018.crt.pem 裡面所有的內容,結果如下:


加上 RapidSSLRSACA2018.crt.pem 的結果

完成後記得存檔

6. 回到 Jupyter Notebook 重新執行

import requests

requests.get("https://techpro.tp.edu.tw/manager/cms/taipei-edu/scartch.html")

就不會有錯誤或警告了,結果如下:

<Response [200]>

第一次發此類文,只是把這幾天受的苦、網路爬的文做個記錄,希望能幫到大家。Bye now~

************************************************************************

有另一個方法可以試試:

使用Browser 的下載憑證,載網址左邊有一鎖頭小圖示,點進去後下載發行公司的憑證