搜尋此網誌

2015-06-24

golang 強大的 xml 處理能力

基本上是 reflectStruct Tags 的應用,拿來讀取 xml 更顯示出強大的威力。

如果是要該 tag 的內容,就不需要加上 attr,一切依 xml 的格式而定。
package main

import (
    "net/http"
    "fmt"
    "io/ioutil"
    "encoding/xml"
)

type FX struct {
    Currency string `xml:"currency,attr"`
    Rate string `xml:"rate,attr"`
}

type Fixing struct {
    Date string `xml:"time,attr"`
    FXs []FX `xml:"Cube"`
}

type Dates struct {
    Cube []Fixing `xml:"Cube>Cube"`
}

func main() {
    var resp *http.Response
    var data Dates

    resp, _ = http.Get("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml")
    defer resp.Body.Close()
    XMLdata, _ := ioutil.ReadAll(resp.Body)
    xml.Unmarshal(XMLdata, &data)

    fmt.Println(data)
}
namespace 比較麻煩,目前需要加上 full path URL。
package main

import (
    "net/http"
    "fmt"
    "io/ioutil"
    "encoding/xml"
)

type DataSet struct {
    Date string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices NEW_DATE"`
    M1 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_1MONTH"`
    M3 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_3MONTH"`
    M6 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_6MONTH"`
    Y01 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_1YEAR"`
    Y02 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_2YEAR"`
    Y03 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_3YEAR"`
    Y05 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_5YEAR"`
    Y07 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_7YEAR"`
    Y10 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_10YEAR"`
    Y20 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_20YEAR"`
    Y30 string `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices BC_30YEAR"`
}

type Property struct {
    D DataSet `xml:"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata properties"`
}

type Content struct {
    P []Property `xml:"entry>content"`
}

func main() {
    var resp *http.Response
    var data Content

    resp, _ = http.Get("http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=year(NEW_DATE)%20eq%202015")
    defer resp.Body.Close()
    XMLdata, _ := ioutil.ReadAll(resp.Body)
    xml.Unmarshal(XMLdata, &data)

    fmt.Println(data)
}
收工。

2015-06-15

指令列控制 openVPN

由於 Raspbian 預設是 LXDE 界面,而目前 openVPN 只有 Gnome 的 applet,所以用指令列來控制,也比較省系統資源。

以 root 權限安裝 openvpn。
apt-get install openvpn
建一個目錄放相關文件。
mkdir /etc/openvpn
將 ca.crt 與 crl.pem 等相關驗證文件拷貝進去後,建立一個 userpass.txt 放帳號密碼。假設帳號是 username,密碼是 password。
username
password
接著修改 sample.ovpn,加入這一行來自動驗證帳號跟密碼。
auth-user-pass /etc/openvpn/userpass.txt
啟動 openVPN,以 sample.ovpn 做設定。
openvpn --config /etc/openvpn/sample.ovpn &
將 openVPN 斷線。
pkill -SIGTERM -f 'openvpn --config /etc/openvpn/sample.ovpn'
用 killall 也可以。
killall openvpn
收工。