搜索

tag 标签: 如何

相关帖子

版块 作者 回复/查看 最后发表
TI 28035 如何利用ECAN设计可靠通信? 【TI C2000】 huzi741 2017-6-26 0 0 huzi741 昨天 22:19
如何申请知识产权 信息发布 hantang007 2017-6-26 0 0 hantang007 昨天 18:34
可以画流程图的软件如何下载 attach_img 信息发布 峰阿喂 2017-6-26 0 0 峰阿喂 昨天 14:33
用迅捷流程图制作软件如何画业务流程图教学 attach_img 信息发布 峰阿喂 2017-6-26 0 0 峰阿喂 昨天 10:57
vivado如何把图片存进rom然后用vga显示出来 FPGA/CPLD swaggy 2017-6-25 1 80 fdsjens 前天 23:42
ADI工程师博客分享——如何正确驱动SAR ADC前端 attach_img 信息发布 板上人生 2017-6-25 0 0 板上人生 前天 13:52
如何测试晶振的频率和电阻 【TI模拟技术体验】 Aguilera 2017-6-23 0 0 Aguilera 4 天前
如何申办农林综合开发生态乙级资质需要多少钱 汽车电子 dawei5388138 2017-6-23 0 0 dawei5388138 4 天前
电子元件如何应对高功率电平? 【TI模拟技术体验】 Jacktang 2017-6-22 0 0 Jacktang 5 天前
悬赏 如何把allegro的brd文件转成AD的PCB文件 - [悬赏 1 枚芯币] attachment PCB设计 141203115 2017-6-22 6 162 141203115 昨天 14:18
CAD文件格式如何转JPG 信息发布 仰望520 2017-6-22 0 0 仰望520 5 天前
如何使用TI的DSP芯片cmd文件 【DSP】 Aguilera 2017-6-21 0 0 Aguilera 6 天前
直杆、栅栏杆、广告道闸的使用区别【聊聊、笑笑、闹闹】 聊聊、笑笑、闹闹 sztxsy001 2017-6-21 0 0 sztxsy001 6 天前
电脑版cad看图软件如何使用 信息发布 懒惰yu 2017-6-21 0 0 懒惰yu 6 天前
如何使用北京股商JavaScript构建机器学习模型不骗人 信息发布 huangdi233 2017-6-21 0 0 huangdi233 6 天前
音频电路杂音很多 attach_img PCB设计 xiebaokui 2017-6-19 6 260 xujian2000 7 天前
PIC32 单片机SPI功能如何关闭 attachment 【PIC单片机】 cawyai23 2017-6-18 3 133 cawyai23 2017-6-19 21:20
智慧城市来袭 建安中艺如何实现照明智能化 信息发布 jazy 2017-6-16 0 0 jazy 2017-6-16 16:12
怎么将pdf转换成dwg要用什么软件 信息发布 懒惰yu 2017-6-16 0 0 懒惰yu 2017-6-16 14:33
如何修改PDF文件中的文字的最佳解决方法 attach_img 信息发布 华夏后裔 2017-6-16 0 0 华夏后裔 2017-6-16 13:43

相关日志

分享 Simon Tatham:如何有效地报告Bug (转)
wateras1 2017-6-21 10:25
引言 为公众写过软件的人,大概都收到过很拙劣的bug(计算机程序代码中的错误或程序运行时的瑕疵——译者注)报告,例如: ·在报告中说“不好用”; ·所报告内容毫无意义; ·在报告中用户没有提供足够的信息; ·在报告中提供了错误信息; ·所报告的问题是由于用户的过失而产生的; ·所报告的问题是由于其他程序的错误而产生的; ·所报告的问题是由于网络错误而产生的; 这便是为什么“技术支持”被认为是一件可怕的工作,因为有拙劣的bug报告需要处理。然而并不是所有的bug报告都令人生厌:我在业余时间维护自由软件,有时我会收到非常清晰、有帮助并且“有内容”的bug报告。 在这里我会尽力阐明如何写一个好的bug报告。我非常希望每一个人在报告bug之前都读一下这篇短文,当然我也希望用户在给我报告bug之前已经读过这篇文章。 简单地说,报告bug的目的是为了让程序员看到程序的错误。您可以亲自示范,也可以给出能导致程序出错的、详尽的操作步骤。如果程序出错了,程序员会收集额外的信息直到找到错误的原因;如果程序没有出错,那么他们会请您继续关注这个问题,收集相关的信息。 在bug报告里,要设法搞清什么是事实(例如:“我在电脑旁”和“XX出现了”)什么是推测(例如:“我想问题可能是出在……”)。如果愿意的话,您可以省去推测,但是千万别省略事实。 当您报告bug的时候(既然您已经这么做了),一定是希望bug得到及时修正。所以此时针对程序员的任何过激或亵渎的言语(甚至谩骂)都是与事无补的——因为这可能是程序员的错误,也有可能是您的错误,也许您有权对他们发火,但是如果您能多提供一些有用的信息(而不是激愤之词)或许bug会被更快的修正。除此以外,请记住:如果是免费软件,作者提供给我们已经是出于好心,所以要是太多的人对他们无礼,他们可能就要“收起”这份好心了。 “程序不好用” 程序员不是弱智:如果程序一点都不好用,他们不可能不知道。他们不知道一定是因为程序在他们看来工作得很正常。所以,或者是您作过一些与他们不同的操作,或者是您的环境与他们不同。他们需要信息,报告bug也是为了提供信息。信息总是越多越好。 许多程序,特别是自由软件,会公布一个“已知bug列表”。如果您找到的bug在列表里已经有了,那就不必再报告了,但是如果您认为自己掌握的信息比列表中的丰富,那无论如何也要与程序员联系。您提供的信息可能会使他们更简单地修复bug。 本文中提到的都是一些指导方针,没有哪一条是必须恪守的准则。不同的程序员会喜欢不同形式的bug报告。如果程序附带了一套报告bug的准则,一定要读。如果它与本文中提到的规则相抵触,那么请以它为准。 如果您不是报告bug,而是寻求帮助,您应该说明您曾经到哪里找过答案,(例如:我看了第四章和第五章的第二节,但我找不到解决的办法。)这会使程序员了解用户喜欢到哪里去找答案,从而使程序员把帮助文档做得更容易使用。 “演示给我看” 报告bug的最好的方法之一是“演示”给程序员看。让程序员站在电脑前,运行他们的程序,指出程序的错误。让他们看着您启动电脑、运行程序、如何进行操作以及程序对您的输入有何反应。 他们对自己写的软件了如指掌,他们知道哪些地方不会出问题,而哪些地方最可能出问题。他们本能地知道应该注意什么。在程序真的出错之前,他们可能已经注意到某些地方不对劲,这些都会给他们一些线索。他们会观察程序测试中的每一个细节,并且选出他们认为有用的信息。 这些可能还不够。也许他们觉得还需要更多的信息,会请您重复刚才的操作。他们可能在这期间需要与您交流一下,以便在他们需要的时候让bug重新出现。他们可能会改变一些操作,看看这个错误的产生是个别问题还是相关的一类问题。如果您不走运,他们可能需要坐下来,拿出一堆开发工具,花上几个小时来好好地研究一下。但是最重要的是在程序出错的时候让程序员在电脑旁。一旦他们看到了问题,他们通常会找到原因并开始试着修改。 “告诉我该怎么做” 如今是网络时代,是信息交流的时代。我可以点一下鼠标把自己的程序送到俄罗斯的某个朋友那里,当然他也可以用同样简单的方法给我一些建议。但是如果我的程序出了什么问题,我不可能在他旁边。“演示”是很好的办法,但是常常做不到。 如果您必须报告bug,而此时程序员又不在您身边,那么您就要想办法让bug重现在他们面前。当他们亲眼看到错误时,就能够进行处理了。 确切地告诉程序员您做了些什么。如果是一个图形界面程序,告诉他们您按了哪个按钮,依照什么顺序按的。如果是一个命令行程序,精确的告诉他们您键入了什么命令。您应该尽可能详细地提供您所键入的命令和程序的反应。 把您能想到的所有的输入方式都告诉程序员,如果程序要读取一个文件,您可能需要发一个文件的拷贝给他们。如果程序需要通过网络与另一台电脑通讯,您或许不能把那台电脑复制过去,但至少可以说一下电脑的类型和安装了哪些软件(如果可以的话)。 “哪儿出错了?在我看来一切正常哦!” 如果您给了程序员一长串输入和指令,他们执行以后没有出现错误,那是因为您没有给他们足够的信息,可能错误不是在每台计算机上都出现,您的系统可能和他们的在某些地方不一样。有时候程序的行为可能和您预想的不一样,这也许是误会,但是您会认为程序出错了,程序员却认为这是对的。 同样也要描述发生了什么。精确的描述您看到了什么。告诉他们为什么您觉得自己所看到的是错误的,最好再告诉他们,您认为自己应该看到什么。如果您只是说:“程序出错了”,那您很可能漏掉了非常重要的信息。 如果您看到了错误消息,一定要仔细、准确的告诉程序员,这确实很重要。在这种情况下,程序员只要修正错误,而不用去找错误。他们需要知道是什么出问题了,系统所报的错误消息正好帮助了他们。如果您没有更好的方法记住这些消息,就把它们写下来。只报告“程序出了一个错”是毫无意义的,除非您把错误消息一块报上来。 特殊情况下,如果有错误消息号,一定要把这些号码告诉程序员。不要以为您看不出任何意义,它就没有意义。错误消息号包含了能被程序员读懂的各种信息,并且很有可能包含重要的线索。给错误消息编号是因为用语言描述计算机错误常常令人费解。用这种方式告诉您错误的所在是一个最好的办法。 在这种情形下,程序员的排错工作会十分高效。他们不知道发生了什么,也不可能到现场去观察,所以他们一直在搜寻有价值的线索。错误消息、错误消息号以及一些莫名其妙的延迟,都是很重要的线索,就像办案时的指纹一样重要,保存好。 如果您使用UNIX系统,程序可能会产生一个内核输出(coredump)。内核输出是特别有用的线索来源,别扔了它们。另一方面,大多数程序员不喜欢收到含有大量内核输出文件的EMAIL,所以在发邮件之前最好先问一下。还有一点要注意:内核输出文件记录了完整的程序状态,也就是说任何秘密(可能当时程序正在处理一些私人信息或秘密数据)都可能包含在内核输出文件里。 “出了问题之后,我做了……” 当一个错误或bug发生的时候,您可能会做许多事情。但是大多数人会使事情变的更糟。我的一个朋友在学校里误删了她所有的Word文件,在找人帮忙之前她重装了Word,又运行了一遍碎片整理程序,这些操作对于恢复文件是毫无益处的,因为这些操作搞乱了磁盘的文件区块。恐怕在这个世界上没有一种反删除软件能恢复她的文件了。如果她不做任何操作,或许还有一线希望。 这种用户仿佛一只被逼到墙角的鼬(黄鼠狼、紫貂一类的动物——译者注):背靠墙壁,面对死亡的降临奋起反扑,疯狂攻击。他们认为做点什么总比什么都不做强。然而这些在处理计算机软件问题时并不适用。 不要做鼬,做一只羚羊。当一只羚羊面对料想不到的情况或受到惊吓时,它会一动不动,是为了不吸引任何注意,与此同时也在思考解决问题的最好办法(如果羚羊有一条技术支持热线,此时占线。)。然后,一旦它找到了最安全的行动方案,它便去做。 当程序出毛病的时候,立刻停止正在做的任何操作。不要按任何健。仔细地看一下屏幕,注意那些不正常的地方,记住它或者写下来。然后慎重地点击“确定” 或“取消”,选择一个最安全的。学着养成一种条件反射——一旦电脑出了问题,先不要动。要想摆脱这个问题,关掉受影响的程序或者重新启动计算机都不好,一个解决问题的好办法是让问题再次产生。程序员们喜欢可以被重现的问题,快乐的程序员可以更快而且更有效率的修复bug。 “我想粒子的跃迁与错误的极化有关” 并不只是非专业的用户才会写出拙劣的bug报告,我见过一些非常差的bug报告出自程序员之手,有些还是非常优秀的程序员。 有一次我与另一个程序员一起工作,他一直在找代码中的bug,他常常遇到一个bug,但是不会解决,于是就叫我帮忙。“出什么毛病了?”我问。而他的回答却总是一些关于bug的意见。如果他的观点正确,那的确是一件好事。这意味着他已经完成了工作的一半,并且我们可以一起完成另一半工作。这是有效率并有用的。 但事实上他常常是错的。这就会使我们花上半个小时在原本正确的代码里来回寻找错误,而实际上问题出在别的地方。我敢肯定他不会对医生这么做。“大夫,我得了Hydroyoyodyne(真是怪病——译者),给我开个方子”,人们知道不该对一位医生说这些。您描述一下症状,哪个地方不舒服,哪里疼、起皮疹、发烧……让医生诊断您得了什么病,应该怎样治疗。否则医生会把您当做疑心病或精神病患者打发了,这似乎没什么不对。 做程序员也是一样。即便您自己的“诊断”有时真的有帮助,也要只说“症状”。“诊断”是可说可不说的,但是“症状”一定要说。同样,在bug报告里面附上一份针对bug而做出修改的源代码是有用处的,但它并不能替代bug报告本身。 如果程序员向您询问额外的信息,千万别应付。曾经有一个人向我报告bug,我让他试一个命令,我知道这个命令不好用,但我是要看看程序会返回一个什么错误(这是很重要的线索)。但是这位老兄根本就没试,他在回复中说“那肯定不好用”,于是我又花了好些时间才说服他试了一下那个命令。 用户多动动脑筋对程序员的工作是有帮助的。即使您的推断是错误的,程序员也应该感谢您,至少您想去帮助他们,使他们的工作变的更简单。不过千万别忘了报告“症状”,否则只会使事情变得更糟。 “真是奇怪,刚才还不好用,怎么现在又好了?” “间歇性错误”着实让程序员发愁。相比之下,进行一系列简单的操作便能导致错误发生的问题是简单的。程序员可以在一个便于观察的条件下重复那些操作,观察每一个细节。太多的问题在这种情况下不能解决,例如:程序每星期出一次错,或者偶然出一次错,或者在程序员面前从不出错(程序员一离开就出错。——译者)。当然还有就是程序的截止日期到了,那肯定要出错。 大多数“间歇性错误”并不是真正的“间歇”。其中的大多数错误与某些地方是有联系的。有一些错误可能是内存泄漏产生的,有一些可能是别的程序在不恰当的时候修改某个重要文件造成的,还有一些可能发生在每一个小时的前半个小时中(我确实遇到过这种事情)。 同样,如果您能使bug重现,而程序员不能,那很有可能是他们的计算机和您的计算机在某些地方是不同的,这种不同引起了问题。我曾写过一个程序,它的窗口可以蜷缩成一个小球呆在屏幕的左上角,它在别的计算机上只能在 800×600 的解析度工作,但是在我的机器上却可以在 1024×768 下工作。 程序员想要了解任何与您发现的问题相关的事情。有可能的话您到另一台机器上试试,多试几次,两次,三次,看看问题是不是经常发生。如果问题出现在您进行了一系列操作之后,不是您想让它出现它就会出现,这就有可能是长时间的运行或处理大文件所导致的错误。程序崩溃的时候,您要尽可能的记住您都做了些什么,并且如果您看到任何图形,也别忘了提一下。您提供的任何事情都是有帮助的。即使只是概括性的描述(例如:当后台有EMACS运行时,程序常常出错),这虽然不能提供导致问题的直接线索,但是可能帮助程序员重现问题。 最重要的是:程序员想要确定他们正在处理的是一个真正的“间歇性错误”呢,还是一个在另一类特定的计算机上才出现的错误。他们想知道有关您计算机的许多细节,以便了解您的机器与他们的有什么不同。有许多细节都依仗特定的程序,但是有一件东西您一定要提供——版本号。程序的版本、操作系统的版本以及与问题有关的程序的版本。 “我把磁盘装进了 Windows……” 表意清楚在一份bug报告里是最基本的要求。如果程序员不知道您说的是什么意思,那您就跟没说一样。我收到的bug报告来自世界各地,有许多是来自非英语国家,他们通常为自己的英文不好而表示歉意。总的来说,这些用户发来的bug报告通常是清晰而且有用的。几乎所有不清晰的bug报告都是来自母语是英语的人,他们总是以为只要自己随便说说,程序员就能明白。 精确。如果做相同的事情有两种方法,请说明您用的是哪一种。例如:“我选择了‘载入’”,可能意味着“我用鼠标点击‘载入’”或“我按下了‘ALT+L’”,说清楚您用了哪种方法,有时候这也有关系。 详细。信息宁多毋少!如果您说了很多,程序员可以略去一部分,可是如果您说的太少,他们就不得不回过头再去问您一些问题。有一次我收到了一份bug报告只有一句话,每一次我问他更多事情时,他每次的回复都是一句话,于是我花了几个星期的时间才得到了有用的信息。 慎用代词。诸如“它”,“窗体”这些词,当它们指代不清晰的时候不要用。来看看这句话:“我运行了FooApp,它弹出一个警告窗口,我试着关掉它,它就崩溃了。”这种表述并不清晰,用户究竟关掉了哪个窗口?是警告窗口还是整个FooApp程序?您可以这样说,“我运行FooApp程序时弹出一个警告窗口,我试着关闭警告窗口,FooApp崩溃了。”这样虽然罗嗦点,但是很清晰不容易产生误解。 检查。重新读一遍您写的bug报告,您觉得它是否清晰?如果您列出了一系列能导致程序出错的操作,那么照着做一遍,看看您是不是漏写了一步。 小结: bug报告的首要目的是让程序员亲眼看到错误。如果您不能亲自做给他们看,给他们能使程序出错的详细的操作步骤。 如果首要目的不能达成,程序员不能看到程序出错。这就需要bug报告的第二个目的来描述程序的什么地方出毛病了。详细的描述每一件事情:您看到了什么,您想看到什么,把错误消息记下来,尤其是“错误消息号”。 当您的计算机做了什么您料想不到的事,不要动!在您平静下来之前什么都别做。不要做您认为不安全的事。 尽量试着自己“诊断”程序出错的原因(如果您认为自己可以的话)。即使做出了“诊断”,您仍然应该报告“症状”。 如果程序员需要,请准备好额外的信息。如果他们不需要,就不会问您要。他们不会故意为难自己。您手头上一定要有程序的版本号,它很可能是必需品。 表述清楚,确保您的意思不能被曲解。 总的来说,最重要的是要做到精确。程序员喜欢精确。
个人分类: 项目随笔|59 次阅读|0 个评论
分享 IMC-Hall电流传感器Shield-U如何设计
矛盾体 2017-6-15 18:05
IMC-HALL 电流传感器方案设计,由 IMC-Hall 电流传感器 ( 及 PCB) 、铜排、屏蔽罩三部分组成。屏蔽罩的作用是,集中导体周围磁场及屏蔽外磁场干扰。 如何设计 U 型 Shield 屏蔽罩才能有效屏蔽外磁场同时增强电流传感器的鲁邦性能呢? Shield 的设计原则是:传感器芯片感应的磁场为类似的平行磁场,磁场大小在磁场的线性区域,未磁饱和。 要满足上述原则,需要从屏蔽罩的材质,尺寸大小上做合理设计。 材质上推荐 48% 的镍铁合金, 48% 的镍铁合金有高磁导率软磁材料,基本无剩磁,且抗腐蚀性能好,是 Shield 的理想材料。 受测电流 I 确定时, Shield 的宽度决定电流传感器芯片的受测磁场大小,电流 I 及 Shield 的宽度 w 满足如下公式: Sensitivity 从 30-450mV/mT 可编程,因此 W 的宽度可以是一个区间。推荐设计如下: Current ( A ) Shield Width Shield Thickness 50-250 12 0.8 250-500 12 1.5 500-1000 25 1.5 为了能让传感器 IC 处理一个线性变化的平行磁场, Shield 的高低 H ’推荐满足如下条件: 总之, Shield 的材料推荐为 48% 的镍铁合金;厚度 250A 以下推荐 0.8mm , 250A 以上推荐 1.5mm ;宽度 500A 左右推荐 12mm , 1000A 左右推荐 25mm ;芯片感应区到 Shield 上边沿的高度 H ’ 不能小于宽度 W 的一半。 *IMC-HALL 传感器有 MLX91205 , MLX91206 , MLX91208 , MLX91216 等多个系列型号可选。
个人分类: melexis|83 次阅读|0 个评论
分享 it程序猿如何防止过度疲劳
huicnet 2017-6-14 09:33
过度疲劳一次大家都不陌生,各种各样的报道漫天飞。作为it界中的一员,程序员老大哥和这个词自然也是关系微妙。程序员俗称是黑夜中展翅飞翔的猫头鹰,属于昼伏夜出类动物。说到这里,可能有点自嘲了,但事实确实如此,加班加点赶进度,在这个信息日新月异的时代,被各种诉求所驱赶着。时间就是金钱,在it界也着实得到了印证。 怎样防止疲劳呢,让可爱的 程序员 宝宝们身体健健康康的呢,看看下面吧。 程序员常见防止疲劳保健方法 常喝茶 常喝茶也是消除疲劳的一种有效的方法,因为茶叶可帮助人缓解中部枢纽神经的过分紧张。 多晒太阳 秋季多晒太阳,这也是国外治疗疲劳的一种最新的很有效的方法,多晒太阳可调节大脑的分泌功能,进而改善睡眠,缓解疲劳。 弹耳朵 秋季经常用手多搓揉耳朵,或多听听音乐激活听觉神经,都有助于减轻疲劳。 多洗澡 秋季干燥,应多冲凉多揉搓身体,可以使人精神焕发、延年益寿,解除困乏疲劳。 搓脚心 每天洗脚用手按摩脚心处,可有接触疲劳祈祷吐故纳新的效果。 多多咬动牙齿 让牙齿多活动,相互嗑一嗑,既可以保持牙齿健康,也能有效消除疲劳。 常梳发 经常梳理头发可以扩张皮下毛细血管,促进新陈代谢,保持头脑清醒,有助于消除疲劳。 it男其它缓解疲劳保健方法 1、拳头按压,释放疲惫   拳头握紧,放在耳朵斜后方,靠近颈部中央的头骨位置,闭上眼睛,头往后仰,感觉拳头支撑着头部的力量,会有一种放松的感觉,能释放疲惫感。   2、百用薄荷,醒脑消暑   盛夏让人热昏头,不少人拿薄荷油或薄荷棒涂抹,除了贪图那短暂的清凉感外,也能让人醒脑,而且薄荷香气有着爽朗的感觉,又能消暑热。   3、嗅闻精油,神清气爽   精油的好处是抒压,并刺激大脑。因为空气沉闷让人头脑昏沉,思绪不清时,不妨选择树叶类的精油如柠檬香茅嗅闻或具冷冽气味的樟脑、迷迭香精油,让周边的空气清新。另外,柠檬和葡萄柚能提升工作效率50%以上,柠檬、马鞭草、柑橘、葡萄柚等气味可让人充满元气,有更强的提神效果。   4、粗盐泡脚,恢复精神   有时疲惫感不仅是在上班时刻,有时下班回家全身瘫软,感觉萎靡,完全无力状态。请在碗里添加2~3汤匙海盐或岩盐和3~4滴你喜欢的精油调匀,之后加入已盛入温水的脸盆中溶解,将双脚浸泡其中,热热的水温不仅纾解脚的疲累,也让你全身放松,舒服惬意。水温要高过体温。若不知选择什么精油,建议夏季不妨用柠檬或柠檬香茅。   5、借助音乐,增添乐趣   在准备晚餐、支付帐单或是洗衣服时放一些自己喜欢的音乐。欢快、好听的音乐能够给你在干家务时增添不少乐趣。   6、深呼吸,缓解压力   感觉疲劳的时候,做做深呼吸有助于缓解压力。坐直身体,鼻孔吸气,吸气4秒,屏住呼吸3秒,呼气1秒。该动作可以反复进行,持续10分钟。   7、睡前运动,消除疲劳   疲劳、困倦已经让你站不起来了,这时不妨躺在床上、被窝里尽情地打滚吧。为了能够及时消除一天的疲劳,睡前伸展运动必不可少。从头到脚完全将身体舒展开来,全身都会感觉非常的放松,最后再用两只手用力地抱紧两膝。如果你感觉疲惫,就在睡觉之前重复做5次以上的动作吧。   8、专心睡觉,提升活力   一个高品质的睡眠,是提升活力的最重要关键。大部分的人皆需要7-8小时的睡眠,隔天才会觉得有精神。不过如果你真的没办法睡足7个小时,利用中午的时间小睡一下,也是可以的,不过最好不要超过1小时,否则会让你下午昏昏欲睡。   9、喝杯绿茶,神清气爽   绿茶中特有抗氧化剂EGCG含量最高,咖啡因含量不高。喝绿茶不仅有助于防止心脏病和癌症,而且可以使人神清气爽。   10、干刷身体,提神养身   头脑昏晕,没有精神,不用怕,劳动你的双手帮忙提振精神。用手干刷淋巴引流的位置,从肢体末端往心脏的方向,各刷10下(记得手臂要转动,整个手臂都要刷到)。   11、冷水洗脸,提神醒脑   在脸上洒点冷水,有助于快速提神醒脑。   12、吃些燕麦,稳定情绪   碳水化合物是大脑能量的来源,但在碳水化合物为脑灰质提供能量的同时,也会缓慢消耗持续的能量。通过维持血糖含量,这些碳水化合物有助于保持情绪稳定,并有助于之后的睡眠。地瓜和燕麦片等全谷类食品中都也含有碳水化合物。错过某一餐不吃会使人没有精力,想要不疲劳,补充营养是十分重要的。所以一定要吃早餐!吃上一大碗燕麦粥,来为大脑和身体提供能量吧。   13、爱上水果,提供能量   富含维生素的水果,可以帮助你提高血液里血糖含量,为你提供健康的能量,是缓解疲劳的天然食物。需要注意的是,吃得过度会得到相反效果并让你精力下降,所以关键是适度。   14、眼部按摩,缓解眼疲劳   在人们感觉眼疲劳时,也可采用眼部按摩法,事实上,人们常做的眼保健操就是一种很好的眼部按摩法。眼部按摩法可以放松眼部肌肉,达到缓解眼部疲劳的效果。   15、填字游戏,激发能量   感觉没劲的时候,花10分钟做做填字等脑力游戏,有助于激发能量。   16、指弹轻敲,赶走疲倦   头昏眼花时,用手指头尖端轻轻拍(敲)打头部,是不错的提神法。先敲头顶部位,再将后脑勺分为左右两区,仔细地轻轻拍打。这没有特定的技法,但力道要轻柔,否则会愈敲愈晕。从颈部下方到乳头可划出黄金三角胸腺,你可以用手指头轻敲这个区块,可舒缓胸闷郁结之气,胸阔气顺,充满精神。   17、独自静坐,清醒头脑   在进晚餐、去健身房锻炼或是抱起小孩之前,花上3-5分钟闭上眼睛做深呼吸。想象着将新鲜空气吸入腹部,将废气彻底呼出。这样就能够清醒头脑,卸下工作的压力。   18、热石按摩,颈部舒畅   选择一颗温润顺手的石头,最好有一面是比较平整的,放在热水中,让石头有着温暖的热度,将石头顺着肩颈线慢慢滑动,让热度能传达到肩颈的部位,温暖舒畅,一扫疲惫。   19、享受月光浴,净化心灵   一般认为满月是生命、生理现象之始,其实它更是净化的最佳时机。在满月的夜晚,沉静地享受一场月光浴吧。
230 次阅读|0 个评论
分享 一个“熟练”程序员和一个“有能力”程序员哪个更牛一点?
huicnet 2017-6-12 09:29
你知道“有能力”和“熟练”的区别吗?这听起来像一个具有欺骗性的问题,因为两个单词看上去似乎说的是一件事情,但是两者之间的微妙差异却正是关键点。 一个“熟练的”程序员与一个“有能力”的程序员哪个更厉害一些? “有能力”和“熟练的概念 “有能力”的含义是使用足够的经验和知识将事情做完。 “熟练”意味着能够清楚认识到选择某种方式做事的原因以及此种做事的方式是否符合大的框架。 换句话说,一个能够熟练地做某件事情的人总是一个有能力做好这件事情的人,但反过来说可能就不成立了。 我们首先将“能力”定义为“我知道如何做事”。公平地说,不管你从事何种职业,知道如何做事都是相当重要的。如果你是个程序员,那么你的工作中的很大一部分是学习如何做事。知道如何做事虽然很重要,但是不要只为“知道如何做事”努力,否则你会很快发现自己失业了。 要知道在通向专家道路上,处于中间位置的程序员,都在某个层次止步不前(许多人甚至一辈子都停留在此处):这些上流不属于上流,下流不属于下流的程序员会认为可以用所做事情的多少来区别新手和专家。他们的这种想法其实只对了一半! 此处就引出了“熟练”的含义。“熟练”的本质是关于“为什么采用这种方式做事情”——这是理解一个难题的各个部分与理解各个部分如何构成一个整体的难题的不同之处。 有能力和熟练之间的差距 举个栗子,有能力和熟练之间的差距可以解释为什么有许多人都在高层次的编程思想之上挣扎,如设计模式。 一个有能力的程序员能够熟读备忘录模式,并且理解如何实现它。他们甚至能够识别出备忘录模式适用于何种应用场景(可能在GUI里实现一个undo操作)。但是由于他们不知道更大范围的框架性的东西,他们可能还是会错误地应用这种设计模式。 相比之下,一个熟练的程序员能够知道备忘录模式什么时候会失效(例如,如果正在拷贝大量数据,或生成大量副本时)。他们能够考虑一些替代方案与备忘录模式进行对比,从而考虑备忘录模式是否是最优的实现方案。他们也理解备忘录模式背后的基本设计思想,从而创造出一种能够更好的适应特定应用场景的定制化解决方案。 更重要的是,一个熟练的程序员总是能够识别出讨论设计模式的合适时机。就像向一个新手解释代码库的概念,一个熟练的开发者可能会重点说明代码做了什么,而不是抛出一堆设计模式的名字,之后告诉一个菜鸟“读完《Gang of Four》之前不要问我任何问题”。 熟练的含义在于整体思维的灵活性 模式、原则、**惯用法、库、语言特性,这些都是工具。但一个真正的熟练程序员会使工具适应工作,而不是让工作适应工具。 许多人从没有特别专注于开发的熟练度,因为坦率地讲,以一个有能力者的角度进行开发更直截了当。但是如果你想要改变自己做事情的角度,并且需要一些帮助以便更好的开始,这里有一些建议可以尝试: 解释你想要以某种方式做某件事的原因,但是不要说是因为“最佳实践”或者是社区指南。仅仅就当前需要解决的问题内容讨论解决方法的利弊。 学**更少更有价值的事情,之后尝试着将所学到的知识应用到不同地方,观察所学知识在哪里起作用,哪里没效果。使用失败的经验来发现自己真正所需的新工具,并添加到自己的技能库中。寻找那些其他人“打破规则”并获得成功的例子。偶尔也打破你自己的规则,看看这样做对你是有伤害、有帮助还是没有起到任何作用。 挖掘事情的本源而不是只知道大概。这会耗费更多精力,但能帮助我们找出某项技术的基础和边界,同时我们也会受到核心思想的启发而产生我们自己的想法。 将自己置于某个自己最不熟悉的工程中,然后试着在不依赖自己现有的工作流程、**惯和规则的条件下找到解决方法。询问其他人做事情的原因,但不接受教条式的理由。通过询问其他人,能够试着站在其他人的角度考虑事情。这样做有很大的价值,因为这能够让你认识到他们以自己熟悉的方式思考出的想法的优势和劣势。 选取一小部分自己能够使用但不精通的技能,试着将对这些技能的掌握程度从“有能力”变为极为熟练一致痴迷的程度。达到对整个知识体系中一小部分的掌握,比你所知的任何人都要高的程度。一旦你达到那种境界,再去检验那些很深很专一的知识的优缺点。 结论 作为一名程序员,要一直探究不熟悉、不同角度、不精通的技术。只有这样你才能在“有能力”的基础上更上一层,才能脱离仅仅是“知道某些事情”的程度 。 最重要的是:一旦你开始专注于以“熟练”为目标,有很大机会能够找到一条真正通往“精通”的道路。
756 次阅读|0 个评论
分享 (转发聚源电子)初步了解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的无线充电拭目以待吧!
80 次阅读|0 个评论
分享 超声波传感器模块如何测距后控制外连12v开关闭合
easonas 2017-5-5 16:23
如题,超声波传感器模块如何测距后控制外连12v开关闭合。
92 次阅读|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建不好,其实没关系,刚开始可以粗糙一点,后续可以慢慢的完善。 这个架构已经隔离好了每个部分的变化对其他部分的影响,变化成本都在可控的范围之内。
135 次阅读|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 考虑在内,您可能会丢失一半份额。
155 次阅读|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)。
114 次阅读|0 个评论
分享 电子产品,居多如何选择
热度 1 电级达人 2016-11-4 10:12
我是比较喜欢,电子类的产品,比如:新出来的手机,我就要去查它相关的信息,功能是否好坏,有什么独特之处;给大平台也是一样的,网上有那么多各大平台,但它们有各自优势;它们能在众多平台里存活下来,是有一定的基础,有一定的实力,而我能否在这电子工程世界里脱颖而出还是未知数;所以我要抓紧加油。
787 次阅读|1 个评论
分享 如何判断MOS工作什么状态
A001 2016-6-13 20:31
如何判断MOS工作什么状态
215 次阅读|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等自己测试看看吧。
540 次阅读|0 个评论

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

GMT+8, 2017-6-27 13:24 , Processed in 0.026921 second(s), 19 queries , Redis On.

Powered by EEWORLD电子工程世界

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

返回顶部