如何才能成为软件界的能工巧匠

软件工艺宣言是这样说的:

作为有追求的软件工匠,我们正在通过实践不断地提升专业软件开发水平,并帮助其他人学习这门工艺。在工作过程中我们总结了以下的价值观:

不仅要让软件工作,更要精益求精。

不仅可以响应变化,更要稳步增加价值。

不仅要有个体与交互,更要形成专业人员的社区。

不仅要与客户合作,更要建立卓有成效的伙伴关系。

也就是说,左项固然值得追求,右项同样不可或缺。

Chris ODell在博客上发表了一篇名为the codesmith(代码匠)的文章,分享了他对工匠定义的看法:

“按照我的理解,工匠不仅仅是拿选定的材料从无到有地创造出一些什么东西,而是通常会把属于他们自己的一些什么东西融入进去。一名好的工匠会花时间和精力去做些优秀的东西,它们值得我们这样去做,在精心打造出来产品之后有些方法仍然可以传承下去。优良的工艺就是高质量产品的代名词。”

仿照金匠和铁匠,Chris杜撰了一个名词叫作代码匠,他说“这代表工艺达到了一定的水准,代表着从学徒走向大师之旅中的一种进展。”他后续又在博客中发表了一篇名为任何人都可以成为代码匠的文章,他说明了代码匠可以如何自我提升以成为代码巨匠:

“成为代码匠的门槛应该要低一些。这也就是为什么我说无论以什么形式写代码的人都可以称之为代码匠的原因。我们应该追求工艺的理想,并具有适度的实用主义,花时间去学习技能并且进行实操练习以成为好的编码者。”

今年早些时候,关于敏捷技术实践的重要性,参与工艺运动的几个人强调了技术实践的重要性:

Matt Badgley:“我们需要重申敏捷工程良好实践的重要性,并且拥抱工艺的理念——没有这个,就不可能实现敏捷。”

Robert Martin:“如果你们不使用极限编程的13个初中,那么你们最好使用一些别的好实践甚至是更好的实践。你们使用的实践定义了你们的文化,表现了你们的价值。”

Ruud Wijnands:“很多公司应用敏捷时采用了所有有价值的、已实现的技术实践,我看到了他们在这一方面取得的成功。不这么做的公司很少有成功的。”

程序员如何开发他们的技能以成为一个软件工匠呢? John Sonmez 写了一篇名为为什么我不使用编码招式的博客,在这篇文章中,他说程序员重复做同样的事情无法提升他们的技能。你要去学些什么,水平必须要持续地提升:

反复不断地重复写代码去解决同样的编程问题,这就是在做完全相同的事,除非新的约束和变化给你带来了新的挑战,你只能从第一次的经验中有所收获,而从第二次开始基本就是简单地重复了。

(……)如果你想要做得更优秀,重复实践是远远不够的。你必须在实践中增加更多的难度和挑战。

按照John的说法,实操是提升技能的好方法。程序员必须去写程序才能成为软件工匠:

我收到了很多邮件,他们咨询我学习编程的最佳方式是什么,或者如何提升他们的技能。最近,我收到很多邮件询问我如何学习安卓开发。你知道我是如何回复这些好奇的心灵的吗?

去做安卓应用。

但是,嗯,我应该去看什么书呢?

不需要看什么书,只需要迸发一个想法然后去尝试实现它。一步步实践,解决过程中遇到的问题。当你卡壳时,就去找找答案或者寻求帮助。

Steve Ropa写了一篇关于培养软件工匠的文章。大学传授了软件开发的理论。为成为程序员工匠需要增加“现实世界的经验和知识的应用实践”,Steve说。学徒工计划能够为此做出准备:

我的建议是让时间倒流,我们穿越回一百年前,把你们的工作间变成一个车间。我们需要把工匠安置到车间中。开始的时候我们可是没有这么多工匠,所以我们需要培训和锻炼他们。应用学徒工计划并且使用针对未来职业生涯的工匠模型就可以做到这一点。

如何从软件开发学徒成为工匠呢,Steve在他的博客中谈了五个方面:

1.代码工艺——使用一个或多个程序设计语言的艺术去创建清晰的、构造良好的代码。(……)

2.实用的原则——(……)一个学徒需要理解类似于SOLID这样的原则,并且知道如何去应用它们。

3.技术和工具——虽然程序员需要有能力去实践像手工重构这样的做法,但是他们也需要了解如何使用专门的工具,如何针对特定的任务去选择适当的工具。

4.工作习惯——(……)我们需要围绕某些活动培养肌肉记忆,比如TDD、持续集成等等。软技能——(……)软件学徒需要学习如何在团队中开展工作,如何与其他人进行交流,以及一些其他的软技能。

5.在传统学习环境中这些软技能渐渐地都被忽略掉了。

英文原文:Becoming Software Craftsmen

发表在 生活随笔 | 标签为 , | 留下评论

如何在WinForm中实现md5密码的加密

最近在做一个C#小程序时用到了MD5加密,发现WinForm中没有现在的方法?
后来在微软官方网站上找到了相应的方法,现收藏一下。希望能帮到有同样需求的你。

兼容版本信息

.NET Framework
受以下版本支持:2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0

示例

下面的代码示例计算字符串的 MD5 哈希值,并将该哈希作为 32 字符的十六进制格式字符串返回。此代码示例中创建的哈希字符串与能创建 32 字符的十六进制格式哈希字符串的任何 MD5 哈希函数(在任何平台上)兼容。

发表在 CS架构后台语言 | 标签为 , , , , | 留下评论

php日期加减处理函数

<?php
echo “今天:”,date(‘Y-m-d H:i:s’),”<br>”;
echo “明天:”,date(‘Y-m-d H:i:s’,strtotime(‘+1 day’));
?>
上一行输出当前时间,下一行输出明天时间

这里+1 day
可以修改参数1为任何想需要的数  day也可以改成year(年),month(月),hour(小时),minute(分),second(秒)

date(‘Y-m-d H:i:s’,strtotime(“+1 day +1 hour +1 minute”);
可以随便自由组合,以达到任意输出时间的目的
注:该方法之针对1970年以后试用,也就是时间戳的适用范围。

php 常用日期相函数[日期加减,两日期之差,日期转换时间截]

下面这些代码是一些常用的日期处理函数了,可以两个时间的日期加减,两日期之差,日期转换时间截等。

echo date(‘Y-m-d’,strtotime(‘+1 d’,strtotime(‘2009-07-08’)));//日期天数相加函数

echo date(“Y-m-d”,’1246982400′);
echo ‘<br>’;
echo date(“Y-m-d”,’1279123200′);
die();

$d   =   “2009-07-08 10:19:00”;
echo   date(“Y-m-d”,strtotime(“$d   +1   day”));   //日期天数相加函数

function dateToTime($d)//把日期转换成时间堆截
{
$year=((int)substr(“$d”,0,4));//取得年份

$month=((int)substr(“$d”,5,2));//取得月份

$day=((int)substr(“$d”,8,2));//取得几号

return mktime(0,0,0,$month,$day,$year);
}

/*

下面函数计算两日期之差

*/

$Date_1=”2009-07-08″;

echo $Date_1+1;

$Date_2=”2009-06-08″;
$Date_List_a1=explode(“-“,$Date_1);

$Date_List_a2=explode(“-“,$Date_2);

$d1=mktime(0,0,0,$Date_List_a1[1],$Date_List_a1[2],$Date_List_a1[0]);

$d2=mktime(0,0,0,$Date_List_a2[1],$Date_List_a2[2],$Date_List_a2[0]);

$Days=round(($d1-$d2)/3600/24);

echo “两日期之前相差有$Days 天”;

发表在 BS架构后台语言 | 标签为 , , | 留下评论

如何获得winform程序集信息内容

最近,做了几个winform小程序,需要获得winform程序集信息内容。

以下为主要代码

获取标题

获取版本号

获取描述内容

获取产品

获取版权信息

获取公司

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发表在 应用工具软件 | 标签为 , , | 留下评论

nginx配置关闭chunked

Transfer-Encoding:chunked简介

通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输。chunked编码是HTTP/1.1 RFC里定义的一种编码方式。

chunked编码的基本方法是将大块数据分解成多块小数据,每块都可以自指定长度。Transfer-Encoding:chunked能更快的让页面呈现出来,因为它能分段下载,浏览器分段解析,例如facebook利用这个特性实现的big pipe。

在Http 1.0及之前版本中,content-length字段可有可无。在http1.1及之后版本。如果是keep alive,则content-length和chunk必然是二选一。若是非keep alive,则和http1.0一样,content-length可有可无。注:Http1.1之前的不支持keep alive。

nginx配置关闭chunked模式

在nginx 0.7.66版本之后,有一个配置项chunked_transfer_encoding可以开启或者关闭chunk模式,默认是开启的。

chunked_transfer_encoding on | off;

例如:chunked_transfer_encoding off;

作用域: http, server, location

发表在 BS架构后台语言 | 标签为 , | 一条评论

HTML5 Audio/Video 标签,属性,方法,事件汇总

src:音乐的URL
preload:预加载
autoplay:自动播放
loop:循环播放
controls:浏览器自带的控制条

Html代码

src:视频的URL
poster:视频封面,没有播放时显示的图片
preload:预加载
autoplay:自动播放
loop:循环播放
controls:浏览器自带的控制条
width:视频宽度
height:视频高度

Html代码

获取HTMLVideoElement和HTMLAudioElement对象

Js代码

//audio可以直接通过new创建对象
Media = new Audio(“http://www.abc.com/test.mp3″);
//audio和video都可以通过标签获取对象
Media = document.getElementById(“media”);

Media方法和属性:

HTMLVideoElement 和 HTMLAudioElement 均继承自 HTMLMediaElement

Js代码

//错误状态
Media.error; //null:正常
Media.error.code; //1.用户终止 2.网络错误 3.解码错误 4.URL无效

//网络状态
Media.currentSrc; //返回当前资源的URL
Media.src = value; //返回或设置当前资源的URL
Media.canPlayType(type); //是否能播放某种格式的资源
Media.networkState; //0.此元素未初始化 1.正常但没有使用网络 2.正在下载数据 3.没有找到资源
Media.load(); //重新加载src指定的资源
Media.buffered; //返回已缓冲区域,TimeRanges
Media.preload; //none:不预载 metadata:预载资源信息 auto:

//准备状态
Media.readyState; //1:HAVE_NOTHING 2:HAVE_METADATA 3.HAVE_CURRENT_DATA 4.HAVE_FUTURE_DATA 5.HAVE_ENOUGH_DATA
Media.seeking; //是否正在seeking

//回放状态
Media.currentTime = value; //当前播放的位置,赋值可改变位置
Media.startTime; //一般为0,如果为流媒体或者不从0开始的资源,则不为0
Media.duration; //当前资源长度 流返回无限
Media.paused; //是否暂停
Media.defaultPlaybackRate = value;//默认的回放速度,可以设置
Media.playbackRate = value;//当前播放速度,设置后马上改变
Media.played; //返回已经播放的区域,TimeRanges,关于此对象见下文
Media.seekable; //返回可以seek的区域 TimeRanges
Media.ended; //是否结束
Media.autoPlay; //是否自动播放
Media.loop; //是否循环播放
Media.play(); //播放
Media.pause(); //暂停

//控制
Media.controls;//是否有默认控制条
Media.volume = value; //音量
Media.muted = value; //静音

//TimeRanges(区域)对象
TimeRanges.length; //区域段数
TimeRanges.start(index) //第index段区域的开始位置
TimeRanges.end(index) //第index段区域的结束位置

事件:

Js代码

eventTester = function(e){
Media.addEventListener(e,function(){
console.log((new Date()).getTime(),e);
});
}

eventTester(“loadstart”); //客户端开始请求数据
eventTester(“progress”); //客户端正在请求数据
eventTester(“suspend”); //延迟下载
eventTester(“abort”); //客户端主动终止下载(不是因为错误引起),
eventTester(“error”); //请求数据时遇到错误
eventTester(“stalled”); //网速失速
eventTester(“play”); //play()和autoplay开始播放时触发
eventTester(“pause”); //pause()触发
eventTester(“loadedmetadata”); //成功获取资源长度
eventTester(“loadeddata”); //
eventTester(“waiting”); //等待数据,并非错误
eventTester(“playing”); //开始回放
eventTester(“canplay”); //可以播放,但中途可能因为加载而暂停
eventTester(“canplaythrough”); //可以播放,歌曲全部加载完毕
eventTester(“seeking”); //寻找中
eventTester(“seeked”); //寻找完毕
eventTester(“timeupdate”); //播放时间改变
eventTester(“ended”); //播放结束
eventTester(“ratechange”); //播放速率改变
eventTester(“durationchange”); //资源长度改变
eventTester(“volumechange”); //音量改变

发表在 Web前台开发技术 | 标签为 , , | 留下评论

php脚本超时时间设置

设置PHP脚本执行超时的时间有下面这样一些方法:
php.ini 中缺省的最长执行时间是 30 秒,这是由 php.ini 中的 max_execution_time 变量指定,倘若你有一个需要颇多时间才能完成的工作,例如要发送很多电子邮件给大量收件者,或者要进行繁重的数据分析工作,服务器会在 30 秒后强行中止正在执行的程序,如何解决这个问题呢。

一、在php.ini里面设置 max_execution_time = 1800;

二、通过PHP的ini_set 函数设置 ini_set(“max_execution_time”, “1800”);

三、通过set_time_limit 函数设置 set_time_limit(1800) ;

发表在 BS架构后台语言 | 标签为 , | 留下评论

Windows+nginx配置flv,mp4视频流任意拖动

nginx官网地址(最新下载地址):http://nginx.org/en/download.html
下载nginx/Windows版本,本文发布时最新版本是:nginx/Windows-1.3.11

下载解压后,把所有文件放到你的任意盘的任意地方
如果你之前安装过iis,那么只需要把iis里的网站关掉就可以了(当然也可以直接删除IIS),如果不关掉的话就要注意配置nginx的时候的使用端口不能和iis的冲突,为了方便说明,请关掉iis

下面配置nginx
找到conf/nginx.conf文件(找不到说明你没开显示文件后缀名的功能),用记事本打开
在server段,不知道server段在哪?那就找

Windows+nginx配置flv,mp4视频流任意拖动
这样服务器就支持flv,mp4的实时拖动了

发表在 操作系统相关 | 标签为 , , | 留下评论

让windows下的svn限制强制写日志以及只能修改自己日志脚本

1、svn客户端修改日志功能(且只能修改自己日志)
找到版本库中hooks目录下,将pre-revprop-change.tmpl文件复制为pre-revprop-change.bat文件,然后将pre-revprop-change.bat文件内容改为:

2、到版本库中hooks目录下,将pre-commit.tmpl文件复制为pre-commit.bat文件,然后将pre-commit.bat 文件内容改为:

发表在 应用工具软件 | 标签为 , | 留下评论

MySql表存储引擎转换的方法总结

注意:存储引擎修改之后,原始存储引擎的专有特性都会丢失。
例如,如果将一个InnoDB转换成MyISAM存储引擎,再转回来,那么最初在原InnoDB定义的外键都会丢失。

方法-1、ALTER TABLE

把表从一种存储引擎换成另一种存储引擎最简单的方法就是ALTER TABLE命令。

特点:
a、适合所有存储引擎。
b、转换过程会耗费大量时间。
c、转换时候源表会被读加锁。

方法-2、转储(Dump)和导入(Import)

使用mysqldump工具导出数据表,修改转储文件的CREATE TALBE 语句。

修改点:
a、删除转储文件里的DROP TALBE语句,防止数据转储失败时,源数据也丢失。

b、修改表名,数据库绝对不允许相同的表名出现,即使存储引擎不同。

c、修改存储引擎。

方法-3、CREATE和SELECT
在方法-1的速度和方法-2的安全性之间做了一个平衡。先创建一张表,然后用mysql的INSERT….SELECT语句来转移数据。

发表在 数据库相关技术 | 标签为 , , , | 留下评论