C-pointer

    前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧: int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针 int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针. int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据 Int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针 int *(*p(int))[3]; //可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数. 说到这里也就差不多了,我们的任务也就这么多,理解了这几个类型,其它的类型对我们来说也是小菜了,不过我们一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用,这上面的几种类型已经足够我们用了. 一、细说指针 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 1.

    Php-operation-mode

    code exec $源代码(人认识); // 执行源代码 exec $字节码(解释器认识); // 执行字节码 exec $机器码(硬件认识); // 执行机器码 php code exec *.php; // 执行php源代码 if(!exist($opcache)) { // 是否存在opcache字节码 init $opcode; // zend编译生成opcode字节码 $opcache = $opcode; // 生成opcache字节码缓存 } exec opcache; // php解释器执行opcache字节码缓存 exec 机器码; // 执行机器码 php jit if(!exist(机器码)) { // 是否存在机器码 init 机器码; // jit编译生成机器码 } exec 机器码; // 执行机器码

    Nginx-param-and-sign

    官方文档:http://nginx.org/en/docs/control.html nginx参数和信号 nginx参数 COMMAND ILLUSTRATE -c 为 Nginx 指定一个配置文件,来代替缺省的。 -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。 -v 显示 nginx 的版本。 -V 显示 nginx 的版本,编译器版本和配置参数。 nginx信号 Master进程能够接收并处理如下的信号: COMMAND ILLUSTRATE ERM, INT (快速退出,当前的请求不执行完成就退出) QUIT (优雅退出,执行完当前的请求后退出) HUP (重新加载配置文件,用新的配置文件启动新worker进程,并优雅的关闭旧的worker进程) USR1 (重新打开日志文件) USR2 (平滑的升级nginx二进制文件) WINCH (优雅的关闭worker进程) Worker进程也可以接收并处理一些信号: COMMAND ILLUSTRATE TERM, INT (快速退出) QUIT (优雅退出) USR1 (重新打开日志文件) nginx 启动、停止、重启命令 nginx启动 sudo /usr/local/nginx/nginx (nginx二进制文件绝对路径,可以根据自己安装路径实际决定) nginx从容停止命令,等所有请求结束后关闭服务 ps -ef |grep nginx kill -QUIT nginx主进程号 nginx 快速停止命令,立刻关闭nginx进程 ps -ef |grep nginx kill -TERM nginx主进程号 如果以上命令不管用,可以强制停止

    Vim-keybindings

    vim 快捷键 vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim)。vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率。vi是“visual interface”的缩写,vim是vi IMproved(增强版的vi)。在一般的系统管理维护中vi就够用,如果想使用代码加亮的话可以使用vim。 vi有3个模式:插入模式、命令模式、低行模式 插入模式:在此模式下可以输入字符,按ESC将回到命令模式。 命令模式:可以移动光标、删除字符等。 低行模式:可以保存文件、退出vi、设置vi、查找等功能(低行模式也可以看作是命令模式里的)。 进入vi的命令 - vi filename :打开或新建文件,并将光标置于第一行首 - vi +n filename :打开文件,并将光标置于第n行首 - vi + filename :打开文件,并将光标置于最后一行首 - vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处 - vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename - vi -o/O filename1 filename2 … :打开多个文件,依次进行编辑 vi 关闭文件 > :w //保存文件 :w vpser.net //保存至vpser.net文件 :q //退出编辑器,如果文件已修改请使用下面的命令 :q! //退出编辑器,且不保存 :wq //退出编辑器,且保存文件 移动光标类命令 > h :光标左移一个字符 l :光标右移一个字符 space:光标右移一个字符 Backspace:光标左移一个字符 k或Ctrl+p:光标上移一行 j或Ctrl+n :光标下移一行

    Scale

    Scale 1英文字符(word,字符) = 2byte;[ASCII, Unicode, UTF-8] 1中文字符 = 2byte(B) [ASCII,Unicode]; 1中文字符 = 3byte(B) [UTF-8]; 1B(byte,字节) = 8 bit(见下文); 1KB(Kibibyte,千字节) = 1024B = 2^10 B; 1MB(Mebibyte,兆字节,百万字节,简称“兆”) = 1024KB = 2^20 B; 1GB(Gigabyte,吉字节,十亿字节,又称“千兆”) = 1024MB = 2^30 B; 1TB(Terabyte,万亿字节,太字节) = 1024GB = 2^40 B; 1PB(Petabyte,千万亿字节,拍字节) = 1024TB = 2^50 B; 1EB(Exabyte,百亿亿字节,艾字节) = 1024PB = 2^60 B; 1ZB(Zettabyte,十万亿亿字节,泽字节) = 1024EB = 2^70 B; 1YB(Yottabyte,一亿亿亿字节,尧字节) = 1024ZB = 2^80 B; 1BB(Brontobyte,一千亿亿亿字节) = 1024YB = 2^90 B;

    Linux release

    Linux release Linux发行版 基础版本 衍生版本 基于Debian Debian Linux Mint Knoppix MEPIS sidux CrunchBang Linux Chromium OS Google Chrome OS 基于Red Hat Red Hat Enterprisa Linux Fedora CentOS Scientific Linux Oracle Linux 基于Mandriva Mandriva Linux PCLinuxOS Unity Linux Mageia 基于Gentoo Gentoo Linux Sabayon Linux Calculate Linux Funtoo Linux 基于Slackware Slackware Zenwalk VectorLinux 其他 SUSE Arch Linux Puppy Linux Damn Small Linux MeeGo Slitaz Tizen StartOS Unix与类Unix OS 基础版本 衍生版本 UNIX System V家族 A/UX AIX HP-UX IRIX LynxOS SCO OpenServer Tru64 Xenix Solaris OS/2 BSD UNIX-386BSD家族 BSD/OS FreeBSD NetBSD NEXTSTEP Mac OS X iOS OpenBSD SUN OS OpenSolaris UNIX-Like GNU Linux Android Debian Ubuntu Red Hat Linux Mint Minix QNX GNU/Linux GNU/Hurd Debian GNU/Hurd GNU/kFreeBSD StartOS 其他 DOS MS-DOS Windows React OS

    Lock

    #lock 悲观锁(Pessimistic Lock): 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(Optimistic Lock): 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。 乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。 两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。 但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

    Mongodb-command

    Mongo shell 一. 数据库常用命令 二. Collection聚集集合 三. 用户相关 四. 聚集集合查询 五. 索引 六. 修改. 添加. 删除集合数据 七. 语句块操作 八. 其他 一. 数据库常用命令 1. Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help(); rs.help(); 切换/创建数据库 use yourDB; //当创建一个集合(table)的时候会自动创建当前数据库 查询所有数据库 show dbs; 删除当前使用数据库 db.dropDatabase(); 从指定主机上克隆数据库 db.cloneDatabase('127.0.0.1'); //将指定机器上的数据库的数据克隆到当前数据库 从指定的机器上复制指定数据库数据到某个数据库 db.copyDatabase("mydb", "temp", "127.0.0.1"); //将本机的mydb的数据复制到temp数据库中 修复当前数据库 db.repairDatabase(); 查看当前使用的数据库 db.getName(); db; //db和getName方法是一样的效果,都可以查询当前使用的数据库 显示当前db状态 db.stats(); 当前db版本 db.version(); 查看当前db的链接机器地址 db.getMongo(); 二.