0
Posted on 上午11:44:00 by Fan Zhang and filed under , ,

  本文的经验建立在理科专业并使用 LaTeX 的基础上。文献管理的软件和服务很多,我没有用过此类的收费软件,免费的也没有全部仔细试用。因为这类软件或服务的个性化太强,很难找到一个能完全符合我的喜好。本文可以当做一个对最知名的免费的文献管理软件和服务的简要介绍和主观评价。

  首先是我个人的偏好:

  • 不能处理中文虽然不好,但是无所谓。
  • 如果带有自动获取题录的功能,最好能指定来源,获取准确和全面。
  • 理想中的情况是在有多个数据来源的情况下,可以供用户选择较优的。
  • 只要支持 BibTeX 就行。
  • 社会化功能无所谓。
  • 注释功能无所谓。
  • 能否自动获取全文无所谓。

  在线的文献管理服务:

  • CiteULike:Richard Cameron 编写的文献管理服务。个人感觉比较好,支持网站众多,支持 tag,导入和导出都比较方便,分享功能也很完善。可以从 CrossRef 更新数据,并且提示哪些条目更改了。只不过操作不是很方便,批量处理比较麻烦。 或许研究下 API 比较好。
  • Connotea: 后台是 Nature 出版集团,当然这个也说明不了什么,因为 Elsevier 旗下的 2collab 就停止服务了。Connotea 要求文献来源必须提供 URI、DOI、PMID、ASIN 这类索引性信息,但是比如早期的期刊文献并没有 DOI 数据。这对其所能管理的文献有很大的限制。
  • 新科学:国内的服务,用的人不多,但是功能还不错,对于国内的数据库的文献导入支持得比较好。

  注:CrossRef 的信息也不全是正确的,作者名称通常只是简称。此外使用 CrossRef 搜索题录应该是收费的,虽然可以利用 CiteULike 的数据吧...

  完全本地的文献管理软件:

  • JabRef:开源。只能管理 BibTeX 格式,需要 Java 运行环境,界面不好看。但这是我最终一直在使用的软件,它的自动生成 BibTeX key 的功能非常好用,另外自动查找相关文件(需要靠文件名)的功能也很有用。论功能,JabRef 完全可以满足我的所有需求。
  • Bibus:开源,还是 Python 开发的。但是经历了一次安装失败,就没用...

  下面介绍的是在线服务和本地客户端整合的软件,主要功能集中在客户端,网络服务上可以备份数据并提供社会化功能:

  • Zotero:是 Firefox 的一个扩展,现在也有独立运行版本(感觉是基于 Firefox 剪裁的)。对惯用 Firefox 的人来说,这是非常好的一个选择。它通过 DOI 等信息获取题录应该也是来自 CrossRef。我非常喜欢的是它能标出获取的数据来源,虽然并没有提供多个来源的选择。
  • Mendeley: 非常适合在积攒了大量的 PDF 文件时处理,因为这个软件可以识别 PDF 中包含的 citation 信息(虽然准确率一般般)。也可以通过 DOI 数据从 CrossRef (我猜测)获取信息。可惜不方便的地方在于,它从 DOI 更新数据的时候,没有提示就直接覆盖了之前的数据。往往获取的数据并不太好,这点使我的体验不是太好,期待之后的改进。此外,Mendeley 可以导入 CiteULike 的数据。
0
Posted on 下午9:16:00 by Fan Zhang and filed under

  买了新手机、新笔记本的同学往往特别在乎电池,尤其是笔记本,喜欢用各种软件去查看电池损耗。本文希望能简要介绍一些我能所知的锂电池使用和保养的方法。物理也不怎么好,以下所有论断都是查阅资料后的判断。

  首先说一下常见的误区:

  1. 满充满放三次,充电12小时,刻意满充满放,都是对锂电池有损害的方式,这些是对镍氢电池的。
  2. 充满了继续插着对锂电池没什么用,充电电路会停止充电的。
  3. 边充电边工作对锂电池影响不大,之所以不建议边充边工作的原因是高温环境对电池损害大。除非笔记本天天不关温度较高,去掉电池可能有点好处。一般情况下,边用边用没有问题。

  正确的使用方法是随时充电,想用就用,避免过放。当然,如果有可能,遵循下面的使用方式会有些好处:

  1. 浅充浅放。也就是说放电和充电的程度都不要太大,所以在条件允许的情况下随手充电就是很好的习惯。
  2. 避免高温。
  3. 避免过充和过放。因为锂电池都有保护电路,所以一般情况下,这种情况也不会发生。除非长时间不用,可能就过放了。

  长时间不用怎么办?

  1. 电量在 40%~60% 的程度保存。
  2. 尽量在低温环境下保存。

  此外涉及到充电器的问题:

  1. 现在很少有把电源管理 IC 放在充电器上,一般都在锂电池上或者设备上。所以充电器只要电压符合,就可以充电。
  2. 至于充电器的标称电流,代表充电器的输出功率,使用多少是由电源管理 IC 控制的,所以功率大小只会影响充电快慢,使用超过设备所需的大功率充电器充电,也只会依据设备的电源管理 IC 的设置进行充电,通常也不会充得快。特别指出,用 iPad 的 10W 充电器给 iPhone 充电完全没有问题。Apple 网站和下面提供的参考资料中都有回答和验证。
  3. 充电器电压一般都高于 5V,浮动 0.2V 没有关系,由电源管理 IC 控制提供给电池的电压。
  4. 尽量不用座充,这是因为市面上的万能充不怎么好。详细介绍见下面的参考资料。

  iPad 充电要求比较高,一方面是需要 10W 功率的充电器才能合理的时间充电(否则就太慢了),另一方面,Apple 的充电器的 USB 接口额外有一个识别电阻。没有这个识别电阻,可能会让 iPad 显示"不在充电"。

  参考资料如下:

0
Posted on 下午9:15:00 by Fan Zhang and filed under

  这个东西到底怎么叫呢?插线板,接线板,插排,电源转换器好多名字,英文怎么说?不管了。

  为什么要选择一个好的插线板,两点考虑:用电安全和保护电器。

  先说结论:

  • 不在乎的用什么都行。
  • 想用便宜没有过多要求的,用航嘉、公牛、可来博等等你听说过的牌子。
  • 需要防浪涌等功能,就选择:APC、贝尔金、突破(保镖系列),不建议用航嘉、秋叶原、飞利浦等带防浪涌的型号,既然都在乎了,就买个好点的。比如飞利浦的低端电源做工不错,带防雷击的型号就比较差。
  • 特有钱没地方花的,选择电源净化器、UPS等。

  国内大部分插线板(包括品牌的),假冒伪劣(比如不接地线)的就不说了,即使能用的,在做工和用料上往往也不令人满意。设计和用材不好的插线板,自然有安全隐患。

  1. 线缆铜丝截面积至少应为 3×0.75 平方毫米。如果截面积太小,插线板所接电器功率过大时,线就会发热。有的插线板线很粗,但是里面铜丝确很细。
  2. 内部走线美观,做工精致。用铜排的当然最好,如果都用焊接方式的,走线美观也不错。一体式内芯有利于减少内阻,避免虚焊,从而降低损耗。
  3. 插口使用磷青铜接触弹片。使用其他材质的,多次插拔后夹持力就下降了。
  4. 使用银触点开关。普通铜触点开关容易引起电弧,也就是开关过程中看见的火花。煤气泄漏不要按开关就是说这个。

  插线板除了基本功能以外,还有些个性化要求,比如我喜欢:

  1. 每个插孔独立开关的。
  2. 插孔间距大。
  3. 插孔有插入保护,可以防止儿童误插或者异物落入。
  4. 高阻燃、耐冲击外壳。

  插线板骗我们钱,自然是从更高级的功能上来的:

  1. 过电压保护,过载保护,漏电保护:这些从功能上有了应该不会骗人,算是比较好检测的保护,区别就在于敏感度和承载量,不过一般有这些功能的区别不会太大。
  2. 浪涌保护,防雷击保护:别想着能防直击雷,对于感应雷和普通浪涌,目前的插线板都是使用压敏电阻 MOV 和放电管来保护的。区别在于用的 MOV 好不好。其实不用太在意浪涌,家用大型电器设计的时候一般都考虑了保护功能(如果没有说明电器不好...)。
  3. 滤波功能:防浪涌可以削弱尖峰,但是对于电源中的噪声应该无能为力。如果有一个 EMI 滤波器自然更好。如果对音响的性能比较敏感,就多花些钱买电源净化器吧。当然了,真正的HIFI烧友只用雅鲁藏布江的水电,我作为外行就不讨论了。

  泡泡网有一个系列文章:帮助你了解电源,可以看看。

0
Posted on 上午11:13:00 by Fan Zhang and filed under

  总不能在标题上就写如何盗链吧...

  Referer 是 HTTP Header 的一个字段(wiki),包含在向服务器发送的请求中,记录访客的来源URI。

  很多网站用辨识 Referer 来防止盗链,比如百度、网易相册。以猫扑上的图片为例,如果我们直接访问,或者外链到其他网站,就会显示不出。因为猫扑的服务器判断 Referer 信息,发现不是来自自身网站,就对该请求予以拒绝。

  如果网站的防盗链措施只是基于 Referer 判断,可以通过伪造 Referer 来实现外链。比如 Firefox 的 RefControl 扩展。但是依据安全性(The setRequestHeader() method),不能要求用户浏览器发送伪造的 Referer。

  所以早期使用 JavaScript 利用 XMLHttpRequest 设置 Referer,早期的 Flash 通过 ActionScript 构造请求的时候,自定义 Referer 的方法现在都被禁止了。

  既然不能强制客户端设置 Referer,那只能通过服务器中转的方式,因为在服务器端就可以构造自定义请求了。

  对于网站管理者来说,防止盗链的方式就很多了,比如利用 Session,判断 IP,生成随机码等等方式...

0
Posted on 上午3:10:00 by Fan Zhang and filed under

  Python 允许通过 exec 和 eval 执行以字符串形式表示的代码片段,这体现了动态语言的特性。利用这种特性,可以让代码变得更灵活。不过一直以来,我对这种"动态"的用法不太"适应",因为:

  1. 让代码引入了某些不安定因素,这些代码片段执行后可能对全局造成影响。尤其是当使用全局名称空间时,它的作用范围难以控制。
  2. 对执行的效率也有影响。Python 在执行代码之前也是要预编译的,比如 pyc 文件。因此这些字符串形式的代码片段在执行的时候,需要编译的过程,哪怕是使用 compile 编译后重复使用,第一次的编译是难以避免的。

  很多人也倾向于避免这种用法,比如:Use of eval in Python?

  不过最近在写网站解析程序的时候,发现为了实现目的,最好的解决方案还是引入这种字符串形式的代码片段。这个问题具体描述是:我需要对一系列类似的网站进行解析。整体的解析过程是相似的,所以我建立了一个框架,使用 XML 保存每个站点各自的解析属性,通常是 XPath 和正则表达式。但是某些内容各个网站的表现方式有很大差别,这些内容想要解析出来只使用 XPath 和正则表达式是不够的。因此对这些例外情形,最好的方式是直接利用代码片段来计算。

  此外,现有的项目,比如 Genshi 之类模板引擎也采用了类似的处理手段。

  用户使用程序如果能执行自己的代码片段,这往往是有潜在危险的,尤其是在网络服务中,因此我们在使用的字符串代码片段的时候,要严格限制名称空间。对这个问题的讨论,可以参考 Using eval() safely in python,这里做一个简要的总结。

  默认的,eval 和 exec 所运行的代码都位于当前的名称空间中,它们也可以接受一个或两个可选字典参数作为代码执行的全局名称空间和局部名称空间。

  eval 的用法最严格的限制(注意对 builtins 的处理)是:

eval(user_func,{"__builtins__":None},{"x":x,"sin":sin})

  如果希望允许使用某些变量和函数,可以采用下面的方法:

eval(user_func,{"__builtins__":None},{"x":x,"sin":sin})

  有关使用 exec 和 eval 的注意事项,文章 Be careful with exec and eval in Python 进行了细致的讨论。首次编译是不可避免的,使用预编译后重复使用可以提高效率。另外使用局部空间因此可以加快变量的查询速度,所以执行会快。

  下面还有几个需要注意的地方:

  能避免使用的时候,还是应该采用其他方式,比如转换字符串的时候,使用 int() 而不是 eval(),因为如果转换的这个字符串是用户输入的,危险的情况是 eval() 会执行恶意输入的条命令。详细的解释参考:Python之eval()函数的危险

  尽量避免使用 eval 来获取变量名,想要实现动态变量名,使用 globals(),locals() 以及 vars()。

a = 123 
s1 = locals()['a'] 
s2 = vars()['a'] 
print s1, s2

  类似的情况也出现在 JSON 格式的解析上,参见 Running JSON through Python's eval()?