Fork me on GitHub

实习笔记——开发技巧

[TOC]

Linux常用命令

常用命令

菜鸟教程常用命令

1
2
3
4
5
6
7
8
切换目录
cd /usr查看目录下的文件lsls -lh 遍历详细信息,如权限,所属用户,创建日期,大小等等信息
查看当前所处目录pwd
创建目录文件mkdir -p /test/abctouch test.java
删除文件
rm -f test.java
vi abc.txt要进行编辑,要输入 a 或者 i ,才可以进行编辑哦
要退出,首先要离开当前的编辑模式,点击左上角的ESC键,退出编辑模式然后输入冒号 (shift+分号) 打开控制命令接着输入wq,然后敲回车,即保存退出wq 是quit+write的缩写

grep搜索文本,支持正则

参数

1
2
3
4
5
6
7
8
9
10
grep [-acinv] [--color=auto] '搜寻字符串' filename
-a:将binary文件以text文件的方式搜寻数据
-c:计算找到'搜寻字符串'的次数
-i:忽略大小写
-n:顺便输出行号
-v:反向选择,即输出没有'搜索字符串'的内容
--color=auto:可以将找到的关键词部分加上颜色显示
-A 5:可以显示前面5行加上查找行的信息
-B 5:可以显示后面5行加上查找行的信息
-C 5:可以显示前后5行加上查找行的信息

例子

grep 2017010500345878 --color info.log

这行命令在info.log中搜索含有”2017010500345878”关键词的段落并且使用其他颜色标记关键词。
复制代码

grep -v 'ERROR' error.log 查找不含”ERROR”的行

grep -C 50 "关键字" info.log

less分页查看,比more更强

ps -ef |less

ps查看进程信息并通过less分页显示

搭配grep使用

less -N tomcat_stdout.log|grep job
less xxx.log | grep -i -n -C10 --color=auto xx

有用的命令

  • 按F,监控更新.如果要暂停监控,可以CTRL+C.
  • /字符串:搜索“字符串”的功能
  • G:调到文本末尾
  • 空格键 滚动一页
  • 回车键 滚动一行
  • Q: 退出
  • gg: 调到文本最前面
  • 按v进入编辑模式,可以类似于vim的方式来编辑保存文件了

其他有用的命令

1.全屏导航

  • ctrl + F - 向前移动一屏forward
  • ctrl + B - 向后移动一屏backward
  • ctrl + D - 向前移动半屏
  • ctrl + U - 向后移动半屏

2.单行导航

  • j - 向前移动一行
  • k - 向后移动一行

3.其它导航

  • G - 移动到最后一行
  • g - 移动到第一行
  • q / ZZ - 退出 less 命令

4.标记导航

当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:

  • ma - 使用 a 标记文本的当前位置
  • ‘a - 导航到标记 a 处

vi编辑文本

使用找一个字符串,在vi命令模式下键入“/”,后面跟要查找的字符串,再按回车。vi将光标定位在该串下一次出现的地方上。键入n跳到该串的下一个出现处,键入N跳到该串的上一个出现处。

tail查看文件后面几行,默认尾10行,可实时更新

-f 关键字,tail 会自动实时更新文件内容。

tail -f [logfile]

tail -n +100 [logfile]

查询从日志文件的第100行开始

tail -n 100 [logfile] | grep '结果' --color

–color是查询结果带颜色

head查看文件前面几行,默认前10行;

head -50 info.log

查看info.log文件的前50行。

head -n -100 [logfile]

查询日志文件除了最后10行的其他所有日志

cat查看文件

常用有三大功能:

  • 1.一次显示整个文件;
  • 2.从键盘创建一个文件。
  • 3.将几个文件合并为一个文件。

-n 可以显示行号

1
cat -n test.log |tail -n +63820|head -n 20

tail -n +63820表示查询63820行之后的日志
head -n 20 则表示在前面的查询结果里再查前20条记录

1
cat -n info.log |grep "关键字" |more

这样就分页打印了,通过点击空格键翻页

sed编辑文件

  • 常见使用方法之: sed -n ‘800,900’ info.log
1
2
查看info.log文件800到900行之间的内容
复制代码

常见组合使用

使用[grep -n 异常 –color info.log ]查询到异常在文件中发生的行数,然后再看前后几十行日志的内容[sed -n ‘800,900’ info.log].

Git使用总结

add与commit

首先,选择一个合适的地方,创建一个空目录

通过git init命令把这个目录变成Git可以管理的仓库。可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的。

第一步,用命令git add告诉Git,把文件添加到仓库:

第二步,用命令git commit告诉Git,把文件提交到仓库:

1
2
git add readme.txt
git commit -m "wrote a readme file"

为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,也可以对一个文件进行不同更改

版本

git log命令显示从最近到最远的提交日志,

1
git log --pretty=oneline

在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

如果回到了原来的版本,git log看不到之前最新的提交记录了,但是git reflog还可以。只有知道版本号,就可还原之前的任何一个版本。

1
2
git reset --hard HEAD^
git reset --hard 1094a

git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。

git status可以查看一下状态,如果工作区进行了修改有没有add就会显示Untracked files

一个重要的概念是:Git跟踪并管理的是修改,而非文件。把文件git add readme.txt添加到了暂存区,暂存区也只是跟踪了这次修改,而不是跟踪了这个文件。换句话说:add不是一劳永逸之后对这个文件的更改都会被commit。如果再对readme.txt进行修改,就需要在进行一次git add,如果不再add,commit提交就不会提交这次修改。简而言之:每次修改都要进行git add。

删除文件:

1
2
git rm test.txt
git commit -m "remove test.txt"

如果是误删,版本库里还有,想恢复.git checkout其实是用版本库里的最新版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

1
git checkout -- test.txt

分支

切换分支和撤销修改是同一个关键词checkout,确实有点令人迷惑,不过切换分支的checkout也可以用switch替换

1
2
3
4
5
git checkout -b dev #创建并切换到dev分支
git checkout master #切换回master分支
git merge dev #在master分支上合并dev
git branch -d dev #删除dev分支
git branch #查看分支

分支合并

在实习的时候我经常遇到这样尴尬的情况

比如:commit提交到本地分支了,切换到远程分支全没有了。解决办法:把本地和远程的分支和一下。

再比如:在我的分支上明明有的方法,与其他的预发分支合并也没问题。发上去应用构建居然报错找不方法???原来是别人发布了一次,此时主分支就和我不一样了。本地分支当然能看到该方法,切到构建分支发现并没有这个方法。解决办法:把我的分支和主分支合并一下

再再比如:

Commit之后切换分支了,就commit不了,显示没有变更。解决方法:嘿嘿还是分支合并就vans了,惊不惊喜意不意外?

那么问题来了,怎么万无一失的合并分支,并手动解决冲突?

  1. git fetch

  2. git checkout 分支一

  3. git merge origin/分支二417c909ab76eb47c8fc033479904544054e8ea0e

  4. 解决冲突,有一些会自动合并,必须手动解决的会在控制台输入什么类。加上<<<<<<<=======>>>>>>>这种,跟着报错提示很容易找到地方。

  5. git add -u 记得重新add一下否则会提示冲突没有解决

  6. git commit -m ‘XXXXX’

  7. git push

git log –graph –pretty=oneline –abbrev-commit可以查看分支合并情况。

顺便说一下pull和fetch的区别

*git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。*

git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

快速和并是看不出来曾经做过合并,禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

1
git merge --no-ff -m "merge with no-ff" dev

stash

bug分支,工作写到一半还不能提交,但是bug得马上先修的尴尬局面。

  1. git stash可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
  2. git checkout -b issue-101在修复bug的分支上创建临时bug分支
  3. 修完后add+提交,切换会原来的分支,合并,最后删除issue-101分支。
  4. git stash list查看之前储藏起来的内容。用git stash apply或者git stash pop,恢复,后者会在恢复的同时删除stash。(list中的id号可以让你恢复指定的stash)
  5. 如果其他分支也有该bug,git cherry-pick 4c805e2,cherry-pick能复制一个特定的提交到当前分支:
1
git stash

如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

小技巧

code review已提交的代码,点击主分支右键compare with current。

强烈推荐这个教程,深入浅出.
https://backlog.com/git-tutorial/cn/stepup/stepup7_5.html

框架常用注解

spring

##

bean的注册

两种办法.

一、@Component或其派生 @Controller, @Service, @Repository注解

  • 位置: 注解在类上

  • 参数: 默认的bean的ID为首字母变为小写的类名

  • 作用域:

    • 通过上述四个注解标识的 Bean,其默认作用域是”singleton”。

      如果不想是单例,使用@Scope 注解。只需提供作用域的名称就行了。

      1
      2
      3
      @Scope("prototype") 
      @Repository
      public class Demo { … }

@ComponentScan

  • 作用: @ComponentScan对应XML配置形式中的<context: component-scan>元素, 用于配合一些元信息 Java Annotation,比如@Component和@Repository等, 将标注了这些元信息 Annotation 的 bean 定义类批量采集到 Spring 的IoC容器中, 我们可以通过 basePackages等属性来细粒度地定制 @ComponentScan自动扫描的范围, 如果不指定, 则默认 Spring框架实现会从声明 @ComponentScan所在类的 package 进行扫描。

二、使用@Configuration 搭配 @Bean注解。

常用在配置第三方提供的bean.

    • @Configuration
      • 位置: 注解在类上
      • 作用: 声明当前类是一个配置类,相当于一个Spring配置的xml文件, 任何POJO+@Configuration都是一个JavaConfig配置类。 @Configuration也是一个@Component
    • @Bean
      • 位置: 注解在方法上
      • 作用: 声明当前方法的返回值为一个Bean。
1
2
3
4
5
6
7
8
9
10
11
12
13
// 使用 @Configuration + @Bean 配置一个Tesla Service

@Configuration

public class TeslaServiceConfiguration {

@Bean(name = "userService")

public UserService userService() throws TeslaException {

return TeslaServiceConsumerFactory.getTeslaServiceConsumer(UserService.class);
}
}

bean的获取

@Autowired 搭配 @Qualifier 或者 @Resource

@Resource和@Autowired使用起来区别不大, @Autowired优先byType装配, @Resource优先byName装配, 更多参考这里

@Autowired(required = false)找不到也没关系

问:如果属性注入找不到我不想让Spring容器抛出异常,而就是显示null,可以吗?答:将@Autowired注解的required属性设置为false即可

1
2
` @Autowired(required = false)
private Car car;`

@Qualifier(“BMW”)接口有多个实现拿哪一个

问:一个Car接口有两个个实现,类Benz和BMW,要怎么拿?

1
2
3
@Autowired
@Qualifier("BMW")
private Car car;

@Autowired + @Qualifier(“foo”) 等同于 @Resource(name=”foo”)

bean生命周期

在某些情况下,可能需要我们手工做一些额外的初始化或者销毁操作,这通常是针对一些资源的获取和释放操作。

Bean的生命周期 @Scope @PostConstruct 和 @PreDestroy

@Scope指定bean的作用域.

1
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) or @Scope("prototype")

生命周期的钩子

  • initMethod & destroyMethod
    • 位置: 与@Bean搭配使用
    • 作用: 指定bean的生命周期回调方法, bean实例化后, bean销毁前
    • 例子: @Bean(initMethod=”init”,destroyMethod=”destory”)
  • @PostConstruct & @PreDestroy
    • 位置: 与@Component搭配使用, 注解在方法上
    • 作用: 指定bean的生命周期回调方法, bean实例化后, bean销毁前
    • 例子: @PostConstruct public void init() {}
1
2
3
4
5
6
7
// @PostConstruct & @PreDestroy 示例

@PostConstruct
public void init() {}

@PreDestroy
public void stop() {}

@Value去配置文件取值

1
2
@Value("${env}")  
private String env;

除了spring的application.properties,还会发现应用里对每一个环境都有不同的配置文件,诸如dev_config.properties、online_config.properties。

@Value取值先去application.properties,如果配置文件以@开头结尾,如env=@env@,则根据当前环境去对应的配置文件里取

SpringBoot

  • @SpringBootApplication
    • @Configuration
      • 启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类
    • @EnableAutoConfiguration
      • 从classpath中搜索所有META-INF/spring.factories配置文件, 加载配置到spring容器
      • 比如moguboot的spring.factories就配置了很多内部中间件
    • @ComponentScan

SpringMVC

  • @RequestParam & @PathVariable 做参数绑定
    • 默认绑定
      • 请求参数名和方法参数名一致
    • 使用RequestParam明确指定绑定关系
      • @RequestParam(value=”age” required=false) required默认是true
    • @PathVariable
      • @RequestMapping(value=”users/{userId}, method=RequestMethod.GET)
      • foo(@PathVariable(“userId”) long userId)
  • @RequestBody
    • 添加 @RequestBody 后 Spring 会根据请求中的 Content-Type 头信息来选择合适的转换器, 将请求数据转为 Java 对象
    • 比如Content-Type是application/json, 那么就是 JSON -> Model
  • @ResponseBody
    • 添加 @ResponseBody 后 Spring 会根据请求中的 Accept 头信息来选择合适的转换器, Java 对象转化为客户端可接受的表述形式
    • 比如Accept头部信息包含“application/json”, 就是Model -> JSON
  • @RestController
    • @RestController 等于 @Controller + 每个方法默认加@ResponseBody

Lombok

测试

  • @Test
    • @Test注解标注这个方法需要测试
  • @Before
    • 所有的测试方法之前都先执行这个方法
  • @After
    • 所有的测试方法之后都要执行这个方法
  • 还有@BeforeClass @AfterClass等注解
1
2
3
4
5
6
7
8
@Test
public void testAdd(){}

@Before
public void prepare(){}

@After
public void destroy(){}

spring注解

提升开发效率的技巧

idea

常用快捷键排行榜

  1. 复制一行Ctrl+D (光标所在行)
  2. 删除一行Ctrl+X (光标所在行)
  3. 选中的代码块注释 Ctrl + Shift + /
  4. 代码重新排列格式 Ctrl + Alt + L
  5. 全局替换 Ctrl+Shift+R
  6. 定位到下一个或上一个错误 F2 / Shift + F2
  7. Ctrl+Shift+F12 专注代码窗口
  8. Ctrl+E可以找到Recent Files最近浏览过的文件
  9. Ctrl + Shift + Z取消撤销
  10. Ctrl + Shift +回车:无论光标在哪,跳到下一行
  11. ctrl+alt+v:自动补全方法/new对象的返回值。

idea中git的使用

把idea项目关联为git仓库:菜单->VCS->import into Version Control->Create Git Repository->e:\project\hiworld-OK

如何热部署?

热部署

idea如何导入setting?

file -> export setting

将会导出一个 setting.jar 的文件

在新安装 IDEA 的电脑上,在开始的界面选择导入 setting

查看源码五件套

  1. 一次性折叠所有Java方法:ctrl +shift+ 减号

  2. ctrl+鼠标单击某类 可以跳进该类查看源码

  3. Ctrl+F12 显示这个类的方法的(弹出窗口)

  4. alt + 7 显示这个类的方法的(左侧项目文件显示)

  5. Ctrl+O,这个用于查看一个类的纲要,再按一次时,列出该类继承的方法及变量。

选中当前类中右击鼠标,右键菜单中选择Diagrams>Show Diagrams,快捷键Ctrl+Alt+Shift+U(不同的系统和快捷键风格快捷键会有差异)。如果是spring的类会出现如图所示的弹框,第一项是类图结构,第二个是spring beans的依赖

LINUX

常用命令

菜鸟教程常用命令

1
2
3
4
5
6
7
8
切换目录
cd /usr查看目录下的文件lsls -lh 遍历详细信息,如权限,所属用户,创建日期,大小等等信息
查看当前所处目录pwd
创建目录文件mkdir -p /test/abctouch test.java
删除文件
rm -f test.java
vi abc.txt要进行编辑,要输入 a 或者 i ,才可以进行编辑哦
要退出,首先要离开当前的编辑模式,点击左上角的ESC键,退出编辑模式然后输入冒号 (shift+分号) 打开控制命令接着输入wq,然后敲回车,即保存退出wq 是quit+write的缩写

云服务器

云翼计划,9.9一个月,需要学生认证

安装常用软件比如java、mysql的步骤

MobaXterm和Navicat,远程连接服务器和数据库,不用每次都登陆阿里云网站,很好用

cmd

在文件夹空白处按住Shift,然后右键弹出快捷菜单,可以看到“在此处打开命令行窗口”

使用上下方向键,翻看使用过的命令

cd 切换目录

例:cd // 显示当前目录

例:cd .. // 进入父目录

例:cd /d d: // 进入上次d盘所在的目录(或在直接输入:d:)

例:cd /d d:\ // 进入d盘根目录

例:cd d: // 显示上次d盘所在的目录

例:cd /d d:\src // 进入d:\src目录

例:cd prj\src\view // 进入当前目录下的prj\src\view文件夹

工具

Markdown工具

印象笔记:印象笔记也可以写md,体验一般

typora :md文件编辑器,用起来很舒服(本篇就是用它写的)

Writage 可直接将md文件打开为word,安装轻便。

资源搜索

盘搜搜:可以直接搜索网盘分享链接

闲鱼:盘搜搜搜不到的网盘链接,可以在里搜搜

其他

合并多个word/pdf/md文件为一个?

打开命令行cmd,输入下面这行命令,即可把E:\File目录下所有md文件合并成一个文件。

输入和输出路径不需要一样。

1
type E:\File\*.md >> E:\File\margeFile.md

端口被占用?

下面三行代码解决问题

打开cmd命令行窗口

第一行代码:查看端口号包含”80”的占用情况

第二行代码:根据上一步找到的80端口对应的pid是1828

结束java.exe

1
2
3
4
5
netstat -ano|findstr "8000"

tasklist|findstr "4760"

taskkill /f /t /im java.exe

md文件转pdf?

VScode安装插件后可以转。

#