2017年11月13日 星期一

Dev C++, C++11 編譯器設定

今天在Windows 10, Dev C++ v5.11 環境

#include <iostream>
#include <bitset>
using namespace std;

int main() {
    unsigned short short1 = 4;   
    bitset<16> bitset1{short1};   // the bitset representation of 4
    cout << bitset1 << endl;  // 0000000000000100

    unsigned short short2 = short1 << 1;     // 4 left-shifted by 1 = 8
    bitset<16> bitset2{short2};
    cout << bitset2 << endl;  // 0000000000001000

    unsigned short short3 = short1 << 2;     // 4 left-shifted by 2 = 16
    bitset<16> bitset3{short3};
    cout << bitset3 << endl;  // 0000000000010000
}


















☆ Changing mode from c++98 mode in Dev-C++ to a mode that supports C++11

想要在DEV C++運行C++11程式碼:
工具->編譯器選項->一般
呼叫編譯器加入指令 "-std=c++11" or "-std=c++0x"

2017年10月31日 星期二

時間函數

#include <stdio.h>
#include <time.h>
#include <string>
using namespace std;

//#pragma warning(disable : 4996) //_CRT_SECURE_NO_WARNINGS

int main() {
time_t NowTime;
time(&NowTime);
struct tm* timeInfo = localtime(&NowTime);
char timeStr[32];
strftime(timeStr, sizeof(timeStr), "%Y-%m-%d", timeInfo);
printf("%s", timeStr);
}
執行結果:
2017-10-31


strftime函數
http://www.cplusplus.com/reference/ctime/strftime/


2017年10月13日 星期五

Linux 設定IP

修改 IP 地址

馬上生效
# ifconfig eth0 192.168.0.2 netmask 255.255.255.0
開機或重啟後生效:
[root@kevin ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0                <== 網路卡代號,必須要 ifcfg-eth0 相對應
BOOTPROTO=static           <== 開機協定,有 dhcp static 這裡是 static
IPADDR=192.168.122.19       <== IP
NETMASK=255.255.255.0      <== 子遮罩網路
NETWORK=192.168.122.0        <== 網域!該網段的第一個 IP
BROADCAST=192.168.122.255    <== 廣播位址 
GATEWAY=192.168.122.1      <== 預設路由  

釋放IP
# dhclient -r eth0
# dhclient eth0

2017年9月1日 星期五

位元運算子

& AND 都1才是1
| OR 有1就是1
^ XOR 相同是0,不同是1
! NOT 反向


意義運算子範例abc
AND&c=a & b1100 11011001 11101000 1100
OR|c= a | b1100 11011001 11101101 1111
XOR^c= a ^b1100 11011001 11100101 0011
NOT~c =~a1100 1101 0011 0010

2017年8月24日 星期四

Jenkins Upgrades To Java 8

公司使用的Jenkins目前版本是Weekly Ver 2.35
考慮到隱定度問題,這次想換成Long-term Support(LTS)版本
從我開始使用Jenkins到現在,有更新過二次,但這次要升級到
Ver 2.60.3 卻發生問題了!

之前升級都是選擇「管理 Jenkins」 =>「自動升版」,然後重新開啟
Jenkins 服務就完成了。但這次是要從Weekly版換成LTS版。所以就
必需手動下載 .war 檔,再放到Jenkins 的安裝目錄
e.g. C:\Program Files (x86)\Jenkins (記得先備份舊檔案)
先關閉Jenkins 服務,再做替換,完成後再重新開啟Jenkins 服務

"無法啟動 本機電腦的Jenkins 服務
錯誤 1067:處理程序意外中止"

什麼~~~ 難到是不能從Weekly版本轉換到LTS版本?
於是我又下載了Ver 2.75 Weekly版,重新做了一次升級步驟
"無法啟動 本機電腦的Jenkins 服務...錯誤 1067:處理程序意外中止"
還是不行...

What  the  xxxx ??? 看了一下 jenkins.err.log 發現是Java 版本太低
官網聲明,Weekly版 Ver 2.52 or laterLTS版 Ver 2.60.1 or later
Require Java 8

所以我就更改電腦的環境變數
JAVA_HOME = C:\Program Files (x86)\Java\jdk1.8.0_131
PATH 加入 C:\Program Files (x86)\Java\jdk1.8.0_131\bin
再重新啟動Jenkins 服務,發現問題還是存在!

因為我的Jenkins Server 是在VM環境,當初我有做Snapshot
所以我Revert 到升級前的狀態。先做Java升級的動作,再做
Jenkins升級的動作。我發現設定完環境變數,Jenkins Server
還是跑在Java 7的環境?

Jenkins runtime version 的設定,要去 Jenkins 的安裝目錄下\ Jenkins.xml
<executable>%BASE%\jre\bin\java</executable>
改成
<executable>C:\Program Files (x86)\Java\jre1.8.0_131\bin\java</executable>

設定完Java runtime 環境,再替換.war 檔,再重新啟動Jenkins 服務
Done~~~~~~~~~~~~~!!
成功從Weekly Ver 2.35 升級到LTS Ver 2.60.3

結論:
Jenkins 的Weekly版 Ver 2.52 or later,LTS版 Ver 2.60.1 or later
只支援Java 8,所以要下載Java8 並設定Jenkins.xml





2017年8月22日 星期二

Performance Testing vs Load Testing vs Stress Testing

效能測試:在正常的執行下,利用負載測試方式,反覆測試與調整直到系統符合期望值。

負載測試:在瀕臨上限時,給予大量的負載,測試系統是否還能正常運作。

壓力測試:在超過上限後,給予特定的壓力條件,驗證系統是否依然可以正常運作或crash 之後是否可以回復之前的狀態。


2017年8月21日 星期一

Google Test 實作

開始建置
下載:
https://github.com/google/googletest,下載下來後根據適當的平台進行編譯
編譯:
在.\googletest-master\googletest\msvc資料夾下可以看到gtest, gtest-md 兩個.sln
兩個差別在 gtest 編譯屬性為MT (MTd),而 gtest-md為MD (MDd),這裡要選擇
跟待測專案同樣的設定。

選擇Platform、Configuration

選擇 gtest,點擊滑鼠右鍵,點選「建置」

編譯成功後,會產生gtest.lib

連結:
將gtest.h的所在位置加入測試專案的include path

將gtest.lib的所在位置加入include path

將gtest.lib加入相依性

設定與gtest相同的Runtime Library

撰寫測試前概念
當撰寫 Google Test 時,我們透過一些 assertions (ex. ASSERT_EQ(expect, actual))
來確認函式的呼叫結果是不是如我們所預期。函式的返回結果可能是True, False.
 如果返回結果與預期結果不符,代表測試Failure. 這時這個測試就會結束。但是
有時一個測試過程可能會包含多個測試步驟,如果使用Assertion,只要一個測試
步驟Failure,則接下來的測試步驟便不會往下跑。 若希望就算這個測試步驟Failure
接下來的測試步驟能夠繼續的話,那就要改用Expect的語法
(ex. EXPECT_EQ(expect, actual)).

撰寫測試
Demo:

首先這個範例分為production code和testing code兩個部分
Production code為:

Testing code為:
二個參數的定義是:[TestSuiteName,TestCaseName]

在 main 函式中運用 testing::InitGoogleTest 來處理命令列中 Google Test 特定的
參數, 執行 RUN_ALL_TESTS()

編譯後,產生Add.exe

執行測試 .exe

產生測試報告
--gtest_output=xml[:DIRECTORY_PATH\FILE_PATH\FILE_NAME.xml]

產出 AddTest.xml

XML 格式

Google C++ Testing Framework

最近開始著手寫公司產品的UnitTest (因為RD在初期開發時,並沒有寫)。
後補的概念...

Google test 是基於 xUnit 的架構下開發的C/C++ 測試 Framework。

Features
  • An XUnit test framework.
  • Test discovery.
  • A rich set of assertions.
  • User-defined assertions.
  • Death tests.
  • Fatal and non-fatal failures.
  • Value-parameterized tests.
  • Type-parameterized tests.
  • Various options for running the tests.
  • XML test report generation.

Software Development Engineer In Test (SDET)

SDET與 Software Test Engineers(STE) 的差別,網路上都查得到。
對於我來說,最簡單的差異就是會不會  Coding

我們公司的STE 叫做Quality Assurance(QA),我們並沒有SDET 這個角色,
但我努力朝著這個方向前進!