递归 VS 迭代

很明显,用递归写出来的代码十分的简洁,然而递归却有一个致命的缺陷,那就是它的时间复杂度是N的指数级,并且会消耗大量的内存,使用不当还会导致爆栈. 比如: int func(int n){ if(n<=2) return n; int x = func(n-1) + f(n-2); return x; } 如果将递归换成迭代呢? int func(int n) { if (n <= 2) return n; int x = 1, y = 2, … “递归 VS 迭代”

Read More

C++14之初窥

之前C++标准委员会憋了好多年的大招,终于憋出了C++11.而且C++11也不负众望,带来了很多的新特性的同时也修补了许多C++原先的一些不足,比如右值引用的问题.而这次C++标准委员会却很快就通过了最新的C++14标准。 因此这次改动应该就只是修补了原先C++11上的一些不足,正如C++之父Bjarne Stroustrup所言: C++14 is simply the completion of the work that became C++11. When you finish a huge project, there are things you know need to be done, but you can’t add them if … “C++14之初窥”

Read More

扩展zsh

解释器的介绍 Shell是中脚本编程语言,常见的Shell解释器有sh,ash,csh,zsh,bash,fish等等,当然用的最多的就是sh和bash. sh sh的全称是Bourne Shell,由 AT&T 公司的Steve Bourne开发,为了纪念他,就用他的名字命名了.sh是 UNIX 上的标准 Shell,很多 UNIX 版本都配有 sh.可以说sh是第一个流行的 Shell 解释器.它常见于一些嵌入式或工业定制化内核版本的Unix/Linux中,比如路由器,交换机中. bash bash由 GNU 组织开发,保持了对 sh Shell 的兼容性,并扩展了许多语法功能, 因此针对sh编写的 Shell 代码可以不加修改地在 bash 中运行.bash则是作为各种Linux发行版的默认Shell解释器,比如CentOS/Debian/Ubuntu. 虽然在很大程度上bash可以作为一个正统的Shell,但它还是太弱了,常常能感觉到在终端中使用bash时的一些繁琐步骤,比如用cd命令一层层进入一个目录时的无奈感,当然你可以用tree命令显示一下目录结构,但有时文件太多也会显得无力. 所以是时候加强它了,就像是存在有vi的加强版vim,bash同样也有加强版,还不少,比如:csh,fish这些都是它的加强版. 其实我尝试用了zsh和fish,感觉都挺好,打个比喻的话,zsh那就像是一个Vim,可高度定制;而fish则有点像是IDE,直接就能用上许多牛逼的功能.但还是选择用了zsh,并不是说fish的定制不如zsh,而是我发现了一个牛逼的开源库Oh My Zsh. Oh My … “扩展zsh”

Read More

关于JS中的this

js中的this就是一个大坑,也是众所周知的一个坑. 由于this在js中晚绑定的特性,所以this可以是全局对象也可能当前对象,我擦,这简直就是一把双刃剑. 1.全局的this alert(this),这是全局的,但实际是undefined的. 2.局部函数的this function func(i){ this.i = i; } func(110); alert(i); //输出110 我了个大艹,什么时候i成了全局对象了呢?实际上应该是undefined. 3.作为对象方法的this var name = “Global”; var call = { name: “Caller”, message: function(msg){ console.log(this.name + “: ” + msg); } … “关于JS中的this”

Read More

关于界面和控制台以及终端三者间不得不理一下的关系

界面 界面其实分为图像界面和命令行界面,它的作用就是用来显示的信息与用户交互的.图像界面能显示文本和图像,丰富多彩;而命令行界面则智能显示文本字符串,略显单一. Consloe–控制台是虾米? Consloe,中文翻译为控制台.看中文名就知道它的作用是用来交互用的.确实,在Unix系统中,它叫做控制台终端,通常由显示器键盘等输入输出设备构成一个整体,并且/dev/console会与tty0相互关联. Terminal–终端是虾米? Terminal,中文翻译为终端.终端的作用是与用户交互,接收来自tty设备的输入. 终端的种类分为命令行终端与图形终端.显而易见的,命令行终端只能单调的显示文本字符,而图形终端则还能显示图像. 那么什么是tty呢? 其实tty也是个终端,只不过它是个虚拟终端.在早期打字机时代,对电传打字机(Teletype)的英文缩写就是tty,因此tty就成为了虚拟终端输入设备的简称.通常Unix系统下登录的终端有tty0-tty63,在登陆后会映射到某虚拟终端设备,比如tty1. 关于Shell,其实Shell就是一个用户操作系统的入口.Shell也分为图形Shell和命令行Shell.本质上它其实就是一个程序,加载了系统信息和本身的语法规则.比如有csh,zsh,bash等终端程序.对系统进行一些配置,终端启动后,系统会自动启动加载它们,然后我们其实就是在这些终端程序中进行操作. 总结 —————————— | CLI/GUI | | ——————– | | | Consloe/Terminal | | | | ————- | | | | | Shell | | | … “关于界面和控制台以及终端三者间不得不理一下的关系”

Read More

收集了一些在Linux下查看系统和硬件配置的相关命令

显示操作系统的相关信息: uname -a # 查看内核/操作系统/CPU信息 head -n 1 /etc/issue # 查看操作系统版本 cat /proc/cpuinfo # 查看CPU信息 hostname # 查看计算机名 lspci -tv # 列出所有PCI设备 lsusb -tv # 列出所有USB设备 lsmod # 列出加载的内核模块 env # 查看环境变量 uptime # 查看系统运行时间、用户数、负载 … “收集了一些在Linux下查看系统和硬件配置的相关命令”

Read More

了解DNS

DNS通讯协议 DNS服务通常使用53号端口,同时使用TCP协议和UDP协议. DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议. 什么叫区域传输? DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器. 在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息.当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息.这就叫做区域传输(Zone Transfer). 为什么既使用TCP又使用UDP? 这里就要先了解一下TCP与UDP的一个差异: UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节.当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送. 区域传送时使用TCP,主要有一下两点考虑: 1. 辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。 2. TCP是一种可靠的连接,保证了数据的准确性。 域名解析时使用UDP协议: 1. 客户端向DNS服务器查询域名,一般返回的内容都不超过512字节。 2. 不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。 虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。 DN解析记录 A记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录 CNAME记录: 如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务商提供的一个域名 MX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录 NS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录 TXT记录: 可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录 AAAA记录: 将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录 SRV记录: … “了解DNS”

Read More

Any.do和Wunderlist的使用感受

用Wunderlist这个任务清单应用有两个多了,年初的时候看到了有介绍,于是安装尝试了下。 此前一直是用Any.do这个任务清单的应用的,相比之下和感受Wunderlist有较大的区别: Any.do 可以无需登录,直接就离线就能使用;而Wunderlist则必须要登录才能使用 Any.do 遵循了Android Design,界面给人感觉十分清新,并且应用体积小;Wunderlist的界面仍旧是乔布斯时代的拟物风格,界面给我的感受是厚重 Any.do 的提醒相比Wunderlist要准时,不知是不是网络的问题,因为Wunderlist的服务器在美国 两则同样是后台驻守的情况下,Any.do更省电 Wunderlist的任务清单的设置规则相比 Any.do要多些,比如重复提醒的任务在Wunderlist中可以设置在某些特定的日期里不提醒 还是更喜欢Any.do,因为很喜欢它默认的提示铃声 ^_^

Read More

C下的__attribute__ 关键字学习

使用__attribute__关键字,首先需要编译器支持,现在绝大多数的编译器都是支持的. 其功能主要是用来在函数或数据声明中设置其属性. __attribute__可以设置函数属性(Function Attribute),变量属性(Variable Attribute)和类型属性(Type Attribute),格式为: _attribute__ ((attribute-list)) 功能有: 1. 错误检查. 函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大. 2. 返回声明. __attribute__((noreturn))就是告诉编译器这个函数不会返回给调用者,以便编译器在优化时去掉不必要的函数返回代码. 3. 字节对齐声明.如__attribute__ ((packed))就是高速编译器取消变量或者结构体成员在编译过程中的优化对齐,即按照实际占用字节数进行对齐. 指定字节对齐: struct Test_STU{ char a; int b; short c; }__attribute__(aligned(4)); 指定不对齐: struct Test_STU{ char a; int b; … “C下的__attribute__ 关键字学习”

Read More