问题解答汇总
本篇博文将介绍一些实用的、在软工实践过程中可能遇到的问题及解决方法,希望能对同学们有帮助~欢迎指正~
一、关于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中生成ssh key 参考:https://www.cnblogs.com/horanly/p/6604104.html
- 第三步 查看ssh地址
- 第四步:将本地库与远程库关联
$ 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代码直接粘贴进去即可
问题收集暂且整理到这里,欢迎大家继续提问啦~~~