易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
机器管家

机器管家

一般来说,讲机器人的往往到最后都会讲人机恋,当然那部《我,机器人》(i,robot)不太一样。机器人三守则是不会遗忘的事,被遗忘的嘛,那就是经典的《终结者》了。
《机器管家》这部片子挺老了,但是讲的故事有点感人,讲的是机器人成长的过程,和人的成长差不多,只是遇到的问题不一样。
当机器人越来越想成为人的时候,他不可避免的就是,时间对于他们来说是没有意义的。
内容大致如下:
马丁一家买来一个机器人当管家,可男主人马丁很快发现:这个名叫安德鲁的机器人,不仅有非凡的创造力,甚至还能表达情感。安德鲁一直称男主人的小女儿为 “小小姐”,并和她建立了深厚的感情;几十年过去了,安德鲁已经成为马丁家族的一员,在一个工程师的帮助下,他从内到外一点点的,几乎变成了一个真正的 人,安德鲁还发现自己陷入了爱情-——爱上了“小小姐“的孙女,外貌酷似“小小姐”的波西娅。这段机器人与人的科幻爱情将面临什麽样的考验?

事实上,这种爱情故事现在确实不多见。以前的人机恋都是男主人公恋上个女机器人。再来上一点女机器人为救爱人命怎么怎么样,偶尔有一部女主人爱上男机器人的确实很少。而且,确实可以算是跨度为二百年,爱上小小姐,爱上小小姐的孙女,并为之赴死。遗憾的是,直到最后也没有看到法庭宣判他可以成为人这个消息。他一直是想成为人,可到死也没有看到这个消息。其实他也算是想给自己的老婆一个名份吧。不想她有内疚?最后的护士机器人也不错,也有了人形了,是不是在暗示那位医生也会尝试和护士一起生活?

情节有点老套,但内容 和表演确实不错

在非IE浏览器中实现“灰阶化[1]”

在非IE浏览器中实现“灰阶化[1]”

原文:http://james.padolsey.com/javascript/grayscaling-in-non-ie-browsers/

在非IE浏览器中实现“灰阶化[1]”

这个问题看似简单,实际上要付出很大的努力[2]。要的结果很简单:在所有非IE浏览器中模拟Internet Explorer浏览器的grayscale(灰度)滤镜。然而,它的解决方法并非你想得那么简单,这也让我着实大大地吃了一惊。

在 IE中,grayscale滤镜可以应用到任意一个元素中,它会很直观地将元素转变为灰度。可以使用下面 这行复杂且专有的CSS来实现grayscale滤镜。

elem.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(grayscale=1)';

如上所示,在IE中实现这种效果简单是小菜一碟;然而,在其他的浏览器中,需要引起很大的关注。

需要有两件情况值得考虑:图片元素和非图片元素。“非图片”类元素实现十分简单:在当前文档中遍历每个元素,寻找类似“backgroundColor”和 “color”的色彩属性,将它的RGB颜色值转换为灰度值。有不少方法可以实现;注意我们这里不是说降低图片的饱和度;“灰阶化”很明显跟它不一样。

// Desaturate:降低饱和度
function RGBtoDesat(r,g,b) {
var average = (r + g + b) / 3;
return {
r: average,
g: average,
b: average
};
}

// Grayscale:灰阶化
function RGBtoGrayscale(r,g,b) {
var mono = parseInt( (0.2125 * r) + (0.7154 * g) + (0.0721 * b), 10 );
return {
r: mono,
g: mono,
b: mono
};
}

因此,每个带颜色属性的元素要使用它来转为灰阶;初始颜色用来重置属性值。

我们的图片能否转为灰阶取决于两个因素;一是浏览器必须要支持HTML5 canvas元素和它getImageData方法,二是主机上的所有图片必须位于同一域名下;除此外,主机上的图片不能脱离getImageData方法而不管它是否支持[3]。Google Chrome浏览器和Safari(4以下版本)由于不支持getImageData,先不作讨论。其他的浏览器支持canvas元素,完全可以做到“灰阶化”图片。

实现这种方式是要“手工”遍历图片中的每一像素,并应用我们用来设置CSS 颜色属性的RGBtoGrayscale函数。真要这样做的话,浏览器绝对吃不消;除非有极其快速的Javascript引擎来承受大图片处理的压力。

鉴于上面提到的原因,因此在任一个元素需要“灰阶化”前,添加一个“预置”函数去运行显得尤为必要,这个函数可以使用零超时递归技术[4]来避免耗死浏览器。如果仅仅是小图片需要转换的话,不必使用“预置”函数,可以直接使用这种暴力转换。

为什么呢,这是为什么呢?

你肯定想知道在“灰阶化”会有哪些应用。那么,比如说:降低色彩以减少用户的视觉焦点,以此来减少用户对你网站上五颜六色东西的关注;比如说,光箱特效。像 vBulletin的论坛系统就使用了这种效果,它会你点击离开时,将页面变灰;然后会弹出确认框,这个确认框非很容易识别,因为它是页面中惟一的带色彩的东西。

“灰阶化”困扰我的真实原因是因为我很想知道是否有可能做到这个目的。我已经知道在IE浏览器里有这个滤镜,我还想看看在其他浏览器中能否模拟实现这种方便的特效。我也知道这种特效可能被认为已经过时了,但这并不重要;我仅仅是对实现它很感兴趣。

示例

我做了一个示例页面,上面有几个格斗士[5]的图片,功能已经在这篇文章中说过了。注意,在Safari(小于4)或才 Chrome(还有可能在Firefox老版本(V.2以前))不起作用;不要忘了它仅仅是一个试验。
http://james.padolsey.com/demos/grayscale/

使用方法

要对一个元素实现“灰阶化”需要调用 grayscale()函数,并将元素作为参数传递,比如:
var el = document.getElementById( 'myEl' );
grayscale( el );
// 也可以传递一个DOM集合
// (这样所有的元素都会得到“灰度效果”)
grayscale( document.getElementsByTagName('div') );
//也可以在jQuery对象集合中使用
grayscale( $('div') );
若要重置元素(返回到原来的颜色状态)必须调用grayscale.reset(),并将需要重置的元素作为参数传递:
grayscale.reset( el );
// reset()同样可以接受DOM对象或jQuery对象集合参数
grayscale.reset( $('div') );
其中的prepare函数,上面已经讲过了,在有大图片要处理的情况下需要使用到,或者即使只是几个小图片。注意大图片需要有一会儿的时间去处理(一张 300×300的PNG格式图片在“预置”方式下需要耗费3秒钟的时间)。
grayscale.prepare( document.getElementById('myEl') );
// 同样可以接受DOM对象或jQuery对象集合参数
grayscale.prepare( $('.gall_img') );

[完]

注:

[1]:灰阶化:原文grayscaling,意为“采取灰度标准”,即灰阶化,将图片由彩色转为灰度;
[2]原文为”This started out as a little experiment and eventually turned into quite an endeavor.“,可能存在翻译问题;
[3]原文为“externally hosted images cannot be passed into ‘getImageData’ regardless of whether it’s supported.”,翻译存疑;
[4]零超时递归技术:原文zero-timeout recursion technique,应为zero-time recursive technique;参见http://en.wikipedia.org/wiki/Recursion_(computer_science);
[5]格斗士:原文blood-thirsty hunters,嗜血的猎人

--EOF--
灰阶化可以用在414或者512,值得用用喽。。。

 

KESO:Google一次的能耗

KESO:Google一次的能耗

好象这次KESO的《Google一次的能耗》引起了很多人的关注,特别是在QQ微勃上面,有人的转贴就是:不知道http://url.cn/0k4vVU消耗多少,硬件软件有重新设计过吗?|| 腾讯科技 keso炮轰人民网

KESO的原文不长,我这里稍转一下,三言二拍:Google一次的能耗:

人民网上有一篇文章,说每次Google搜索的能耗,相当于100瓦灯泡工作一小时。其中充斥着大量的错误,既有原文的错误(原文在此),也有翻译的错误。

比如,翻译中说,“谷歌数据中心拥有近100万台服务器,每台服务器每小时消耗大约1000瓦的电量”。瓦特是功率,不是电量,电量我们一般用度 (千瓦时)来表示。再比如,“这个搜索引擎每小时产生近1000万个搜索结果”,实际上,早在2001年,Google每天的搜索请求量就超过了1亿次, 今天这 一数字早已超过10亿次(Twitter的日查询次数,包括各种客户端的请求,都高达6亿次)。

上面是明显的错误,其他错误还包括,按每台服务器功耗1000瓦的标准计算Google服务器的能耗,也是相当不靠谱的。普通PC服务器的功耗,一般在400-500瓦。Google的服务器、机房、电源、甚至冷却系统,都是自己设计生产的,按照Google公开的数据,Google服务器的电能转换效率是业界最高的。

而且,把全部服务器的能耗,平均到每次查询上,也非常不靠谱。Google每天要存储20PB的UGC数据(相当于20,000TB,或者 20,000,000GB),假设每块硬盘的容量是1TB(1000GB),那么用户每天产生的内容要写满2万块硬盘。在Google庞大的数据中心中, 有大量服务器实际上是存储服务器。

按照Google自己的计算,一次搜索查询的能耗,大约只相当于0.0003度(千瓦时),或者1千焦(1千瓦时=3600千焦),如果是100瓦的灯泡,这些能量只能点亮11秒钟。

写到这里,我觉得这种计算其实挺无聊的。Google当然会想尽办法节省能源,毕竟它的百万规模的服务器数量,在节能上哪怕非常微不足道的一点小进步,都意味着巨大的资金节省。能源账到底该怎么算,恐怕不是个简单的算术题。

节能是必要的,也是可能的,但搜索技术带来的巨大的社会进步和其他损耗的减少,是在上面的计算中完全看不到的。能源账到底该怎么算,恐怕不是个简单的算术题。

--EOF--

转载的文章嘛。不多点评,不过我是知道国内大多数的机房,其实有很多都在空转着。大量的电力、网络都被IDC消耗掉了。不过想想也很正常,承租机柜后如果没有业务,机柜怎么办?关掉?而且,即使你用的电源低于标准的400W,也没有减少他们应收的费用。更加让人郁闷的是,国内很多大型网站的老总都是这么认为的:能用钱解决的问题就不是问题(比如,服务器、带宽等)。因此,说google的时候,考虑一下自己才是重要的。

国内,好象就听说阿里有自己的机房,不知道他们在缴纳每年的电费时,是否也在考虑着要节约电力?要思考如何改进架构?至于我们这些P民,用着租来的、托管的机器,或许,想的是真的要少一点吧?

重要的不是语言,是思想

重要的不是语言,是思想

标题这种话已经在被很多人所理解,现在大多数开发人员已经不再把语言当成障碍,而是把思想当成障碍,语言的跨度其实真的很容易解决,但思想不进步,你有着再好的语言又怎么样?即使你用的是所谓的自然语言(即平时生活中的语句),但只要你没有思想,没有逻辑,你又能写出什么样的程序?

以下内容来自老王参加的某大会的记录、摘要。我是看中其中的一小部分,觉得有感触。。原文在这里,点击进入:

部分我认为不错的精华,或者说是我关注的。。。

1、课程:失败来临的征兆(讲师:Michael Nvgard)这一切正是Michael Nvgard先生演讲的主旨:意外的问题总是在不经意间发生,要注意把它们的影响限制在局部,避免拖累整个应用。比如说在SOA中集成若干个服务时,应该 设置好各个服务的Timeout,避免其中一个服务崩溃连带整个系统等待。

2、课程:Twitter的可伸缩性数据架构(讲师:Nick Kallen)

Nick Kallen介绍了Twitter在处理海量数据时的经验,其实总结出来就三条:分区,索引,复制。

着重介绍了Tweets,Timelines,Social Graphs,Search Indices四个基本功能的实现:

Tweets比较简单,就是分区,虽然可以使用id或者user_id来分区,不过目前Twitter使用的是按time分区。

Timelines相对复杂了一些,最开始采用的方法是纯SQL的,大致如下:

SELECT * FROM tweets
WHERE user_id IN (SELECT source_id FROM followers WHERE destination_id = ?)
ORDER BY created_at DESC
LIMIT 20
这当然不是一个高效的解决方案,后来采用了被称作离线计算(Offline Computation)的解决方案,其思路大致就是每当发送一条推的时候,采用队列存储避免峰值瓶颈,同时向所有Followers分发此消息,然后每 个分发 终端在缓存中完成合并计算。乍一听起来这似乎也不是什么好的解决方案,一旦某人有非常多的Followers,即便分区,这个分发操作也会非常耗时,但按 Nick Kallen的介绍,Twitter确实是这么做的,细节操作有待研究。

剩下的问题不多说了,Nick Kallen给了PPT地址:http://www.slideshare.net/nkallen/q-con-3770885

3、课程:构建可扩展的微波系统(讲师:杨卫华)

杨卫华作为新浪微博的架构师,这次的PPT做得很酷,虽然在内容上和Twitter有些重复,但还是很不错。

提到了Memcached的evictions问题,给出了三个守则:

1:规划好cache的容量
2:将永久数据和临时性数据分开
3:不使用随机字符串做Key

至于原因,可以参考杨卫华的博客上的介绍:Memcached数据被踢(evictions>0)现象分析

4、课程:敏捷在中国(讲师:Tom Mellor) 编程工期的催促往往让程序员只考虑眼前的既得利益,却忽视了后期的风险。

5、课程:如何在团队中有效实施TDD(讲师:麦天志)在阐述为什么即便工期紧张也应该使用TDD的时候,他给了一个比喻:医生做手术的时间很紧张,但即便 这样,手术前清洗双手的工作程序也是必不可少的。在讲解重构时,他强调了TDD是重构的基础,只有这样才能保证重构没有改变现有的行为,否则就不是重构,而是重写。

例行维护后引起的故障和桔子的缓存故障

例行维护后引起的故障和桔子的缓存故障

最近javaeye发生一起小故障,是robbin自己说的:

@robbinfan: 昨晚JE所在机房切换电源关机导致网站无法访问。早上恢复后因为数据库和缓存服务器都被清空,巨大流量(QPS将近400,并发连接到1000)直接冲击导致web服务被阻塞,现在正在逐步恢复中。

在mikespook.com看到对待这个问题的分析时,突然想起桔子也遇到过类似的问题,所以把他们两个人的事情贴出来。

先上mikespook的:

显然,这是一次运维事故。事故的原因是分流作用的数据库和缓存出现“故障”,导致数据层响应延迟,web 服务器阻塞。这里我没有用“清空”而是用了“故障”来描述分流数据库和缓存,是因为实质上 javaeye 的这次事故虽然是正常维护(电源切换)后发生的,但是其表象跟分流数据库和缓存宕机是一样的。

这个故事给我的两个启示:

在架构设计上,对于分流数据库或者缓存或许应有一定的持久化能力。比如,在维护时,按照从“外”到“内”的顺序逐步关闭服务。在这个例子里,“外” 就是 web服务,“内”就是数据层。在关闭了“外”服务后,手工或自动将缓存持久化。维护完成,开启顺序从“内”到“外”,并在回复完底层存储后,将持久化数据恢复到缓存。

在运维规范上,在维护后应让系统进入一个的磨合期,在合理的时间内通过分流(比如跳转到一个“系统忙”的页面)或者防火墙封锁的方式。让系统保持在比正常负载低一些的水平。持续一段时间(或者维护后累计访问量达到某个值)后再让系统开足马力去运行。

这样,应该可以避免空缓存大并发导致的宕机事故。

再次感谢 robbin 和 javaeye 为我们带来的启示。

再上桔子的,汗,突然发现桔子的博客上居然没有写,看来是上次在群里看到了,大意如下:

某次更新系统,然后需要重启,结果重启后CPU长时间处于100%(?还是死机了?),后来检查发现,原来故障是出在缓存上。
因为是采用文件缓存,而又设定了过期时间,重启后,所有的缓存都过期了。然后网站访问量又大,突然而来的访问导致缓存重新生成,差点让机器出故障。
所以现在开始要调整缓存架构。
其实上面两个问题都差不多。都是在访问大的时候,缓存频繁生成造成的故障,这确实不容忽略,但如何解决真的是一个问题。很多时候在访问量不大时,我们都考虑使用文件来作为缓存存储。但真正访问量高了后,文件缓存不可避免的就带来IO的消耗,如何批量生成缓存?还是按次生成缓存?还是定有一定的策略?难道还要采用队列?那就夸张了。

所以,一个好的系统架构也是很需要的,不能因为一次宕机就永远起不来。我个人是偏向于队列生成缓存,这样就不用担心一次写入过多文件引起IO的崩溃。但队列是因为有延迟的,如果控制同样的内容不重复生成文件缓存,则需要另外考虑

MySQL和SQL字段截短漏洞

MySQL和SQL字段截短漏洞

这篇文章很有意思,以前注意过,但没仔细考虑过用来注入,或许就象王猛说的:

了解很长一段时间的web安全了,个人觉得世上最聪明的程序员其实是黑客,一次想N步,逻辑超强,技术全面,从操作系统漏洞、到语言本身漏洞、数据库本身漏洞、再到开发者代码,无孔不入。

文章来自寂寞hacker,http://hi.baidu.com/isbx/blog/item/08ef48547ef1ad58574e00bf.html:
当前的Web开发者中肯定有不少人没有注意到作者所提到的这两个问题的。

第一个问题是这样的,MySQL默认有一个配置参数 max_packet_size,这个参数是用于限制MySQL客户端和MySQL服务器端数据通信的数据包大小,MySQL的默认配置是1MB。如果客 户端发送的数据超过了1MB,则MySQL服务器端会忽略掉这个请求数据。作者接下来举了两个利用这个缺陷的例子,第一个是利用超长数据来使MySQL的 日志记录程序失效,第二个是在PHP+MySQL的环境下,PHP的Session清理程序会由于一次发送的清理session数据的请求数据包超过 max_packet_size的限制,而导致清理session失败。

而实际上,由于很多PHP+MySQL的程序都会运行用户上传附件之类,而一般的PHP+MySQL的上传附件限制都是大于1MB的,所以PHP的 程序开发人员一般是会去修改max_packet_size的值为大于1MB。这就给我们的漏洞利用带来了一定的麻烦,毕竟在当前的网络状况下,构造 1MB多的数据去上传还是可以忍受的。但是太大的数据量就比较考验我们的耐心了,呵呵。

第二个问题就比较严重了,MySQL对于超过字段长度的数据插入操作会进行默认的字符串截短。例如一个字段定义的长度为10,如果插入的字符串长度 超过10,MySQL会将长度超过10的部分字符串自动舍去后插入到数据表中。默认配置条件下,MySQL会产生一个警告信息,但是这个警告信息不会被 Web应用程序捕获到。所以,从表面上来看,超长数据也是可以“成功”插入数据表的。作者在下面举的这个例子就很有代表性了,首先是一个场景假设:

  • The application is a forum where new users can register
  • The administrator’s name is known e.g. ‘admin’
  • MySQL is used in the default mode
  • There is no application restriction on the length of new user names
  • The database column username is limited to 16 characters

用户如果尝试注册一个用户名为admin的用户,会由于Web应用程序中的isAlreadyRegistered函数的校验而注册失败。

SELECT * FROM user WHERE username='admin'

但如果用户使用用户名’admin x’来注册(注意admin和x之间有11个空格),则注册流程会是这样的:

isAlreadyRegistered函数会使用上面的SQL语句来检查user表中是否存在相同用户名的用户,查询结果肯定是不存在的。那么用户注册成功!

实际上,真正插入到user表中的用户名是’admin’!也就是说,MySQL不仅会截短超过长度限制部分的字符串,也会对字符串头尾的空白字符进行截短!所以,在user表中,现在存在了两个admin用户!

接下来,用户登陆,他使用的是用户名admin,密码是他刚才设置的’admin x’的密码。假设Web应用程序的登陆认证和授权函数是这样的一段代码:

$userdata = null;
if (isPasswordCorrect($username, $password)) {
$userdata = getUserDataByLogin($username);
...
}

其中isPasswordCorrect函数使用的SQL语句为:

SELECT username FROM users WHERE username = ? AND passhash = ?

getUserDataByLogin函数使用的SQL语句为:

SELECT * FROM users WHERE username = ?

可以看得出,上面的语句使用了预编译的SQL语句,是无法实施SQL注入的。但是由于MySQL的默认字段截短策 略,isPasswordCorrect函数会成功执行并返回用户名admin,接下来的getUserDataByLogin也会正确执行,返回的结果 虽然是一个数组,但是Web应用程序一般是取返回数组中的第一个结果,也就是真正的管理员用户admin的所有数据!

怎么样,不用SQL注入,一样拿到管理员权限!

后记:经过测试,上面的漏洞利用过程在MySQL 4中是确实存在并且可以利用的。但是在MySQL 5中,本机测试失败。失败的关键就在于MySQL 5对于超过字段长度限制的字符串插入会报错,并停止字符串插入操作。

附:MySQL 4的测试过程

mysql> select * from tb_sqltest where name='jason';
+----+-------+--------+------+------+------+------+
| id | name | remark | time | col1 | col2 | col3 |
+----+-------+--------+------+------+------+------+
| 1 | jason | NULL | NULL | NULL | NULL | NULL |
+----+-------+--------+------+------+------+------+
1 row in set

mysql> select * from tb_sqltest where name='jason x';
Empty set

mysql> insert into tb_sqltest (id,name) values (2,'jason x');
Query OK, 1 row affected

mysql> select * from tb_sqltest where name='jason';
+----+-------+--------+------+------+------+------+
| id | name | remark | time | col1 | col2 | col3 |
+----+-------+--------+------+------+------+------+
| 1 | jason | NULL | NULL | NULL | NULL | NULL |
| 2 | jason | NULL | NULL | NULL | NULL | NULL |
+----+-------+--------+------+------+------+------+
2 rows in set
apmxe备份

apmxe备份

说实话,看到Qeephp常年不更新后,也担心这个程序会消失。所以,我自己还是备份一下比较好。在以前的博客里我也作过介绍,但都是给的官方地址,而官方地址从fleaphp.net到fleaphp.org,再到现在的qeephp.com,很多链接都失效了。所以,我还是在本地备份一下较好。

这个版本已经又快一年没更新了,不过想来也没有什么好更新的东西。所以。我还是复制了一下官方的介绍:

APM Express 是一个集成了 Apache 2.2、PHP5、MySQL 5,以及 phpMyAdmin、QeePHP 框架(含示例)的绿色集成运行环境,简称为“APMXE”。解压缩即可使用,不写入任何系统文件,100% 绿色。

版本说明

  • Apache 2.2(完整)
  • PHP 5.2.9–2(完整)
  • XCache 2.0.4
  • MySQL 5.0(服务端和命令行工具)
  • phpMyAdmin 3.2
  • QeePHP 2.1(含示例)

使用说明

下载后可以获得一个 .zip 文件,其中包含安装程序。运行安装程序设置好解压缩目录后,即可通过快捷方式启动。启动后,通过浏览器访问 http://localhost/ 查看 APM Express 的欢迎页面。

注意:默认设置的端口号为 9000,MySQL 端口号为 9066。

配置文件修改说明:
配置文件共有三个:
httpd.conf.tempalte - Apache2 的配置文件
mysql.ini.template - MySQL5 的配置文件
php.ini.template - PHP5 的配置文件


修改这三个文件后,启动 APM Express 时就会以这三个文件为基础生成 apache/mysql/php 的配置文件。所以要自定义设置,就改这三个文件。


配置文件模版

配置文件中所有 %APMXE% 的字符串将会在 APM Express 运行时替换为 apmxe.exe 所在路径。替换后的内容会写入三个新的配置文件,供 Apache/PHP/MySQL 使用。

两个下载地址:

说 明: apmxe-setup-2009-06-17.zip
官 方: apmxe-setup-2009-06-17.zip (11130.92 KB, 上传日期:2009-06-17 22:58)
本 地: apmxe-setup-2009-06-17.zip (11130.92 KB, 上传日期:2010-04-24 12:00)分流

说 明: apmxe-2009-01-20.zip
官 方: apmxe-2009-01-20.zip (7646.35 KB, 上传日期:2009-01-20 07:48)
本 地:apmxe-2009-01-20.zip (7646.35 KB, 上传日期:2010-04-24 12:00)分流

RTF文件批量转成HTML文件

RTF文件批量转成HTML文件

rtf是一种富文本格式,根据RFC的规范,可以将其转为各种文件,如doc,wps等,但如果真的要根据RFC规范一点点的写程序,那就真的太累了。所以。。。我用wps转换了。
以前写过wps生成文档的程序,就是这篇闲着无聊,用WPS生成文档,现在,这个RTF转换到HTML也可以用PHP来完成

<?php
$wps = new COM('WPS.Application');
$wps->Visible = false; //不显示wps界面
$filename = realpath('./RTF_to_HTML_Converter.rtf');
$stime = microtime(1);
for ( $ii = 0; $ii < 1000; $ii++ ){
$savedfile = "c:\\convert\\{$ii}_test.html";
$doc = $wps->Documents->Open($filename);
$doc->SaveAs($savedfile, 8); //参考Document.SaveFormat 属性
$doc->Close();
}
$wps->Quit();
echo( sprintf( "%0.6f" , (microtime(1)-$stime) ) );
unset( $doc , $wps );

测试了一下,生成1000个文件,花了257秒,4分多种,可以接受这个时间,只是在转换的时候,CPU超过50%,而且是在命令行下的。如果是在网页界面肯定是没有这么快的了。
PS:转换后,中文编码实体化了,&#30475;&#30475;&#20013;&#25991;&#24590;&#20040;&#36716;,变成这样的格式,它是什么内容呢?它们就是:【看看中文怎么转】<-- 可以看一下源码,就知道这7个字是什么样的了

wordpress的SEO

这篇SEO的文章内容很长,而且里面的链接很多,我就不转载了,内容在http://xuui.net/librarys/seo-for-wordpress.html,我自己下载了一份,打包上传成附件。

作者举了这些例子:

1、设置一个友好链接

2、让 WordPress 的 URL 地址唯一化

3、合理设置一个 robots.txt

4、关于 Meta 内容

5、优化 title(页标题)内容

6、文章标题 (Headings) 二级标题、三级标题的使用

7、建立一个合理的导航结构

8、是否移除链接上的 nofollow 属性

9、建立一个 Site Map(站点地图)

10、页面的设计

11、关键词的使用

12、CSS

13、文章内容和反向链接

说明:如果有必要,这篇文章以后可以不断更新,就像 jim 一样,SEO for WordPress 这篇文章从 05 年一直写到现在。如果有什么不对的地方,也欢迎大家指正,以便及时修改。

--EOF--

由于文章一直在更新,所以,如果觉得有用的可以去网上查看和下载。基本上最早的来源是:http://www.osxcn.com/wordpress/seo-for-wordpress.html

简历石沉大海的原因

fortunechina上有两篇文章不错,都是关于求职简历的。为什么你的简历石沉大海了呢?看看人家是怎么解释的。
来源:http://www.fortunechina.com/career/c/2010-04/02/content_33338.htm

亲爱的安妮:

大公司的人力资源部最近都怎么了?我承认,我上一次找工作已经是很久以前的事情了,但那会儿,只要你向人力资源部提交简历和求职信,总能得 到回复(哪怕只是一封群发的拒信)。

现在情况似乎有些变化。我曾在一家中型公司担任品牌经理,自失业以来,我已经找了差不多一年的工作,一直很不顺利。通常,我是在招 聘网站或公司网站上看到具体的招聘广告,然后我会非常认真地准备好简历,发给公司的人力资源部。就这样我投了几十封求职信,结果却石沉大海,杳无音信。

其他读者是否也有遇到这种情况?我怎样才能得到人力资源部的回复呢?如果这个要求都太过分的话,我如何才能越过他们找到工作呢? ——琼

亲爱的琼:

你的经历的确糟糕,但更糟的是,你可能都到了面试的阶段,也已经参加了一次甚至几次面试,一切都非常顺利,你的期望也非常高,结果……却没 有消息了(事实上,这种情况也并不少见)。

我们很难相信,人力资源部门的那些人真的就那么忙,甚至都抽不出30秒钟,给你发封电子邮件,告之你是否有戏。不过,退一步想,如 果这些人对待求职者如此无礼,你肯定也不会想与他们共事。

不过,我也得为人力资源部说句话,他们也的确招架不住了。首先,在很多公司,与其他部门一样,人力资源部裁员也很严重。人力资源管 理协会(Society for Human Resource Management)最近的调查显示, 2007年,人力资源部的平均雇员数是13人,而现在仅为9.2人。而一旦裁员达到30%,剩下的员工肯定是在苦苦挣扎。

而且,并非是人力资源部的职员不同情你的遭遇。他们很多人都尝过很长一段时间没有工作的滋味。人力资源管理协会进行了另一项调查, 调查的对象是在2009年失业的人力资源部职员(其中85%是被裁员)。该调查发现,在新近找到工作的受访者中,有47%的人用了6-12个月的时间,另 外27%的人则花了一年多的时间,而在那些受访时仍未找到工作的人中,只有18%的人预期将在6个月内找到工作,43%的人认为自己还得再花一年甚至更长 的时间。

最令人沮丧的是:在那些花了很长时间,终于在2009年找到工作的人中,有近一半(49%)的人表示更喜欢之前的工作。这份调查并 没有问及原因,但我猜应该是劳累过度的原因。人力资源部堆满了简历,可能应聘一个职位的简历就多达几百甚至数千份。你精心撰写的简历说不定就被埋在堆积如 山的简历中。人力资源部的雇员们好不容易才能看完简历,还哪顾得上体谅每位应聘者的心情。

那么,你应该如何应对这种情况呢?薇姿•巴奈特(Vicki Barnett)是一家位于丹佛的职业指导公司的负责人,该公司名为“梦想成真”(Make It Happen)。巴奈特表示,你不应该将简历发给人力资源部,而是应该把简历的电子版、纸质或是两种版本同时发给公司中比负责你所应聘职位的招聘经理高一 两级的主管。当然了,这种人肯定非常繁忙,所以他/她会把你的简历转给比自己低一两级的人,也就是真正负责招聘的人。

巴奈特说:“简历通过这种自上而下的方式,会更容易到达招聘经理手中。”假如是老板转发的你的简历,那么招聘经理在看简历时,肯定 会比人力资源部的十秒扫过式仔细认真得多。发送简历之后几天,你就可以打个电话问一下简历目前在谁手中,再问一下是否可以预约一次会面。

显然,这并不能保证你会被录取。但绕过人力资源部会给你带来一个很大的优势。巴奈特说道:“招聘经理都有自己的‘愿望清单’,但是 人力资源部的雇员并不了解其想法,因为招聘经理真正希望在应聘者身上看到的,往往是一些只可意会、难以言传的特质。”

人力资源部的职员通常做的,不过是试着把你简历上和职位描述中的关键词一一对应。巴奈特还说,如果职位描述中有15个关键词,而你 的简历里只有其中12个,你很可能就过不了简历关。然而,招聘经理却能看到简历中暗含的信息,巴奈特说道:“就算你简历中的关键词与职位描述不完全吻合, 你其它的经验和资质也可能会引起他们的注意。”

但愿如此。

--EOF--

看到这样的解释或许你会了解为什么你投的简历没有回音了,其实,在一些招聘网上,有些职位是无意义的,或者说别人是当成广告位来做的。每年也只需要投入几百元钱,就有一个访问量不小的广告位,何乐而不为?因此要仔细看好一个公司是否是真正在招人也是一件很重要的事情。

该文结尾的两篇相关文章也可以阅读一下:简历筛选的秘密和怎样找工作。