Archive for category 软件开发技术

innerHTML属性在chrome浏览器下取不到input value值的解决方案

$(function () {
            if (!$.browser.msie)
                $("input:text").each(function () {
                    var input_id = $(this).attr('id');
                    document.getElementById(input_id).addEventListener("keyup", function () {
                        document.getElementById(input_id).setAttribute("value", document.getElementById(input_id).value);
                    }, false);
                });
        });

要用脚本手动的设属性到input中去,而这个过程在ie下是自动完成的,chrome却不是。

input type=file accept中可以限制的文件类型

在上传文件的时候,需要限制指定的文件类型,accept这个属性,只在FF和chrome中有效。那么accept能限制哪些文件呢?见下表。

扩展名 MIME 描述
*.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video
*.ac3 audio/ac3 AC3 Audio
*.asf allpication/vnd.ms-asf Advanced Streaming Format
*.au audio/basic AU Audio
*.css text/css Cascading Style Sheets
*.csv text/csv Comma Separated Values
*.doc application/msword MS Word Document
*.dot application/msword MS Word Template
*.dtd application/xml-dtd Document Type Definition
*.dwg image/vnd.dwg AutoCAD Drawing Database
*.dxf image/vnd.dxf AutoCAD Drawing Interchange Format
*.gif image/gif Graphic Interchange Format
*.htm text/html HyperText Markup Language
*.html text/html HyperText Markup Language
*.jp2 image/jp2 JPEG-2000
*.jpe image/jpeg JPEG
*.jpeg image/jpeg JPEG
*.jpg image/jpeg JPEG
*.js text/javascript, application/javascript JavaScript
*.json application/json JavaScript Object Notation
*.mp2 audio/mpeg, video/mpeg MPEG Audio/Video Stream, Layer II
*.mp3 audio/mpeg MPEG Audio Stream, Layer III
*.mp4 audio/mp4, video/mp4 MPEG-4 Audio/Video
*.mpeg video/mpeg MPEG Video Stream, Layer II
*.mpg video/mpeg MPEG Video Stream, Layer II
*.mpp application/vnd.ms-project MS Project Project
*.ogg application/ogg, audio/ogg Ogg Vorbis
*.pdf application/pdf Portable Document Format
*.png image/png Portable Network Graphics
*.pot application/vnd.ms-powerpoint MS PowerPoint Template
*.pps application/vnd.ms-powerpoint MS PowerPoint Slideshow
*.ppt application/vnd.ms-powerpoint MS PowerPoint Presentation
*.rtf application/rtf, text/rtf Rich Text Format
*.svf image/vnd.svf Simple Vector Format
*.tif image/tiff Tagged Image Format File
*.tiff image/tiff Tagged Image Format File
*.txt text/plain Plain Text
*.wdb application/vnd.ms-works MS Works Database
*.wps application/vnd.ms-works Works Text Document
*.xhtml application/xhtml+xml Extensible HyperText Markup Language
*.xlc application/vnd.ms-excel MS Excel Chart
*.xlm application/vnd.ms-excel MS Excel Macro
*.xls application/vnd.ms-excel MS Excel Spreadsheet
*.xlt application/vnd.ms-excel MS Excel Template
*.xlw application/vnd.ms-excel MS Excel Workspace
*.xml text/xml, application/xml Extensible Markup Language
*.zip aplication/zip Compressed Archive

【转】暗时间

暗时间

asp.net checkbox always false

今天碰到了一个非常小的问题,checkbox选中之后,提交到服务器端之后,仍然为false。真是找遍了各种解决方法。类似ispostback等等,我这个问题有些怪的,原来是好的,但不知道为什么不行了。

最后,把 CssClass去掉了,就好了。三个小时时间就这样过去了。哎

c#调用带soapHeader的java webservice

服务器端的WebService类,同时也是客户端类(因为有main方法以及测试的代码)

package webservice;

import javax.xml.namespace.QName;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPElement;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.SOAPHeader;
import org.apache.axis.message.SOAPHeaderElement;

public class Power
{
	public static String GetMessage()
	{
		return "调用成功!";
	}
	public static void main(String... a) throws Exception
	{
		String endpoint = "http://localhost:9000/hg/services/Power";
		SOAPHeaderElement headerElement = new SOAPHeaderElement("http://schemas.xmlsoap.org/soap/envelope/", "sessionInfo");
		headerElement.setMustUnderstand(false);
		headerElement.addNamespaceDeclaration("soap", "http://schemas.xmlsoap.org/soap/envelope/");
		SOAPElement sid = headerElement.addChildElement("sessionId");
		sid.addTextNode("1234567890ABCDEF1234567890ABCDEF");
		Service service = new Service();
		Call call = (Call) service.createCall();
		call.setTargetEndpointAddress(new java.net.URL(endpoint));
		call.setOperationName(new QName("GetMessage", "GetMessage"));
		// call.addParameter(new QName("http://cn.zuoguodang.service", "name"),
		// org.apache.axis.encoding.XMLType.XSD_STRING, ParameterMode.IN);
		call.setReturnType(XMLType.SOAP_STRING);
		// 设定 Header
		call.addHeader(headerElement);
		System.out.println(call.invoke(new Object[] {}));
	}
}

服务器端的SoapHeader类

package webservice;

import java.util.Iterator;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;

import org.apache.axis.AxisFault;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.message.MessageElement;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.message.SOAPHeaderElement;

public class Soapheader extends org.apache.axis.handlers.BasicHandler
{
	private String sessionId;

	@Override
	public void invoke(MessageContext msgContext) throws AxisFault
	{
		boolean processedHeader = false;
		String headerName = null;
		try
		{
			// 取得 Request 的 SOAP 信息
			Message msg = msgContext.getRequestMessage();
			SOAPEnvelope envelope = msg.getSOAPEnvelope();
			SOAPHeader header = envelope.getHeader();
			Iterator it = header.examineAllHeaderElements();
			SOAPHeaderElement hel;
			while (it.hasNext())
			{
				hel = (SOAPHeaderElement) it.next();
				headerName = hel.getNodeName();
				if (headerName.equals("sessionInfo"))
				{
					// 对于 mustUnderstand 设为 true 的 Header,必须
					// 利用下列的方式把它设为"已经处理",否则 service
					// 会回传 Did not understand "MustUnderstand"
					hel.setProcessed(true);
					checkUser(hel);
					processedHeader = true;
				}
			}
		}
		catch (SOAPException e)
		{
			throw new AxisFault("无法处理 SOAP Header.", e);
		}
		if (!processedHeader) { throw new AxisFault("接收 SOAP Header 失败"+headerName); }
	}
	private void checkUser(SOAPHeaderElement hel) throws AxisFault
	{
		MessageElement fele = hel.getChildElement(new QName("", "sessionId"));
		if (fele == null) { throw new AxisFault("找不到 sessionId 标签."); }
		sessionId = fele.getValue();
		if (!"12345".equals(sessionId)) { throw new AxisFault("认证失败"); }
	}
}

因为是使用axis2 webservice,所以要修改server-config.wsdd,增加SoapHeader作为handler,放在根节点下面

<handler name="Authenticate" type="java:webservice.Soapheader" />

并在globalConfiguration/requestFlow下面再增加节点:

<handler type="Authenticate"/>

c# 来调用这个服务的话,先生成代理类,然后在生成的代理类里面增加一个属性:

public CredentialSoapHeader SoapHeaderValue;

然后在需要调用的webserice方法上加注释:

[System.Web.Services.Protocols.SoapHeaderAttribute("SoapHeaderValue")]

CredentialSoapHeader类代码如下:

    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "")]
    [System.Xml.Serialization.XmlRootAttribute("sessionInfo", Namespace = "", IsNullable = false)]
    public class CredentialSoapHeader : System.Web.Services.Protocols.SoapHeader
    {
        public string sessionId;
    }

调用webservice并使用soapheader的代码如下:

            PowerService sps = new PowerService();
            CredentialSoapHeader cs = new CredentialSoapHeader();
            cs.sessionId = "12345";
            sps.SoapHeaderValue = cs;
            Response.Write(sps.GetMessage());

VBA:批量保存visio中的页为图片

在做好VISIO后,需要另存为JPEG格式,如果一页一页的导,很麻烦,用VBA实现是最快的,另存为的JPEG文件名称为页名称。

Sub AutoSave2JPG()

Dim fileName
Set reg = CreateObject("vbscript.regexp")
reg.Pattern = "\/|\\|:|\*|\?|\""|<|>|\|"
For i = 1 To Application.ActiveDocument.Pages.Count Step 1
    fileName = Application.ActiveDocument.Pages(i).Name
    fileName = reg.Replace(fileName, "")
    fileName = Application.ActiveDocument.Path & "\" & fileName & ".jpg"
    Application.ActiveDocument.Pages(i).Export fileName
    On Error Resume Next
Next
End Sub

VS 2010 写入项目文件时出错 没有注册类别

重新安装:msxml6.msi,

下载地址:http://download.microsoft.com/download/b/7/1/b71d5305-618d-4b82-858b-386db3cc4453/msxml6.msi

NHibernate:object references an unsaved transient instance – save the transient instance before flushing

使用NHibernate时,多表级联更新时遇到这个错误:object references an unsaved transient instance – save the transient instance before flushing

解决方法:在<set>中,加入及联更新  cascade=”all”

VB程度调用WebService报错WSDLReader:Loading of the WSDL file failed HRESULT=0×80040154: 没有注册类别

我是使用InstallShield 12打包VB程序,并且将soapsdk.msi一起打包,使用/passive模式安装。在有些机器上使用是没有问题的,但今天遇到了一台XP机器,出错的代码如下:

WSDLReader:Loading of the WSDL file failed HRESULT=0x80040154: 没有注册类别
 - Client:An unanticipated error occurred during the processing of this request. HRESULT=0x80040154: 没有注册类别

很奇怪,windows2003的机器都没有问题,我想可能是许多XP系统都是精简了的,少了一些内容。后来在网上找了一下,果然如此。见VB之WebService客户端打包经历(初次理解msm) 。解决的方法是下载MSXML4.0 SP2,安装就好了。

在InstallShield 12中,进入Installation Designer–Application Data–Redistributables—选中msxml4.0。再打包就OK了。

2011年4月24日参加杭州思步科技组织的项目管理沙龙

在上周的时候就听说杭州思步科技要组织项目管理类的沙龙,我得到消息后就报名参加了,参加的目的有两个:1、学到知识和方法,回去用工作上,以道御术干事业;2、交到圈子里面的朋友,方便以后大家一起交流,有了第一面的认识了以后,许多事情就方便了。

全天的沙龙有两个课题,可以看这里:《2011焦点追击:项目管理-敏捷-CMMI沙龙活动【杭州站】》

一天下来,收获颇丰,尤其上午。课程很充实,也需要有很强的基础,毕竟是将几天的课程进行压缩了以后放到半天来讲的,所以讲师也只能在很多地方都点到为止。上午的题目是《集成产品开发(IPD)与研发项目管理应用》。针对这个题目,我做了很多的笔记,现整理到博客上来,一是方便自己随时查阅,以防笔记丢失;二是希望其他同行也能从中受益,最主要的还是整理自己的思路。

在讲到项目成功的因素时,我印象最深的是以下几点:

  • 项目的目标、范围是否明确
  • 是否建立了有序的、有效的、良好的沟通渠道
  • 是否建立了良好的、积极的、团队合的工作氛围

当然,附近以上几点之外,还有一些有关组织是否健全和稳定、领导是否积极支持、是否具有有效的全面的项目管理和严格的变更控制等这些内容,我倒是认为是其次的。

在谈到项目失败的主要因素时,以下几点讲的也非常好:

  • 跨部门协作不得力
  • 责、权、利不清
  • 资源配备、供给欠佳
  • 缺乏有交的沟通
  • 计划和控制不力

项目能够成功的原因很多,但是项目失败,跑不出讲义里面提到的这些原因,而以上我例举的的几点,是从我的角度来看,破坏力相比其它点会更加猛烈些。在IPD整理框架下,要有效的利用现有的平台,并且把员工的日常工作模式化。这两点,无论是不是IPD,我感觉都非常重要。如果利用现有的、原来的基础框架、组件以及平台,是每个公司都要去解决的问题,这里面的核心其实就是复用和重用,但层次不同,这里面要求的是平台级别的重用,而一般的程序人员都是代码级别的copy,只是方法或者函数级别的复用,距离平台级别相去甚远。把员工的日常工作模式化、固化,这个不用再解释了,因为一个人总是做各种各样的事情效率一定比一直做同一件事情低很多。

在新的项目组成立,或者启动了新的研发项目时,除了明确项目目标、明确沟通方式、明确项目团队成员职责等之外,就是要进行认命,通过任命书的方式,将责任落实到项目组的各组员头上。

项目启动了之后,就要做项目计划。做计划最重要的几个方面是:有明确的目标和范围,加强计划意识,项目成员要充分参与制定,提出建设性意见,由上往下制订与由下往上修改相结合,加强工期/工作量估计的经验积累,做好与其它相关部门计划的衔接等。那判断一个项目的目标是否明确的标准是:

  • 明确性:最终目标是否明确了应该做出=到哪一步以及何时完成
  • 可度量性:能在多大程度上测量最终目标的完成情况
  • 可完成性:在规定的时间内,最终目标是否合理,能否实现
  • 相关性:最终目标是否很重要、很有价值、是否值得进行下去
  • 可跟踪性:能够对整个项目的时间进程进行跟踪检查吗

一个完整的计划包括:任务名称及层次、资源、成本、时间进度、完成标志、上层任务的约束、下层任务的配合、阶段里程碑,其中阶段里程碑被称之为项目的心跳,既然叫心跳,就不能心率失常。那么正常的心率也就是正常的里程碑点,比如需求、设计、开发、测试等在整个项目周期所占的比重,在国际上或者国内都有专门的机构在进行统计,国外的是ISBSG,国内的是CSBSG,又叫做:中国软件过程基准用户组,只不过里面的数据是要收费的。

在制定计划时,要考虑制定计划的要素,包括:

  • 完整性
  1. 是否包含了版本及所有特性的计划
  2. 是否全流程的计划(硬件、软件、测试、市场技术、生产率)
  3. 是否产品卖得出去的计划(资料、宣传、操作指南等)
  • 层次性
  1. 是否根据产品的特点进行了分层
  2. 每项活动是否分解到个人,且时间不超过一周
  3. 各层次之间配合关系是否明确
  4. 特性是否相关
  • 合理性
  1. 计划的过渡是否符合市场需求
  2. 技术难度及解决情况是否支撑
  3. 资源需求是否合理
  4. 资源需求是否可保证
  5. 各阶段、步骤、任务的时间安排是否合理
  6. 关键物料的货期是否符合计划
  7. 是否符合流程
  8. 是否设置了关键路径和里程碑
  9. 每个活动是否有结束的标志

在计划制定好之后,就到了WBS:工作任务分解。WBS的原理是:将任务逐级分解直至个人,在矩阵中体现为:先确定横向有多少个结点,再将每一个结点任务逐渐细化直到个人,工作分解图实际上就是就一个复杂的开发系统分层逐步细化为一个个独立的我们能够预测、计划、和控制的单元,这样可以使我们将复杂、庞大的、不知如何下手的大系统划分成为了一个个独立的我们能预测、计划和控制的单元,从而也就达到了对整个系统进行控制的目的。WBS的分配原则是:将主体目标逐步细化分解,最底层的任务活动可直接分派到个人去完成,通俗点讲就是分解到可估算的程度就好了。WBS分解的方法:自上而下与自下而上的充分沟通、一对一个别交流、小组讨论。WBS的分解标准:分解后的活动结构清晰\逻辑上形成一个大的活动\集成了所有的关键因素\包含临时的里程碑和监控点\所有活动全部定义清楚。

在估算这一节中,我学习到了快速功能点估计法:Fp=ILF*35+EIF*15。举个例子:要做一个OA系统中的领导日程安排模块,首先是要找到内部逻辑文件(ILF),有:使用用户(领导、管理员等)、日周月日与用户权限三个,3*35=105;外部逻辑文件(ELF)主要是日程的短信提醒,1×15,这样加进来的话就是105+15=120,那么再乘个系数3.95人/工作时,最终就得出120*3.95=474人/工作时,如果每天按8个小时计算,即需要59人/天,如果每月20000元费用,那么开发费用约为59/22*20000=53636元。这样的话,领导日程安排这个功能就估计出来了,至于为什么系数是3.95,我还要去问问讲师。

有一句话我是感受深刻,并完全赞同。要加速项目的进度,就要:向关键路径(工作)要时间,向非关键路径(工作)要资源。

计划做好了,任务也分解掉了,接下来就是计划控制了,那计划不是一个人做出来的,应该是集体讨论的成果,这样在分解任务到人的时候,不至于任务接受人有很大的抵触。项目的计划分为三级:一级是里程碑计划;二级是阶段计划;三级是日计划和周计划。在计划控制的时候,顺序也是一级二级三级这样。需要关注重点,关注心跳。毕竟到了三级这种日计划,一定会有偏差的。控制计划的手段主要有:项目报告和项目会议。报告一般都是常见的本周做了什么,下周要做什么,遇到了什么问题,怎么解决的,诸如此类。今天讲师讲到了摩托罗拉是用六张图来进行监控:进度偏差图、质量数据图等反映一些趋势的,而不是反映状态的。会议就比较常见了,包括各种例会、说明会、评审会等等,会议的目的是为了控制计划,而不能为了会议而开会。除此之外呢,还要与员工保持充分的信息沟通,做好风险评估和应对措施,及早发现问题、解决问题,加强问题与风险的经验教训总结。员工时间汇报项目问题发生状态是跟踪计划的比较好的手段。

当计划出现了偏差,就要有变更,这个变更也要控制,不能随意。变更的控制要从计划抓起,计划做好之后,就要相关责任人签字,并讲明各种情况的处理方式。处理偏差也分两种,正规和非正规。正规的是申请加班、申请资源。非正规的就是看项目经理或者负责人各显神通了。

项目控制的五个步骤:

  1. 及时掌握最新情况和项目进展
  2. 分析计划进度和质量产生偏差的原因
  3. 处理偏差
  4. 公布修改方案及滚动的计划
  5. 周知管理部门

项目还要采用一些自动化的构建、测试、集成的工具,如TFS等。

记的就这些,也不知道自己真正掌握了多少,还是要用到实处才行!写句诗勉励下自己吧:纸上得来终觉浅 绝知此事要躬行

pagepeel by webpicasso.de