技术分享 ’ 目录下的文章存档

再谈select, iocp, epoll,kqueue及各种I/O复用机制

首先,介绍几种常见的I/O模型及其区别,如下:

  • blocking I/O
  • nonblocking I/O
  • I/O multiplexing (select and poll)
  • signal driven I/O (SIGIO)
  • asynchronous I/O (the POSIX aio_functions)

blocking I/O
这个不用多解释吧,阻塞套接字。下图是它调用过程的图示:

a1

 

重点解释下上图,下面例子都会讲到。首先application调用 recvfrom()转入kernel,注意kernel有2个过程,wait for data和copy data from kernel to user。直到最后copy complete后,recvfrom()才返回。此过程一直是阻塞的。

nonblocking I/O:
与blocking I/O对立的,非阻塞套接字,调用过程图如下:

a2

 

可以看见,如果直接操作它,那就是个轮询。。直到内核缓冲区有数据。
阅读全文

利用 Linux 系统生成随机密码的10种方法

通常情况下大家生成密码都好困惑,一来复杂程度不够会不安全,复杂程度够了又不能手动随便敲击键盘打出一同字符(但通常情况下这些字符是有规律的),使用1password 或者 keepass 这种软件生成也可以,不过貌似1password 要收费,既然这样我们就玩一下好玩的用 linux 来生成随机密码玩玩吧;

 

Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它。例如,你可以通过数十种方法来生成随机密码。本文将介绍生成随机密码的十种方法。

1. 使用SHA算法来加密日期,并输出结果的前32个字符:

date +%s |sha256sum |base64 |head -c 32 ;echo

生成结果如下:

ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4

2. 使用内嵌的/dev/urandom,并过滤掉那些日常不怎么使用的字符。这里也只输出结果的前32个字符:

< /dev/urandom tr -dc _A-Z-a-z-0-9 |head -c${1:-32};echo

生成结果如下:

pDj0Xwz7exD_Qb5B27BwWsM1hrF3a7cJ

3. 使用openssl的随机函数

openssl rand -base64 32

生成结果如下:

rYJWqJlTLAYeX3j7nCbir20h1k/0CnqLNEuNyTScfKo=

4. 这种方法类似于之前的urandom,但它是反向工作的

tr -cd '[:alnum:]' < /dev/urandom | fold -w32 | head -n1;echo

生成结果如下:

tpgudzF7sqtU4yyW2LVhmUQOZIQi87

阅读全文

header的安全配置指南

from:https://blog.veracode.com/2014/03/guidelines-for-setting-security-headers/

0×00 背景


在统计了Alexa top 100万网站的header安全分析之后(2012年11月 – 2013年3月 – 2013年11月),我们发现其实如何正确的设置一个header并不是一件容易的事情。尽管有数不胜数的网站会使用大量有关安全方面的header,但并没有一个像样的平台能够为开发者们提供必要的信息,以辨别那些常见的错误设置。或者说,即使这些安全方面的header设置正确了,也没有一个平台能够为开发者提供一个系统的测试方法,用来测试正确与否。这些header如果设置错误了不仅会产生安全的假象,甚至会对网站的安全产生威胁。veracode认为安全性header是网络防护中非常重要的一环,并且他希望让开发者们能够简捷、正确地设置站点。如果您对某一header或设置有任何疑问,我们有极好的资源能够追踪到浏览器支持情况。
阅读全文

给开发者的 10 款最佳的 JavaScript 模板引擎

随着 Web 开发者和设计者收藏 JavaScript 库的数量越来越多,JavaScript 也有大量流行的库:jQuery,MooTools 等等,很多时候大家都会使用 JavaScript 模板引擎来开发 JavaScript 应用。以下列表介绍的就是 JavaScript 模板引擎。

这里我们收集了一些非常有用的 JavaScript 模板引擎,希望能给 Web 开发者和设计者提供一定的帮助:

1) Jade

jade 是超高性能的 node JavaScript 模板引擎,有着非常强大的 API 和大量杰出的特性。它主要针对 node 的服务端。

1

 

2) Mustache

Mustache 是 logic-less 模板语法,可以使用在 HTML,配置文件,源代码等等地方。它是使用哈希表或者对象提供的值来扩展模板标签。

2
阅读全文

servlet/filter/listener/interceptor区别与联系

某天突然想起struts2和struts1的区别的时候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又发现,servlet和filter有什么区别呢?于是看了看web.xml,一时又发现,咦,servlet、filter、listener?还有个interceptor?对于这几个概念,本应是初学者就掌握的东东了,可惜本人基础学的不好,只能是现在补课。于是就有了这篇博客。

慢慢来吧,需要补课的地方还有很多很多呀。初学的时候都不知道他们存在呢。呵呵。

下面从几个方面阐述一下题目中四个概念的区别与联系:

1、概念

2、生命周期

3、职责

4、执行过程

一、概念:

1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。

2、filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。
阅读全文

全方位梳理:如何成为一个移动端UI设计师

mobile-designer-1

 

移动端的UI设计有其独有的一套设计规则和约束。新技术的不断加入促进了移动平台的快速增长,而移动端的UI设计也和传统的平面海报/网页设计不太一样。那么,要成为一个合格的移动端UI设计师需要掌握什么样的技能,经历怎样的涅磐才行呢?

Part 1 挑战和制约

每个媒体都有它的局限所在。即使是在移动端这个充满机会、自由和创意的平台上也有着许多亟待解决的问题,和无法回避的局限性。

碎片化的移动端

时至今日,市面上流通的智能机已经多不胜数了,不同的智能终端不仅仅尺寸不尽相同,而且因为分辨率的差异使得屏幕的像素密度也有很大差异,往细了考虑,这些终端的输入机制、屏幕比例、屏幕方向都会影响到移动端的UI设计。
阅读全文

取代cookie的网站追踪技术:”帆布指纹识别”初探

x1

 

【前言】
一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。Cookie技术是非常受欢迎的一种。当用户访问一个网站时,网站可以在用户当前的浏览器Cookie中永久植入一个含有唯一标示符(UUID)的信息,并通过这个信息将用户所有行为(浏览了哪些页面?搜索了哪些关键字?对什么感兴趣?点了哪些按钮?用了哪些功能?看了哪些商品?把哪些放入了购物车等等)关联起来。

而随着网民对个人隐私的重视,Cookie越来越不受待见。不少安全工具甚至是浏览器都开始允许或引导用户关闭Cookie功能,比如很多主流浏览器都有一个“隐私模式浏览”功能。这样以来,网站就很难追踪用户行为了。但仍然有一些方法可以让网站去追踪每一个访问者的行为,比如通过flash cookie的方式也可以达到唯一标识和追踪的目的。

笔者近期注意到,国外媒体报道了一种非常难以摆脱的新型在线追踪工具被用来尾随从白宫官网到色情网站YouPorn.com的热门网站的访问者。经过分析,这个就是另一种比较新的访客追踪技术:“帆布指纹识别”技术,具体代码见附录6。这个技术的独特之处是:它不像通过Cookie或者Flash Cookie等之类的方式,你基本是无法屏蔽它的。

 

【原理分析】
笔者收集整理了很多知名站点上的类似代码,详见附录4,从这些“帆布指纹识别”代码可以看出,均使用到了HTML5专属标签<canvas>的一个现状:在绘制canvas图片时,同样的canvas绘制代码,不同机器和浏览器绘制的图片特征是相同并且独一无二的,这样以来,提取最简单的md5值便可以唯一标识和跟踪这个用户。

 

一段产生canvas元素的javascript代码:

var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var txt = 'http://security.tencent.com/';
ctx.textBaseline = "top";
ctx.font = "14px 'Arial'";
ctx.textBaseline = "tencent";
ctx.fillStyle = "#f60";
ctx.fillRect(125,1,62,20);
ctx.fillStyle = "#069";
ctx.fillText(txt, 2, 15);
ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
ctx.fillText(txt, 4, 17);

获取绘画的内容,需要使用到canvas.toDataURL()方法,该方法返回的是图片内容的base64编码字符串。对于PNG文件格式,以块(chunk)划分,最后一块是一段32位的CRC校验,提取这段CRC校验码便可以用于用户的唯一标识:

var b64 = canvas.toDataURL().replace("data:image/png;base64,","");
var bin = atob(b64);
var crc = bin2hex(bin.slice(-16,-12));
console.log(crc);

chrome隐身模式测试:
阅读全文

Windows平台分布式架构实践 – 负载均衡

概述

最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行。那么大家(开发者和企业)为什么那么的迫切的希望.NET跨平台呢?第一个理由是便宜,淘宝号称4万多台服务器全部运行在Linux,Linux平台下还有免费的MySql,这些都是免费的,这些省下来直接就是利润呀,做企业的成本可以降低又没有任何损失,何乐而不为呢?第二个理由是在Linux系统下还有很多非常优秀的构架(当然同样也是免费的),分布式缓存Memcached, 大数据处理构架Hadoop等等,这些都为一些大型的分布式系统提供了很好的支撑,当然还有诸如Liniux系统本身的一些安全和网络方面的优势,等等。 所以也难怪大佬们都纷纷不约而同的没有选择.NET。

但是如果.NET也支持跨平台之后,那这样的格局可能就要发生变化了。上面所有的优势依然可以保留,并且加上它语法的优越性,以及快速的开发效率等,还是会为其争得一席之地的。

但是,是不是Windows平台下就不能实现这些大型的分布式系统呢?我相信这个问题已经被广泛讨论过,但是至少我没有看到比较清晰的,完整的案例。带着这些问题,我决定升级我的机器,自己从头到尾在windows平台下搭建一个高可扩展性的分布式网站出来。我经验尚浅,很多的东西还处于摸索阶段,所以如果有错误,还请大师多多指点。
阅读全文

一致性hash和solr千万级数据分布式搜索引擎中的应用

互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库。在这样严峻的条件下,一批又一批的创业者从创业中获得成功,这个和当前的开源技术、海量数据架构有着必不可分的关系。比如我们使用mysql、nginx等开源软件,通过架构和低成本服务器也可以搭建千万级用户访问量的系统。新浪微博、淘宝网、腾讯等大型互联网公司都使用了很多开源免费系统搭建了他们的平台。所以,用什么没关系,只要能够在合理的情况下采用合理的解决方案。

那怎么搭建一个好的系统架构呢?这个话题太大,这里主要说一下数据分流的方式。比如我们的数据库服务器只能存储200个数据,突然要搞一个活动预估达到600个数据。
可以采用两种方式:横向扩展或者纵向扩展。
纵向扩展是升级服务器的硬件资源。但是随着机器的性能配置越高,价格越高,这个代价对于一般的小公司是承担不起的。
横向扩展是采用多个廉价的机器提供服务。这样一个机器只能处理200个数据、3个机器就可以处理600个数据了,如果以后业务量增加还可以快速配置增加。在大多数情况都选择横向扩展的方式。如下图:
阅读全文

编程易犯的错误

Bash Pitfalls 文章介绍了40多条日常 Bash 编程中,老手和新手都容易忽略的错误编程习惯。每条作者在给出错误的范例上,详细分析与解释错误的原因,同时给出正确的改写建议。文中有不少引用的文章,也值得大家仔细阅读。仔细阅读了这篇文章后,收获很多,不感独享,把这篇文章以半翻译半笔记的形式分享给大家。

1. for i in $(ls *.mp3)

Bash写循环代码的时候,确实比较容易犯下面的错误:

for i in $(ls *.mp3); do # 错误!
some command $i # 错误!
done

for i in $(ls) # 错误!
for i in `ls` # 错误!

for i in $(find . -type f) # 错误!
for i in `find . -type f` # 错误!

files=($(find . -type f)) # 错误!
for i in ${files[@]} # 错误!

 

这里主要两个问题:

我们不能避免某些文件名中包含空格,Shell会对$(ls *.mp3)展开的结果会被做单词拆分(WordSplitting)的处理。假设有一个文件,名字为01 – Don’t Eat the Yellow Snow.mp3,for循环处理的时候,会今次遍历文件名中的每个单词:01, -, Don’t, Eat等等:

$ for i in $(ls *.mp3); do echo $i; done
01
-
Don't
Eat
the
Yellow
Snow.mp3

比这更差的情况是,上面命令展开的结果可能被Shell进一步处理,比如文件名展开。比如,ls执行的结果中包含*号,按照通配符的规则, *号会被展开成当前目录下的所有文件:

$ touch "1*.mp3" "1.mp3" "11.mp3" "12.mp3"
$ for i in $(ls *.mp3); do echo $i; done
1*.mp3 1.mp3 11.mp3 12.mp3
1.mp3
11.mp3
12.mp3
1.mp3
11.mp3
12.mp3

不过,在这种场景下,你即使加上引号,也是无济于事的:

$ for i in "$(ls *.mp3)"; do echo --$i--; done
--1*.mp3 1.mp3 11.mp3 12.mp3--

阅读全文