最近百度销售经常打我电话,我已经再三强调我肯定不会用百度的产品,并且再三强调将我的电话删掉,以后不要再打过来,但是他们还是三番四次打过来,太TMD恶心了。
百度自己的产品,是出了名的烧钱产品,而且百度还会做虚假点击,恶意竞价,让客户投钱无止尽,就连当当和京东这两个势不两立的公司,也都表示再也不用百度产品,可想而知百度的产品有多烂。最近连央视都在曝光百度的黑幕,我怎么可能会用你们的产品。我已经向你们明确表示肯定不会用,为什么你们还打电话给我?可见狗日的百度公司内部管理有多混乱。
如果百度做到谷歌或者腾讯这个规模的话,中国互联网行业将是一片黑暗。
感谢360,阿里巴巴,新浪,盛大等公司,制衡着互联网行业一家独大的局面。
Ferris
Apache的.htaccess可以实现rewrite功能,而放在Hostgator主机上的.htaccess文件需要有特殊的格式,否则不被支持。我先写一个示例,然后说明和常规的.htaccess有哪些不同
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /~coffeecat
RewriteCond -----------HIDDEN------------
RewriteCond -----------HIDDEN------------
RewriteRule -----------HIDDEN------------
SetEnv mod_rewrite_enabled 1
</IfModule>
1:加上<IFModule>标签,表示这块属于rewrite模块的配置
2:RewriteBase后面需要写Hostgator的帐号,比如上面的coffeecat就是我的帐号
3:最后加上SetEnv mod_rewrite_enabled 1,表好似开启rewrite模块
中间的代码和原来.htaccess的代码是一致的。
Ferris
2011-08-12
状况:PHP安装成功,extension_dir配置也正确,php_curl.dll也在那个dir中,能打开phpinfo,并能看到其他成功加载的extension,但是就是curl组件没有被加载。
原因:系统没有加载curl需要的两个dll
解决方法:复制PHP目录下的libeay.dll和ssleay.dll到c:\windows目录下即可。
Ferris
1:关闭Dreamweaver CS4
2:删除 C:\Documents and Settings\[Your Name]\Application Data\Adobe\Dreamweaver CS4\zh_CN\Configuration 目录下的 WinFileCache-*.dat 即可
Ferris
2011-07-14
今天对MySQL数据库进行了物理拷贝,遇到一个棘手的问题,MySQL能正常启动,不过打开数据表的时候,提示Unknow Table Engine InnoDB.
错误提示很明显是没有加载InnoDB。在网上找了一下,基本上有两种方法:
1:注释掉skip-innodb选项
2:删掉两个 ib_logfile* 文件
不过这两个方法都没用。我查看了MySQL的错误日志,发现有以下提示:
InnoDB: Error: log file ./ib_logfile0 is of different size 0 25165824 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
原来我拷贝过去的log文件最大是24MB,而MySQL默认的配置是5MB,这两个数值不统一,导致了InnoDB启动时出现了错误。
解决方法:修改MySQL的配置: innodb_log_file_size = 24M 。其中24M对应的就是你的logfile的大小。
Ferris Xu
2011-04-05
先看一段典型的CURL POST的代码:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
curl_close($ch);
这段代码提交出去的Content-Type到底是multipart/form-data还是application/x-www-form-urlencoded呢?我抓包研究了一下,发现Content-Type的类型取决于
$data的数据类型。
如果$data是字符串,则Content-Type是application/x-www-form-urlencoded。
如果$data是k=>v的数组,则Content-Type是multipart/form-data
Ferris Xu
2011-3-9
虽然Google的服务器访问速度很快,但如果每个页面都增加google jsapi的js调用,肯定会降低网页打开速度,是否可以等到网页打开以后,再加载google jsapi呢?
答案是肯定的,我们可以用Javascript来动态加载Google JSAPI,参考以下示例程序
function mapsLoaded() {
var map = new google.maps.Map2(document.getElementById("map"));
map.setCenter(new google.maps.LatLng(37.4419, -122.1419), 13);
}
function loadMaps() {
google.load("maps", "2", {"callback" : mapsLoaded});
}
function initLoader() {
var script = document.createElement("script");
script.src = "http://www.google.com/jsapi?key=ABCDEFG&callback=loadMaps";
script.type = "text/javascript";
document.getElementsByTagName("head")[0].appendChild(script);
}
以上代码有2处关键点:
1:
加载google jsapi的时候,需要附加参数callback=loadMaps,表示api加载完成以后,google需要回调的函数。注意,仅仅加载了api,还不能使用google的具体的功能,需要使用google.load函数加载具体的模块才行。
2:当使用google.load的时候,需要增加callback参数,否则网页可能会直接跳转到空白页。这里的callback参数是指加载完指定的模块以后要回调的函数。
Ferris
2010-08-30
今天遇到一个问题,我有一个页面叫test.php,这个页面需要执行5秒。我用Firefox以很快的速度先后打开了2个test.php,第1个页面执行了5秒返回了,第2个页面是在第1个页面返回后执行了5秒返回,所以总的时间是10秒。这就奇怪了,为什么第2个页面会等第1个页面执行完了才执行呢?莫非两个页面有资源竞争?后来经过了测试,总算发现了问题的所在,这个问题不是PHP或者Apache造成的,而是Firefox浏览器造成的。原因应该是Firefox的缓存机制,当访问完全一样的URL时,后面的URL访问会被挂起,以便可以从本地直接访问第1个URL下载过来的资源,加快访问速度。
为了证实这个问题是由firefox造成的,我进行了2种测试:
1:我用IE浏览器同时打开2个test.php,这2个页面几乎同时返回,没有等待。
2:我给页面加上URL参数,构造两个访问同一页面但不相同的URL,如test.php?t=1和test.php?t=2,然后几乎同时访问该页面,2个页面几乎同时返回,也没有等待。
所以这个问题和PHP无关,是浏览器的行为造成的,我测试了一下,Google Chrome也是这样,可能Safari也是这样的。因此用其他编程语言的朋友应该也会遇到类似的问题。最好的解决方法就是加上一个无意义的参数,构造两个不一样的URL来访问,参考测试2。
Ferris Xu
2010-08-06
今天用Outlook Express发邮件的时候,总是在发送快结束的时候出现如下错误信息
The message could not be opened from out Outbox folder. Account: 'pop.gmail.com', Server: 'smtp.gmail.com', Protocol: SMTP, Port: 25, Secure(SSL): Yes, Error Number: 0x800420C8经过测试,发现邮件实际上已经发送出去了。最后我朋友发现问题是Outlook的Sent Items满了,所以从outbox移动到sent items出错了。
解决方法:删除一些Outlook发件箱里的邮件即可。To solve this problem: delete some mails in your sent items.Ferris Xu
2010-03-08
最近参与了一个项目,我的同事在开发一个ActiveX对象,我帮他编写JS脚本来调用这个对象,其中碰到蛮多问题,最难的就是如何响应由ActiveX对象返回的对象事件。正好,现在一起总结一下。
首先,我来介绍一下COM组件,以便说明js如何响应
COM组件
方法:
void init() //初始化对象
Project createProject() //创建一个Project类型的对象并返回
事件:
onInit( int_code ) //当init成功后触发
Project类的结构:
方法:
void init() //初始化Project对象
事件:
onInit( int_code ) //当init成功后触发
然后,我们在网页里创建一个ActiveX对象
<object id="myobj" classid="CLSID:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"></object>
然后,我们定义全局的变量obj和project,来保存对象的实例,并调用他们的相关方法
var obj = null; //全局对象
var project = null; //Project对象
window.onload = function(){
obj = document.getElementById('myobj'); //获取对象
obj.init(); //初始化对象
project = obj.createProject(); //创建project对象
project.init(); //调用project对象的方法
};
最常见的对象事件响应方法最常见的莫过于使用script event for的标签语法来响应对象事件了,Windows Media Player就是这样做的
<script language="Javascript" event="onInit( code )" for="myobj">
if ( code == 0 )
{
//Todo:
}
</script>
for属性指定了这个事件响应的对象是myobj,注意,这里要写object标签的id,不能是js变量
event属性指定了要响应哪个事件,这里是onInit事件。
如何响应ActiveX对象返回的对象事件现在问题来了,我们调用了createProject方法,得到了一个project对象。这个对象也有事件,那么这时应该如何来响应呢?
显然,用之前的script event for的方法是不行的,因为for属性不能指定js变量的值。网上搜索了一下,找到了一种很特别的方法,就是用双冒号来定义函数名,于是,修改程序如下:
var project = obj.createProject();
function project::onInit( code )
{
if ( code == 0 )
{
//Todo:
}
}
不过,运行后有报错,说project未定义,想起来,js会优先执行function这个函数定义,也就是说先定义函数,然后才执行语句。所以,function必须在project创建成功以后才能定义,因此,修改程序如下:
var project = createProject();
var fn = function(){ //定义一个函数,这个函数内部会定义我们的回调函数
//回调函数
function project::onInit( code )
{
if ( code == 0 )
{
//Todo:
}
}
};
fn(); //执行这个函数,也就是定义回调函数
运行了一下,确实能响应了。
后记不知大家看到
function project::onInit( code ) 这样的写法,是不是觉得很奇怪?我看到这种写法以后,很吃惊,因为我从没看到过javascript有这样的语法,这看上去像是定义一个静态函数,又像是在project命名空间中定义一个函数。于是我测试了一下,发现firefox并不能识别这样的函数定义,会报语法错误,说明这个不是标准javascript的写法,是IE-Only的写法。难道是JScript的语法?我又把JScript的手册从头到尾看了一遍,也没看到类似的语法。上微软的MSDN,也没有找到双冒号的语法参考。不过,我在一个论坛里,看到了这样一段话
A second script block that defines your event handler based on the
global variable. This has to be a separate script block, and the
object has to be defined before this script block evaluates. Syntax is
"function object::Event(params)", where "object" is the name of the
variable containing the object, "Event" is the name of the even to
which you're subscribing, and "params" is the set of parameters the
event handler expects.
|
或许这种写法就是为了实现ActiveX的event handler而准备的吧
Ferris Xu
2009-10-30