最近360和QQ掐架掐得不亦乐乎,中国互联网这个江湖,向来都少不了恩怨情仇。脸红脖子粗的事情太小了,以至于并不被乐见。脱光了衣服裤子互相干,把对方还原成婊子,那才是一个媒体欢喜的刀光剑影的江湖。老喜欢看他家掐架而自己隔岸关火的腾讯这次充当了主角,不知道是如何嘀咕的呢。

可惜我偏题了,我写的是WebQQ 2.0,和打架无关。有评论说WebQQ 2.0是腾讯Web OS的一个雏形,预证着QQ即将在浏览器端发力。相对于腾讯高远的战略决策,我关心的是办公室下班以后是不是不用再面对稍显畸形的WebQQ 1.0。失信打开了WebQQ 2.0(呜呜呜,说了出差回来前不登QQ,还是上来了),感觉WebQQ 2.0界面上不只是上了一个层次。虽然WebQQ2.0据说也抄袭了国外的产品,但必须得佩服QQ的产品研发。我用的是火狐3.0,没有明显的不兼容的操作。这点拉开了上海中国移动那个大垃圾网站不是一般的差距(题外话,移动的网站用了两个个iframe,连IE8都支持不了,页面显示特慢,只显示头部,更别提火狐、chrome了。为此我专门下了个IEtest用IE6核心,还老弹对话框,提示网站JS缺少对象,依旧用不了)。又跑题,呜呜。把截图上来吧。

WebQQ2.0系统截图

总体类似于windows 7的风格,乍看是让人眼睛一亮。色彩比较鲜艳,但搭配起来非常舒服。WebQQ2.0由上中下分为导航栏、主体、工具栏。WebQQ2.0导航栏列了QQ最常用的几个产品,如邮箱,空间,影音,音乐等。其右方有一个按钮,点击之后会显示更多的应用,而且这些应用所在的层的背景是透明的。WebQQ2.0主体部分除了一个QQ登陆框以为,还有一个时间、天气小工具。另外,就是个SoSo的按钮,可以看到腾讯是在各种场合力推SoSo搜索。WebQQ2.0最下方为工具栏(各种设置按钮居多),分别有帮助、声音、输入法、显示桌面等按钮。

登陆后,其界面如下:

WebQQ2.0系统界面

用户体验比WebQQ1.0好多了,很好的整合了空间,很方便的浏览自己和好友的空间更新。浏览朋友和自己的空间时,Ajax技术大量运用让用户可以不影响浏览效果而随时更新。好友聊天时,工具栏左方会显示该好友和你聊天的状态,如有消息会提示。其他各种功能也是整合得相当不错,如邮箱、微薄,让你可以在一个浏览器窗口用遍QQ的产品,省去了浏览器窗口切换的麻烦。顺便提一下,各种窗口都有最大化和最小化、全屏按钮,各窗口的层序也可以通过单击调换,这点就让你感觉是在PC端使用软件一般,非常受用。

初初使用,感觉非常不错。虽然说腾讯是模仿之王,但其在产品研发的功力国内的确无人出其左右。强劲的产品研发,加无敌的财力,这也是所谓的狗日的QQ的来由。如果腾讯能够在这个类Web OS的产品向第三方开发,成为一个开放的应用平台,和FaceBook之类的平台绝对有得一拼。可惜的是,唯一的一个外部应用Gmail首日就因为安全问题被下线了,其开发的前景至少在WebQQ2.0产品完善之前不容乐观。再者,腾讯是否真愿意放下身段做一个开放平台,还是仅仅让WebQQ2.0成为一个自家的产品集合器,这是一个除却技术之外更大的问题。可以肯定的是,若WebQQ2.0继续走封闭道路,腾讯只会延续PC端的角色,继续做互联网公敌。其导航栏这么明显的放着新近推出的QQ地图、QQ阅读的功能按钮,是不是在昭示着腾讯依旧在走产品大全这条路线呢~~~嘿嘿,“狗日”的腾讯,不变的公敌。

虽然,WebQQ2.0缩小了和PC端QQ的体验,但还是有差距的。就比如说,我想截图,PC端的Ctrl+Alt+A就不管用了,搜索了一下貌似WebQQ2.0还没有这个功能,只好用笔记本的printscreen代替了。另外,各个应用窗口虽然集合在了一个浏览器窗口中,而且调换方便,但毕竟每个应用窗口只能占一部分屏幕界面,还是不如单独占一个浏览器窗口方便。

QQ和360打口水战,用各种手段和360对抗,还不如安心的把每一个产品做好。把QQ安全卫士各种用户体验做到极致,这是对抗360最好的法宝。通过诋毁360利用黄色网站推广360安全浏览器,虽然直击奇虎的盈利命脉,手段是狠,但毕竟显得小家子气。通过强行默认安装QQ安全卫士,更是让人对这个最大市值的中国互联网公司大感失望。360虽然不见得很光彩、不见得真正替网民服务,但凭借其用户体验、其免费的策略、其一路和金山、百度等恶斗下来积累的经验,还真不是一个好对付的对手。当腾讯通过默认安装QQ安全卫士的方式威胁360客户端的地位时,无怪360会跳出来咬你。

体验WebQQ2.0: http://web2.qq.com/

今天看了下谷歌的Google maps 官方文档及自己买的参考书。开始构造自己的工程,不准备一个个例子敲了。今天总结如下。
Google maps单击鼠标左键会在搜索框里面出现所在点的经纬度。自己尝试了下。其实挺简单的。只不过换了个容器,不是input而是div,另外单击地图时,会在该点打个图标。代码如下:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”   “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml” xmlns:v=”urn:schemas-microsoft-com:vml”>
  <head>
    <meta http-equiv=”content-type” content=”text/html; charset=utf-8″/>
<title>Google Maps JavaScript API Example</title>
<!–导入Google Maps API库文件。注意将本代码中的API Key替换为前文申请到的API Key–>
<script src=”http://maps.google.com/maps?file=api&amp;v=3&amp;key=ABQIAAAApKmTc0YujeR_D6rZMiO5yBStynum23X3q7OIuK-h6n3SRzaMGBRxe-vZpao4uH-bVbQoLlG3aQ2ftg” type=”text/javascript”></script>
<script type=”text/javascript”>
//<![CDATA[
    var map;
   
    function load()
    {
      if (GBrowserIsCompatible())
      {     
         var map = new GMap2(document.getElementById("map"));   
         var centerPoint= new GLatLng(30.5301246314748,114.35572385787964);
         map.setCenter(centerPoint, 17);
        //响应地图的单机事件
         GEvent.addListener(map, 'click', function(overlay,  point) {
                           if(point){
                                         var lat=point.lat();//经度
                                         var lng=point.lng();//纬度
                                          var marker = new GMarker(point);
                                          map.addOverlay(marker);//添加图标
                                          var LatLng=document.getElementById("LatLng");//获取容器
                                           LatLng.innerHTML = lat+","+lng;//显示经纬
                           }
                         });
      }
    }
   
//]]>
    </script>
  </head> 

<body onload=”load()” onunload=”GUnload()”>  <div id=”map” style=”width:100px;heigth:50px”></div>
        <div id=”LatLng”></div>
  </body>
</html>

效果如下:

Google_Maps_API示范效果

Google_Maps_API示范效果

另外,发现Google maps的缩放按钮非常好看,但按谷歌官方文档说添加的缩放按钮都非常难看。于是用firebug看了下Google maps的官方示例,原来Google自己偷偷的给页面加了下面的这些代码。

 var customUI = map.getDefaultUI();
   // Remove MapType.G_HYBRID_MAP
   customUI.maptypes.hybrid = false;
   customUI.maptypes.normal = false;
   map.setUI(customUI);

把这些加在上文onload函数里面的 if判断。左上方就出现了漂亮的缩放按钮了,示范效果如下:

Google_Maps_API_2示例

Google_Maps_API_2示例

嘿嘿,要加快进度了。还有最后的一段时间了啊。

今天下午弄ajax的二级联动菜单,搞得人纠结死了。火狐很好,但IE就是出问题。没有办法只有百度了。但找来的都是在IE下实现的,火狐却不行。于是自己总结了下,贴出以下代码。

以下为HTML代码,要实现效果为点击第一个下拉菜单form1,第二个菜单form2的内容随之改变。form.html:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>AJax 二级菜单</title>
<script type=”text/javascript” src=”form.js”></script>
</head>
<body>
<select name=”form1″ onchange=”process()” id=”form1″>
<option value=”1″>文理学部</option>
<option value=”2″>信息学部</option>
<option value=”3″>工学部</option>
<option value=”4″>医学部</option>
</select>
<select id=”form2″>
<option value=”1″>11</option>
<option value=”2″>12</option>
<option value=”3″>13</option>
<option value=”4″>14</option>
</select>
</body>
</html>

接下来为 form.js代码:

// JavaScript Document

var xmlHttp = CreateHttpObject();

//生成xmlHttp对象

function CreateHttpObject() {

var xmlHttp;

if (window.ActiveXObject) {

var XmlHttpVersions = new Array(“MSXML2.XMLHTTP.6.0″, “MSXML2.XMLHTTP.5.0″, “MSXML2.XMLHTTP.4.0″, “MSXML2.XMLHTTP.3.0″, “MSXML2.XMLHTTP”, “Microsoft.XMLHTTP”);

for (var i = 0; i < XmlHttpVersions.length && !xmlHttp; i++) {

try {

xmlHttp = new ActiveXObject(XmlHttpVersions[i]);

} catch(e) {

xmlHttp = false;

}

}

} else {

try {

xmlHttp = new XMLHttpRequest();

} catch(e) {

xmlHttp = false;

}

}

if (!xmlHttp) {

alert(“Error creating the XMLHttpRequest object.”);

} else return xmlHttp;

}

//定义选择第一个菜单时执行的函数,process()

function process() {

if (xmlHttp) {

try {

var value = document.getElementById(“form1″).value;

//将第一个下拉菜单的值作为参数传给form.php

xmlHttp.open(“GET”, “form.php?value=” + value);

//状态OK 则执行 ReadyChange 函数

xmlHttp.onreadystatechange = ReadyChange;

xmlHttp.send(null);

} catch(e) {

alert(“Can’t connect to server;\n” + e.toString());

}

}

}

function ReadyChange() {

if (xmlHttp.readyState == 4) {

if (xmlHttp.status == 200) {

try {

handleServerResponse();

} catch(e) {

alert(“Error reading the response:” + e.toString());

}

} else {

alert(“There was a problem accessing the server;” + xmlHttp.statusText);

}

}

}

function handleServerResponse() {

//接受PHP生成的xml文件

var xmlResponse = xmlHttp.responseXML;

//以下判断 xml文档结构是否合格

if (!xmlResponse || !xmlResponse.documentElement) throw (“InVALID xml structure:\n” + xmlHttp.responseText);

var ResponseRoot = xmlResponse.documentElement.nodeName;

if (ResponseRoot == “parsererror”) throw (“InVALID xml structure:\n” + xmlHttp.responseText);

//xml根元素

var xmlRoot = xmlResponse.documentElement;

//接收xml文件中 oValue,oText 元素的值

var OptionValue = xmlRoot.getElementsByTagName(“oValue”);

var OptionText = xmlRoot.getElementsByTagName(“oText”);

var Form2 = document.getElementById(“form2″)

var i = 0;

if (window.ActiveXObject) { //若为IE,执行以下循环

Form2.options.length = 0;

for (; i < OptionValue.length; i++) {

var option = new Option(OptionValue[i].firstChild.data, OptionText[i].firstChild.data);

try {

Form2.add(option);

} catch(e) {}

}

} else { //若不为IE,执行以下循环

var htmlw = “”;

for (; i < OptionValue.length; i++) {

htmlw += “<option value=” + OptionValue[i].firstChild.data + “>” + OptionText[i].firstChild.data + “</option>”;

if (i == (OptionValue.length – 1)) Form2.innerHTML = htmlw;

}

}

}

以下为 form.php代码:

<?php

header( ‘Content-Type:text/xml’);

$value=$ _GET[ 'value'];

$dom=new DOMDocument();

$option2=$ dom->createElement(‘option2′);

$dom->appendChild($option2);

$i= $value*10+1;

for($i; $i<$value*10+5 ; $i++) {

$option1=$ dom->createElement(‘option1′);

$oValue = $dom->createElement(‘oValue’);

$oText= $dom->createElement(‘oText’);

$titleText1 = $dom->CreateTextNode($i);

$titleText2 = $dom->CreateTextNode($i);

$oValue->appendChild($titleText1);

$oText ->appendChild($titleText2);

$option1->appendChild($oValue);

$option1->appendChild($oText);

$option2->appendChild($option1);

}

$xmlString = $dom->saveXML();

echo $xmlString;

?>

以下为图片效果示例:

IE选择之前效果

IE二级菜单联动效果

IE二级菜单联动效果

IE二级菜单联动效果

火狐二级联动菜单效果

火狐二级联动菜单效果
火狐二级菜单联动效果

火狐二级菜单联动效果

前言:终于开始了。有些事情总是喜欢拖,今天又看了一节《致加西亚的的信》,里面说战胜拖延的最好方法是不让自己有拖延之机会。的确,想做什么了,就要冲着激情,不然永远都会拖到明天。

本系列文章谈的是Google Maps API 的二次开发,其实也就是自己的学习笔记,就算充实博客的料吧。文章内容会有参考《Google API 开发详解:Google Maps 与 Google Earth 双剑合璧》及Google 官方开发手册。特作说明。

1.开门江山,使用Google API必须申请一个KEY,申请地址如下:http://code.google.com/intl/zh-CN/apis/maps/signup.html 。填入域名或者IP,就可以取得相应的KEY。本人用的是 http://localhost/maps。

2.申请了KEY以后,就在自己新建的htm页面中导入Google Maps API库文件,在 head标签之间加入<script src=”http://ditu.google.cn/maps?file=api&amp;v=2&amp;key=XX&sensor=false”
type=”text/javascript”></script>。其中 v代表API 版本,key后面的XX替换为自己申请的KEY即可。Sensor有ture和false两个选择,代表是否选择外部仪器定位,如GPS。

3.在body标签之间加入容器。<div id=”map” style=”width: 1000px; height: 500px”></div>.该DIV用来显示地图。修改body标签如下,<body onload=”initialize()” onunload=”GUnload()”>.其中GUnload()为官方防止内存泄露定义的函数。initialize()为自定义函数。

4.定义initialize()函数如下:
<script type=”text/javascript”>
function initialize(){
if (GBrowserIsCompatible()) { // GBrowserIsCompatible()为检查浏览器兼容性的官方函数  
var map = new GMap2(document.getElementById(“map “)); //GMap2(container,opts)函数第一个参赛为产生地图的容器,即上一步骤中id=map的div。Opts暂时忽略。 该行创建GMAP2对象。
var geoPoint0 = new GLatLng(30.533008,114.357934);//将GLatLng()两个参数为经纬度
map.setCenter(geoPoint0, 13);//将经纬为(30.533008,114.357934)的点设置为地图中心,缩放级别为13
map.addControl(new GMapTypeControl()); //通过addControl()函数往地图中添加(地图类型控制控件)GMapTypeControl()控件
map.addControl(new GSmallMapControl());//添加精简地图控件
map.addControl(new GScaleControl());//添加比例尺控件
var marker0 = new GMarker(geoPoint0, {title: “hello world”}); //在geoPoint0点定义title属性,鼠标移动到该点时,显示title属性(和a标签的title类似)
map.addOverlay(marker0); //显示自定义了图标的地标对象
}
}
</script>

5.保存你的文件为example.htm,浏览。在浏览器地址输入你的域名,比如我的就是http://localhost/maps/example.html。就会看到效果如下:

Google maps  API 开发示例

Google maps API 开发示例

写在最前:
生活中的重点应该是毕设和软考,却又被两个网站给打扰了。所以,嘿嘿,最近抱怨不少。反省。也许不抱怨的世界,才会让自己做事更有效率,更有激情。

PHP上传文件是一直就掌握了的,但上面提到的一个网站要求上传视频,动不动就超过100M。于是问题就出现了。页面点击上传后,浏览器下方的进度条慢慢的从0到20%左右,然后突然直接到100%,页面出现空白。查看文档,视频没有上传成功。呵呵,只有百度。总结如下:

第一步,检测系统变量。php.ini里面有几个设置是会影响到PHP的上传文件操作的。第一个是:’post_max_size’,顾名思义,也就是表单提交的数据最大值 。第二个:’upload_max_filesize ‘,也就是上传的文件最大值。第三个就是’max_execution_time’,脚本最长运行时间,超过时间则页面空白了。三个变量可以通过如下代码检测出来:
<?php
   echo ‘post_max_size = ‘ . ini_get(‘post_max_size’) . “\t”;//提交的数据最大值
   echo ‘upload_max_filesize = ‘ . ini_get(‘upload_max_filesize’) . “\t”;//上传的文件最大值
  echo ‘max_execution_time = ‘ . ini_get(‘max_execution_time’) . “\t”;//脚本最长运行时间
?>
经过检测,本机上的结果如下:post_max_size = 128M upload_max_filesize = 128M max_execution_time = 60 。(当然,你也可以直接在php.ini文件里面查找该参数,嘿嘿)我的问题就出现在允许文件只有128M,且脚本运行时间只有60s。

第二步,解决方法。在PHP安装文件的目录找到php.ini文件。查找并修改一下参数:post_max_size = 1280M 。upload_max_filesize = 1280M 。max_execution_time=60。重启Apache,然后就可以在开始的那个测试页面看到修改后的参数了。其中,max_execution_time参数可以修改为0,表示脚本运行时间不受限制。但我没有直接在php.ini修改max_execution_time,因为那毕竟是全局的,而是在上传处理页面添加函数 set_time_limit(0)(注意,这个我是放在PHP代码第一行的),其作用同max_execution_time=0,但仅限于上传处理页面。另外还有一种方法,在页面中加入ini_set(“max_execution_time”, 0),但我没有试。呵呵,偷懒了。

经过折腾,一切就可以了啊。可以上传超大附件了。嘿嘿,学习万岁。

今天装了firefox及firebug,可是用了几次,关了几次机后,不知道为什么Firefox无法启动了,双击软件无任何反应。启动了任务管理器,有一个firefox进程在活动,但所占CPU为0。怀疑中毒,查毒无毒。尝试在任务管理器中关闭firefox进程,再次运行火狐发现,在任务管理器的应用程序中,firefox会出现但马上消失了。

没有办法,只好卸载火狐,重新安装,但无济于事。汗死了。只好百度了。

firefox无法启动大多数都是在linux下面碰到的,我是Xp,囧。还好网友在http://anling.blogbus.com/logs/24003633.html 页提到了很好的解决办法。如下:

删除一个叫profile的文件及文件夹。这个文件一般在:C:\Documents and Settings\Administrator\Application Data\Mozilla\Firefox 目录下。如果你当前登陆的用户名不是 Administrator,目录也相应改变到你的当前用户的目录。

如果无法删除,在任务管理器中中断firefox进程,再删除。然后重启火狐。一切OK吧,呵呵,如果还不好,那就是人品了

欢迎访问climber01.com的空间

写在最前:本博客从4号开始发文章,自今天正式被百度,谷歌收录。哈哈。首先高兴一番。

作为一个菜鸟,自己首先想到的是怎么样让百度和谷歌收录自己的博客。所以在网上查了很多文章。也做了初步尝试。以下的文字权作自己的小总结。

首先向百度和谷歌提交自己的网站。谷歌的提交地址是:http://www.google.com/addurl/?hl=zh-CN。百度的提交地址是:http://www.baidu.com/search/url_submit.html 。呵呵。作用就不说了。搜索虽然智能,但自己再主动点,引擎当然更青睐。

其次,在权重比较高的网站上贴自己的网址,让人点击进来,让引擎更快捕捉你的网址。比如说,我就在百度知道、百度空间、天涯问答、腾讯问问等贴了自己的网址博客:http://climber01.com/。当然张贴自己的地址的同时,通过提问诱导用户点击进去个人主页当然更好。如我的提问:http://zhidao.baidu.com/question/146126727.html?push=ql 。通过直接点击进来的用户占了起初流量的很大一部分。当然准确来说,更应该在和自己主题网址相关的BBS,网址发帖,但因为时间关系我没有进行此工作。经过发帖,发现如下规律。

1.百度里面,腾讯问问的权重很高。在腾讯问问里面提的问题不到半小时就被收录了 。但天涯至今还没有收录。

2.Google里面,权重排名依次是 百度知道,百度空间,搜搜问问,天涯。

再次,申请一个网址统计工具。我申请的是CNZZ的工具。通过流量分析可以对自己网站推广下一步工作起到很好的作用。从来源分析来说,流量主要来自百度,虽然谷歌收录的网址远远大于百度,但从谷歌来的并不多。也就印证了做网站不要得罪百度的说法。百度,神也。

还没有进行的工作如下:

1.在和自己网站相关度高的网站发帖。或者喊软文。

2.内容为王,境界最高的SEO就是不用SEO。所以准备加强内容建设,抓紧推出一系列与Google maps 、Webgis、二次开发为关键词的技术文章。

3.互换链接。参观了此文的文章的各位仁友们可以把网站地址留下,争取互换链接呀。

总之,建站不易。网站怎么更快被搜索引擎收录是个很重要的问题。一切只有靠不断的努力,不停的摸索了,我想不要放弃就好了。百度,谷歌,你就是俺的上帝。

(话到最后,谢谢点击我的博客:http://www.climber01.com,高兴留下你的足迹)

© 2011 听说 Suffusion theme by Sayontan Sinha