关于源代码控制的五个误区

上周,在Red Gate好朋友的帮助下。我发起了一个名为小竞赛赢得优秀的SQL Source Control 5份授权的活动。参加的方式很简单-分享你使用源代码控制过程中,本可以避免的最痛苦的经历 许多痛苦的故事都出现了。但是我认为这五个获奖者的故事值得分享,并且我都做了评论,因为我觉得随着时间的流逝,这些故事依然对我们有所启发。那么,开始享受这些故事吧,我希望这些知识中的闪光点能够帮助你以后不会掉进相同的陷阱里。 给获奖者:希望那些授权可以帮助抚慰你们关于那些已经过去的痛苦记忆。不久我会联系你们关于奖项颁发的相关事宜。 1.通过Ctrl-Z来进行源代码控制 第一个故事来自 courtesy of MyChickenNinja ,仅仅文字就看得我头疼。在这个特殊的故事里。应用程序被前员工破坏了。。这非常头疼。但是至少还是有很多方法可以恢复代码的。如果不要求数据的话。。 第一个问题是备份,最近的备份已经是3周前的。这绝对是一个教训—你的环境真的备份了吗?一会我会在另一个故事里简单的再说到这个问题。故事的核心部分是通过Ctrl-Z来进行伪源代码控制 他们运行他们的代码,并且不断地更新,也包括开发环境,并且使用Ctrl-Z来撤销坏的改变 好吧。这实在令人难以置信-如果你的应用程序已经做了一些编辑。然后被关闭了。怎么办?或者PC关机了?等等—他还说他们在哪写代码,哪儿就是开发环境?记住!撤销不是源代码控制! 2。多个数据库和集成问题 第二个故事来自Brandon Thompson,他极度不开心,因为他工作在一个有着很多数据库源的环境里,并且,这些数据库都在正在进行的开发项目下面,数据库集成非常困难,这就意味着处理多个数据库备份可能还有个在海外。。 我们的开发团队在海外,因为他们有他们自己的数据库集,这些数据库我从没看到过。但是他们会把改变的文件发给我们来适应我们的开发环境 我发现最痛苦的是简单重复的手工劳动仅仅是使得大家能够协同的更好。这是没有一点创新并且没有任何增值的行为,比如增加新的特性,这就导致除了干这些。没什么时间真正在写代码了。 源代码控制是为了能够保证团队之间平稳尽量无摩擦的一起工作。它是项目的一个润滑剂,和持续集成开发还有自动部署都属于同一类。这些都是软件开发中的“面包和黄油”,是任何成功团队编写代码的基础。 3. 依赖未测试的备份 下一个是Barry Anderson,他写了一个我们都曾经经历过的痛苦:不能从备份恢复了!事实上在Barry的故事里。几个月都没备份了。之前备份本身还是坏的。这太糟糕了。但是,对于那些依赖备份的人来说这是一个严重的疏忽。 当然对于这个疏忽也有自己的借口。Barry解释道: 我们的经理(不是存储团队的)后来告诉我们既没时间也没空间来测试备份了。。。 备份是一件很重要的事情。但从备份可以恢复也是同等重要,我最近在配置大量的新环境的时候,备份本应该发生的但是就是没有发生。只有当我坚持要进行恢复测试的时候,问题才浮出水面,对于很多人来说。只有当他们真的需要从一系列的数据丢失中恢复数据的时候,才发现不能恢复了。。测试你的备份,恢复他们,不要相信任何人的说辞. 4.人工合并工具 来自Graham Sutherland的故事讲了一个人来做机器工作的故事 我们有一些开发人员,每一个在他们的硬盘上的都有整个项目的一个副本,每一次一个改变发生的时候,我们就会下载技术老大改变的源代码,然后使用diff工具来查看改变。然后手工更新他们。一行一行。。全靠双手。。 这个故事比听起来还要不可思议,在源代码控制工具出现以前这确实是存在的。一个海外开发团队成员就是这样干的。随后他们这样解释:带头的开发者需要在提交前检查其他开发人员的工作进度。 这确实是类似于之前的观点,在有多个数据库集成的情况下;我们有技术来解决这些问题!每当一个人在软件开发中从事任何劳动密集型,重复的过程,你真的不得不停下来问:“有没有更好的方法?”通常是有的。 5.剪切和粘贴版本控制 Robin Vessey 让我产生了共鸣,因为它真的是伪VCS(Version Control System)最普遍的方式。剪切或者复制,然后粘贴到新的位置,通过这种方式会包含重复的目录或者文件。因此一般这些文件会被以日期或者其他标识符来标识时间帧。 在Robin的故事里,他打算通过网络移动一个目录结构。 他很简单但高效,我剪贴然后粘贴了一个完整的目录树,任何东西,通过网络发送。但这些文件留在了我这一边。却没有到达另一边。我仍然不知道为什么。 我必须承认,我对任何剪切和粘贴文件的操作的态度是非常谨慎的,因为我看到这种情况在一个本地文件系统中发生了很多次,更不用说通过网络了,在上面的的Robin的故事,就是没有备份被恢复,因为他们一段时间后会停止备份,“因为我们没有更多的空间”。是不是感觉好像和前面某一方法很像。。 总结 工作在一个没有源代码控制的环境下是很可怕的。现在就停止吧。伙计们,我们是很优秀,但在在源代码控制下工作是很专业的。并且现在有很多的VCS产品。托管服务,集成工具,真心是没有任何理由不把代码-包括数据库,部署在源代码控制下。 原文地址:5-ways-to-do-source-control-really 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

2012-10-04 · 1 min · bystander

简单扩展方法增强代码可读性

本文技术含量不高,但是思路可以借鉴。。 介绍 当你处理计时器,时间间隔,或是其他关于日期的计算的时候。你必然会使用TimeSpan类。 我觉得写出下面的代码可读性并不好。。 // 1个表示5小时的时间间隔 var theTimespan = new TimeSpan(0, 5, 0, 0, 0); 而下面的代码就要好一些 //一个表示5小时的时间间隔 var theTimespan = 5.Hours(); ** 扩展方法** 使用这些扩展了int类的方法。可以使得创建TimeSpan可读性更好 public static TimeSpan Days(this int value) { return new TimeSpan(value, 0, 0, 0, 0); } public static TimeSpan Years(this int value) { var dt = DateTime.Now.AddYears(value); return (dt - DateTime.Now).Duration(); } public static TimeSpan Hours(this int value) { return new TimeSpan(0, value, 0, 0, 0); } public static TimeSpan Minutes(this int value) { return new TimeSpan(0, 0, value, 0, 0); } public static TimeSpan Seconds(this int value) { return new TimeSpan(0, 0, 0, value, 0); } public static TimeSpan Milliseconds(this int value) { return new TimeSpan(0, 0, 0, 0, value); } 许可 本文所有源代码包括文件在CPOL下授权。。 原文地址:Simple-extension-methods-for-code-readability 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

2012-10-04 · 1 min · bystander

C#使用Graphics创建饼图

介绍 这个程序是使用C#中的Graphics来创建一个饼图的,我已经尽我所能写的很好了。如果你有任何建议可以分享给我,这样我也能从中学习。 使用代码 最近我迷上了Graphics类。我仅仅体验了一下Graphics的DrawPie() 和FillPie() 方法。 最为一个简单的Demo,我创建一个有着五个文本框的窗体,一个按钮,一个图片框。一会我就把饼图画在图片框里 在创建一个饼图之前,我们头脑里要有这个意识。我们不能创建一个不符合常规的圆,创建圆我们需要度数信息。 为了转换度数。我们首先把给定的值做个求和。然后得出文本框里所有值的和。然后呢。用每个值除以总值再乘以360度。 代码如下: int i1 = Int32.Parse(textBox1.Text); int i2 = Int32.Parse(textBox2.Text); int i3 = Int32.Parse(textBox3.Text); int i4 = Int32.Parse(textBox4.Text); int i5 = Int32.Parse(textBox5.Text); float total = i1 + i2 + i3 + i4 + i5 ; float deg1 = (i1 / total) * 360; float deg2 = (i2 / total) * 360; float deg3 = (i3 / total) * 360; float deg4 = (i4 / total) * 360; float deg5 = (i5 / total) * 360; 值转换完毕后。我们可以创建Graphics类的实例了。 Graphics graphics = pictureBox1.CreateGraphics(); 然后我们需要创建一个矩形区域,在这个矩形区域里绘制饼图。 Rectangle rect = new Rectangle(0, 0, 150, 150); 前两个参数定义了矩形左上角的坐标,后两个分别定义了举行的宽和高。 为了能够比较清晰的看出饼图各部分的比例。我们需要创建五个笔刷。 Brush brush1 = new SolidBrush(Color.Red); Brush brush2 = new SolidBrush(Color.Blue); Brush brush3 = new SolidBrush(Color.Maroon); Brush brush4 = new SolidBrush(Color.Navy); Brush brush5 = new SolidBrush(Color.YellowGreen); graphics.Clear(pictureBox1.BackColor); 现在我们可以开始创建我们的饼图了。graphics.FillPie();方法接受四个参数 笔刷,用来填充扇形 矩形:饼图将被创建的区域。 开始角度:饼部分的开始角度 覆盖角度:饼部分扫过的角度 一般来说graphics.FillPie();方法并不是创建一个完全的饼图,而是创建饼图的一个扇形部分,我们会创建一系列的扇形最终看起来像是一个饼图。 ...

2012-09-27 · 2 min · bystander

C#删除文件和文件夹到回收站

如果使用C#代码来删除文件或是文件夹。会将文件和文件夹直接删除,而不是删除到回收站。可以调用Microsoft.VisualBasic.dll提供的方法。 首先对项目添加名为Microsoft.VisualBasic.dll的引用,然后添加命名空间 using Microsoft.VisualBasic.FileIO; 最后示例代码如下: using System; using Microsoft.VisualBasic.FileIO; namespace leaver { class Program { static void Main(string[] args) { Console.WriteLine("删除文件到回收站"); string filepath = "leaver.txt"; FileSystem.DeleteFile(filepath, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); Console.WriteLine("删除文件完成"); Console.WriteLine("删除文件夹到回收站"); string dirpath = "leaver"; FileSystem.DeleteDirectory(dirpath, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); Console.WriteLine("删除文件夹完成"); } } } 很简单。。就不多说了。。

2012-09-24 · 1 min · bystander

.net显示网络连接状态图标

效果图: 介绍 越来越多的软件要通过连接互联网来执行一些业务层的业务操作,比如调用web services服务,获取数据等等。 通常你可能希望知道当前你的网络连接是不是真的连上了,当然有很多种方法可以做到,比如,你可以查看System.Net 命名空间中的NetworkInterface 的状态,但是有这以太网连接并不表示你的连接真的可以用。 本文将会展示一种方法,该方法在程序的状态栏StatusStrip 显示一个简单的图标来指示是不是真的连接到了互联网。 使用代码 最简单的我们会想到使用一个Timer来进行http-get请求来判断一个特定的网页是否可用。 当然这种方法下,我们最应该考虑的就是请求不能阻塞UI线程,因此,我将使用一个BackgroundWorker 对象来进行get请求,BackgroundWorker 对象声明了DoWork方法。该方法定义了一个事件句柄,该句柄传递一个DoWorkEventArgs 类来将事件的处理结果返回到UI线程,因此,你不必与任何的UI元素进行交互,因为它运行在一个独立的线程里。 private void InitializeComponent() { // Background Worker this._worker = new BackgroundWorker(); this._worker.WorkerReportsProgress = false; this._worker.WorkerSupportsCancellation = false; this._worker.DoWork += new DoWorkEventHandler(this.BackgroundWorker_DoWork); this._worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.BackgroundWorker_RunWorkerCompleted); // Timer this._updateTimer = new Timer(); this._updateTimer.Enabled = !this.DesignMode; // Enabled when not in design mode this._updateTimer.Tick += delegate { this.OnTick(); }; } private void OnTick() { if (this.DesignMode) return; // Stop the timer while the process is running this._updateTimer.Enabled = false; // Disable so we get the grayed-out look this.Enabled = false; this.Invalidate(); // Execute the Ping Query on a separate thread... this._worker.RunWorkerAsync(); } 这个查询很简单,我执行简单的HttpWebRequest 来请求一个必然是可用的网页。比如微软的主页或是Google的主页。通过这样,我们就能知道是不是真的连接上了互联网。 private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { try { // Create an HTTP Web request // to an Uri that's always available. HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(this._alwaysAvailableUrl); // Perform GET HttpWebResponse response = (HttpWebResponse) request.GetResponse(); if (HttpStatusCode.OK == response.StatusCode) { // HTTP = 200, close the request and return true response.Close(); e.Result = true; } else { // Other status; return false e.Result = false; } } catch (WebException) { // Deffinitely offline e.Result = false; } } 当BackgroundWorker 对象完成了他的工作,,也就是定义DoWork 里的事件,他会触发RunWorkerCompleted 事件,这个事件也定义了一个定制的事件句柄- RunWorkerCompletedEventArgs 有了这个类,我们就可以管理ToolStripStatusLabel的显示了 ...

2012-09-24 · 2 min · bystander

SqlServer 2008开启远程连接

 对于需要外部访问数据库的操作,需要开启sql server的远程连接。没经验的我等Google之。。大部分操作按照SQL Server 2008 R2如何开启数据库的远程连接来操作 但是。有一些很小的细节需要注意。我的数据库是Sql Server 2008 Express版。这个是VS自带的。为了管理方便,可以安装SQL Server® 2008 Management Studio Express 安装过程不多说。安装完成后,直接打开 服务器名称默认是空的。。“.”好像是不行的,这时候点击右边箭头。更多,本地和远程服务器。在远程服务器里可以找到。点击就可以了。 我按照文章改完。sa还是登不上。。然后又试了一些 如上图右键sa,属性,常规里设置sa密码。不要太简单。状态里的登录选项设为启用。ok。。我碰上的问题就这几个。

2012-08-20 · 1 min · bystander

SQLServer启用xp_cmdshell

忘了当时是执行哪条命令的时候需要启动xp_cmdshell了。。反正是必须用的。。 默认情况下,sql server安装完后,xp_cmdshell是禁用的(可能是安全考虑),如果要使用它,可按以下步骤 -- 允许配置高级选项 EXEC sp_configure 'show advanced options', 1 GO -- 重新配置 RECONFIGURE GO -- 启用xp_cmdshell EXEC sp_configure 'xp_cmdshell', 1 GO --重新配置 RECONFIGURE GO --执行想要的xp_cmdshell语句 Exec xp_cmdshell 'query user' GO --用完后,要记得将xp_cmdshell禁用(出于安全考虑) -- 允许配置高级选项 EXEC sp_configure 'show advanced options', 1 GO -- 重新配置 RECONFIGURE GO -- 禁用xp_cmdshell EXEC sp_configure 'xp_cmdshell', 0 GO --重新配置 RECONFIGURE GO

2012-07-11 · 1 min · bystander

各种内存卡介绍

闪存卡(Flash Card)是利用闪存(Flash Memory)技术达到存储电子信息的存储器,一般应用在数码相机,掌上电脑,MP3等小型数码产品中作为存储介质,所以样子小巧,有如一张卡片,所以称之为闪存卡。 根据不同的生产厂商和不同的应用,闪存卡大概有Compact Flash(CF卡)、MultiMediaCard(MMC卡)、Secure Digital(SD卡)、Memory Stick(记忆棒)等。 SD卡 SD卡全称为Secure Digital卡,SD卡标准的面世相对而言比CF要晚,根据MMC为基础所开发的Secure Digital(SD),其改进主要是在增添了版权保护的功能,提高了传输速度和增加了写保护机制等,其主要引脚的定义与MMC卡并没有太大的区别。SD具有较高的兼容性,较小的体积和不错的数据传输速度,成为了当今的时尚数码相机和部分可拍照手机的标准配置。SD接口是当今世界上被采用得最多的闪存卡接口,市面上主流的PDA,数码相机,MP3的闪存卡,烧录卡接口大多为SD卡,也使SD卡取代了CF卡成为了当今最常见得存储卡。如图: MiniSD MiniSD是SD卡的一大改进,体积只有21.5x20x1.4mm,比普通SD卡足足节省了60%的空间,通过转接卡还能保证MiniSD在正常的SD插槽上的使用。如图: Micro SD(TF卡) TF卡又称T-Flash卡,也叫Micro SD卡,体积只有11×15×1mm,面积为MiniSD的一半 MMC卡 MMC卡全称为Multi Media Card,由SanDisk与Siemens AG/InfineonTechnologies AG所联合开发,且于1997年11月发表,Size:24mm x 32mm x 1.4mm,重量2g。MMC卡的兼容性方面不及SD卡的好,数据传输速度受到硬件的限制,不适合作高速的数据传输。如图: RSMMC RSMMC是Reduced-Size MMC的缩写,小型化的MMC卡,传说专门为智能手机设置。改良后的产品叫做MMCmobile 什么是CF卡? CF格式由来已久,被SanDisk公司在1994年首次制造出来。CF卡的全称是Compact Flash,Compact意指“小型的,轻便的”,CF大小为43mm x 36mm x 3.3mm,50 Pins。如图 MS卡 Memory Stick,索尼推出的存储产品。貌似是独树一帜,不多介绍。 参考: http://www.allmemorycards.com/sd.htm http://baike.baidu.com/view/26952.htm http://nds.cngba.com/nds_bd/2007122122100.shtml

2012-06-30 · 1 min · bystander

U盘或硬盘装满资料后,质量会增加吗?

 科普文,以前看到过,今天又想起来了,所以拿来和大家分享,感谢原作者的努力。 U盘或硬盘装满资料后,质量会增加吗? 要回答这个问题,先让我们看看U盘和硬盘的存储原理。 U盘又称为闪存(Flash Memory),其存储介质为flash,简单地说,flash是用浮栅来存储数据的,浮栅就是可以存储电荷的电荷势阱,向flash写入数据的过程就是向这个电荷势阱注入电荷的过程。 至于硬盘,如今使用较多的是固态硬盘,其存储介质多为DRAM,简单来说,DRAM是用电容来存取数据的,电容可以充放电,可以储能,有电荷的时候是"1",无电荷的时候是"0"。 回到开头的问题,通过上面的分析可以发现,U盘或硬盘装满资料前后,改变的是数字讯号记录的内容,也就是说多了许多电子。 电子的质量约为9.10938188E-31 kg,所以说,U盘或硬盘装满资料后,质量是会增加的,只不过增加的量非常的少。 同样,我们可以思考这样的问题,每比特的数据有多重? 众所周知,计算机使用一串串二进制的"1"和"0"表示所有种类的信息———电子邮件、文档、视频、网页,一切的一切。 我们拿普通电脑的存储器来说,其存储机制就是刚刚提到的DRAM,电容充电后代表"1",没充电就代表"0"。比特"0"的数据是没有电子的,也就是没有质量的,而比特"1"的数据是有质量的,虽然轻得微不足道。 具体是多少,需要考虑存储器的电容器,估计的值是每个电容器只需要4万个电子就能充满,4万个电子的质量就是3.6E-26 kg,也就是说,比特"1"的数据质量是3.6E-26 kg。 最后,让我们计算一下全球互联网信息总重量! 要想得出这个结果,我们需要的数据是互联网上流动的信息总量,这可以从克利福德·霍利迪的著作《互联网发展2006》中找到答案:这个总流量就是……大得令人吃惊的40P字节,即4E16字节———4后面跟着16个0。 并不是所有的比特都是"1",要不然网络的内容也太无趣了,平均大约有一半的比特是"1",另一半是"0",也就是有20P的比特"1",套用我们计算的比特"1"数据重量时的公式,于是得到了总数7.2E-9 kg。 在遭罪地写了这么多字之后,我们终于得出了结论:互联网的重量全部加起来大约只有1盎司(1盎司约等于28克)的五百万分之一。 原文:http://www.cnblogs.com/jyaray/archive/2010/12/09/1901610.html

2012-06-22 · 1 min · bystander

windows下vim闪烁问题

 今天打开我的vim才发现,界面隔几秒会闪烁。虽说貌似能够起到防止眼睛疲劳的效果,但我实在是hold不住啊。不行,搜索。。 首先有这个问题的人不多。首先找到了这篇文章,但是作者不知道怎么想的。只说了原因,没有给出解决方法。继续搜索关键字cursorcolumn,结果找到了这篇文章,按着说明来了一下 set cursorline cursorcolumn 没效果。依然闪烁。 好吧。如果是插件的问题。于是我删掉了所有的插件包括写入的配置。依然不行。于是还是采用排除法,一行行删掉配置文件。最后定位到 set guifont=Arial_monospaced_for_SAP:h9:cANSI 这是设置字体的,不太明白为什么会出现这样的情况。怀疑是字体的原因,于是换个字体,依然闪烁。。好吧。就这样吧。删掉算了。

2012-05-07 · 1 min · bystander