-
2009年04月16日
web开发者必备的15个Firefox插件 - [翻译]
过去的几周,我一直在忙于一个新的网站。不过,我决定借助Firefox的扩展来摆脱独自工作。它们使我的工作减轻不少,仅需几秒钟下载。
Aardvark:Aardvark使你能够选择网页上的元素,以展示其上的行为。我用它来分析页面结构。你也能够移除、隔离元素或产生DOM代码。我强烈推荐。
ColorZilla:如果网页上有你喜欢的颜色,ColorZilla会找到其精确值,你就可以粘贴到代码程序里了。还能根据内建的调色板来产生自定义的颜色。它还保存经常使用的颜色,方便随后使用。强大、简单,必不可少。

CSS Validator:CSS Validator在浏览器增加一个右击选项,以发送CSS到W3C CSS Validator。它在新开的标签(tab)里显示结果。CSS Validator是个好工具,迟早用得着。
CSSViewer:没有web设计师应该不使用CSSViewer。该插件告诉你所需要的关于某个站点的所有CSS信息。仅仅单击页面,打开工具菜单,它就显示了CSS信息。我几乎天天用。
FireBug:FireBug是那些不可或缺的扩展之一。它允许你编辑、debug、查看CSS、HTML和JavaScript。一旦你修改了站点的HTML,FireBug会自动在同一个窗户显示。非常强大。
FirePHP:FireBug是面向CSS、HTML和JavaScript的好工具,而FirePHP,仅在你已安装FireBug扩展之后,会产生具有丰富功能的开发体验。你可以查看PHP的质量、排错。很有帮助。
Font Finder:它可以高亮任意站点上的字体,在选择区域右击,选择“Font Finder”,以查看选择部分整个CSS文本样式。然后你就能粘贴到自己的网页里。
HTML Validator:功能非常强大,仅windows用户使用。它把网页的错误反馈给你。它还告诉你问题出在哪里。但是,如果你不是一个高级的web设计师,还是远离它。太过复杂。
IE View:只要你在使用windows,IE Viewer就是有用的工具。它在右键菜单里增加了“Open in IE”选项,从而快速地在Internet Explorer里打开网址。它还可以对比一个网页在两个浏览器里的样子。
Java Console:如果你想知道Java applets如何在网页上运行,Java Console就适合你。你可以监视、调试applets,并获得一份有关性能的完整报告。
LinkChecker:高亮任何网站的链接,告诉你该链接把你带到一个可用的站点,否则将返回404.我天天用。
Poster:如果你想调试服务器,发出HTTP请求,Poster就是最佳工具。操作简单,你先设定一个内容类型,数分钟内,你将拥有需要检视HTTP请求结果的所有信息。适用。
Style Sheet Chooser II:它取代FireFox内建的样式单选择器,让你选用不同的样式,并持续应用整个网站。它不经常被用到,但是,某些工作还是需要它的。
Web Developer:如果你安装了这里提到的任何扩展,Web Development也应当包括在内。它给Firefox增加了一个菜单和工具条,你可以选择显示网页的样式,查看或编辑CSS等等。Web开发者必不可少。
YSlow:需要安装了FireBug,它可以找到网站速度慢的原因。它根据《Yahoo's rules for high-performance Web sites》分析网页,并返回使网站变慢的因素。我经常让它帮我找到如何提高网站速度。试试看。
-
2009年03月08日
3/3/09: 数学迷庆祝平方根日 - [翻译]
抹掉尺子上面的灰尘,重新给计算器冲上电。平方根日来啦。
数学方面的节日---每个世纪仅仅有九次---在3/3/09 周一这天降临了(从算术看,3是9的平方根)。
“这些节日就像日历上的彗星,你等啊等啊,终于等到了它们,然后它们点亮了你的日子---噗噗噗---它们又走了”,Ron Gordon说道。他是Redwood城的老师,曾经举办了一场竞赛来让人们因这个节日而兴奋。
当然,在盛大的平方根日,获奖者领取了$339。
Gordon的女儿甚至在Facebook建立了一个网页---用六个当中的一个来纪念这个节日---好几百人加入了以某种形式庆祝该节日的计划。有各种各样的庆祝:有的把根菜类蔬菜切成平方根,还有的把食物弄成平方根符号的形状。
上一次的节日是五年前的2.2,2004年,和土拨鼠节同一天。下一次将是七年以后的4.4,2016年。
原文地址:http://www.sfgate.com/cgi-bin/article.cgi?f=/n/a/2009/03/02/state/n161221S74.DTL&type=printable
-
2009年03月07日
开发者更“钟情”PHP - [翻译]
原文地址:http://www.theregister.co.uk/2009/03/05/evans_data_gentlemen_prefer_php/print.html
你打倒了PHP了吗?(还有Ruby)
Evans Data展开的一项调查显示,总的来说,与使用Ruby、Perl, Javascript, Flex, 和 VB script编程的开发者相比,使用PHP的开发者更满意脚本语言。
Evans Data说,他调查了世界范围内的500个开发者和IT专家,让他们排列出自己使用的脚本语言的特性和选择。根据12项特征来判断这些语言,诸如易用性、异常处理、安全、客户端脚本及代码社区。
总的脚本王权倒向了PHP,PHP占据榜首。Ruby因其较高的易用性位居第二,也是赢得大部分开发者青睐的最重要的特点。在扩展性取得高分的Python排在第三位。
调查报告:
总体来讲,大部分语言具有优点和缺点。Ruby用户坚信它最容易使用,用Ruby开发要比其他语言快很多。它支持面向对象和代码可复用性,因此开发者应该能够写出可维护和可扩展的程序。然而,Ruby社区非常小,尽管过去两三年里不乏很多大肆宣传,Ruby市场渗透一直微弱,找到Ruby开发者也不太容易---这是一个潜在的大问题。
Evans Data 认为Python用户“满腔激情”,他说,该语言最好的特点支持相对大型复杂应用程序的建立。虽然Python开发者社区不大,但是在过去的几年里显示出扩大的迹象。还有,Google使用Python,所以毫无疑问地,它非常酷。
但是,Ruby和Python在总分上败给了PHP,PHP拥有仅次于JavaScript的第二大脚本语言社区。市场研究公司给PHP起了个绰号“web里事实上的做粗工者”,它具有强大的工具以及“成堆的、容易找到的”开发者。
最低满意度的是那些使用Microsoft VBScript的用户。

按类别划分的前三种语言是:
- 易用性: Ruby, PHP, Flex
- 异常处理: Ruby, Python, Powershell
- 可扩展性: Python, PHP, Perl
- 可维护性、可读性: Ruby, PHP, Python
- 跨平台移植: PHP, Ruby, Python
- 社区: Ruby, PHP, Javascript
- 工具有效性: PHP, Ruby, VB Script
- 工具的质量: PHP, Flex, Python
- 性能: PHP, Perl, Python
- 内存管理: Python, Perl, Flex
- 客户端脚本: Javascript, Ruby, Windows Powershell
- 安全: Microsoft F#, PHP, Ruby
-
2009年01月10日
语义化HTML和搜索引擎优化 - [翻译]
简介
什么是POSH?它不是web设计师之间大肆宣传的某个新的衣服款式------POSH是Plain Old Semantic HTML的缩写。语义化HTML这个词用在各种场合,但是它是这样产生的:与使用表象HTML相反,用语义化的元素和属性建立(X)HTML。一些备受尊重的web设计师想用一个好记的词来抓住语义化HTML概念的本质,POSH就诞生了。
本文,我将讨论为什么要用POSH,需要确切地做什么来实现它(你们当中许多人可能已经做了,另一些人或许还没有意识到!)以及你怎样通过优化来提高站点的SEO。我在文章后面粗谈一下Microformats。
为什么我使用语义化HTML
你会说:“因为web有这个权利,”不过,好处不止这些。例如,它很容易被有视觉障碍用户使用的屏幕阅读器识别。
其次,SEO和语义化HTML是亲密的朋友。它们有时或许产生冲突,文章稍后提及,但总的来说,它们是朋友。SEO是为了帮助搜索引擎蜘蛛更好地理解网页,以更好地进行归类。既然一个搜索引擎蜘蛛基本上比屏幕阅读器理解力要差,那么,它就需要更多的向导来分析网页的结构和话题。好的语义化HTML仅仅提供结构。
语义化HTML试着通过网页上的词语和标签来表达意思。不妨这样想:网页内容就是你说的话。标签提供结构,语调,暂停,甚至你脸上的表情。事实上,标签占到了信息的一半。
网站结构
在我的《之前的文章》,我讨论了网站结构,旨在为搜索引擎提供一种发现网站哪一页谈论什么话题的方法------借助语义化HTML可以进一步提高。
页面结构
页面由title,一个或多个heading,和内容组成。内容包括文本段落,列表,引用,图片和表格。所有信息的表现形式都有他们自己被设计好的标签。我们将讨论它们,让我们从heading开始。Use this page about sortable tables as an example to follow along with for the coming points.(此句不好翻译)
Headings,从h1到h6
好的文件具有标题和子标题,因为标题更容易概括网页的话题。这些标题从h1到h6按照重要性依次排列。老实地说,我本人从来没有用过h5和h6.我通常在内容页使用仅仅一个h1标签;在首页,例如博客主页;你可以使用多个h1,比如上面的所有文章。从语义角度看,或许有点古怪;从SEO考虑,就非常棒了。
严格的语义学者往往建议你仅仅应当使用一个h1,两个h2,三个h3等等。我不同意此观点,超过两个h2的文件非常普遍,实际上,这篇文章就有很多h2,我认为组织得很好。
经常,听过一点语义化HTML的设计师会把页面头部站点名称填到一个h1标签里。对主页而言,这样做是非常明智的。在网站的其他页面,你很可能有一个特定的话题,它们和网站名称相关但不是必须的。在这些子页面里,话题就应当放在h1标签里,而把站点名称放在h4标签、甚至span标签会更好一些。
搜索引擎对于各种heading里的词语给予了不同的权重,以判断网页的主题。网页优化的关键词至少出现在h1标签里一次,相关的关键词应该出现在其他的heading里,如图所示。

图片
图片在文件中的用法较为丰富,你应当对它们应用合适的语义。img标签里唯一真正有用的语义变量是alt属性,它仅用在对文件很重要的图片上。如果图片仅仅是装饰性的,就让alt留空。否则,对图片的描述将显示在alt属性上。
如果你正用图片替代文本,因为你想让文本看起来更好(图片代替),那么,要确信你在HTML里使用了合适的文本,然后通过CSS用图片代替文本。你不得不这样做,由于有视觉障碍的人们和搜索引擎都不能读取图片上的文本。我的首选方法是,通过使用CSS的background-image,然后设置一个较大的text-indent(大约-1000px直至成功)来隐藏HTML文本。尽管这样,你还是要小心:图片上的文本应该和文件中的文本完全一样。否则,你将面临从搜索引擎失去很多等级值的危险。
缩写和首字母缩写
作为一名web设计师,你一定要这样做------我在本文就用了好多次------使用缩写或首字母缩写。你用的时候,要确信你提供了使用abbr或acronym标签的词语的书面版本。也有利于关键词密度!
表格
我们都知道使用table来布局网站不好,我们也知道它们应该用于------显示表列数据。这仅仅是朝着正确方向迈出了一大步,仍然有很多方法让你提高表格的语义,因此进一步提升网站的SEO:
- 在表格的头部,使用table heading(th)(的确很简单)
- 尽可能使用thead、tbody和tfoot来合理划分表格
- 为了描述表格里的东西,请提供一个caption
caption和表格头部是使用文件中关键词的合适并且非常自然的地方。
强调重要性
还记得我说过的标签就是文本的语调吗?下面就是真正的语调:用em或strong来强调某些词语。过去,人们使用b和i,但是这些标签不再被提倡了,既然它们暗示着特定的样式,而HTML应当仅仅描述结构 / 重要性(所有的样式应该当然要用CSS实现)。
使用这四个标签的词语会得到搜索引擎更多的权重。过度使用会带来害处,事实上,会丢失重点,但是,小心使用,它们会给你的文件带来额外的东西。
关于(i)frame的话
很简单:不要使用。搜索引擎找不到它,屏幕阅读器用户也很痛苦。
利益冲突
上面所有规律当然可以更改,有时候,为了使每一个人在组织里开心,那也是必要的。比如,老板想让网页拥有令人激动的市场标题,而你不太愿意,因为它不能很好地描述网页的内容,而且把最重要的关键词推到了次标题上。如果你求胜心切的话,不妨使网页表面符合老板的想法,实际上,用h2放第一个标题,h1放第二标题。
iframe和image同样也行。如果某人真的想让你把内容的一部分放在特定的高等级的网页上,而你不想冒着失去关注的风险,你就可以把那部分内容放近一个iframe或图片里,但不提供alt。
最终决定取决于你------合理的语义应当是设计的基础,当你真正想优化网页时,冲突才开始产生。
不只是简单的语义HTML ------Microformats
Microformats也有语义HTML,但是他们不够简单!(本段略去)
总结
使用语义化HTML标记网页,你就可以制作更好的、针对残疾人和搜索引擎的可访问性的网页。好的语义标记有助于搜索引擎判断网页的话题,如果结构也好的话,你的网站就会排在前头啦!
原文地址:http://dev.opera.com/articles/view/semantic-html-and-search-engine-optimiza/
-
2009年01月09日
你需要当心的四种在线自由职业者的工作 - [翻译]
起初,自由职业者会接受每一个任务,从而犯下错误。我犯错误了,你也会有一个机会。谁在责怪我们呀?自由职业收入不稳定,尤其刚开始。我们认为我们应当接受今天能够拿到的所有工作机会 ------明天可能就没有了。
然而有时候,我们付出了很多终于结束了工作,却没有得到多少。我们仅仅把这当作一个进入该行业的教训,只不过教训得来不易。我们怎样才能区分有疑问的工作,又该如何处理呢?
低报酬工作
经常刊登的广告里会有一些工作,它们借助“曝光”或收益百分比来作为低报酬的赔偿。它们也会找借口,如下所示:
- 它们是刚刚起步的公司;
- 发展中国家的web工作人员汇率较低,你不得不和他们竞争;
- 你的工资会随着时间而增长(虽然条款有点模糊,并没有在合同里写明)。
即使低报酬工作合法,接受它还是有劣势的。它会占用你工作周里的几个小时,你本来可以花在市场上以获取高报酬的工作。而且,它最终降低了你的平均每小时收入。比较理想的是,你应该逐年增加回报率,而不是其他方式。
如果你还没有开始留意你的web工作经验,就没有理由从事这个工作。
学不到东西的工作
在以前的文章里,Mike Gunderloy讨论了如何从事能学到新东西的工作。当我相信能学到经验之外的东西,我会听取Mike的建议,而不是接受重复的复制&粘贴工作。
除非你缺钱或计划外包、委派,否则,你除了拿到钱,就收获不了什么啦。
竞标工作
有些工作,你不得不通过效果图、草稿竞标,如果客户认可了,他们再付钱。如果不喜欢,就比较糟了。这种工作申请方式也因“投机的工作”而著名(或简称“spec work”)。由于不是所有的人公开骗你,所以这不是处理业务的最佳方法 ------包括自由职业者和客户。
“简单”的工作
在你看客户最初的说明书时,某些工作好像非常简单,但是一旦你深入项目,你会意识到规模非常大。
在一开始识别这种工作比较困难。通常显露的征兆是当客户对你说“很简单!”或“你10分钟就搞定啦!”想想看,如果工作真的简单,他们为什么不自己做呀?
当然,有些客户很欣赏自由职业者的能力和努力,还有一些会低估你的工作。你认为可以信任客户说的,工作真的简单吗?
对付“简单”任务的一个方法是在开始工作之前,亲自过问项目,跟客户沟通,说清楚交付的东西。这使你逃过“令人惊奇的”任务,当你意识到项目规模比客户最初设想的大很多的时候,它已经悄悄溜进来啦。有时候,你会冒险,看起来你正设法榨取客户的每一便士,但是如果你给了客户需要的所有信息和参考,他们会知道你仅仅在做对他们长期来看有利的事情。
-
2009年01月04日
你现在需要使用的6种新的2008年的web技术 - [翻译]
每年,我们看到大量的创新在web上传播 ------从新的浏览器功能到酷酷的web应用程序,到整个编程语言。有些概念让我们为之一笑,并继续前行。另一些则完全因其功能和灵巧而打动我们------成为必备的东西。
我们在清单中列出了2008年最闪光的、改变人们生活的东东:想法,产品和web体验的提升是如此巨大,以至于我们开始怀疑,没有它们,我们该怎么办。
你或许注意到,一些技术两三年前就有了。其他的甚至还没有火起来。但是,清单里的每个创新均达到了一定成熟程度,到了非常关键的时刻,或者在2008年满足了导致web领域发生巨大变革的迫切需求。
下面这些技术,使得web较12月前更为吸引人。
身份管理
几乎没有什么东西比你的数字ID更有价值,然而很多web用户对此了解甚少。因为在社会化网路,ID不再仅仅是“你是谁”。而是,你认识谁,你如何认识他们的,你想让他们了解你多少。在web上,你的ID将显式地绑定你的关系网,包括朋友和访问过的网站。
今年三项伟大的技术将帮助你管理这些复杂的依赖关系:OpenID,Google Friend Connect 和 Facebook Connect。
这些ID系统都提供一种控制你的社会资本的方法,在你注册或使用不同web service时,提供你的“friend data”数据的缓存。他们也有非常明确的优点------使用一套凭据就可以登录任何网站的简易方法。你得到一个虚拟的ID卡,就可以访问成百上千的网站。还有一个好消息,你不必经受填写个人资料、增加或审核你想参与的每个新blog、社区或SNS上的好友的痛苦。
2008年末上演了一场围绕ID的战争。Facebook Connect,于12月份的第一周允许你使用Facebook ID登录一些网站。还没有广泛采用的Google的Friend Connect和MySpace的MySpaceID,类似系统很快也将开始推广。
尽管还有困难。简单易用的Facebook Connect基于私有代码,与使用OpenID和其他开源标准的Google、MySpace,还不兼容。
我们应该期待围绕个人数据的斗争将在下一年放开,或许更长。但是2008年将被记住,因为 ID 走到了闪光灯下。
HTML 5
一个重要的技术还不存在 ----- HTML 5 -----但是在2008年,主要功能将逐步推出。
HTML 5 终将取代HTML 4.01,它是目前构建网页的占统治地位的编程语言。但是,负责web的主管团队仍然在起草细节,没有人敢期望在接下来的几年里完全成为新的标准。
但HTML 5不再是雾件。早先版本提到的新特点中的很多变化已经在最近的浏览器里得到了体现,某些web上大胆的构建者已经把HTML 5 集成到了网页里。
HTML 5 将向前迈出一大步,标准化包括拖拽网页上的元素,内嵌的文本、图像编辑和绘制动画的新方法。也支持无插件的音频、视频播放,方便的易用性和令人不安的Adobe's Flash, Microsoft's Silverlight 和 Apple's QuickTime。该语言增强了web应用程序,拥有离线存储web数据到本地机器的控件。
想要桌面版的Gmail吗?HTML 5 使之成为可能。哎,the blink tag isn't invited to the party(此句不好翻译)
Lifestreaming
一种新的社会化程序已经开始帮助我们管理过剩的信息 --- lifestream。
不久前,跟踪朋友在因特网上的行踪变得相当容易。每个人属于Friendster或MySpace。现在,有成千上万的社会化站点充满web,每个站点有专门的目的------用于照片的Flickr,音乐站点Last.fm,提醒的Twitter。甚至最基本的服务也绑定到社会化网络。租电影,买书或写博客?让Netflix,Amazon和Blogger上的所有朋友都知道吧。
现在监视你的朋友非常简单、清晰且快捷。
FriendFeed,Plaxo Pulse和Digsby之类的站点提供社会化网络活动收集服务。他们就像虚拟的漏斗。把来自于各种网络的所有通知、feed、更新倒进去,该服务将处理成一个主要的流,告诉你要浏览一打或更多站点,以获悉朋友的情况,他们正听什么,正和谁接吻等等。通过排序或过滤该流,让你回拨电话,理清事情。
很多类似服务已经开始显露,但是被一群前Google员工设计的优雅、简单的站点FriendFeed是我们的最爱。
哦,不要期望能把Facebook添加到你的lifestream。网络容得下各种数据,但仅有一点点的好东西能出来。
Firefox 3
Firefox于2004年问世,但是,Mozilla推出3的版本却是在2008年6月,事实的确如此。Mozilla浏览器比之前更快、更安全,由于其开源,你也可以随意使用。
今年较高预期的软件发布之一是大约八百多万用户在首日下载Firefox 3.第三次简直像着了魔。
项目的闪光点是带来了非要重要的搜索 ------仅仅在地址栏敲入几个字符,FF3就搜索历史记录,书签和web,并很快把你导引过去。
性能提升使之成为web最快的浏览器之一------特别是冲浪于最近的web应用程序------增强安全功能使之更安全。
Mozilla继续支持面向Firefox的通用扩展的理念,通过向浏览器输入文本格式的命令达到搜索,以及和很多web service互动。
它仍然是IE之后的第二大最受欢迎的浏览器,但是Firefox 3 是web精英们的钟爱。
Google Chrome
它的首次亮相没有如期在9月份进行,也没有像Firefox 3到来的几个月前的序曲迎接其到来。但是,Google的浏览器马上被认定为潜在的游戏变革者,无论在浏览器厂商之内还是web应用程序之外。
Chrome是一款增强web应用程序的浏览器。
它的杀手锏是新的页面渲染方式,它把web应用程序隔离在每个浏览器标签之内 ------一个崩溃的web应用程序或许破坏单个的标签,但是不会影响标签之外的任何东西。浏览器的其余部分仍然完好无损。
当你在一个web应用程序里做一件比较重要的工作时,浏览器崩溃啦,这一点也不陌生,破坏就这样产生了。邮件丢失啦,文档不得不重写,web表单需要重新填写。Chrome杜绝完全崩溃的能力使Google更有信心用web取代桌面应用程序。
Chrome在12月发布了官方的1.0版本。目前仅仅针对Windows,但是我们应当期待Mac和Linux的官方版本很快发布。它仍然很年轻。将来发布将支持插件,通过Google桌面离线同步web数据------认识Google------可能还有其他的我们想不到的修饰。
位置感知
2008年,位置感知信息不再是花哨的附加东东,摇身一变,成为任何神秘的、成功的web service的必需品。
点击电脑或电话上的某个按钮告诉某个web service你在哪里,它就会告诉你附近的餐馆,电影在哪里上映(何时,是否有票),如果需要约会,你的朋友是否就在附近。
随着装备了GPS手机的问世,这一点就更加肯定了。iPhone 3G,T-Mobile G1和最近的Nokia N系列均内置GPS。它们也有真正的web浏览器和必备工具,来访问web API,为更多相关搜索和本地化移动服务打开了大门。
借助iPhone,你能使用Yelp得到附近的聚会、饭店和住处。或者,在Google的本地搜索里,你仅仅说出请求,就可以得到本地结果。像Say Where的应用程序会查询多个搜索网站。
这不限于手机。社会化网络站点和桌面搜索程序也能利用新技术,比如Yahoo的FireEagle,用户能更新、存储位置数据或浏览像Google Gears或Firefox Geode的插件,用户能够设置成自动报导位置。
不管你用一个桌面浏览器,还是iPhone,用户现在要求位置感知能承受的高水平的相关性和便利性。
因特网标准化团体,web的管理团队,已经就开发一套处理确保用户关于隐私与协同数据转换标准的智囊团。W3C Geolocation 工作组希望在2009年底提交第一个建议。
原文地址:http://www.wired.com/software/webservices/news/2008/12/YE8_web?currentPage=all
-
2009年01月04日
Gmail开始推荐Chrome和FireFox,抛弃速度慢的IE - [翻译]
Google Inc 正向用户建议在使用Gmail的e-mail服务时,扔掉微软公司的IE,转而使用自己的Chrome浏览器和Mozilla公司的FireFox。
IE6的用户访问Gmail.com时,菜单条里会出现一个“Get faster Gmail”信息。该信息链向Google关于兜售的能使速度翻倍的Chrome和Firefox 3的网页。
上周,Gmail也对使用IE7的用户显示了该消息,之后Google撤掉了关于该版本的提醒。包括苹果公司的Safari和Opera Software ASA 的同名浏览器在内的其他浏览器的用户,还没有被看到加速的提醒信息。
Google目前列出了IE7,Firefox 2.0及其后续版本,Chrome和Safari作为支持Gmail的浏览器。其他浏览器,包括Opera和较早版本的IE,Firefox和Safari,仍然能访问e-mail服务,但不支持部分功能。
据Web metrics 公司 Net Applications Inc 报道,上个月,有超过21%的用户在使用IE6。同时,11月份,IE7占到市场的48%,Firefox 3 占16%,位列第三。
Google自从去掉了Chrome的beta标签之后,已经开始主动进军市场。比如一天之后,Google不再把Firefox作为Google 打包程序里的默认浏览器,以Chrome取而代之。
Google,Mozilla和WebKit------为苹果Safari提供引擎的开源项目------在下半年花了太多精力在宣扬JavaScript性能的提升,他们说,这是让Gmail及其他Web应用程序与传统桌面软件以相同速度运行的必要步骤。
原文地址:http://www.computerworld.com/action/article.do?command=printArticleBasic&taxonomyName=Internet+Applications&articleId=9124562&taxonomyId=168
-
2009年01月03日
Google的Cutts:提高网站流量的好方法 - [翻译]
你有一个网站,你并不清楚为什么它没有出现在Google的搜索排名的前面。你去Google.com寻求指导,却找不到你要的答案。
毫无疑问,在Google的搜索排名中取得好位置是一件神秘的事情。为了解开这个谜,USA TODAY和Google的一个工程师、活跃的博客Matt Cutts坐在一起,Cutts将分享如何“优化”网站的五种简单方法,以便Google和世界能够找到你的网站。
越来越多的业务正转向web来找到客户:据互动广告局统计,第一季度单单广告就投入了五百八十万美元,比去年增长了18.2%。来自ComScore Media Metrix的测量服务的数据显示,Google的因特网搜索份额继续上升---五月份达到61.8%。
1.在网页上高亮搜索词
“想想人们会输入什么才能找到你,”Cutts说。他谈到了,来自圣地亚哥的一名脊椎推拿治疗者抱怨他的网站不能被使用Google搜索的人找到。“San Diego chiropractor”这个词并没有出现在他的网站上。“你不得不确信关键词在网页里,”Cutts说。如果你是一名圣地亚哥医生,得梅因建筑师或波特兰广告代理,最好放在页面顶部,以便让人们很快知道。
2.填充“tags”
当生成网站时,因特网编码语言包括两种主要的tag:title和description。即使你不清楚用来生成网页的代码,像Adobe的Dreamweaver的软件程序有一些工具让你用清晰的英语来填写tag(而不是“<title>San Diego Chiropractor</title>”)。tags具有决定性作用,Cutts说,因为显示在搜索结果里最常见的就是title和description了。
如果Cutts的脊椎推拿治疗者适当地在网页里被标注出来了,一个搜索将返回形如“San Diego chiropractor. Local doctor serves San Diego community”之类的句子。
还有第三种tag,比如增加关键字或搜索词语,但Cutts说,Google不会把太多的权重放在它们上面。
3.让其他站点“链”向你
Google认为,决定一个站点的级别要看100多条数据。一旦搜索词被明确地在网站上标出来或正确使用了title、description标签,链接也就产生了。
简单地说:Google基于受欢迎程度给网站排名。如果权威站点链向你,你可能也是好的,因此你就会出现在结果的前边。如果你不能让USATODAY.com或纽约时报链向你,找朋友试试。要是他们也没有网站呢?他们可能有。继续往下看。
4.建立blog并经常更新
Cutts认为,写blog是增加链接、开始与客户和朋友沟通的有效方法。这几乎不花时间:Google的Blogger,WordPress和其他免费的写blog的工具。有了blog,你就可以链向你的网站,并给其他人提供链接。开始建立内容,也是必要的,Cutts说。
5.注册免费工具。
Google的google.com/webmaster提供了一些免费赠品,以帮助你的网站被找到。你可以上传一个基于文本的站点地图,用来向Google展示站点网页(通过www.xml-sitemaps.com生成)。之后,你注册一个Google账号,就会获取关键的统计数据------包括谁链向你的网站以及Google多长时间“爬”一次你的网站。
Google的本地业务中心(google.com/local/add)专门让业务所有者提交网站以便出现在附有地图的本地搜索结果里。使用Google搜索的消费者知道前10条非广告的结果经常来自Google地图,因此,如果你有业务但尚未提交的话,你可能会丢失潜在客户。
不要做过头
Cutts说,当把关键词扔进主页之后,一些热忱的发布商会再三使用这些词语。这被称之为“关键词堆砌”。也是Google明确禁止的,你的网站将被从索引中移除。
“在你已经说该词两三遍的时候,Google就明白了------‘好,这个网页和该词相关。’”他说,“仅仅想两三个你想搜索的词,然后把他们自然地放在网页里。”
对于博客新手,Cutts知道写作(例如,写新题材)并不轻松。他建议,通过浏览社会新闻比如Digg和StumbleUpon找到一些想法,看看人们对于某些话题的观点。
除此之外,新题材会归入常识的分类:这可是关于你的业务。“如果我是爱荷华州的一面管子工,我或许想写工作中的奇闻趣事,或者修理厕所的五种常用方法”,Cutts说。“这种内容会非常受欢迎,很容易得到链接。”人们会转载在社会媒体上。链接就会提升Google评级。
最后,有一个关于让Google可见的误解,这里澄清一下:为了出现在搜索排序的前面,不必做广告。
“这是两码事”。
原文地址:http://www.usatoday.com/tech/products/services/2008-06-22-google-search-engine-optimization_N.htm
-
2009年01月02日
09年最热门的9项技能(节译) - [翻译]
不管怎样,美国经济正处于大萧条以来最糟糕的状况。消费支出降低,信贷市场低迷,大约一千万美国人面临失业。
然而,抛开严峻的金融困境,对某些IT技能的需求,比如SAP,.NET,技术支持,仍然强劲。当有的员工开始寻找一些别的机会的时候,某些CIO们正在内部建立机制以冻结招聘的情形已经普及起来。
下面是热门技能清单,由计算机世界年终预测调查提供。
1.编程/应用程序开发
问问任何招聘人员,目前最吃香的IT技能是什么,你会得到一致的三个字母:SAP。
“我们圈里有个笑话,如果你的简历上有‘SAP’,你就有零失业率,”Brece,iSysmmetry Inc的CEO说,它是一家位于华盛顿Alpharetta, Ga的IT咨询招聘公司。
SAP专家,特别是一定领域里的某个模块里的有经验的人,要比其他种类的高级专家要求的每小时报酬多出35到40美元,Culbert说。对SAP技能需求旺盛是由于越来越多公司正朝着建立一整套ERP系统的目标迈进,Jill说,猎头公司JDResources Inc总裁。
接下来就是对有.NET经验的IT专家啦,Herrin和其他观察家说。一些几年前靠离岸外包交付.NET和C#项目的公司觉得模式是“非生产力的”,Herrin说。现在,他们倾向于内部解决。
Rich,位于Ankeny,lowa的Casey‘s General Stores Inc的IT高级主管说,过去5年一直通过招募和培训本地大学生来满足当地零售商对.NET和SQL Server程序员的需求。该公司,在中西部拥有超过1500家商店,正在从基于Cobol语言的财务应用程序转向.NET环境,以降低维护成本。“找到会Cobol的人也是非常困难的”。
2.技术支持
服务台和技术支持需求仍然强劲,特别是那些既具有技术专长、又能够稳固客户服务关系的人,Herrin说。“很多客户告诉我,他们的客户服务工作中断了,他们需要有良好沟通能力的人。”
“我们在该领域看重的需求的其中之一的东西称之为JOAT--- a-jack-of-all-trades ---能够做修复工作和一点桌面支持的人,”Lee说,IT招聘公司Robert Half Technology的执行主管。当公司想让较少的人做更多工作的时候,对具有几样本领的技术专家的需求正变得急切起来。
以下略
-
原文地址:http://www.guardian.co.uk/technology/2008/dec/18/internet-websites/print
-------------------------------------------------------------------------------------------
自从我们在2006年12月发布了100个有用站点之后,网络世界已经发生了翻天覆地的变化。与此同时,围绕Google的Chrome和苹果的Safari,上演了一场浏览器大战,令人惊奇地打破了windows的垄断,提供了浏览器的新版本。
这里列出的很多站点没有出现在上次的清单中;虽然长寿是一种骄傲的标志,但对于90年代成立的公司而言,快速变革去利用新技术仍然非常困难。当然,快速变化也会带来问题:随着经济波动的持续,这里的一些站点将不会在一年内有大的突破,或者现在的免费服务将来会收费。这不会抹去他们的可用性;这仅仅强调了他们生存下去的决心。
2006年以来最大的变化在于使不同地方的人们同时参与项目的合作在线服务领域。2006年的协作大多集中在口头,但是现在你能分享报告,或看看其他人的工作 --- 甚至下载它们。你无需昂贵的系统就可以转换文件。协调工作从来没有这么容易过,甚至跨平台。web将变成真正意义上的操作系统,和netbooks的兴起一样(aka ultraportables, aka Liliputer)。
基于位置服务的增长---特别是你能选择登入、登出的服务保护了你的隐私---非常快。平行发展的有移动web;无法回避的事实是苹果的iPhone已经进行的革命,它的百万用户到底如何在思考互联网。对他们而言,它不再是相对计算机太贵、而相对手机又太坏的东西;Safari的移动版支持在移动中浏览、甚至更多更好的体验,这是从前所没有的。
新的远景已经打开:对位置敏感的任务管理器能够根据手机里的GPS装置调整便笺清单顺序,因此当你进了超市,它将提醒你需要的麦片,而在办公室,它会告诉你马上送出重要的备忘录。
当然,视频已经随处可见啦。YouTube已经在2006年成为老大,现在BBC的iPlayer即将接管。该技术一旦普及,或许英国将变成一个视频制作、视频观看的国度。
以下略。
-
原文地址:摘自google adsense发的一封email。
---------------------------------------------
你采用西联作为支付方式了吗?如果用了,我们做了一些想让你了解的小变更。
延长了过期时间
现在,我们把领取西联汇款的期限从35天延长到了60天。如果你在60天内未能领取,款项将被返还到你的账户,拒付记录也包含进去了。之后你会看到一条通知,告知你如何处理该情况的更多细节。
分开支付
如你所知,西联根据不同的地点有特定的支持限额。过去,如果你的款项总额超过了所在国西联规定的限额,我们会通过安全快递发送款项。不幸的是,这会产生快递费用,因此我们很高兴让你知道,以后不会出现这种情况了。
如果你的款项超过了最大支付额度,我们将拆分总额,仍然通过西联发送。比如,如果你国家的支付限额是3000美元,你的当月款项达到5000美元,那么我们将发送两次:一次是达到限额的3000美元,另一次是剩余的2000美元。如果遇到了多个西联支付,你会在支付历史页面看到多个“支付清单”,每一笔都有相关的MTCN。根据本地西联代理,你可能需要在未来的几天提取多个款项。我们建议你就进一步的细节咨询当地的西联代理。
西联汇款可以在少数国家获得,但是我们一直致力于扩大国家范围,并使你随时了解任何变更情况。
-
2008年10月19日
把名字改成网址来抗议动物解剖 - [翻译]
ASHEVILLE,来自北卡罗来纳州 --- 可以叫她 CutoutDissection.com,简称Cutout,但不要叫 Jennifer。以前的Jennifer Thornburg ---现在,她的驾照上写着 Dissection.com,Cutout ---为了抗议学校的动物解剖而做出的举动。这个19岁姑娘的新名字也是一个为对待动物道德规范的人们建立的网站上的一个反对解剖的网页的网址,她曾经是该组织成员。“当我给某些新认识的人做自我介绍时,我通常把我的名字重复几次,”she told The Asheville Citizen-Times(翻译不出来)。“一旦他们知道我名字的含义,他们就想更多地了解网站。”在Virginia工作的Asheville高中毕业时说,一个课题作业要求切下鸡翅膀,这让她觉得不舒服,此后她开始反对解剖。她在高中帮助建立了一项政策,允许反对解剖的学生完成一个替代的作业。不管她改名是否合法,她说她的大多数家庭成员仍然叫她Jennifer。“这需要花点时间,”生活在佛罗里达州的父亲Duane说。“她对于我来说仍然是Jennifer。我理解她为什么那样做。无论怎样,我完全尊重这个决定。”播放动物解剖之前如何被对待的一张CD促使他开始理解女儿的理由。原文地址:http://www.cbc.ca/cp/Oddities/081013/K101306AU.html -
2008年10月01日
Edge Rails的新功能:类似Has Finder功能的named_scope - [翻译]
Nick Kallen颇受欢迎的has_finder插件以named_scope的方式集成到了Rails 2.x版本,例子:
class User < ActiveRecord::Base
named_scope :active, :conditions => {:active => true}
named_scope :inactive, :conditions => {:active => false}
named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } }
end
# Standard usage
User.active # same as User.find(:all, :conditions => {:active => true})
User.inactive # same as User.find(:all, :conditions => {:active => false})
User.recent # same as User.find(:all, :conditions => ['created_at > ?', 1.week.ago])
# They're nest-able too!
User.active.recent
# same as:
# User.with_scope(:conditions => {:active => true}) do
# User.find(:all, :conditions => ['created_at > ?', 1.week.ago])
# end
has_finder中的好处同样可以在named_scope中找到 --- 你还能得到一些额外的好处。 User.all 默认作为 User.find(:all)的别名,可以之间使用。
高级
对某些需求,不要忘了has_finder的某些功能:
传递参数
给你命名的scope传递参数,便于在运行时指定条件。
class User < ActiveRecord::Base
named_scope :registered, lambda { |time_ago| { :conditions => ['created_at > ?', time_ago] }
end
User.registered 7.days.ago # same as User.find(:all, :conditions => ['created_at > ?', 7.days.ago])
Named Scope Extensions
扩展命名的scope(和association_extensions有点类似)。
class User < ActiveRecord::Base
named_scope :inactive, :conditions => {:active => false} do
def activate
each { |i| i.update_attribute(:active, true) }
end
end
end
# Re-activate all inactive users
User.inactive.activate
匿名 scope
你还可以使用默认提供的scoped来构造。(词句不好翻译)
# Store named scopes
active = User.scoped(:conditions => {:active => true})
recent = User.scoped(:conditions => ['created_at > ?', 7.days.ago])
# Which can be combined
recent_active = recent.active
# And operated upon
recent_active.each { |u| ... }
(译者注:这和javascript中的匿名函数相似:var foo = function(x) { alert(x); };)
named_scope是很好的功能。如果你还没有开始用它,现在就开始。你将来会离不开它。还是要感谢一下Nick。
原文地址:http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality
-
2008年10月01日
Ruby on Rails 代码质量检查清单 - [翻译]
据我经验,Ruby和Ruby on Rails一直是最难真正掌握的语言/框架组合之一。对于C、C++和Java程序员而言,Ruby有着非常不同(很不好)的OO设计方法,Rails有太多需要理解和记忆的主张。依我的水平,我已经花了不少时间 ------ 我坚信还有很长的路要走 -------我爱它,并坚持到底。我对Ruby on Rails人数保持增长私下表示过怀疑,仍然有很多开发者沉湎于Java形式的OO思想,这也是很多人正在学的;这是非常好。同时,它也是坏事,因为垃圾代码源于其他的垃圾代码,在发布或被其他人查看的时候。ThriveSmart雇佣了更多的开发者------他们不都是Ruby或Ruby on Rails专家------有必要确保代码和设计模式在跨项目中保持一个较高的质量水准。My good friend Dan和我整理了这个清单,便于小组应用到他们的每个项目里。这是一个不断更新的清单,下面只是临时的片段。以下略解释清单上的每一条对于经验丰富的Ruby on Rails开发者比较熟悉、不值一提了 ------但是对新手而言,还需一些解释。往下看:(1)每个controller action 仅仅调用一个model方法而不是初始化的find或new。必要时,自定义一些 .net 或 .update的方法.胖模型、瘦控制器是Rails编码最提倡的方法论------但是它太开放,以至于很难按照我的方式说明。通常,你把所有的逻辑堆在了model里,因此你的controler看起来和script/generate产生的controller一模一样------除了自定义方法,你只是把通常的.new 和 .update_attributes方法按相同方式处理。举一个简单的例子,有一个额外的逻辑,属性被一个特定的user更新:@foo.update_attributes_by_user(params[:foo], current_user)。额外逻辑应该放在controller、而非model中仅仅当它要渲染不同的action或做出不同的跳转。(2)仅仅一个或两个实例变量在controller或view之间共享。实例变量hell很容易出现在Rails里------当controller和view共享很多实例变量时。它潜在地会损害性能,由于你会重复调用一些未知的关联。相反,你的controller应该仅仅控制一个实例变量------或许还有一个current_user。这样,所有的关联均可以“按需”调用,并在一个地方成为实例变量缓存。该方法同样适用于片段缓存,因为在实际载入关联之前,你可以检查一下view中的缓存。例如,你的Blog controller不必建立实例变量@post和@related_posts,仅仅建立一个方法,@post会给出Post模型中的related_posts 方法,因此你只需在view层调用@post.related_posts。(3)所有的model和变量名要简明(对新手)、尽可能短、但不要使用英文缩写。命名比较难。特别对于那些专心一个应用程序的开发人员------当你头脑中载入整个应用程序上下文时,它或许明显,但对于后来的你或别人就不太明显啦。Ruby和Ruby on Rails其中伟大之处在于命名简明扼要、可读性强,哪怕对新人。不要破坏它的强大力量!如果你不能马上想到一个灵巧的、清晰的、短名字,先编码你的方法,然后试着丢掉刚才的代码环境。在一天结束的时候,放一个TODO进去、重新命名变量或方法名称。(以下待翻译)原文地址: http://www.matthewpaulmoore.com/articles/1276-ruby-on-rails-code-quality-checklist -
2008年09月15日
Email 在分散注意力 - [翻译]
追溯到90年代初,email仅仅是能够证明需要它的那些人的特权。现在它变成了一个花费公司大量成本的讨厌东西。我们或许认为,它在我们掌控之中,但是我们不仅仅查看频率过高,而且打断工作比我们想象的还要严重。
去年Loughborough 大学的Thomas Jackson博士在调查中发现,在被email打断后、重新继续先前工作要平均花费64秒。(下面这句话,不好理解,不翻译啦)。
一直以来,人们认为email不会太影响工作,因为接收者选择何时查收、回复email。但是Jackson博士发现,人们趋向于立刻回复email,对一个新的邮件提醒平均要花去1分44秒;70%的提醒在6分钟内得到响应。这比让电话响3次还要快。
下面是人们花在邮箱上的时间。由ClearContext提供的2006年7月的研究表明,一家email管理工具提供商,调查了250名用户,结果发现56%用户每天在邮箱上花掉两个多小时。大部分人感觉邮件太多啦 --- 截止2008年1月,38%受访者每天收到邮件超过100封 ---它影响了人们做其他事情。
苏格兰Glasgow大学的演讲者Karen Renaud和他的苏格兰西部的大学里的同事发现,email用户分为三类:放松、受驱使、压力。“放松用户不会让email干扰他们的生活,”Renaud博士说。“他们按照正确的方式处理email,就像某人那样:‘我用个人时间查收、处理邮件,但是我不打算让它打扰我’”。
感到“受驱使”的第二组把email放在较高的位置,但他们野人王能够对付email。然而第三组面对email的压力做出了消极反应。“它产生了压力,”Renaud博士说,“压力还带来了各种各样的健康问题。”
Renaud博士的小组发现,64%受访者对每小时查收一次email不太满意,35%用户说每15分钟查收一次,实际上,还要比这频繁 --- 大约每5分钟一次。对于某些人来说,查收email不再是自觉和从容的举动,而是他们很少注意到的冲动行为。
英国Sheffield大学的Tom Stafford,也是《Mind Hacks》一书的合著者,认为导致赌博成瘾的相同的基本学习机制同样对email用户有效。“老虎机和email遵循一种‘可变定时强迫日程’的规律,它已被确立为训练超强习惯的方式。”他说。
“这意味着并不是每次都能得到一个报酬,有时候会有报酬,不过方式不可预期。对email而言,通常查收的时候,我会看看有没有好玩的邮件,但不是每一次都有 ---一个邀请、或一些琐事---这样,我得到了报酬。”这已经很难让我们去抵制查收邮件的诱惑了,甚至我们才刚刚看过。显而易见的解决方法是批量处理email,这有点困难。公司要求每5分钟接收一次,但是很多人抱怨,他们不得不更加频繁地查收。他们知道会有一些邮件,这更加让人不耐烦。
另一个解决方法或许是Growl 系统提示(growl.info),当用户在处理其他问题时,它会在屏幕上给出一个明确的消息,比如发送人和主题。目前仅仅支持Mac OS X,一个版本正在Windows上测试,当然,在你尽量避免时,它还是打断思路。公司已经开始认真考虑这些问题了,虽然由Deloitte 和 Intel发起的“无邮件日”尚未证明有效。“无邮件日”一个月后被抛弃,Intel发现,在那些与同事异步沟通的需求和一整天不用email之间存在“明显的不协调”。Stafford博士说,没有email的日子根本行不通,“他们不能帮人们改变习惯。如果你不丢掉坏习惯,在你收到email时,你就按照相同方式去处理。”
最好用更合适的工具取代email。Roo Reynolds,一个“虚拟世界的布道者”,供职于BBC的社会媒体,已经从email为王转向了其他正式的交流方式。“我使用其他工具。。。我有一整套喜欢Twitter人的联系方式,如果我想很快找到他们,他们就会出现在那里。”
Reynodls先生已经开始认为email不礼貌、具有扩散性,倾向于使用Twitter、Flickr这样的工具。他也使用社会化网络站点,比如Dopplr,它追踪人们的旅行,在联系他们之前能够发现他们是否走了,通过即时通讯软件发出情况提醒,否则Twitter帮助他决定现在是否适合打断他。其他工具,像blog、wiki,已经减少了发送、接收email的数量,而RSS feed和朋友、同事的推荐让他随时关注最重要的新闻。
在业务最依赖的工具上,我们很少考虑email。Karol博士,经济心理学家,建议给人们提供大纲或训练,“减少email引起破坏的方法、管理email以不让它主宰你的一天的方法。组织规范一旦建立,人们将开始期待其他人在一个给定的时间框架内回信,而不用担心eamil重要与否。”
我们或许认为email很简单,但是轻松使用却不太容易。对大多数人而言,它比较方便,但是对越来越多的人,它正以小制大。
控制收件箱
如果你发现鼠标经常移向“查收邮件”按钮,试试下面的办法:
- 关掉提醒。任何弹出窗口、flash、或“ding!”一声都会打扰你,促使你做出查收邮件的反应。
- 把邮件客户端设置为只显示标题和前几行,这样就很容易决定是否重要到立刻去处理。
- 使用其他工具。Twitter和即时通讯(IM)方便问些简短的问题。wiki更利于文档的协作。blog长于发布信息和非正式谈话。
- 发送尽可能少的email。你需要点击“全部回复”吗?
- 定期查收email。每天留出时间处理收件箱,在其他时间就忽视email。大部分人一大早和傍晚去查收。
原文地址:http://www.smh.com.au/cgi-bin/common/popupPrintArticle.pl?path=/articles/2008/09/08/1220857455459.html -
2008年09月13日
追逐AdSense for search的最佳布局 - [翻译]
Adsense 发布商 Next Small Things 很早就认为,搜索是用户在网站上找东西的入口点。事实上,这个CoolChaser.com的想法--- 一个MySpace layout生成、自定义的站点(目前Next Small Thing最大的业务)--- 产生于如下观察:很多web冲浪者用公司的搜索引擎找到更换他们的MySpace背景的操作说明。该想法和后续的商业点子已经实现了,仅一年时间,CoolChaser.com就拥有了一批忠实的用户群:现在每天有超过200,000用户在网站上查找或生成layout。“CoolChaser因其易用性、表达观点的多选择和功能,已经成为有关layout的一站式商店,”创始人 Chao Lam说道。由于用户提交的layout数量达两千万之多(平均每小时3,000个),这使得用户越来越难找到他们想要的东西。“我们从用户那儿收到了大量请求,希望我们提供某些类型的搜索机制,以便于他们能够轻松查找,”开发人员 Sachiko Kwan 说。作为一个Adsense 发布商,Kwan决定试试 Adsense for search,很快他为快速的安装步骤和精准的结果所吸引。根据新的站点搜索功能,Kwan能够限制搜索,方便用户不用离开站点就可以查找。另外,新的水印功能让Kwan无需重新设置就可以在导航栏增加搜索框。最近,Lam 和 Kwan开始优化他们的搜索,以取得更好的性能和用户体验。如果用户不生成layout,他们就会找一个。因此,Kwan把搜索框从每页的右上角挪到了头部中间的位置,还在每页底部增加了另外一个搜索框,这样,已经点了搜索的用户可以再次搜索。在搜索结果页,她把广告边框换成浅色,从而更好地与站点网页融合在一起。调整后的一周时间里,Lam和Kwan发现CoolChaser上的日搜索请求增加了40%,收入是以前的两倍多。自从在CoolChaser上加入了Adsense搜索,搜索已经成为继生成layout之后的第二大最受欢迎的功能。Lam 和 Kwan在继续关注用户体验,他们现在通过使用关键字和标签(labels)优化搜索结果。“人们搜索的范围非常宽泛,”Lam说。“Adsense搜索的确在为我们工作。”原文地址: 这是inside-adsense@googlegroups.com的一封信,地址无法提供啦。 -
2008年09月03日
UploadColumn - [翻译]
张伟点评:这是UploadColumn 插件自带的README,我看了N遍,总是发现上次会遗漏某些东东。老外讲个东西,向来不是按照一二三四、常常泛泛而谈,看他们写的书,更是这样!中国人习惯了例子。----------------------------------------------------= UploadColumnUploadColumn 是专为Ruby on Rails 框架打造的插件,支持上传文件、特别是图片。假如你有一个用户列表,想给每个人关联一个图片。你应该把图片上传到数据库,或者借助 UploadColumn 在文件系统中实现简单存储。如果一个名为 User 的 model 有一列'picture',类型为String,你只需在该 model 增加:class User < ActiveRecord::Baseupload_column :pictureend好了!你可以试着上传文件啦。当然, UploadColumn 有很多不同选项,供你自定义上传方式。没有用户接口的文件上传可不好玩,做出如下设置:在表单里增加一个 upload_column_field ,比如:<p><label for="user_picture">Picture</label><br/><%= upload_column_field 'user', 'picture' %></p>你应该用 upload_column_field 代替Rails的 file_field,以便在诸如验证失败导致表单重新呈现时,它仍然管用。不幸的是,file_field 不支持上述情形。现在还有一点问题,由于它发送的是文件而非字符串。大可不必担心,如果我们设置表单的 encoding 为 multipart ,它就OK了。UploadColumn 甚至提供了一些好的 helper 来回避丑陋的 multipart 语法。形如:<%= upload_form_tag( :action => 'create' ) %>好了!你的上传已经做好了(但愿如此),你现在应该能够给用户增加图片了。疯狂的地方当然还在后面!==存储路径你并不想总是把图片存储在 upload_column 默认的路径,这不是问题,改变目录简直不值得一提。你给 upload_column 传一个 :store_dir 键,就会覆写默认机制,而启用该目录。upload_column :picture, :store_dir => "pictures"这完全符合当前情景。注意,所有文件将被存放于相同的目录。如果需要对路径进行修改(或许按照关联id存储),请用 proc 。proc看起来如下所示:upload_column :picture, :store_dir => proc{|record, file| "images/#{record.category.name}/#{record.id}/#{file.extension}"}proc 被传给两个参数,第一个是模型类的当前实例,第二个是属性名称(这里,attr指 :picture)。同样,你也可以修改 :tmp_dir 。== 文件名UploadColumn 默认将保留文件原始名称,有时显得不太方便。你可以给 upload_column 声明传递一个 :filename 指令:upload_column :picture, :filename => "donkey.png"这样所有文件将被命名为 donkey.png。如果文件是jpeg格式的就不是我们所期望的了。通常传一个Proc 给 :filename 比较明智。upload_column :picture, :filename => proc{|record, file| "avatar#{record.id}.#{file.extension}"}该 Proc 被传两个参数,当前实例和文件本身。== ManipulatorsUploadColumn 允许你通过 manipulators 操作文件,按某种格式转换文件,或实现任何种类的操作。目前绑定了两个 manipulators, RMagick manipulator 和 ImageScience manipulator,不过,自己写也很容易。网站上有进一步的说明。== 用 RMagick 操作图片比如你想(无论什么原因)让用户图片有一个时髦的曝光效果。upload_column 操作图片既可以在运行时、也可以在图片保存之后进行,有如下可能:class User < ActiveRecord::Baseupload_column :picture, :manipulator => UploadColumn::Manipulators::RMagickdef picture_after_assignpicture.process! do |img|img.solarizeendendend你也能使用 :process 指令,当一个新图片被上传后,它会自动执行操作。如果你想把图片缩放到最大值为 800 * 600 的规格,可以这样做:class User < ActiveRecord::Baseupload_column :picture, :process => '800x600', :manipulator => UploadColumn::Manipulators::RMagickend先前曝光的例子可以简写为:class User < ActiveRecord::Baseupload_column :picture, :process => proc{|img| img.solarize }, :manipulator => UploadColumn::Manipulators::RMagickend或者我们想要图片的不同版本,就这样指定:class User < ActiveRecord::Baseupload_column :picture, :versions => [ :solarized, :sepiatoned ], :manipulator => UploadColumn::Manipulators::RMagickdef picture_after_assignpicture.solarized.process! do |img|img.solarizeendpicture.sepiatoned.process! do |img|img.sepiatoneendendend也可以为版本指定hash ,并传一个 dimension 或 proc:class User < ActiveRecord::Baseupload_column :picture, :versions => { :thumb => "c100x100", :large => "200x300", :sepiatoned => proc{ |img| img.sepiatone } }, :manipulator => UploadColumn::Manipulators::RMagickend注意,thumb 的尺寸前的‘c’,它将把图片裁剪到精确尺寸。虽然有点啰嗦,它并不会检查文件到底是不是图片。曝光最新的 GreenDay 歌曲多少有些不太好听。鉴于此,UploadColumn 提供了 image_column 函数:class User < ActiveRecord::Baseimage_column :picture, :versions => { :thumb => "c100x100", :large => "200x300", :sepiatoned => proc{ |img| img.sepiatone } }end这也把图片放在了 public/images 而不是 public,多么整洁!== 运行时渲染你能在运行时操作图片(它非常耗性能)。在你的 controller 增加一个 action ,使用 UploadColumnRenderHelper.render_image.def sepiatone@user = User.find(parms[:id])render_image @user.picture do |img|img.sepiatoneendend就好了!在 view 层,UploadColumnHelper.image 很容易为你的 action 产生一个 image 标签:<%= image :action => "sepiatone", :id => 5 %>== Views如果上传文件是图片,那么你很可能想在 view 层显示出来,如果它是另一种文件,你将会做个超链接。借助 UploadColumn::BaseUploadedFile.url 会非常容易实现。<%= link_to "Guitar Tablature", @song.tab.url %><%= image_tag @user.picture.url %>== 魔术列UploadColumn 允许你为 model 增加 'magic' 列,它将被合适数据自动填充。仅仅通过 migration 增加该列,例如:add_column :users, :picture_content_type如果我们的 model 为:class User < ActiveRecord::Baseupload_column :pictureend列 picture_content_type 将自动填充为文件的 content-type(至少是 UploadColumn 做的最好猜测)。你能够使用 UploadColumn::UploadedFile 的任何方法,比如 size,url,store_dir 等等。也可使用 picture_exif_date_time 或 picture_exif_model 等。当然,它仅仅适用于一个 JPEG 图片------唯一拥有 exif 数据的文件类型。这需要 EXIFR 类库,通过 gem 来安装:gem install exifr。== 验证UploadColumn 有它自己的验证方法,validates_integrity_of 。该方法将确保仅符合白名单上扩展名的文件才会被上传。这会阻止黑客上传可执行文件(像 .rb,.pl 或 .cgi 等)或限制某种文件允许被上传,例如仅限于图片。你能够用 :extensions 参数自定义白名单。如果你仅仅允许 XHTML 和 XML 文件,你可以借助 XSLT 来控制:upload_column :xml, :extensions => %w(xml html htm), :manipulator => MyXSLTProcessorvalidates_integrity_of :xml还可以在 UploadColumn 中使用一些 Rails 验证器。validates_presence_of 和 validates_size_of 被证实管用。validates_size_of :image, :maximum => 200000, :message => "is too big, must be smaller than 200kB!"切记修改错误信息,UploadColumn 默认的看起来有点傻。validates_uniqueness_of 不管用,这是由于 validates_uniqueness_of 发送(你的上传列)而不是请求实例变量,这样它会得到一个 UploadFile 对象,该对象不是真的和数据库中的其他值比较,不扰乱 Rails 内部机制而正常使用的确有点困难(如果你搞定了,请告诉我呀)。同时,你可以validates_each :your_upload_column do |record, attr, value|record.errors.add attr, 'already exists!' if YourModel.find( :first, :conditions => ["#{attr.to_s} = ?", value ] )end我知道,这不太优雅,但应该能用。 -
google浏览器很好用,感觉非常清新。
凡是别的浏览器上、好的功能,它都有了。
做有用的东西,才是真理!
去g.cn下载,首页有提示! -
2008年08月30日
Generic form_for - [翻译]
围绕model调用form_for来生成一个form builder的通用方法:
<% form_for :person, :url => { :action => "update" } do |f| %>
<%= f.error_messages %>
First name: <%= f.text_field :first_name %><br />
Last name : <%= f.text_field :last_name %><br />
Biography : <%= f.text_area :biography %><br />
Admin? : <%= f.check_box :admin %><br />
<% end %>上面的第一个参数是表单相关的对象名称的符号或字符串,也可以是存储对象的实例变量的名称。
form builder 常常用作和model关联的form帮助器。这样,
<%= f.text_field :first_name %>
可以扩展为
<%= text_field :person, :first_name %>如果实例变量不是@person,你还可以把实际记录作为第二个参数:
<% form_for :person, person, :url => { :action => "update" } do |f| %>
...
<% end %>
这时,你可以认为
<%= f.text_field :first_name %>
扩展成了
<%= text_field :person, :first_name, :object => person %>你甚至能用以下方法显示包装进去的model的错误信息:
<%= f.error_messages %>form_for最右边的参数是一个可选的hash,不管其他变量如何:
:url: - 表单要提交的URL。与url_for 或 link_to 用途相当。或许你要直接给它传一个具名路由。默认值为当前的action。
:html - form 标签的html属性,可选。要注意的是,form_for标签在ERB赋值块中调用,而不是ERB输出块。即<% %>,而不是<%= %>。
form_for不会生成一个独占的范围。卓越的FormHelper方法与FromTagHelper方法可以同时使用。例如:
<% form_for :person, @person, :url => { :action => "update" } do |f| %>
First name: <%= f.text_field :first_name %>
Last name : <%= f.text_field :last_name %>
Biography : <%= text_area :person, :biography %>
Admin? : <%= check_box_tag "person[admin]", @person.company.admin? %>
<% end %>
这比较适合那些以对象为基础的FormOptionHelper和DateHelper的方法,像FormOptionHelper#collection 和 DateHelper#datetime_select。
---------------------
张伟 注:原文是api.rubyonrails.org上的API 文档,位于api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#M001737
-
2008年08月10日
未来程序员开始的地方 - [翻译]
我猜这要追溯到2002年。我当时考虑教授编程,Ruby语言非常适合于学习如何编程。我是说,我们一直对Ruby感到兴奋,由于它强大、优雅,并且非常有趣,但是对我而言,它是我最初投进编程行业的最好方式。
不幸的是,那时还没有太多的为新手准备的Ruby文档。我们社区里的一些人常常讨论必需的教程,比如“Ruby for the Nuby”,一般地,到底如何去教编程。我考虑得越多,我不得不说的话就越多(这让我有点儿吃惊)。最后,有人说,“Chris,你为什么不去写一个教程,这样就不用讨论了?”因此,我就做了。
它不太好。我有很多理论上非常不错的想法,但是写一个面向非编程人员的教程所带来的任务比我意识到的更有挑战性。(我是说,它对我有益,只不过我已经知道如何编程了。)
给予我帮助的地方在于我使人能够方便地联系到我,我总是尽量去帮助遇到问题的人。当我看到许多人在同一个地方绊住时,我就重新写这一块儿。我需要做大量的工作,渐渐地,情况越来越好。
几年之后,情况非常好了。:-)的确如此,事实上,我准备宣告完工了,然后再转移到其他方面。刚好,一个机会来了,教程得以装订成书。既然它写的基础比较多,我认为问题应该不大。我仅仅修正了一些错误,增加了更多的练习,例子、章节,还有50多个评论家的评论...
这又花了我一年时间,现在我认为它真的很好了,主要由于成百上千的勇士在帮我。
该站点的东东就是原始教程,自从2004年以来,很少改动。希望你能看看。









