Saturday, March 26, 2016

Hibernate简介



http://blog.csdn.net/liujiahan629629/article/details/21442607


Lazy Loading:就是当load一个parent时候并不load其children当其后需要到children的信息再load它lazy loading

session是打开一个query窗口,是一级缓存(查询结果存在内存),只有session close才会释放缓存
sessionFactory是存所有session,是二级缓存(查询结果存在内存)

hibernate.cfg.xml是config hibernate
*.hbm.xml是每一个class和table的映射config
xml可以写程序动态加入xml string,不一定需要预先有xml文件

query.list()对数据全取
query.iterate()对数据全取Id,但需要到其他fields才取所以是N+1 query(N+1问题)

为了适应其他不同需求hibernate还提供HQL[不定参数查询](session.createQuery("FROM Student s where  s.sname like ?"))和QBC(cra.add(Restrictions.like("sname", "%s%")))语言

Hibernate包括悲观锁(锁一直加上,性能较低)和乐观锁(数据读写冲突时才加上)

hibernate.cfg.xml:
 <propertynamepropertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>支持list一级与二级缓存

User.hbm.xml:
  <id name="pid" column="pid">
            <generator class="identity"/>
        </id>
id是Hibernate给的主键,跟table的主键没有任何关系,给了id以后可以调用函数session.get(id). 如果不写generator,就是用用户给的值,如果给出identity就是用自增值。

NHibernate
NHibernate official

我工作的公司用到了NHibernate,设计者将session设计为singleton导致了一个大型程序越跑越慢,原因session一直在缓存越来越多查询。解决方法1. 每个查询new一个session不要singleton。2. sessionFactory.OpenStatelessSession()(.Net中)

Sunday, March 20, 2016

NumPy简介

X[:, 0]表示所有行第一列。第一个参数表示行,第二个参数表示列

Python indexing

http://blog.csdn.net/mokeding/article/details/17476979

朴素贝叶斯分类器Native Bayes classifier之Python实现

这篇博文主要是讨论用scikit-learn这个包里面的Native Bayes(NB)算法去对数据进行分类。NB主要有3种模型:高斯、多项式、伯努利。下面主要讨论高斯。这个算法有几个主要函数:fit函数是用训练数据特征值X和输出目标Y训练模型fit(X, Y),predict函数是根据测试数据特征值计算出输出目标Y2=predict(X2)

第一个例子是scikit-learn官网,数据是假设的

import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(X, Y)
print(clf.predict([[-0.8, -1]]))

第二个例子也是来自于scikit-learn官网数据是鸢尾花的分类,数据总共150个,每种花有50个数据,总共有3种类型。程序用全部数据用作训练,再用全部数据用于测试,然后比较结果。运行后准确率达到96%.

from sklearn import datasets
iris = datasets.load_iris()
print(iris.data)
print(iris.target)
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print("Number of mislabeled points out of a total %d points : %d" % (iris.data.shape[0],(iris.target != y_pred).sum()))

第三个例子是经过我修改第二个例子而成,我用60%作为training, 40%用作testing,最后得到test data的准确率达到96.7%.

import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
train = np.vstack((iris.data[:30], iris.data[50:80], iris.data[100:130]))
test = np.vstack((iris.data[30:50], iris.data[80:100], iris.data[130:]))
trainTarget = np.hstack((iris.target[:30], iris.target[50:80], iris.target[100:130]))
testTarget = np.hstack((iris.target[30:50], iris.target[80:100], iris.target[130:]))
print(train.shape[0])
print(test.shape[0])
print(trainTarget.shape[0])
print(testTarget.shape[0])
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(train, trainTarget).predict(test)
print("Number of mislabeled points out of a total %d points : %d" % (test.shape[0],(testTarget != y_pred).sum()))

第四个例子改用train_test_split函数分割training and testing data
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4)
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)
score = gnb.score(X_test, y_test)
print("Number of mislabeled points out of a total %d points : %d, score: %f" % (X_test.shape[0],(y_test != y_pred).sum(),score))

Saturday, March 19, 2016

Git简介

Git和SNV最大的区别是Git多一个repository在local,这样如果check-in到prod的话可以现在local做好code review再push,还可以对自己的各个改动做备份(local SVN本地版本管理)。


工作流程


git pull
git checkout -b issue 1
git commit
git rebase -i HEAD~2
git pull (in mainline)
git rebase mainline (in issue1)
git merge issue1 (in mainline)
git push
git branch -d issue1

开始一个项目/bug时,都要习惯做git pull,否则可能会出现unexpected逻辑问题由于别人代码没有进入

Git commnds:

git fetch origin remoteBranch
git checkout remoteBranch
下载remote端的分支(非mainline)

git stach save
git stach pop
暂存改动,使得没有unstaged文件
恢复暂存的改动
git pull开始一个issue时,都要先做此步
git log查看本分支commit历史记录(从新到老排序)
branchgit branch显示所有分支
branchgit branch issue1创建issue1的分支,与mainline基点一致
branchgit checkout -b issue1创建且切换到issue1分支
git status查看在哪个分支,与origin/mainline(remote端)比ahead了几个commit,文件状态(增改删)。Commit后不显示文件状态
commitgit diff (test.java)
git diff abcd fghi
git diff -z --name-only abcd fghi
查看所有/单个文件与上次commit的不同,git add后不会显示diff。还可以比较两个版本所有代码的异同。最后可以只查看修改的文件名
commitgit checkout abcd Test.javarevert一个unstaged文件,abcd是commit id从git log可得
commitgit reset --hard abcdrevert所有文件(unstaged/staged),abcd是commit id从git log可得
commitgit add (test.java/*.java)commit前加入到index,任何添加修改都需要git add。之后gitstatus这些文件由红变绿(staged)
commitgit reset (test.java/*.java)git add的逆操作
commitgit reset --hard撤销git add的所有文件
commitgit clean -dfx删除新加且unstaged的所有文件
commitgit commit -m "add a log"
git commit --amend
执行前先做git status确保分支和修改文件正确。amend修改log最近提交的信息。
commitgit reset --soft HEAD~撤掉git commit,文件仍在git add后状态(staged)
commitgit reset HEAD~撤掉一个git commit(多个用HEAD~n),文件仍在git add前状态(unstaged)
commitpost-review --parent mainline -r 12345提交review,-r可以保证多次commit仍然是同一个code review。如果是mainline可以post-review -r
rebasegit rebase -i HEAD~3
shift zz to save
先在分支合并commit,3表示合并3个commit。如果在mainline执行这个操作,git将会把分支上各个commit合并到分支,可能需要resolve每个commit,非常没必要。
合并多个commit为一个,且汇总commit信息。把除第一行的pick改为s(squash)变成一个commit代码,下一页修改commit信息,shift+D删除全行。命令可加上issue1表示对此分支修改commit。若在主干,则执行
git rebase -i
pullgit checkout mainline切换到mainline更新最新代码
pullgit pull从remote端下载最新代码到mainline
rebasegit checkout issue1先切换到issue1,再执行rebase
rebasegit rebase mainline先切换到issue1,再执行rebase。如果出现error,就到有冲突的文件解决冲突
rebasegit add Test.javarebase后再add存在冲突的文件
rebasegit rebase --continuerebase状态下的git commit
rebasegit log此时会见到remote端的改动出现在log中
mergegit checkout mainline转换分支mainline或issue1
mergegit merge issue1先切换到mainline,把issue1分支并入到mainline
pushgit pushpush前要先build一下。push到remote端
pushgit branch -d issue1push后删除,不要重用
git cherry-pick abcd从某个commit引入到该分支,因id在各分支中唯一
git revert abcd撤销某个commit,会在commit msg加revert。cherry-pick的反操作,cherry-pick是引入新的commit,而revert是取消目前分支的某个commit。
git blame Test.java打印某一个文件的历史commit,可以快速找到引致错误文件的commit然后git revert
git stash save将未commit的临时改动存入stash,以方便revert而不丢失代码
git stash pop将stash的改动恢复到workspace

这个表格覆盖了一个code改动的流程,包括branch、commit、pull、rebase、merge、push六个大步骤。绿色是最常用命令,黄色是对应上行的逆操作。staging时候分支代码都一样,只有commit以后代码才会不同。

其他命令:

bisect:二分法(端点为good和bad)找到导致错误的commit,需要手动标记此版本好还是坏,git决定在哪个区间继续搜。


Rebase:

Git可以在local repository创建多个分支。mainline是server的分支。比较好的操作是创建一个分支用于修改自己的改动,再merge到mainline。
git checkout -b issue3
git commit -m ""
git checkout mainline
git merge issue3
git push
这个实践很好,如果这段过程中mainline没有push的话,也仍是一条直线。但如果有commit0时候,自己的分支有两个commit(由于code review中不断改动产生多次commit),merge过程就产生一个merge point(不是任何一个checkin point,issue3这个分支push了)。最大缺点是issue3的历史记录不在mainline上不好查看而且不能删除。












引入rebase既可以合并多次commit成一个还可以只出现主干。rebase就是在commit和merge之间加入一步,将最新的remote端代码更新到分支,也叫分支的base改到最新了,所以叫rebase。rebase时候,git会将mainline的改动按步骤一个commit by一个commit将merge到分支。resolve conflict过程会看到分支的最新代码没有出现是因为working on最初的commit,所以只要管好conflict即可,不用理其他代码。







gitignore:

.gitignore文件加入如下:可忽略这些文件永远不会checkin
*.pyc
.idea/

git-config

git config --global commit.template ~/a.txt 
git commit (not git commit -m "")
vim ~/.gitconfig to change name


TortoiseGit

利用bitBucket作为remote repository. 下载TortoiseGit作为client, TortoiseGit需要下载Git.exe

然后右击Git Clone(=SVN checkout) ,如果这个选项没出现就按着shift键才右击即可,然后输入bitbucket中的clone url,文件夹一定要为空。然后创建一个文件,就要commit并且push. commit表示代码写入local repository, push表示写入到remote server




ref: https://www.youtube.com/watch?v=YC6zraqIooM

每次push都输入git url


























Friday, March 18, 2016

TeamCity简介

https://www.youtube.com/watch?v=td0bV2zu5rw
https://www.youtube.com/watch?v=w8tvDSCN2AE

http://www.cnblogs.com/WilsonWu/archive/2013/05/22/3092584.html


Run as a System account

Tuesday, March 8, 2016

Apriori



C set: candidate set
L set: large-item set
C set->L set
frequent set=L set


Python程序思路:
L2->C3
union的所有组合: ABC, ACBE, ACE, BCE
首先个数要为3个,所以ACBE去掉只剩下三组就是C3



















但是据权威参考资料,C3直接是BCE, 因为C3中的任两两元素都应为large(L2里面), 所以ABC, ACE直接不能进入C3
















































如果计算关联规则:
Python 程序思路:
所有L set包括其support数值存于dict中如A 0.5, B 0.75....BCE 0.5
然后对每一个frequent item=L set做如下:
frequent item的support值/该frequent item所有子集(不包括自己)如BCE就是B,C,E,BC,BE,CE,BCE,如果该子集的除法满足Min confidence,
规则为该子集=>frequent item-该子集。如
P(BCE/B) or count(BCE)/count(B)=0.5/0.75=0.67>0.6(min confidence). 就有B=>CE
P(BCE/C)=0.5/0.75 就有C=>BE


原理:(网球拍例子)确定了frequent set(BCE)之后,这就是确定了support也就是confidence置信度(条件概率)中的分子部分
P([BCE]/P(X))=0.6(min confidence)



http://blog.csdn.net/fufengrui/article/details/16342425

https://www.zhihu.com/question/22590018

http://blog.csdn.net/wyc09/article/details/16860923

Python简介


语法:
literals包括set literals, directory literals, list literals
大括号包括set/directory
a={}
a={'a','b'}
a={'a': 42,'b':81}

中括号表示list
alist = ['foo', 'bar', 'bar']
empty_list = []

开发环境:
可以用eclipse进行开发
IPython

安装包:
numpy: array 类(实现matrix类的基础)-1.10.4
scipy:数值计算。做矩阵计算,算特征值,算积分,算微分方程。用pip安装的时候一般出现缺少C++包的问题,解决方案请看WinPython
scikit-learn包括朴素贝叶斯
pandas读数据非常快
Matplotlib

方法一WinPython:这个软件包括Ipython, Pandas, Scikit-learn(自然包括numpy, scipy), Python GUI. 或者导入Eclipse,这样在Eclipse也可以用scipy这些包

方法二pip:

python 3.3.以上pip(8.1.1)自带,不需安装只需运行如下:

python -m pip install numpy
python -m pip install scipy










测试:
from numpy import *
from scipy import *
from sklearn import svm

还有一些常用的工具
Orange data mining

Unable to find vcvarsall.bat
  1. python -m pip install -U pip
  2. pip install -U setuptools
  3. pip install -U virtualenv

Sunday, March 6, 2016

C#之OOD

http://blog.csdn.net/hliq5399/article/details/6305335

http://www.cnblogs.com/max007super/archive/2009/02/09/1386980.html

http://www.cnblogs.com/weihai2003/archive/2008/10/24/1319003.html

http://stackoverflow.com/questions/1327544/what-is-the-equivalent-of-javas-final-in-c/1327549#1327549

http://www.cnblogs.com/chenssy/p/3388487.html