代码之旅

I love Coding !

linux命令Tee

Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。

阅读全文 »

linux命令sed

sed 是linux 中的流式编辑器,用于过滤和修改文本。sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:

  1. 每次仅读取一行内容;
  2. 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
  3. 将执行结果输出。
  4. 当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。
阅读全文 »

java quickstart

在开始学习java语言之前,先了解Java的一些特性:

  • 简单:语言简单,方便掌握语言特性,快速展开工作。
  • 面向对象: 面向对象的编程模型。
  • 分布式:支持分布式网络环境运行。
  • 健壮:java的目的是创建可靠的软件,提供了编译时检查,运行时检查。通过GC简化开发自己对内存的管理。
  • 安全:通过在语言和运行时系统中设计的安全功能,Java技术使您可以构建无法从外部入侵的应用程序。
  • 体系结构中立,可移植:Java技术旨在支持将部署到异构网络环境中的应用程序。在这样的环境中,应用程序必须能够在各种硬件体系结构上执行。字节码是一种中立的体系结构,是将代码有效地传输到多个硬件和软件平台的中间格式。此外Java通过严格定义基本语言,将可移植性进一步提高了。
  • 解释型:解释和运行系统已经被移植在任何机器上,Java解释器可以直接执行Java字节码。
  • 高性能:Java解释器可以全速运行而无需检查运行时环境,从而实现了卓越的性能。自动垃圾收集器运行作为一个低优先级后台线程,确保大概率下的更好的性能和内存可用。
  • 多线程:Java多线程功能提供了构建具有许多并发活动线程的应用程序的方法。因此,多线程为最终用户带来了高度的交互性。Java平台通过添加复杂的同步原语来支持语言级别的多线程:语言库提供了 Thread类,运行时系统提供了监视和条件锁定原语。此外还有高层级的库api提供同步功能
  • 动态:Java编译器在编译时静态检查方面非常严格,而语言和运行时系统在其链接阶段是 动态的。类仅在需要时链接。新的代码模块可以按需链接到各种来源,甚至可以来自网络上的各种来源。

James Gosling和Henry McGilton撰写的白皮书 The Java Language Environment中解释了上述每个流行词 。

Java开发过程:

  1. 首先将所有源代码编写为以.java扩展名结尾的纯文本文件。
  2. 然后,将这些源文件由javac编译器编译为.class文件。
  3. .class文件中是Java虚拟机的机器语言(字节码)。然后,Java虚拟机实例运行java应用程序。

Java平台包含两个组件:Java虚拟机和Java应用程序编程接口(API).虚拟机用于执行java程序,sdk 提供了系统库和部分高级API库。

阅读全文 »

shell命令集合

收集了一些工作中常用的shell命令的使用

MACOS 使用 GNU 工具

Mac OS X自带的sed等命令行工具是基于BSD的,有一些缺陷和不足,可以安装gnu命令行工具来替代Mac自带的这些常用工具。

preinstall

在安装GNU工具前,确保mac 已安装 HomeBrew,安装方法见链接。

install

  1. 首先安装最重要的--GNU Coreutils

GNU Coreutils包含了UNIX最基本的命令,如ls,cat等。

1
$ brew install coreutils

为了使用默认工具名字,例如使用 ls 而不是 gls 来执行ls命令。需要在bashrc或zshrc配置文件中加上下面这段配置。

1
2
3
4
5
6
7
8
if brew list --formula | grep coreutils > /dev/null ; then
export PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
export MANPATH="$(brew --prefix coreutils)/libexec/gnuman:$MANPATH"
# GNU ls 设置
alias ls='ls -F --show-control-chars --color=auto'
# 设置ls命令使用的环境变量LS_COLORS
eval `gdircolors -b $HOME/.dir_colors`
fi
  1. 其他命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
brew install binutils
export PATH="/usr/local/opt/binutils/bin:$PATH"

brew install ed
export PATH="/usr/local/opt/ed/bin:$PATH"

brew install findutils
export PATH="/usr/local/opt/findutils/libexec/gnubin:$PATH"

brew install gawk
brew install gnu-indent
export PATH="/usr/local/opt/gnu-indent/libexec/gnubin:$PATH"

brew install gnu-sed
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

brew install gnu-tar
export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"

brew install gnu-which
export PATH="/usr/local/opt/gnu-which/libexec/gnubin:$PATH"

brew install grep
export PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

brew install gnutls
brew install gzip
brew install screen
brew install watch
brew install wdiff
brew install wget

帮助命令

man

Linux man中的man就是manual的缩写,用来查看系统中自带的各种参考手册,但是手册页分为好几个部分,如下所示:

  • 1 Executable programs or shell commands
  • 2 System calls (functions provided by the kernel)
  • 3 Library calls (functions within program libraries)
  • 4 Special files (usually found in /dev)
  • 5 File formats and conventions eg /etc/passwd
  • 6 Games
  • 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
  • 8 System administration commands (usually only for root)
  • 9 Kernel routines [Non standard]

在shell中输入man+数字+命令/函数即可以查到相关的命令和函数。若不加数字,那Linux man命令默认从数字较小的手册中寻找相关命令和函数。
例如:我们输入man ls,它会在最左上角显示LS(1),在这里,LS表示手册名称,而(1)表示该手册位于第一节章,同样,我们输入man ifconfig它会在最左上角显示IFCONFIG(8)。man是按照手册的章节号的顺序进行搜索的,比如:man sleep,只会显示sleep命令的手册,如果想查看库函数sleep,就要输入:man 3 sleep

whatis

可以使用whatis命令是用于查询一个命令执行什么功能,并将查询结果打印到终端上。

1
2
3
4
5
6
[root@nfs-server ~]#whatis cd
cd (1p) - change the working directory
cd [builtins] (1) - bash built-in commands, see bash(1)
#从上文的输出结果我们看到cd命令是bash的内建命令,它的功能是改变当前目录,可以在1和1p的章节中查看它的帮助。
$ man 1 cd
$ man 1p cd

tldr

tldr项目地址

tldr=Too Long; Didn't Read,它简化了烦琐的man指令帮助文档,仅列出常用的该指令的使用方法。相比较man给出完整的帮助文档而言,大多数情况下,给出几个指令的使用demo可能正是我们想要的。tldr会在本地存储文档库,所以需要安装到本地。有多种客户端,例如python,node。mac用户可以直接用brew install tldr安装。

使用方法: tldr [command],例如 tldr tar

除了TLDR,相似的命令还有cheateg

cht.sh

cht.sh是在线版的TLDR+Cheat,此外,还支持了多种编程语言。

1
2
3
4
5
# 安装cht.sh 客户端脚本
PATH_DIR="$HOME/bin" # or another directory on your $PATH
mkdir -p "$PATH_DIR"
curl https://cht.sh/:cht.sh > "$PATH_DIR/cht.sh"
chmod +x "$PATH_DIR/cht.sh"

使用例子:

1
2
3
4
5
6
7
8
9
# 命令
$ cht.sh tar

# 编程语言
$ cht.sh go reverse a list

# 交互式启动
$ cht.sh --shell
cht.sh> go reverse a list

常用命令

工具

Polysh

Polysh 是一个交互式命令,可以在一台服务器上批量的对一批服务器进行处理,运行交互式命令。

1
2
wget http://guichaz.free.fr/polysh/files/polysh-0.4.tar.gz
tar -zxvf polysh-0.4.tar.gz

新版维护在github上https://github.com/innogames/polysh

Id

id命令用于显示用户的ID,以及所属群组的ID。id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示当前用户  ID (UID), group ID (GID) and groups
$ id
# 显示指定用户 ID (UID), group ID (GID) and groups
$ id username

# 显示当前UID
$ id -u
# 显示当前用户名
$ id -u -n

# 显示当前 GID
$ id -g
# 显示当前 group名
$ id -g -n

numfmt

numfmt用于数字和可阅读的形式的相互转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 数字转可读形式
# 1k = 1000
$ numfmt --to=si 1000
1.0K
# 1k = 1024
$ numfmt --to=iec 2048
2.0K

# 可读形式转数字
$ numfmt --from=si 1K
1000
$ numfmt --from=iec 1K
1024

# 1024K转换可预读形式
$ numfmt --from-unit K --to=iec 1024
1.0M
$ numfmt --from=iec --to-unit=K 1M
1024

thefuck

ubuntu安装:

1
2
3
4
sudo apt update
sudo apt install python3-dev python3-pip python3-setuptools
pip3 install thefuck --user
# edit .zshrc, 添加环境变量 export PATH="$PATH:~/.local/bin/"

macos安装:

1
2
brew install thefuck
# edit .zshrc, 添加环境变量 export PATH="$PATH:~/.local/bin/"

trash-cli

1
2
3
4
# ubuntu
sudo apt install trash-cli
# macos
brew install trash-cli

给 rm 设置一个别名来不使用它

1
alias rm='trash-put'

如果你真的要用 rm,那就在 rm 前加上斜杠来取消别名:

1
\rm file-without-hope

sdk manager

sdk manager,一般都支持安装,删除,切换sdk。

pyenv

python sdk manager。

1
2
3
4
# ubuntu
curl https://pyenv.run | bash
# macos
brew install pyenv

修改.zshrc:

1
2
3
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

sdkman

java,scala 系列的sdk manager。

1
curl -s "https://get.sdkman.io" | bash

修改.zshrc:

1
2
3
#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

nvm

node sdk manager。

1
2
3
4
# ubuntu
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
# macos
brew install nvm

修改.zshrc:

1
2
3
export NVM_DIR="$HOME/.nvm"
[ -s "/usr/local/opt/nvm/nvm.sh" ] && \. "/usr/local/opt/nvm/nvm.sh" # This loads nvm
[ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/usr/local/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion

ubuntu tweak

ubuntu 日常开发机的调整记录

阅读全文 »

Hexo Next tag插件

Tag Plugin 是一种使 Hexo 支持特殊样式内容的方法。例如,我们无法在标准 Markdown 中显示具有自定义尺寸的图像。然后我们可以使用标签插件来解决它。 Hexo 有很多可以帮助用户的标签。 Hexo 还具有主题接口,使主题能够创建自己的标签。

阅读全文 »

My Effective Git

git 配置

设置用户名和密码

1
2
git config --global user.name "xxx"
git config --global user.email "xxx@example.com"

查看配置和所在文件

1
git config --list --show-origin

远程分支绑定

使用git在本地新建一个分支后,需要做远程分支关联。如果没有关联,在执行git pull, git push操作时就需要指定对应的远程分支。

1
git branch --set-upstream-to=[remote_repo]/[remote_branch]  [local_branch]

git 显示中文

1
git config --global core.quotepath false

.gitignore

在工作区根目录下创建“.gitignore”文件,文件中配置不需要进行版本管理的文件、文件夹。“.gitignore”文件本身是被纳入版本管理的,可以共享。有如下规则:

  • #开头为注释。
  • 可以使用Linux通配符。
    • 星号(*)代表任意多个字符,
    • 问号(?)代表一个字符,
    • 方括号([abc])代表可选字符范围,
    • 大括号({string1,string2,…})代表可选的字符串等。
  • 感叹号(!)开头:表示例外规则,将不被忽略。
  • 路径分隔符(/xxx)开头:,表示要忽略根目录下的文件xxx。
  • 路径分隔符(xxx/)结尾:,表示要忽略文件夹xxx下面的所有文件。

常见gitignore 配置: https://github.com/github/gitignore

git 命令

查看变更

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#简洁模式查看本地仓库状态
$ git status -s

# 查看所有可用的历史版本记录(实际是HEAD变更记录),包含被回退的记录
$ git reflog

# 查看日志(最近20条),不带参数-n则显示所有日志
$ git log -n20
## 参数“--oneline”可以让日志输出更简洁(一行)
$ git log -n20 --oneline
## 参数“--graph”可视化显示分支关系
git log -n20 --graph
## 显示某个文件的版本历史
git log --follow [file]

# 以列表形式显示指定文件的修改记录
git blame [file]

My Effective Zsh

Zsh是比Bash更好用的Shell。

zsh

install

macos 可以使用 HomeBrew安装Zsh

1
brew install zsh

ubuntu 可以使用 apt安装Zsh

1
sudo apt install zsh

切换默认shell

在macos中切换默认shell:

1
2
3
4
5
echo $SHELL
/bin/bash
$ which zsh
/usr/local/bin/zsh
$ chsh -s /usr/local/bin/zsh

如果遇到 chsh: /usr/local/bin/zsh: non-standard shell 问题,可以修改 /etc/shells,在文件中添加一行/usr/local/bin/zsh

linux的操作和macos类似

ohmyzsh

ohmyzsh是zsh的管理工具。

install

使用安装脚本,安装ohmyzsh。

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

内置插件开启

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# .zshrc
plugins=(
# 内置插件: 输入alias-finder搜索定义的别名,并输出与输入命令匹配的任何别名
alias-finder
# 内置插件: 使用z命令快速跳转历史浏览路径。
z
# 内置插件: 连按两次ESC,在命令行前自动添加 sudo
sudo
# 内置插件: 回到上次工作目录
last-working-dir
# 内置插件: 使用wd命令添加路径书签,快速跳转。
wd
# 内置插件: 提供对git支持
git
# 内置插件: history 命令
history
# 内置插件: 提供快速解压功能,输入`x`解压。
extract
# 内置插件: 提供对ubuntu支持
ubuntu
# 内置插件: 提供对docker支持
docker
# 内置插件: 提供对macos支持
macos
# 内置插件: 提供对maven支持
mvn
)

tweak

history显示时间

1
2
# .zshrc
HIST_STAMPS="yyyy-mm-dd"

git 项目打开慢

Oh My Zsh 为终端增加了自动跟踪 git 仓库变化的能力,其实是在检测到当前目录是在 git 管理的目录中时,执行了一系列的操作来获取到变化。但是往往会导致终端长时间无响应,或卡顿。

1
2
3
4
#通过设置标识关闭 dirty 检查
git config --add oh-my-zsh.hide-dirty 1
#若需要打开,则:
git config --add oh-my-zsh.hide-dirty 0

第三方插件

1
2
3
4
5
6
7
8
plugins=(
zsh-history-substring-search
zsh-autosuggestions
fzf
zsh-syntax-highlighting
git-open
zsh-completions
)

安装插件

1
git clone https://github.com/zsh-users/zsh-history-substring-search ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-history-substring-search

激活插件

1
plugins=( [plugins...] history-substring-search)

通过cat -v 命令查看上下键的符号表示,然后绑定键位:

1
2
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

使用:

  • 键入任何先前命令的任何部分
  • 使用刚才绑定的键上下翻找目标命令
  • control+u 终止搜索

fzf

官方地址

1
2
3
4
# ubuntu
sudo apt install fzf
# macos
brew install fzf
  • CTRL-T -将选定的文件和目录粘贴到命令行上
  • CTRL-R -从历史记录中将所选命令粘贴到命令行上
  • ALT-C -进入所选目录

fzf-tab-completion

在使用tab键补齐时,使用fzf查找。

在macos上还需要安装依赖:

1
brew install gawk grep

安装插件:

1
2
3
4
5
6
7
8
git clone https://github.com/lincheney/fzf-tab-completion.git ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/fzf-tab-completion
#then edit ~/.zsh file.
source $HOME/.oh-my-zsh/custom/plugins/fzf-tab-completion/zsh/fzf-zsh-completion.sh
# 添加配置
## only aws command completion
zstyle ':completion:*:*:aws' fzf-search-display true
## or for everything
zstyle ':completion:*' fzf-search-display true

zsh-syntax-highlighting

zsh 语法高亮

官方地址

1
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

zsh-autosuggestions

zsh基于历史和补齐的推荐。

官方地址

1
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

git open

在浏览器中打开git项目

官方地址

1
git clone https://github.com/paulirish/git-open.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/git-open

zsh-completion

zsh补齐扩展。

官方地址

1
git clone https://github.com/zsh-users/zsh-completions  ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-completions

shell 配置

iterm2 集成

参考iterm2官方文档安装下载脚本。

1
2
# zsh
curl -L https://iterm2.com/shell_integration/zsh -o ~/.iterm2_shell_integration.zsh

然后在.zshrc中增加配置:

1
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh" || true

only for macos

proxy alias 设置

1
2
3
4
proxy="127.0.0.1:7890"
alias setproxy="export https_proxy=http://${proxy};export http_proxy=http://${proxy};export all_proxy=socks5://${proxy};echo \"Set proxy successfully\" "
alias unsetproxy="unset http_proxy;unset https_proxy;unset all_proxy;echo \"Unset proxy successfully\" "
alias testproxy='curl -vv https://www.google.com'

一个成功的 Git 分支模型

在这篇文章中,我将向你们介绍一个开发模型,早在差不多一年前,我已经将这个模型应用于我的多个项目,而事实证明,这个模型是非常成功的。其实这篇文章我早就打算写了,只是一直没有时间,直到现在。在这篇文章中我将不会谈及任何项目细节,分支策略和发布管理才是本文的核心内容。

阅读全文 »