安装Nginx

预编译版 Linux 和 BSD 的预编译包 大部分 Linux 发行版和 BSD 衍生版的源里都有 Nginx,使用通常安装其他软件的方式即可安装(在 Debian 上用 apt-get,Gentoo 上用 emerge,FreeBSD 上用 ports,等等)。    请注意这些包通常不是最新版本。如果你想使用最新功能和 Bug 修复,建议从源码编译安装(实际上,编译安装也相当简单)。 Win32 预编译包 现在nginx官方已经发布了官方版的nginx/Win32了,欢迎大家使用。在先前Kevin Worthington 负责维护一个 Windows 的最新预编译版分支,如果您已经习惯了使用这个版本也可以选择使用这个版本的。 源代码发布 Nginx 有两个版本:稳定版 (1.0.x), 和 历史稳定版 (0.8.x)。同时,我们在svn中也提供开发版。开发版分支会较快获得新功能和缺陷修复,但同时也可能遇到新的缺陷。一旦更新稳定下来,就会被加入稳定版分支。然而新功能不一定会被加到旧的稳定版中去。 作为生产环境,通常建议使用稳定版,但其实开发版本也相当稳定。如果您的网站不是基于Fcgi,建议使用开发版。请参考 FAQ。 从源代码编译Nginx 把源码解压缩之后,在终端里运行如下命令: ./configure make sudo make install 默认情况下,Nginx 会被安装在 /usr/local/nginx。通过设定编译选项,你可以改变这个设定。 Nginx/Win32 安装 为了安装Nginx/Win32,需先下载它。然后解压之,然后运行即可。下面以C盘根目录为例说明下: cd C: cd C:\nginx-0.8.54   start nginx Nginx/Win32是运行在一个控制台程序,而非windows服务方式的。服务器方式目前还是开发尝试中,Nginx/Win32可以使用以下开关来管理它: Nginx -s stop                  快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。 Nginx -s quit                   平稳关闭Nginx,保存相关信息,有安排的结束web服务。 Nginx -s reload               因改变了Nginx相关配置,需要重新加载配置而重载。 Nginx -s reopen              重新打开日志文件。 【责任编辑:杨赛 TEL:(010)68476606】 from:http://os.51cto.com/art/201111/304425.htm

龙生   08 Jan 2015
View Details

2014年新交规C1科目三(大路考)考试过关技巧

2014年新交规C1科目三(大路考)考试有原来的13项道路驾驶技能项目增加到16项,并且考试里程不少于3公里,其中需抽取不少于20%进行夜间考试;不进行夜间考试的考生,应当进行模拟夜间灯光使用考试。下面我们就为大家介绍一下C1科目三考试过关技巧: 工具/原料 考试项目:上车准备、起步、直线行驶、加减挡位操作、变更车道、靠边停车、直行通过路口、路口左转弯、路口右转弯、通过人行横道线、通过学校区域、通过公共汽车站、会车、超车、掉头、夜间行驶,共16项! 方法/步骤 1 上车准备:上车之前需绕车一周,对车辆外观及周围的环境进行正确观察,确认安全。特别是在打开车门之前应观察后方的交通情况,以防后方有车或行人路过。这个习惯在以后开车过程中也会用到!大家千万不要忽视这个细节,很重要的哦。 2 起步:上车准备之后,拉开车门上车起步,起步前检查车门是否完全关闭,调整座椅、后视镜,系好安全带,检查驻车制动器、挡位,启动发动机。检查仪表,观察内、外后视镜,侧头观察后方交通情况,开启转向灯,挂挡,松驻车制动,起步。起步过程平稳、无闯动、无后溜,不熄火。建议起步时右脚踩刹车,以坡道起步标准起步,防止路面不稳导致起步熄火。 3 直线行驶:根据道路情况合理控制车速,正确使用挡位,保持直线行驶,跟车距离适当,行驶过程中适时观察内、外后视镜,视线不得离开行驶方向超过2秒。大家切记看的远才能跑的直,如果眼睛只看车前最终不能行驶直线是肯定的。 4 加减档位操作:根据路况和车速,合理加减挡,换挡及时、平顺。加减挡的时候一定要左手握紧方向盘,不然在加减挡的时候会出现跑方向的情况。操作过程:踩油门[转速1500转(15迈)时]→踩离合、松油门→换二档→松离合、踩油门[当转速1500或25迈时]→踩离合、松油门→换三档→快松离合(不踩油门)→[无需加油]踩离合→换四档→快松离合、踩离合→换三档→松离合→[把速度降到20迈]踩离合→换2档→慢松离合。 5 变更车道:变更车道前,观察与判断车辆后方、侧方和准备变更的车道上的交通流情况,确认安全后,打开转向指示灯示意,再次通过后视镜观察两侧道路上有无车辆超越,确认准备驶入的车道是否允许留有安全距离。在不妨碍该车道内车辆正常行驶的情况下,平稳转向驶入所需车道后,关闭转向指示灯。 6 靠边停车:听到考官的“靠边停车”的指令后,开右转向灯,看右侧反光镜,观察情况;适量踩下制动踏板;向右转动方向盘(第一把轮向右靠边);在车速降低至低于一档的时速时踩下离合器踏板,当右前轮靠近路沿时,再向左转方向(第二把轮,调正车辆并且调整车身与路沿的距离);向左回转方向(第三把轮,车正轮正)迅速停车。在车辆近停时,稍许抬起制动踏板减缓刹车惯性,平稳停车;拉紧手刹车,挂空档,抬离合器抬刹车踏板,关闭转向灯。整个靠边停车动作完成。 7 直行通过路口、路口左转弯、路口右转弯:需合理的观察四周交通情况,减速或停车观察,根据车辆行驶方向选择相关的车道行驶,正确使用转向灯,根据不同路口采取正确的操作方法,安全通过路口。路口左转弯和路口右转弯的时候重要的是观察两侧环境并减速行驶,不然会有甩车的现象出现。 8 通过人行横道线:在通过人行横道的时候首先减速,观察两侧的交通情况,确认安全以后,合理控制车速通过,遇到行人需停车让行。在此过程中需注意档位,如果减速不及时减档会出现脱档现象。 9 通过学校区域:动作要领是提前减速至30km/h以下,注意观察情况,文明礼让,确保安全通过,遇有学生和行人横过马路的时候应该停车让行。,不得鸣喇叭或与学生抢行。 考试扣分基础点: 1、不观察左、右方交通情况,不合格; 2、不按规定减速慢行,不合格; 3、遇行人通过人行横道不停车让行,不合格。 10 通过公共汽车站:提前减速慢性,观察公共汽车进、出站动态和乘客上下车动态情况,着重注意同向公共汽车前方或对向公共汽车后方有无行人横穿道路。需要保持较大的安全间距进行超越,并随时做好停车避让的准备。 考试扣分基础点: 1、不观察左、右方交通情况 不及格 2、不按规定减速慢行 不及格 11 会车:正确判断会车的地点,前方道路的宽度、坚实情况,路旁行人、车辆情况,路旁停车以及障碍物情况等。会车有危险的时候,控制车速,提前避让,调整会车地点,会车时与对方车辆保持安全间距。在会车时候要注意的细节:会车中不使用紧急制动、猛抬油门、猛打方向盘;不要在有障碍物、窄桥、窄路、隧道、急转弯等复杂地段会车;夜间会车需关闭远光灯。特别注意的事如果有会车让行标志,面对标志的车辆在会车需停车让行。 考试扣分基础点: 1、会车前不使用转向灯 扣20分 2、会车前,开转向灯少于3秒即转向 扣10分 3、在没有中心隔离设施或者中心线的道路上会车时,不减速靠右行驶,并与其他车辆、行人或者非机动车未保持安全距离 不及格 4、会车困难时不让行 不及格 5、横向安全间距判断差,紧急转向避让相对方向来车 不及格 6、在规定的时间、路程内,未按语音指令会车 不及格 12 超车:超车之前,需要保持与被超越车辆的安全距离。观察车辆左侧交通情况,开启左转向灯,选择合理时机,鸣喇叭或交替使用远近光灯,从被超越车辆的左侧超越。切记是从左侧超车哦,超车的时候,侧头观察右侧被超越车辆的动态,保持横向的安全距离。超越之后,在不影响被超越车辆正常行驶的情况下,开启右转向灯,逐渐驶回原车道,关闭转向灯。 在超车队的时候,加速连续超越。若对面道路不能保证安全的横向间距,应及时开右转向灯,见机插入车队,待对面车过后再超越车队。不要在交叉路口、弯道、坡顶、岔路口、会车、被超车辆正在超车的时候超车。 13 掉头:掉头之前开启左转向灯、减速,注意观察路况,同时密切注意来往车辆情况(特别是车速快的车辆),必要时停车等待。掉头行驶只要控制速度,只要速度控制好基本没问题。 14 夜间行驶:起步之前开启前照灯。行驶过程中正确使用灯光。无照明、照明不良的道路使用远光灯;照明情况好的道路、会车、路口转弯、近距离跟车的时候使用近光灯。在超车和通过急弯、坡路、拱桥、人行横道或没有交通信号灯控制路口的时候,应交替使用远近光灯示意。夜考重点就在于灯光的使用。 考试扣分基础点: 1、不能正确开启灯光,不合格。 2、同方向近距离跟车行驶时,使用远光灯,不合格。 3、通过急弯、坡路、拱桥、人行横道或者没有交通信号灯控制的路口时,不交替使用远、近光灯示意,不合格。 4、会车时不按规定使用灯光,不合格。 5、在路口转弯时,使用远光灯,不合格。 6、超车时未变换使用远、近光灯提醒被超越车辆,不合格。 7、对低能见度道路情况判断差,不合格。 8、在有路灯、照明良好的道路上行驶时,使用远光灯,不合格。 END 注意事项 考试时候时刻观察周边情况,安全行驶是关键。听从指令,在做项目之前正常是减速慢行! 一个良好的心态是考试的关键,而且这些考试项目在后期行车中也会经常用到,多联系并养成好习惯很重要。   FROM:http://jingyan.baidu.com/article/e75aca8551b61a142edac68f.html

龙生   18 Dec 2014
View Details

移动终端和pc浏览器版本检测

/* * 智能机浏览器版本信息: * */ var browser = { versions: function () { var u = navigator.userAgent, app = navigator.appVersion; return {//移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器 iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部 }; } […]

龙生   10 Dec 2014
View Details

智能判断移动端和电脑浏览器代码

基于移动端的微信和wap网站开发,日益火起来,下面贴一段智能判断分流的代码,希望对菜鸟有所帮助! <?php function isMobile(){ $useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "; $useragent_commentsblock = preg_match('|(.*?)|',$useragent,$matches) --> 0 ? $matches[0] : "; } function CheckSubstrs($substrs, $text) { foreach ( $substrs as $substr ) { if (false !== strpos($text,$substr)) { return true; } return false; } $mobile_os_list = array ( 'Google Wireless Transcoder', 'Windows CE', 'WindowsCE', 'Symbian', 'Android', 'armv6l', 'armv5', 'Mobile', 'CentOS', 'mowser', 'AvantGo', 'Opera Mobi', 'J2ME/MIDP', 'Smartphone', 'Go.Web', 'Palm', 'iPAQ' ); $mobile_token_list = array ( 'Profile/MIDP', 'Configuration/CLDC-', '160×160', '176×220', '240×240', '240×320', '320×240', 'UP.Browser', 'UP.Link', 'SymbianOS', 'PalmOS', 'PocketPC', 'SonyEricsson', 'Nokia', 'BlackBerry', […]

龙生   10 Dec 2014
View Details

WebBrowser打印设置

webbrowser,居然被用作套打。。。。。。 由于是套打,格式要求很严格,页眉页脚、页边距等等等等。 在网上找到下列代码,做适当修改后基本上能满足要求了,但是由于是用JS修改注册码,因此和客户端的IE设置有很大关系,必须要求客户IE允许Activex。如果不允许,var Wsh=new ActiveXObject("WScript.Shell");将抛出一个异常。 <script language="JavaScript" type="text/javascript"> var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER"; HKEY_Path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\"; //设置网页打印的页眉页脚为空 function PageSetup_Null() { try { var Wsh=new ActiveXObject("WScript.Shell"); HKEY_Key="header"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,""); HKEY_Key="footer"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,""); HKEY_Key="margin_bottom"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"0"); HKEY_Key="margin_left"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"0"); HKEY_Key="margin_right"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"0"); HKEY_Key="margin_top"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"0"); } catch(e){ //alert(e); } } //设置网页打印的页眉页脚为默认值 function  PageSetup_Default() { try { var Wsh=new ActiveXObject("WScript.Shell"); HKEY_Key="header"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&w&b页码,&p/&P"); HKEY_Key="footer"; Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&u&b&d"); } catch(e){} } </script> 第二种方法:直接在.cs文件中写方法。 protected void Page_Load(object sender, EventArgs e) { //PageSetup("", ""); } private void PageSetup(string header, string footer) { Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Internet Explorer\\PageSetup\\", true); rk.SetValue("header", header); rk.SetValue("footer", footer); rk.SetValue("margin_bottom", 0); rk.SetValue("margin_left", 0); […]

龙生   08 Dec 2014
View Details

webBrowser给documenttext赋值

今天使用webbrowser的时候给documenttext赋值老是没用,查了半天资料才发现要先navigate一下才行   最后的使用方法如下   using (WebBrowser wb = new WebBrowser()) { wb.Navigate(“about:blank"); wb.Document.Write(content);   ///需要更改的内容 el = wb.Document.GetElementById("sender"); if (el != null) el.InnerHtml = EnviromentManager.Username;   string html = wb.Document.Body.InnerHtml; } from:http://blog.csdn.net/xiao_rory/article/details/6030160

龙生   08 Dec 2014
View Details

让编程速度慢下来

我老爸经常对我说,“慢点,儿子,这样事情会完成的更快。” 我曾经在旧金山湾区的多家高科技初创公司工作过。现在,我52岁了,我编码时速度慢了、思考的东西多了。 我像一个写代码的设计师;当你读这篇文章的时候你会明显地感觉到这一点:) 最近当我和一些年轻的程序员一起开发一个项目时,慢速编程对我来说是个问题,他们信仰快速实现、迭代式修改代码。开发时,我们被鼓励使用相同的代码库,它就像一大锅汤,如果我们持续地、用力地搅拌它,一个完整的东西就会出现。 然而它不会。 这些程序员中的许多相信所有的工程师都是可替代的这个谬误,以及没人应为代码的任何一方面负责的观点;任何程序员都应能在任何时间改变代码的任何一个片段。毕竟,我们有像github一样能管理、合并任意多的,来自任意数目员工的异步提交的优秀服务。只要每个人经常提交commit,且不破坏任何东西,那么一切都会工作得很好。 扯淡。 你不可能仅靠心意就取代了设计过程。它自文明的曙光以来就一直存在着。而且,即使是那些最新的灵活开发工具,不管它们有多灵活,都不能取代能建立起大教堂,铺设出铁路,拍摄出唱片电影的良好的实践与真实的合作。 同样,再怎么多的编程总量也不能产生一件能节约软件开发时间,把开发速度加快到一堆代码猴子水平的编程工具。 节奏紊乱 让我从快速编程的程序员之中脱颖而出,成为一名慢速程序员的那次意外,其实是一中形式的 节奏紊乱 – 那时候我有一个被其他的程序员笑称是机关枪式迭代的编码节奏. 我的编程风格被描述成拥有各种各样的大小和时间尺度的有机弧线, 其中每一个的开始都是探索、反复尝试以及各种错误、小伎俩,以及临时变量. 基本上,还算是感觉良好. 看上去还是像模像样的. 过段时间后,我会回过头来圈圈点点。每一段弧线的结尾都像是某种准备实现的代码. (“打扫战场”是每个回合结束后必须要折腾的事情). 我编写代码做出贡献的同时,策略、设计方案以及架构上的突发情况不断. 而有时,在一个成熟的机制出现之后, 我却会回过头去重新开始, 因为我那时候就会想到实现某个东西的更好方式. 有时候我是错的。有时候我又是对的. 除非完全成型之后让我眼见为实,否则永远都没办法知道对错. 总而言之,让我们回到一起搞大掺和的程序员们身上. 问题就成了这样: 如果整个软件生态系统没有任何的迟滞和停顿——在发展和应用设计的整个过程中按部就班风平浪静,那么一个人,或者甚至是一个快速的编程者,他是如何做出一个好的设计来的呢? 任何生成快速编程同慢速编程其实一样 (除开前者比较快之外), 都是没有真正理解设计过程的. 同样的原因,很多的神经学家现在都认为类似流体流动的神经元放电会在整个大脑有一种临时占据所有思想和意识的浑(混)响,那就是好的设计需要花费时间. 降低编程速度运动 据wikipedia所说,“降低编程速度运动”是“降速运动”的一部分。这是一种强调仔细设计、品质代码、软件测试与思考的软件开发哲学。这项运动旨在防止不成熟的组装件、有问题的代码和过快的开发周期。 wikipedia同时对“慢软件开发”有着相应的内容:“作为敏捷软件开发运动的一部分,世界上成群的软件开发者期待着具有预见性的项目,旨在获得可持续的职业生涯与工作生活的平衡。他们进行了例如结对工作、代码审查、代码重构等尝试,希望能开发出更令人信赖与强健的软件产品。” 处在旧金山湾区的,由风险投资所支撑的软件开发都是行进在热火朝天的快车道之上的. 在一个流程中资金被动态的投入到了非自然的需求上,其实应该最好是留给设计革新的自然行业节奏上去的. 快并不总是好主意. 事实上,慢一点实际上有时候就意味着更快 – 那种时候所有的东西都是讨论和做好过的. 数字科技是如何侵入我们的自然规律式的节奏的,这一个主题早就被 Rushkoff 的 现实冲击 一问所阐释. 还有另外一个问题: 对技术近乎狂热的崇拜和追求– 迷信般的迷恋着工具. 人们很想知道软件问什么这么烂(是的,它很烂). 软件很烂大都是因为纸上谈兵. 快速的编程者会围绕一些拥有小伎俩的工具去构建一些拥有小伎俩的工具来帮助他们编写代码. 这也是为什么, 我相信软件开发需要各种老人参与其中, 包括: 女性, 教育家, 艺术家. 需要更多的"人-人", 更少的"事-人". 我指的参与, 不是让他们在咨询台服务, 或是装饰下界面(UI flower arranging). 我指的是真正参与开发– 让软件更加人性化. 还好, 我不是码字员. 我的一个朋友, 一个成熟的女性软件工程师, 她有一句名言: “编程不等同于码字”. 虽说这个道理大家都知道, 不过, 常用它来提醒下自己, 也不是什么坏事.  Brendan Enrick 也在讨论这方面的问题. 正是因为敲击键盘的是程序员, 才使得这项工作变成了编程, 而不是码字. 说白了, 编程其实就是, 把各种想法, 设计 语言, 逻辑和心智建构(mental construction)存入计算机记忆体中的一项活动. 我的妻子经常走到院子里问我:“你在编程吗?”我的答案常常是“是的”。我经常是在用花园剪修剪树枝或是在移动堆肥。 植物、泥土和剪刀对于编程的作用就像键盘和发光的屏幕一样。 我们正从工业与经济时代过渡到一个可持续发展的年代。是的,新的软件与生意需要生长。然而,为了可持续性,它们需要缓慢地生长,需要我们的呵护,一如我们对待美酒,对待孩子一般。 from:http://www.oschina.net/translate/the-case-for-slow-programming

龙生   04 Dec 2014
View Details

盘点互联网巨头奉献的十大开源安全工具

Facebook等大型互联网公司推动的服务器与数据中心、大数据工具的开源化项目类似,当大型互联网公司们在超大规模基础设施运营方面面临的挑战 超出技术厂商的能力时,这些巨头就选择反客为主,成为创新技术的推动者和提供者。同样的情况也在信息安全领域中发生着。不少大型互联网公司经常会将自己开 发的顶级安全工具开源,推动整个互联网的安全发展。 本月早些时候安全牛曾介绍过Google开源的web安全测试工具Firing Range、Nogofail以及Facebook开源的Osquery等。 事实上不仅Google、Facebook,包括Netflix甚至Etsy.com这样的电商网站也都贡献过精品开源安全工具。 以下安全牛为大家汇总整理十大互联网巨头的开源安全工具,供大家收藏参考: 一、安全猴 Security Monkey “安全猴”是Netflix三年前开发的一个安全工具,能够对亚马逊云服务的配置进行监控和安全分析,组件功能包括监控各种AWS账号组件,机遇规则的开发和执行活动,在审计规则被触发时通知用户,并存储配置历史信息用作电子取证和审计目的。 二、OSquery OSquery是Facebook刚刚发布的一个安全工具,为安全专业人士提供了一个可调用底层操作系统功能的系统,例如启动进程、加载内核模块、在SQL数据库表中打开网络连接进行查询和监控等。 三、Skyline Skyline是电商网站Etsy技术团队开发的一个类似Nagios的实时异常侦测系统,主要目的是为安全团队提供一个可扩展的被动监控指标体系——可以同时跟踪成百上千的指标。 四、MIDAS MIDAS是Etsy与Facebook安全团队合作为Mac电脑开发的一个轻量级可扩展的入侵侦测系统。开发团队希望从MIDAS开始,企业开始留意OSX系统端点的常见攻击模式。 五、Secureheaders Secureheaders是Twitter送给web开发者的一份大礼,作为一款web安全开发工具,Secureheaders能够自动实施安 全相关的header规则,包括内容安全政策(CSP),防止XSS、HSTS等攻击,防止火绵羊(Firesheep)攻击以及XFO点击劫持等。 六、Google Rapid Response GRR(Google Rapid Response)是Google开发的一个时间响应框架,支持进行远程实时取证。Google将GRR以开源工具的方式与安全界分享,可以作为FireEye/Mandiant 的MIR事件响应平台的替代产品。 七、Scumblr和Sketchy Scumblr和Sketchy是Netflix今年夏天同时发布的两款web应用,可以帮助安全团队监控和记录社交媒体和网络聊天中的安全威胁和攻击。 八、Conceal Conceal是面向Android平台的一组简单的Java API,能够对SD卡等公共存储设备中的大文件进行快速加密和认证。Conceal由Facebook设计,开发者可利用Conceal开发出能适用于老版本Android的内存和处理器开销较低的加密算法。 九、Rappor RAPPOR(Randomized Aggregatable Privacy-Preserving Ordinal Response )是Google上月才发布的隐私工具,能够从终端用户软件采集众包统计数据,同时又不侵犯用户隐私。 十、Moloch Moloch由AOL的技术团队开发,是一个网络流量分析取证工具,能够大规模抓取IPv4数据包,进行索引并存储,可通过一个简单的web界面浏览、搜索和输出所有PCAP数据。 稿源:安全牛 FROM:http://www.oschina.net/news/57334/10-opensource-security-tools

龙生   25 Nov 2014
View Details

缓存是新的内存

这是一次在 defrag 2014的演讲。 这是经过长时间地多次技术变革后的(多个)技术优势之一。你看到了实际上突破。如果你只是看到了其中的一部分,很难正确推断。你要么短期有进展,要么落后很远。令人惊讶的不是事物变化的速度,而是一点一滴长期工程实践的突破。这是史端乔交换机,一个自动连接电话线路设备,在1891年发明的。 1951年,正是转向数字交换技术之时,一个典型的集中式交换中心基本上还是维多利亚时期的技术的放大版。每个转接过来的电话都有自己单独的strowger交换机。 当时来看,这已经是最牛逼的技术。当然我们看来,这只不过是当时世界上最大的蒸汽朋克(Steampunk,背景设在19世纪的科幻小说)风格的装置艺术(art installations)。 对此感到优越感可能是不对的。虽然集成电路(integrated circuit)已经面世65年了,仍然有数亿计的这种设备嗡嗡咔咔地运行着。直到现在,我们才真正地处在完全电子计算(solid-state computing, solid-state与机械相对,指基于半导体的)的转折点。 最令人兴奋的技术转变,一个是新的模型成为可行,另一个是旧的限制不再存在。在我们的工业界,这两种类型的转变都在上演。 分布式计算(distributed computing)现在是贯穿整个软件栈的主导性的编程模型。所谓的中央处理单元(central processing unit)不再是中心化的,甚至都不是一个单元了。它仅仅算是数据之山(a mountain of data)上爬行的一群虫子(Bugs)中的一个。数据库是最后的堡垒。 同时,内存与硬盘存储间的延迟正在变得无关紧要。30年来,数据库性能的主要关心点,在于访问内存与硬盘存储上的随机数据的巨大差别。既然现在我们可以把数据全部放在内存中,这些烦恼统统不用考虑了。当然不是这么简单,你不能用一个B树,mmap一下,然后就能搞定。在完全基于内存的设计方案推出之前还有很多相关的东西要解决。 这两种新趋势产生了完全崭新的方式来思考、设计、构建应用。现在我们来谈下我们怎么达到,我们怎么做的,未来给我们的启示。 (史前时代,从下文看应该是2000年前,用户被描述成恐龙,作者的小幽默) 那时候,架构图里的每个组件都有一个确定的描述与之相关。每个东西都是一个单独的功能: “the” database(数据库), “the” web server(服务器), characters in a one-room drama(用户). 顺便提一下,这就是“the cloud”这个词的来源。一个轻软/毛茸茸的云是WAN的标准符号,而WAN的细节我们完全不用操心。 (2000年,负载均衡解决一切) 容易实现的分布式计算得到了主流的亲睐。多个完全相同的应用程序服务器藏在一个负载均衡器(load balancer)之后,这个均衡器把负载差不多平均地分配到应用程序服务器上去。只负载均衡那些架构中状态无关的部分回避了很多哲学上的问题(理论上的情况?)。当系统扩展时,这些组件从侧翼包抄,最后包围了“the” database。我们告诉自己,给数据库换上更快的磁盘、更快的CPU很正常,毕竟还是只需要一台机器。硬件提供商很高兴地赚着我们的钱。 (2002:备份解决一切) 最后,数据库备份成为合情合理的,加了一个热备份数据库(hot spare database)后,我们的良心得到些许宽慰。然后我们告诉自己,不会再有任何故障了。当然,这种正确性只存在了几分钟。 当然,热备份经常是空闲的(sitting idle)。一旦商业分析员意识到,他们可以在不触及生产数据的情况下,也能对生产数据进行大规模查询,那么所谓的热备份也几乎跟生产数据一样开始忙碌并且至关重要了。我们又告诉自己,在紧急情况下把热备份暂时拿出来也还好。但这就如同说,我们完全没必要带备胎,因为我们可以从其他车上偷一个过来! (2004:memcached/缓存解决一切) 然后,Brad Fitzpatrick发布了memcached,一个可以在内存中缓存数据的守护程序(因此叫memcached, memory cached)。这是个简化版的分布式哈希表,而且确实非常实用,因而之后就在学术界流行起来。它拥有很多特性:备份(a form of replication?),水平分区,负载均衡,简单数学运算等。 我们再次告诉自己,既然大部分的负载都是读,我们为什么还要催促数据库从磁盘一遍一遍做相同的查询?你只需要一组内存很大的小规模(small-calibre,小口径)服务器,当然硬件提供商也高兴地赚我们(买内存)的钱。 也许需要你写些缓存失效(cache invalidation)代码,这听起来不难,对吧。 (2004:memcached解决一切,添加了缓存失效) 确如其声称,memcached的方案使我们受益很长时间。它把硬盘的随机IO操作替换为内存的随机IO操作。尽管如此,那台数据库机器还是越来越大,越来越忙。我们意识到,缓存的内存开销至少会跟工作集一样大(不然就是无效了),再加上让人不能忍的缓存持久化。我们告诉自己,这就是网络级规模(web scale?)的开销。 (2006:水平分区/切分解决一切) 更令人担心的是应用越来越复杂,越来越聊天化(chattier,可能聊天程序对数据库写的次数很多)。几乎每次都会进行多次数据库写操作。现在,写,而不是读,成为了瓶颈。这时我们才最终认真对待数据库切分。Facebook最初是根据university字段来切分其用户数据,然后做成了"哈佛数据库(The Harvard Database)",并且维持了很长一段时间。Flickr是另一个好例子。他们使用PHP手动建立了一个切分系统,这个系统使用用户ID的哈希值来切分数据库,跟memcached根据key来切分很像。在技术交流会上,他们透露,不得不对数据表去规范化(denormalize),以及对一些对象(比如评论、消息、喜欢)进行两次写(doule-write)。 要解决无限伸缩(infinite scaling)总要付出点代价,对吧。 (2008:NoSQL解决一切) 手动切分关系型数据库的问题是,你的关系型数据库已经没了。切分API实际上成为你的查询语言了。你对操作的头疼还没好,而修改一组模式(schema)更加痛苦。 这就需要大家深呼一口气,列出大家选用的SQL实现的所有不足和瑕疵,然后因此责怪SQL。一波潮人似的NoSQL,难民似的XML数据库出现了,并且都作出了根本办不到的承诺。它们提供了自动切分,灵活的模式,一些冗余,…,一开始也就这么多。但是总比自己写要好多了。 你知道,“不用自己写”成为主要卖点的东西总是令人绝望。 (2010:Map/Reduce解决一切) 转移到NoSQL并不比使用手动切分差,因为我们已经放弃了使用常用的客户端工具控制和分析数据的希望。但这没好多少。之前由商业人员(business folks)编写的SQL查询变成了开发人员维护的报表代码。 还记得用于备份和分析的热备份数据库吧?现在它变身为Hadoop filestores以及上层的Hive查询而卷土重来了。既然奏效,商业人员再也不来烦我们了。但一个大问题是,这些系统的操作复杂性。就像航天飞机一样,它们是作为可靠且几乎不用维护的产品出售的,但是最后还是需要大量的手动操作。另一个大问题是,数据的存入和取出:花费一整天的时间已经相当不错了。第三个大问题是IO同时成为网络和磁盘的瓶颈。我们告诉自己,这就是从大数据(big data)毕业的代价。 不管怎样,Google就是这样做的,对吧。 (2012:NoSQL再次解决一切) 随着一些NoSQL数据库的逐渐成熟,它们的API发生了诡异的变化:它们开始长得像SQL一样。这时因为SQL是关系型集合理论(relational set theory)的相当直接的实现,而数学不是那么好愚弄的。 我重述下Paul Graham对Lisp那难以忍受、并自鸣得意的评论:一旦你添加了group by, filter, join,你也不能声称发明了新的查询语言,因为这仅仅算是SQL的一个新方言。而且语法很差,还没有优化器。 由于我们绕过了SQL,大部分系统都缺少了一些很重要的东西,比如存储引擎、查询优化器,而这些都是基于关系型集合理论设计的。拖延到后期去实现导致了严重的性能问题。即使对解决了性能问题的那些(或者通过停驻在内存中来掩盖此问题),也缺少了其他东西,如合适的备份。 我知道一个非常成功的互联网初创公司(你肯定也听过)使用了4个(!!)不同的NoSQL系统来解决问题。 (2014:现在需要什么来解决一切?) 现在已经相当明显,我们不会回到单数据库以及10毫秒一次的随机定位(10-million-nanosecond random […]

龙生   24 Nov 2014
View Details

UPS电源的类别

非在线式UPS也称后备式UPS 平时处于蓄电池充电状态,在停电时逆变器紧急切换到工作状态,将电池提供的直流电转变为稳定的交流电输出,因此后备式UPS也被称为离线式UPS。后备式UPS电源的优点是:运行效率高、噪音低、价格相对便宜,主要适用于市电波动不大,对供电质量要求不高的场合,比较适合家庭使用。然而这种UPS存在一个切换时间问题,因此不适合用在关键性的供电不能中断的场所。不过实际上这个切换时间很短,一般介于2至10毫秒,而计算机本身的交换式电源供应器在断电时应可维持10毫秒左右,所以个人计算机系统一般不会因为这个切换时间而出现问题。后备式UPS一般只能持续供电几分钟到几十分钟,主要是让您有时间备份数据,并尽快结束手头工作,其价格也较低。对不是太关键的电脑应用,比如个人家庭用户,就可配小功率的后备式UPS。   在线式UPS 在线式UPS在工作时,首先将市电转化为直流电给UPS电池充电,同时逆变器(见提示)将此直流电逆变为交流电为负载供电,由于市电经过了交流到直流、再到交流的转换过程,所以市电中原有的干扰和脉冲电压成分已经过滤得非常干净,因此,由在线式UPS逆变出来的电压很稳定。由于逆变电路始终在工作,所以当停电时,UPS能马上将其存储的电能通过逆变器转化为交流电对负载进行供电,从而达到了输出电压零中断的切换目标。另外广告里提到的双变换就是指这款UPS的输出电压经过了两次交直流的互相转换过程。而高频则表示UPS内部工作在高频环境下。高频UPS的好处是体积小,重量轻,工作效率高,其坏处是抗过载抗冲击能力差。

龙生   21 Nov 2014
View Details
1 302 303 304 414