自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不惜留恋_

活着不是给别人看的,做自己~~

  • 博客(96)
  • 收藏
  • 关注

原创 管理多个项目的 Git 配置文件

不同项目需要不同的配置文件, 那么怎么管理所有项目配置文件呢?

2022-06-29 12:50:30 644 1

原创 vim 的 markdown 预览

vim 实现 markdown 实时预览

2022-06-27 12:25:33 3452

原创 xargs 命令

xargs 的作用是什么?

2022-05-13 11:32:05 3745

原创 tmux 日常操作

为何使用 tmux远程登陆时,窗口与会话绑定,当窗口退出,会话退出。tmux 创建的会话,可以在窗口关闭时仍然存在,并且两次登陆时,可以重新链接会话。终端默认不能进行分屏操作。tmux 组织形式一个 session , 一个 session 包含多个 Window (每个 window 占据整个终端的大小),每一个 window 包含多个 panel (就是分屏)。session终端会话操作tmux new -s {session-name} 创建 sessiontmux ls 列出所有 s

2022-04-29 11:48:27 1829

原创 shell 命令集合的执行方式

如果一个命令以&结尾,那么这个命令会在子shell中异步执行,也被称为异步命令。当前shell不用等到子shell执行完成,这个异步命令的返回状态永远是0 ( 表示成功 )。如果多个命令通过;分隔,那么这些命令顺序执行,当前shell会等到所有命令执行完毕。这个命令集的返回状态就是最后一个命令的退出状态。如果多个命令通过&&分隔,例如 command1 && command2,只有当 command1 命令的退出状态为0时,才会执行 command2。如果多个命

2021-07-17 15:39:07 241

原创 shell 引用

引用是用来移除某些字符或者单词的特殊含义。shell 有三种引用机制:转义字符。也就是反斜线 \。单引号。双引号。转义字符转义字符大部分情况是用来保护它后面字符的字面值,例如美元符号在 shell 中可以用来引用一个变量,例如$ foo=hello$ echo $foohello但是如果我们想输入5美元这样的字符串 $5 呢?那就有点问题$ echo $5显示的结果是一个空行。如果想输出 $5 ,可以使用转义字符来保留美元符号的原本的值$ echo \$5$5转义字

2021-07-15 23:22:41 432

原创 Java 8 Stream 的 flatMap

Java 8 的 Stream 的 flatMap 有点难用言语表示,我记录一个工作中的例子,读取一个文件中的 key 和 value 值。我把文件的每一行用一个数组表示,然后获取对应的key, value,放到数组中String[] arrayOfWords = {"start line", "key=value", "end line"};List<String> keyValue = Arrays.stream(arrayOfWords) .filter(lin

2021-02-19 17:04:14 406

原创 Java 8 内置的函数接口

在使用Java 8 的Lambda表达式时,常常会因为不知函数接口的意思,而不能快速写出 Lamdda 表达式。有时候会自定义函数,并且参数是一个参数接口,我们可以直接使用Java 8内置的函数接口,而不必使用自定义的函数接口。综合这两方面考虑,我个从觉得,掌握所有的内置函数接口,还是有必要的。基本函数接口内置的函数接口有很多,如何快速记住呢?我们需要对这些接口进行分类。首先是基本接口,列表如下函数接口函数描述符Consumer<T>T -> Void

2021-02-19 15:43:06 205

原创 Java Comparable与Comparator

Comparable实现了 Comparable 接口类的对象,可以被用来排序。例如一个 Person 类实现了 Comparable 接口,如下public class Person implements Comparable<Person>{ public final String name; public final int age; public Person(String name, int age) { this.name = name;

2021-02-15 16:57:48 183 1

原创 shell 展开之进程替换

shell 展开中的进程替换可以说是非常难懂的一部分,它的语法为有两种>(list)或<(list)语法中的list为一个或多个命令,用分号分隔。这两种语法的进程替换都被展开为一个文件描述符 /dev/fd/63,区别在于 >(list) 只接受输入,而<(list) 只能作为输出。在 << The Linux Command Line>> 一书中提到了这样一个事,代码如下echo david | read userecho $user #

2021-02-03 16:19:50 657

原创 shell展开之波浪线展开

波浪线展开其实挺简单的,通过几个例子了解下cd ~~ 会展开为家目录,也就是$HOME值。cd ~/work~/work 会展开为家目录下的work目录,也就是$HOME/work值。cd ~david/work~david/work 会展开为david用户的家目录下的work目录 。cd ~+/work~+/work 会展开为当前目录下的work目录,也就是$PWD/work值。cd ~-/work~-/work 会展开为前个工作目录下的work目录,也就是$OLDPWD/

2021-02-03 15:09:58 582

原创 shell 展开之花括号展开

花括号展开的形式花括号展开看如下一个例子$ echo a{b,c,d}eabe ace adea{b,c,d}e 是花括号展开的一种形式,其中 a 表示前缀,e 表示后缀,{b,c,d} 依次和前缀后缀结合。还有一种形式如下$ echo a{b..d}eabe ace ade其中{b..d} 表示 b 到 d 的一个区间。这个区间也可以用整数来表示,如下$ echo a-{1..3}-ea-1-e a-2-e a-3-e如果在整数前面加上0,那就表示宽度填充,如下$ echo

2021-02-03 13:55:52 594

原创 shell 上传文件到 smb 服务器

无意间发现可以使用 smbclient 命令自动把文件上传到 smb 服务器,出于时间关系,下面只给出简短的脚本演示#!/bin/bashlocal_upload_dir="/home/david/test_dir"smbclient //192.168.0.888/server/ -u Anonymous -d 1 << _EOF_prompt offcd david/mkdir test_dircd test_dirlcd ${local_upload_dir}mput

2021-01-29 16:34:04 1245

原创 shell pwd 命令

如果当前工作目录中包含符号链接,pwd 默认并不会输出实际的工作路径,而如果想输出实际的工作路径 ,需要加上 -P 参数david@:test$ pwd/home/david/shell_work/c++_work/testdavid@:test$ pwd -P/home/david/c++_work/testdavid@:test$ pwd -L/home/david/shell_work/c++_work/test-L 是 logical 的意思,-P 是 physical 的意思,

2021-01-28 19:51:51 15569

原创 vim插件auto-pairs,实现引号、括号自动补全

用 vim 写代码时,我们会遇到这样的情况: 当输入一个前括号后,后面的相对应的括号不会自动补全。这个问题其实可以通过vim的映射做到,在 ~/.vimrc 中配置如下inoremap ' ''<ESC>iinoremap " ""<ESC>iinoremap ( ()<ESC>iinoremap [ []<ESC>iinoremap { {<CR>}<ESC>O配置这些之后,我们还会遇到另外一个问题,例如,当我们在双引

2020-12-11 14:02:09 2960

原创 Git 如何有逼格的查看文件状态

简化文件状态输出通常我们都是通过 git status 命令查看文件状态On branch master_devChanges to be committed: (use "git reset HEAD <file>..." to unstage) modified: dir1/hello.c new file: hello.o modified: world.cChanges not staged for commit: (use "git add &lt

2020-12-02 16:11:24 691

原创 Git 克隆仓库的小技巧

克隆仓库的名子如下命令会克隆一个仓库git clone https://github.com/JakeWharton/butterknife.git这个命令默认会在本地创建一个 butterknife 目录,如果你不想使用这个默认名子,可以使用如下命令换一个自己的名子git clone https://github.com/JakeWharton/butterknife.git MyBuffterknife这个命令会在本地创建一个名为 MyBuffterknife 目录用来存放仓库文件。克

2020-12-02 15:07:48 307

原创 使用 Git 模板来格式化提交信息

为不同项目配置 Git 提交信息模板

2020-12-02 14:10:02 397

原创 Java 泛型通配符

为何要使用泛型通配符根据里氏替换原则,我们通常是用基类的引用指向子类对象,例如class Shape {}class Circle extends Shape {}class Square extends Shape {}Shape shape = new Circle();对于泛型来说,下面的代码是错误的// 不支持这种泛型语法List<Shape> shapes = new ArrayList<Cirlce>();这种泛型语法被定义为错误的语法。由于泛型擦

2020-11-25 17:44:55 187

原创 Java泛型边界

上一篇文章 Java神秘的泛型擦除 中提到,泛型擦除会默认擦除到 Object 这个边界,因此可以在泛型对象上调用 Object 的任何方法,而不能实际泛型类型的方法。然而,泛型是可以通过 extends 指定边界的。通过指定边界,我们就不必再局限于只能调用 Object 的方法,我们现在就可以根据指定的边界做更多有意义的事情。interface IHello { void sayHello();}class Person<T extends IHello> { pri

2020-11-23 10:48:38 735

原创 Java神秘的泛型擦除

在学习Java泛型的时候,最重要的一个概念是泛型擦除,请看如下代码public class Holder<T> { private T item; public void set(T t) { item = t; } public T get() { return item; } public static void main(String[] args) { Holder<String

2020-11-20 17:53:08 122

原创 为何要使用Java泛型

Java 泛型一直被编程办所诟病,但是其实它也有优点,这促使我们使用泛型。假如有一个持有对象的容器类,我们想让它能够持有任何类型的对象,如下public class Holder { private Object object; public void set(Object obj) { object = obj; } public Object get() { return object; }}Holder 类使用 Object 类的对象来保存任何类型的对

2020-11-20 17:15:48 471

原创 Linux grep 命令

grep 是工作中最常使用的命令之一,但是有时候会有不同的搜索要求,例如不搜索某个目录,或者只搜索java文件,等等。grep 的内容其实挺多,但是本文只讲解日常工作中可能使用到的功能,然而如果你遇到了其它的一些不知道的功能,你可以查询 grep 手册来了解。语法grep 命令的语法如下grep [option...] [patterns] [file...]grep命令会输出匹配 pattern 的所有行,其中 pattern 默认使用的是 POSIX 的基本正则表达式。如果在 shell

2020-11-19 19:58:04 1244

原创 Shell 管道的退出状态

管道命令的退出状态是由最后一条命令的退出状态。如果通过 set 命令设置了 pipefail 选项,那么只要有一条命令退出状态非0,那么管道的退出状态就是这个命令的退出状态,否则退出状态为0.ls hello | echo "hello"echo "\$? = $?"如果文件 hello 不存在,那么退出状态为0。set -o pipefaills hello | echo "hello"echo "\$? = $?"如果文件 hello 不存在,退出状态为 ls hello 命令的退出

2020-11-04 17:27:40 1109

原创 Git 忽略不需要跟踪的文件

工作经历公司有时候把一些项目交给一些不熟悉Git的人来管理,他们从服务器下载了代码后,不去先执行Git仓库初始化,而是先去编译代码。代码编译完成之后,会生成很多中间文件(例如日志文件,临时文件等等),然后他们把代码,并且连带这些中间文件,一起提交了。我们下载了这个Git仓库代码,每交编译完成,通过Git查看状态,会发现一大堆的已修改的中间文件,非常碍眼。正确的方式应该是下载代码后,先初始化Git仓库,把代码纳入Git管理。再编译代码,查看生成的中间文件的,创建 .gitignore 文件来忽略这些中间文

2020-11-03 13:43:11 1670

原创 如何写好 Java equals 方法

文章目录前言操作符==equals 方法为什么要覆写equals方法equals 约定自反性对称性传递性一致性非空性写好 equals 方法如何比较比较的性能写 equals 的科学方法前言equals 方法是面试中一个常客,我以前面试的时候,被人问了一些比较刁钻的问题,但是我回答的并不是很好。这篇文章就对 equals 方法进行一个全方位的分析与总结。操作符==操作符 == 也是用于比较两个对象,如果比较的是基本类型,那么比较是对象的值,例如int a = 10;int b = 11;S

2020-10-29 20:38:21 999

原创 Java ArrayList vs. Vector

ArrayList 和 Vector 的比较是面试中一个常见的问题,要想回答得好,还需要下点工夫,本文来总结下它们之间的相似以及区别。相似点先看下相似点。首先我们都是由数组来实现的,并且它们都实现了 RandomAccess 接口,因此支持快速随机访问,也就是通过索引快速定位元素。因此从本质上来说,它们之间是可以能通用的。区别Vector 现在很少用到,这是因为它与 ArrayList 之间的区别造成的。线程安全Vector 是线程安全的类,因为它的大部分方法都是通过 synchronized

2020-10-26 22:53:10 185

原创 Java RandomAccess 接口有什么用?

文档上是这样描述这个接口的 Marker interface used by List implementations to indicate that they support fast (generally constant time) random access. The primary purpose of this interface is to allow generic algorithms to alter their behavior to provide good per

2020-10-22 19:43:57 474 1

原创 Bash中的索引数组和关联数组

Shell 不提供数组,Bash 提供了一维索引数组和一维的关联数组。索引数组什么是索引数组?通过整数索引访问的数组就是索引数组。例如echo $arr[0]在 Bash 中,数组创建的方式很奇怪,我们可以不声明数组变量,直接给数组变量赋值,即可创建数组,例如arr=( hello world )...

2020-10-15 17:55:45 548

原创 Ubuntu挂载设备

现在的Ubuntu系统挂载一个设备其实很容易,因为当把插入设备后,系统会自动挂载。对于硬盘挂载,我们通常希望它挂载到制定的目录下,例如家目录下的某个目录。本文以SD内存卡为例,描述下挂载的过程。首先通过 mount 命令就可以看到,这个SD卡已经被挂载到某个目录下$ mount/dev/sdc1 on /media/david/DEEPINOS type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,cod

2020-10-13 17:34:46 1415

原创 Linux find命令与xargs命令的珠联璧合

https://www.gnu.org/software/findutils/manual/html_mono/find.html#Invoking-xargs

2020-10-09 17:23:09 316

原创 Linux cut 命令

cut

2020-10-09 14:42:34 1027

原创 Linux ln命令

ln 命令用来创建链接,默认地,它会创建硬链接。如果加上 -s 选项,它会创建符号链接( 或软链接 )。ln 语法如下ln [OPTION]... TARGET... DIRECTORYln [OPTION]... -t DIRECTORY TARGET...ln [OPTION]... TARGETln [OPTION]... [-T] TARGET LINKNAME这四个语法其实都是一个意思,都表示在指定目录下为 TARGET 创建链接。前两种语法已经明显指定的了目录名。第三种语法省略了

2020-09-30 13:56:23 504

原创 Linux 中的df , du, free 命令

df 命令在工作中,一个项目至少需要200G的空间,但是硬盘的空间是有限的。如果不确定硬盘是否够用,可以使用 df 命令查看硬盘的使用情况。~ $ df 文件系统 1K-块 已用 可用 已用% 挂载点udev 12278348 0 12278348 0% /devtmpfs 2460160 3484 2456676 1% /run/dev/sda1

2020-09-27 13:58:00 613

原创 shell重定向之Here Documents和Here Strings

Here Documents语法[n]<<[-]word here-documentdelimiter如果省略n,那么 Here Documents 会把 here-document 读入到命令的标准输入中,否则读入到文件描述符 n 中。word 后面不能有空格,delimiter 前后都不能有空白字符(空格,制表符)。如果 word 不加引号,那么 delimiter 值与 word 值一样,并且 here document 中可以支持参数展开,命令替换,以及

2020-09-25 17:23:56 940

原创 vim中令人头疼的缩进该怎么配置

你应该遇到过在VIM中写代码,但是在其它编辑器中显示错乱的情况,这是因此没有对VIM进行正确的配置。高级语言配置首先介绍在VIM中写高级语言(c, c++, java)的配置。首先这些高级语言都是使用空格进行缩进的,因此需要在VIM中设置set expandtab把tab键转换为空格。其次,这些高级语言的代码中,一个tab键是代表4个空格的,所以需要设置set tabstop=4。最后,这些高级语言的自动缩进,也是使用4个空格,因此需要设置set shiftwidht=4。因此把这些设置项添加到

2020-09-25 14:03:58 1292

原创 Linux find 命令

find 命令是在指定目录下搜索文件或目录。例如find ~这个命令会列出家目录下的所有文件和目录。语法find 最常用的语法如下find [directory...] [expression]directory 表示要搜索的目录,可以有多个目录,expression 表示查询的条件。例如find work/ -name test.c这个命令是在work目录下搜索一个名为test.c的文件。expressionexpression 表示查询的条件,例如指定要查找的文件名。expre

2020-09-23 15:13:28 737

原创 PackageManagerService(2)扫描目录并解析APK

在 PackageManagerService(1)扫描前的准备 文章中,分析了 PKMS ( PackageManagerService ) 在扫描之前的准备工作,这篇文章来分析扫描目录并解析APK的过程。扫描目录并解析APK这个过程,伴随着大量升级相关的代码,但是我要提醒一句,我们现在分析的目标是系统首次开机,并不会把系统升级的代码混淆在一起分析。扫描目录,解析APK public PackageManagerService(Context context, Installer instal

2020-09-11 13:19:49 1314

原创 PackageManagerService(1)扫描前的准备

PKMS( PackageManagerService简称 )是一个系统服务,它的主要功能是解析APK并保存数据。由于在工作遇到过一些麻烦,最终的原因是由于对PKMS理解不够导致的,因此我决心把PKMS的源码重新并整理一次,以加深理解。由于PKMS的代码量非常大,为了缓存阅读文章的疲劳,我将分三步讲解,如下扫描APK前的准备工作。扫描目录并解析APK保存解析数据到文件。扫描前准备工作初始化本文只分析第一阶段的工作,扫描前的准备工作。由于代码量非常大,因此分段来分析 // framewor

2020-09-10 17:26:27 649

原创 Vim注释插件vim-commentary

在Vim中注释代码没有非常方便的快捷键,vim-commentary 提供了注释代码的操作符,它支持普通模式,可视模式,命令行模式。普通模式vim-commentary 所提供的注释操作符命令为 gc,那么就可以有如下的操作gcc注释光标所在的当前行。gcap注释段落。如果函数之间是用空行分隔的,那么gcap会注释光标所在整个的函数。可视模式使用可视模式选中几段代码,然后使用gc就可以注释选中的代码。命令行模式通过gc来注释代码,最常用的模式为普通模式和可视模式。作者为了插件功能的全面性

2020-09-01 17:34:44 2003

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除