TortoiseGit + GitHub 快速上手指南

名词解释:

1. TortoiseGit 是 TortoiseSVN的Git版,它很好的实现了与windows资源管理器的融合,使用界面与TortoiseSVN非常类似。
2. TortoiseGit运行在msysgit(git的windows开源版本)之上,因此,在安装TortoiseGit前需要安装msysgit。
3. GitHub是提供在线git空间的平台,免费的账号只能使用公开的空间并且需要公布所有原始码,没有其他限制。

快速上手步骤:
1. 安装msysgit.
2. 安装最新版的TortoiseGit
3. 配置TortoiseGit,在Setting-General-Msysgit中指定git.exe为msysgit安装目录下的\bin目录里的git.exe,另外External dll 为msysgit安装目录下的\mingw\bin;
4. 打开TortoiseGit程序组中的Puttygen
5. 鼠标点击"generate",使用鼠标在空间面板中任意活动,产生你的Putty密钥,无需输入key passphrase,然后点击Save private key到本地.
6. 从Puttygen中copy你的公钥,你的公钥是一个位于第一个文本域中的比较大的随机的字母数字串,它看起来如下:
   ssh-rsa
   AAAB3NzaC1yc2EAAAABJQAAAIBqFftopEl3HNQ+SUmh9dFW39+IYU1ZYLG04GU
   Nh02DEbgKn9qaCJDjqCh9a7LO+oN6RjcWLIwaPPlwZI1w6el5WaZKeKEOtWqgQW+
   trnLRijgF9sPRR7jweM13S8lnpSvCUQbPxUyaNHZkEmY2PI1BaANv3d9YGnnhbKXPz
   m0rmQ== rsa-key-20091128
7. 在GitHub中创建一个帐户,导航到Account settings,点击"ssh public keys", 把你在上面产生的公钥增加进去。
 8. 在GitHub中新建一个Repository-"yourproject",进入你的Repository-"yourproject"
9. 从你的Repository-"yourproject"库的主页顶部中,点击copy to clipboard 图标,你的Git地址看起来如下:"git@github.com:yourname/yourproject.git"
10. 在你的硬盘上为这个"yourproject"源码创建一个新目录, 点击右键选择"Git Clone...".
11. 在URL中输入你在第8步中的URL clone地址.
12. 选中"Load Putty Key" ,并选择你在第4步存储的私钥位置。
13. 点击OK即可获取你的项目"yourproject"分支了。

日常开发步骤:

1.Git Commit 提交到本机.

2.Push 提交到GitHub.

随笔:

Git控制文件全部在项目根目录下,Svn则和文件在同一层目录

Git中一个文件会产生三个版本控制文件,而Svn只产生一个

posted @ 2012-01-18 14:10 meetrice 阅读(37) 评论(0) 编辑

Image image = Image.FromFile(@"c:/fp.bmp");
Bitmap bmp = new Bitmap(image);
image.Dispose(); //释放文件占用,这句话很重要
pictureBox1.Image = Rotate(bmp, RotateFlipType.Rotate180FlipNone);

 

 

 

//旋转
private Bitmap Rotate(Bitmap source, RotateFlipType rotateFlipType)
{
Rectangle rect = new Rectangle(0, 0, source.Width, source.Height);
Bitmap target = source.Clone(rect, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
target.RotateFlip(rotateFlipType);
return target;
}

posted @ 2011-12-11 17:09 meetrice 阅读(17) 评论(0) 编辑

http://hi.baidu.com/huangzuduan/blog/item/4a82281b275af6f5af5133ae.html

近日来对Ext特别感兴趣,也许是它那种OO的设计思想吸引了我,也可以追溯到第一次见到EXT那种漂亮的界面开始吧.求神拜佛不如自食其力,为了一点小的问题找遍了GOOGLE也没个结果,自己甚少去BBS混,也不熟悉规矩,只能硬着头皮自己干了.翻源代码是一道必不可少的工序,说来惭愧,自己对JS的认识还停留在入门阶段.

这里说说自己对于Ext验证这里浅薄的理解:

首先看看如下一段代码

Ext.applyIf(Ext.form.VTypes, {
"mail" : function(_v) {
return /^\w+@\w+\.\w+$/.test(_v);
},
"mailText" : "请输入正确的email格式!\n例如:username@domain.com",
"mailMask" : /[\w@.]/i
});

这里是对Ext.form.VTypes进行扩展,增加了我们需要的email验证.

既然是扩展,那么我们就得先来看看这个父类到底是个什么样子.

Ext.form.VTypes = function(){
// closure these in so they are only created once.
var alpha = /^[a-zA-Z_]+$/;
var alphanum = /^[a-zA-Z0-9_]+$/;
var email = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;
var url = /(((https?)|(ftp)):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;

return {
'email' : function(v){
return email.test(v);
},
'emailMask' : /[a-z0-9_\.\-@]/i,
'url' : function(v){
return url.test(v);
},
'urlText' : 'This field should be a URL in the format "http:/'+'/www.domain.com"',
'alpha' : function(v){
return alpha.test(v);
},
'alphaText' : 'This field should only contain letters and _',
'alphaMask' : /[a-z_]/i,
'alphanum' : function(v){
return alphanum.test(v);
},
'alphanumText' : 'This field should only contain letters, numbers and _',
'alphanumMask' : /[a-z0-9_]/i
};
}();

以上就是Ext.form.VTypes的庐山真面目了,这里返回一个JSON的对象其中包括方法和属性,可以理解为这个类的公有方法和属性比较OO.
通过分析我们可以看到这里有个规律,xxx,xxxText,xxxMask,这些东西到底都是干嘛的?

在我们的TextField类里边有这么一个字符类型的属性vtype,在TextField类的初始化代码中,有这么一段
if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Ext.form.VTypes[this.vtype+'Mask']))){
this.el.on("keypress", this.filterKeys, this);
}
这里我把重要的用黑体字标了出来,我们可以看到,当我们设置了当前对象(TextField)vtype属性时候,当前对象的maskRe属性获取了VTypes类的this.vtype+'Mask'属性,看到这里我们就明白了xxxMask属性里边的正则表达式是自动赋值给TextField的,这个属性在TextField控件keypress事件触发时候调用的,作用是用来限制输入的字符.

再看下面一段代码
if(this.vtype){
var vt = Ext.form.VTypes;
if(!vt[this.vtype](value, this)){
this.markInvalid(this.vtypeText || vt[this.vtype +'Text']);
return false;
}
}
这里是fieldText控件的validateValue方法里边会执行到的代码,这段代码的作用就是验证当前控件输入的内容是否通过我们刚才定义的XXX里边的验证逻辑,如果未通过则使用this.arkinvalid方法去执行未通过操作并且返回一个false.
具体谁调用这个validateValue方法,我们可以去查看该控件的父类,或与submit相关的类,这里只是返回一个与当前设置的vtype相关的验证属性

看到这里我们也就明白了,刚才上边定义的xxx,xxxText,xxxMask的作用分别为,验证逻辑,验证失败信息,控件输入验证.

知道了这些我们要来扩展这个VTypes就易如反掌了
Ext.applyIf(Ext.form.VTypes, {
"mail" : function(_v) { //定义验证逻辑,返回布尔类型的验证结果
return /^\w+@\w+\.\w+$/.test(_v);
},
"mailText" : "请输入正确的email格式!\n例如:username@domain.com", //这里是验证失败信息
"mailMask" : /[\w@.]/i //这里是输入字符验证
});

好了,我们的验证到这里就结束了.如果需要更深入的验证,那么我们就必须自己去实现一些复杂的逻辑了.

这里再给大家贴出一些简单的验证逻辑

Ext.apply(Ext.form.VTypes, {
// 年龄
"age" : function(_v) {
if (/^\d+$/.test(_v)) {
var _age = parseInt(_v);
if (_age < 200)
return true;
} else
return false;
},
'ageText' : '年龄格式出错!!格式例如:20',
'ageMask' : /[0-9]/i,
// 密码验证
"repassword" : function(_v, field) {
if (field.confirmTO) {
var psw = Ext.get(field.confirmTO);
return (_v == psw.getValue());
}
return true;
},
"repasswordText" : "密码输入不一致!!",
"repasswordMask" : /[a-z0-9]/i,
// 邮政编码
"postcode" : function(_v) {
return /^[1-9]\d{5}$/.test(_v);
},
"postcodeText" : "该输入项目必须是邮政编码格式,例如:226001",
"postcodeMask" : /[0-9]/i,

// IP地址验证
"ip" : function(_v) {
return /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
.test(_v);

},
"ipText" : "该输入项目必须是IP地址格式,例如:222.192.42.12",
"ipMask" : /[0-9\.]/i,
// 固定电话及小灵通
"telephone" : function(_v) {
return /(^\d{3}\-\d{7,8}$)|(^\d{4}\-\d{7,8}$)|(^\d{3}\d{7,8}$)|(^\d{4}\d{7,8}$)|(^\d{7,8}$)/
.test(_v);
},
"telephoneText" : "该输入项目必须是电话号码格式,例如:0513-89500414,051389500414,89500414",
"telephoneMask" : /[0-9\-]/i,
// 手机
"mobile" : function(_v) {
return /^1[35][0-9]\d{8}$/.test(_v);
},
"mobileText" : "该输入项目必须是手机号码格式,例如:13485135075",
"mobileMask" : /[0-9]/i,
// 身份证
"IDCard" : function(_v) {
// return /(^[0-9]{17}([0-9]|[Xx])$)|(^[0-9]{17}$)/.test(_v);
var area = {
11 : "北京",
12 : "天津",
13 : "河北",
14 : "山西",
15 : "内蒙古",
21 : "辽宁",
22 : "吉林",
23 : "黑龙江",
31 : "上海",
32 : "江苏",
33 : "浙江",
34 : "安徽",
35 : "福建",
36 : "江西",
37 : "山东",
41 : "河南",
42 : "湖北",
43 : "湖南",
44 : "广东",
45 : "广西",
46 : "海南",
50 : "重庆",
51 : "四川",
52 : "贵州",
53 : "云南",
54 : "西藏",
61 : "陕西",
62 : "甘肃",
63 : "青海",
64 : "宁夏",
65 : "新疆",
71 : "台湾",
81 : "香港",
82 : "澳门",
91 : "国外"
}
var Y, JYM;
var S, M;
var idcard_array = new Array();
idcard_array = _v.split("");
// 地区检验
if (area[parseInt(_v.substr(0, 2))] == null) {
this.IDCardText = "身份证号码地区非法!!,格式例如:32";
return false;
}
// 身份号码位数及格式检验
switch (_v.length) {
case 15 :
if ((parseInt(_v.substr(6, 2)) + 1900) % 4 == 0
|| ((parseInt(_v.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(_v
.substr(6, 2)) + 1900)
% 4 == 0)) {
ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;// 测试出生日期的合法性
} else {
ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;// 测试出生日期的合法性
}
if (ereg.test(_v))
return true;
else {
this.IDCardText = "身份证号码出生日期超出范围,格式例如:19860817";
return false;
}
break;
case 18 :
// 18位身份号码检测
// 出生日期的合法性检查
// 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
// 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
if (parseInt(_v.substr(6, 4)) % 4 == 0
|| (parseInt(_v.substr(6, 4)) % 100 == 0 && parseInt(_v
.substr(6, 4))
% 4 == 0)) {
ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;// 闰年出生日期的合法性正则表达式
} else {
ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;// 平年出生日期的合法性正则表达式
}
if (ereg.test(_v)) {// 测试出生日期的合法性
// 计算校验位
S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10]))
* 7
+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11]))
* 9
+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12]))
* 10
+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13]))
* 5
+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14]))
* 8
+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15]))
* 4
+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16]))
* 2
+ parseInt(idcard_array[7])
* 1
+ parseInt(idcard_array[8])
* 6
+ parseInt(idcard_array[9]) * 3;
Y = S % 11;
M = "F";
JYM = "10X98765432";
M = JYM.substr(Y, 1);// 判断校验位
// alert(idcard_array[17]);
if (M == idcard_array[17]) {
return true; // 检测ID的校验位
} else {
this.IDCardText = "身份证号码末位校验位校验出错,请注意x的大小写,格式例如:201X";
return false;
}
} else {
this.IDCardText = "身份证号码出生日期超出范围,格式例如:19860817";
return false;
}
break;
default :
this.IDCardText = "身份证号码位数不对,应该为15位或是18位";
return false;
break;
}
},
"IDCardText" : "该输入项目必须是身份证号码格式,例如:32082919860817201x",
"IDCardMask" : /[0-9xX]/i
});
posted @ 2011-12-03 22:20 meetrice 阅读(105) 评论(0) 编辑
com.awd.jlsjlsgl.queryformpanel = Ext.extend(Ext.form.FormPanel,{
initComponent:function() {
Ext.apply(this,{
labelAlign:'right',
labelWidth:80,
defaultType:'textfield',
bodyStyle:'padding:20px;',
defaults:{width:290},
items:[{
xtype:'panel',
html:'请在下面输入查询条件:',
width:370,
border:false,
style:'padding:10 0 0 3;margin:0 0 20 10;border-bottom:1px solid #ccc;font-size:14px;font-weight:bold;'
}
,{
xtype:'panel',
layout:'column',
width:400,
border:false,
defaults:{border:false}
}
,{xtype:'textfield',fieldLabel:'条件一',name:'s_kssmc',width:288}
,{xtype:'cboFY',fieldLabel:'条件二'',name:'s_dj',field_type:'DJ',pageSize:10,editable:true,width:288}
]

});
com.awd.jlsjlsgl.queryformpanel.superclass.initComponent.call(this);
}
});



/**
* 查询窗口
* @class com.awd.py.querywin
* @extends Ext.Window
*/
com.awd.jlsjlsgl.querywin = Ext.extend(Ext.Window,{
initComponent:function() {
Ext.apply(this,{
title:'高级查询',
width:455,
height:395,
modal:true,
closeAction:'hide',
layout:'fit'
});
com.awd.jlsjlsgl.querywin.superclass.initComponent.call(this);
}
});



this.queryformpanel = new com.awd.jlsjlsgl.queryformpanel();
this.querywin = new com.awd.jlsjlsgl.querywin({items:this.queryformpanel,buttons:[{
text:'确定',
handler:this.queryResult,
scope:this
},{
text:'重置',
handler:function(){this.queryformpanel.getForm().reset();},
scope:this
},{
text:'取消',
handler:function(){this.querywin.hide();},
scope:this
}]});



//查询
,queryResult:function(){
Ext.each(this.queryformpanel.form.items.items, function(f) {
this.getStore().baseParams[f.name] = f.getValue();
},this);
this.getStore().load();
this.querywin.hide();
}



posted @ 2011-12-02 20:36 meetrice 阅读(46) 评论(0) 编辑
摘要: 我们项目版本控制使用的SVN,经常会有因为没有清理.svn文件造成的不能更新和提交,今天就在网上找了一一个BAT的代码,测试过了,非常好用//----------------以下是bat代码-----------------------------@echo On@Rem 删除SVN版本控制目录@PROMPT [Com] @for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn"@Rem for /r . %%a in (.) do @if exist "%%a\.svn&q阅读全文
posted @ 2011-11-26 11:18 meetrice 阅读(145) 评论(0) 编辑
摘要: 源:http://blog.csdn.net/yejun52/article/details/3867561自从2000年开始接触BCB,使用BCB作编程入门学习,一路走来,遇到了不少不大不小的问题。一晃9年过去了,BCB不再陌生,当初为问题困扰时那种手足无措的记忆也渐渐淡了。每念及此,甚有把一些心得写作文字的紧迫感。鉴于本人技术能力和文字水平之限,一直未能下决心,今天鼓起勇气做这事,好歹不论,只希望对使用BCB的后来者有些帮助。1.尽量将enum类型视为int类型使用VCL库中emun类型缺省1个字节大小,而VC中enum类型缺省4个字节大小。因此一旦遇到使用BCB编译可执行文件调用VC编译阅读全文
posted @ 2011-10-26 17:15 meetrice 阅读(57) 评论(0) 编辑
摘要: background.html<script src="cnblogsright.js"></script>cnblogsright.jsvar tweettext = chrome.contextMenus.create({"title": "转载到博客园","contexts":["selection"], "onclick": posttwtext});function posttwtext(info, tab) { var posturl=&q阅读全文
posted @ 2011-09-26 21:52 meetrice 阅读(98) 评论(0) 编辑
摘要: Web开发相关技术报告下载重要提示:所有技术报告版权属搜狐公司研发中心所有,严禁在未经获得允许的情况下以任何形式加以转载!C10K问题---epoll简介简介:编写连接数巨大的高负载服务器程序时,经典的多线程模式和select模式都不再适用。应当抛弃它们,采用epoll/kqueue/dev_poll来捕获I/O事件。点此下载我要评论乱序优化与GCC的Bug简介:乱序优化是现代编译器非常重要的特性,本文介绍了什么是乱序优化,以及由此引发的一个gcc bug,希望引起各位开发者的注意。点此下载我要评论轻量级AJAX库简介:Ajax作为一个非常常用的功能,在页面中的作用越来越举足轻重。而对于浏览器阅读全文
posted @ 2011-09-09 13:57 meetrice 阅读(42) 评论(0) 编辑