Intelligence without ambition is a bird without wings.

2016-09-29
fish

set

作用域

  • -U or –universal

    所有shell实例共享,立马生效,重启后仍然有效

Command Substitutions

( )来执行子命令

set os (uname)

其他

  • 更新补全数据

    fish_update_completions
    

实例

  • 设置变量,并执行命令

    env PORT=7000

参考

  1. http://fishshell.com/docs/current/tutorial.html
阅读此文

2016-09-29
crond

配置语法

1
2
3
4
5
6
7
8
# 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)
# | | | | |
# * * * * * command to be executed

| 特殊字符 | 代表意义 |
|———-+————————————————————————-|
| * | 代表任何时刻都接受的意思! |
| , | 0 3,6 command代表几个时段的意思。这个例子就是3:00和6:00 |
| - | 代表一段时间范围内,与逗号一样,只不过是连续的几个点,是’,’的特殊情况 |
| `
/n` | /5 command那个n代表数字,亦即是每隔n单位间隔,该位要用’‘先填补 |

特殊时间控制:

1
@reboot <COMMAND>

要点

  • 周与日和月不能同时存在,因为两个点指向的天不一定是同一天,指定了周,日和月都要置成,指定了月或日,周就要置成

  • %需要转义,默认用来表示后续字符作为命令的标准输入!

    date --date='-1 day' +"\%Y-\%m-\%d"

  • 指定shell

    SHELL=/bin/bash
    
  • 命令中不能使用sudo,除非修改/etc/sudoers中配置Defaults requiretty=>Defaults !requiretty

DEBUG

  • 重定向标准输出和出错到文件

    * * * * * <COMMAND> >>/tmp/crond.log 2>&1
    
阅读此文

2016-09-27
vim-gocode

  1. 安装

    mklink /d E:\Soft\Vim\setting\.vim\bundle\gocode E:\Soft\go\gopath\src\github.com\nsf\gocode\vim
    
阅读此文

2016-09-27
mysql-查看查询日志

  1. 修改配置文件

    sudo vim /etc/my.cnf
    
    general_log=1
    general_log_file=/var/log/mysql/mysql.log
    
  2. 创建相应文件

    mkdir -p /var/log/mysql/
    touch /var/log/mysql/mysql.log
    chmod 666 /var/log/mysql/mysql.log
    
  3. 重启mysql

    sudo systemctl restart mysqld
    
  4. 查看

    tail -F /var/log/mysql/mysql.log
    
阅读此文

2016-09-18
C++-变量

属性

  • 数据类型

    所有可能值的抽象,一种类型支持一组特定的操作

  • 内存大小

    存储该值所需要的存储空间大小

  • 变量名(可选)

    对变量进行引用的标识符

  • 变量存储的内容

  • 作用域

  • 对齐

  • 存储期

  • 生命期(跟存储期相关或临时)

参考

  1. http://en.cppreference.com/w/cpp/language/storage_duration
  2. http://en.cppreference.com/w/cpp/language/lifetime
阅读此文

2016-09-14
C++-初始化

概念

变量定义指定了变量的类型和标识符,同时可以指定初始值。

指定了初始值的对象称为是已初始化的。

两种初始化方式:

  1. 复制初始化,语法上用=表达,如int i = 1;

  2. 直接初始化,语法上用()表达,如int i(1);

    主要为了保持与C的兼容

初始化与赋值的区别

初始化是指创建变量,并设置初始值的过程,是在变量定义语句中完成的,对一个变量来说,只会发生一次!

而赋值是在变量初始化之后,进行值改写的过程,可以多次操作!

复制初始化

相比直接初始化,不能使用explicit修饰的构造函数和类型转换函数

复制初始化会先根据重载决定机制,调用相应的构造函数创建一个该类型临时对象,然后再调用复制构造函数来初始化该对象,最后临时对象析构函数被调用。

但C++标准运行复制省略(copy elision),GCC默认开启该功能,可通过(-fno-elide-constructors)来关闭该功能。

如果复制构造函数有副作用时(执行次数影响了程序状态),复制省略会影响程序正确性!

直接初始化

直接根据重载决定机制调用相应的构造函数,或相应的类型转换函数

参考

  1. http://en.cppreference.com/w/cpp/language/copy_elision
  2. https://en.wikipedia.org/wiki/Copy_elision
阅读此文

2016-09-12
C++11-final和override

final

  • 修饰class,阻止该class再被继承

  • 修饰virtual method,阻止该method再被重写

override

  • 修饰virtual method,说明该method是重写的

    能够更好地使用编译器检查出错误,以免定义出新method,而不是重写,从而导致非预期行为

总结

这两个关键字,都是非必需,但是都很有用!可以让开发者更准确地表达,同时编译器可以在编译阶段就发现该错误!

参考

  1. http://en.cppreference.com/w/cpp/language/final
  2. http://en.cppreference.com/w/cpp/language/override
阅读此文

2016-09-07
左值-右值

概念

最早起源于CPL语言(1960s)。

表达式的二个属性(类型,值类别)之一!

左值:可以寻址(Locate)的对象,根据是否可修改属性,分为可修改左值不可修改左值

右值:不是左值的对象(C/C++中,临时对象属于右值)

要点

  • 字符串常量是左值(不可修改的)!因为该数据存放在文本段,是有地址的!

  • 在C中,prefix increment(++)/decrement(–), assignment(=), compound assignment(+=…), comma(,), ternary conditional(? :)是右值!而在C++中却是左值!!!

参考

  1. http://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c
  2. http://en.cppreference.com/w/c/language/value_category
  3. http://en.cppreference.com/w/cpp/language/value_category
  4. http://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator
阅读此文

2016-09-06
C++11-右值引用

目的

  1. 实现移动语义(Move Sementics),减少不必要的临时对象的创建、拷贝、销毁(内存管理费时),极大地提升语言效率

  2. 完美转发(Perfect Forwarding),可以简洁地定义泛型函数

要点

  • 右值引用除了拥有左值引用的功能,还可以绑定到临时对象(rvalue),而(non const)左值引用不可以!

    1
    2
    A&  a_ref3 = A();  // Error!
    A&& a_ref4 = A(); // Ok
  • 右值引用类型既可以被当作左值也可以被当作右值,判断的标准是,如果它有名字,那就是左值,否则就是右值。

    为了确保move之后,不会被再次引用到。所以,有名字的变量是左值。

  • std::move可以将一个有名变量(左值)转换为右值引用

    该功能的意图是,该变量作为其他变量的值来源后,便不再使用该值,只用来被赋值或弃用。

    典型用途:

    1
    2
    3
    4
    5
    6
    7
    template<class T>
    void swap(T& a, T& b)
    {
    T tmp(std::move(a)); // a用来作为tmp的值来源
    a = std::move(b); // a被重新赋值
    b = std::move(tmp); // tmp不再使用
    }

    :若该类型不支持移动操作,则仍执行对应的拷贝或赋值操作。

参考

  1. http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/
  2. A Brief Introduction to Rvalue References
阅读此文

2016-09-05
慢速系统调用VS快速系统调用

描述

慢速或快速是从操作系统角度,来判断一个系统调用执行所需要的时间。

这个时间并无固定标准(非实时操作系统),而是取决于该调用执行的具体情况。

若该调用等待事件(TCP连接建立)或其他执行体操作(相对OS来说,比较耗时,如磁盘IO),则属于慢速系统调用。

反之,则属于快速系统调用,如getpidgettimeofday

为什么需要这样划分?

因为慢速系统调用,需依赖外部,则可以将其放入等待队列,无需调度。这样便提高了资源(CPU)利用率。

特性

  • 快速系统调用,被信号中断后,会自动重启,应用层无感知,
    而慢速系统调用(没有设置O_NONBLOCK)会出错返回(-1),errno=EINTR

参考

  1. http://unix.stackexchange.com/questions/14293/difference-between-slow-system-calls-and-fast-system-calls
阅读此文