首页 文章 精选 留言 我的

精选列表

搜索[Markdown改进],共10000篇文章
优秀的个人博客,低调大师

苹果、微软、Google 和 Mozilla 共同合作,改进跨浏览器的扩展开发

Firefox、Edge、Safari 和其他众多的浏览器都以 Chrome 的扩展 API 为基础,但每个浏览器都增加了自己的变化,并不完全与 Google 的 API 保持一致。因此对于那些想要支持多个浏览器的扩展程序而言,开发者可能很难进行开发和维护。 值得庆幸的是,苹果、微软、Google 和 Mozilla 这几家浏览器市场占有率排名前几位的公司在今天达成一致,成立了 WebExtensions Community Group(WECG,WebExtensions 社区小组),其目的是使所有浏览器的扩展 API 和功能标准化。 W3C 今天在一篇博文中表示:"我们很高兴地宣布成立了 WebExtensions Community Group,苹果、微软、Google 和 Mozilla 发起成立了这个社区小组,我们欢迎浏览器厂商、扩展程序开发商和其他感兴趣的各方加入到浏览器扩展标准化这一努力中!" 该小组的目标是通过建立一个功能、API 和权限上的共同核心,使扩展程序的开发变得更容易。标准化过程将遵循与网络标准发展相同的模式,但它不会强迫浏览器放弃自家独有功能或 API。每个浏览器厂商都将继续完全独立地运营他们的扩展商店,运用他们自己的技术、审查和编辑政策。 过去几年中,WebExtensions 一直被用作 Chrome 浏览器扩展 API 的通用术语。Opera 在 2013 年转向 Chromium 时采用了它,Firefox 在 2017 年也转向了 WebExtensions API,Safari 在去年增加了对它的支持。然而,不同浏览器的权限和可用的 API 差别很大,所以标准化进程对开发者来说将是个好消息。而基于 Chromium 的浏览器,如 Vivaldi、Brave 和 Edge 浏览器基本上遵循了 Chrome 的实现,仅在 WebExtensions 基础上进行了很少修改。

优秀的个人博客,低调大师

【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

本文主要讨论一下iOS中的Builder Pattern。与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了。设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式,虽然这句话有点拗口!我希望我们都能宏观地看待某个设计模式,不必去太可以追求概念上的东西。事实上,只要你懂得如何应用,那此模式彼模式叫什么名称已经无所谓了。 我们先来看个例子,假设你现在要买一辆车,提出以下一堆要求:白色、价格10万以内、必须是国产车(爱国是必须的)、5座...,用iOS代码描述就是这样的: 1 WZLCar *myCar = [[WZLCar alloc] init]; 2 myCar.color = [UIColor whiteColor]; 3 myCar.price = 100000; 4 myCar.family = @"China"; 5 myCar.seatCount = 5; 6 //...more properties 或者是这样: 1 WZLCar *myCar = [WZLCar alloc] initWithColor:[UIColor whiteColor] price:100000 family:@"China" seatCount:5 ....]; 实际上,以上两种方式分别代表了两种iOS对象的初始化方式。在未使用Builder Pattern之前,这两种初始化对象方式都有不方便的地方。第一种方法灵活,但是如果你接触iOS时间长点就会发现,经常会记不住这个类到底有哪些property需要初始化,尤其是当这个类是被人提供给你的时候!我们多么希望类的提供者能搞点注释啊啥的告知我们一下。第二种方法则很清晰地告诉调用者到底有哪些property需要在创建对象时初始化。但是,当类的提供者有天跟你说:hey,哥们,现在业务逻辑改变了,我增加了一个xxx属性,init方法也变了。这时,你是不是很想打他?每新增一个新的属性,init方法就要变动,而且当需要初始化的属性多大十几二十个时,这个init方法要不要太壮观! 所以,当某个类的属性值很多时,我们可以考虑使用建造者模式Builder Pattern来让初始化过程清晰一些,类的使用者会很感恩你这么做的。用iOS描述大概是这样的: 1 WZLCarBuilder *builder = [[WZLCarBuilder alloc] init];//builder里面列出了所有需要初始化的参数,可以认为是一个to-do list 2 builder.color=[UIColor whiteColor]; 3 builder.price=100000; 4 builder.family=@"China"; 5 builder.seatCount=5; 6 WZLCar *car=[builder build];//build方法产生一个WZLCar实例 其中WZLCarBuilder类的property将WZLCar类中需要初始化的property复制了一遍。当你在实例化一个WZLCar对象而忘记那些参数时,可以跳转到WZLCarBuilder类的头文件看一下就一目了然了。从这种角度看,builder其实就是一个to-do list供类的调用者查阅。有强迫症的同学可以对以上代码并不感冒,因为它显得不够紧凑不够优雅,在初始化一个WZLCar对象前要搞一堆代码。有强迫症的coder大部分都是好程序员,那我们就尝试让它更优雅一些。我们可以这么做: 1 WZLCar *myCar = [WZLCar creatWithBuilder:^(WZLCarBulider *builder){ 2 builder.color = [UIColor whiteColor]; 3 builder.price = 50000; 4 builder.family = @"China"; 5 builder.seatCount = 4; 6 }]; 7 NSLog(@"myCar:%@", [myCar description]); 将builder的配置信息封装到block中,这样代码整体看起来紧凑很多,也给类的调用者很多提示信息。WZLCar的+ (WZLCar *)creatWithBuilder:(WZLCarBuliderBlock)block方法实现如下,详见代码注释部分: 1 + (WZLCar *)creatWithBuilder:(WZLCarBuliderBlock)block 2 { 3 NSParameterAssert(block != nil);//参数单元测试是必须的 4 WZLCarBulider *bulider = [[WZLCarBulider alloc] init]; 5 block(bulider);//这里的builder是一个指针,block内部对其所作的改变都会被保留下来 6 return [bulider build];//build创建一个WZLCar实例 7 } WZLCarBuliderBlock是一个block声明: typedef void (^WZLCarBuliderBlock) (WZLCarBulider *bulder); 剩下的工作就是对WZLCarBuilder的build方法实现了: 1 - (WZLCar *)build 2 { 3 NSAssert(self.color, @"color property is forcely to be initilized!"); 4 WZLCar *car = [[WZLCar alloc] init]; 5 car.color = self.color; 6 car.price = self.price; 7 car.family = self.family; 8 car.seatCount = self.seatCount; 9 return [car autorelease]; 10 } 一些需要调用者强制初始化的参数可以build函数的开头处添加断言,一旦WZLCar类的调用者在初始化时没有初始化color就是断言失败抛出异常。这在多人协同开发时可以省事很多。下面我们像文章开头一般,调用一下WZLCar类: 1 WZLCar *myCar = [WZLCar creatWithBuilder:^(WZLCarBulider *builder){ 2 builder.color = [UIColor whiteColor]; 3 builder.price = 50000; 4 builder.family = @"China"; 5 builder.seatCount = 4; 6 }]; 7 NSLog(@"myCar:%@", [myCar description]); Log确实打印出相应的信息,我就截图了,这就说明builder pattern确实让WZLCar的初始化产生效果。按照上面的代码,如果WZLCar类的使用者一时疏忽忘记初始化color属性,程序会在断言处抛异常: WZLCar *myCar = [WZLCar creatWithBuilder:^(WZLCarBulider *builder){ //builder.color = [UIColor whiteColor]; builder.price = 50000; builder.family = @"China"; builder.seatCount = 4; }]; NSLog(@"myCar:%@", [myCar description]); =================================== 在FaceBook的开源动画框架POP中也有对builder pattern类似的应用: 1 2 3 4 5 6 POPAnimatableProperty *animatableProperty = [POPAnimatableProperty propertyWithName:@ "property" initializer:^(POPMutableAnimatableProperty *prop) { prop.writeBlock = ^( id obj, const CGFloat values[]) { }; prop.readBlock = ^( id obj, CGFloat values[]) { }; }]; 这里的initializer本质上就是builder,只是叫法不同而已。 PS:从本文的builder pattern实现中你也可以抽象出一些东西应用在其他方面,比如利用block来封装一些属性的配置信息,比如iOS8中新增加的UIAlertController类就用到这种思想,是用block让调用者在一个block内给出对UITextField的配置: ##THAT IS ALL. 本文转自编程小翁博客园博客,原文链接:http://www.cnblogs.com/wengzilin/p/4365855.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Palo Alto Networks:网络安全安全策略亟待改进 被动防御不如主动发现

近期,台湾ATM事件、孟加拉央行事件以及刷爆朋友圈的雅虎用户信息泄漏事件频频发生,网络犯罪分子的魔手不断伸向企业和用户。面对日新月异的未知攻击手段,企业和用户虽然在不断加大人力、物力和财力投入,但是他的网络安全防御能力真的提高了吗?老话说“魔高一尺,道高一丈”,比喻正义始终压倒邪恶,笔者认为这句更是指,魔的本领高一招,道的技术就大一层,不管魔怎样变化、升级本领,道都会随着他本领的变化而变化。这样的解读放在网络安全领域也是一样的。在网络攻击技术不断升级的今天,我们的安全防御技术也应该不断变化升级。 传统的安全防御手段,以防御为中心,以已知威胁为假设,以策略为中心,而下一代网络安全架构认为未知威胁永远存在,是以预测为中心,强调主动性和对抗性的安全策略,其基础就是大数据分析和威胁情报。国内安全厂商对于下一代安全理念以及下一代防火墙的理解各有不同,有厂商认为“化被动为主动的方法论”才是下一代防火墙理念,也有安全从业者将下一代安全理念理解为因地制宜的精细化网络管理。于2005年成立的Palo Alto Networks在网络安全领域已经走过了一个十年,一直活跃在网络安全防护一线的 Palo Alto Networks 对于“下一代网络安全”有着自己的理解。 网络攻击发生的数量不断增加,而且正在摧毁我们对在线系统的数字信任。这种信任危机也已延伸到原有的安全架构中,并导致防御失效。所以,在今年伊始,Palo Alto Networks曾发表预测报告认为,“零信任”的安全防御机制将被更广泛的应用。同时,Palo Alto Networks认为下一代安全解决方案应该是一个整体化的平台,应该以平台化的防御手段代替点状分布的安全防御机制,抵御攻击链。可见,对于网络安全的防御,Palo Alto Networks越来越趋于主动。 日前,Palo Alto Networks召开了媒体沟通会,分享了其进一步的新安全防护理念。Palo Alto Networks认为,网络攻击将会是“新常态”,企业应对的关键在于增强网络的免疫力,尽快建立下一代网络安全架构。 Palo Alto Networks大中华区总裁徐涌介绍到:“目前企业面临的主要安全挑战是攻击的成本和防御的成本的不均衡。”也就是说,目前我们面临的安全挑战之一就是“安全攻防成本失衡”,攻击者在利益驱动下不断升级攻击方式,而我们作为防御方,根本没有做到“道高一丈”。虽然企业在不断增加大量经费来平衡这个差异,但是,不管如何努力,企业被攻击的事件仍不断地发生。徐涌进一步介绍到,目前企业针对这个问题还存在两个误区,一是企业想通过不断打补丁的方式增强自身的安全防御能力,这虽然在一定程度上加强了企业的安全防御,但如果不进行企业策略和安全架构的更新,仅仅是这样修修补补,也会增加很多潜在的风险;二是企业认为只要进入内网就能安全无虞,但事实是相反的,据有关数据表明,90%以上的攻击都是从企业内部发起的,所以内网也并不安全。 Palo Alto Networks大中华区总裁 徐涌 那么,面多黑客攻击成本降低而产生的次数更频繁、形式更为复杂多样的网络攻击,企业应该怎么做呢?徐涌表示,Palo Alto Networks将预防理念转化为产品,实现所有功能无缝集成、协同工作,适用于所有用户、应用程序和地点,并且还能自动发现并对网络和终端重新编程,能够有效帮助企业防止已知和未知威胁。 Palo Alto Networks认为,建立下一代网络安全架构,让企业网络安全拥有“免疫力”就是将下一代安全平台定义为面向云、网络及终端的全新体系,帮助企业实现自动化防御。以Palo Alto Networks下一代高级端点安全防护解决方案Traps为例。Traps是Palo Alto Networks 下一代安全平台 (Next-Generation Security Platform) 的组成部份,是为保护应用安全运行、有效防御网络攻击而设计的一个一体化自动化平台。Traps从Palo Alto Networks 云恶意软件分析平台 Palo Alto Networks WildFire分享并接收威胁情报,无论威胁来自何方,利用这些信息,Traps都可以对这些针对终端的威胁实施有效拦截,其最大的特点就是无需联网、无需更新。 Palo Alto Networks致力于成就一个利用云端运算能力,将防火墙、网关、威胁云平台等产品和防御手段智能集成整合的安全防御平台,覆盖端点、系统、协议几个方面,对整个系统实施全方面的保护,并可根据客户需要,灵活的调整和部署所需要的解决方案以及扩展其他安全功能。 Palo Alto Networks中国区技术总监程文杰具体介绍如何增强网络的“免疫力”时,提出四点建议。 一是实现应用可视化,减少被攻击途径。建立网络流量的可视化,分析并阻止未知流量,实施基于应用和用户的访问控制策略,阻止高危应用中的危险文件类型,部署与风险对应的终端保护策略。 二是预防已知威胁。阻止已知的漏洞攻击、恶意软件,阻止对恶意或钓鱼URL的访问,扫描SaaS应用中的已知恶意软件,阻止终端上的恶意软件和漏洞利用。 三是预防未知威胁。检测、分析文件及URL中的未知威胁,在整个组织中自动更新对未知威胁的识别和防御能力,建立积极的威胁防御和缓解机制,在终端上阻止未知恶意软件和漏洞利用行为。 四是建立整合安全防御平台。正确进行部署和定位,将物理和虚拟化环境相结合,充分利用最佳安全信息技术资源和多重检测与预防机制,建立全球性的威胁分析知识体系,并具备快速响应机制。 Palo Alto Networks中国区技术总监 程文杰 当然,100%安全的防御策略是不存在的,徐涌在媒体沟通会上也表示“没有一个安全公司可以保证你的企业100%不被攻入,但Palo Alto Networks能够做的就是让成功攻击的成本急剧上升,帮助企业减少因网络攻击遭受更多损失。” 原文发布时间为:2016年10月10日 本文作者:杨昀煦 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册