问题解答汇总

本篇博文将介绍一些实用的、在软工实践过程中可能遇到的问题及解决方法,希望能对同学们有帮助~欢迎指正~

一、关于git代码管理


 1.安装

在Windows上安装Git

在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

安装完成后,还需要最后一步设置,在命令行输入:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

2.创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录(注意:如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录路径中不包含中文。

第二步,通过git init命令把这个目录变成Git可以管理的仓库

$ git init

可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

3.添加文件到本地仓库

  • 第一步,使用git status命令查看修改的文件

  • 第二步,使用命令git add <file>,注意,可反复多次使用,添加多个文件,添加全部修改文件用 git add . (用一个实心点表示全部文件)
  • 第三步,使用命令git commit -m “本次提交的代码的说明”,完成。

4.添加远程库

    本地创建了一个Git仓库后,在GitHub再创建一个Git仓库,并且让这两个仓库进行远程同步

  • 第一步,在GitHub上创建项目

 

  • 第四步:将本地库与远程库关联
$ git remote add origin git@github.com:gongxiaoting/test.git
  • 第五步,将本地本地库的所有内容推送到远程库上
$ git push -u origin master

  

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

注:团队开发最好是一个人先上传代码,其他人克隆代码

从远程库克隆

$ git clone git@github.com:gongxiaoting/test.git

5.分支管理

团队开发的时候为了防止原有代码被破坏,所以鼓励同学们都通过自己的分支上传代码,检查看再merge

  • 创建并切换到名为dev分支
$ git checkout -b dev
Switched to a new branch 'dev'
  • git branch命令查看当前分支
  • 上传代码到分支
git remote add origin git@github.com:gongxiaoting/test.git
$ git push origin dev
  • merge分支
$ git checkout master  //切换回主分支
$ git merge dev

6.版本回退

  • git log查看提交历史记录
$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 15:11:49 2013 +0800

    append GPL                       //当前最新版本

commit ea34578d5496d7dd233c827ed32a8cd576c5ee85           //第二版本的code
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 14:53:12 2013 +0800                

    add distributed              //第二版本名

commit cb926e7ea50ad11b8f9e909c05226233bf755030      //第一版本的code
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 19 17:51:55 2013 +0800

    wrote a readme file               //第一版本名

  现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令:

$ git reset --hard HEAD^                  //返回上一版本
HEAD is now at ea34578 add distributed

  返回上上版本 git reset --hard HEAD^^

      返回上上上版本 git reset --hard HEAD^^^

返回旧版本后又后悔,可以用 git reset --hard (版本号) 回到该版本

例如git reset --hard 3628164fb回到append GPL版本(版本号只写前几位,系统可以分别出即可)

 

参考自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

 

二、关于效能分析


 

JProfiler的使用              --转载自尤少辉助教博客

 

1.下载地址:http://www.ej-technologies.com/download/jprofiler/files

2.使用过程

 

1.点击此图的new Session

2.点击左边application settings,右边要点击

3.点击的Source Path ,点击+号的图标,点击add directory

 

4.点击你工程的文件到bin

5.左边是程序还没有运行的,右边是查询运行的

6.点击你的项目双击俩下,或者点open,之后点击OK就好了

 

 7.点击CPU view,点击Call Tree,之后点击界面的一个按钮

8.这是一张CUP的图,图中显示个个方法的使用占的CPU

9.从中发现最大块的函数对其进行分解优化,以及减少代码块的重复率。

下面举个例子:查重模块中调用到了diaoyong的方法,diaoyong方法调用到addcopy的方法,这样就把200行左右的代码分成了7个方法,每个方法的代码不多于50行。

 1.最大函数块

 1 package com.jm.sizeyunsuan;
 2  
 3 import java.util.ArrayList;
 4 import java.util.List;
 5  
 6 /**
 7  * 查重的总函数
 8  * @author admin
 9  *
10  */
11 public class CongFu {
12     /**
13      * 查重
14      */
15     public  boolean chacong(List<String> timus,String yunsuan){
16         boolean flat=false;//获取是否重复的标记
17         boolean zhuzhifu=false;//在flat为true的时候,终止本次循环的标志
18         for(String s:timus){
19             if(!zhuzhifu){
20                 List<String> str=new ArrayList<String>();//获取已经存入在list中的题目
21                 List<String> str2=new ArrayList<String>();//获取这次尝试的题目
22                 for(int i=0;i<s.length();i++){
23                     str.add(s.charAt(i)+"");
24                     str2.add(yunsuan.charAt(i)+"");
25                 }
26                 flat= same(str, str2);//查看符号数字是不是一样
27                 if(flat){
28                     flat=diaoYong(str,str2);//判断查重
29                     if(flat){
30                         zhuzhifu=true;
31                     }
32                 }
33             }else{
34                 break;
35             }
36         }
37         return flat;
38     }
39      
40     /**
41      * 为了减少代码块的过多抽取调用的方法
42      * @param str list中的题目
43      * @param str2 现在产生的题目
44      * @return
45      */
46     public boolean diaoYong(List<String> str,List<String> str2 ){
47         CongFuAddAndJian aj=new CongFuAddAndJian();
48         CongFuChengAndChu cc=new CongFuChengAndChu();
49         boolean flat=false;
50         switch (str2.get(1)) {
51         case "+":
52             flat=aj.addcopy(str,str2);
53             break;
54         case "-":
55             flat=aj.jiancopy(str,str2);
56             break;
57         case "/":
58             flat=cc.chucopy(str,str2);
59             break;
60         default:
61             flat=cc.chengcopy(str,str2);
62             break;
63         }
64         return flat;
65     }
66      
67     /**
68      * 符号数字一样
69      * str1是题目
70      * str2是本次产生的题目
71      */
72     public  boolean same(List<String> str1,List<String> str2 ){
73         boolean flat=false;
74         for(int i=0;i<str1.size();i++){
75             if(!str1.contains(str2.get(i))
76                     ||!str2.contains(str1.get(i))){
77                 break;
78             }else{
79                 if(i==str1.size()-1){
80                     flat=true;
81                 }
82             }
83         }
84         return flat;
85     }
86 }

2.优化后的

  1 package com.jm.sizeyunsuan;
  2  
  3 import java.util.ArrayList;
  4 import java.util.List;
  5  
  6 /**
  7  * 查重的总函数
  8  * @author admin
  9  *
 10  */
 11 public class CongFu {
 12     /**
 13      * 查重
 14      */
 15     public  boolean chacong(List<String> timus,String yunsuan){
 16         boolean flat=false;//获取是否重复的标记
 17         boolean zhuzhifu=false;//在flat为true的时候,终止本次循环的标志
 18         for(String s:timus){
 19             if(!zhuzhifu){
 20                 List<String> str=new ArrayList<String>();//获取已经存入在list中的题目
 21                 List<String> str2=new ArrayList<String>();//获取这次尝试的题目
 22                 for(int i=0;i<s.length();i++){
 23                     str.add(s.charAt(i)+"");
 24                     str2.add(yunsuan.charAt(i)+"");
 25                 }
 26                 flat= same(str, str2);//查看符号数字是不是一样
 27                 if(flat){
 28                     flat=diaoYong(str,str2);//判断查重
 29                     if(flat){
 30                         zhuzhifu=true;
 31                     }
 32                 }
 33             }else{
 34                 break;
 35             }
 36         }
 37         return flat;
 38     }
 39      
 40     /**
 41      * 为了减少代码块的过多抽取调用的方法
 42      * @param str list中的题目
 43      * @param str2 现在产生的题目
 44      * @return
 45      */
 46     public boolean diaoYong(List<String> str,List<String> str2 ){
 47         CongFuAddAndJian aj=new CongFuAddAndJian();
 48         CongFuChengAndChu cc=new CongFuChengAndChu();
 49         boolean flat=false;
 50         switch (str2.get(1)) {
 51         case "+":
 52             flat=aj.addcopy(str,str2);
 53             break;
 54         case "-":
 55             flat=aj.jiancopy(str,str2);
 56             break;
 57         case "/":
 58             flat=cc.chucopy(str,str2);
 59             break;
 60         default:
 61             flat=cc.chengcopy(str,str2);
 62             break;
 63         }
 64         return flat;
 65     }
 66      
 67     /**
 68      * 符号数字一样
 69      * str1是题目
 70      * str2是本次产生的题目
 71      */
 72     public  boolean same(List<String> str1,List<String> str2 ){
 73         boolean flat=false;
 74         for(int i=0;i<str1.size();i++){
 75             if(!str1.contains(str2.get(i))
 76                     ||!str2.contains(str1.get(i))){
 77                 break;
 78             }else{
 79                 if(i==str1.size()-1){
 80                     flat=true;
 81                 }
 82             }
 83         }
 84         return flat;
 85     }
 86 }
 87
 1 package com.jm.sizeyunsuan;
 2  
 3 import java.util.List;
 4  
 5 /**
 6  * 判断重复的第一个符号为加减的
 7  * @author
 8  *
 9  */
10 public class CongFuAddAndJian {
11      
12     /**
13      * 第一个为加号判断重复
14      * ||之前为符号位置的一致,||之后的为符号位置不同
15      */
16     public  boolean addcopy(List<String> str1,List<String> str2){
17         boolean flat=false;
18         switch (str2.get(3)) {
19         case "+":
20             flat=true;
21             break;
22         case "-":
23             if(str2.get(4).equals(str1.get(4))
24                     &&str2.get(3).equals(str1.get(3))
25                     ||str2.get(3).equals(str1.get(1))
26                     &&str2.get(4).equals(str1.get(2))){
27                 flat=true;
28             }
29             break;
30         case "/":
31             if(str2.get(2).equals(str1.get(2))
32                     &&str2.get(3).equals(str1.get(3))
33                     &&str2.get(4).equals(str1.get(4))
34                     ||str2.get(2).equals(str1.get(0))
35                     &&str2.get(3).equals(str1.get(1))
36                     &&str2.get(4).equals(str1.get(2))){
37                 flat=true;
38             }
39             break;
40         default:
41             if(str2.get(0).equals(str1.get(0))
42                     &&str2.get(1).equals(str1.get(1))
43                     ||str2.get(0).equals(str1.get(4))
44                     &&str2.get(1).equals(str1.get(3))){
45                 flat=true;
46             }
47             break;
48         }
49         return flat;
50     }
51      
52  
53     /**
54      * 第一个为减号判断重复
55      * ||之前为符号位置的一致,||之后的为符号位置不同
56      */
57     public  boolean jiancopy(List<String> str1,List<String> str2){
58         boolean flat=false;
59         switch (str2.get(3)) {
60         case "+":
61             if(str2.get(2).equals(str1.get(2))
62                     &&str2.get(1).equals(str1.get(1))
63                     ||str2.get(1).equals(str1.get(3))
64                     &&str2.get(2).equals(str1.get(4))){
65                 flat=true;
66             }
67             break;
68         case "-":
69             if(str2.get(0).equals(str1.get(0))){
70                 flat=true;
71             }
72             break;
73         case "/":
74             if(str2.get(0).equals(str1.get(0))
75                     &&str2.get(2).equals(str1.get(2))
76                     &&str2.get(1).equals(str1.get(1))){
77                 flat=true;
78             }
79             break;
80         default:
81             if(str2.get(0).equals(str1.get(0))
82                     &&str2.get(1).equals(str1.get(1))
83                     ||str2.get(0).equals(str1.get(4))
84                     &&str2.get(1).equals(str1.get(3))){
85                 flat=true;
86             }
87             break;
88         }
89         return flat;
90     }
91  
92      
93 }

 

 1 package com.jm.sizeyunsuan;
 2  
 3 import java.util.List;
 4  
 5 /**
 6  * 判断重复的第一个符号为乘除的
 7  * @author
 8  *
 9  */
10 public class CongFuChengAndChu {
11     /**
12      * 第一个为乘法判断重复
13      * ||之前为符号位置的一致,||之后的为符号位置不同
14      */
15     public  boolean chengcopy(List<String> str1,List<String> str2){
16         boolean flat=false;
17         switch (str2.get(3)) {
18         case "*":
19             flat=true;
20             break;
21         case "/":
22             if(str2.get(4).equals(str1.get(4))
23                     &&str2.get(3).equals(str1.get(3))
24                     ||str2.get(4).equals(str1.get(2))
25                     &&str2.get(3).equals(str1.get(1))){
26                 flat=true;
27             }
28             break;
29         case "+":
30             if(str2.get(4).equals(str1.get(4))
31                     &&str2.get(3).equals(str1.get(3))
32                     ||str2.get(4).equals(str1.get(2))
33                     &&str2.get(3).equals(str1.get(1))){
34                 flat=true;
35             }
36             break;
37         default:
38             if(str2.get(3).equals(str1.get(3))
39                     &&str2.get(4).equals(str1.get(4))){
40                 flat=true;
41             }
42             break;
43         }
44         return flat;
45     }
46  
47     /**
48      * 第一个为除法判断重复
49      * ||之前为符号位置的一致,||之后的为符号位置不同
50      */
51     public  boolean chucopy(List<String> str1,List<String> str2){
52         boolean flat=false;
53         switch (str2.get(3)) {
54         case "*":
55             if(str2.get(2).equals(str1.get(2))
56                     &&str2.get(1).equals(str1.get(1))
57                     ||str2.get(2).equals(str1.get(4))
58                     &&str2.get(1).equals(str1.get(3))){
59                 flat=true;
60             }
61             break;
62         case "/":
63             if(str2.get(0).equals(str1.get(0))){
64                 flat=true;
65             }
66             break;
67         case "+":
68             if(str2.get(0).equals(str1.get(0))
69                     &&str2.get(1).equals(str1.get(1))
70                     &&str2.get(2).equals(str1.get(2))
71                     ||str2.get(0).equals(str1.get(2))
72                     &&str2.get(1).equals(str1.get(3))
73                     &&str2.get(2).equals(str1.get(4))){
74                 flat=true;
75             }
76             break;
77         default:
78             if(str2.get(0).equals(str1.get(0))
79                     &&str2.get(1).equals(str1.get(1))
80                     &&str2.get(2).equals(str1.get(2))){
81                 flat=true;
82             }
83             break;
84         }
85         return flat;
86     }
87  
88 }

 

三、关于博客排版


1、博客作业中,最高分往往会产生在那些最细心的同学中,因为博客的排版是阅读者的第一印象,所以直接决定了分数的层次
       那么怎样才能做到写出一个出色的排版呢?
       一级标题、二级标题、三级标题....必须要有明显的区别

       这是一级标题

             这是二级标题

                     这是三级标题

博客园与word一样,可以选择标题1、标题2、标题3等,同学们可以根据自己的内容选择合适的标题分级。

2、按点回答,把握住得分点,高分内容着重回答

     每次发布作业的同时都会发布一个得分标准,在完成博客作业的时候,同学们可以根据评分标准,按点叙述,把握得分点,而高分点是要着重叙述的地方

3、绘制表格

     绘制表格,我们可以发现若将Excel中的内容直接复制粘贴到博客园中会变成图片。解决办法的话我相信每位同学们各有各的方法,在这里我就介绍一下我自己的方法,有更好的方法欢迎大家来一起探讨~

   (1)复制excel表中的内容

(2)复制到No-Cruft Excel to HTML Table Converter工具中,这是一个可以将Excel表格转换成html代码的在线转换软件

(3)复制转换后的结果,选择博客园TinyMCE编辑中的HTML按钮,粘贴在需要的位置

点击更新就完成表格插入啦!

若使用的是mardown编辑器,则将html代码直接粘贴进去即可

问题收集暂且整理到这里,欢迎大家继续提问啦~~~

 

posted @ 2018-04-24 13:14  gong.xiaoting  Views(439)  Comments(2Edit  收藏  举报