Git hook

和其他 Version Control System 一样,git 也有方法来触发自定义脚本。

两类 hooks:

  • client hooks
  • server hooks

Installing a hook

hook 脚本在 hooks 子目录下,大部分是 .git/hooks 下。在使用 git init 之后就会初始化一些 sample 脚本,在 hooks 下都以 .sample 结尾,如果要使用则需要将 .sample 后缀去掉。

Client-side Hooks


pre-commit hook 会在输入 commit message 之前被执行。

通常可以在该 hook 中检查代码是否被提交,运行 test,代码格式检查,或者其他 lint 工具检查。如果脚本返回 non-zero 值会阻断 commit。


prepare-commit-msg hook 会在 commit message 编辑器被调用前,在默认 message 被创建后被触发。这可以使得你可以自定义默认 message。这个 hook 接受一些参数:

  • commit message 的文件路径
  • commit 类型
  • 如果是 amended 提交则包含 commit SHA-1


commit-msg hook 接受一个参数,可以在该 hook 中检查 commit message。


在整个 commit 结束后, post-commit hook 会执行。不接受任何参数。通常该 hook 用来发送一些通知。

Other Hooks

Server-Side Hooks


2015-11-21 git , git-hook , vcs

Java 查漏补缺之 throwable vs exception 区别

在 java 中 try catch 的时候,大多数情况下是使用的 Exception,但是今天看代码有些却 catch 了 Throwable,于是总结下。

看 JDK 源码知道 Throwable 是 Exception 的超类,也同样是 Error 的超类,所以可想而知,如果 catch 了 Throwable,那么会连同 Exception 和 Error 一同 catch,这样也不会丢异常。

  • Throwable 是所有异常的根,java.lang.Throwable
  • Error 是错误,java.lang.Error,Error 通常是不可恢复的错误
  • Exception 是异常,java.lang.Exception,Exception 通常是程序可恢复的

当程序发生不可控错误,抛出 Error 错误,与异常不同的是 Error 及其子类对象不应该被抛出。通常发生 Error 时需要介入处理。


2015-11-20 java , jdk , exception

Awesome vim plugin website collections

功能比较强大,比较重要的几个 Plugin 都在单独的文章中做了介绍,这里单独的列举一些特定场景使用的插件,带有语法高亮等的插件,比如针对 Nginx 配置, Dockerfile 文件等等的插件。


优化 nginx 配置

Plug 'chr4/nginx.vim'



Plug 'fatih/vim-go'


Plug 'kchmck/vim-coffee-script'
" CoffeeScript
Plugin 'mtscout6/vim-cjsx'


2015-11-03 vim , awesome , collection , collections

每天学习一个命令:tr 命令行届的翻译

tr 是 translate 的缩写。


translate SET1 to SET2


cat "abc" | tr a-z A-Z
cat "abc" | tr [:lower:] [:upper:]

将空白转换成 TABs

echo "a b" | tr [:space:] '\t'


echo ‘{abc}’ | tr ‘{}’ ‘()’ (abc)

delete set

删除 -d 指定的字符集

echo "abc" | tr -d 'a'


➜ echo "123abc123" | tr -d [:digit:]


➜ echo "emmmmmmmmmm   no" | tr -s [:space:] ' '
emmmmmmmmmm no %

squeeze repeats

echo "abbbbccccbd"  | tr -s a-z A-Z

使用 -c 补足


➜ echo "my id is 123" | tr -cd [:digit:]

单独使用 -c 选项则表示将 不是 SET1 中的内容,替换为 SET2 中内容

➜ echo 'abc123' | tr -c [:digit:] x


  • man tr

2015-11-02 linux , tr , command

lua installation

Install Lua in Linux

You can install lua in Linux Mint/Debian/Ubuntu.. You can find all verions of lua here.

tar zxf lua-5.3.1.tar.gz
cd lua-5.3.1
make linux test

Finally, if test have passed, then install lua into the right place by running sudo make install:

einverne@mint ~/Downloads/lua-5.3.1 $ sudo make install
[sudo] password for einverne:
cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.3 /usr/local/lib/lua/5.3
cd src && install -p -m 0755 lua luac /usr/local/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include
cd src && install -p -m 0644 liblua.a /usr/local/lib
cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1

According to the output, we know that lua header files are located under /usr/local/include. And liblua.a lib is located under /usr/local/lib. This two paths may be used later when coding with C/C++. And most important thing executalbe file is located under /usr/local/bin. Most of the Linux distributions are installed lua by default. But most of them don’t have liblua.a installed.

Install Lua on Mac OS X

If you want to build from source code like under linux, just change make linux test into make macosx test. And all the following steps are the same as I mentioned in the Linux section.

If you want a more convenient way to install lua, you can download binary package here. And click next and next to finish installation.Default installation path is same as in Linux.

And id you are using Homebrew just run brew install lua, everything is done.

And you can find more ways to install lua on

For other OS

please see:

Testing Lua

After installation , run lua -v to check the lua version. Test lua by printing “hello world” using following code. Run lua in terminal:

einverne@mint ~ $ lua
Lua 5.3.1  Copyright (C) 1994-2015, PUC-Rio
> print "hello world"
hello world

Type Control+D to exit.

lua IDE

If you want to find a lua IDE, I highly recommend Zerobrane Studio. It is cross-platform and support different versions of lua from 5.1 to lastest 5.3. And it has a debugger build-in, which is great for debug lua code from local or remote. It is worth to have a try.

2015-10-31 lua , linux

Things to do after install Linux Mint

I have changed my desktop environment to Linux, and after I tried Ubuntu and Debian, I finally choose the Linux Mint distribution. I think there are some reasons why this distribution take the first place in distrowatch. User-friendly desktop environment and convenient software package manager make me very comfortable. Cause it is based on the Debian and Ubuntu, most of the applications are familiar.

Install a theme

The simplest way to install a new Cinnamon theme is with the Themes manager in System settings.

Go to System Settings -> Themes -> Get More Online -> Refresh list. You can choose Most Popular or Latest. The theme will be installed to your hidden folder ~/.themes

Dark Blue Glass

I highly recommend my modified Dark Blue Glass theme link. It is a mix of Dark Glass and mint numix blue theme. Or you can find more themes on the following sites:


You can install a new icon set in two ways. One is by adding a PPA. You add the PPA, install the icon set. But you won’t find icon sets for all the icon themes. Therefore, the other way round is to download the compressed file and extract it to ~/.icons or ~/.local/share/icon . If this directory doesn’t exist, create one using the following command:

mkdir ~/.icons

The icons extracted in the above directory will be available for the current user only. If you want the icons to be available for all the users, you should extract the icons to /usr/share/icons .

Now, once you have installed the icon set, you can use a Unity Tweak Tool to change the icon theme. Use the following command to install Unity Tweak Tool:

sudo apt-get install unity-tweak-tool

Or in Linux mint you can just change icons under setting -> theme -> icons.

I highly recommend this one: papirus icons

sudo add-apt-repository ppa:varlesh-l/papirus-pack
sudo apt update
sudo apt install papirus-icons

Software Sources

You didn’t need to edit/etc/apt/sources.list and files under /etc/apt/sources.list.d/ mannually. All customs can be changed through UI. Just click “start menu” and choose the “Software Sources”. And this application can even custom the PPAs.

linux mint software sources managers

Necessary applications


First is web browser, and of course Chrome. I am crazy about Google, and all Google related things. I have used Chrome since year 2011, after I am tried of the Firefox’s slowness. Although Firefox become more and more light, faster this years, I get used to Chrome. And what Chrome done makes me really happy. First thing is the bookmark and extension etc sync. I can reach all of my staff and customizations, after I login into my account. I don’t even need to worry about anything. All my Apps, Extensions, Settings, Autofill informations, History, Themes, Bookmarks, Passwords, and even Open tabs always follow my account. I can reach my opening tab on desktop from my Android phone. I can reopen bookmarks on my home laptop, which I added in my laboratory computer. And I can open chrome://history page to check all current opening tags from signed-in devices, and even check the unread article in the opening tab on my phone and browser all my chrome history.

sogou input method

It is necessary to have an input method for typing Chinese which I speak. I choose the sogou input method, because it is easy to use and have a very Good word dictionary. Sogou input method is based on fcitx. In Linux mint setting panel, we have the Language setting, we can choose to install fcitx components.

More detail information can be found in this blog article.

Following can be done through user interface, no need to run. Pasting here only for reference.

sudo apt-get install fcitx fcitx-table-wubi-large fcitx-frontend-all fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-frontend-qt4 fcitx-config-gtk fcitx-ui-classic fcitx-module-kimpanel fcitx-module-dbus fcitx-libs-qt
sudo apt-get install fcitx fcitx-bin fcitx-config-common fcitx-config-gtk fcitx-data fcitx-frontend-all fcitx-module-cloudpinyin fcitx-module-dbus fcitx-module-kimpanel fcitx-module-x11 fcitx-modules fcitx-qimpanel-configtool

After installation, “start”, “Fcitx Configuration” can config the input method, just add “Sogou Pinyin” to the panel.


Use to cross China’s great firewall. Don’t need to talk more.

 pip install shadowsocks # install command line tool

If pip is missing, install pip first.

PPA is for Ubuntu >= 14.04.

sudo add-apt-repository ppa:hzwhuang/ss-qt5
sudo apt-get update
sudo apt-get install shadowsocks-qt5

To install Qt version of shadowsocks. From:GitHub.

Nvidia driver

“System settings” , “Driver Manager”, choose the right latest driver and install. After installation, you will find Nvidia icon at the right-bottom corner. Double click the icon to open the setting panel. In order to save the battery , you can use Intel(Power Saving Mode) for most time. And if choose NVIDIA(Performance Mode) for high performance need.

Nvidia driver


Install hardinfo tool to check hardware information through GUI

 sudo apt-get install hardinfo

System tools

If there is no special instruction, all of the following applications can be installed from the Software Manager in Linux Mint.

gnome do

As it official introduction said “Do things as quickly as possible (but no quicker) with your files, bookmarks, applications, music, contacts, and more!”. I set a shortcut Alt+Space to launch Gnome do. And you can just type several keys to start any application quickly.

install following package:

  • gnome-do
  • gnome-do-plugins


Use F12 to open a terminal. Dropdown terminal, you can right click the terminal after you press F12 to configure your guake.


“PlayOnLinux is a front-end for wine. It permits you to easily install Windows Games and software on Linux. It is advised to have a functional internet connection.” I use playonlinux to install Evernote and cloudmusic(网易云音乐). Although I met a lot of problems during installation of Evernote. But finally evernote 5.8.x can be installed on wine 1.7.x.

There are several packages you need to install to make PlayOnLinux work.

  • wine
  • wine mono
  • wine gecho
  • ttf-mscorefonts-installer


Most of the following can be installed from default Software Manager. Just type name of the application and search then click install.


cloud music client and my favourite music client. Here is the link to it’s official site, where you can found clients for all platforms include linux.


my favourite cloud notebook with a very clean Android client.


Linux mint 17 has a default screenshot software called Screenshot. It is a very simple screenshot software. Shutter is more powerful.


Sync all my files. When I installed Dropbox through it’s offical installer, there was a problem I cannot connect to Dropbox directly from China. Here is a solution to redirect connections to shadowsocks sock5 proxy. You should install proxychains.

sudo apt install proxychains
# config socks4 9050  To socks5 1080 which is the default of shadowsocks
vi /usr/local/etc/proxychains.conf
# then use proxychains to start dropbox
proxychains4 dropbox start -i

Then dropbox will start to start and install, then after installation you can set sock5 proxy in dropbox settings.


Baidu pan linux port. It is really a great work. Thank the author.

You can download here


Remote desktop connection client able to display and control a remote desktop seesion. It supports multiple network protocols in an integrated and consistant user interface. Currently RDP, VNC, NX, XDMCP and SSH protocols are supported.


linux firewall.


E-book manager, 电子书管理. It is very efficient when you plug in kindle using USB port Calibre is prepare to serve.


Evernote like cloud notebook client. Find more information here. You can install through PPA:

$ sudo add-apt-repository ppa:wiznote-team
$ sudo apt-get update
$ sudo apt-get install wiznote


one of the screenrecoders I use.


Best image and picture manager ever from Google.

audacity audio editor

record and edit audio files

kdenlive video editor

non-linear video editing suite.

WPS Office for Linux

Office software include writer, spreadsheets and presentation.


Password manager. But I prefer LastPass.

youdao dict

This client really make me impressed. It is faster and simple than any other platform client. Launch it with Gnome do, and use it to check English word is a very happy work. Someone used to recommand me the StarDict, but I think youdao dict is a better choice for me.


Elegant, powerful, clean dock.

Or there is another choice Cairo Dock.

ntfs configuration tool

Install this tool using this command:

 sudo apt-get install ntfs-config

and you can find NTFS Configuration Tool in the menu. It is a very efficient tool to auto mount windows NTFS partitions. You can setup to auto-mount when your Linux mint start up. It is really useful if you have a second hard drive installed and you want it to auto-mount each time you restart your system.

smplayer or vlc

video player always need one. Personally, I like smplayer more.

Nuvola Player 3

You can follow the instruction on it’s official site. It was great, espcially when you want to listen to music at Google Play Music, or other cloud stream music. It support a lot of services, like Amazon Cloud Player, Play Music, Plex Music, Spotify, Tuneln, etc.


Birdie is beautiful Twitter client for GNU/Linux.

PPA (14.04) Birdie can be installed from our PPA, which provides automatic updates whenever we improve the application.

$ sudo add-apt-repository ppa:birdie-team/stable
$ sudo apt-get update
$ sudo apt-get install birdie

from it official site:


all the detail information can be found at it’s official site.

$ sudo add-apt-repository ppa:mc3man/trusty-media
$ sudo apt-get update
$ sudo apt-get install ffmpeg


Remote control application. I need it to help to connect my mac in lab and other Windows machine. You can download here. And because it is cross-platform. You can install in other OS and connect it easily.

Programming tools


Use apt-get search vim to search related vim packages, you will find several packages,like vim-gtk, vim-gnome etc. Install vim and vim-gtk package to install vim and gvim. And config my vim with my dotfile,


best version control system. And I am using SmartGit.



Sublime Text

Text Editor. Later I found Atom which is also great.


markdown editor.

eclipse with jdt and cdt

sometime need java and c++ IDE for test.


install boost library from source using the following code:

 sudo apt-get install libboost-all-dev

all boost library is located at /usr/include/boost

Android Studio

Check official site for more information.


Python IDE

ZeroBrane Studio



Sqlite manager



You can have your local weather forecast in desktop.

Desktop Capture

Screenshot and screencasting tools which saves me a lot of time.

I have created a list in Youtube, you can check it for information.

2015-10-24 linux , linux-mint , applications

在 Linux 下安装字体

Most of computer fonts people using are TrueType fonts. TrueType fonts end with .ttf, which stand for TrueType Font. This tutorial shows how to install TrueType fonts in Linux (Debian, Ubuntu, Linux Mint, etc).

Linux 字体文件夹

Linux 下默认安装的字体都被存放在 /usr/share/fonts 下。

如果是个人使用可以将字体文件拷贝到 ~/.fonts 目录中。所有支持的字体文件路径可以通过系统的 /etc/fonts/fonts.conf 文件查看到。


# create an index of scalable font files for X
# create an index of X font files in a directory
fc-cache -fv



# 查看中文字体
fc-list :lang=zh

General way to install TrueType fonts

All of the TrueType fonts are under /usr/share/fonts/truetype, simplest way is to copy ttf file to this directory and give it the right permission. For example, if you want to install Ubuntu font family manually. You can download the font file from official site.

In the terminal, download the package:


unzip the file into directory ubuntu-font-family-0.80


and then use copy command to copy all the files to /usr/share/fonts/truetype,/usr/share/fonts directory and sub directory need root to write, so you should add sudo before command. The -r paramater represent recursive, it means all the files under ubuntu-font-family-0.80 will be copied to the right place.

 sudo cp -r ubuntu-font-family-0.80/ /usr/share/fonts/truetype/

finally, you shoulde give this directory and all the ttf under this directory right permission. All the new fonts now can only be used by root. We need to change the permission to let all the users to use these fonts:

 sudo chmod 755 /usr/share/fonts/truetype/ubuntu-font-family-0.80/ -R

then, refresh the font cache to let system detect these fonts:

 fc-cache -f -v

Install new fonts only for current user

As I mentioned in the first part, if you copy the ttf file to /usr/share/fonts directory, all the users can use these new fonts. But if you only want to provide these fonts to specific user, like current login user , you can just copy the file to ~/.fonts directory. If there is no such directory, just create it. The ~ stand for current user’s home directory, full path is /home/<username>. So repeat the operation to install Ubuntu font family:

mkdir ~/.fonts
cp -r ubuntu-font-family-0.80/ ~/.fonts/
fc-cache -fv

Install microsoft core fonts

Microsoft Core Fonts include these fonts:

  • Andale Mono
  • Arial Black
  • Arial (Bold, Italic, Bold Italic)
  • Comic Sans MS (Bold)
  • Courier New (Bold, Italic, Bold Italic)
  • Georgia (Bold, Italic, Bold Italic)
  • Impact
  • Times New Roman (Bold, Italic, Bold Italic)
  • Trebuchet (Bold, Italic, Bold Italic)
  • Verdana (Bold, Italic, Bold Italic)
  • Webdings

Debian/Ubuntn/Linux Mint user just open terminal and run these command:

sudo apt-get install ttf-mscorefonts-installer

or Linux Mint user can find this package in the Software Manager, just search it and click install.

Install Chinese fonts

.ttf files are the English fonts, while .TTF files are Chinese fonts. If we check the C:\Windows\Fonts under Microsoft Windows, there are 3 kind of fonts. One is the .fon fonts, which is the DOS system font, and other two fonts are .ttf and .TTF. We can just make a copy of all .ttf and .TTF file and copy all the files to /usr/share/fonts/ directory under Linux. Although it is illegal under Microsoft’s TOC, but we can still do it. :)

If you dual boot your computer, mount the Windows and copy the files

sudo mkdir /usr/share/fonts/truetype/WindowsFonts
sudo cp -r /media/Windows/Fonts/*.ttf /usr/share/fonts/truetype/WindowsFonts/
sudo cp -r /media/Windows/Fonts/*.TTF /usr/share/fonts/truetype/WindowsFonts/

Install open source Chinese fonts, like 文泉驿 - 微米黑 文泉驿 - 正黑

sudo apt-get install ttf-wqy-microhei ttf-wqy-zenhei

several Chinese font we can choose:

To check more about Chinese font visit Arch wiki


Install Software Manager under Linux Mint

Linux Mint user can find a font manager under Software Manager. It is really a cool tool to manager your fonts.

List all available fonts

fc-list is a quick and handy command to lists fonts and styles available on the system for applications using fontconfig. You can use fc-list to find out whether particular language font is installed or not.

To list all font faces:

$ fc-list

To lists font faces that cover Chinese language:

$ fc-list :lang=zh

Output will be all available Chinese fonts.

Fix WPS for Linux font missing error

After I installed WPS for Linux under Linux Mint 17.2, I met this problem, “系统缺失字体 symbol、wingdings、wingdings 2、wingdings 3、wedding”. According to the copyright, WPS for Linux doesn’t contains these five fonts. You can only find these five fonts and install them in the right place like I said before. One way to find these fonts is to find them in Microsoft Windows system. And another way is to download these files from Internet and install.

Install Korean fonts

Use following command to search Korean font

apt-cache search korean font

and use this command to install Korean font to linux:

sudo apt-get install fonts-unfonts-core fonts-unfonts-extra



  • Sans-serif 无衬线体 = 黑体:并不是具体一款字体,而是一类字体,选择它其实等于选择这类字体中优先级最高的那款字体。
  • Serif 衬线体 = 白体:同上
  • Monospace 等宽字体,意思是字符宽度相同:同上
  • 点阵字体 位图字体



For more information check Debian page Arch wiki and Ubuntu wiki

2015-10-21 linux , linux-mint , fonts , font , truetype

git presentation

之前做过一个简单的 git 的介绍,下面是 PPT 的摘录。

What is Git

Git is a free and open source distributed version control system(VCS) designed to handle everything from small to very large projects with speed and efficiency.

Git 是一个分散式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于 2005 年以 GPL 发布。最初目的是为更好地管理 Linux 内核开发而设计。Linus Torvalds 自嘲的取名“git”,该词源自英国俚语,意思大约是“混账 1”。


Version Control Example

Microsoft Word 如果你用 Microsoft Word 写过长篇大论,那你一定有这样的经历:

想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的 Word 文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的 Word 文档变成了这样:


Undo Windows: Ctrl+z Mac: Command+z


Version control has a very long histroy.

  • Source Code Control System (SCCS)
  • 1972, closed source, free with Unix
  • Revision Control System (RCS)
  • 1982, open source
  • Concurrent Versions System (CVS)
  • 1986-1990, open source
  • Apache Subversion (SVN)
  • 2000, open source

BitKeeper SCM

  • 2000, closed source, proprietary
  • distributed version control
  • “community version” was free
  • used for source code of the Linux kernel from 2002-2005
  • Controversial to use proprietary SCM for an open source project
  • April 2005: the “community version” not free anymore

Git is born

  • April 2005
  • created by Linus Torvalds
  • replacement for BitKeeper to manager Linux kernel source code
  • distributed version control
  • open source and free software
  • compatible with Unix-like systems (Linux, Mac OS X, and Solaris) and Windows
  • faster than other SCMs (100x in some cases)

Git become popular, GitHub launched in 2008 to host Git repositories:

  • 2009: over 50,000 repositories, over 100,000 users
  • 2011: over 2 million repositories, over 1 million users


Git 是一种分布式版本控制,不需要服务器端软件也可运行

  • 不同用户维护自己的版本库,而不是和核心版本库交换数据
  • 追踪 “change sets” 或者 ”patches”
  • 无需网络,随时随地进行版本控制
  • 分支的新建、合并非常方便、快速,没有任何成本,基本不耗时

Who use Git?

anyone wanting to track edits

  • review a histroy log of changes made
  • view differences between versions
  • retrieve old versions

anyone needing to share changes with collaborators

anyone not afraid of command-line tools


  1. 只能跟踪文本文件的改动,二进制文件不行,也就是说 如果使用 Git 追踪 Word ,版本控制系统并不知道改动了那些行,只能知道二进制变化了。


    • HTML, CSS, JavaScript
    • PHP, Ruby, Ruby on Rails, Perl, Python, ASP
    • Java, C, C++, C#, Objective-C
    • ActionScript, CoffeeScript, Haskell, Scala, Shell scripts

    not as useful for tracking non-text files

    • images, movies, music, fonts
    • word processing files, spreadsheets, PDFs
  2. 编码问题,如果在多平台使用请千万使用 UTF-8 编码

    使用 Windows 的童鞋要特别注意: 千万不要使用 Windows 自带的记事本编辑任何⽂文本⽂文件。原因是 Microsoft 开发记事本的团 队使⽤用了⼀一 个非常弱智的⾏行为来保存 UTF-8 编码的⽂文件,他们⾃自作聪明地在每个⽂文件开头添 加了 0xefbbbf(⼗十六进制)的字符,你会遇到很多不可思议的问题,比 如,网页第一⾏行可 能会显⽰示⼀一个“?”,明明正确的程序⼀一编译就报语法错误,等等,都是由记事本的弱智⾏行 为带来的。建议你下载 Notepad++ 代替记事本,不但功能强⼤大,而且免费!记得把 Notepad++ 的默认编码设置为 UTF-8 without BOM 即可


  • Linux

sudo apt-get install git or sudo yum install git

  • mac

brew install git

  • windows

Git basic

在开始使用 Git 之前有些配置

git config --global "John Doe"  # 配置提交用户名
git config --global  # 配置提交邮箱

git init
git status
git add filename
# 暂存区
git commit -m “"
git log

commit message best practices

  • short single-line summary ( less then 50 characters 或者 小于 25 个汉字)
  • optionally followed by a blank line and a more complete description
  • keep each line to less than 72 characters
  • write commit messages in present tense, not past tense
    • “fix bug” or “fixes bug”, not “fixed bug”


git branch <branchname>
git checkout <branchname>
git checkout -b <branchname>

git push origin <branchname>

git push origin --delete <branchname>


git remote add origin
git push -u origin master
git remote show origin


git tag     # list all tags
git tag v0.9
git tag -a v1.0 -m “my version 1.0"
git show tag name #show tag details
git push origin tag name
git push origin --tags

git GUI




git config --global status
git config --global checkout
git config --global commit
git config --global branch
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'

GitLab server


2015-10-12 git , linux , version-control

Java 中时间相关处理工具类库 joda time

注意如果使用 Java SE 8 及以上,建议使用 java.time (JSR-210) 来代替使用 Joda-time。

Java 中日期,时间处理类库 Joda time



最新的版本官网查看 1


5 个最常用的 date-time 类:

  • Instant - Immutable Class,用来表示时间轴上一个瞬时的点
  • DateTime - Immutable Class,用来替换 JDK 的 Calendar 类
  • LocalDate - Immutable Class,表示一个本地的日期,而不包含时间部分(没有时区信息), 适合表示出生日期
  • LocalTime - Immutable Class,表示一个本地的时间,而不包含日期部分(没有时区信息), 适合表示商店的每天开门 / 关门时间
  • LocalDateTime - Immutable Class,表示一个本地的日期-时间(没有时区信息)




表示时间间隔,是一个半开区间,包括开始时刻,但不包括结束时刻。结束时刻永远要大于或者等于开始时刻。有两个实现 Interval 和 MutableInterval


表示持续时间,用 milliseconds 表示,duration 通常从 interval 中获取。

instant  +  duration  =  instant


一段时间,通常比如三年五个月两天 7 小时。他和 Duration 的区别在于,Period 是不精确的(在 milliseconds 级别)。比如有一个月的时间段,那么在二月一号加上一个月会得到三月一号,而在三月一号加上一个月,会得到四月一号,但是这两个 duration(in milliseconds)是完全不一样的。

instant  +  period  =  instant

有两个实现 Period 和 MutablePeriod



DateTime dateTime1 = new DateTime();
DateTime dateTime2 = new DateTime(2015,11,11,0,0,0);
DateTime dateTime3 = new DateTime(1447171200000L);
DateTime dateTime4 = new DateTime(new Date());
DateTime dateTime5 = new DateTime("2015-11-11T00:00:00.000+08:00");


Joda Time 中的 LocalTime 表示的是一个没有日期的时间


Interval 和 Period

Joda-Time 为时间段的表示提供了支持。

  • Interval:保存了一个开始时刻和一个结束时刻,因此能够表示一段时间,并进行这段时间的相应操作
  • Period:保存了一段时间,比如:6 个月,3 天,7 小时这样的概念。可以直接创建 Period,或者从 Interval 对象构建。
  • Duration:保存了一个精确的毫秒数。同样地,可以直接创建 Duration,也可以从 Interval 对象构建。

JDK8 中的时间相关

因为 Joda Time 非常稳定可靠,在 JDK 8 以前成为了 Java 处理时间相关的事实标准,JDK 8 中引入了 java.time 等一组新 api 用来处理时间日期,遵守 JSR 310,弥补了 Java 在时间处理方面的不足。Joda-Time 的作者 Stephen Colebourne 和 Oracle 一起共同参与了这些 API 的设计和实现。

JDK 8 以前 Date 和 Calendar 类存在的问题:

  • 非线程安全,需要额外的代码来处理线程安全问题
  • 接口设计,之前的接口处理 day-to-day 操作困难
  • 时区相关时间,需要额外处理


  • Instant 时刻
  • Duration
  • LocalDate 日期,2015-01-01
  • LocalTime 时间
  • LocalDateTime 日期和时间 2015-01-01T14:02:43.455

基本上他们的接口定义都是 ofXX 来构造一个实例,而通过 parseXX 来将一个现有的时间戳转变成对应的实例。



2015-10-11 java , joda-time , jdk8

wget 常用命令

wget 是一个非常常用的下载命令,但其实 wget 非常强大,这里就列举一些很常用的选项。



wget -r -np
wget -r --no-parent --reject "index.html*"


  • -r 表示 recursively 递归下载
  • -np 或者 --no-parent 表示不延伸到父目录,当想要下载特定目录下的文件时,记得加上这个选项

当然如果你的目的非常单纯只是想备份网站,之前也写过一篇 Httrack 备份全站 的文章。


使用 -A 或者 -R

wget -A jpg,pdf http://site
wget --accept jpg,pdf http://site

wget -R "index.html" http://site


  • -A 或者 --accept 后面接逗号分割的后缀或者模式,表示下载接受的文件格式,或者符合正则表达式的内容
  • -R 或者 --reject 表示不下载匹配的



在使用 wget 备份网站目录时可能遇到网站路径编码下载到本地之后乱码的情况,这个时候需要使用 --restrict-file-names=nocontrol


有些时候可能要离线文档用来在本地浏览,这个时候需要用到 -k

wget --mirror --convert-links --adjust-extension --page-requisites
wget -mkEpnp


  • -m 或者 --mirror 镜像网站,这个选项会开启递归和时间戳,并且保持目录结构,等效于 -r -N -l inf --no-remove-listing
  • -k 或者 --convert-links 表示将连接转成 localhost,方便本地浏览
  • -E 或者 --adjust-extension 表示会根据文件的 MIME 类型,将一些文件调整为 HTML 等等后缀,方便在不同的 WEB 服务器中托管
  • -p 或者 --page-requisites 会将任何 HTML 页面显示需要的资源都下载下来,包括 images,sounds,css,js 等等


wget 使用选项 --limit-rate 来限制速度:

wget --limit-rate=423k

单位是 bytes per second,如果要表示 kiloBytes,在结尾加上 k .


使用 --tries=70 来自定义重试次数,默认情况下 wget 会重试 20 次。

2015-10-03 wget , curl , linux , linux-command , backup



  • 解决 Clash for Windows 节点测速 timeout 问题 [[Clash for Windows]] 使用过程中一直没有什么问题,但是昨天心血来潮把 Clash for Windows 从 0.18.8 升级到了最新版本(0.20.5) ,然后发现节点全部 timeout。但可以排除的是这些节点肯定是可以用的,因为在手机上是完全没有问题的。
  • Arc 浏览器初印象 很早之前就在 Twitter 上看到有人分享了 Arc 浏览器的使用体验,说是非常惊艳,我就稍微的浏览了一下官网,抱持怀疑的态度先注册了一下体验,一直好奇到了 2022 年能够在浏览器上做出什么样的创新,自 Chrome 横空出世以来,快,安全迅速抢占了浏览器市场。剩下的一点点份额被 Firefox,Safari,Edge,[[Vivaldi]] 等等占据,早两年的时候我也写过一篇标题略微耸动的文章 —- 我可能要抛弃用了很多年的 Chrome 改用 Vivaldi ,但事实是 3年多过去了,我日常用的还是 Chrome,虽然 Google 在浏览器插件,隐私等等问题上这两年来一直被诟病,但至少还没有彻底地激怒我这个用户。
  • 使用开源 Wakapi 代替 WakaTime 统计编码时间 之前折腾 GitHub Profile 的时候发现了 [[WakaTime]] 这样一款统计编码时间的工具,之后在读 waka-readme 项目的时候发现,还有两个完全开源的后端兼容版本,一个是 Golang 编写的 [[wakapi]] ,一个是 Huskell 编写的 hakatime 。
  • 使用 WakaTime 统计编码时间 [[WakaTime]] 是为程序员打造的编码统计 Dashboard,可以同来统计项目,编程语言,IDE,编码时间等等内容。 之前在折腾 GitHub Profile 的时候发现的,可以在 GitHub Profile 页面中动态的展示最近的编程状态。
  • 折腾一下 GitHub Profile 虽然很早就知道 GitHub 发布了 Profile 功能,可以使用 README 来丰富 Profile 页面。但是一直以来没啥动力,大多数时候都不会去到主页去访问。但现在有些时候逛 GitHub 的时候会点到 其他人 的主页去看,发现有一些主页虽然只有寥寥几句,但却可以清楚的知道「他/她」最近在贡献什么内容,擅长什么技能。虽然我在 GitHub 上还是观摹大佬居多,但也想着通过这个契机在整理 GitHub Profile 的时候加深一下对自己的认知。