十二 182010

注:这本来是11月的文章,当时没写完,现在拣出来继续。有时候觉得文章放一段时间再写也有好处——让记忆去自选择,忘掉不重要的细节。

猪是一种被广泛误解的动物。以前某童鞋形容另外一位童鞋“跑得比猪还慢”,我听了立即反驳,猪是跑得很快的动物,我是看着猪长大的,那些小猪崽,整天一愣一愣地到处拱土;关于此事,有诗为证:

远看山无色,近听水无声。
春去花还在,人来猪不惊。

人来猪不惊只是很短暂的现象。那一群猪往往是抬起头看你三秒,然后一哄而散,四处逃窜,跑得比兔子还快。我从来不知道猪到底是怎么想的,总之猪是一种很奇特的动物。这是标题党对猪的介绍。

感恩节放假,照旧宅家里,所谓躲进小楼成一统,管它春夏与秋冬。前四天干了一件事:重新盖了一下统计之都。这活儿就跟拱土的猪一样,要拱就拱到底,早上爬起来就开始拱,一直拱到半夜睡觉。江湖上总是传说这位大牛三小时写出了豆瓣网,那大神四小时创建了啥网,这等神话对我等小辈,也只能当故事听听,听罢该拱猪还得拱。我是个对网站外观非常挑剔的人,我理想中的网站外观应该有这样的效果:当读者打开网页之后,十秒之内必须在口头或心里说“真他爷爷的震撼”,甚至心生买椟还珠之意。

102009

些日子有位童鞋在R-help邮件列表里问如何生成那种单词大小与其出现频率成比例的图,这玩意儿也就是通常所说的标签云(Tag Cloud)。我琢磨了一下WordPress的插件wp-cumulus,发现其原理很简单,不过就是将标签信息以XML形式通过JavaScript传递给一个Flash文件,所以也很容易用R去实现这个传递过程,即:将文本、超级链接以及频数写成XML,然后嵌入到HTML文件中。整个过程参见Creating Tag Cloud Using R and Flash / JavaScript (SWFObject)这篇日志,函数源代码和示例数据都可以从那里下载。

效果是这样的:

Your browser does not support Flash or Javascript!

(通过RSS阅读的童鞋们请打开原文链接在浏览器中观看,否则啥都看不到)

302009

Venn Diagram by Google Chart APIGoogle Chart API是很老的产品了(下文简称GCA),以前隐约听说过这么个东西,只是没觉得什么地方能用上,如果仅仅是单幅图形,还不如自己用软件画出来,而且自己画图比用GCA要方便灵活许多。这两天琢磨着网页里面有些简单的数字该如何显示给读者,比如几乎所有人的博客上都会显示阅读次数、评论条数等数据,这些数据是动态的,所以不适合静态图形展示,因此又想起GCA。简单来说,GCA就是用网址传递数据给Google的某个画图程序,Google画完之后把图形以PNG形式返回给你,你可以在网页中尽情使用。由于数据包含在网址中,因此很容易通过动态网页程序(如PHP)生成数据并写出网址。

1、从访问数和评论数生成Venn图

作为一个简单应用,我把原本枯燥的三个数字“用户(user)阅读次数”、“机器人(bot,网络爬虫)浏览次数”和“评论(comment)条数”用Venn图展示在每个条标题下的信息栏中了。对于学过与集合有关的课程(如概率论)的人来说,Venn图几乎是第一节课就会接触到的东西,它直观表明了几个集合之间的关系,如交集与并集。前面的三个数字中,user和bot交集为空,而user与comment的交集为comment,因为凡是发表评论的人必然要打开页面阅读。

Venn图的主要参数是7个数字,依次说明各个集合的大小:A, B, C, A∩B, A∩C, B∩C, A∩B∩C。这7个数字传给数据参数chd即可,如:

http://chart.apis.google.com/chart?cht=v&chs=300x300&chd=t:100,80,60,30,25,20,10
022008

样子我前一篇日志里面提到的问题并不是一个简单问题,到现在我基本上已经放弃了向Rweb提交代码获取结果的想法了,原因是多数浏览器不允许跨域(cross domain)提交表单并获得结果,据说是有安全问题,我没空去仔细研究里面的细节。现在在尝试了

  1. jQuery + Form插件
  2. Ajax
  3. iframe + JavaScript

三种方法之后,我决定给明尼苏达大学的Charles Geyer写信诉苦,我需要服务器支持以在网页上实时生成动画;仅凭我在客户端捣鼓,估计浪费一个星期时间也未必能捣鼓出来。

282008

下现在有个小技术问题,自己去钻研太浪费时间了,因此拜求江湖高手帮我一把。问题是这样,我想提交一个表单给某个网站的CGI执行,然后把执行返回结果中的图片地址都拿出来。提交和执行过程中不要影响当前的HTML页面(即:不要直接跳转到CGI页面,这似乎是Ajax的特征)。以下是普通的表单界面:

返回的图片URL放在一个数组中即可。谢谢!

072008

种语言都有自己的特殊字符,比如引号、反斜杠等,当我们需要把这些字符当作普通字符使用时,就必须在前面加上一个转义符(escape character),例如JavaScript中需要输出双引号时,就要用\”。想一下,如果用R输出“能输出HTML字符的Java脚本”,那样转义符会是什么模样。

比如HTML中需要一对双引号:”",用Java脚本写的话就是:document.write(“\”\”"),用R来写这句Java脚本的话就是:cat(“document.write(\”\\\”\\\”\”)”)。而我需要的Java脚本远比这复杂,不幸的是用R写出来之后Firefox运行正常,IE不正常,说脚本有错,额滴神啊,人海茫茫让我上哪儿去给您找错,IE也没一个debug功能。这就是我崩溃的原因。

132007

了MSIE能利用自身的缓存,真是让我想破了头。好在到现在终于找到了一种解决办法,其实所有的技巧都在于:不要用JavaScript调用任何与URL有关的对象。既然不能用JavaScript动态改变页面内元素(比如图形<img src=… />)的URL,那么,想要在页面内动态快速显示图片的路基本上只剩下一条了,那就是CSS。基本原理是:利用JavaScript动态改变一个层(<div id=…></div>)的CSS属性,若想让它显示,则设置为*.style.display = “block;否则,设置为*.style.display = “none。通过对若干个层的依次显隐,一副动画就大功告成了。

当然,Firefox对这种办法也是支持的。至此,我才基本搞定了动画在网页上的显示方式——万里长征的第一步。

今天看JavaScript Reference顺便也了解到window.onload的作用,当一个页面在客户端加载完成之后这个函数就会被调用,因此可以事先在页面内放置一个“正在加载”的说明字样,等页面全都加载完毕了之后把这个说明隐去,并将动画的“开始”按钮设置为可用(disabled = false)。这样一个动画页面就完美了,吼吼。

依然参见:http://r.yihui.name/misc/java.htm(猛增速度,faster,直接把时间间隔减小到0秒,看看是什么效果)

外一篇:之前走了什么弯路

在此之前,我走的弯路太多了,现在综合起来也就一个特点:那些方法全都涉及到URL……

  1. 比如设置图片的src属性(*.src = …
  2. 比如设置表格的背景(*.setAttribute(“background”, …)
  3. 比如设置对象的背景图像(*.style.backgroundImage = “url(…)”
  4. 比如把一个对象的HTML代码(包含图片标签)赋给另一个对象(*.innerHTML = **.innerHTML
  5. 等等

而对一个对象的显隐控制不会涉及到图片地址,只是单纯的显示或隐藏一个对象——实质上它一直都在这个页面里。

132007

NND,花了我六七个小时的时间,就为一个缓存问题,换了四五种方法(JavaScript、CSS方法都用过了),但在IE中始终解决不了。

为了让动画在网页中显示地更流畅,必须要先将动画的所有帧预先下载下来,否则等开始显示动画的时候就很可能会卡。Firefox可以顺利地将图片先放在缓存中随时供调用,而IE这个笨蛋在每次调用图片的时候都要重新下载,这样的话根本没办法流畅显示动画。

具体例子可以参见:http://r.yihui.name/misc/java.htm(最底端,点“Begin”开始,可以调整动画速度)

各位也不妨用不同的浏览器帮我测试一下,谢谢。也没准儿是我个人IE的问题……

102007

天半夜被一个JavaScript的问题迷惑了好一阵子,然后才反应过来,这又是IE和Firefox的差别。主要问题是,Firefox对 document.all["id"] 这种获取页面内元素的方式并不太支持,而最好通过 document.getElementById(“id”) 这种更严格的方式来引用页面内的对象;对于IE而言,两种方式都可以。

之所以涉及到这个问题是因为我想在HTML页面中直接实现动画展示,省得还要费尽苦心去研究GIF文件格式然后读写GIF文件以便生成GIF动画文件,通过JavaScript的方式生成动画比研究GIF要容易多了,只需要调用Java脚本改变一幅图的src属性就足够了,然后用一个循环让图像“动”起来。示例参见:http://r.yihui.name/misc/java.htm页面底部(点击按钮观看布朗运动)

082007

这两个网站是我所看到比较经典的JS图片放大效果网站:

前者是在页面内缩放,后者是采用的“全屏”效果,我看后者的代码稍微简单一些,就采用了后者,不过也借鉴了前者的一个放大镜图标,这样有助于提醒访问者他所看到的这幅图片时可以继续放大的;不过这个图标还费了我半天劲才让它在IE中也显示出来,主要是IE对CSS中文件路径的解析比较奇怪,而Firefox就能正确解析出来。

那么以后本站中的图片就可以有缩放效果啦!而且对于多幅图片,还可以以幻灯方式依次浏览,嗯,8错8错。

WWW.YIHUI.NAME XIE@YIHUI.NAME © 2007 - 2012 by Yihui Xie