搜索

tag 标签: 如何

相关帖子

版块 作者 回复/查看 最后发表
如何将CAD文件成功的转换为PDF图 信息发布 老衲的秘密 2017-5-22 0 0 老衲的秘密 昨天 15:45
那我们该如何选购贴片电感?-驰兴科技 attach_img 工作这点儿事 chixingkeji 2017-5-22 0 0 chixingkeji 昨天 15:45
在线网站如何翻译PDF文件 信息发布 小酒鬼qq 2017-5-22 0 0 小酒鬼qq 昨天 10:23
如何删除PDF文件中的注释 attach_img 信息发布 小酒鬼qq 2017-5-22 0 0 小酒鬼qq 昨天 09:40
如何保护ADC输入 【TI模拟技术体验】 fish001 2017-5-20 0 0 fish001 3 天前
初办河道整治专业丙级资质需要多少钱人员如何编写业绩 信息发布 qigong2012 2017-5-20 0 0 qigong2012 3 天前
如何加入Led二极管? attach_img 【51单片机】 wh8010jky 2017-5-19 11 217 ywlzh 3 天前
U盘误删的文件要如何恢复 信息发布 13297807174 2017-5-19 0 0 13297807174 4 天前
大时代中光子是怎么样的存在 信息发布 太阳能 2017-5-19 0 0 太阳能 4 天前
如何使用文字识别软件 attach_img 信息发布 小酒鬼qq 2017-5-19 0 0 小酒鬼qq 4 天前
如何选择贴片保险丝 信息发布 somay 2017-5-19 0 0 somay 4 天前
误删除的文件如何恢复 信息发布 13297807174 2017-5-18 0 0 13297807174 5 天前
如何在CAD看图软件中更改文字样式 信息发布 老衲的秘密 2017-5-18 0 0 老衲的秘密 5 天前
PDF文件添加数字签名的正确做法 attach_img 信息发布 华夏后裔 2017-5-18 0 0 华夏后裔 5 天前
扫描文件转换成word文档 快速转换只需一步 attach_img 信息发布 华夏后裔 2017-5-18 0 0 华夏后裔 5 天前
WORD在线免费转换成PDF如何操作 信息发布 小酒鬼qq 2017-5-18 0 0 小酒鬼qq 5 天前
如何生成嵌入网页直播的HTML代码 attach_img TI技术论坛 go800li 2017-5-18 0 0 go800li 5 天前
U盘删除的文件该如何恢复 信息发布 思小妞 2017-5-18 0 0 思小妞 5 天前
硬件设计如何选择连接器(转) attach_img 【跟TI学电源】 qwqwqw2088 2017-5-17 0 202 qwqwqw2088 6 天前
DCDC如何控制输出电压的时序 attach_img 模拟电子 elec32156 2017-5-17 11 199 huaiqiao 昨天 18:12

相关日志

分享 (转发聚源电子)初步了解iPhone 8如何利用无线充电线圈来实行无线充电
juyuandianzi 2017-5-22 15:18
近期,一年一发布的 iPhone 8 传闻将实行无线充电,那我们就来 初步的了解下 iPhone 8是如何利用无线充电线圈来实行无线充电的 吧 iPhone 8 传闻将实行无线充电后,马上就有人爆料出了 一张 iPhone 8 的背部透视示意图。 从图片中我们可以看到其中最为显眼的就是中间部位那个巨大的无线充电线圈加上旁下方的无线充电模块,这两个元件几乎就元件占据了整个后壳将近三分之一的面积。而且从图中我们还可以看到无线充电线圈的走向无论是形状还是大小比例,这个 无线充电线圈 和无线充电模组都是与三星 S8 的无线充电组件特别的类似。 而这层无线充电线圈是在电池上面,可以拆卸下来的 那我们可以再来看下无线充电线圈的充电原理。 无线充电线圈的充电原理: 无线充电系统主要采用电磁感应原理,通过线圈进行能量耦合实现能量的传递。如图所示,系统工作时输入端将交流市电经全桥整流电路变换成直流电,或用24V直流电端直接为系统供电。 经过电源管理模块后输出的直流电通过2M有源晶振逆变转换成高频交流电供给初级绕组。通过2个电感线圈耦合能量,次级线圈输出的电流经接受转换电路变化成直流电为电池充电。 变化的磁场会产生变化的电场,变化的电场会产生变化的磁场,其大小均与它们的变化率有关系,而正弦函数的变化率是另外一个正弦函数,所以电磁波能够传播出去,而感应电压的产生与磁通量的变化相关,所以线圈内部变化的磁场产生感应电压,从而完成充电过程。 无线充电 是比较新颖的充电方式,其原理其实很简单,就是将普通的变压器主次级分开来达到无线的目的。当然,无线充的工作频率比较高,甚至可以抛弃铁心直接线圈之间就可以达到能量传递的作用 由此可见即将发布的iPhone 8要和三星一样将无线充电线圈放置于后部来进行无线充电也是可以的哦, 当然毕竟iPhone 8还没有上市呢?一切也都只能是猜测而已,不如我们就一起对iPhone 8的无线充电拭目以待吧!
16 次阅读|0 个评论
分享 超声波传感器模块如何测距后控制外连12v开关闭合
easonas 2017-5-5 16:23
如题,超声波传感器模块如何测距后控制外连12v开关闭合。
58 次阅读|0 个评论
分享 从架构的角度看,如何写好代码?
huicnet 2017-5-2 09:29
软件架构实际上包括:代码架构,以及承载代码运行的硬件部署架构。实际上,硬件部署架构最终还是由代码的架构来决定。 因为代码架构不合理,是无法把一个运行单元分拆出多个来的,那么硬件架构能分拆的就非常的有限,整个系统最终很难长的更大。 所以我们经常会听说,重写代码,推翻原有架构,重新设计等等说法,来说明架构的进化。 这实际上就是当初为了完成任务,没有充分思考所带来的后果。这也并不是架构进化的事情,而是个人对问题领域的逐渐深入理解的过程。 所以有必要再讨论一下,代码的架构应该是怎样的。 本文会进一步探讨如何把架构的思考进行落地,细化到我们代码的实践当中,尽量不要让代码成为系统长大的瓶颈,降低架构分拆的成本。 在前面我们提到,软件实际上是对现实生活的模拟,虚拟化。这是一个非常重要的前提,直接决定了我们的代码应该分为几部分。结合每个部署单元所承担的责任,可以明确的拆分为两个不同的责任: 表达业务逻辑的代码。很多人把这部分叫做Domain Logic,或者叫Domain Model。这部分实际是来源于生活的,必须保持和现实生活中的切分一致,并非人为的抽象而成。 对用户提供访问并保存业务逻辑运行结果的代码。计算机的状态保存有一个缺陷,本机保留业务运行结果有很大的问题,一般都在外存储设备上保存,也便于扩展。 所以单个部署单元的代码可以分为两个部分,如下图所示: 从这个图中可以看出,软件代码的相关利益人为运行时的访问人员和存储设备。而service的代码是最复杂的,需要服务于三方,代码人员的负担是最重的。 为了把这三方的变化对service的影响降到最低,对于service还必须进一步的分拆为三个部分,让每一个部分都能够独立的变化,这样这三方的变化就不会产生连锁响应,降低成本。如下图所示: 这样,就划分成了几个责任: Service就专注于user的需求,并组合Glue Code提供的服务完成需求。 Glue Code专注于组合business的调用,管理Business里面对象的生命周期,并且通过Repository保存或加载Business的状态 Business专注于实现业务的核心模型。 Repository专注于数据的保存,并和存储设备一一对应。 大家注意看,还是树形架构。并且左侧的主要需要计算机的相关理论知识,并且要直接面对用户的需求。 右侧的更多的需要面对业务的核心。只要这几块的开发人员互相商量好了接口定义,这几个部分的开发就可以并行的进行,极大的提升开发的效率,缩短开发的时间。 要做好这几部分,还需要注意,逻辑只允许存在于Business中,Service、Glue Code、Repository都不允许存在业务逻辑。为什么呢?首先我们来看看什么叫业务逻辑。 1 什么叫业务逻辑? 首先这个定义的前提是指软件代码中的逻辑,不是现实生活中的逻辑。在软件代码中,不需缩进和计算的顺序调用,包括缩进的代码目的是catch exception的,都不算逻辑,除此以外都是逻辑。 以下用严格的顺序调用来指代这种代码。因为顺序调用是计算机的特性,由编译器来决定的,当然最本质的是因为我们计算的基础都是图灵机。 在现实生活中,顺序调用也是逻辑,大家不要和我们这里说的业务逻辑相混淆。 为什么说除了Business代码中有逻辑以外,其他地方不能有逻辑呢? 我们每个部分分别分析: 如果service里面不是严格的顺序调用,有很多分支,那么说明这个service做了两件或者两件以上的事情。必须把这个service分拆,确保每个service只做一件事情。 因为如果不这么分拆的话,一旦这个service中的某各部分发生变动,其他的部分的执行必定会受影响。而确定到底有哪些影响的沟通成本非常高,其他相关利益方没有动力去配合,我们往往不会投入精力仔细评估。 最后上线会出很多不可预料的问题,最终会导致损失用户的利益,并且肯定会导致返工,损坏自己的利益。如果是有计算的逻辑的话,比如受益计算,订单金额计算等,那么这部分应该是Business代码需要完成的,不能交给service代码来实现。 Glue Code里面如果不是严格的顺序调用,同理会和service一样遇到同样的问题。 Repository里面如果不是严格的顺序调用,包括存储访问的代码里面(比如SQL),会导致逻辑进入到存储设备中。 存储设备的主要目的是拿来存储的,一旦变成了逻辑计算的主体,就会导致存储设备无法通过增加机器的方式横向扩展长大。这个时候就没有架构了,只能换性能更好的机器,这个叫scale up。只有scale out才能算架构。 以上都会导致架构无法快速的横向扩展和分拆,并且增加了修改的成本,这些是不符合开发人员以及业务的利益的。 2 这么做的好处有哪些呢? Service、Glue Code、Repository里面的代码是严格的顺序调用,那么这些代码只要做连通性测试即可,不需要单元测试。因为这些代码都需要和很多上下文打交道,很难做单元测试。这样才算是真正的组合。 Business不访问任何上下文,不访问任何具体的设备,所以这部分代码是非常容易些单元测试的,并且单元测试必须100%覆盖。 因为其他地方没有业务逻辑,所以一旦有问题,就可以断定是Model的问题,单元测试肯定可以发现。如果单元测试没有发现问题,那么单元测试一定有问题。线上问题的模拟也就变得非常的简单,单元测试也能够得到进一步的补充。 Repository很容易按照存储设备本身的最小访问粒度来完成工作,比如DB,完全可以做到单表访问。 因为这个时候存储设备只关心存取数据,完全和业务没有关系。做表的分拆也是非常容易的事情,存储设备通过增加机器就可以横向扩展长大。很多人会担心说,没有了join,访问DB的次数是不是更多了,会导致性能下降? 按照现在网络的条件,网络访问和Disk IO访问的差距已经不大了,合理的设计下,多访问几次DB并不会导致这个问题。另外如果多台DB的话,还能通过并行加速访问。 由于Service、Glue Code、Repository代码简单了,才可以让我们的开发人员投入更多的时间研究业务,毕竟这部分才是软件所真正服务的对象。 我们再来看一个实际的例子,如下图所示: Manager类实际就是Glue Code。有几个注意点需要说明一下: 不能把Business Model当做数据对象来处理,Model关心的实际上是业务行为,数据只是是这些行为的结果。所以Glue Code需要把Model转换为Entity,Entity和存储设备里面的存储粒度一一对应。 比如在DB中,每个Entity对应一张表,并且跟着表的变化而变化,这样就保证存储的变更不会影响Model。同样Service和用户之间的数据交互,也是不会和Model之间相关的,确保用户的需求变化,不会影响到Model。 因为用户的需求变化是最频繁的,没有逻辑,可以让我快速的满足业务的需求。 在Service这里,最好不要考虑代码重用。因为当多个不同的角色访问同一个接口,一旦某个角色的需求发生了变化,就会要求开发人员去修改。 而这个修改往往会影响到其他的角色,需要这些角色一起配合来确定是否受影响,但是这些角色因为没有需求,往往不会配合。这样就给开发人员造成了很多不必要的沟通,成本是非常高的。 最终都会导致线上Bug,影响最终的用户。所以尽量给不同的角色不同的Service,避免重用,降低沟通成本。很多人会说这样Service不就太多了吗? 这样Service注册,查找等管理需求就出现了,Service治理中心就是来解决这个问题的。 因为Service里面没有逻辑,所以开发和管理非常的简单,可以快速应对业务的变化。我们只有更快地变,更容易的变,才能更好地应对变。 Business Model是必须要重用的,一旦发现重用出现问题,那么说明Business Model的识别出现了问题,这是一个我们要重新思考Model的信号。 Business Model必须是一个完美的树状,如果不是,也说明Model的识别出了问题。 在实际操作中,Service、Glue Code、Repository不能有逻辑,实际上和很多人的观念是冲突的,认为这个根本做不到。做到这一点需要很多的学习成本,但是一定可以做得到。 当发现做不到的时候,可以断定是业务的分析出了问题。比如不该合并的合并了,不该计算的计算了。这个问题一定有办法解决的,做不到都是理由,无非是想早点把自己的工作结束罢了。 虽然刚开始会比较困难,一旦把这个观念变成自觉,开发的质量和效率马上就能高好几个级别。 我的游泳教练曾和我说过这些话,我至今记忆犹新:“业余选手,越想从水里浮起来,就越想把头抬起来,身体反而沉下去。只有克服恐惧,把头往水里压下去,身体才能够从水里浮起来。真正专业的习惯往往是和我们日常的行为相反的”。 我们真正想快速的完成代码工作,就要克服自己对时间的恐惧,真正的去研究业务的问题,相关stakeholder的利益,把这个变成我们的习惯。 写代码的时候让该出现逻辑的地方出现逻辑,让不该出现的地方不能出现。一旦不该出现的地方出现了逻辑,那么要马上意识到,这个地方是一个坑,这个问题一定和业务的分析不透彻有关系。 很多人可能会把这个做法和Martin Fowler曾经提出过充血模型和贫血模型来比较,和Domain Driven Design来比较,其实没有必要。 这个分拆完全是从软件所解决的问题,根据软件架构推导出来的,很多地方和两位前辈的观点是一致的,但是并不完全等同。 以上只是针对单一的Service部署单元的分析,扩展开去,对于其他的部署单元也是类似的。每个单元的下一级都可以认为是Repository,每个单元的上一级都可以认为是User。 这些实践在我自己的项目中都有用到,非常的有效,迭代的速度非常的快。很多人担心Business Model建不好,其实没关系,刚开始可以粗糙一点,后续可以慢慢的完善。 这个架构已经隔离好了每个部分的变化对其他部分的影响,变化成本都在可控的范围之内。
106 次阅读|0 个评论
分享 谷歌是如何抓取并分析页面里的JavaScript的?
huicnet 2017-4-13 15:53
我们测试了谷歌爬虫是如何抓取 JavaScript,下面就是我们从中学习到的知识。 认为 Google 不能处理 JavaScript ?再想想吧。Audette Audette 分享了一系列测试结果,他和他同事测试了什么类型的 JavaScript 功能会被 Google 抓取和收录。 长话短说 1. 我们进行了一系列测试,已证实 Google 能以多种方式执行和收录 JavaScript。我们也确认 Google 能渲染整个页面并读取 DOM,由此能收录动态生成的内容。 2. DOM 中的 SEO 信号(页面标题、meta 描述、canonical 标签、meta robots 标签等)都被关注到。动态插入 DOM 的内容都也能被抓取和收录。此外,在某些案例中,DOM 甚至可能比 HTML 源码语句更优先。虽然这需要做更多的工作,但这是我们好几个测试中的一个。 引言:Google 执行 JavaScript 读取 DOM 早在 2008 年, Google 就 成功抓取 JavaScript,但很可能局限于某种方式。 而在今天,可以明确的是,Google 不仅能制定出他们抓取和收录的 JavaScript 类型,而且在渲染整个 web 页面上取得了显著进步(特别在最近的 12 到 18 个月)。 在 Merkle,我们的 SEO 技术团队想更好地理解谷歌爬虫能抓取和收录什么类型的 JavaSscript 事件。经过研究,我们发现令人瞠目的结果,并已证实 Google 不仅能执行各种 JavaScript 事件,而且能收录动态生成的内容。怎么样做到的?Google 能读取 DOM。 DOM 是什么? 很多搞 SEO 的都不理解什么是 Document Object Model(DOM)。 当浏览器请求页面时会发生什么,而 DOM 又是如何参与进来的。 当用于 web 浏览器,DOM 本质上是一个应用程序的接口,或 API,用于标记和构造数据(如 HTML 和 XML)。该接口允许 web 浏览器将它们进行组合而构成文档。 DOM 也定义了如何对结构进行获取和操作。虽然 DOM 是与语言无关的 API (不是捆绑在特定编程语言或库),但它普遍应用于 web 应用程序的 JavaScript 和 动态内容。 DOM 代表了接口,或“桥梁”,将 web 页面与编程语言连接起来。解析 HTML 和执行 JavaScript 的结果就是 DOM。web 页面的内容不(不仅)是源码,是 DOM。这使它变得非常重要。 JavaScript 是如何通过 DOM 接口工作的。 我们兴奋地发现 Google 能够读取 DOM,并能解析信号和动态插入的内容,例如 title 标签、页面文本、head 标签和 meta 注解(如:rel = canonical)。可阅读其中的完整细节。 这一系列测试和结果 因为想知道什么样的 JavaScript 功能会被抓取和收录,我们单独对 谷歌爬虫 创建一系列测试。通过创建控件,确保 URL 活动能被独立理解。下面,让我们详细划分出一些有趣的测试结果。它们被分为 5 类: JavaScript 重定向 JavaScript 链接 动态插入内容 动态插入 Meta 数据 和页面元素 一个带有 rel = “nofollow” 的重要例子 例子:一个用来测试谷歌爬虫理解 JavaScript 能力的页面。 1. JavaScript 重定向 我们首先测试了常见的 JavaScript 重定向,用不同方式表示的 URL 会有什么样结果呢?我们选择了 window.location 对象进行两个测试:Test A 以绝对路径 URL 调用 window.location,而 Test B 使用相对路径。 结果:该重定向很快被 Google 跟踪。从收录来看,它们被解释为 301 – 最终状态的 URL 取代了 Google 收录里的重定向 URL。 在随后的测试中,我们在一个权威网页上,利用完全相同的内容,完成一次利用 JavaScript 重定向到同一个站点的新页面。而原始 URL 是排在 Google 热门查询的首页。 结果:果然,重定向被 Google 跟踪,而原始页面并没有被收录。而新 URL 被收录了,并立刻排在相同查询页面内的相同位置。这让我们很惊喜,以排名的角度上看,视乎表明了JavaScript 重定向行为(有时)很像永久性的 301 重定向。 下次,你的客户想要为他们的网站完成 JavaScript 重定向移动,你可能不需要回答,或回答:“请不要”。因为这似乎有一个转让排名信号的关系。支持这一结论是引用了 Google 指南: 使用 JavaScript 为用户进行重定向,可能是一个合法的做法。例如,如果你将已登录用户重定向到一个内部页面,你可以使用 JavaScript 完成这一操作。当仔细检查 JavaScript 或其他重定向方法时,以确保你的站点遵循我们的指南,并考虑到其意图。记住 301 重定向跳转到你网站下是最好的,但如果你没有权限访问你网站服务器,你可以为此使用 JavaScript 重定向。 2. JavaScript 链接 我们用多种编码方式测试了不同类型的 JS 链接。 我们测试下拉菜单的链接。历史上的搜素引擎一直不能跟踪这类型的链接。我们想确定 onchange 事件处理器是否会被跟踪。重要的是,这只是执行特定的类型,而我们需要是:其它改动后的影响,而不像上面 JavaScript 重定向的强制操作。 例子: Google Work 页面的语言选择下拉菜单。 结果:链接被完整地抓取和跟踪。 我们也测试了常见的 JavaScript 链接。下面是最常见类型的 JavaScript 链接,而传统的 SEO 则推荐纯文本。这些测试包括 JavaScript 链接代码: 作用于外部 href 键-值对(AVP),但在一个标签内(“onClick”) 作用 href 内部 AVP(“javascript : window.location”) 作用于 a 标签外部,但在 href 内调用 AVP(“javascript : openlink()”) 等等 结果:链接被完整抓取和跟踪。 我们下一个测试是更进一步地测试事件处理器,如上面测试的 onchange。具体地说,我们希望利用鼠标移动的事件处理器,然后隐藏 URL 变量 ,该变量只在事件处理函数(在该案例是 onmousedown 和 onmouseout)被触发时执行。 结果:链接被完整抓取和跟踪。 构造链接:我们知道 Google 能执行 JavaScript,但想确认它们是否能读取代码里的变量。所以在该测试中,我们连接能构造 URL 字符串的字符。 结果:链接被完整抓取和跟踪。 3. 动态插入内容 很明显,这些都是重点:动态插入文本、图像、链接和导航。优质的文本内容对搜索引擎理解网页主题和内容是至关重要的。在这个动态网站的时代,它的重要性是无需质疑的。 这些测试,设计出来是为了检查在两个不同场景下动态插入文本的结果。 1. 测试搜索引擎能否统计动态插入的文本,而文本是来自页面 HTML 源码内的。 2. 测试搜索引擎能否统计动态插入的文本,而文本是来自页面 HTML 源码外的(在一个外部 JavaScript 文件内)。 结果:在两个案例中,文本都能被抓取和收录,并且页面是根据该内容进行排名。爽! 为了了解更多相关信息,我们测试了一个通过 JavaScript 编写的客户端全局导航,而导航里的链接都是通过 document.writeIn 函数插入,并且确定它们能被完全抓取和跟踪。应该指出的是:Google 能解释使用 AngularJS 框架 和 HTML5 History API(pushState)构建的网站,能渲染和收录它,并能像传统静态网页一样排名。这就是 不禁止谷歌爬虫 获取外部文件和 JavaScript 的重要性,而且这也许是 Google 正在从 《支持 Ajax 的 SEO 指南》 中移除它的原因。当你能简单地渲染整个页面时候,谁还需要 HTML 快照呢? 经过测试后发现,不管什么类型的内容,都是同样的结果。例如,图像加载到 DOM 后会被抓取和收录。我们甚至做了这样的一个测试:通过动态生成 data-vocabulary.org 结构数据来制作 breadcrumb(面包屑导航),并将其插入 DOM。结果呢? 成功插入后的面包屑出现在搜索结果中了 (search engine results page)。 值得注意的是,Google 现在 推荐用 JSON-LD 标记 形成结构化数据。我敢肯定将来会出现更多基于此的东西。 4. 动态插入 Meta 数据 页面元素 我们将各种对 SEO 至关重要的标签动态插入到 DOM: Title 元素 Meta 描述 Meta robots Canonical tags 结果:在所有案例中,标签都能被抓取,其表现就像 HTML 源码里的元素一样。 一个有趣的补充实验帮助我们理解优先顺序。当存在冲突信号时,哪一个会胜出呢?如果源码里有 noindex、nofollow 标签,而 DOM 里有 noindex、follow 标签的话,将会发生什么呢?在这协议里,HTTP x-robots 响应头部的行为如何作为另一个变量?这将是未来综合测试的一部分。然而,我们的测试显示:当冲突时,Google 会无视源码里的标签,而支持 DOM。 5. 一个带有 rel =“nofollow” 的重要例子 我们想测试 Google 如何应对出现在源码和 DOM 的链路级别的 nofollow 属性。我们也因此创建了一个没有应用 nofollow 的控件。 对于 nofollow ,我们分别单独测试源码 vs DOM 生成的注解。 源码里的 nofollow 正如我们所期待的那样运行(链接没被跟踪)。而 DOM 里的 nofollow 却失效(链接被跟踪,并且页面被收录)。为什么?因为在 DOM 里修改 href 元素的操作发生得太晚了:Google 在执行添加 rel=”nofollow” 的 JavaScript 函数前,已准备好抓取链接和队列等待着 URL。然而,如果将带有 href =”nofollow”的 a 元素插入到 DOM,nofollow 和链接因在同一时刻插入,所以会被跟踪。 结果 从历史角度上看,各种 SEO 推荐是在任何可能的时候,要尽可能专注 ‘纯文本’ 内容。而动态生成内容、AJAX 和 JavaScript 链接会损害主流搜索引擎的 SEO。显然,这对 Google 不再是问题。 JavaScript 链接以类似普通的 HTML 链接方式运行(这只是表面,而我们不知道幕后程序进行了什么操作)。 JavaScript 重定向都会以类似于 301 重定向方式对待。 动态插入内容,甚至 meta 标签,如 rel canonical 注解,无论在 HTML 源码,还是在最初 HTML 被解析后触发 JavaScript 生成 DOM ,都以同等方式对待。 Google 视乎能完全渲染页面和理解 DOM ,而不仅是源码。实在是令人可不思议!(记得允许谷歌爬虫获取那些外部文件和 JavaScript。) Google 已经在创新方面,以惊人的速度将其它搜索引擎甩在身后。我们希望看到其它搜索引擎能有同样类型的创新。如果他们要保持竞争力,并在 web 新时代取得实质性进展,这意味着它们要更好地支持 HTML5、JavaScript 和 动态网站。 对于 SEO,那些没有理解上述基本概念和 Google 技术的人,应该好好研究和学习,以赶上当前技术。如果你不把 DOM 考虑在内,您可能会丢失一半份额。
106 次阅读|0 个评论
分享 五分钟理解Java的反射API
huicnet 2017-3-21 10:46
目录 反射API 基本类型和方法 注解 概要 注释 像java一样,一种具有反射功能的语言。允许开发人员在运行时检查类型、方法、字段、注解等,并在程序运行时决定是否使用。 为此,Java的反射API提供类,类,字段,构造函数,方法,注释和其他。 使用它们可以与编译时未知的类型进行交互,例如创建未知类的实例并对它们调用方法。 这个快速提示旨在让您深度了解什么是反射,它在Java中的使用,以及它可以用于什么。 之后,你将准备好开始或工作更长的教程。 为了充分使用它,你应该很好地理解Java的类构造器,特别是什么类和方法以及它们如何关联。 了解注释可解锁单独的部分。 Reflection API 我们从一个简单的Java代码开始(代码针对有一定java基础的阅读人员) URL url = new URL( "https://sitepoint.com/java" ); String urlString = url .toExternalForm(); System.out.println(urlString); 我决定 在编译时 (即当我在写代码时)创建一个URL对象,并且调用了其中的一些方法。下面演示了我使用Java的反射API完成了同样的事情: // the gateway to reflection is the `Class` instance // for the class you want to operate on Class? type = Class.forName( "java.net.URL" ); // fetches the constructor that takes a `String` argument // and uses it to create a new instance for the given string Constructor? constructor = type . getConstructor (String. class ); Object instance = constructor.newInstance( "https://sitepoint.com/java" ); // fetches the `toExternalForm` method and invokes it on // the instance that was just created Method method = type . getMethod ( "toExternalForm" ); Object methodCallResult = method.invoke(instance); System.out.println(methodCallResult); 使用反射API的确比直接写代码要笨重一点. 但是使用反射你会发现,你在代码当中的调用细节 (比如说我用的URL这个类以及我调用其中的方法) 变成了仅仅一个参数. 结果呢,在编译期间URL以及toExternalForm并没有绑定, 它们是在程序开始运行的时候才被决定绑定的 反射的大多数用例都是“框架”的场景下,想想junit, 比如说, 执行所有被@ test注解的方法. 一旦框架在classpath扫描的时候找到注解它就会调用getMethod以及invoke函数去执行用户代码. spring和其他的一些web框架在搜索控制器以及url映射的收也差不多是这么做的,对可扩展的应用程序来说反射的另外一个用途就是在运行时加载用户提供的插件 基本类型和方法 调用反射API的方法是Class :: forName。 在它的简单形式中,这个静态方法只需要一个完全限定的类名,并为它返回一个Class实例。 该实例可用于获取字段,方法,构造函数等。 通过构造器函数获取类对象,getConstructor方法可以使用构造函数参数的类型调用,就像我上面做的那样。 类似地,可以通过调用getMethod并传递其名称以及参数类型来访问特定方法。 上面的getMethod(“toExternalForm”)调用没有指定任何类型,因为该方法没有参数。 这里有一个方法: Class? type = Class.forName( "java.net.URL" ); // `URL::openConnection` has an overload that accepts a java.net.Proxy Method openConnection = type . getMethod ( "openConnection" , Proxy. class ); 这些调用返回的实例分别是Constructor和Method类型。 要调用底层成员,他们提供类似于Constructor :: newInstance和Method :: invoke的方法。 后者的一个有趣的细节是,要调用该方法的实例需要作为第一个参数传递给它(它指类的实例)。 其他参数将被传递给被调用的方法。 继续openConnection示例: openConnection .invoke (instance, someProxy); 如果要调用静态方法,则将忽略实例参数,因此可以为null。 注解 注解是反射的重要组成部分。 事实上,注解主要针对反射。 它们旨在提供程序运行时访问的元信息,然后用于塑造程序的行为。 所有重要的反射相关类型,如类,字段,构造函数,方法和参数实现AnnotatedElement接口。 链接的Javadoc包含了注释如何与这些元素(直接呈现,间接呈现或关联)相关的详细解释,但是它最简单的形式是:getAnnotations方法以注释实例数组的形式返回该元素上存在的注释 ,然后可以访问其成员。 总结 Java的反射API允许在运行时自动检查类型,方法,注释等,并调用在编译时未知的构造函数和方法。首先,请调用Class.forName("fully.qualified.class.Name"),然后调用getConstructors,getMethods,getAnnotations或类似方法。调用伴随构造函数的newInstance和方法的invoke一起发生。 你也可以使用 反射分解代码 并更改非公共字段或调用非公共方法 - 这是一个冒险的做法,而且 在Java 9中变得更加困难 。如果你很好奇,并希望知道所有的API的来龙去脉, 在Java的官方文档中给出了反射线索 。到目前为止,API有点过时并有一些缺点,但是新的替代方案存在,查看 方法句柄 (自Java 7)和 变量句柄 (自Java 9)。
96 次阅读|0 个评论
分享 电子产品,居多如何选择
热度 1 电级达人 2016-11-4 10:12
我是比较喜欢,电子类的产品,比如:新出来的手机,我就要去查它相关的信息,功能是否好坏,有什么独特之处;给大平台也是一样的,网上有那么多各大平台,但它们有各自优势;它们能在众多平台里存活下来,是有一定的基础,有一定的实力,而我能否在这电子工程世界里脱颖而出还是未知数;所以我要抓紧加油。
748 次阅读|1 个评论
分享 如何判断MOS工作什么状态
A001 2016-6-13 20:31
如何判断MOS工作什么状态
203 次阅读|0 个评论
分享 如何用电脑自带的计算器进行各种计算
箫声欲碎 2016-3-29 08:42
如何用电脑自带的计算器进行各种计算 一。如何从电脑中调出计算器? 以下以电脑 Windows 7 系统中调出计算器做例子说明。 (电脑 Windows XP 系统2014年4月8日正式宣布“退休”,从当日起,Windows XP 系统不再提供补丁修复漏洞等服务,WindowsXP 系统不再得到安全保护,所以我已从Windows XP 山头撤出。) 单击屏幕左下角的“开始”按钮,单击“所有程序”按钮,拉动滑块,找到“附件”按钮单击,在弹出的列表中就会看到“计算器”,单击“计算器”(已用红笔标出),就可弹出计算器。 你也可以在“计算器”上单击右键,把它发送到桌面快捷图标,以便随时可打开。见图-1 和图-2: 图-1 图-2 上面图-2计算器默认选择“十进制”。叫十进制科学型计算器。 单击“十六进制”,“十进制”,“八进制”,“二进制”等按钮,可以调出有关进制计算器。而2进制科学型计算器适合程序员编程。现市面上还有高中生,大学生专用计算器。 二。计算器上的英文计算符号是什么意思? 1. CE :在标准型计算器中清除输入键。在数字输入期间按下此键将清除输入寄存器中的值并显示"0." 2. . M+:把目前显示的值放在存储器中;中断数字输入 3. M-:从存储器内容中减去当前显示值;中断数字输入. 4. MRC:第一次按下此键将调用存储器内容,第二次按下时清除存储器内容. 6.← 在数字后面删除数字。 7. MR清除存储器内容.,清除后显示为0. 8. MU(Mark-up and Mark-down键):按下该键完成利率和税率计算. 10. ← 删除当前显示数字的最后一位。 11. Sin计算显示数字的正弦。只能用于十进制数字系统 12. cos 计算显示数字的余弦。只能用于十进制数字系统。 若要计算反余弦,请使用“Inv”+“cos”。若要计算双曲余弦,请使用“Hyp”+“cos”。若要计算反双曲余弦,请使用“Inv”+“Hyp”+“cos”。cos 只能用于十进制数字系统。Dat 在“统计框”对话框内输入显示的数字。只有先单击“Sta”, 该按钮才可用。 13. Exp 只能用于十进制数字系统,指数限制为四位数。指数中只能使用十进制数(键 0-9)。 14. Hyp 设置“sin”、“cos”和“tan”的双曲函数。 15. In 计算自然对数(以 e 为底)。若要计算 e 的 x 次方(其中 x 是当前数字),请使用“Inv”+“ln”。 16. Mod 显示 x/y 的模数或余数,例如,计算 5 除以 3 的模数,单击“5 MOD 3 =”,结果为 2。 17. MS 将显示数字保存在内存中。 18. 平方根√ :显示一个输入正数的平方根。 19. Ave 计算“统计框”对话框中显示数值的平均值。若要计算平均方值,请使用“Inv”+“Ave”。只有先单击“Sta”,该按钮才可用。 20. Dat 在“统计框”对话框内输入显示的数字。只有先单击“Sta”,该按钮才可用。 21. 度数 在十进制模式下将三角函数输入设置为度 22. dms 将显示数字转换为度-分-秒格式(假设显示数字是用度数表示的)。若要将显示数字转换为用度数表示的格式(假设显示数字是用度-分-秒格式表示的),请使用“Inv”+“dms”。dms 只能用于十进制数字系统。 23. pi 显示 pi 的值 (3.1415...)。若要显示 2 * pi (6.28...),请使用“Inv”+“pi”。“pi”只能用于十进制数字系统。 24. 弧度 在十进制模式下将三角函数输入设置为弧度。 25. sqrt 计算显示数字的平方根。 26. Sum 计算“统计框”对话框中显示数值的总和。若要计算平方和,请使用“Inv”+“Sum”。只有先单击“Sta”,该按钮才可用。 27. tan 计算显示数字的正切。若要计算反正切,请使用“Inv”+“tan”。若要计算双曲正切,请使用“Hyp”+“tan”。若要计算反双曲正切,请使用“Inv”+“Hyp”+“tan”。“tan”只能用于十进制数字系统。 28. x^2 计算显示数字的平方。若要计算平方根,请使用“Inv”+“x^2”。 29. x^3 计算显示数字的立方。若要计算立方根,请使用“Inv”+“x^3”。 30. x^y 计算 x 的 y 次方。例如,若要计算 2 的 4 次方,请单击“2 x^y 4 =”,结果为 16。(等号不要漏掉)。 以下是高中生大学生专用计算器上一些英文符号意思: 1.COMP 是指基础运算 2. SD 是指标准偏差 3. REG 是指回归线求解 4. Lin是以e为底数的对数回归线 5. Log是以10为底数的回归线 Quad是抛物线 6. Deg 是角度中"度"的意思 7. Rad 是角度中"弧度"的意思。 8. Gra 是角度中"梯度"的意思。 9. Fix 是指保留小数点的个数 10. Sci 是指科学计数法保留位数 11. Norm 是指常规模式。 12. Disp 是分数白留形式(有带分数(ab/c)和假分数(d/c)) 三.用十进制计算器计算的实例 1. 计算 18+(8-2)/3*4的值 。 这是四则运算式。四则运算的法则是:先乘除后加减,先括号内后括号外。如果无视四则运算法则,一次性输入算式,则得数为23.333…,显然是错误的。正确的做法应该尽量使用上面图-2所示十进制科学型计算器并且要注意四则运算法则。正确算法是:如图-2,按8然后按减号-,再按2,按等号=,得出6.(即先算括号得数),按除号/ ,按3,按乘号* ,按4 ,按等号= ,得8 ,(即算乘除得数),然后按加号+ ,按18 ,按等号=,最后得出算式正确结果26 。注意,这里巧妙地利用等号=来适应四则运算法则。 有人会问,上面算式如果把18+改为18- ,如何计算呢?这容易。当算完括号和乘除后,得数为8 ,请记住得数8,按删除键MR, 计算框中的8被删除,成为0.然后按18 ,按减号- ,按刚才的得数8 ,按等号= ,最后得结果为10 。 注意,按计算器上的 MR 按钮可清除输入的数字。 2. 计算 8的平方是多少? 解:在图-2右上方单击“查看”按钮,在下拉菜单上单击“科学型”,(已用红笔标出)。见图-3: 图-3 弹出下图,见图-4: 图-4 解 :按图-4右侧的8 ,按左侧的X2, 按等号= 得数为64 。8的平方是64 。 3. 计算 5的立方是多少? 解 :按图-4右侧的5 ,按左侧的X3 , 按等号= ,得125 ,5的立方是125 。 4.计算 三角函数 Sin 700 解:按图-4右侧的70,按左侧的sin ,按等号= ,即得所求约为0.9397 . 5. 计算 24 , 解: 按图-4右侧的2 ,按左侧的Xy ,按右侧的4 ,按等号= ,得数为16 。 6. 计算以10为底,2.9的对数 。 解:按图-4右侧2.9 ,按左侧对数符号 log ,按等号= ,得数约为0.4624 . 7. 计算 22+32+42 的值。 解: 按图-4右侧的2,按Xy ,按2 ,按等号= ,得4,按加号+ ,按3 ,按Xy ,按2 ,按等号= ,得13 ,按加号+ ,按4 ,按Xy ,按2 ,按等号= ,得29 。即2,3,4各数的平方之和为29. 8. 把 792 的 2 删除掉 解:按 792 ,按←后, 792 即变成了 79 。 . 9. 求 21/6 的余数 解:按 21 ,按余数键 Mod ,按 6 ,按等号 = ,即得 21/6 的余数 3 。 10.求76的平方根 解: 按76 ,按平方根号√ ,得76的平方根约为8.718 11.求45的立方根 解 按45 ,按立方根号(见计算器1的左侧),得45的立方根约为3.557 12. 把十进制的 21783 转换为二进制数字(适合程序员编程使用的数字) 。 解 :勾选图-2左侧的“十进制“,输入21783 ,然后选中左侧的二进制按钮(Bin按钮)单击,21783即变成了适合程序员使用的二进制的数字101010100010111 。 13.已知 圆的半径r是4cm , 求 周长L 解 根据公式L=2πr ,在图-4 中按2,按* ,按π ,按4 ,按= ,得数约为25.13 注意,上面公式计算时不能漏掉乘号* ,否则出错。 注意,当你计算下一条算式时 住 , 记要先按全部清除键 MR 清除上一次计算得出的数字,才输入下一条算式。 四.单击科学型计算器上方的“查看”按钮,弹出的下拉菜单,可以设置转换各种计算器,单位转换,日期计算,工作表计算等,下图是“工作表”计算。见图-5: 图-5 下图是在图-3单击“单位转换”按钮后,弹出的对话框,单击右侧的文本框下拉箭头 ▼,把摄氏25度转换为华氏的度数。见图-6: 图-6 计算器经过多次打开后,要恢复原始形,即图-2的样子,单击“查看”按钮,在弹出的下拉菜单中单击“基本”按钮,就可恢复。
1 次阅读|0 个评论
分享 如何制作一个vagrant的base box
Timson 2016-1-6 12:44
虽然这里 已经罗列出了许多个base box,但有些时候,可能根据自身的业务需要一些特殊的box,比如,笔者遇到的,需要一个带桌面环境和浏览器测试用的box,这个在网上可没有找到,无奈之下,只能自己装虚拟机,做一个base box出来,以便使用。本文主要针对ubuntu的base box的制作。 步骤如下:(环境 OS:ubuntu12.04_Desktop virtualbox:4.1.12) 1.在物理机安装好 ubuntu系统 ,在此系统上安装virtualbox 2.下载一个需要的ubuntu版本的iso镜像 3.创建一个新的虚拟机 给虚拟机起个名字为”vagrant-precise32″ 确保您分配足够的磁盘空间,40GB足够了。 确保默认的 内存分配 也不用太高,建议360M。 如果不需要,禁用音频,USB控制器等。大多数应用程序都不需要播放音乐!因此,节约资源,禁用这些功能。 确保 网络控制器 设置为NAT,为了 端口转发 正常工作。 4.启动虚拟机,安装ubuntu,确保配置如下(非强制,如打算分发此box,建议遵循如下约定) Hostname:vagrant- ,例:vagrant-ubuntu-Steve Domain: vagrantup.com Root Password: vagrant Main account login: vagrant Main account password: vagrant 5.安装完毕后,进入虚拟机 6.根据自己需要,安装一些常用软件 sudo apt-get -y install vim 7.创建admin组 sudo groupadd admin 8.添加vagrant用户到admin组 sudo usermod -G admin vagrant 9.修改sudoers文件 sudo vim /etc/sudoers #添加或修改如下行(有些发行版还需Disable requiretty): Defaults env_keep=”SSH_AUTH_SOCK” %admin ALL=NOPASSWD: ALL 10.安装puppet(chef没有计划装进去,如需要可安装ruby,rubygems,chef) sudo apt-get install puppet puppetmaster 11.安装ssh sudo apt-get install openssh-server 12.安装vagrant的public keys mkdir ~/.ssh/ cd ~/.ssh wget http://github.com/mitchellh/vagrant/raw/master/keys/vagrant wget http://github.com/mitchellh/vagrant/raw/master/keys/vagrant.pub mv vagrant.pub authorized_keys 13.Install virtual box guest additions(为了 共享文件夹 , 端口转发 等) (1) First, build the necessary packages. You may have to look these up for your system, but they should be fairly similar. On Ubuntu and Debian based systems they are as follows: $ sudo apt-get install linux-headers-$(uname -r) build-essential (2) Next, make sure to insert the guest additions image by using the GUI and clicking on “Devices” followed by “Install Guest Additions.”. Then run the following to mount the CD Rom: $ sudo mount /dev/cdrom /media/cdrom (3) And finally, run the shell script which matches your system. For linux on x86, it is the following: $ sudo sh /media/cdrom/VBoxLinuxAdditions.run If you didn’t install a Desktop environment when you installed the operating system, as recommended to reduce size, the install of the VirtualBox additions should warn you about the lack of OpenGL or Window System Drivers, but you can safely ignore this. 14.清除缓存 sudo apt-get clean 15.关闭虚拟机,进入virtual box directory(~/VirtualBox VM/vagrant-precise32) vagrant package –output ubuntu_32.box –base vagrant-precise32 总结:以上步骤完成后生成的ubuntu_32.box就可以拿来用了,用vagrant box add ,vagrant init等自己测试看看吧。
511 次阅读|0 个评论
分享 CC2538之TinyOS例程实验:5-Adc_Temp片内温度读取实验 TinyOS如何直接使用C文件
dan158185 2016-1-5 16:07
使 用过CC2530的朋友肯定对TI的片内温度不陌生;下面带来2538的片内温度读取;先看实验结果: 代码部分:选择使用TinyOS来实现 此处的实验是向大家展示如何TinyOS如何直接使用C(h)文件,打消大家认为TiinyOS编程只能用nesC的误区 1,温度读取函数tinyos-main-release_tinyos_2_1_2\tos\chips\cc2538\adc 下的cc2538_temp_sensor.c和cc2538_temp_sensor.h cc2538_temp_sensor.h文件: view plain copy print ? #ifndefCC2538_TEMP_SENSOR_H_ #defineCC2538_TEMP_SENSOR_H_ #defineCONST0.58134//(VREF/2047)=(1190/2047),VREFfromDatasheet #defineOFFSET_DATASHEET_25C827//1422*CONST,fromDatasheet #defineTEMP_COEFF(CONST*4.2)//FromDatasheet #defineOFFSET_0C(OFFSET_DATASHEET_25C-(25*TEMP_COEFF)) uint16_tGet_CC2538_Temp( void ); #endif cc2538_temp_sensor.c文件: view plain copy print ? #includestdbool.h #includestdint.h #includestdio.h #include"hw_memmap.h" #include"gpio.h" #include"hw_ioc.h" #include"ioc.h" #include"interrupt.h" #include"adc.h" #include"sys_ctrl.h" #include"hw_sys_ctrl.h" #include"systick.h" #include"hw_rfcore_xreg.h" #include"hw_cctest.h" #include"cc2538_temp_sensor.h" uint16_tGet_CC2538_Temp( void ){ uint16_tui16Dummy; // //EnableRFCore(neededtoenabletempsensor) // SysCtrlPeripheralEnable(SYS_CTRL_PERIPH_RFC); // //ConnecttempsensortoADC // HWREG(CCTEST_TR0)|=CCTEST_TR0_ADCTM; // //Enablethetemperaturesensor // HWREG(RFCORE_XREG_ATEST)=0x01; // //ConfigureADC,Internalreference,512decimationrate(12bit) // SOCADCSingleConfigure(SOCADC_12_BIT,SOCADC_REF_INTERNAL); // //Triggersingleconversiononinternaltempsensor // SOCADCSingleStart(SOCADC_TEMP_SENS); // //Waituntilconversioniscompleted // while (!SOCADCEndOfCOnversionGet()){ } // //Getdataandshiftdownbasedondecimationrate // ui16Dummy=SOCADCDataGet()SOCADC_12_BIT_RSHIFT; return ui16Dummy; } 2,编写TinyOS例程:Adc_TempAppC.nc,Adc_TempC.nc, makefile文件: makefile文件: view plain copy print ? COMPONENT=Adc_TempAppC CFLAGS+=-DUSE_TIMER_HANDLER CFLAGS+=-DNOT_USE_PRINTFC_BUT_USE_PRINT include$(MAKERULES) A dc_TempAppC.nc文件 view plain copy print ? configurationAdc_TempAppC { } implementation { componentsMainC,Adc_TempC; componentsnewTimerMilliC()asTimer1; Adc_TempC-MainC.Boot; Adc_TempC.Timer1-Timer1; } Adc_TempC.nc文件: view plain copy print ? /******************************************************************* *实验附加----CC2538片内温度读取 *节点需求数1 *编译命令makecc2538cb ********************************************************************/ #include"Timer.h" #include"printf.h" #include"cc2538_temp_sensor.h" moduleAdc_TempC{ usesinterfaceTimerTMilliasTimer1; usesinterfaceBoot; } implementation{ taskvoidtime1_Task(); uint16_tui16Dummy=0; /*************************************************** *启动事件 ****************************************************/ eventvoidBoot.booted(){ /**开启一秒的周期性定时器(单位毫秒)Timer1**/ callTimer1.startPeriodic(1000); } /*************************************************** *任务time1_Task ****************************************************/ taskvoidtime1_Task(){ doubledOutputVoltage; ui16Dummy=Get_CC2538_Temp(); printf("ADCrawreadout:%d\n",ui16Dummy); //温度计算 dOutputVoltage=ui16Dummy*CONST; dOutputVoltage=((dOutputVoltage-OFFSET_0C)/TEMP_COEFF); ui16Dummy=dOutputVoltage*10; printf("Temperature:%d",ui16Dummy/10); printf(".%d",ui16Dummy%10); printf("C\n"); } /*************************************************** *Timer1定时时间到事件 ****************************************************/ eventvoidTimer1.fired(){ /****提交time1_Task任务***/ posttime1_Task(); } } 大家可以看到Adc_TempC.nc文件中 view plain copy print ? #include"cc2538_temp_sensor.h" ui16Dummy=Get_CC2538_Temp(); 这些不就是直接使用了C文件了吗?nesC只是C的方言,相信即使没有nesC语言基础的朋友应该也能大概看懂代码干了什么;就是1秒采集一次片内温度然后串口打印 至此可以引申如果是需要给TinyOS引入其他的传感器呢,呵呵,其实就是拿来厂家提供的C源码直接 使用即可,不用去写成nesC;
个人分类: CC2538之TinyOS例程|233 次阅读|0 个评论
分享 如何用一台HiNet网关连接多台以太网PLC
hignton 2015-11-26 16:46
一台HiNet网关最多连接254台以太网接口的PLC或者触摸屏,连接步骤如下: 1、通过IE浏览器进入设备云管理平台( plc.hignton.com ),并点击“综合平台一入口”; 2、在登录页输入公司名称和登录密码,默认登录密码为12345678; 3、点击“设备”栏,并在设备菜单下点击“新建”; 4、在“识别标识”中输入设备名称(必须保持同一网络内的唯一性)--选择绑定的网关、PLC型号、接口类型,如果是以太网口的话则需要输入PLC的IP地址。该处PLC的IP地址必须保持和网关在同一个局域网内(如:网关IP地址为192.168.10.254,则PLC的IP地址必须为:192.168.10.X,X可以是1-253中的任意数); 5、设备新建完成后,打开客户端软件,即可找到您新建的PLC设备了,并可进行远程操作了。
216 次阅读|0 个评论
分享 LED灯如何节能省电?
JTEMC 2015-10-26 14:10
LED灯如何节能省电?既然LED灯主打节能省电,那么它是如何体现出来的?br\ \ br对替换产品来说,在相同的光通量下,可用光效来估算节能比例。比如40瓦白炽灯的光效约为13流明/瓦,光通量是520流明;替换用10瓦荧光灯的光效约为50流明/瓦,光通量约500流明,比白炽灯节能80%;替换用5瓦的LED球泡灯,光效约100流明/瓦,光通量同样约为500流明,比白炽灯节能95%,比荧光灯节能50%。\ \ 如果按照每天点灯时间为4小时计算,则一年需要点灯1460个小时。brbr此次检测5W的LED球泡灯对比白炽灯以及荧光灯做替换推算,5瓦的LED球泡灯的效能,相当于10W荧光灯和40W白炽灯的效能。那么一年里,白炽灯的耗电量则达58400瓦时,荧光灯则有14600瓦时,LED球泡灯则是7300瓦时。再转换为度(编者注:1度=1千瓦时),则白炽灯一年需使用58\.4度电,荧光灯14\.6度电,LED球泡灯7\.3度电。\ \ \ brbr以2015年3月份广州居民生活用电0\.61元/度计算,一年白炽灯的电费为35\.62元,荧光灯电费为8\.91元,LED球泡灯为4\.38元。而且,如果把球泡灯用在商场或办公室场合这种需要大量使用灯具的场合,随着时间的推移所省的电费是相当可观。
347 次阅读|0 个评论
分享 新型随机函数的制作
sjd_dzgc 2015-9-23 19:10
  新型随机函数和以往的随机函数一样的地方是:使用时需要首先设置种子,每次调用得到一个数据,输出的是一些乱码。   不同之处是这种随机函数输出的数据之间是没有关联的,你不能用连续几个输出值推算其计算公式,这是因为它生成方式所致,它没有公式你也推导不出来。   以往的随机函数是由算式生成的,所以它的数据是由算法关联起来的,可能是线性关联甚至高维度的关联。   新函数是采用构造法生成随机数的,现在基本数据是字节,别的结构可以用字节来组合,所以就单说以字节为单位的随机函数,它的元素是 0至 255共256个,构造法是这样运作的,例如要建造256×N长度的随机数组,所要材料是256×N个元素,一般需要元素分布均匀,所以每种元素取N个,将这些元素组成一个数组,初始状态如何都没关系,然后对这个数组进行随机排序,随机排序就是让数组内的元素位置随机的交换,一般可以用循环来完成,例如256×N的长度,用一个循环变量i,从头到尾的循环,另外随机的在256×N中选择一个位置,用这个位置的元素和第i个元素进行交换,这样循环一次每个元素都被交换了,交换完成后新的顺序建立了,生成了新的数组。从256×N中选择位置的操作可以用其它随机函数来完成,也可以拼凑一些随机性较强的变数来完成。一遍随机排序不理想可以进行多遍,一般借助于优秀的随机函数一遍就够了。这样子一下子就生成了一个长度为256×N的数组。如果借助于其它随机函数那么其需要的种子也就是此种生成方式的种子了,否则其中生成随机位置的参数等将作为种子。   新型随机函数数据的生成机制上面已经说了,为了照顾到应用习惯,模拟老式随机函数的使用方式。方法是你可以生成一定数量随机数据,函数每调用一次输出一个数据,用完后继续生成新的,这样函数就形成了。具体细节是每次生成的量不可过小,要大于元素总和数的数倍,为了均匀一般是整数倍,为什么呢?可以这样看,例如这个量是由256个不同元素组成,那将出现一个问题,我们的输出可能是每次不相同的元素,可能连续256次都有此特点,这显然是让数组有了某些规律性,所以生成量要更大些才能消除这个规律。   新型随机函数的随机性比老式的要更好些,它是数据混合均匀后的输出,什么数据都是等概率的,也可能输出的是零值,一般随机函数没有此特性。   现在的输出数据是无符号字节数组,很容易变成其它形式,例如做32位无符号整形数组,只要每次取四个无符号字节就可以组合。   基本的新函数已经做出性能还是不错的,并且生成速度可达到每秒几十兆字节。   新函数还没有名称随便征求一下。由于还没有见到类似的随机数生成方式,所以暂时可称其为“构造随机函数”或“乱排随机函数”。   此种方法的理论基础是热力学第二定律——熵增加原理,当我们以多种方式影响数组的序列时,数组将向着更加混乱的方向发展而不可能相反。   虽然此种方式可以完全不利用任何随机函数,但利用随机函数可以使工作效率增高。所以本方法也可以看成是随机函数的改良方式,主要益处是生成的数据之间没有连带关系,所以适合于做信息加密中的密钥数组。   即便是最简单的随机函数例如C语言中的rand(),它的运算只是一乘一加,用此来制作乱排函数也能得到一个性能优良的输出,原来数据间的关联不见了,周期大大的提高了,原来周期只有16M,现在至少大于10G(短时间测算)。   如果是性能优良的随机函数其改造为乱排函数后,性能更加优良,直接用作密钥是能够胜任的,对于这样的无规律数据发生器破解者毫无办法。   如何控制乱排函数,当然是用户密码,可以在原始数组阶段参与控制,也可以在随机排序部分参与控制是相当灵活的,多少字节的用户密码都可以被充分利用上。这是分组密码所没有的优势,后者只能使用有限的那几位所以相当虚弱。   即便到了量子计算机时代,如果密钥是独立未知数也照样不能破解,这是肯定的。这一点很容易证明。   
个人分类: 计算机应用|224 次阅读|0 个评论

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-5-23 01:22 , Processed in 0.029580 second(s), 19 queries , Redis On.

Powered by EEWORLD电子工程世界

© 2017 http://bbs.eeworld.com.cn/

返回顶部