zoukankan      html  css  js  c++  java
  • 问题解答汇总

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

    一、关于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代码直接粘贴进去即可

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

  • 相关阅读:
    python中类(class)和实例(instance)
    python面向对象
    python中初始化实例属性
    python之使用__future__(解决版本不同,不兼容问题)
    python中动态导入模块
    python之导入模块
    python中偏函数
    python中完善decorator
    python中编写带参数decorator
    python中编写无参数decorator
  • 原文地址:https://www.cnblogs.com/gxt-smart/p/8929190.html
Copyright © 2011-2022 走看看