码迷,mamicode.com
首页 > 其他好文 > 详细

修Bug(中途掉坑里,差点失控,后期完美补刀)

时间:2015-04-25 09:18:59      阅读:331      评论:0      收藏:0      [点我收藏+]

标签:

刚接手的项目留下一些bug,是一个word文档,一个一个慢慢解决吧;

先从简单的入手吧,找找感觉;

bug:导出的word文档有乱码(<=b>、<=:p>);

技术分享

生成word文档的方式是有3个模板文件,生成的时候动态替换标题和内容等;

技术分享

3个文件放在类路径的某个目录下;

没有做缓存,每次都实时IO读取文件,这里可以优化;

问题可能是3个文件的编码,手动改下试试;

技术分享

改成代码里边写的GBK;

技术分享

重试,没效果;

修改文件,真的是多了字符,好多低级错误;

技术分享

ok,解决了,这个bug花了40分钟;

 

找到另外一个bug,也是导出word乱码,一并解决掉;

 

有个新增版本信息和系统描述信息页面的需求;

就是写个about页面;

这项目的风格都是硬编码,写个静态页面就可以了;

试了自己写个jsp,发现左边的导航出不来;

拷一个类似的页面,做减法慢慢调;

 

bug:甘特图界面展现空白;

发现打印好多sql日志,是之前加的logback,将level改成warn;

<logger name="org.apache.ibatis.jdbc.ScriptRunner" level="WARN"/>

<logger name="org.activiti.engine.impl.persistence.entity" level="WARN"/>

<logger name="java.sql.Connection" level="WARN"/>

<logger name="java.sql.Statement" level="WARN"/>

<logger name="java.sql.PreparedStatement" level="WARN"/>

<logger name="java.sql.ResultSet" level="WARN"/>

能不能像pom.xml那样设置个属性,引用呢,就不用全部手动改了;

可以的:

<property name="ibatisLevel" value="WARN" />

后边引用:

<logger name="org.apache.ibatis.jdbc.ScriptRunner" level="${ibatisLevel}"/>

console.log挺好用,方法都能打印出来;

技术分享

这里用的是JSGantt;

发现这里没做完,动态的task都没处理;

技术分享

官网的例子http://www.jsgantt.com/#tExamples,能显示:

技术分享

改成动态的;

电脑卡出翔了,才4g!心想拿家里空余的内存条来插上算了;

这种老旧的js框架改成动态的还有点难度;

只能用<% %>块了,用EL forEach不行;

这里有个技巧就是写在<%%>里边写java代码,eclipse如果没提示,就先在java代码里边写好再拷贝到jsp里边修改;

NM,这反人类的字段排序,坑了我一把;

技术分享

技术分享

有些公司招聘的时候想招到编写可靠代码的人,可是怎么样才能在面试的过程中找到,想想也是蛮难的;有些人半桶水特别能说,但大多数技术人员都不会吹嘘,他们深知技术的限制;没有完美的技术,没有完美的框架,一句两句话能说清楚吗?

明显我是不会吹的,这不现在还在写代码吗?

技术分享

但凭良心讲,不让人恶心的设计和代码是基本要求,我对质量要求更多,都是细节,面试的时候又不知道怎么说出口;

上次被某NB烘烘的特卖网站的技术经理叼了一次,他鄙夷地说:我招个2年经验的和你有什么区别?我语塞;

说多了都是泪;

继续干活;

 

最后出来的代码是:

<%
SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");

if(tasks.size() > 0){
    Iterator iterator = tasks.iterator();
    while (iterator.hasNext()) {
        Task task = (Task) iterator.next();
        out.println("g.AddTaskItem(new JSGantt.TaskItem("+task.getId()+",‘"+task.getName()+"‘,‘"+df.format(task.getActual_startTime())+"‘,‘"+df.format(task.getActual_endTime())
                +"‘,‘"+task.getColor()+"‘,‘‘, 0, ‘‘, "+task.getStage()+", 0));");

    }
}
%>

 

去掉了官网例子后边的几个参数;

 

2015/4/23

Bug:上传多个附件,如果附件有重名则报错;

按提交按钮却是GET请求,奇了怪了;

公司电脑各种优化都是卡啊,内存太小硬伤啊;

集合里边检查有没有重复元素的算法;用来检查有没有重复附件;

List<String> list = new ArrayList<String>();
list.add("f1");
list.add("f6");
list.add("f2");
list.add("f3");
list.add("f4");
list.add("f3");

Collection<String> cols = new CopyOnWriteArrayList<String>(list);
int i = 1;
for (String string : cols) {
    cols.remove(string);
    if (cols.contains(string)) {
        System.out.println("i=" + i + ", value=" + string);
        break;
    }
    i++;
}

 

第一次这样写,不知道性能怎么样?一次附件肯定不多,暂不考虑性能问题了;

这里业务层的逻辑有点问题,现在的逻辑是先提交表单,完成数据录入,提交事物,然后再上传附件;

是不是应该先上传附件呢;

bug:IE兼容模式下,按钮错位,chrome则正常;

加些div就解决;

 

有个性能问题:导入记录卡顿;

分析可能是记录很多的时候没有做批量插入,而是循环单独插入;

for (FundRecord fundRecord : list) {

fundRecordRepository.save(fundRecord);

}

应该改用:

技术分享

写了个测试用例处理100条数据;

    @Test
    public void addBatch(){
        
        long begin = System.currentTimeMillis();
        
        ArrayList<FundRecord> list = new ArrayList<FundRecord>();
        FundPlan fundPlan = new FundPlan();
        fundPlan.setId(11L);
        UserInfo userInfo = new UserInfo();
        userInfo.setId(100L);
        userInfo.setUserName("userName");
        for (int i = 0; i < 100; i++) {
            
            FundRecord fundRecord = new FundRecord();
            fundRecord.setFundplan(fundPlan);
            fundRecord.setRecordfund(i + "");
            fundRecord.setRemark("re");
            fundRecord.setCreator(userInfo);
            fundRecord.setApplicant(userInfo);
            list.add(fundRecord);
        }
        //fundRecordRepository.save(list);
        for (FundRecord fundRecord : list) {
            fundRecordRepository.save(fundRecord);
        }
        
        long end = System.currentTimeMillis();
        System.out.println("total:" + (end - begin));
    }

for循环的方式耗时5960毫秒:

批量的方式耗时396毫秒;

相差10几倍;

技术分享

测试的时候,如果本机环境和测试环境的数据库不一致,可以同步一下;

技术分享

技术分享

 

用sourceTree每次打开的时候提示:(详细解决方法可以参考百度经验

SourceTree is loading your SSH key into the agent for authentication

Please enter your passphrase if prompted to do so

以前在别的电脑的时候第一次设置好就不会提示了,这台刚刚装好的电脑是怎么回事?

虽然按下回车就可以;但还是有那么点不爽;

技术分享

http://www.sourcetreeapp.com/faq/

官网上貌似有答案;

技术分享

技术分享

点了没反应;

 

下载putty-gen.exe

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

技术分享

load

技术分享

技术分享

然后点击按钮save private key;

技术分享

工具—添加SSH密钥;

技术分享

选择刚刚生成的文件;

技术分享

 

总结:

1、 先用经验解决问题,验证之,不行再试别的方法;

2、 性能测试是一项实验性科学,不去实验靠猜是不靠谱的;

修Bug(中途掉坑里,差点失控,后期完美补刀)

标签:

原文地址:http://www.cnblogs.com/yejq/p/4455365.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!