2018年5月

git和svn不同,没有一个中央服务器用于存放代码,作为一个分布式的版本控制工具,每台主机都是一个仓库。

如果多个人之间要分享代码,就需要一台远程的仓库协助完成,git中通过git remote指令来完成这些操作。

使用git remote -v可以看到所有的远程主机:

> git remote -v
origin    git@github.com:maqianos/gitstudy.git (fetch)
origin    git@github.com:maqianos/gitstudy.git (push)

- 阅读剩余部分 -

一、分支介绍

分支是git的特性之一,它使得代码可以有多中不同的方向和代码路线,协作过程中彼此之间互不影响,大大增加了代码库的灵活性。

一般来说,项目的开发模型为:给定主分支master用于统筹所有代码,其他的功能拆散在子分支上开发,最后都合并到master。例如一个用于用户登录功能的代码库,用户A开启分支完成账户注册,用户B开启分支完成用户授权,两者在开发期间互不影响,开发完成后合并到主分支上合并完成总功能。

中间蓝色的表示主分支,上下两条表示子分支,子分支在初始时分离,最后都合并于主分支。

git中和分支相关的操作使用branch命令完成,最简单的用法就是git branch,它用于查看当前所在分支,加上-v选项显示详细信息。

显示的分支中默认只显示本地分支,如需显示远程分支要加上-a选项。

- 阅读剩余部分 -

一、crontab概述

crontab是linux平台下的定时任务,用于周期性执行任务,基本用法为:

  • crontab -e:编辑当前用户的任务。
  • crontab -l:查看任务是否配置成功。

使用crontab保存的任务配置文件位于/etc/crontab/var/spool/cron/$USER,前者是系统默认带有的,后面是每个用户单独出来文件,这两个文件中的配置都会生效。

默认的文件内容为:

pic_1805241153.jpg

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
 
# For details see man 4 crontabs
 
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

任务的格式如其中的注释所示,先是时间配置:分钟 小时 天 月 星期,然后是执行身份和执行的命令,满足条件后系统自动执行。要注意的事项是命令中最好不要带相对路径,否则可能会导致错误。

实际上使用crontab -e就相当于系统帮我们执行了vi /var/spool/cron/$USER,而crontable -l则等价于cat /var/spool/cron/$USER

二、配置文件的编写

每个整点执行ls:

0 * * * * root ls

每两分钟执行一次ls:

*/2 * * * * root ls

三、属于每个用户的crontab

每个用户都有一份crontab文件,在/var/spool/cron/$USER,正常情况下用户也是没有权限访问的,如果要设置属于用户的crontab,则需要通过crontab -e完成。

要注意的一个问题是:编辑属于用户的crontab时,不用再指定执行的用户了,默认就是以当前用户身份运行的。
0 1 * * * ls

习惯了svn的svn co,觉得git checkout不方便遂通过git的aliascheckout重命名为co

这个操作以前一直都是相安无事,今天在一台新机器上运行时遇到以下问题:

> git co
fatal: cannot exec ''git-co'': Permission denied
> git ss  # ss = status -s
fatal: cannot exec ''git-ss'': Permission denied

网上找了半天没有找到解决方案,并且发现不使用简写执行命令没有问题。

于是猜测可能是版本太低的原因,当前的版本是1.7,升级到2.17问题就不存在了,升级参考CentOS6.5源码安装Git

一、环境准备

Docker CE支持以下版本的Ubuntu操作系统:

  • Artful 17.10 (Docker CE 17.11 Edge +)
  • Xenial 16.04 (LTS)
  • Trusty 14.04 (LTS)

Docker CE可以安装在64位的x86平台或ARM平台上。Ubuntu发行版中,LTS(Long-Term-Support)长期支持版本,会获得5年的升级维护支持,这样的版本会更稳定,因此在生产环境中推荐使用LTS版本,本次安装的环境为Ubuntu 16.04

二、安装步骤

2.1 使用APT方式安装

卸载旧版本:

sudo apt-get remove docker \
    docker-engine \
    docker.io

- 阅读剩余部分 -

svn更新项目时出错Previous operation has not finished; run ''cleanup'' if it was interrupted

出现问题的原因是上一次更新或者提交代码操作未完成,此时需要根据提示进行cleanup操作:

- 阅读剩余部分 -

一、信号函数的理解

C语言中信号函数的原型为:

void (*signal(int signo, void (*func)(int)))(int);

这个函数定义看起来十分复杂,可以分为以下两步来理解:

首先看signal(int signo, void (*func)(int))部分,signal是一个函数,它的形参为一个int类型的signo和一个函数指针func。

除去形参部分后剩下的就是返回值了,即void (*)(int)这部分是返回值,它是一个函数指针——这个函数形参类型为int,没有返回值。

- 阅读剩余部分 -

使用exec族函数时抛出以下警告:

exec.c: In function ‘main’:
exec.c:8:3: warning: missing sentinel in function call [-Wformat=]
   if (execlp("/bin/ls", "/bin/ls", "-l", ".") == -1)
   ^

错误的原因在man page中找到:

The execv(), execvp(), and execvpe() functions provide an array of pointers to null-terminated strings that represent the argument list available to the new program.  The  first  argu‐ment, by convention, should point to the filename associated with the file being executed.  The array of pointers must be terminated by a null pointer.

- 阅读剩余部分 -

三者的区别:

  1. return作用于函数,使用return只是退出当前函数,而exit和_exit直接终止程序。
  2. return和exit在退出各自作用域前会自动刷新缓冲区,_exit不会刷新当前缓冲区。

例如以下代码的f函数中使用return,exit和_exit退出的结果都不一样。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void f() {
    printf("f1\n");
    printf("f2");
    return;
}

int main() {
    f();
    printf("main\n");
    return 0;
}

- 阅读剩余部分 -