Posts
>-
條款四十八,不要遍巡 CURSOR 去確認是否含有資料。
像是下面這段程式片巡走訪 CURSOR 以確認是否含有資料,這樣並不是很好的寫法。
DECLARE l_employee_found BOOLEAN := FALSE; … BEGIN <<check_employees>> FOR r_employee IN c_employee LOOP l_employee_found := TRUE; END LOOP check_employees; END; 比較好的作法應該像是下面這段程式這樣,將 CURSOR 開啟,嘗試 Fetch 一筆資料,利用 CURSOR 的 %FOUND 去判斷是否含有資料,最後將 CURSOR 關閉。
DECLARE l_employee_found BOOLEAN := FALSE; … BEGIN OPEN c_employee; FETCH c_employee INTO r_employee; l_employee_found := c_employee%FOUND; CLOSE c_emplyoee; END;
read morePosts
PL/SQL SQL CODING GUIDELINE 47 - Try to label your EXIT WHEN statements
條款四十七,嘗試將 EXIT WHEN 搭配 label 使用。
像是下面這樣的程式,雖然使用了 EXIT WHEN 跳離迴圈,但是未搭配 label 使用,因此在巢狀迴圈下得一層一層的跳離。
BEGIN ... <<outerloop>> LOOP ... <<innerloop>> LOOP ... EXIT WHEN l_innerlp = co_exit_value; END LOOP innerloop; EXIT WHEN l_innerlp = co_exit_value; END LOOP outerloop; END; 如果將 EXIT WHEN 搭配 label 使用可以直接在巢狀迴圈下跳離,這樣程式會比較簡短、清晰、且易於維護。
BEGIN ... <<outerloop>> LOOP ... <<innerloop>> LOOP ... EXIT outerloop WHEN l_innerlp = 3; END LOOP innerloop; END LOOP outerloop; END;
read morePosts
>-
條款四十六,總是使用 EXIT WHILE loop 去跳離迴圈,不要使用 IF…EXIT。
像是下面這樣的程式使用 IF 判斷要跳離迴圈的條件是否成立,成立的話使用 EXIT 跳離迴圈。如果 IF 判斷只是單純的用來處裡跳離迴圈的條件判斷,那這樣的撰寫方式就不是那麼洽當,程式碼變得比較冗餘,且不好維護。
BEGIN <<process_employees>> LOOP ... IF ... THEN EXIT process_employees; END IF; ... END LOOP process_employees; END; 比較好的做法是用 EXIT WHEN,將跳離迴圈的判斷直接寫在 EXIT WHEN 後面,這樣程式會比較簡短、清晰、且易於維護。
BEGIN <<process_employees>> LOOP ... EXIT process_employees WHEN (...); END LOOP process_employees; END;
read morePosts
>-
條款四十五,避免使用 EXIT 去跳離迴圈,除非使用的是 basic loop。
像是下面這樣的程式,使用了 EXIT 去跳離迴圈,但是非 basic loop 都有迴圈的邊界條件可以設定,可以做到一樣的事情,所以這樣的寫法並不是很好。
... i := co_min_value; <<while_loop>> WHILE (i <= co_max_value) LOOP i := i + co_increment; EXIT while_loop WHEN i > co_max_value; END LOOP while_loop; <<for_loop>> FOR i IN co_min_value..co_max_value LOOP ... EXIT for_loop WHEN i = co_max_value; END LOOP for_loop; <<process_employees>> FOR r_employee IN (SELECT last_name FROM employees) LOOP ... EXIT process_employees; END LOOP process_employees; ... 若使用非 basic loop,建議使用邊界條件來跳離迴圈。而 basic loop 因為沒有邊界條件的設定,因此也只能使用 EXIT 來跳離迴圈。
read morePosts
Logstash - grok filter
grok filter 能讓我們使用 Grok 語法簡易的切割 Logstash field。
其可使用的設定如下:
Setting Type Required Default Description add_field hash No {} If this filter is successful, add any arbitrary fields to this event. add_tag array No [] If this filter is successful, add arbitrary tags to the event. break_on_match boolean No true Break on first match. The first successful match by grok will result in the filter being finished. If you want grok to try all patterns (maybe you are parsing different things), then set this to false.
read morePosts
Winlogbeat - Install Winlogbeat on Windows
要在 Windows 下使用 Winlogbeat,可先至官網下載下來解壓縮。
裡面比較會要用到的檔案有 winlogbeat.exe、install-service-winlogbeat.psl、uninstall-service-winlogbeat.psl 與 winlogbeat.yml。
winlogbeat.yml 是 Winlogbeat 的設定檔,設定完後直接點擊 winlogbeat.exe 就會開始作用。
也可以執行 install-service-winlogbeat.psl 註冊成 Windows 服務,讓 Winlogbeat 在背景服務。
Windows 服務註冊完後記得將服務啟動才有效果。
做到這邊 Winlogbeat 就能依照設定正常的傳送 Windows Event Logs。
若有需要後續也可執行 uninstall-service-winlogbeat.psl 將 Winlogbeat 的 Windows 服務移除。
Link Download Winlogbeat • Ship Windows Event Logs | Elastic
read morePosts
Logstash - Getting started
Logstash 安裝好後,可以用 Logstash 的 -e 參數帶入 Logstash 設定快速的體驗一下。
logstash -e <Setting> 像是下面這樣帶入簡單的設定,將標準輸入串流輸入的資料導到標準輸出串流。
logstash -e 'input { stdin{} } output { stdout{} }' 將資料輸入。
資料就會被輸出到標準輸出串流。
不再使用時按下熱鍵 Ctrl + D 即可退出。
除了 Input & Output 外,也可以試著設定 Filter,像是要用 Filter 去將訊息內的 IP 切成 client field,可以像下面這樣調用。
logstash -e 'input { stdin{} } filter { grok { match => { "message" => "%{IP:client}" } } } output { stdout { codec => rubydebug } }'
read morePosts
Oracle SQL Developer - Unit testing
要用 Oracle SQL Developer 撰寫單元測試,可點選 [View | Unit Test] 主選單選項。
將 Unit Test 視窗開啟。
點選 [Tools| | Unit Test | Select Current Repository…]。
選取 Connection。
如果 Connection 未建立過 Unit Test 的 Repository,Oracle SQL Developer 可直接幫我們建立。
連到 Repository 後,Unit Test 視窗就會多出 Library、Lookups、Reports、Suites、Tests 這些目錄。
我們可以直接在 SP 上或是 Unit Test 視窗上按下滑鼠右鍵,點選 Create Test… 滑鼠右鍵快顯選單,開始建立 Unit Test。
選取要撰寫 Unit Test 的 SP。
設定 Unit Test 的名稱。
設定 Unit Test 前要做的前置動作。
設定 SP 運行時所需要的參數。
設定 Unit Test 的驗證部分。
read morePosts
Logstash - Install Logstash via apt
安裝 Logstash 前,需先確認已有安裝 Java 8。
可輸入指令查看 Java 版本。
java -version 若版本不對,可先進行 Java 8 的安裝。
apt-get install python-software-properties 加入 PPA。
add-apt-repository -y ppa:webupd8team/java 進行 apt-get 的更新。
apt-get update 透過 APT 安裝 Java 8。
apt-get -y install oracle-java8-installer Java 環境準備好後,開始進行 Logstash 的安裝。
設定 repository definition。
echo "deb http://packages.elastic.co/logstash/2.1/debian stable main" | sudo tee -a /etc/apt/sources.list.d/logstash-2.x.list 透過 APT 安裝 Logstash。
apt-get install logstash Link Installing Logstash | Logstash Reference [5.4] | Elastic
read morePosts
Ansible - Copy module
Ansible 的 Copy module 可以用來處理檔案的複製。
可用的參數如下:
parameter required default choices comments attributes no None Attributes the file or directory should have. To get supported flags look at the man page for chattr on the target system. This string should contain the attributes in the same order as the one displayed by lsattr. backup no no yes/no Create a backup file including the timestamp information so you can get the original file back if you somehow clobbered it incorrectly.
read more