必威体育下载基督教Heilmann

您当前正在浏览的是必威体育下载基督教Heilmann五月的博客必威体育简介档案,2008.

可以存档,2008

@media2008报告直播在YDN

星期五,5月30日,2008

现在是@media2008的第一天之后的凌晨1点14分,我刚刚完成了我的报告YDN博客:

第二天早上见,我要去睡觉了。

以内联和编程方式提供脚本配置

星期五,5月23日,2008

在编写代码时,我一直坚持的一件事是将所有应该自定义的东西分离到自己的配置对象中。

我现在写的一个正常的脚本应该是这样的:

var模块= 函数(){
  / /配置,改变的东西
  var配置= {CSS:{:{徘徊:“徘徊”,活跃的:“当前”,jsEnabled:js的
     },id:{容器:“maincontainer”
     } 
    },超时:2000,用户标识:“chrisheilmann”
  };//启动主代码
  函数初始化(){};
  / /……更多的方法和其他代码…//让init成为一个公共方法
  返回 {初始化:初始化};
}();模块。初始化();

好处应该是显而易见的:

  • 实现者不需要遍历整个脚本来找到他们需要更改的内容
  • “更改这里需要更改的内容”和“只有当您知道自己在做什么时才会触及它”之间存在明显的分离—允许更多的开发人员使用您的代码。
  • 您在一个位置上展示了实现人员,在这个位置上您与其他开发层重叠,例如,通过定义的idHTML您使用的元素和CSS应用于生成的元素的类名。
  • 将所有字符串放在一个地方可以简化本地化,并加快脚本的速度(IE6为每个字符串创建一个string对象——甚至在循环内部的条件下也是如此!)

在那之前,我对此还挺满意的Ara Pehlivanian要求提供以编程方式覆盖配置文件的选项,就像YUI允许你用雅虎.util.Config实用程序。他当然是对的,有时您需要更改配置并重新初始化脚本(当然,另一种方法是编写带有实例化的模块)。

最简单的方法是将配置对象公开:

var模块= 函数(){
  / /配置,改变的东西
  var配置= {CSS:{:{徘徊:“徘徊”,活跃的:“当前”,jsEnabled:js的
     },id:{容器:“maincontainer”
     } 
    },超时:2000,用户标识:“chrisheilmann”
  };//启动主代码
  函数初始化(){};
  / /……更多的方法和其他代码…//让init和config成为一个公共方法
  返回 {初始化:初始化,配置:配置};
}();

这样您就可以在调用init()之前覆盖所需的属性:

模块。配置.CSS.id.容器 = “头”;模块。配置.用户标识 = “alanwhite”;模块。初始化();

然而,Ara认为更方便的方法是提供一个对象作为init()的参数,覆盖某些属性。你可以通过检查这个对象,遍历它的属性并递归地尝试查找和匹配config对象的属性:

var模块= 函数(){
  / /配置,改变的东西
  var配置= {CSS:{:{徘徊:“徘徊”,活跃的:“当前”,jsEnabled:js的
     },id:{容器:“maincontainer”
     } 
    },超时:2000,用户标识:“chrisheilmann”
  };//启动主代码
  函数初始化(){
    //检查第一个参数是否为对象
    var一个=参数;
    如果(isObj(一个( 0 ])){
      varcfg=一个( 0 ];//循环参数并修改配置
      (varcfg){setConfig(配置,,cfg(]);
      }
    }
  };函数setConfig(o,p,v){
    //循环遍历对象的所有属性
    (varo){
      //当这个值是一个对象时,递归调用这个函数
      如果(isObj(o(])){setConfig(o(],p,v);//否则比较属性并相应地设置它们的值
      } 其他的 {
        如果(= = =p){o(p] =v;};
      }
    }
  };//测试参数是否是对象(而不是数组)
  函数isObj(o){
    返回 (typeofo= = = “对象” & & typeofo。拼接 = = ! “函数”);
  }
  / /……更多的方法和其他代码…
  //让init成为一个公共方法
  返回 {初始化:初始化};
}();模块。初始化({容器:“头”,
  “超时”:1000
});

当所有的配置属性都是唯一的时,这就可以顺畅地工作。但是,当嵌套对象中的属性与更高级别上的其他属性具有相同的名称时,它将失败。为了做到这一点,我们可以提供一个选项,将属性的路径作为属性名发送一个字符串。当我们需要eval()那个字符串并确保返回正确格式的值时,就会变得很混乱。总之,它可以是这样的:

var模块= 函数(){
  / /配置,改变的东西
  var配置= {CSS:{:{徘徊:“徘徊”,活跃的:“当前”,jsEnabled:js的
     },id:{容器:“maincontainer”
     } 
    },超时:2000,用户标识:“chrisheilmann”
  };//启动主代码
  函数初始化(){
    如果(isObj(参数( 0 ])){
      varcfg=参数( 0 ];
      (varcfg){
        如果(我。indexOf(“。”)= = ! - - - - - -1){
          varstr= ["的 +我。取代(/ \ / g,”][”) + “””;
          var瓦尔=getValue(cfg(]);eval(“配置” +str+ “=” +瓦尔);
        } 其他的 {setConfig(配置,,cfg(]);
        }
      }
    }
  };
  函数setConfig(o,p,v){
    (varo){
      如果(isObj(o(])){setConfig(o(],p,v);
      } 其他的 {
        如果(= = =p){o(p] =v;};
      }
    }
  };
  函数isObj(o){
    返回 (typeofo= = = “对象” & & typeofo。拼接 = = ! “函数”);
  };
  函数getValue(v){
    开关(typeofv){
      情况下 “字符串”:
        返回 “” +v+ “”;
      打破;
      情况下 “数量”:
        返回v;
      打破;
      情况下 “对象”:
        如果(typeofv。拼接 = = = “函数”){
          返回 “(” +v+ “]”;
        } 其他的 {
          返回 “{” +v+ “}”;
        }
      打破;
      情况下 :
      打破;
    };
  };/ /……更多的方法和其他代码…
  //让init成为一个公共方法
  返回 {初始化:初始化};
}();模块。初始化({
  “容器”:“头”,
  “CSS.classes.active”:“现在”,
  “超时”:1000
});

为了便于阅读,让我们把所有的配置更改代码封装在一个自己的模块中:

var模块= 函数(){
  / /配置,改变的东西
  var配置= {CSS:{:{徘徊:“徘徊”,活跃的:“当前”,jsEnabled:js的
     },id:{容器:“maincontainer”
     } 
    },超时:2000,用户标识:“chrisheilmann”
  };//启动主代码
  函数初始化(){控制台。日志(配置);
  };/ /……更多的方法和其他代码…/ /配置更改
  varchangeConfig= 函数(){
    函数 (o){
      var注册= / \ / g;
      如果(isObj(o)){
        (varo){
          如果(我。indexOf(“。”)= = ! - - - - - -1){
            varstr= ["的 +我。取代(注册,”][”) + “””;
            var瓦尔=getValue(o(]);eval(“配置” +str+ “=” +瓦尔);
          } 其他的 {findProperty(配置,,o(]);
          }
        }
      }
    };
    函数findProperty(o,p,v){
      (varo){
        如果(isObj(o(])){findProperty(o(],p,v);
        } 其他的 {
          如果(= = =p){o(p] =v;};
        }
      }
    };
    函数isObj(o){
      返回 (typeofo= = = “对象” & & typeofo。拼接 = = ! “函数”);
    };
    函数getValue(v){
      开关(typeofv){
        情况下 “字符串”: 返回 “”+v+“”; 打破;
        情况下 “数量”: 返回v; 打破;
        情况下 “对象”:
          如果(typeofv。拼接 = = = “函数”){
            返回 “(”+v+“]”;
          } 其他的 {
            返回 “{”+v+“}”;
          }
        打破;
        情况下 : 打破;
      };
    };
    返回{:};
  }();
  //让init成为一个公共方法
  返回 {初始化:初始化};
}();模块。初始化({
    “容器”:“头”,
    “CSS.classes.active”:“现在”,
    “超时”:1000
});

这是提供配置对象并在init()方法中以编程方式更改它的一种方法。你能想出更好的吗?

谷歌阅读器共享项的不显眼标记

周三,5月21日,2008

我是谷歌阅读器的用户,通过大量的RSS我订阅的订阅源。我认为这样说很安全RSStwitter已经取代了我大部分的网络冲浪。

最喜欢大RSS读者,谷歌阅读器还可以让你与那些想要和你的社交社区的人分享你的伟大发现。您可以将这些发现作为提要或小徽章(在谷歌术语中称为剪辑)包含在您的博客或其他站点中。

这个徽章的开箱即用版本可以定制和结果在两个JavaScript中包含其中的写出来的徽章。

这是好,但我不太喜欢没有JavaScript也能提供功能的东西,这就是为什么我更仔细地检查了谷歌标记的作用。

如果您查看生成的脚本包含,您会发现如下所示URL(增加空间以避免破坏我的博客:))

http://www.google.com/reader /public/javascript/ user/07479231772993841072/ state/com.google/broadcast?n = 5回调= GRC_p % 7 bc % 3 28% % 22绿色% 22% 2 ct % 3必威体育下载 % 22基督教% 20 heilmann % 27 s % 20共享% 20个项目% 22% 2 cs % 3 7 d % % 22日假% 22% 29% 3 bnew % 20集选区

点击这个会得到aJSON对象,并带有包装器函数(由于某些原因,这是一个JavaScript文件的注释),这意味着您可以将其用于您自己的目的。

你只需要你的用户ID,你可以很容易地从谷歌Reader提供的共享条目主页上得到这个。就我而言,这是http://www.google.com/reader/shared/07479231772993841072.

其他有趣的参数JSON APIn参数定义项的数量和回调参数定义被包装的函数调用的名称JSON数据。

将所有这些组合在一起,很容易创建使用以下内容的徽章HTML在谷歌阅读器上展示我的共享项。

      

没有JavaScript的访问者仍然可以通过单击进入我的共享项页面。使用JavaScript的用户将获得最新的5个版本。

您可以在演示页面(使用tutorialbuilder):

SearchMonkey如何能找到一个清洁工,数据更丰富的网络

星期五,5月16日,2008

我通常不会在这里写我公司的产品,但是我想快速地谈谈SearchMonkey,雅虎的一项新服务现在可供开发者使用。

昨天,我花了一些时间与几家杂志的记者在一起,解释了SearchMonkey的技术细节。这让我意识到,如果我们使用正确的方法,SearchMonkey将会产生多么巨大的影响。

什么是SearchMonkey,业务或用户利益是什么?

从表面上看,SearchMonkey的意思是雅虎!打开他们的搜索结果页面,为他们编写插件。你可以单独设计搜索结果,并提供“更丰富的用户体验”。换句话说,你实际上可以写“猴子”,让人们从雅虎提供的搜索结果深入到你的网站。

比如说你是netflix或者其他公司DVD你想要人们租电影。你可以编写一个猴子样式的搜索结果由imdb.com或其他电影评论网站显示的封面DVD,电影的梗概和netflix的租赁链接。

的好处是,最终用户不需要加载IMDB如果她对大纲中的信息感到满意,而你作为netflix获得了大量的流量,这是你以前从未有过的。

华丽的,这让最终用户和业务人员很高兴,但它是如何让网络变得更干净的呢?

你如何利用它使网络变得更干净?

好吧,这是一个强有力的商业案例。搜索结果页面很无聊,人们试图与之博弈搜索引擎优化多年的技术(和可憎的东西)——人们喜欢被发现。雅虎打开他们的爵士Ps(搜索引擎结果页面)的世界意味着首先你可以提供猴子作为服务,如果你是一个开发商或小代理。

monkey是基于关于文档的可用数据构建的。最基本的形式是雅虎保存在索引中的信息——标题,描述和其他元信息。您可以使用此信息添加更多内容HTML搜索引擎显示,但收获的东西是贫乏的一面。

为了解决这个问题,SearchMonkey允许您提供“自定义数据服务”来获取更多信息。这些服务可以是XSLT从文档中获取信息,一个API返回一个XML以特定的DataRSS格式或者-这是它变得非常有趣的地方-RDF或对文档中的信息进行微格式设置。

使用以下工具抓取文档XSLT总觉得自己错了HTML结构受到许多因素的影响——另一个问题当然是它非常需要内存和计算。

提供一个自己的API返回XML当然是提供数据的最佳方式,但你可能没有这样做的资源或动力。

还剩下微格式和RDF.现在我们支持hAtom,hCalendar,hCard,hReview和XFN在微格式和嵌入式方面RDF这使得检索信息更加容易。

有一个利用数据WebSearchMonkey文档中详细解释了这一点的部分(很抱歉有人考虑“利用”良好的语言)。

所以,总而言之,SearchMonkey不仅仅是为开发者打开网络的一大步(你可以不用付钱就能设计搜索结果——这在不久之前还会让市场营销人员感到头疼),这也意味着我们终于有了一个通道来显示我们在microformatic or中添加的数据RDF不是Firefox扩展或专用搜索引擎的格式。有了页面中的信息,开发人员(无论是内部的还是外部的)可以一步就创建定制的搜索结果,而不必依赖于文档的结构,也不必同时设置monkey应用程序和数据服务。

另一方面,甚至有人可以使用SearchMonkey来增强搜索结果与您提供的数据(并链接回您),如果它很容易编写一个XSLT当你想推广清洁能源时,获取数据是一个有力的论据HTML结构(不,我就不叫它了豪华,因为善良没有朴素和古老之分,语义HTML-这不是一般的做法,可悲的是足够的)。

检查SearchMonkey信息页面开始或仅仅开始培养你的第一只猴子-选择是无止境的。

表扬错误

周四,5月15日,2008

我一直在和a说话很多是为了让人们更好地一起工作,更快地完成工作。有一件事让我着迷,那就是人们为了避免沟通错误和问题而花的时间。

我们非常高兴地庆祝成功,并指出我们所创造和做的事情的明显好处,但人们有一种固有的倾向,不愿承认错误,也不欢迎别人告诉你哪里错了。

我曾经听过这句话“一个好朋友告诉你他们喜欢你的衬衫,一个好朋友告诉你,在你去约会之前,你的鼻子上有污垢谢尔曼的泻湖)。

犯错是件好事。他们伤害了,它们让我们思考,它们让我们生气,让我们学习。必威体育下载我们对它们所做的一件错误的事情是采取这些负面的肠道反应,并在大多数情况下以错误的方向发泄。

这就是我们的联系方式,第一个在雷雨过后发现一根燃烧的树枝的穴居人会把手伸进火里,很快就会发现这是一个糟糕的计划。然后他很可能告诉别人(他喜欢的人)不要那样做。他可能还在考虑用那把火对付他不喜欢的人——可悲的是,这似乎是我们人类擅长的事情。

犯错误会让我们感到不足和不安——作为进化的皇冠,我们失败了,我们应该做得更好。它们也让我们感到保护——我们不想承认自己犯了错误,因为这会让我们在别人眼中显得软弱或愚蠢。这本身就是一个错误所有会犯错误,做傻事吗所有的时间.

举个例子:当我第一次来的时候,我很开心一个列表这篇文章被贴出来了——多年来一直是这个网站的粉丝。这篇文章JavaScript图像替换激起了彼得·保罗·科赫的强烈反对,名为为什么阿拉巴马州“JavaScript图像替换”很烂.

我被击得粉碎。PPK他的帖子指责我剽窃了他的想法和代码(我们在一个邮件列表上解决了这个谜题,用时间戳证明我两者都没有做到),他的批评在一定程度上是正确的,但在其他方面则过于热心。

我受伤了,我很困惑,也很生气。我并没有抱怨打包或回击,而是查看代码并修复问题PPK谈到。我也开始和他进行更密切的交流,很好的讨论和分享信息和联系方式。

因为我的错误,我成长了很多,而且彼此之间也没有芥蒂PPK而我——我将是在他今年晚些时候组织的会议上发言的专家之一。

简而言之,犯了一个错误,被调用并修复它使我成为一个更好的开发人员。这让我自惭形于人,让我意识到和别人一起工作(即使只是为了快速地检查一下自己)比我一个人工作更有效率。

这也适用于产品:与其庆祝成功,我们应该庆祝已经引起我们注意的问题。bug是分析导致bug的原因以修复它的机会。

这是真正的机会——我们必须学会不要做傻事。必威体育下载我们应该花点时间来看看错误从何而来,而不是气喘吁吁——最糟糕的情况是——提出“止损解决方案”或“快速修复”,是什么导致了它,它有什么影响,并记录修复它的方法。有数百万的“最佳实践”教程和示例,但“这是我们如何修复一个导致这个和那个的讨厌的错误”的文章并不多。

原因是内疚和害怕显得软弱和容易犯错。好吧,我个人认为,由于你确实会犯错误,这实际上会让你变得更坚强。同样的道理,欣赏竞争对手的优秀作品会让你更加可信,而不仅仅是喋喋不休地说自己在做什么,表现得好像其他人没有做什么伟大的事情。了。

我非常确信,如果我们能够扭转开发文化,将错误视为一种积极因素,我们将向前迈出一大步。一个指出明显缺陷的人并不是一个告密者,也不是一个“不发信息”的人,而是一个你必须感谢的人,因为他给了我们一个真正改进工作的机会,让我们学会了下次不要再犯错。必威体育下载

错误是好吧-它们确实会发生。