December 30, 2011
| 作者:白菜
|
分类:默认分类
近期网络流传的纷纷扬扬的用户密码泄露事件大部分来自于这个所谓的安全平台-乌云系统
http://www.wooyun.org/,一瞬间,此网站可谓是挣足了眼球和面子,赢得了不少流量和关注,可是细细一想,总觉得有点猫腻。
(1)此网站实为一个松散的虚拟组织,任何人都可以在上面发布漏洞,我也看到过认识的人的影子。上面还有PPC的会员的影子。试问,这么混乱,质量能得到保证不?只要提交漏洞就能得到邀请码,成为其会员,也就跻身于安全研究人员的行业。
(2)就从其近日发布的密码泄露来看,一次比一次不靠谱,什么支付宝密码泄露,银行密码泄露,一次比一次夸张,一次比一次规模庞大,动辄几千万,上亿,但是就从其给出的数据看,却经不起推敲。首先这些泄漏事件越来越让人不相信,其次已有相关企业出来辟谣,指出其泄露的银行卡号都是废卡。另外,从其泄露的数据来看,字段项也显得不够专业,更像是凭空臆想出来的。再者从我所了解到的大企业数据中心的情况来看,也不可能拿到这么多数据。很多企业的安全系统可谓是固若金汤,都是硬件级别的安全,经得起推敲的,是国际上引进的军方级别的安全系统,有这么容易破解?很多大公司的办公电脑都是硬件加密,没有U盘无法启动,系统一旦有被入侵和破坏倾向,立刻自动销毁数据。
(3)此网站惯用虚虚实实的招数,先弄一些比较小的不起眼的,容易得到的漏洞来垫底,然后就是五花八门的泄露,其泄露的数据也时虚虚实实,很多是比较老旧的数据再加上一堆捏造的数据。其所展示的数据和技术也不够专业。
最后,虽然不太清楚这个所谓的乌云系统的数据来自哪里(此网站官方已宣布关闭),是否是第一数据源,但是就其近期所发布的事件而言,是越来越让人不信任。在我眼里,更愿意把其看做网络黑社会,幕后黑手。根据目前所找到的资料,知其是80sec团队制作的网站,但是我对这个团队的性质表示不大信任。
December 27, 2011
| 作者:白菜
|
分类:编程算法
进程和线程这对概念的理解也是很难的,至今网络上可查的资料对其的理解出入都挺大,在不同的操作系统中,如linux和windows中,其概念和实现都是有出入的。因此,我在这里结合我自己的理解谈下这两个概念,讲的都是一般性的概念,并且主要是基以WINDOWS的。
一般将进程定义为一个正在运行的程序的实例。我们在任务管理器重所看到的每一项,就可以理解为一个进程,每个进程都有一个地址空间,这个地址空间里有可执行文件的代码和数据,以及线程堆栈等。一个程序至少有一个进程。进程可以创建子进程,创建的子进程可以和父进程一起工作,也可以独立运行。
而线程是隶属于进程的,也就是说,线程是不能单独存在的,线程存在于进程中。每个进程至少有一个主线程,进程里的线程就负责执行进程里的代码,这也叫做进程的“惰性”。线程所使用的资源是它所属的进程的资源。线程也有自己的资源,主要组成部分就是一些必要的计数器和线程栈,占用的资源很少。我们可以理解为进程就是个容器,而线程才是真正干活的。线程可以在内核空间实现,也可以在用户空间实现。
这里特别提一下linux,在linux中,每一个进程都必须有一个父进程(如果没有父进程,则把PID=1的根进程作为其父进程)。进程退出了,就成了僵尸进程,等待父进程的退出信号,如果父进程没有给他发信号,得给他找一个父进程,或者等待内核自动销毁。Linux内核只提供了轻量进程的支持,限制了更高效的线程模型的实现,但Linux着重优化了进程的调度开销,使得linux进程切换开销较小。所以linux系统没有真正意义上的线程机制。linux中,Linux线程是通过进程来实现,进程和线程是同一个层次的。(我这里提到的是基于linux 2.6 内核的,在最新的LINUX中,对线程的实现做了优化,但是还是基于进程的。有些linux实现了新的线程机制,但主流还是和我描述的一样)
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这也是进程和线程的重要区别。
比如,windows中的explorer就是资源管理器进程,我们每打开一个窗口,这个进程就会创建一个线程。有上面的描述,我们可以知道,进程有独立的地址空间,多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
在第一节中,我提到过,“并发!=多线程“,是的。如Unix操作系统和Windows操作系统支持多用户、多进程的并发执行,而Java这样的语言支持应用程序进程内部的多个执行线程的并发执行。我们知道,php在语法上是没有多线程这个概念的,那java/NET的多线程是怎么实现的。实际上,java只是通过native方法调用操作系统API来创建多线程而已。另外,我们经常说某个网站并发是多少多少,nginx是高并发服务器了。。这里的并发和我前面的并发概念是不同的。要想做到高并发,除了多线程等的实现,还需要各种好的IO机制,不然线程再多也没用,资源利用跟不上来。高并发又跟同步、异步等IO复用机制有了牵连。
下面列举一下进程和线程中的一些概念。
进程:创建,销毁,创建子进程(fork),优先级。
线程:创建,挂起,恢复,销毁,切换,协作,睡眠,唤醒,等待,同步,锁,优先级。
从上面的描述,基本可以理清进程和线程的关系了。最后总结下:
1.linux没有内核上的多线程实现,但是不能说linux没有多线程。WINDOWS有内核的多线程实现。
2.进程开销大,线程开销小,但是linux的进程和线程开销差异不明显。
3.并行的实现离不开多线程。
再留个悬念,多线程的实现和运行还会涉及到同步异步,原子性等概念。这些概念是相互交叉的,这里先不做深入。
December 27, 2011
| 作者:白菜
|
分类:编程算法
最近正想整理下这个专题,想了下,主要有以下几组概念,我们时不时会听到,但只要一细想就会觉得困惑,觉得没那么简单。这几组概念有:
1.并发和并行
2.线程与进程
3.缓冲与缓存
4.同步与异步
5.阻塞与非阻塞
6.原子性与事务性
这几组概念,不仅概念间容易混淆,而且一组概念和另一组概念之间又存在交叉,极容易搞混。
------------------------------------------------------------------------
下面,就我所了解的知识,分门别类的谈一下这几个概念间的关系,如有不当之处,还望指出和补充。
1.并发( concurrency)和并行( Parallelism)
狭义的并发和并行属于操作系统里的概念。并发和并行是两个即有相同处,又有区别的概念,相同的地方在于他们都是指同时处理多个任务。不同的地方在于并发是逻辑上的,并行是物理上真真实实的。
我们都清楚,在单个CPU的情况下,对于到达CPU执行单元的作业(作业就是待执行的进程和线程),都是需要排队的,因为我只有一个窗口,你要吃饭,就必须到我这个窗口来,也就是说CPU资源是有限的。假如说这个时候,某个作业一直占着CPU资源不放,那么其他作业就得不到执行,也就是被阻塞,被挂起了。这就需要一种机制,保证每个作业都有机会被执行到,这种机制就叫做处理器的调度机制,其中又分为抢占式和非抢占式的调度。细分后又有先来先服务(老老实实排队,谁先到就服务谁),最短作业优先(哪个好搞定就先服务谁),优先级调度,时间片调度等。并发就是通过时间片轮转的方式实现的,一个作业执行一段时间后被中断,换另外一个上去,大家都有机会被执行到。
时间片轮转,就涉及到一个进程切换的问题,频繁的切换必然带来性能开销。我们看到的一个程序一直在持续运行,但实际上并不是这样的,从CPU级别的粒度上讲,其实是多个程序间在快速的切换,只是这个切换的速度很快(想一下,CPU的主频现在都有2GHZ了),我们感觉不到而已。在早期的操作系统中,不支持多任务,一个任务在执行,其它任务就必须等待。
废话说了这么多,就是要说明,并发就是多个进程或线程在同时执行,但实际上,他们并不是真正的在同一个时间点上一起跑的,而是我跑一段时间后,接下来你跑,我再跑,看起来我们都在跑,这就是并发。
而并行,则是实实在在的多个进程同时跑在高速公路上,齐头并进。看下面的图,上面的是并发,下面的是并行。

通过我前面的描述,可以知道,并发是由CPU调度算法实现的,只需要一个CPU即可实现并发。而并行则要在多核或者多处理器情况下才能做到,单CPU是无法实现并行的,因为任一个时刻点上只有一个程序在处理器上运行。并行计算,这就是当今大型计算机所要实现的难题,如何让几千个CPU进行协作。并发和并行都需要处理器和OS的支持。
提到并发,就难免会提到多线程,并发!=多线程,多线程只是一种并发的实现模型。这里暂且留作后话。根据我们前面的描述,可以知道,时间片切换是有开销的,因此多线程不一定就能发挥出更佳的效率,特别是在单处理器的情况下。故,多线程也是不能盲目迷信的。
December 26, 2011
| 作者:白菜
|
分类:随便侃侃
目前为止,据我个人观察,从语法角度上讲,最让人困惑和难以理解的一种语言应该是LISP语言了。打开这种语言的代码,一眼望去,满目全是括弧,一层套一层。 这种语言特征最大的问题是,它不符合人们通常的思维习惯。LISP语言的这个特点是个整体的语言现象,而任何一种语言其实也都有一些个别的很奇特的东西, 其中有些会奇怪的让你摸不着头脑。有一个好事者在一个帖子上征集各种语言里不合常理的地方,结果收集到了320多条,问题最大最多的语言算是Javascript了,另外还有C,Java,Python,PHP等等。下面列出的是其中最有趣的几条。
1. 在C语言里,数组可以这样索引取值:
a[10]
这种写法相当常见。
然而,还有一种很少见的写法(绝对可用!)是这样的:
10[a]
解释:
2.这两种写法的效果是一样的。
在JavaScript里:
'5' + 3 结果是 '53'
而
'5' - 3 结果是 2
解释:在ECMASCRIPT规范里定义了字符串的加法,但没有字符串减法。11.6.1里有
7. If Type(lprim) is String or Type(rprim) is String, then a. Return the String that is the result of concatenating ToString(lprim) followed by ToString(rprim)
阅读剩余部分...
December 23, 2011
| 作者:白菜
|
分类:随便侃侃
为了应对类似CSDN密码泄露这样的事件可能带来的影响,特意做了个密码管理器
,输入域名点击“OK”,对每个域名生成经过特殊编码后的密码,再经过一系列处理后自动复制到剪切板。
没啥技术含量,只是提供给和我一样蛋疼的人一个蛋疼的想法。
另外,推荐一下,“奥巴码-aobama(
http://aobama.googlecode.com)”。不是美国总统的那个奥巴马,而是一个JAVA写的编码解码的小工具,我感觉其很好,好用也好玩。我使用了他的代码。
December 20, 2011
| 作者:白菜
|
分类:随便侃侃
有一点需要告知下:使用了下面的修改版/第三方/衍生版的firefox,很多事国外定制的,所以字符集设置的是en-us,再浏览一些大型网站如淘宝,腾讯微博的时候会跳转到对应的英文站点页面,可能带来不便。
今天,firefox 9 放出来了,作为firefox的忠实粉丝,自然是要去尝鲜的。
现在,chrome风头正盛,那么多人歌颂chrome,为什么我仍然坚持firefox呢?理由如下:
1.google的霸道作风我一直很讨厌。如:官方死活不提供离线安装(有人说有离线版的,确实有,但是为什么不在官网贴出来呢,藏着掖着干嘛?对于我这种办公室男,网络带宽有限,我对在线安装不感冒),firefox就做的很好,有一个公开的FTP可以随时去查看上面的各种资源:
ftp://ftp.mozilla.org/pub/ (据说,google程序员的电脑最低配置32G内存,带宽更是牛逼,但是天朝表示无语,全世界表示压力很大,大概也是这个原因吧,google的程序员认为在线安装就1秒钟的事情,为什么不在线安装呢?这也是google的chrome OS失败的原因。google总是以为现在的网络已经到了泛滥的地步了,实际上并非如此)。其次,chrome安装不给人任何选择余地,没有任何选项,强行安装到系统盘(有人又要说,你可以XXX啊,但chrome凭啥如此霸道),这明明是流氓软件的作风。
2.还是google自以为是的霸道作风,用自己的观点来决定产品。很长时间以来,chrome 14之前的版本居然不支持退出时清除浏览记录,必须写脚本或手工清除,我很无语(不信的话,网络上还可以搜到类似的技巧)
3.chrome多进程,占用内存极大,动辄上G内存,伤不起,就那么一点提速,对我来说没感觉。
因此,本人对chrome无爱。
扯回正题,所谓firefox衍生版、修改版其实就是在mozilla的源代码上重新编译的,通过设置了一些编译参数,使得性能得到提升,当然,幅度不会很大,有一些更高级的优化措施,如使用更优的指令和组件等。比较有名的衍生版有:
1.pale moon。沧月,官网
http://www.palemoon.org/。目前最新版8.0,还有3.6.28的经典版,默认英语界面,可下载中文包,感觉性能和速度提升比较明显。更新也很勤快。
2.lawliet,最新版9.0,国人所为,下载地址
http://code.google.com/p/lawlietfox/
3.pcxfirefox,最新版8.0.1,国人所为,内存占用稍大。
http://code.google.com/p/pcxfirefox
4.tete009,最新版9.0
http://www1.plala.or.jp/tete009/en-US/software.html
5.fx-ayakawa/ 凌川
http://code.google.com/p/fx-ayakawa/
不再更新和质量不高的就不再列出。
December 16, 2011
| 作者:白菜
|
分类:网页前端
很好的一篇文章:JavaScript is Dead. Long Live JavaScript! 下面是概要翻译与我的阅读笔记:
JavaScript 的成功得益于在正确的时间出现在正确的地点。JavaScript 的兴起与浏览器的支持息息相关。你瞧,VBScript 就没这么好运气。
JavaScript 很流行,但它有先天缺陷。Brendan Eich 当初只花了 10 天时间就把 JavaScript 设计出来了,作为 JavaScript 之父,BE 如是说:
与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:“它的优秀之处并非原创,它的原创之处并不优秀。”
(摘选自阮一峰的翻译:JavaScript 诞生记)
JavaScript 的不足,最明显之处是语法。
糟糕冗长的语法
可选参数和默认值
function(a, b, option) { option = option || {}; // ...}上面的代码中,option 是可选参数,当没有传递时,默认值是 {}. 然而,传递的 option 值有可能是假值(falsy 值)。严格来写,得如下判断:
function(a, b, option) { option = arguments.length > 2 ? option : {}; // ...}
注意:option = typeof option !== 'undefined' ? option : {} 也有可能是错误的,因为传递过来的可能就是 undefined当不需要 b 参数,删除后,基于 arguments.length 的判断很容易导致忘记修改而出错:
function(a, option) {
option = arguments.length > 2 ? option : {};
// ...
}
如果能增加以下语法该多好呀:
function(a, b, option = {}) {
// ...
}
Let
闭包很强大,也很恼火:
for (var i=0, ilen=elements.length; i<ilen; i++) {
var element = elements[i];
LIB_addEventListener(element, 'click', function(event) {
alert('I was originally number ' + i);
});
}
上面的代码经常在面试题中出现,解决办法是再包裹一层:
for (var i=0, ilen=elements.length; i<ilen; i++) {
var element = elements[i];
(function(num) {
LIB_addEventListener(element, 'click', function(event) {
alert('I was originally number ' + num);
});
}(i));
}
阅读剩余部分...
December 16, 2011
| 作者:白菜
|
分类:网页前端
我们在平常使用字符串拼接的时候(如下例),会发现代码的可维护性和易读性将变得更加糟糕(代码中一堆的变量、双引号、单引号, 加号等,相信当情况更为复杂时,头一定发晕):
var url= 'http://www.plannabc.net/',
title= '落草为根——专注前端技术&关注用户体验',
text = '怿飞's Blog';
var link = '<a href="' + url + '" title="' + title+ '">' + text+ '</a>';
如果上述代码变为:
var obj = {
url: "http://www.plannabc.net/",
title: "落草为根——专注前端技术&关注用户体验",
text: "怿飞's Blog"
};
var link = '<a href="{url}" title="{title}">{text}</a>';
substitute(link, obj)
一切变得怡然自得。
阅读剩余部分...