go+語言+log4go go+語言 七牛

chkds/p命令無法識(shí)別是什么原因

要先進(jìn)到ngrok.cfg的路徑下,在執(zhí)行命令才行。

創(chuàng)新互聯(lián)是專業(yè)的大足網(wǎng)站建設(shè)公司,大足接單;提供成都做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行大足網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

ngrok配置方法

1、下載ngrok源碼

(GOPATH=~/goproj)

$ mkdir ~/goproj/src/github.com/inconshreveable

$ git clone

$ export GOPATH=~/goproj/src/github.com/inconshreveable/ngrok

2、生成自簽名證書

使用ngrok.com官方服務(wù)時(shí),我們使用的是官方的SSL證書。自建ngrokd服務(wù),我們需要生成自己的證書,并提供攜帶該證書的ngrok客戶端。

證書生成過程需要一個(gè)NGROK_BASE_DOMAIN。 以ngrok官方隨機(jī)生成的地址693c358d.ngrok.com為例,其NGROK_BASE_DOMAIN就是"ngrok.com",如果你要 提供服務(wù)的地址為"example.tunnel.tonybai.com",那NGROK_BASE_DOMAIN就應(yīng)該 是"tunnel.tonybai.com"。

我們這里以NGROK_BASE_DOMAIN="tunnel.tonybai.com"為例,生成證書的命令如下:

$ cd ~/goproj/src/github.com/inconshreveable/ngrok

$ openssl genrsa -out rootCA.key 2048

$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=tunnel.tonybai.com" -days 5000 -out rootCA.pem

$ openssl genrsa -out device.key 2048

$ openssl req -new -key device.key -subj "/CN=tunnel.tonybai.com" -out device.csr

$ openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

執(zhí)行完以上命令,在ngrok目錄下就會(huì)新生成6個(gè)文件:

-rw-rw-r– 1 ubuntu ubuntu 1001 Mar 14 02:22 device.crt

-rw-rw-r– 1 ubuntu ubuntu 903 Mar 14 02:22 device.csr

-rw-rw-r– 1 ubuntu ubuntu 1679 Mar 14 02:22 device.key

-rw-rw-r– 1 ubuntu ubuntu 1679 Mar 14 02:21 rootCA.key

-rw-rw-r– 1 ubuntu ubuntu 1119 Mar 14 02:21 rootCA.pem

-rw-rw-r– 1 ubuntu ubuntu 17 Mar 14 02:22 rootCA.srl

ngrok通過bindata將ngrok源碼目錄下的assets目錄(資源文件)打包到可執(zhí)行文件(ngrokd和ngrok)中 去,assets/client/tls和assets/server/tls下分別存放著用于ngrok和ngrokd的默認(rèn)證書文件,我們需要將它們替換成我們自己生成的:(因此這一步務(wù)必放在編譯可執(zhí)行文件之前)

cp rootCA.pem assets/client/tls/ngrokroot.crt

cp device.crt assets/server/tls/snakeoil.crt

cp device.key assets/server/tls/snakeoil.key

3、編譯ngrokd和ngrok

在ngrok目錄下執(zhí)行如下命令,編譯ngrokd:

$ make release-server

不過在我的AWS上,出現(xiàn)如下錯(cuò)誤:

GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/…

make: bin/go-bindata: Command not found

make: *** [client-assets] Error 127

go-bindata被安裝到了$GOBIN下了,go編譯器找不到了。修正方法是將$GOBIN/go-bindata拷貝到當(dāng)前ngrok/bin下。

$ cp /home/ubuntu/.bin/go14/bin/go-bindata ./bin

再次執(zhí)行make release-server。

~/goproj/src/github.com/inconshreveable/ngrok$ make release-server

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/…

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/server/assets/assets_release.go \

assets/server/…

go get -tags 'release' -d -v ngrok/…

code.google.com/p/log4go (download)

go: missing Mercurial command. See

package code.google.com/p/log4go: exec: "hg": executable file not found in $PATH

github.com/gorilla/websocket (download)

github.com/inconshreveable/go-update (download)

github.com/kardianos/osext (download)

github.com/kr/binarydist (download)

github.com/inconshreveable/go-vhost (download)

github.com/inconshreveable/mousetrap (download)

github.com/nsf/termbox-go (download)

github.com/mattn/go-runewidth (download)

github.com/rcrowley/go-metrics (download)

Fetching

Parsing meta tags from (status code 200)

get "gopkg.in/yaml.v1": found meta tag main.metaImport{Prefix:"gopkg.in/yaml.v1", VCS:"git", RepoRoot:""} at

gopkg.in/yaml.v1 (download)

make: *** [deps] Error 1

又出錯(cuò)!提示找不到hg,原來是aws上沒有安裝hg。install hg后(sudo apt-get install mercurial),再編譯。

$ make release-server

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/…

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/server/assets/assets_release.go \

assets/server/…

go get -tags 'release' -d -v ngrok/…

code.google.com/p/log4go (download)

go install -tags 'release' ngrok/main/ngrokd

同樣編譯ngrok:

$ make release-client

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/…

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/server/assets/assets_release.go \

assets/server/…

go get -tags 'release' -d -v ngrok/…

go install -tags 'release' ngrok/main/ngrok

AWS上ngrokd和ngrok被安裝到了$GOBIN下。

三、調(diào)試

1、啟動(dòng)ngrokd

$ ngrokd -domain="tunnel.tonybai.com" -httpAddr=":8080" -httpsAddr=":8081"

[03/14/15 04:47:24] [INFO] [registry] [tun] No affinity cache specified

[03/14/15 04:47:24] [INFO] [metrics] Reporting every 30 seconds

[03/14/15 04:47:24] [INFO] Listening for public http connections on [::]:8080

[03/14/15 04:47:24] [INFO] Listening for public https connections on [::]:8081

[03/14/15 04:47:24] [INFO] Listening for control and proxy connections on [::]:4443

求助,如何在 Win7 下搭建源碼閱讀環(huán)境

1、安裝google go

2、安裝git

3、安裝Mingw

4、把go的bin目錄添加到PATH環(huán)境變量,可以直接在CMD中執(zhí)行

SET PATH=%PATH%;C:\go\bin

5、把mingw的bin目錄添加到PATH路徑

SET PATH=%PATH%;C:\go\bin

6、下載ngrok源碼,

7、將下載的zip解壓出來,修改Makefile

將 export GOPATH:=$(shell pwd)

改為 export GOPATH:=C:\Users\Administrator\Desktop\ngork\ngrok-src

將 bin/go-bindata:

GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata

這段改為 bin/go-bindata:

GOOS=windows GOARCH=amd64 go get github.com/jteeuwen/go-bindata/go-bindata

8、修改log4go的路徑

修改src\ngrok\log\logger.go中l(wèi)og4o那段代碼為

log "github.com/keepeye/log4go"

9、cmd執(zhí)行

make release-all

Python中的logger和handler到底是個(gè)什么鬼

典型的日志記錄的步驟是這樣的:

創(chuàng)建logger

創(chuàng)建handler

定義formatter

給handler添加formatter

給logger添加handler

寫成代碼差不多就是醬嬸的(這個(gè)是照別的網(wǎng)頁抄的,參考附注):

1 import logging

2 ?3 # 1、創(chuàng)建一個(gè)logger ?4 logger = logging.getLogger('mylogger')

5 logger.setLevel(logging.DEBUG)

6 ?7 # 2、創(chuàng)建一個(gè)handler,用于寫入日志文件 ?8 fh = logging.FileHandler('test.log')

9 fh.setLevel(logging.DEBUG)

10 11 # 再創(chuàng)建一個(gè)handler,用于輸出到控制臺(tái) 12 ch = logging.StreamHandler()

13 ch.setLevel(logging.DEBUG)

14 15 # 3、定義handler的輸出格式(formatter)16 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

17 18 # 4、給handler添加formatter19 fh.setFormatter(formatter)

20 ch.setFormatter(formatter)

21 22 # 5、給logger添加handler 23 logger.addHandler(fh)

24 logger.addHandler(ch)

之后才可以正式的開始記錄日志。Java里面的java.util.Logging類差不多也是這樣,代碼還要更復(fù)雜一點(diǎn)。Golang的日志相對(duì)寫法簡(jiǎn)單一些,不過沒有什么格式,系統(tǒng)記錄一條時(shí)間,內(nèi)容格式完全自己手畫。第三方的日志庫倒是沒有接觸過,像Java的Log4j,Golang的log4go和seelog等等,不知道用起來會(huì)不會(huì)簡(jiǎn)單一點(diǎn)。我一直都記不住這些,因?yàn)椴惶斫鈒ogger和handler為什么要這樣寫。一直到這次任務(wù)中出現(xiàn)的在我看來相當(dāng)“詭異”的bug,才深入理解了一下。

我的任務(wù)是這樣的,要做一個(gè)日志切割的工具,按天將日志分割開,即每天0點(diǎn)產(chǎn)生一個(gè)新日志,將舊日志改名。并且,將超過3個(gè)月的日志刪除掉,以保證磁盤空間不會(huì)被log占滿。程序要求可以切割多個(gè)目錄中的不同日志,具體路徑由json中配置。

這里用到了logging.handlers類中的TimedRotatingFileHandler方法,用以獲得一個(gè)handler。大概的寫法為:

1 logger = logging.getLogger() #獲得logger2 handler = logging.handlers.TimedRotatingFileHandler(logfile, 'S', 1, 0) #切割日志3 handler.suffix = '%Y%m%d' #切割后的日志設(shè)置后綴4 logger.addHandler(handler) #把logger添加上handler5 logger.fatal(datetime.datetime.now().strftime('%Y-%m-%d')) #在新日志中寫上當(dāng)天的日期

這里我沒有設(shè)置level和formatter。因?yàn)橹皇欠指?,?duì)新日志沒有什么影響。TimedRotatingFileHandler函數(shù)的方法見附注,或查看python的源碼,這個(gè)函數(shù)是python寫的,可以找到定義。這里我使用的是每秒生成一個(gè)新的日志文件,之后用Crontab在每天0點(diǎn)調(diào)度,然后用for循環(huán)處理json中的每一個(gè)日志文件。

golang安裝第三包報(bào)錯(cuò) exec: "hg": executable file not found in %PATH%

【解決過程】

1.很明顯,是在windows的cmd中,找不到hg。

而對(duì)于hg,如果是cygwin等環(huán)境,那肯定沒問題,但是此處是cmd,所以沒法用hg。

2.參考:

``

[package code.google.com/p/go.example/hello: exec: “hg”: executable file not found in %PATH%. How to get remote golang packages?]`

go get code.google.com/p/log4go

vb中的DoEvents是干什么用的?

vb中的DoEvents是干什么用的?

把控制權(quán)交給操作系統(tǒng),以響應(yīng)窗口重畫、最大化、最小化等要求,避免出現(xiàn)應(yīng)用程序不響應(yīng)操作系統(tǒng)請(qǐng)求而 *** 作系統(tǒng)誤以為死機(jī)了。

舉個(gè)例子:在窗口中放一個(gè)textbox,然后寫程序,循環(huán)從1到10萬,然后循環(huán)體里面就是把這個(gè)數(shù)寫到textbox里面,如果沒有DoEvents,程序運(yùn)行的時(shí)候就是死機(jī)一樣,然后直到最后窗口顯示10萬,中間數(shù)字什么也看不見;如果在每次寫了textbox以后,都來一下DoEvents,窗口就會(huì)重畫,運(yùn)行的時(shí)候就能看見textbox里面的數(shù)一個(gè)一個(gè)的長(zhǎng)上去。

vb中的InitCommonControls是干什么用

vb中InitCommonControls是注冊(cè)并初始化通用控件窗口類。

另外還有一個(gè)加強(qiáng)版的InitCommonControlsEx函數(shù),可以注冊(cè)指定控件的窗口類。

在使用SDK編寫windows界面的時(shí)候,如果使用了月歷控件,IP地址控件等高級(jí)控件,則需要調(diào)用此函數(shù)。

例:

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int iCmdShow)

{InitCommonControls();

DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, Main_Proc);

return 0;}

函數(shù)InitCommonControls是個(gè)空函數(shù),不做任何事情。

但如果你調(diào)用了該函數(shù),則鏈接器會(huì)將你的程序鏈接到ctl32.lib,然后在程序啟動(dòng)時(shí),會(huì)加載ctl32.dll。

真正初始化的工作是在該庫的入口點(diǎn)處做的,在這里會(huì)注冊(cè)通用控件窗口類。

然后應(yīng)用程序就可以創(chuàng)建控件窗口,就象創(chuàng)建其它的子窗口控件一樣。

VB是干什么用的?

很廣,包括病毒

vb是干什么用的?

VB

VB 是Visual Basic編程語言

1991年,美國(guó)微軟公司推出了Visual Basic(可間稱VB),目前的最新版本是VB 2005(VB8)中文版。

Visual 意即可視的、可見的,指的是開發(fā)像windows操作系統(tǒng)的圖形用戶界面(Graphic User Interface,GUI)的方法,它不需要編寫大量代碼去描述界面元素的外觀和位置,只要把預(yù)先建立好的對(duì)象拖放到屏幕上相應(yīng)的位置即可。

Basic指的是Beginners all_purpose symbolic instruction code 初始者通用符號(hào)指令代碼語言。

Visual Basic有學(xué)習(xí)版、專業(yè)版和企業(yè)版三種版本,以滿足不同的開發(fā)需要。學(xué)習(xí)版適用于普通學(xué)習(xí)者及大多數(shù)使用Visual Basic開發(fā)一般Windows應(yīng)用程序的人員,但是;專業(yè)版適用于計(jì)算機(jī)專業(yè)開發(fā)人員,包括了學(xué)習(xí)版的全部?jī)?nèi)容功能以及Inter控件開發(fā)工具之類的高級(jí)特性;企業(yè)版除包含專業(yè)版全部的內(nèi)容外,還有自動(dòng)化構(gòu)件管理器等工具,使得專業(yè)編程人員能夠開發(fā)功能強(qiáng)大的組骨子里分布式應(yīng)用程序。

VB是一種可視化的、面向?qū)ο蠛筒捎檬录?qū)動(dòng)方式的結(jié)構(gòu)化高級(jí)程序設(shè)計(jì)語言,可用于開發(fā)Windows環(huán)境下的各類應(yīng)用程序。它簡(jiǎn)單易學(xué)、效率高,且功能強(qiáng)大可以與Windowsr專業(yè)開發(fā)工具SDK相媲美。在Visual Basic環(huán)境下,利用事件驅(qū)動(dòng)的編程機(jī)制、新穎易用的可視化設(shè)計(jì)工具,使用Windows內(nèi)部的廣泛應(yīng)用程序接口(API)函數(shù),以用動(dòng)態(tài)鏈接庫(DLL)、對(duì)象的鏈接與世隔嵌入(OLE)、開放式數(shù)據(jù)連接(ODBC)等技術(shù),可以高效、快速地開發(fā)Windows環(huán)境下功能強(qiáng)大、圖形界面豐富的應(yīng)用軟件系統(tǒng)。隨著版本的提高,Visual Basic的功能也越來越強(qiáng)。5.0版以后,Visual Basic推出了中文版,與前個(gè)版本相比,其功能有了很大提升。

在二十一世紀(jì)初,microsoft公司推出Visual Studio 2003與Visual Basic之間有了重大變化,Visual Studio為各種編程工具做了一個(gè)平臺(tái),Visual Basic.NET可在這種平臺(tái)上運(yùn)行。相對(duì)于傳統(tǒng)VB,有很大的不同。VB.Net,首次使用.Net構(gòu)架進(jìn)行可視化編程,并且能很好地與COM構(gòu)架兼容。2005年Visual Studio 2005則運(yùn)用了NET 2.0的技術(shù),更加的方便了程序員的工作??墒切碌某绦?qū)ο到y(tǒng)配置要求也較高,需要微軟.Net Framework 2.0以上的.Net構(gòu)架支持。

另外VB(V代表Vitamin)還有一個(gè)意思

維生素B包括維生素B1、維生素B2、維生素B6、維生素B12、煙酸、泛酸、葉酸。這些B族維生素是推動(dòng)體內(nèi)代謝,把糖、脂肪、蛋白質(zhì)等轉(zhuǎn)化成熱量時(shí)不可缺少的物質(zhì)。如果缺少維生素B,則細(xì)胞功能馬上降低,引起代謝障礙,這時(shí)人體會(huì)出現(xiàn)怠滯和食欲不振。相反喝酒過多等導(dǎo)致肝臟損害,在許多場(chǎng)合下是和維生素B缺乏癥并行的。

以下是含有豐富維生素B的食品:

①含有豐富維生素B1的食品:小麥胚芽、豬腿肉、大豆、花生、里肌肉、火腿、黑米、雞肝、胚芽米等。

②含有豐富維生素B2的食品:七腮鰻、牛肝、雞肝、香菇、小麥胚芽、雞蛋、奶酪等。

③含有維生素B6、維生素B12、煙酸、泛酸和葉酸等食品: 肝、肉類、牛奶、酵母、魚、豆類、蛋黃、堅(jiān)果類、菠菜、奶酪等。其中的維生素B1在人體內(nèi)無法貯存,所以應(yīng)每天補(bǔ)充。

B族維生素若想全部攝取比較困難,但是認(rèn)真選擇食物就可以簡(jiǎn)單且方便的攝取。上述含有維生素B的食物可以分為①和②③兩組。看看上述分類就可以明白,②和⑧全都含在大體相同的食物中。因此①作為一組食物,②和③合在一起形成一組食物,組合選擇兩組食物,基本上可以把B族維生素?cái)z取到手。

VB的還有第三種意思

價(jià)鍵理論

valence-bond theory

一種獲得分子薛定諤方程近似解的處理方法。又稱電子配對(duì)法。歷史上最早發(fā)展起來的化學(xué)鍵理論。主要描述分子中的共價(jià)鍵和共價(jià)結(jié)合,其核心思想是電子配對(duì)形成定域化學(xué)鍵。

1927年W.H.海特勒和F.W.倫敦首次完成了氫分子中電子對(duì)鍵的量子力學(xué)近似處理,這是近代價(jià)鍵理論的基礎(chǔ)。L.C.鮑林等加以發(fā)展,引入雜化軌道概念,綜合成價(jià)鍵理論,成功地應(yīng)用于雙原子分子和多原子分子的結(jié)構(gòu)。

價(jià)鍵理論是海特勒倫敦處理氫分子方法的推廣,要點(diǎn)如下:①若兩原子軌道互相重疊,兩個(gè)軌道上各有一個(gè)電子,且電子自旋方向相反,則電子配對(duì)給出單重態(tài),形成一個(gè)電子對(duì)鍵。②兩個(gè)電子相互配對(duì)后,不能再與第三個(gè)電子配對(duì),這就是共價(jià)鍵的飽和性。③遵循最大重疊原則,共價(jià)鍵沿著原子軌道重疊最大的方向成鍵。共價(jià)鍵具有方向性。原子軌道通常在某個(gè)特定方向上有最大值,只有在此方向上軌道間才有最大重疊而形成共價(jià)鍵。不同原子軌道有不同成鍵能力。原子軌道的最大值作為原子軌道成鍵能力的度量,鮑林給出s、p、d、f等原子軌道成鍵能力依次為1、3、5、7。在主量子數(shù)相同時(shí),成鍵能力大的軌道形成的共價(jià)鍵較牢固。

價(jià)鍵理論與化學(xué)家所熟悉的經(jīng)典電子對(duì)鍵概念相吻合,一出現(xiàn)就得到迅速發(fā)展。但價(jià)鍵理論計(jì)算比較復(fù)雜,使得后來發(fā)展緩慢。隨著計(jì)算技術(shù)日益提高,該理論還會(huì)有新發(fā)展。

在以太網(wǎng)技術(shù)中,VB稱做:虛擬網(wǎng)橋(Virtual Bridge)

VB其實(shí)是為了管理方便對(duì)管理域的一個(gè)劃分,相當(dāng)于一個(gè)虛擬的L2 Lanswitch。在城域網(wǎng)的應(yīng)用中,VB是基于用戶劃分的。即:每個(gè)用戶都有自己獨(dú)立的VB,其中包含多個(gè)vlan標(biāo)簽和mac地址。由于各個(gè)VB之間相互隔離,不同的VB可分配相同的vlan而互不影響,而基于vlan劃分VB的L2芯片不能區(qū)分不同用戶的相同vlan

vb里 Const是干什么用的

const是定義常數(shù),例如:const pi =3.14159,那么你在代碼中輸入pi就相當(dāng)于輸入3.14159。就是用一個(gè)類似變量的東西代替數(shù)值提高可讀性,但要注意,它不是變量。

VB 中 模塊是干什么用的啊?

我的理解就是已經(jīng)具備某種功能的一段代碼包。直接調(diào)用它可以完成某種功能。

vb6.0是干什么用的

軟件設(shè)計(jì)工具,本人認(rèn)為是個(gè)很好,也很簡(jiǎn)單的設(shè)計(jì)工具,很多日本人都用這個(gè)設(shè)計(jì)的,為什么了?因?yàn)檫@個(gè)簡(jiǎn)單嗎,我們就是要用簡(jiǎn)單的工具和方法做出復(fù)雜實(shí)用的產(chǎn)品

VB中的msg$是干什么用的啊????謝謝了~~~~

就是MSGBOX

提示信息

可以作為調(diào)試時(shí)的工具使用,對(duì)于用戶來說可以給用戶一些信息,如操作方法和步驟等!

NHibernate中的schema是干什么用的

關(guān)于NHibernate和NHibernate中的schema的問題,你可以參考一下以下文章:

什么是NHibernate

NHibernate 是一個(gè)基于.Net 的針對(duì)關(guān)系型數(shù)據(jù)庫的對(duì)象持久化類庫。Nhibernate 來源于非常優(yōu)秀的基于Java的Hibernate 關(guān)系型持久化工具。

NHibernate 從數(shù)據(jù)庫底層來持久化你的.Net 對(duì)象到關(guān)系型數(shù)據(jù)庫。NHibernate 為你處理這些,遠(yuǎn)勝于你不得不寫SQL去從數(shù)據(jù)庫存取對(duì)象。你的代碼僅僅和對(duì)象關(guān)聯(lián),NHibernat 自動(dòng)產(chǎn)生SQL語句,并確保對(duì)象提交到正確的表和字段中去。

為什么寫這個(gè)指南

任何熟悉Hibernate的人會(huì)發(fā)現(xiàn)這篇指南和Glen Smith 的 A Hitchhiker’s Guide to Hibernate 非常相近。這里的內(nèi)容正是基于他的指南,因此所有的感謝都應(yīng)該給與他。

NHibernate的文檔并非每處都和Hibernate的文檔一致。然而,項(xiàng)目的相似應(yīng)該能使讀者通過讀Hibernate的文檔來很好的理解NHibernate如何工作。

這篇文檔意在讓你盡可能快的開始使用NHibernate。它將介紹如何持久化一個(gè)簡(jiǎn)單的對(duì)象到一張表里。想得到更多的復(fù)雜的例子,可以參考NUnit測(cè)試及附帶代碼。

開發(fā)的過程

Nhibernate未來將會(huì)提供一些工具幫助你自動(dòng)產(chǎn)生schema文件(現(xiàn)在還是基于代碼)或是通過映射文件產(chǎn)生類(在籌措階段)或是更新schema(來自于一個(gè)新開發(fā)者的建議)。然而,這里我們的例子是假定一切來自于完全手寫,包括設(shè)置表和.Net類的編寫。我們將進(jìn)行以下步驟。

1.新建一個(gè)將要持久化.Net對(duì)象的表

2.構(gòu)建一個(gè)需要被持久化的.Net類

3.構(gòu)建一個(gè)可以讓NHibernate知道如何持久化對(duì)象屬性的映射文件

4.構(gòu)建一個(gè)讓NHibernate知道如何連接數(shù)據(jù)庫的配置文件]

5.使用NHibernate的API

第一步:寫構(gòu)建表的SQL

這里我們將使用的是一個(gè)非常簡(jiǎn)單的例子。假設(shè)你正在為你的網(wǎng)站開發(fā)一個(gè)基本的用戶管理子系統(tǒng)。我們將使用如下的一張User表(假定你已經(jīng)設(shè)置好一個(gè)數(shù)據(jù)庫—在的例子里我稱它為NHibernate)。

use NHibernate

go

CREATE TABLE users (

LogonID nvarchar(20) NOT NULL default ’0’,

Name nvarchar(40) default NULL,

Password nvarchar(20) default NULL,

EmailAddress nvarchar(40) default NULL,

LastLogon datetime default NULL,

PRIMARY KEY (LogonID)

)

go

我使用的是MS Sql Server 2000, 但也可以使用任何數(shù)據(jù)庫,只要你有關(guān)于它們的基于.Net數(shù)據(jù)提供驅(qū)動(dòng)程序。我們將得到一個(gè)含有LogonID,Name, Password, Email 和LastLogon的表. 經(jīng)過以上標(biāo)準(zhǔn)步驟,我們下一步是寫一個(gè).Net類處理一個(gè)給定的User對(duì)象。

第二步:產(chǎn)生一個(gè).Net 類文件

當(dāng)內(nèi)存中有一堆User對(duì)象的時(shí)候,我們需要某種對(duì)象去保存它們。NHibernate通過對(duì)象屬性的反射來工作,因此我們需要添加我們希望持久化的對(duì)象屬性。一個(gè)可以被NHibernate持久化的類應(yīng)該看起來象下面的樣子:

using System;

namespace NHibernate.Demo.QuickStart

{

public class User

{

private string id;

private string userName;

private string password;

private string emailAddress;

private DateTime lastLogon;

public User()

{

}

public string Id

{

get { return id; }

set { id = value; }

}

public string UserName

{

get { return userName; }

set { userName = value; }

}

public string Password

{

get { return password; }

set { password = value; }

}

public string EmailAddress

{

get { return emailAddress; }

set { emailAddress = value; }

}

public DateTime LastLogon

{

get { return lastLogon; }

set { lastLogon = value; }

}

}

}

在上面的例子里,我們的屬性和構(gòu)建函數(shù) 是public,但這個(gè)對(duì)NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private來持久化數(shù)據(jù)。

第三步:寫映射文件

現(xiàn)在我們有數(shù)據(jù)表和需要去映射它的.Net類。我們需要一種方式去讓NHibernate知道如何從一個(gè)映射到另一個(gè)。這個(gè)任務(wù)依賴于映射文件來完成。最易于管理的辦法是為每一個(gè)類寫一個(gè)映射文件,如果你命名它是YourObject.hbm.xml 并且把它放在和類的同一個(gè)目錄里,NHiberante將會(huì)使得事情簡(jiǎn)單起來。下面是一個(gè)User.hbm.xml的例子:

?xml version="1.0" encoding="utf-8" ?

hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"

class name=NHibernate.Examples.QuickStart.User, NHibernate.Examples table="users"

id name=Id column="LogonId" type=String length="20"

generator class="assigned" /

/id

property name=UserName column= "Name" type=String length="40"/

property name=Password type=String length="20"/

property name=EmailAddress type=String length="40"/

property name=LastLogon type=DateTime/

/class

/hibernate-mapping

讓我們來看看這個(gè)文件中讓我們感興趣的某些行。第一個(gè)有趣的標(biāo)簽是class。這里我們將映射類型名稱(類名和裝配件)到我們數(shù)據(jù)庫中的User表,這里和Hibernate有一點(diǎn)點(diǎn)的不同。你將不得不告訴NHibernate從何處提取對(duì)象。在這個(gè)例子里我們從裝配件NHibernate.Examples裝載類NHibernate.Examples.QuickStart.User 。NHibernate 遵循和.Net Framework同樣的規(guī)則來加載類型。因此如果你在如何指定類型的方面有些混淆,請(qǐng)參看.Net Framework SDK。

讓我們先跳過id標(biāo)簽,來討論property標(biāo)簽。簡(jiǎn)要看一下,你將發(fā)現(xiàn)NHibernate所要做的工作。name屬性的值正是我們.Net 類的屬性,column屬性值將是我們數(shù)據(jù)庫里的字段。type屬性是可選的(如果你不標(biāo)明,NHibernate將利用反射進(jìn)行最佳的推測(cè))。

好了,讓我們回到標(biāo)簽id, 你可以猜測(cè)到這個(gè)標(biāo)簽將是映射數(shù)據(jù)庫表的主鍵,的確如此,id標(biāo)簽的組成和我們剛才看的property標(biāo)簽是相似的。我們映射屬性到目標(biāo)數(shù)據(jù)庫的字段。

內(nèi)嵌的generator 標(biāo)簽告訴NHibernate 如何生成主鍵(它將恰當(dāng)?shù)臑槟闵芍麈I,不管你指定何種類型,但你必須告訴它)。在我們的例子里,我們?cè)O(shè)定為assigned,意味著我們對(duì)象將自己生成主鍵(畢竟User對(duì)象常常需要一個(gè)UserID)。如果你執(zhí)意要NHiberante為你生成主鍵,你感興趣于設(shè)定uuid.hex和uuid.string(從文檔中獲取更多信息)

提示:如果你使用Visual Studio.Net 去編譯的話,請(qǐng)將user.hbm.xml的Build Action屬性設(shè)置為Embedded Resource。映射文件將成為裝配件的一部分。更詳細(xì)的細(xì)節(jié)重點(diǎn)將在后面展示。

提示:如果你僅僅是改變映射文件,你不能使用build 而應(yīng)該Rebuild項(xiàng)目。Visual Studio.Net 不會(huì)重新編譯有改變的映射文件。

第四步:為你的數(shù)據(jù)庫產(chǎn)生一個(gè)配置文件

我們至今還沒有告訴NHibernate 去哪里連接數(shù)據(jù)庫。最直接的辦法是在你的應(yīng)用程序的配置文件里設(shè)置一個(gè)NHibernate配置節(jié)。這和在Hibernate里使用屬性文件是等價(jià)的。如下配置:

?xml version="1.0" encoding="utf-8" ?

configuration

configSections

section name=nhibernate type=System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089 /

/configSections

nhibernate

add

key="hibernate.connection.provider"

value="NHibernate.Connection.DriverConnectionProvider"

/

add

key="hibernate.dialect"

value="NHibernate.Dialect.MsSql2000Dialect"

/

add

key="hibernate.connection.driver_class"

value="NHibernate.Driver.SqlClientDriver"

/

add

key="hibernate.connection.connection_string"

value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI"

/

/nhibernate

/configuration

上面的例子里用了SqlClient 驅(qū)動(dòng),在本地連接名稱為NHibernate 的數(shù)據(jù)庫,提供用戶名和密碼。那里有一堆屬性你需要調(diào)整來確定如何讓NHibernate來訪問數(shù)據(jù)庫。再次說明,你可以在文檔里獲取更多信息。

請(qǐng)注意以上的配置里并沒有涉及到log4的配置信息。NHibernate使用log4來記錄內(nèi)部發(fā)生的一切。在一個(gè)應(yīng)用程序產(chǎn)品里,在你特定環(huán)境里,我推薦配置log4,并為NHibernate設(shè)置一定的日志級(jí)別。

第五步:開始展現(xiàn)NHibernate的魔力

所有艱苦的工作已經(jīng)完成。你將有以下內(nèi)容

User.cs ----你需要持久化的C#類

User.hbm.xml ----你的NHibernate映射文件

App.config ---對(duì)ADO.NET連接的配置信息(如果你愿意,你可以在代碼中實(shí)現(xiàn))。

你的數(shù)據(jù)庫里有一張User表。

現(xiàn)在可以在你的代碼中恰當(dāng)簡(jiǎn)潔的使用NHibernate。簡(jiǎn)化的版本如下

創(chuàng)建一個(gè)Configuration對(duì)象

讓Configuration知道你將存儲(chǔ)何種類型的對(duì)象

為你選擇的數(shù)據(jù)庫創(chuàng)建一個(gè)Session對(duì)象

Load,Save和Query你的對(duì)象

通過Session的Flush()方法將對(duì)象提交給數(shù)據(jù)庫。

為了讓你更清晰,我們來看一些代碼。

首先,創(chuàng)建一個(gè)Configuration對(duì)象

Configuration對(duì)象能夠解析所有.Net對(duì)象和后臺(tái)數(shù)據(jù)庫中的映射關(guān)系。

Configuration cfg = new Configuration();

cfg.AddAssembly("NHibernate.Examples");

Configuration對(duì)象會(huì)搜索裝配件里的任何以hbm.xml 結(jié)尾的文件。還有其他方法加載映射文件,但這種方式是最簡(jiǎn)單的。

下一步,創(chuàng)建一個(gè)Session對(duì)象

ISession對(duì)象提供一個(gè)到后臺(tái)數(shù)據(jù)庫的連接,ITransaction對(duì)象提供一個(gè)可以被NHibernate管理的事務(wù)。

ISessionFactory factory = cfg.BuildSessionFactory();

ISession session = factory.OpenSession();

ITransaction transaction = session.BeginTransaction();

接著來Load, Save和Query你的對(duì)象

現(xiàn)在你可以用使用傳統(tǒng)的.Net方法來操縱對(duì)象。你想保存一個(gè)新對(duì)象到數(shù)據(jù)庫嗎?嘗試下面的方法:

User newUser = new User();

newUser.Id = "joe_cool";

newUser.UserName = "Joseph Cool";

newUser.Password = "abc123";

newUser.EmailAddress = "joe@cool.";

newUser.LastLogon = DateTime.Now;

Tell NHibernate that this object should be saved

session.Save(newUser);

mit all of the changes to the DB and close the ISession

transaction.Commit();

session.Close();

正如你所看到的,關(guān)于NHiberante重要的事情是如此簡(jiǎn)單。繼續(xù)并且查詢你的數(shù)據(jù)庫,驗(yàn)證一下User表里的新記錄?,F(xiàn)在重要的事情就是你去操心業(yè)務(wù)對(duì)象并在進(jìn)行處理的時(shí)候告訴NHibernate就可以了。

讓我們來告訴你,當(dāng)你有一個(gè)UserID的時(shí)候如何獲取對(duì)象(舉例說,登陸你的網(wǎng)站的時(shí)候)。僅僅一句話就可以打開Session,傳入key就可以了

open another session to retrieve the just inserted user

session = factory.OpenSession();

User joeCool = (User)session.Load(typeof(User), "joe_cool");

你所獲取的User對(duì)象還在生存周期內(nèi)!改變它的屬性,并通過Flush()持久化到數(shù)據(jù)庫。

set Joe Cool’s Last Login property

joeCool.LastLogon = DateTime.Now;

flush the changes from the Session to the Database

session.Flush();

你所要做的就是通過NHibernate來進(jìn)行你需要的改變,并調(diào)用Session的Flush()方法提交。驗(yàn)證一下數(shù)據(jù)庫,查查用戶ID為”joe_cool”的記錄中”LastLogon”的更改。

還有更好的,你可以以System.Collections.IList的方式來獲取從表中的對(duì)象。如下

IList userList = session.CreateCriteria(typeof(User)).List();

foreach(User user in userList)

{

System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);

}

這個(gè)查詢將會(huì)返回所有表記錄。往往你需要做更多的控制,比如說獲取從March 14, 2004 10:00 PM 以后登陸的用戶,如下:

IList recentUsers = session.CreateCriteria(typeof(User))

.Add(Expression.Expression.Gt("LastLogon", new DateTime(2004, 03, 14, 20, 0, 0)))

.List();

foreach(User user in recentUsers)

{

System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);

}

文檔里還有一堆健壯的查詢方式讓你調(diào)用,這里僅僅讓你對(duì)NHibernate所提供的強(qiáng)有力的工具有一定的了解。

最后調(diào)用Session對(duì)象的Close()方法,釋放NHibernate所使用的ADO.Net連接資源

tell NHibernate to close this Session

session.Close();

更確切地說…

你已經(jīng)完成創(chuàng)建對(duì)象,持久化并通過條件查詢或鍵值查詢來返回它。相信你已經(jīng)從中獲得快樂。

現(xiàn)在你對(duì)NHibernate有了大致的了解,如果你能仔細(xì)閱讀大量來自Hibernate 2.0.3文檔,你將獲得幫助(NHibernate文檔還在早期階段,現(xiàn)在還僅僅是對(duì)Hibernate的拷貝)。

Enjoy! And Happy NHibernating!

Mike Doerfler

WOW中的宏是干什么用的?

宏可以幫助你更好的使用技能,意思就是能讓你在比較準(zhǔn)確的時(shí)間放出你認(rèn)為該使用的技能 一般和我PK的DZ都是用宏的,畢竟DZ要求操作還是高的,所以有時(shí)不一定能反應(yīng)過來,就需要宏的幫助了 你要宏的話可以去BAIDU下或者去FWQ上問比較強(qiáng)力的DZ,我不想做個(gè)CTRL+C和CTRL+v的人 謝謝合作,給個(gè)分。

log4配置文件怎樣寫入日志名到數(shù)據(jù)庫中

1.創(chuàng)建日志數(shù)據(jù)表:

view plainprint?CREATE02TABLE02log02(02020202[Id]02[int]02IDENTITY02(1,021)02primary02key02NOT02NULL02,02020202[Lg_Date]02[datetime]02NOT02NULL02,02020202[Lg_Thread]02[varchar]02(50)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Level]02[varchar]02(20)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Class]02[varchar]02(200)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Message]02[varchar]02(2000)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL0202)0202GO02022.寫log4j.properties文件,這里我的數(shù)據(jù)庫舉動(dòng)是用的JTDS:

引用# level : 是日志記錄的優(yōu)先級(jí),分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級(jí)別。

# Log4j建議只使用四個(gè)級(jí)別,優(yōu)先級(jí)從高到低分別是ERROR、WARN、INFO、DEBUG。

log4j.rootLogger=ERROR,DATABASE

log4j.addivity.org.apache=true

# 用于數(shù)據(jù)庫

log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender

log4j.appender.DATABASE.URL=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=databasename

log4j.appender.DATABASE.driver=net.sourceforge.jtds.jdbc.Driver

log4j.appender.DATABASE.user=username

log4j.appender.DATABASE.password=password

# 本處設(shè)置為"WARN"以上級(jí)別在數(shù)據(jù)庫存儲(chǔ)(默認(rèn)情況使用rootLogger中的設(shè)置)

log4j.appender.DATABASE.Threshold=DEBUG

log4j.appender.DATABASE.sql=INSERT INTO log(optime,thread,infolevel,class,message) VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')

# 寫入數(shù)據(jù)庫中的表LOG4J的Message字段中,

# 內(nèi)容%d(日期)%c: 日志信息所在地(類名)%p: 日志信息級(jí)別%m: 產(chǎn)生的日志具體信息 %n: 輸出日志信息換行

log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout

log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n3.在程序中需要將日志信息寫入數(shù)據(jù)庫的地方寫入如下代碼:

view plainprint?

新聞名稱:go+語言+log4go go+語言 七牛
URL地址:http://muchs.cn/article30/hgsepo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、微信小程序、網(wǎng)頁設(shè)計(jì)公司、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化