2015年12月25日 星期五

2015年12月23日 星期三

2015年11月30日 星期一

在 JMeter 中驗證 JSON

在使用 JMeter 做自動化測試時,想要用比較簡單的方式處理網站回覆的 JSON
簡單查了點資料後,看起來預設的方法應該是用 JSR223 Post Processor 或者 BSF Post Processor
不過從 [1] 的描述看來,這個作法因為要把回應轉成 JavaScript 語法,實際跑起來效率頗低
如果遇到要執行的 concurrent thread 很多時,可能會把 CPU 吃滿。

2015年11月3日 星期二

java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy

在使用 Apache HttpClient 時,遇到一個找不到 TrustStrategy 的問題
根據 [1] 的解答,問題是發生在我用 Maven 引入了新版的 httpclient 4.5.1,但是沒有指定 httpcore 的版本
所以 Maven 自動用了比較舊版的 httpcore 4.3.x,導致了找不到需要的類別的問題。

2015年10月30日 星期五

在 Apache HttpClient 4.5 版忽略 HTTPS 認證

一般 HTTPS 連線會驗證包括證書本身以及像是 host name 等資訊
不過在測試階段時,有時會因為證書是用自我驗證來產生的,導致程式碼無法正常運作
HttpClient 有設定方法可以忽略這些認證資訊~
不過在 HttpClient 4.3 版以後,陸續有些類別和方法都被廢棄了
以下是在 HttpClient 4.5 版的設定方法。

2015年10月29日 星期四

使用 logback 時,在 Jetty 上忽略 Jetty 產生的 log

在部署專案時,嘗試了使用 slf4j + logback
不過部署到 Jetty 上就發現 Jetty 瘋狂地印出 Jetty 自己運行時的 debug log
變成要在 log 海中找到自己的 application log 非常花時間。

2015年10月20日 星期二

HTTP 基本驗證

HTTP 協定中有定義了基本的驗證方法,可以讓瀏覽器直接用明文方式傳輸驗證資訊。

從伺服器端的角度來說,伺服器在接收到 request 時,是去檢查是否有帶驗證資訊(Authorization 這個標頭)進來
沒有的話,伺服器會回應 HTTP Status Code 401
並且在標頭中加上 WWW-Authenticate: Basic realm="Secure Area" 的資訊
其中 "Secure Area" 是表示伺服器名稱,讓瀏覽器可以顯示在介面上提示使用者的。

如果 request 中已經有 Authorization 這個標頭,伺服器可以用 Base64 編碼去解開內容
裡面的資訊會以 : 的格式存放。

參考資料:
  1. HTTP基本認證

2015年10月19日 星期一

Jetty 的 ClassLoader 與模組設定

這篇記錄的標題有點難定...目的是想用來記錄這幾天遇到的 ClassNotFound 問題。

我的環境原先是在 {$JETTY_HOME}/lib 裡面建立一個資料夾 {$JETTY_HOME}/lib/{PROJECT_NAME},放我的專案要用的函式庫(都是開源的函式庫)
運作時看起來都蠻好的,但後來遇到需要引用另一個我們自己寫的 jar
這時問題就出現了,我把 jar 一樣丟進 {$JETTY_HOME}/lib 資料夾裡,卻一直跑出 ClassNotFoundException 的錯誤。

2015年10月14日 星期三

使用 Jersey client 送出 HTTP 要求

一般來說,要用 Java 送出 HTTP 要求時,大多直覺會想到的都是 Apache HttpClient 吧
不過在我們的環境中,遇到了一點奇妙的需求,Apache 的套件有點不合用
剛好又發現有網友提到,Jersey 本身就有提供 Jersey client 可以作為送出 HTTP 的方法
而且我們本來就用 Jersey 來提供 RESTful 介面,不需要另外引用函式庫,所以就拿來試試看了。

2015年10月5日 星期一

在 Jetty 9 上使用 Logger

從 Tomcat 改用 Jetty 以後,第一個遇到的問題就是,以前用的 Log4j 好像沒有反應了。
查了一下,Jetty 好像預設使用 slf4j(如果 classpath 中存在 slf4j 的話)[1]
所以似乎比較建議使用 slf4j 作為 Logger。

Jetty 9 設定

有關如何設定 Jetty,可以參考 [1] 的官方文件
Jetty 的設定檔主要是放在 ./etc 目錄裡的 XML
關於 HTTP 的設定可以編輯 jetty-http.xml~。
例如想要變更預設的 port 的話,可以編輯 jetty-http.xml 中的這行:
<Set name="port"><Property name="jetty.http.port" deprecated="jetty.port" default="8080" /></Set>

參考資料:
  1. Chapter 6. Configuring Jetty Connectors

2015年10月1日 星期四

在 Ubuntu 14.04 安裝 OpenJDK 8

add-apt-repository ppa:openjdk-r/ppa
apt-get update
apt-get install openjdk-8-jre

2015年9月10日 星期四

透過 Guice 入門 Dependency Injection(二):動態選擇實作類別

作為某些方面可以替代重量級 Spring 的輕量級套件
Guice 可以透過程式碼的設定,動態決定注入介面時,要選擇的實作類別。

透過 Guice 入門 Dependency Injection(一)

Guice 是一個可以用來取代原本 Java 程式設計師習慣使用的 Factory 的套件
某種程度上也可以算是一個輕量級的 Spring,能夠動態地做實作類別的注入。
關於 Guice 的開發動機,可以參考 GitHub 上說明動機的頁面 [1]。
另外如果想知道關於 Guice 開發團隊自己怎麼看 Guice 和 Spring,可以參考 [2]。

2015年9月9日 星期三

[WARNING] Using platform encoding (MS950 actually) to copy filtered resources, i.e. build is platform dependent!

最近突然注意到,Maven 在執行時都會跑出這一段警告訊息
[WARNING] Using platform encoding (MS950 actually) to copy filtered resources, i.e. build is platform dependent!
雖然不影響 Maven 的運作,但就覺得編碼不用 UTF-8 就有點不太對~
很快速地 Google 後,看到別人發表的解法,只要在專案的 pom.xml 裡加入以下的設定
就可以指定 Maven 使用 UTF-8 編碼來執行了。
<project>
    ....
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

參考資料:
  1. Maven compile 出現 [WARNING] Using platform encoding 警告

使用 Maven 匯出第三方函式庫

在已經寫好 pom.xml 的情況下,如果需要匯出 pom.xml 上指定的所有第三方函式庫的話
可以使用 Maven 的 copy-dependencies 的功能:
mvn dependency:copy-dependencies
那些第三方函式庫就會被匯出到 ./target/dependency 的目錄裡。

參考資料:
  1. export dependency libs

2015年9月3日 星期四

在 Ubuntu 的 VMware 虛擬機器上安裝 VM Tool

一般安裝 VM Tool 的方法,是參考 [1] 的方式,安裝 VMware Tool
不過在部分作業系統上,因為 VMware 已經支援開源版的 VMware Tool:Open VM Tool 的關係 [2]
可以直接利用指令安裝由虛擬機器自行管理的 VM Tool。

apt-get install open-vm-tools

關於 Open VM Tool 的說明,以下節錄 [2] 的描述:
The primary purpose for open-vm-tools is to enable operating system vendors and/or communities and virtual appliance vendors to bundle VMware Tools into their product releases. open-vm-tools is the open source implementation of VMware Tools and consists of a suite of virtualization utilities that improves the functionality, administration, and management of virtual machines within a VMware environment.

參考資料:
  1. (VMesxi 安裝篇-Day10) Install VMware tools for Linux 
  2. VMware support for open-vm-tools (2073803)

2015年8月31日 星期一

使用 Python 整合 VMware vSphere

pyVmomi [1] 是一個由 VMware 官方釋出的 Python API,可以用來存取 vSphere/vCenter 的資源。
另外有一些簡易的使用範例 [2],可以大略參考要如何開始使用 Python 連接 vSphere/vCenter。
這篇是用來記錄初步介接 vSphere/vCenter 的經驗。

2015年8月27日 星期四

在 gitlab 上更新 fork 出來的專案

在 GitLab 的介面上,可以透過 Fork 的功能,把別人的專案建立一個 fork 到自己的帳號底下
例如原始專案的網址是 http://gitlab/userA/project,fork 出來的專案網址會是 http://gitlab/userB/project。
不過原始專案會由原始專案的專案成員繼續更新,而自己 fork 下來的專案則會停在執行 fork 當時的狀況
如果想要跟著原始專案一起更新的話,需要額外做一點小撇步 [1]。

2015年8月21日 星期五

使用 pyVmomi 時略過 HTTPS 警告

在使用 pyVmomi 連接 VMware 的 API 時,第一個遇到的問題是程式出現以下的警告:
/usr/lib/python2.6/site-packages/requests-2.7.0-py2.6.egg/requests/packages/urllib3/connectionpool.py:768: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
看起來就是因為連線要使用 HTTPS,但是沒有給予憑證的問題~。
不過簡單地搜尋一下,就看到 [1] 的解法,只要把 requests 這個套件的警告關掉就可以了。
import atexit
import requests
from pyVim import connect

# Disable the checking of certification.
requests.packages.urllib3.disable_warnings()
# Initiate the connection to VMware vSphere.
service_instance = connect.SmartConnect(
        host="192.168.200.200",
        user="administrator@vsphere.local",
        pwd="qwer",
        port=443)
atexit.register(connect.Disconnect, service_instance)

# Get the session ID from the connection.
session_id = service_instance.content.sessionManager.currentSession.key
print("Session ID: %s" % session_id)

程式印出的回覆如下:
Session ID: 521eab6e-7ef1-d7e6-1f67-ba38dd7e2487

參考資料:
  1. Surpress InsecureRequestWarning: Unverified HTTPS request is being made in Python2.6

2015年8月19日 星期三

指定版本安裝 Python 套件:以 easy_install 為例

Python 常見的套件管理程式有 easy_install 跟 pip,兩者都有可能直接內建在作業系統上
因為軟體開發時,通常需要指派固定的第三方套件版本,以確保不會因為第三方套件的意外升級導致軟體出錯
因此就找了以 easy_install 來安裝指定版本的 Python 套件的方法。
完整的介紹可以參考 [1],有包括 easy_install 與 pip 的說明。

2015年8月18日 星期二

在 Python 2.6 執行指令並擷取回應

想要用 Python 執行某個指令,並且把指令回覆的資料拿來做後續的程式處理
在 Python 2.7 以上版本可以用 subprocess.check_output() 這個方法
不過看了一下文件,Python 2.6 似乎沒有 check_output 的方法,有的只有 Popen 而已。

2015年8月12日 星期三

無法啟用 GlusterFS 的 NFS 服務

GlusterFS 本身有提供 NFS 的介面,並且預設就會開啟
不過最近在把一台壞掉的 GlusterFS 節點重裝,並且恢復成叢集的一部分時
遇到了 NFS 不知道為什麼,一直打不開的問題。

2015年8月5日 星期三

在 Python 匯入其他資料夾的模組

這個問題在網路上其實可以找到非常多的討論,好像很多人都遇到一樣的問題
花了一些時間研究,雖然還是搞不太懂怎麼樣用相對路徑匯入模組
不過至少純以專案內自己的絕對路徑,目前實驗是可以運作的~。

2015年7月20日 星期一

2015年7月9日 星期四

CentOS 不同安裝類型的差別

安裝 CentOS 的過程中,有一個畫面會問要安裝哪種類型的 CentOS
但並沒有提示類型之間的差異為何。
以下轉錄 [1] 的答案,在 CentOS 6.5 中的每個類型會安裝的東西。

2015年7月3日 星期五

自行架設 Wiki 引擎(四):使用 SyntaxHighlighter 擴充套件

Foswiki 本身有 verbatim 這個標籤,可以用來貼程式碼
不過我自己實際用的時候,看起來好像不會變色 XD
因為貼程式碼時,還是有顏色的程式碼比較好辨識,因此就想到了部落格上在用的 SyntaxHighlighter
剛好又發現 Foswiki 有支援 SyntaxHighlighter 的 extension
所以就嘗試來安裝了!

2015年7月2日 星期四

自行架設 Wiki 引擎(一)補充:手動安裝 Foswiki(2016-06-01 修改)

因為要重新建置一個新的 Foswiki 系統,但直接使用之前的 Debian 安裝方法,裝出來的一直有點問題
因此這次就直接嘗試完全手動安裝了。

2015年5月7日 星期四

NFS v4 與 NFS v4.1 可用的 Operation 差別

這張表是直接比較 RFC 3530 與 RFC 5661 簡單做出來的表,空格表示不支援的 Operation
其中 NFS v4.1 除了有增加新的 Operation 以外,也減少了四個 Operation 的支援
原因可以參考 RFC 5661 的 8.8 節 [3]。

2015年4月16日 星期四

分散式儲存系統 Ceph(三):使用 inkScope 觀察 Ceph 狀態(2015-04-19 編輯)

inkScope 是由 Inktank 公司主導的一個 Ceph 網頁式管理工具
主要目的是提供視覺化的 Ceph 狀態監控~。


圖片轉錄自 Github

分散式儲存系統 Ceph(二):利用 ceph-deploy 部署 Ceph 叢集(2015-06-06 編輯)

Ceph 官方提供兩種安裝方式,一種是自行安裝(manual installation),另一種是透過部署工具(ceph-deploy)來部署。
雖然我自己也做過自行安裝,不過不知道哪裡弄錯了,成功次數有點少 XD
所以記錄下來的,主要是透過 ceph-deploy 工具的部署方法。

PS. 其實不看這篇文章,直接看官方文件也是一樣的~。

2015年3月12日 星期四

sudo: no tty present and no askpass program specified

在實驗 Ceph 時,遇到這個錯誤訊息
sudo: no tty present and no askpass program specified

Ubuntu 使用 UUID 開機自動掛載磁碟

一般掛載磁碟時都是使用 mount 指令,不過 mount 指令掛載的效果會在下次重開機時失效
為了避免每次開機都要重新掛載,可以把掛載的資訊寫在 /etc/fstab 檔案上
每次系統開機時就會自動依照 /etc/fstab 的資訊執行掛載了。

2015年2月16日 星期一

三主機安裝 OpenStack Juno(四):安裝 Network Node

前言:
這系列的文章只是我自己的 OpenStack Juno 安裝記錄,不過基本上內容都跟官方文件一樣
只是把一些細節整合起來,讓安裝時的設定稍微沒那麼繁瑣一點
但如果想知道各個步驟的原因以及用途,建議還是應該回頭去看看官方的安裝文件。

2015年2月4日 星期三

在 Ubuntu 中查詢、安裝特定版本的套件

想查詢在 Ubuntu 上特定的套件有哪個版本可以選擇時,可以利用 apt-cache 指令來查詢。
root@ubuntu:/home/ubuntu# apt-cache policy apache2
apache2:
  Installed: (none)
  Candidate: 2.4.7-1ubuntu4.1
  Version table:
     2.4.7-1ubuntu4.1 0
        500 http://nova.clouds.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
     2.4.7-1ubuntu4 0
        500 http://nova.clouds.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

然後在知道版本名稱後,需要安裝特定版本的套件時,就可以透過指定版本來達成。
apt-get install apache2=2.4.7-1ubuntu4

2015年1月29日 星期四

三主機安裝 OpenStack Juno(三):安裝 Compute Node

前言:
這系列的文章只是我自己的 OpenStack Juno 安裝記錄,不過基本上內容都跟官方文件一樣
只是把一些細節整合起來,讓安裝時的設定稍微沒那麼繁瑣一點
但如果想知道各個步驟的原因以及用途,建議還是應該回頭去看看官方的安裝文件。

2015年1月16日 星期五

在 Ubuntu 讓單網卡取得多個 IP

可以用 interface:serial 來指定一張網卡持有多個 IP。
需要特別注意的是,gateway 必須設定在第一個 IP。

2015年1月15日 星期四

三主機安裝 OpenStack Juno(二):安裝 Controller Node

前言:
這系列的文章只是我自己的 OpenStack Juno 安裝記錄,不過基本上內容都跟官方文件一樣
只是把一些細節整合起來,讓安裝時的設定稍微沒那麼繁瑣一點
但如果想知道各個步驟的原因以及用途,建議還是應該回頭去看看官方的安裝文件。

2015年1月14日 星期三

三主機安裝 OpenStack Juno(一):安裝環境介紹

記錄一下安裝 OpenStack Juno 的過程。其實大體上都是遵照官方文件去做的,只是把一些流程整合起來而已
除了一開始安裝 Identity 的時候有一大票的指令(指令基本上是參考 [2] 做微調而來的,不過其實內容也就是官方文件的統整)
整合最多的大概都是改設定文件的動作。
官方文件為了簡要解釋每個動作的用意,把很多編輯同一個設定檔的動作都分開寫~
所以照個文件一個指令一個動作,其實是有點繁雜~
但反過來說,如果想知道每個設定是做什麼用的,建議還是應該回頭去看官方文件上的說明(還有設定檔上的註解)。

2015年1月9日 星期五

D-Link DGS-1210-24 設定 VLAN 隔離實體網路

其實我沒什麼網管的經驗,所以也搞不太懂分享器上面這麼多奇奇怪怪的設定是怎麼回事@@
不過這篇主要是記錄之前試出來的實體網路切割方法
切割的目的是因為我有借到一台 D-Link DGS-1210-24 的分享器
而實體機器的網路佈署方式是需要有三個內部網路、一個外部網路
其中四個網路互相都不通,同時三個內部網路都不能對外連線。