解决JQuery.trim()函数ie下报错的问题

解决JQuery.trim()函数ie下报错的问题 经常碰到JQuery里的trim()函数在firefox支持,但是在IE里不支持 其主要原因是写法不对,下面是错误的写法 Java代码 <img alt="收藏代码" src="http://vsp.iteye.com/images/icon_star.png" /> var content = $('#content').val(); if(content.trim() == ") alert('空'); 上面的写法在firefox下不会报错,但在ie下确会报错 正确的写法应该为 Java代码 <img alt="收藏代码" src="http://vsp.iteye.com/images/icon_star.png" /> var content = $('#content').val(); if($.trim(content) == ") alert('空'); 或者为: Java代码 <img alt="收藏代码" src="http://vsp.iteye.com/images/icon_star.png" /> var content = $('#content').val(); if(jQuery.trim(content) == ") alert('空'); http://vsp.iteye.com/blog/1262441

2013-08-10 · 1 min · 46 words · -

正常体温

正常体温 正常体温不是一个具体的温度点,而是一个温度范围。机体深部的体温较为恒定和均匀,称深部体温;而体表的温度受多种因素影响,变化和差异较大,称表层温度。临床上所指的体温是指平均深部温度。一般以口腔、直肠和腋窝的体温为代表,其中直肠体温最接近深部体温。正常值: 口腔舌下温度为37℃ (范围36.2-37.2℃) ,直肠温度37.5℃ (比口腔温度高 (0.3-0.5℃) 。 人体内部的温度称体温。保持恒定的体温,是保证新陈代谢和生命活动正常进行的必要条件。体温是物质代谢的产物。三大营养物质在氧 人体正常体温范围 示意图 化过程中释放的能量,其中50%左右的能量变为体热以维持体温,并以热能的形式不断散发于体外;另有45%的能量转移到三磷酸腺苷 (ATP) 的高能磷酸键中,供机体利用。机体利用的最终结果仍转化为热能散出体外。这就是产生体温的由来。 正常人的体温相对恒定的,它通过大脑和丘脑下部的体温调节中枢调节和神经体液的作用,使产热和散热保持动态平衡。在正常生理状态下,体温升高时,机体通过减少产热和增加散热来维持体温相对恒定;反之,当体温下降时,则产热增加而散热减少,使体温仍维持在正常水平。 每日早晚、人体各个部位及男女之间的体温均存在着差异。人体正常体温有一个较稳定的范围,但并不是恒定不变的。正常人口腔温度(又称口温)为36.2℃~37.2℃,腋窝温度较口腔温度低0.2℃~0.5℃,直肠温度(也称肛温)较口腔温度高0.2℃~0.6℃。一天之中,清晨2~5时体温最低,下午5~7时最高,但一天之内温差应小于0.8℃。另外,女子体温一般较男子高0.35℃左右。女子体温在经期亦有些许变化。 在健康状态时,如饮食正常,衣着适宜,人体的体温一般是比较恒定的,即保持在37℃上下(大致介于36.2℃~37.2℃),而不因外界环境温度的改变而变化。人体正常体温平均在36~37℃之间 (腋窝) ,超出这个范围就是发热,38℃以下是低热,39℃以上是高热。[1] 测量体温一般常用3个部位,即口腔、腋窝及肛门: 儿童正常体温在肛门处为36.5℃~37.5℃之间; 儿童在口腔处为36.2℃~37.3℃之间; 儿童在腋窝处为35.9℃~37.2℃之间。 通过测量后,儿童凡超过正常范围0.5℃以上时,称为发热。不超过38℃称为低热,超过39℃者为高热。

2013-08-09 · 1 min · 24 words · -

Somebody and I

Somebody and I “I and someone are interested” is grammatically correct. It is the convention in English that when you list several people including yourself, you put yourself last, so you really should say “Someone and I are interested.” “Someone and I” is the subject of the sentence, so you should use the subjective case “I” rather than the objective “me”. “Someone and I” clearly means two people, so you should use “are” and not “is”. If it was “Someone or I …” then you would use “is”, because only one person is interested, either “someone” or “I”. ...

2013-08-09 · 2 min · 335 words · -

How to,List Current Keyboard Shortcuts

‘How to,List Current Keyboard Shortcuts’ Use this procedure to create a macro that generates a list of all the commands in the integrated development environment (IDE) and any shortcut keys mapped to those commands according to the current keyboard mapping scheme. Several keyboard mapping schemes are available in the IDE. You can change keyboard mapping schemes on the Keyboard page, under the Environment folder of theOptions dialog box. For more information, see How to: Work with Keyboard Shortcuts. <th> <img id="alert_note" title="Note" alt="Note" src="http://i.msdn.microsoft.com/areas/global/content/clear.gif" />Note </th> The dialog boxes and menu commands you see might differ from those described in Help depending on your active settings or edition. To change your settings, clickImport and Export Settings on the Tools menu. For more information, see Working with Settings. To list current keyboard shortcut mappings On the Tools menu, point to Macros, and then click Macros IDE. In Project Explorer, double-click MyMacros. Right-click Module1 and then click Rename. Type KeyboardShortcuts as the new name for the module. Double-click KeyboardShortcuts to open the file in the editor. Paste the following code in the file after Public Module KeyboardShortcuts: Sub GetAllCommands() Dim cmd As Command Dim ow As OutputWindow = DTE.Windows.Item(Constants.vsWindowKindOutput).Object Dim owp As OutputWindowPane Dim exists As Boolean Dim i As Integer Dim sArray() As String sArray = New String() {} i = 1 exists = False For Each owp In ow.OutputWindowPanes If owp.Name = "Macro Output" Then exists = True Exit For End If i = i + 1 Next If exists Then owp = ow.OutputWindowPanes.Item(i) Else owp = ow.OutputWindowPanes.Add("Macro Output") End If owp.Clear() ' Output 1 line per command For Each cmd In DTE.Commands Dim binding As Object Dim shortcuts As String shortcuts = "" For Each binding In cmd.Bindings Dim b As String b = binding If Not shortcuts = "" Then shortcuts += "--OR-- " End If shortcuts = shortcuts + b + " " Next shortcuts = shortcuts.Trim() If Not cmd.Name.Trim().Equals("") And Not shortcuts.Equals("") Then sArray.Resize(sArray, sArray.Length + 1) sArray(sArray.Length - 1) = cmd.Name + vbTab + shortcuts End If Next Array.Sort(sArray) owp.OutputString(String.Join(vbCrLf, sArray)) End Sub ...

2013-08-08 · 3 min · 450 words · -

MT4外汇平台挂单交易四种类型buy limit,sell limit,buy stop,sell stop

MT4外汇平台挂单交易四种类型buy limit,sell limit,buy stop,sell stop 在外汇交易中,使用mt4平台进行挂单交易会根据不同的目的选择交易的四种类型,它们分别是: buy limit,sell limit,buy stop,sell stop,做金融交易必须了解和掌握它们不同的含义和用法。 Buy stop: 止损买进,即是指在相对与目前现价而言高于现价的价格挂单的买进操作指令 例子: Buy stop是一个追涨的行为,比如现在EURUSD是1.4321,你觉得只有向上突破了1.4400,才能确定升势,并进一步上扬,那么你可以使用Buy stop: 1.4410,那么当EURUSD上升到1.4410,你的买单才会成交,如果继续上扬,你将会盈利。 buy limit: 限价买进,即是指相对现价而言,低于现价的价格挂单的买进的操作指令 例子: buy limit是设定为以更低的价格买入 (做多) ,和股票的挂单方式是一样的;比如现在EURUSD是1.4321,你觉得趋势仍然是向上的,但是价格会回调到1.4300,然后还会继续上涨,则你需要使用buy limit: 1.4300,当价格回落到1.4300,你的买单将会成交,如果价格上扬,你将会盈利。 sell stop: 止损卖出,即是指相对现价而言,低于现价的价格挂单的卖出操作指令 例子: sell stop是一个杀跌的行为,比如现在EURUSD是1.4321,你觉得只有向下突破了1.4300,才能确定跌势,并进一步下跌,那么你可以使用sell stop: 1.4290,那么当EURUSD下跌到1.4290,你的卖单才会成交,如果继续下跌,你将会盈利。 sell limit: 限价卖出,即是指相对现价而言,高于现价的价格挂单的卖出操作指令 例子: sell limit是设定为以更高的价格卖出 (做空) ;比如现在EURUSD是1.4321,你觉得趋势仍然是向下的,但是价格会反弹到1.4350,然后还会继续下跌,则你需要使用sell limit: 1.4350,当价格上涨到1.4350,你的卖单将会成交,如果价格下跌,你将会盈利。 限价订单也就是挂单是你强大的交易工具,在实践中,多用就会体会到其强大的功能。

2013-08-07 · 1 min · 48 words · -

Rss

Rss https://rss.mk/ https://rssx.wiloon.com

2013-08-06 · 1 min · 3 words · -

FOR XML PATH

FOR XML PATH http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主. 一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表 (hobby) 用来存放兴趣爱好,表结构如下: 接下来我们来看应用FOR XML PATH的查询结果语句如下: SELECT * FROM @hobby FOR XML PATH 结果: 复制代码 1 爬山 2 ...

2013-07-29 · 2 min · 246 words · -

go epoll

go epoll https://colobu.com/2019/02/23/1m-go-tcp-connection/ https://speakerdeck.com/eranyanay/going-infinite-handling-1m-websockets-connections-in-go https://github.com/smallnest/1m-go-tcp-server https://www.freecodecamp.org/news/million-websockets-and-go-cc58418460bb https://github.com/mailru/easygo https://colobu.com/2015/05/22/implement-C1000K-servers-by-spray-netty-undertow-and-node-js/ https://colobu.com/2015/07/14/performance-comparison-of-7-websocket-frameworks/

2013-07-29 · 1 min · 9 words · -

dns PTR记录

dns PTR记录 PTR记录,是电子邮件系统中的邮件交换记录的一种;另一种邮件交换记录是A记录 (在IPv4协议中) 或AAAA记录 (在IP PTR (Pointer Recore),指针记录,是电子邮件系统中的一种数据类型,被互联网标准文件RFC1035所定义。与其相对应的是A记录、地址记录。二者组成邮件交换记录。[1] A记录解析名字到地址,而PTR记录解析地址到名字。 地址是指一个客户端的IP地址,名字是指一个客户的完全合格域名。 PTR记录被用于电子邮件发送过程中的反向地址解析。[2] 当正向域名解析完成后,还应当向您的线路接入商 (ISP) 申请做反向地址解析,以减少被国外机构退信的可能性。 v6协议中) 。PTR记录常被用于反向地址解析。

2013-07-28 · 1 min · 17 words · -

alias command, 别名

alias command, 别名 查看所有的alias alias alias -p 显示已定义的别名 (假设当前环境存在以下别名) alias ls alias ls grep 在命令行直接输入后缀为 html 的文件名, 会在 vim 中打开 (zsh) alias -s html=vim alias -s gz='tar -xzvf' alias ll='ls -l --color=auto' alias la='ls -la --color=auto' #查看命令别名 type ll #取消别名 unalias ll 我们在使用linux过程中,每个命令后都要跟一些参数,可是对于常用的参数假如每次都是手动的添加就是显得麻烦些了。linux 可能通过命令别名的功能来减少您的输入,请下面操作就明白了。 ls -l 列出文档目录周详信息 ls -hl 列出文档大小,以K为单位显示 ls -hlt 列出文档按时间排序 对于上面三个显示需要我们只要配置alias ll=‘ls -lht’ 这样以后,只要输入ll 就能够了。 对于此alias ll=‘ls -lht’ 配置在哪个配置文档下呢?这个就要根据自己的需要而定了。 比如: 您只希望jack这个用户名具备上面功能,因为您只经常使用这个用户。修改此用户家目录下.barsh_profile 将alias ll=‘ls -lht’ 添加进去就能够了。 ...

2013-07-27 · 1 min · 82 words · -

从JVM角度理解线程

从JVM角度理解线程 http://blog.csdn.net/iter_zc/article/details/41843595 这篇说说如何从JVM的角度来理解线程,可以对Java的线程模型有一个更加深入的理解,对GC的一些细节也会理解地更加深刻。本文基于HotSpot的OpenJDK7实现。 我们知道JVM主要是用C++实现的,JVM定义的Thread的类继承结构如下: Class hierarchy Thread NamedThread VMThread ConcurrentGCThread WorkerThread GangWorker GCTaskThread JavaThread WatcherThread 另外还有一个重要的类OSThread不在这个继承关系里,它以组合的方式被Thread类所使用 这些类构成了JVM的线程模型,其中最主要的是下面几个类: java.lang.Thread: 这个是Java语言里的线程类,由这个Java类创建的instance都会 1:1 映射到一个操作系统的 osthread JavaThread: JVM中C++定义的类,一个JavaThread的instance代表了在JVM中的java.lang.Thread的instance, 它维护了线程的状态,并且维护一个指针指向java.lang.Thread创建的对象(oop)。它同时还维护了一个指针指向对应的OSThread,来获取底层操作系统创建的osthread的状态 OSThread: JVM中C++定义的类,代表了JVM中对底层操作系统的osthread的抽象,它维护着实际操作系统创建的线程句柄handle,可以获取底层osthread的状态 VMThread: JVM中C++定义的类,这个类和用户创建的线程无关,是JVM本身用来进行虚拟机操作的线程,比如GC。 有两种方式可以让用户在JVM中创建线程 new java.lang.Thread().start() 使用JNI将一个native thread attach到JVM中 针对 new java.lang.Thread().start()这种方式,只有调用start()方法的时候,才会真正的在JVM中去创建线程,主要的生命周期步骤有: 创建对应的JavaThread的instance 创建对应的OSThread的instance 创建实际的底层操作系统的native thread 准备相应的JVM状态,比如ThreadLocal存储空间分配等 底层的native thread开始运行,调用java.lang.Thread生成的Object的run()方法 当java.lang.Thread生成的Object的run()方法执行完毕返回后,或者抛出异常终止后,终止native thread 释放JVM相关的thread的资源,清除对应的JavaThread和OSThread 针对JNI将一个native thread attach到JVM中,主要的步骤有: 通过JNI call AttachCurrentThread申请连接到执行的JVM实例 JVM创建相应的JavaThread和OSThread对象 创建相应的java.lang.Thread的对象 一旦java.lang.Thread的Object创建之后,JNI就可以调用Java代码了 当通过JNI call DetachCurrentThread之后,JNI就从JVM实例中断开连接 JVM清除相应的JavaThread, OSThread, java.lang.Thread对象 从JVM的角度来看待线程状态的状态有以下几种: 其中主要的状态是这5种: _thread_new: 新创建的线程 _thread_in_Java: 在运行Java代码 _thread_in_vm: 在运行JVM本身的代码 ...

2013-07-27 · 1 min · 111 words · -

The precompilation target directory cann ot be in the same tree as the source application directory

‘The precompilation target directory cann ot be in the same tree as the source application directory’ ASPNETCOMPILER : error ASPRUNTIME: The precompilation target directory (D:appsjenkinsHomejobsxxxworkspacexxxPrecompiledWebxxx) cann ot be in the same tree as the source application directory (D:appsjenkinsHomejobsxxxworkspacexxx). [D:appsjenkinsHomejobsxxx workspacexxxxxx.metaproj] modify the slution file xxx.sln modity from Debug.AspNetCompiler.TargetPath=“PrecompiledWebxxx” Release.AspNetCompiler.TargetPath=“PrecompiledWebxxx” to Debug.AspNetCompiler.TargetPath="..PrecompiledWebxxx" Release.AspNetCompiler.TargetPath="..PrecompiledWebxxx"

2013-07-24 · 1 min · 52 words · -

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 Insert是T-sql中常用语句,Insert INTO table(field1,field2,…) values(value1,value2,…)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中,经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。 1.INSERT INTO SELECT语句 语句形式为: Insert into Table2(field1,field2,…) select value1,value2,… from Table1 要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下: -1.创建测试表 create TABLE Table1 ( a varchar(10), b varchar(10), c varchar(10), CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ( a ASC ) ) ON [PRIMARY] create TABLE Table2 ( a varchar(10), c varchar(10), d int, CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ( a ASC ) ) ON [PRIMARY] GO -2.创建测试数据 ...

2013-07-22 · 1 min · 200 words · -

Java Exchanger

Java Exchanger http://mouselearnjava.iteye.com/blog/1921947 本文介绍Exchanger工具类, 然后采用Exchanger给出一个两个线程交换数值的简单实例。 Exchanger介绍 Java代码 收藏代码 /** * A synchronization point at which two threads can exchange objects. * Each thread presents some object on entry to the {@link #exchange * exchange} method, and receives the object presented by the other * thread on return. */ 从上面的注释中可以看出: Exchanger提供了一个同步点,在这个同步点,两个线程可以交换数据。每个线程通过exchange()方法的入口提供数据给另外的线程,并接收其它线程提供的数据,并返回。 Exchanger通过Lock和Condition来完成功能,Exchanger的一个重要的public方法是exchange方法,用于线程的数据交换, Exchanger工具类的使用案例 本文给出一个简单的例子,实现两个线程之间交换数据,用Exchanger来做非常简单。 Java代码 收藏代码 package my.concurrent.exchanger; import java.util.concurrent.Exchanger; import java.util.concurrent.atomic.AtomicReference; public class ThreadA implements Runnable { private final Exchanger<Integer> exchanger; private final AtomicReference<Integer> last = new AtomicReference<Integer>( 5); public ThreadA(Exchanger<Integer> exchanger) { this.exchanger = exchanger; } public void run() { try { while (true) { last.set(exchanger.exchange(last.get())); System.out.println(" After calling exchange. Thread A has value: " + last.get()); Thread.sleep(2000); } } catch (InterruptedException e) { e.printStackTrace(); } } } ...

2013-07-22 · 1 min · 213 words · -

update join, delete join

update join, delete join UPDATE t1 SET t1.CalculatedColumn = t2.[Calculated Column] FROM dbo.Table1 AS t1 INNER JOIN dbo.Table2 AS t2 ON t1.CommonField = t2.[Common Field] WHERE t1.BatchNo = '110'; DELETE a from t0 a JOIN t1 b ON a.c0=b.c0 WHERE b.c1='xxx' http://stackoverflow.com/questions/1980738/sql-delete-with-join-another-table-for-where-condition http://stackoverflow.com/questions/652770/delete-with-join-in-MySQL/29204958#29204958

2013-07-22 · 1 min · 43 words · -

角色互换, Swapping Roles

角色互换, Swapping Roles Swapping Developer Roles,A Lesson in Empathy and Cross Disciplinary Work If you’ve ever found yourself in a code oriented meeting in which people are going over issues and you find yourself dozed off in the corner – you’ve got an empathy problem. It isn’t explicitly because you’re a jackass (which, you very well may be), but because you cannot relate to the issues. Maybe you’ve never coded a REST interface before, handled the scaling issues of a database, or written the markup for a responsive website. You don’t know what pitfalls exist, what complexities often arise, or what technical challenges are present — it’s all unfamiliar and unknown. To remedy this, a colleague — Willie Miller — and I engaged in what we call “dev swap.” ...

2013-07-20 · 3 min · 577 words · -

敏捷方法中测试人员的价值

敏捷方法中测试人员的价值 http://blog.csdn.net/KerryZhu/article/details/5366574 ** 敏捷**方法在软件开发中受到青睐,特别是在互联网应用服务系统的开发中,越来越多的公司采用敏捷方法,包括XP、Scrum、Lean、Crystal、FDD等。具体的敏捷方法在操作时有一些区别,但基本思想是一致的,如客户至上、拥抱变化、缩短迭代周期、自我组织等。在敏捷方法中,流程相对灵活,强调沟通,通过充分的沟通来及时解决问题,由于沟通充分,文档不是很重要,而且有可能不采用Word等独立的文件格式,而是采用Wiki、空间等web内容方式。在敏捷方法中,需求变化比较快、产品开发周期很短 (一、两周) ,给软件测试带来很大的挑战!例如,功能测试的自动化实现就比较困难,没有足够时间开发自动化测试脚本,要花大量时间讨论产品特性,及时进行产品的验收测试。自动化测试,更多的是在单元测试这个层次上实现。而单元测试自动化、持续集成等一些关键实践,开发人员能发挥更大的作用,而测试人员难以很好地发挥作用。在敏捷方法中,开发人员的主导作用更明显,讨论需求、实现需求,再修改需求、再实现、再重构,不断完善产品,测试人员容易边缘化。甚至在Crystal方法中,可以不需要测试人员,开发人员能承担所有技术性的工作。 在敏捷方法中,测试人员的价值又如何体现? 首先在需求讨论上,测试人员可以站在客户角度上来阐述自己的观点,和产品人员、开发人员等进行充分的交流和讨论,使自己在用户体验、业务逻辑等等方面的经验充分体现出来。 在开发过程中,测试人员不仅扮演"用户代表"角色,而且可以及时提供更全面的质量反馈,包括代码质量、接口一致性等。测试人员不写代码,可以参与代码复审 (code review) ,将质量问题及时提交给项目组,保证在产品构造的整个过程中质量受到足够的关注,提高质量改进的持续性和可视性。 测试人员还是可以参与单元测试。即使单元测试由开发人员做,测试人员可以推进开发人员进行单元测,检查单元测试状态,如确保单元测试达到80%以上覆盖率,以及帮助开发人员开发出具有良好可测试性的代码。 即使在敏捷方法中,集成测试、端到端 (end-to-end) 测试、性能测试等是不可少的。因为在敏捷方法中,往往将一个大的系统开发分解成多个小的子系统 (模块/组件) ,集成测试和端到端 (end-to-end) 测试显得更重要。测试人员在功能测试上工作量会降低,但在这些测试上发挥更大的作用。 随着迭代的不断深入,回归测试的工作量很大,这也是测试人员的用武之地。 测试人员可以针对稳定的产品特性开发自动化测试脚本,这也是一种持续的努力,使回归测试自动化。 测试人员对缺陷进行分析,总结出一些规律,帮助开发人员建立良好的习惯,改进代码的质量。 而且: 在敏捷方法中,我们也要采用敏捷测试,不要再写几十页的测试计划书,而是在每个迭代周期,写出一页纸的测试计划,将测试要点列出来。 在敏捷测试中,可能不需要测试用例,而是针对use case 或user story直接进行验证,并进行探索性测试。而节约出来的时间,用于开发原有功能的自动化测试脚本,为回归测试服务。自动化测试脚本将代替测试用例,成为软件组织的财富。 所以: 敏捷功能测试 = 新特性的手工测试 (use case验证和探索性测试) + 原有功能的自动化测试 (回归测试) 理想情况下,测试人员具有很好的编程能力,可以和开发人员进行角色互换。在当前版本开发 (/迭代周期) 中担任测试人员角色,在下一个版本开发 (/迭代周期) 中担任开发人员角色,而开发人员则担任测试人员角色,让开发人员深刻地理解用户的需求角度来考虑系统功能的设计,这样会更好地保证产品的质量,沟通的障碍也会消除,开发的效率会有很大的提高。这也是对测试人员的一个挑战。 敏捷测试也是一个持续测试的过程,而这持续测试的基础是具备一个灵活的、开放的自动化测试框架。测试人员在自动化测试框架构建上、测试工具开发或第3方测试工具前期研究、试用等方面可以发挥主导作用。 项目采用敏捷方法,要获得成功,项目组中每个人都有很强的质量意识,具有质量的主人翁精神,特别是开发人员,每时每刻提醒自己——“质量是构建出来的”,与客户或产品设计人员进行充分沟通,遵守高度一致的质量标准。测试人员将是促进质量文化不断提升的中坚力量。 [案例补充] 来HW一段时间了,所在项目是其一个全新重点项目,由于采用敏捷模式开发,包括PM在内大家都是在摸索中进行的。撇开CMM改用敏捷,文档不再全面了,连缺陷库都改用轻量级的了,领导们说敏捷中测试做的好不好不是看找到多少BUG,而是看转测试时有没有BUG,要在开发交流中解决全部问题。三轮迭代下来,交流占据了大多数时间,感觉工作做好很多,但却不知道如何体现,这个真是问题,希望大家给点建议。

2013-07-20 · 1 min · 47 words · -

结对编程

结对编程 结对编程 (Pair Programming) 是一种敏捷软件开发实践,指两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘和鼠标一起工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员 (或导航员) , 两个程序员定期互换角色。他们在一起完成需求分析、系统设计、编码、单元测试、整合测试 (Integration Test) 、写文档等工作。基本上所有的开发环节都一起肩并肩地、平等地、互补地进行工作 (如图1所示) 。 有利于提升项目质量,减少Bug; 有利于知识传递,降低学习成本; 多人熟悉同一段代码,减少项目风险; 与别人一起工作会增加责任和纪律性等。 尽管结对编程有诸多诱人的优点,但实行结对编程实践的却为数不多,其主要原因可能有: 结对编程需要投入更多的资源; 结对双方需同时注意力集中,否则效率更低; 结对人员能力要求相适,否则起不到观察者的作用,甚至产生依赖; 不成功的配对,经常引发争吵,产生内耗,导致团队不和谐等。 结对编程是颇具争议的敏捷实践之一,除上述一些优缺点外,可能大家还有更多不同的看法,但分析利弊不是本文所要讨论的重点。 实践经验 就我所在的项目团队而言,6人左右的开发团队需要支持多个中小型独立产品的需求开发,在繁重的业务压力下,用户价值的快速交付是首要的,所以想尝试共用一台电脑进行结对开发的实践只能是一种奢望。让团队开发人员尽可能熟悉相互间的产品代码,提升项目开发效率以及保证良好的项目质量,是我们在项目开发过程中需要重点解决的问题。 我们试图通过集体Code Review和设计交流分享等活动,来提升代码质量以及相互间业务代码的熟悉度,但一直收效甚微。问题主要在于这种集中式活动时间较难安排,人多交流效果不佳,性价比不高。后来,得益于公司的导师机制,在一对新人和导师身上,找到了敏捷结对的原型。由于他们的紧密合作,遇到问题及时沟通,新人在项目进度和质量都有不错表现,很好地融入了团队。在后续的项目过程中,我们不断地尝试和优化这种结对形式,逐渐形成相对固定的工作方法。 与XP结对编程相比,敏捷结对编程最为显著的差异是结对进行需求分析、系统设计和问题讨论,但分别编码实现,通过过程中频繁的Review来实现结对的效果。开发人员两两结对,共同认领开发任务,一起对所承担的开发任务负责。在需求理解、设计阶段双方一起设计和讨论,然后分工各自编码实现,并通过Code Review以确保实现与设计一致。对结对过程中发现的问题,随时沟通和讨论。由于产品业务逻辑相对不是特别复杂,所以通过这种小范围、高效的沟通,可以解决项目中的绝大部分问题,实现更高的开发效率并确保代码质量。 给我们带来了哪些好处? 提升项目质量。结对开发人员在需求理解、设计思路上进行了充分的沟通和讨论,能尽早地发现和解决问题,避免前期因需求理解偏差、设计缺陷问题造成返工。 知识传递。对于新员工或经验略逊的开发人员,通过经常性的沟通和讨论,能迅速地进入角色和积累经验,发挥了传帮带的作用。 backup,规避项目风险。结对人员之间互为backup,有利于团队成员之间熟悉业务代码,若有人员异动时有利于项目风险控制。论新老结对还是强弱结对,都要尽力避免一方对另一方产生依赖,要给新人足够的成长和锻炼空间,让其独立思考和解决问题,并允许在可控范围内尝试失败,以获取宝贵经验得到成长。否则,团队只会多一个执行者,结对难以达到预想的效果。同时,一定程度的独立活动,可以让大家保留自己的工作习惯,而且形式更为自由和灵活。当然,大家可能会有疑问,如何保证结对人选中资深工程师工作的正确性,因为新人和弱者很有可能无法提出想要的Review帮助。这个问题在我们的结对中不可避免,有选择地邀请其他资深专家Review,也许会是个不错的解决方案,特别是对于一些重要的复杂业务逻辑。参加结对的工程师应具备独立思考和解决问题的能力,并且具备较好的团队协作意识。否则,不仅不能有好的结对效果,反而会带来一些新问题。此外,结对也不仅限在研发工程师之间,研发和测试工程师之间或同产品经理之间的结对,同样可以带来不错的效果。 _结对编程(Pair Programming)是一个编程模式(Programming pattern)。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试例子,一起编码,一起单元测试,一起整合测试(Integration Test),一起写文档等。基本上所有的开发环节都一齐肩并肩地,平等地,互补地进行开发工作。 结对编程不是一个人简单地看着另一个在做什么——在卓有成效的配对工作里,这两个合作伙伴常常工作在不同抽象层次,一个人关注的是为实现眼前目标而编写的代码的细节,而另一个人考虑的是更大的前景和下一步要做的事情,这两个人的角色频繁进行更换。这是一项高强度的、严密的,且常常令人疲劳的活动,但是能够创造出经过深思熟虑的高质量代码。 ——Laurie Williams &Steve Hayes 本贴是关于敏捷开发-结对编程(Pair Programming) 的内容聚集的帖子。欢迎跟贴,提供: 结对编程相关的研究资料和资源 实施结对编程在国内或自己公司所遇到的阻力 实践结对编程时,遇到的具体问题 如何让我们的结对编程做得更好 对2和3问题的解决方案 说明: 描述问题时,最好能给出具体的例子,这样讨论不会太偏向于理论研究。 http://www.programmer.com.cn/10724/ https://www.jianshu.com/p/d79cef4296b8 结对编程是「极限编程 (eXtreme Programming) 」里的一个实践。 结对编程技术是指两位程序员坐在同一工作台前开发软件。 结对编程有三种形式: 键盘鼠标式 顾名思义,就是一个人操作键盘,一个人操作鼠标。当然,这种方式越来越不常用,因为程序员们以使用命令行和快捷键为荣,能用到鼠标的地方越来越少了。 Ping-Pong 式 这种是采用 TDD (测试驱动开发) 时常用的方式,A 写测试,B 实现和重构,然后 B 写下一个测试,A 来实现和重构。 ...

2013-07-20 · 1 min · 107 words · -

Nginx

Nginx Nginx 是十分轻量级的 HTTP 服务器, Nginx, 它的发音为 “engine X”, 是一个高性能的 HTTP 和反向代理服务器, 同时也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由俄罗斯人 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的。Igor Sysoev 在建立的项目时,使用基于 BSD 许可。 Nginx 以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载平衡。其拥有匹配 Lighttpd 的性能,同时还没有 Lighttpd 的内存泄漏问题,而且 Lighttpd 的 mod_proxy 也有一些问题并且很久没有更新。 现在, Igor 将源代码以类 BSD 许可证的形式发布。Nginx 因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是 Apache2.2+mod_proxy_balancer 的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到 Apache 的近 2/3。对 proxy 和 rewrite 模块的支持很彻底,还支持 mod_fcgi、ssl、vhosts ,适合用来做 mongrel clusters 的前端 HTTP 响应。 Nginx 具有很高的稳定性。其它 HTTP 服务器,当遇到访问的峰值, 或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换, 失去响应,只能重启服务器。例如当前 apache 一旦上到 200 个以上进程,web响应速度就明显非常缓慢了。而 Nginx 采取了分阶段资源分配技术,使得它的 CPU 与内存占用率非常低。Nginx 官方表示保持 10,000 个没有活动的连接,它只占 2.5M 内存,所以类似 DOS 这样的攻击对 Nginx 来说基本上是毫无用处的。就稳定性而言,Nginx 比 lighthttpd 更胜一筹。 ...

2013-07-17 · 2 min · 292 words · -

Emacs的搜索功能

Emacs的搜索功能 (转自: http://www.80×86.cn/blog/blogview.asp?logID=569) Emacs入门指南(3) [ Date: 2006-03-15 12:04:44 AM | Author: 80x86 | From: Original | Sunny | Emotion Index: +2 ] 通过前两篇文章的学习,您已经可以把Emacs当作一个Better-Notepad来使用了。今天我们要学习的是Emacs中强大的搜索功能。 默认情况下,Emacs采用了一种很待殊的"增量搜索"的功能,虽然它与我们常用的搜索方法在操作习惯上有很大的不同,但习惯后确实是十分的方便。 要让Emacs开始执行搜索,可以按C-s或C-r,前者是从光标位置往后查找,后者则是往前查找。我们以C-s为例。按动C-s后,Emacs在 Minibuffer中提示: I-Search:,这时您便可以输入要搜索的关键字了,现在学习试验的阶段建议您输入时手脚慢一点,看看Emacs是如何来执行您的搜索请求的。 比如,要搜索"search"一词,您输入s,这时Emacs会把光标移动到最近一个s字母上,这里如果您暂停输入一会儿,Emacs就会把所有的s字母进行高亮。您继续输入e,这时Emacs就找到了最近的se字母组合。一直输入下去,直到Emacs找到您要找的内容,这时按回车键即可结束查找。 在查找过程中,您可以反复按动C-s或C-r来执行向后或向前的查找。如果您已经找到一了一个匹配的内容,并且按了回车键结束了查找,这时如要继续查找这个内容,您只需按两次C-s或C-r即可,第一次按动用于激活查找功能,而第二次按动则表示要继续查找。 在输入查找关键字时,如果不小心输错了,可以按动<DEL>键来清除前一个字符,请注意,在Emacs术语中,<DEL>键是指我们通常所说的<BackSpace>键,而<delete>键才表示我们键盘上的<delete>或<Del>键。 输入关键词时也有一个细节的问题,如果您输入的关键字全部是英文小字母,则Emacs会进行不区分大小写的查找。但如果输入的关键字中包含有大写字母, Emacs就会进行区分大小写的查找。另外在查找的过程中,可以通过M-c快捷键来切换区分大小字模式,可以用它来强行指定是否区分大小写。 如果不想用Emacs的增量搜索功能,也可以让Emacs进行传统的搜索,在按下C-s或C-r后,直接打一个回车键,这时Emacs就将进行非增量搜索,您可以输入你的关键字,再按回车键来执行搜索。 下面要介绍的是更为强大的正则表达式搜索功能。您可以通过按动C-M-s或C-M-r来启动正向或反向的正则表达式搜索功能,Emacs会在Minibuffer中提示Regexp I-search:,这时您便可以输入正要匹配的正则表达式了。 在正则表达式中可以使用很多的控制符号,这里我挑选几个常用的作一个简单的介绍,更全面复杂的解释可以在Emacs的手册中查到。 ‘.’ (句号): 正则表达式的中句号可以用于匹配一个任意的字符。比如正则式’a.b’就可以匹配abb,acb,adb。。。等等以a开头以b结尾的三个字符的字符串。 ‘*’: 正则表达式中的*号可以用于表示把它前面的字符重复0次或多次。比如’ff*‘可以匹配一个或多个相连的f的字符串。 ‘+’: 正则表达式中的+号与*号的作用基本相同,区别在于它表示把它前面的字符重复1次或多次,所以可知正则式’ff*‘等价与’f+’。 Emacs的正则表达式语法十分复杂与强大,请您阅读Emacs手册来对它们进行全面的学习,一定会给您的工作带来巨大的便捷,作为一篇入门教程,这里我就不再作更全面的叙述了。 http://www.learndiary.com/2006/04/emacs%E4%B8%AD%E5%BC%BA%E5%A4%A7%E7%9A%84%E6%90%9C%E7%B4%A2%E5%8A%9F%E8%83%BD%EF%BC%88%E8%BD%AC%E5%B8%96%EF%BC%89/ C – s 后切换到搜索框粘贴 Emacs 搜索, C - s 后切换到搜索框粘贴 C - s M - y http://groups.google.com/group/cn.bbs.comp.emacs/browse_thread/thread/84d2258a0d8fdf81/70af2a6296c1f7dd?lnk=raot

2013-07-16 · 1 min · 62 words · -