摘要: 因为 HTTP 协议是无状态的,所以很久以前的网站是没有登录这个概念的,直到网景发明 cookie 以后,网站才开始利用 cookie 记录用户的登录状态。cookie 是个好东西,但它很不安全,其中一个原因是因为 cookie 最初被设计成了允许在第三方网站发起的请求中携带,CSRF 攻击就是利用阅读全文
posted @ 2016-07-12 20:13 紫云飞 阅读(55) 评论(0) 编辑
摘要: 随着近些年社交网站的流行,越来越多的人学会了“刷”网页 ── 刷微博,刷朋友圈,刷新闻,刷秒杀页。这里的“刷”,就是刷新的意思,在浏览器里,你可以通过点击刷新按钮,或者用快捷键,或者移动端的下拉操作来进行刷新。 但普通网民不知道的是,通过刷新操作导致的页面加载和通过其他操作(比如点击页面链接,地址栏阅读全文
posted @ 2016-07-06 20:02 紫云飞 阅读(130) 评论(0) 编辑
摘要: 1997 年,IE 4.0 发布,带来的众多新特性中有一个对未来“影响深远”的 DOM API:document.all。在随后的 6 年里,IE 的市场占有率越来越高,直到 2003 年的 95%。 在这段时间里,产生了两种成千上万的页面。第一种:IE only 的页面,由于超高的市场占有率,开发阅读全文
posted @ 2016-06-26 20:29 紫云飞 阅读(631) 评论(0) 编辑
摘要: 温馨提示:本文目前仅适用于在 Chrome 51 及以上中浏览。 IntersectionObserver API 是用来监视某个元素是否滚动进了浏览器窗口的可视区域(视口)或者滚动进了它的某个祖先元素的可视区域内。它的主要功能是用来实现延迟加载和展现量统计。先来看一段视频简介: 再来看看名字,名字阅读全文
posted @ 2016-06-13 18:57 紫云飞 阅读(135) 评论(0) 编辑
摘要: 很久以前,addEventListener() 的参数约定是这样的: 后来,最后一个参数,也就是控制监听器是在捕获阶段执行还是在冒泡阶段执行的 useCapture 参数,变成了可选参数(传 true 的情况太少了),成了: 去年年底,DOM 规范做了修订:addEventListener() 的第阅读全文
posted @ 2016-06-01 14:08 紫云飞 阅读(158) 评论(0) 编辑
摘要: https://jeffmo.github.io/es-trailing-function-commas 目前是一个 stage 3 的提案,Chakra 和 JSC 已经实现了,它允许我们在函数定义时的最后一个形参和函数调用时的最后一个实参的尾部加上逗号。 最后一个参数加上逗号有什么优点? 注意:阅读全文
posted @ 2016-05-30 19:24 紫云飞 阅读(156) 评论(0) 编辑
摘要: 即便 Bash 没有从父进程继承任何的环境变量,Bash 自己也会创建三个环境变量,分别是:$ env -i bash -c exportdeclare -x OLDPWDdeclare -x PWD="/"declare -x SHLVL="1"SHLVL如果父进程传递了 SHLVL 环境变量,那...阅读全文
posted @ 2015-11-27 14:13 紫云飞 阅读(185) 评论(0) 编辑
摘要: 每个 C 程序都有一个 main 函数,每个 main 函数都有一个 argv 参数,这个参数是一个字符串数组,这个数组的值是由该 C 程序的父进程在通过 exec* 函数启动它时指定的。很多人说 Bash 中的 $0 的值就是 bash 这个 C 程序在它的 main 函数中获取到的 argv[0...阅读全文
posted @ 2015-11-27 11:32 紫云飞 阅读(145) 评论(0) 编辑
摘要: 我们知道,Bash 在执行一个外部命令时,会先 fork() 一个子进程,然后在子进程里面执行 execve() 去加载那个外部程序。fork 子进程是会耗性能的,所以 Bash 会在下面几种情况下不 fork 子进程,直接在当前进程执行 execve()。bash -c 'command'如果用了...阅读全文
posted @ 2015-11-13 21:42 紫云飞 阅读(148) 评论(0) 编辑
摘要: 今天无意发现下面这个表现:$ env -i bash -c cdbash: line 0: cd: HOME not set$env -i bash -c 'echo $HOME'这表明了,Bash 只会从环境变量中继承 HOME 变量,从来不自己初始化它?为了证实这个想法,我去翻了下源码,发现其实...阅读全文
posted @ 2015-11-12 16:59 紫云飞 阅读(93) 评论(0) 编辑
摘要: 你有没有留意过下面这种场景:$lsfile1 file2 file3 file4 file5$ ls | catfile1file2file3file4file5单独执行 ls 时,它的输出是一行多个文件名,在它后面接个管道的话,它的输出就变成了一行一个文件名,这是为什么呢?这种表现的原理是:ls ...阅读全文
posted @ 2015-11-02 17:05 紫云飞 阅读(107) 评论(0) 编辑
摘要: Bash 4.4 中新增了一种 ${...} 语法,长这样:${parameter@operator}。根据不同的operator,它展开后的值可能是parameter 这个参数的值经过某种转换后的值,又可能是关于 parameter 参数自身的某种信息。这句话太抽象了,还是看下面的详细解释吧。op...阅读全文
posted @ 2015-10-28 21:10 紫云飞 阅读(152) 评论(0) 编辑
摘要: 在 Bash 中,有两个内置命令用来控制 Bash 的各种可配置行为的开关(打开或关闭),这些开关称之为选项(option)。其中一个命令是 set,set 命令有三种功能:显示所有的变量和函数;修改 Bash 的位置参数;控制 Bash 的第一套选项。可见 set 命令完全违背了“一个命令只干一件...阅读全文
posted @ 2015-10-27 15:29 紫云飞 阅读(242) 评论(0) 编辑
摘要: 在 Bash manual 里叫 Word Splitting,在 Posix 规范里叫 Field Splitting,这两者指的是同一个东西,我把它翻译成“分词”,下面我就说三点很多人都忽略掉(或者说从没仔细考虑过)的分词细节。1. 分隔符到底是字符还是字符串?IFS 里面可以包含多个字符,那么...阅读全文
posted @ 2015-10-21 17:07 紫云飞 阅读(174) 评论(0) 编辑
摘要: read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已:$ read name1$echo "$name"1$ read1$ echo "$REPLY"1当没有指定变量名时,read 会给默认的变量 REPLY 赋值,仅此而已。然而今天我却发现个细微的区别(下面为了显示...阅读全文
posted @ 2015-10-19 17:49 紫云飞 阅读(114) 评论(0) 编辑
摘要: 上文中曾讲到,我在我的 Mac 上发现很多和 Bash 内部命令同名的外部命令,在那 24 个外部命令中,我发现个奇怪的现象:它们中有 15 个居然是 Shell 脚本,更奇怪的是,居然是同一个 Shell 脚本的硬链接:$find /usr/bin -inum 376183/usr/bin/ali...阅读全文
posted @ 2015-09-26 23:54 紫云飞 阅读(203) 评论(0) 编辑
摘要: 我们知道,在 Bash 中,当变量出现在一个赋值语句的右侧时,变量只会展开,不会分词,即便变量两边没有引号:$foo="1 2"$bar=$foo # 不会被拆分成 bar=1 和 2 两个词$echo "$bar"1 2但是,当一个形似赋值语句的词,作为...阅读全文
posted @ 2015-09-25 06:13 紫云飞 阅读(132) 评论(0) 编辑
摘要: 网上经常有人问这个问题:为什么我写的 alias 在 sudo 下就不管用了?$ alias 'll=ls -l'$ sudo ll a-private-dirsudo: ll: command not found为什么会这样?因为正常情况下,alias 只有出现在一条简单命令的命令名称的位置(大部...阅读全文
posted @ 2015-09-24 08:49 紫云飞 阅读(133) 评论(0) 编辑
摘要: 昨天有个人在 bug-bash 上问:为什么 [ --help 没有输出帮助信息。有人回答他了,原因是coreutils 提供的 [ 命令才接受 --help 选项,Bash 自己的 [ 命令不接受任何选项。当你在 Bash 里执行[ --help 时,当然优先执行的是内部命令 [,而不是外部命令 ...阅读全文
posted @ 2015-09-23 17:23 紫云飞 阅读(202) 评论(0) 编辑
摘要: 在上文中曾说到:所谓的环境变量的真实面目其实就是个任意字符串Bash 在启动时会将 environ 数组中包含 = 号的字符串导入成为自己的变量Bash 在启动外部命令时会将自己内部标记为环境变量的变量重组成字符串数组赋值给environ本文中继续深入讲三点:environ 数组中可能存在 = 左边...阅读全文
posted @ 2015-09-22 16:17 紫云飞 阅读(149) 评论(0) 编辑
摘要: BASH_SUBSHELL 实现于 Bash 3.0,我一直想不到它在实际编码中有什么用,后来在 Bash 的 Change Log 里找到一句话,才知道它是作调试用的:New variables to support the bash debugger: BASH_ARGC, BASH_ARGV,...阅读全文
posted @ 2015-09-21 21:29 紫云飞 阅读(153) 评论(0) 编辑
摘要: 除非特别说明,本文中出现的 Shell 均指 Bash 4.3。首先说一个基础知识:Shell 中的变量在展开成值(Parameter Expansion)之后,这个值在某些上下文(Context)中,还会进行分词操作(Word Splitting),但在另外一些上下文中,不会进行分词操作。本文中把...阅读全文
posted @ 2015-09-15 11:55 紫云飞 阅读(172) 评论(0) 编辑
摘要: 在 Bash 里,可以通过export 命令查看当前 Shell 进程的环境变量,这些环境变量一些是 Bash 自己创建的,还有一些是 Bash 从父进程继承来的,然而需要注意的是,父进程传给 Bash 的环境变量不一定是我们想象的那样。在 C 语言层面,环境变量是存放在一个名为environ 的全...阅读全文
posted @ 2015-09-14 16:13 紫云飞 阅读(170) 评论(0) 编辑
摘要: SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,而BASH_SUBSHELL 是记录一个 Bash 进程实例中多个子 Shell(subshell)嵌套深度的累加器。看不懂上面这句话不要紧,因为是我临时编的。其实如果你混淆了这两个变量,我猜你多半是对BASH_SUBSHELL 这个变量名...阅读全文
posted @ 2015-09-13 08:09 紫云飞 阅读(255) 评论(1) 编辑
摘要: SHLVL 环境变量代表 Shell 嵌套执行的深度。$ echo $SHLVL1$ bash$ echo $SHLVL2$ bash$ echo $SHLVL3在 Bash 里,这个值的范围是 [0, 1000],0 是怎么来的呢?是在上次的 SHLVL 值为负数的时候:$ SHLVL=-1$ b...阅读全文
posted @ 2015-09-12 12:36 紫云飞 阅读(141) 评论(0) 编辑
摘要: $_ 有好几个功能,我们最常用的是用它来获取“刚刚执行过的命令的最后一个参数”这个功能,比如下面这样:$ ls ~/Downloads/very/long/dir/ # ls 到某个目录看看有没有我们想要的文件file1 file2 needed_file$ cd $_ # 如果有,就进入到那个文件...阅读全文
posted @ 2015-09-07 17:34 紫云飞 阅读(149) 评论(0) 编辑
摘要: 首先,我们想到的会是 export(等价于 declare -x)命令:$ export | grep 'declare -x _='没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则本篇文章就该结束了。别忘了还有 env(或者 printenv)命令:$ env | grep '_='...阅读全文
posted @ 2015-09-06 23:40 紫云飞 阅读(181) 评论(0) 编辑
摘要: 我们知道,在 Shell 中,一个变量在被展开后,如果它没有被双引号包围起来,那么它展开后的值还会进行一次分词(word splitting,或者叫拆词,分词这个术语已经被搜索引擎相关技术占用了)操作,分成几个词,传给命令的就是几个单独的参数。举个例子,比如:$ foo="1 2 3"$how_ma...阅读全文
posted @ 2015-09-04 12:19 紫云飞 阅读(122) 评论(0) 编辑
摘要: 在 Bash 里,一共有五个地方支持反斜杠开头的转义序列,包括两个内部命令 echo 和 printf 的参数里,字符串语法 $'...' 里,还有四个提示符变量 PS1-PS4 里,以及在 Readline 配置文件里(用来自定义键盘快捷键)。其中后两者不在本文的讨论范围内,我们只看看前三个命令/...阅读全文
posted @ 2015-09-03 11:47 紫云飞 阅读(157) 评论(0) 编辑
摘要: 原文:http://whereswalden.com/2013/08/12/micro-feature-from-es6-now-in-firefox-aurora-and-nightly-binary-and-octal-numbers/几年前,当SpiderMonkey实现了严格模式的时候.我了解到,严格模式禁用了八进制整数字面量的写法.因为有证据表明,一些新手会利用前导0来对齐多行中的数字,从而导致意想不到的结果:var sum = 015 + // 相当于十进制的13,而不是15 197 + 001; // 反正是1console.log(su...阅读全文
posted @ 2013-08-14 10:20 紫云飞 阅读(1472) 评论(1) 编辑
摘要: 原文:http://fiddler2.com/blog/blog/2013/02/13/understanding-the-request-line最近有一位Fiddler用户问我一个问题:我在使用Fiddler查看HTTP请求的时候发现Raw和HexView两个面板中显示的数据有点小区别,比如当我请求www.microsoft.com时,Raw面板中的数据是这样的: GEThttp://www.microsoft.com/ HTTP/1.1 ... Host: www.microsoft.com而HexView面板中是这样的: GET / HTTP/1.1 ... Host: www.mic阅读全文
posted @ 2013-07-21 13:21 紫云飞 阅读(3213) 评论(1) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/06/javascript-source-transformation-non-destructive-vs-regenerative.html很多的JavaScript工具都需要对JavaScript源码进行转换,包括压缩器(minifier)和转译器(transpiler).这些工具所使用的转换的技术可以分为两种:对源码进行非破坏式的(non-destructive)修改和从语法树完全再生(full regeneration)出新的源码.这两种技术服务于不同的需求,且往往是相辅相成的.无论选择哪种技术,输入的源码都需要先被解阅读全文
posted @ 2013-07-15 11:14 紫云飞 阅读(2218) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/07/es6-and-proxy.html能够拦截在一个对象上的指定操作的能力是非常有用的,尤其是在故障调试的时候.通过ECMAScript 6中的新特性——代理(proxy),这种能力才最终得以实现.在目前最新的ES6规范草案中(2013年5月14日发布,第15次修订版),第15.18小节——代理对象(Proxy Objects)这部分的文档仍然是空的.不过随着规范的日趋稳定,这里会补充上完整的参考文档的.目前,可以在ES wiki上的直接代理(Direct Proxies)页面内找到最详细的资料.在我写这篇文章的时候,只有F阅读全文
posted @ 2013-07-14 10:42 紫云飞 阅读(1251) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2012/02/from-double-quotes-to-single-quotes.html代码的不一致性总是让人发狂,如果每位开发者都能遵守约定好的编码规范(coding conventions),那么生活将变的更加美好.比如在JavaScript中,一个字符串字面量可以用单引号引起,也可以用双引号来引起(ECMAScript 5规范7.8.4小节).很多人习惯于使用某种特定的引号,比如jQuery编码风格推荐人们使用双引号.但我个人更喜欢使用单引号,这仅仅是我的偏好.自从有了Esprima,我意识到,我可以利用Esprima能够以阅读全文
posted @ 2013-07-13 11:39 紫云飞 阅读(6679) 评论(1) 编辑
摘要: 原文:http://ariya.ofilabs.com/2012/07/lazy-parsing-in-javascript-engines.html现代的JavaScript引擎可以将函数体的解析操作延迟到真正需要的时候再进行,下面我将讲一下为什么要这样做以及引擎具体是如何实现的.IE团队在最近的一篇博文"IE10和Windows 8中JavaScript性能的发展"中提到了他们使用延迟解析来提升IE10的性能.实际上,IE9正式版已经实现了这种优化手段,只不过IE10更进一步改进了它.文中有这样一句话(其中Chakra是IE的JavaScript引擎的名字):为了进一步阅读全文
posted @ 2013-04-23 21:14 紫云飞 阅读(1393) 评论(1) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/04/web-page-clipping-with-phantomjs.htmlPhantomJS的一个主要用途就是用来抓取网页并将它渲染成图片.在渲染图片时有很多选项可供调整,其中最常用的一个就是缩放选项(调整zoomFactor属性的值),它经常会被用在制作缩略图的场景下.另外一个不怎么被人熟知的选项就是"按指定矩形区域渲染"选项(调整clipRect属性的值),也就是生成的图片只包含了目标网页中被指定的那部分区域.这种只渲染页面指定矩形区域的需求通常表现为你只想获取页面中某个特定元素的内容(就像getB阅读全文
posted @ 2013-04-20 09:24 紫云飞 阅读(2544) 评论(2) 编辑
摘要: 原文:http://generatedcontent.org/post/47216611856/ie11最近,一个开发代号为Windows Blue的Windows操作系统泄漏到了互联网上,该操作系统的内置浏览器为IE11,本文将介绍一下这个泄漏版的IE11中有哪些关键的新变化和新特性.预先声明: 本文中所讲的内容都来自互联网,我自己没有安装过这个泄漏版的IE11,虽然我目前正在帮助微软的userAgents社区做一些工作,但我没有任何关于IE11未来计划的内部消息,本文只是对网上的那些消息做了一下总结,并加入了自己的看法和预测.一个新的身份标识关于IE11的第一个新闻就是它有了一个新的用户代阅读全文
posted @ 2013-04-18 22:02 紫云飞 阅读(4339) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/03/es6-and-method-definitions.html在JavaScript的对象字面量中,属性值被设置成为一个函数是个很常见的做法.在各种JavaScript框架中,这种做法也很常见,尤其是用来设置构造函数的prototype属性对象的时候.在即将到来的ECMAScript 6中,引入了一种名叫方法定义(method definition)的新语法糖,相对于以前的完整写法,这种简写形式可以让你少写一个function键字.在介绍"方法定义"之前,让我们快速的回顾一下访问器属性.访问器属性是个可阅读全文
posted @ 2013-04-14 00:20 紫云飞 阅读(1087) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/04/automatic-inlining-in-javascript-engines.html想当年,在JavaScript解释器的运行速度还很慢的时候,有一条最佳实践就是"不要在性能关键(performance-critical)的代码中使用函数调用".随着最近现代JavaScript引擎的不断发展,这条最佳实践变的不是那么必要了.其中,能在很大程度上减少我们对"频繁的函数调用会消耗过多性能"的担心的一个新特性就是自动函数内联(automatic function inlining).阅读全文
posted @ 2013-04-13 11:57 紫云飞 阅读(993) 评论(0) 编辑
摘要: 原文:http://ariya.ofilabs.com/2013/04/css-preload-scanner-in-webkit.html在WebKit中,预加载扫描器指的是一个副解析器,当HTML主解析器被一个同步的script标签阻塞时,预加载扫描器就会启动.然后,它会马上找出接下来即将需要获取的资源(比如样式表,脚本,图片等资源)的URL,然后尽可能早的发起网络请求,而不用等到主解析器恢复运行,从而提高了整体的加载时间.那么,除了HTML文件中的依赖资源,还有样式表中的呢?幸运的是,WebKit已经有了一个叫CSS预加载扫描器的东西了.在WebKit实现符合HTML5标准的解析器的时候阅读全文
posted @ 2013-04-11 18:17 紫云飞 阅读(1175) 评论(0) 编辑