要先進到ngrok.cfg的路徑下,在執行命令才行。
創新互聯是專業的大足網站建設公司,大足接單;提供成都做網站、網站制作,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行大足網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
ngrok配置方法
1、下載ngrok源碼
(GOPATH=~/goproj)
$ mkdir ~/goproj/src/github.com/inconshreveable
$ git clone
$ export GOPATH=~/goproj/src/github.com/inconshreveable/ngrok
2、生成自簽名證書
使用ngrok.com官方服務時,我們使用的是官方的SSL證書。自建ngrokd服務,我們需要生成自己的證書,并提供攜帶該證書的ngrok客戶端。
證書生成過程需要一個NGROK_BASE_DOMAIN。 以ngrok官方隨機生成的地址693c358d.ngrok.com為例,其NGROK_BASE_DOMAIN就是"ngrok.com",如果你要 提供服務的地址為"example.tunnel.tonybai.com",那NGROK_BASE_DOMAIN就應該 是"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
執行完以上命令,在ngrok目錄下就會新生成6個文件:
-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目錄(資源文件)打包到可執行文件(ngrokd和ngrok)中 去,assets/client/tls和assets/server/tls下分別存放著用于ngrok和ngrokd的默認證書文件,我們需要將它們替換成我們自己生成的:(因此這一步務必放在編譯可執行文件之前)
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目錄下執行如下命令,編譯ngrokd:
$ make release-server
不過在我的AWS上,出現如下錯誤:
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拷貝到當前ngrok/bin下。
$ cp /home/ubuntu/.bin/go14/bin/go-bindata ./bin
再次執行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
又出錯!提示找不到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下。
三、調試
1、啟動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
1、安裝google go
2、安裝git
3、安裝Mingw
4、把go的bin目錄添加到PATH環境變量,可以直接在CMD中執行
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中log4o那段代碼為
log "github.com/keepeye/log4go"
9、cmd執行
make release-all
典型的日志記錄的步驟是這樣的:
創建logger
創建handler
定義formatter
給handler添加formatter
給logger添加handler
寫成代碼差不多就是醬嬸的(這個是照別的網頁抄的,參考附注):
1 import logging
2 ?3 # 1、創建一個logger ?4 logger = logging.getLogger('mylogger')
5 logger.setLevel(logging.DEBUG)
6 ?7 # 2、創建一個handler,用于寫入日志文件 ?8 fh = logging.FileHandler('test.log')
9 fh.setLevel(logging.DEBUG)
10 11 # 再創建一個handler,用于輸出到控制臺 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類差不多也是這樣,代碼還要更復雜一點。Golang的日志相對寫法簡單一些,不過沒有什么格式,系統記錄一條時間,內容格式完全自己手畫。第三方的日志庫倒是沒有接觸過,像Java的Log4j,Golang的log4go和seelog等等,不知道用起來會不會簡單一點。我一直都記不住這些,因為不太理解logger和handler為什么要這樣寫。一直到這次任務中出現的在我看來相當“詭異”的bug,才深入理解了一下。
我的任務是這樣的,要做一個日志切割的工具,按天將日志分割開,即每天0點產生一個新日志,將舊日志改名。并且,將超過3個月的日志刪除掉,以保證磁盤空間不會被log占滿。程序要求可以切割多個目錄中的不同日志,具體路徑由json中配置。
這里用到了logging.handlers類中的TimedRotatingFileHandler方法,用以獲得一個handler。大概的寫法為:
1 logger = logging.getLogger() #獲得logger2 handler = logging.handlers.TimedRotatingFileHandler(logfile, 'S', 1, 0) #切割日志3 handler.suffix = '%Y%m%d' #切割后的日志設置后綴4 logger.addHandler(handler) #把logger添加上handler5 logger.fatal(datetime.datetime.now().strftime('%Y-%m-%d')) #在新日志中寫上當天的日期
這里我沒有設置level和formatter。因為只是分割,對新日志沒有什么影響。TimedRotatingFileHandler函數的方法見附注,或查看python的源碼,這個函數是python寫的,可以找到定義。這里我使用的是每秒生成一個新的日志文件,之后用Crontab在每天0點調度,然后用for循環處理json中的每一個日志文件。
【解決過程】
1.很明顯,是在windows的cmd中,找不到hg。
而對于hg,如果是cygwin等環境,那肯定沒問題,但是此處是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是干什么用的?
把控制權交給操作系統,以響應窗口重畫、最大化、最小化等要求,避免出現應用程序不響應操作系統請求而 *** 作系統誤以為死機了。
舉個例子:在窗口中放一個textbox,然后寫程序,循環從1到10萬,然后循環體里面就是把這個數寫到textbox里面,如果沒有DoEvents,程序運行的時候就是死機一樣,然后直到最后窗口顯示10萬,中間數字什么也看不見;如果在每次寫了textbox以后,都來一下DoEvents,窗口就會重畫,運行的時候就能看見textbox里面的數一個一個的長上去。
vb中的InitCommonControls是干什么用
vb中InitCommonControls是注冊并初始化通用控件窗口類。
另外還有一個加強版的InitCommonControlsEx函數,可以注冊指定控件的窗口類。
在使用SDK編寫windows界面的時候,如果使用了月歷控件,IP地址控件等高級控件,則需要調用此函數。
例:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{InitCommonControls();
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, Main_Proc);
return 0;}
函數InitCommonControls是個空函數,不做任何事情。
但如果你調用了該函數,則鏈接器會將你的程序鏈接到ctl32.lib,然后在程序啟動時,會加載ctl32.dll。
真正初始化的工作是在該庫的入口點處做的,在這里會注冊通用控件窗口類。
然后應用程序就可以創建控件窗口,就象創建其它的子窗口控件一樣。
VB是干什么用的?
很廣,包括病毒
vb是干什么用的?
VB
VB 是Visual Basic編程語言
1991年,美國微軟公司推出了Visual Basic(可間稱VB),目前的最新版本是VB 2005(VB8)中文版。
Visual 意即可視的、可見的,指的是開發像windows操作系統的圖形用戶界面(Graphic User Interface,GUI)的方法,它不需要編寫大量代碼去描述界面元素的外觀和位置,只要把預先建立好的對象拖放到屏幕上相應的位置即可。
Basic指的是Beginners all_purpose symbolic instruction code 初始者通用符號指令代碼語言。
Visual Basic有學習版、專業版和企業版三種版本,以滿足不同的開發需要。學習版適用于普通學習者及大多數使用Visual Basic開發一般Windows應用程序的人員,但是;專業版適用于計算機專業開發人員,包括了學習版的全部內容功能以及Inter控件開發工具之類的高級特性;企業版除包含專業版全部的內容外,還有自動化構件管理器等工具,使得專業編程人員能夠開發功能強大的組骨子里分布式應用程序。
VB是一種可視化的、面向對象和采用事件驅動方式的結構化高級程序設計語言,可用于開發Windows環境下的各類應用程序。它簡單易學、效率高,且功能強大可以與Windowsr專業開發工具SDK相媲美。在Visual Basic環境下,利用事件驅動的編程機制、新穎易用的可視化設計工具,使用Windows內部的廣泛應用程序接口(API)函數,以用動態鏈接庫(DLL)、對象的鏈接與世隔嵌入(OLE)、開放式數據連接(ODBC)等技術,可以高效、快速地開發Windows環境下功能強大、圖形界面豐富的應用軟件系統。隨著版本的提高,Visual Basic的功能也越來越強。5.0版以后,Visual Basic推出了中文版,與前個版本相比,其功能有了很大提升。
在二十一世紀初,microsoft公司推出Visual Studio 2003與Visual Basic之間有了重大變化,Visual Studio為各種編程工具做了一個平臺,Visual Basic.NET可在這種平臺上運行。相對于傳統VB,有很大的不同。VB.Net,首次使用.Net構架進行可視化編程,并且能很好地與COM構架兼容。2005年Visual Studio 2005則運用了NET 2.0的技術,更加的方便了程序員的工作。可是新的程序對系統配置要求也較高,需要微軟.Net Framework 2.0以上的.Net構架支持。
另外VB(V代表Vitamin)還有一個意思
維生素B包括維生素B1、維生素B2、維生素B6、維生素B12、煙酸、泛酸、葉酸。這些B族維生素是推動體內代謝,把糖、脂肪、蛋白質等轉化成熱量時不可缺少的物質。如果缺少維生素B,則細胞功能馬上降低,引起代謝障礙,這時人體會出現怠滯和食欲不振。相反喝酒過多等導致肝臟損害,在許多場合下是和維生素B缺乏癥并行的。
以下是含有豐富維生素B的食品:
①含有豐富維生素B1的食品:小麥胚芽、豬腿肉、大豆、花生、里肌肉、火腿、黑米、雞肝、胚芽米等。
②含有豐富維生素B2的食品:七腮鰻、牛肝、雞肝、香菇、小麥胚芽、雞蛋、奶酪等。
③含有維生素B6、維生素B12、煙酸、泛酸和葉酸等食品: 肝、肉類、牛奶、酵母、魚、豆類、蛋黃、堅果類、菠菜、奶酪等。其中的維生素B1在人體內無法貯存,所以應每天補充。
B族維生素若想全部攝取比較困難,但是認真選擇食物就可以簡單且方便的攝取。上述含有維生素B的食物可以分為①和②③兩組。看看上述分類就可以明白,②和⑧全都含在大體相同的食物中。因此①作為一組食物,②和③合在一起形成一組食物,組合選擇兩組食物,基本上可以把B族維生素攝取到手。
VB的還有第三種意思
價鍵理論
valence-bond theory
一種獲得分子薛定諤方程近似解的處理方法。又稱電子配對法。歷史上最早發展起來的化學鍵理論。主要描述分子中的共價鍵和共價結合,其核心思想是電子配對形成定域化學鍵。
1927年W.H.海特勒和F.W.倫敦首次完成了氫分子中電子對鍵的量子力學近似處理,這是近代價鍵理論的基礎。L.C.鮑林等加以發展,引入雜化軌道概念,綜合成價鍵理論,成功地應用于雙原子分子和多原子分子的結構。
價鍵理論是海特勒倫敦處理氫分子方法的推廣,要點如下:①若兩原子軌道互相重疊,兩個軌道上各有一個電子,且電子自旋方向相反,則電子配對給出單重態,形成一個電子對鍵。②兩個電子相互配對后,不能再與第三個電子配對,這就是共價鍵的飽和性。③遵循最大重疊原則,共價鍵沿著原子軌道重疊最大的方向成鍵。共價鍵具有方向性。原子軌道通常在某個特定方向上有最大值,只有在此方向上軌道間才有最大重疊而形成共價鍵。不同原子軌道有不同成鍵能力。原子軌道的最大值作為原子軌道成鍵能力的度量,鮑林給出s、p、d、f等原子軌道成鍵能力依次為1、3、5、7。在主量子數相同時,成鍵能力大的軌道形成的共價鍵較牢固。
價鍵理論與化學家所熟悉的經典電子對鍵概念相吻合,一出現就得到迅速發展。但價鍵理論計算比較復雜,使得后來發展緩慢。隨著計算技術日益提高,該理論還會有新發展。
在以太網技術中,VB稱做:虛擬網橋(Virtual Bridge)
VB其實是為了管理方便對管理域的一個劃分,相當于一個虛擬的L2 Lanswitch。在城域網的應用中,VB是基于用戶劃分的。即:每個用戶都有自己獨立的VB,其中包含多個vlan標簽和mac地址。由于各個VB之間相互隔離,不同的VB可分配相同的vlan而互不影響,而基于vlan劃分VB的L2芯片不能區分不同用戶的相同vlan
vb里 Const是干什么用的
const是定義常數,例如:const pi =3.14159,那么你在代碼中輸入pi就相當于輸入3.14159。就是用一個類似變量的東西代替數值提高可讀性,但要注意,它不是變量。
VB 中 模塊是干什么用的啊?
我的理解就是已經具備某種功能的一段代碼包。直接調用它可以完成某種功能。
vb6.0是干什么用的
軟件設計工具,本人認為是個很好,也很簡單的設計工具,很多日本人都用這個設計的,為什么了?因為這個簡單嗎,我們就是要用簡單的工具和方法做出復雜實用的產品
VB中的msg$是干什么用的啊????謝謝了~~~~
就是MSGBOX
提示信息
可以作為調試時的工具使用,對于用戶來說可以給用戶一些信息,如操作方法和步驟等!
NHibernate中的schema是干什么用的
關于NHibernate和NHibernate中的schema的問題,你可以參考一下以下文章:
什么是NHibernate
NHibernate 是一個基于.Net 的針對關系型數據庫的對象持久化類庫。Nhibernate 來源于非常優秀的基于Java的Hibernate 關系型持久化工具。
NHibernate 從數據庫底層來持久化你的.Net 對象到關系型數據庫。NHibernate 為你處理這些,遠勝于你不得不寫SQL去從數據庫存取對象。你的代碼僅僅和對象關聯,NHibernat 自動產生SQL語句,并確保對象提交到正確的表和字段中去。
為什么寫這個指南
任何熟悉Hibernate的人會發現這篇指南和Glen Smith 的 A Hitchhiker’s Guide to Hibernate 非常相近。這里的內容正是基于他的指南,因此所有的感謝都應該給與他。
NHibernate的文檔并非每處都和Hibernate的文檔一致。然而,項目的相似應該能使讀者通過讀Hibernate的文檔來很好的理解NHibernate如何工作。
這篇文檔意在讓你盡可能快的開始使用NHibernate。它將介紹如何持久化一個簡單的對象到一張表里。想得到更多的復雜的例子,可以參考NUnit測試及附帶代碼。
開發的過程
Nhibernate未來將會提供一些工具幫助你自動產生schema文件(現在還是基于代碼)或是通過映射文件產生類(在籌措階段)或是更新schema(來自于一個新開發者的建議)。然而,這里我們的例子是假定一切來自于完全手寫,包括設置表和.Net類的編寫。我們將進行以下步驟。
1.新建一個將要持久化.Net對象的表
2.構建一個需要被持久化的.Net類
3.構建一個可以讓NHibernate知道如何持久化對象屬性的映射文件
4.構建一個讓NHibernate知道如何連接數據庫的配置文件]
5.使用NHibernate的API
第一步:寫構建表的SQL
這里我們將使用的是一個非常簡單的例子。假設你正在為你的網站開發一個基本的用戶管理子系統。我們將使用如下的一張User表(假定你已經設置好一個數據庫—在的例子里我稱它為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, 但也可以使用任何數據庫,只要你有關于它們的基于.Net數據提供驅動程序。我們將得到一個含有LogonID,Name, Password, Email 和LastLogon的表. 經過以上標準步驟,我們下一步是寫一個.Net類處理一個給定的User對象。
第二步:產生一個.Net 類文件
當內存中有一堆User對象的時候,我們需要某種對象去保存它們。NHibernate通過對象屬性的反射來工作,因此我們需要添加我們希望持久化的對象屬性。一個可以被NHibernate持久化的類應該看起來象下面的樣子:
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; }
}
}
}
在上面的例子里,我們的屬性和構建函數 是public,但這個對NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private來持久化數據。
第三步:寫映射文件
現在我們有數據表和需要去映射它的.Net類。我們需要一種方式去讓NHibernate知道如何從一個映射到另一個。這個任務依賴于映射文件來完成。最易于管理的辦法是為每一個類寫一個映射文件,如果你命名它是YourObject.hbm.xml 并且把它放在和類的同一個目錄里,NHiberante將會使得事情簡單起來。下面是一個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
讓我們來看看這個文件中讓我們感興趣的某些行。第一個有趣的標簽是class。這里我們將映射類型名稱(類名和裝配件)到我們數據庫中的User表,這里和Hibernate有一點點的不同。你將不得不告訴NHibernate從何處提取對象。在這個例子里我們從裝配件NHibernate.Examples裝載類NHibernate.Examples.QuickStart.User 。NHibernate 遵循和.Net Framework同樣的規則來加載類型。因此如果你在如何指定類型的方面有些混淆,請參看.Net Framework SDK。
讓我們先跳過id標簽,來討論property標簽。簡要看一下,你將發現NHibernate所要做的工作。name屬性的值正是我們.Net 類的屬性,column屬性值將是我們數據庫里的字段。type屬性是可選的(如果你不標明,NHibernate將利用反射進行最佳的推測)。
好了,讓我們回到標簽id, 你可以猜測到這個標簽將是映射數據庫表的主鍵,的確如此,id標簽的組成和我們剛才看的property標簽是相似的。我們映射屬性到目標數據庫的字段。
內嵌的generator 標簽告訴NHibernate 如何生成主鍵(它將恰當的為你生成主鍵,不管你指定何種類型,但你必須告訴它)。在我們的例子里,我們設定為assigned,意味著我們對象將自己生成主鍵(畢竟User對象常常需要一個UserID)。如果你執意要NHiberante為你生成主鍵,你感興趣于設定uuid.hex和uuid.string(從文檔中獲取更多信息)
提示:如果你使用Visual Studio.Net 去編譯的話,請將user.hbm.xml的Build Action屬性設置為Embedded Resource。映射文件將成為裝配件的一部分。更詳細的細節重點將在后面展示。
提示:如果你僅僅是改變映射文件,你不能使用build 而應該Rebuild項目。Visual Studio.Net 不會重新編譯有改變的映射文件。
第四步:為你的數據庫產生一個配置文件
我們至今還沒有告訴NHibernate 去哪里連接數據庫。最直接的辦法是在你的應用程序的配置文件里設置一個NHibernate配置節。這和在Hibernate里使用屬性文件是等價的。如下配置:
?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 驅動,在本地連接名稱為NHibernate 的數據庫,提供用戶名和密碼。那里有一堆屬性你需要調整來確定如何讓NHibernate來訪問數據庫。再次說明,你可以在文檔里獲取更多信息。
請注意以上的配置里并沒有涉及到log4的配置信息。NHibernate使用log4來記錄內部發生的一切。在一個應用程序產品里,在你特定環境里,我推薦配置log4,并為NHibernate設置一定的日志級別。
第五步:開始展現NHibernate的魔力
所有艱苦的工作已經完成。你將有以下內容
User.cs ----你需要持久化的C#類
User.hbm.xml ----你的NHibernate映射文件
App.config ---對ADO.NET連接的配置信息(如果你愿意,你可以在代碼中實現)。
你的數據庫里有一張User表。
現在可以在你的代碼中恰當簡潔的使用NHibernate。簡化的版本如下
創建一個Configuration對象
讓Configuration知道你將存儲何種類型的對象
為你選擇的數據庫創建一個Session對象
Load,Save和Query你的對象
通過Session的Flush()方法將對象提交給數據庫。
為了讓你更清晰,我們來看一些代碼。
首先,創建一個Configuration對象
Configuration對象能夠解析所有.Net對象和后臺數據庫中的映射關系。
Configuration cfg = new Configuration();
cfg.AddAssembly("NHibernate.Examples");
Configuration對象會搜索裝配件里的任何以hbm.xml 結尾的文件。還有其他方法加載映射文件,但這種方式是最簡單的。
下一步,創建一個Session對象
ISession對象提供一個到后臺數據庫的連接,ITransaction對象提供一個可以被NHibernate管理的事務。
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
接著來Load, Save和Query你的對象
現在你可以用使用傳統的.Net方法來操縱對象。你想保存一個新對象到數據庫嗎?嘗試下面的方法:
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();
正如你所看到的,關于NHiberante重要的事情是如此簡單。繼續并且查詢你的數據庫,驗證一下User表里的新記錄。現在重要的事情就是你去操心業務對象并在進行處理的時候告訴NHibernate就可以了。
讓我們來告訴你,當你有一個UserID的時候如何獲取對象(舉例說,登陸你的網站的時候)。僅僅一句話就可以打開Session,傳入key就可以了
open another session to retrieve the just inserted user
session = factory.OpenSession();
User joeCool = (User)session.Load(typeof(User), "joe_cool");
你所獲取的User對象還在生存周期內!改變它的屬性,并通過Flush()持久化到數據庫。
set Joe Cool’s Last Login property
joeCool.LastLogon = DateTime.Now;
flush the changes from the Session to the Database
session.Flush();
你所要做的就是通過NHibernate來進行你需要的改變,并調用Session的Flush()方法提交。驗證一下數據庫,查查用戶ID為”joe_cool”的記錄中”LastLogon”的更改。
還有更好的,你可以以System.Collections.IList的方式來獲取從表中的對象。如下
IList userList = session.CreateCriteria(typeof(User)).List();
foreach(User user in userList)
{
System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
}
這個查詢將會返回所有表記錄。往往你需要做更多的控制,比如說獲取從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);
}
文檔里還有一堆健壯的查詢方式讓你調用,這里僅僅讓你對NHibernate所提供的強有力的工具有一定的了解。
最后調用Session對象的Close()方法,釋放NHibernate所使用的ADO.Net連接資源
tell NHibernate to close this Session
session.Close();
更確切地說…
你已經完成創建對象,持久化并通過條件查詢或鍵值查詢來返回它。相信你已經從中獲得快樂。
現在你對NHibernate有了大致的了解,如果你能仔細閱讀大量來自Hibernate 2.0.3文檔,你將獲得幫助(NHibernate文檔還在早期階段,現在還僅僅是對Hibernate的拷貝)。
Enjoy! And Happy NHibernating!
Mike Doerfler
WOW中的宏是干什么用的?
宏可以幫助你更好的使用技能,意思就是能讓你在比較準確的時間放出你認為該使用的技能 一般和我PK的DZ都是用宏的,畢竟DZ要求操作還是高的,所以有時不一定能反應過來,就需要宏的幫助了 你要宏的話可以去BAIDU下或者去FWQ上問比較強力的DZ,我不想做個CTRL+C和CTRL+v的人 謝謝合作,給個分。
1.創建日志數據表:
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文件,這里我的數據庫舉動是用的JTDS:
引用# level : 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。
# Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。
log4j.rootLogger=ERROR,DATABASE
log4j.addivity.org.apache=true
# 用于數據庫
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
# 本處設置為"WARN"以上級別在數據庫存儲(默認情況使用rootLogger中的設置)
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')
# 寫入數據庫中的表LOG4J的Message字段中,
# 內容%d(日期)%c: 日志信息所在地(類名)%p: 日志信息級別%m: 產生的日志具體信息 %n: 輸出日志信息換行
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n3.在程序中需要將日志信息寫入數據庫的地方寫入如下代碼:
view plainprint?
新聞名稱:go+語言+log4go go+語言 七牛
URL地址:http://m.kartarina.com/article30/hgsepo.html
成都網站建設公司_創新互聯,為您提供建站公司、微信小程序、網頁設計公司、營銷型網站建設、網站營銷、網站內鏈
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯