使用Synergy实现多台电脑共享一套鼠标键盘

公司闲置了一台电脑,开发的项目是在Ubuntu系统下配置的开发环境,而我开发的主要代码还是在windows下编写的,所以我使用synergy实现了两台电脑使用一套鼠标键盘的功能~这样自己就舒服多了~

Synergy是一款远程控制软件。一般的远程控制软件都是将服务器的画面提供给客户端使用, 而Synergy的创意很独特,它将客户端的键盘和鼠标提供给服务器使用。 这样如果你有多台电脑并且每台电脑都有自己的显示器,你可以通过 Synergy 用一组键盘和鼠标控制所有电脑, 而且每台电脑的屏幕可以连接起来,就像在同一台电脑上使用多个显示器一样。

Synergy可以运行在多个平台上,包括Unix/Linux,Mac OS X, Windows98/xp/vista/windows7,而且多台机器的操作系统不同也没有关系。唯一的要求就是这些机器都需要支持TCP/IP网络,彼此间可以通过IP访问。

Synergy使用教程

假设我们有三台电脑,分别为 computerA、computerB、computerC。 我们要使用 computerA(服务器) 的鼠标键盘控制这三台电脑,并且屏幕的布局如下。
synergy00

windows下安装基于Apache的SVN服务器

新本本是win7的系统,安装了PHPnow+SVN,可是配置Apache把我好折腾一遍~反了好多好多的文章,最后终于搞定了~今天特地把windows7(XP)下安装SVN+Apache配置的经验进行分享~
首先安装Apache+subversion ,怎么安装,就不要问我啦~网上教程多的去,可以使用xampp,或者PHPnow等……

1、httpd.conf的SVN安装配置

PS:如果你先安装Apache,再安装Subversion,正常情况下下面的复制工作,Subversion安装程序已经帮你完成了,不过为了安全期间,大家还是按部就班的检查遍吧~

  • 在配置httpd.conf 之前我们需要把加载的模块复制到Apache的modules目录下:
  1. 进入Sibversion的安装目录(通常为c:\program files\Subversion),找到文件httpd/mod_dav_svn.so和mod_authz_svn.so,将它们拷贝到Apache的 modules目录中es)。
  2. 从Subversion的安装目录拷贝文件libdb43.dll(或者libdb44.dll,根据自己的版本决定)到Apache的modules目录。
  • 编辑Apache的配置文件httpd.conf,找到以下内容:

    #LoadModule dav_fs_module modules/mod_dav_fs.so
    #LoadModule dav_module modules/mod_dav.so
    修改为:
    LoadModule dav_fs_module modules/mod_dav_fs.so
    LoadModule dav_module modules/mod_dav.so
    即去掉前面的注释符号“#”,没有上面两句,请自行添加。并且在LoadModule 之后添加如下内容:

使用Apache htpasswd.exe来管理SVN帐户

安装完SVN,需要配置到Apache,需要建立一个账户管理文件如:passwd,可是建立了passwd,需要添加SVN用户的时候,我们应该怎么操作呢?这时我们就要用到Apache下的DOS文件——htpasswd.exe啦!

1、htpasswd基本语法

htpasswd.exe在Apache文件夹下的bin中,htpasswd的基本语法是:

htpasswd [-cmdpsD] passwordfile username
htpasswd -b[cmdpsD] passwordfile username password

如我们要在G盘创建一个passwd的文件,需要用到下面的命令
htpasswd -c G:\passwd wyq
回车会出现提示,要你输入wyq的密码,输入两次后,就可以在G盘看到刚才我们创建的passwd文件了~其中密码是md5加密的~
如果我们不想输入密码,就可以直接使用下面的命令:
htpasswd -c G:\passwd wyq wyq

简单修改.htaccess来提高Yslow等级

最近一直在修改我的爱墙程序,其中对于Yslow的等级纳入了考虑,之前的空间不支持自定义htaccess文件,现在的空间支持自定义htaccess,在以前的文章中我写过一篇关于htaccess的文章,今天我在结合爱墙许愿送祝福http://love.js8.in)的网站,来说说通过修改htaccess达到Yslow优化,等级提高的方法,大家可以看看[http://love.js8.in](http://love.js8.in)的Yslow等级已经到了**B**,分数是85~87之间,由于网站使用了jQuery的FaceBox插件以及量子统计,所以等级有点降低,可是总体等级是不大会变的,其实我就是通过修改htaccess达到Yslow优化的,这是最直接的方法,不需要修改程序代码既可以提高Yslow等级~废话不说啦,进入正题吧。

简单修改htaccess文件提高Yslow等级优化

发布WordPress来访者天气预报插件

细心的童鞋会发现我的博客昨天添加了一个新的功能——天气预报,昨天我说要发布给大家的,晚上睡觉之前,想了很久关于WordPress天气插件的编写,基本上在晚上就已经理清了思路,早上很早就起床了,没有吃饭就来到公司,趁着大家还没有来的时候,我要在九点上班之前把WordPress来访者天气预报的插件做出来,加上之前开发的WordPress Follow5 插件开发经验,自己写WordPress来访者天气插件已经是轻车熟路了~

这个插件的使用的是jsonp技术,首先通过QQ的ip接口(http://fw.qq.com/ipaddress)获取到来访者的城市**地理信息**,然后使用WordPress的wp_footer的hook动态建立一个JavaScript文件,文件地址为我博客的[http://js8.in/weather/js.php](http://js8.in/weather/wordpress-weather “WordPress天气插件下载”),js.php返回的是一段JavaScript代码,代码使用innerHTML插入来访者天气预报的内容。

WordPress来访者天气预报插件采用精美的天气图标,完全DIV+CSS页面布局,保证了页面的美观大气,数据库信息来自中国气象网,保证了数据的可靠性,并且熟悉CSS的童鞋还可以修改插件中的CSS,以达到自己喜欢的页面效果。css地址为wp-content\plugins\weather\css.css

插件如不能正常使用,请看以下注意事项:

1、保证您的主题皮肤中的footer.php中存在do_action(‘wp_footer’);函数

2、如出现其他情况,请来插件页面报错
WordPress来访者天气预报插件截图

使用方法:

1、下载插件(点击下载)并上传到wp-content\plugins目录中;
2、登录网站后台安装此插件;
3、然后进入“外观”,“小工具”,把“Weather Widget”小工具拖到右侧,填写插件显示名称(如:天气预报)即可。

最后更新时间:2009-12-12 8:55

下载地址:http://js8.in/weather/vistor_weather.zip

当前最新版本为:0.1

推荐六个在线制作Loading图标的网站

经常来我的博客的而且细心的童鞋可以看见我的网站侧边栏加上了天气预报插件,这是我自己写的,代码稍后放出,写的时候需要一个Loading的gif,于是上网找生成Loading图标的网站,这里我推荐六个网站,希望大家喜欢~

1、Ajax Load

Ajax Load 在线loading图标制作网站

Ajax Load所提供的种类丰富,也可以自定义Loading图标样式,推荐!

2、Load Info

Load Info loading图标网站

Load Info在线制作Loading图标的免费网站,目前Load Info网站提供了90多种(总有一种适合你)动态图标。而且每种图标都自定义背景色和前景色,更有三种不同的尺寸可以选择,包括 16×16, 24×24, 48×46,很是方便实用。

设置htaccess应该注意的问题

今天给爱墙做SEO优化,发现自己没有自定义404页面,并且还发现存在index of列目录的漏洞,后来才知道原来WordPress都没有在htaccess中使用Options -Indexes来防止列目录,于是先加上了Options -Indexes来防止列目录的问题,自动转为了404错误,而不是403,呵呵~

可是我改变了爱墙的根目录下的htaccess配置把404页面指到了404.html,可是就是不能实现404页面的跳转呢?难道htaccess的404配置不可用?而是直接都返回到了爱墙的首页http://love.js8.in)~这样子听说对**SEO**是很不好的,搜索引擎不会收录网站的首页,于是上网google原因,找了半天的原因也没有找到问题的根本所在~

后来我在一片不起眼的文章中找到了问题的所在~

CSS 3.0 参考手册 (中文版)下载

原文来自:腾讯webteam

CSS 是 Cascading Style Sheet 的缩写。译作「层叠样式表」。是用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

手册难点

  1. 中文资料少,对英文翻译功底要求较高;
  2. 基础语法要求字斟句酌,避免产生歧义;
  3. 兼容性列表涉及浏览器及版本众多;
  4. 草案中的Grid布局被业界同仁普遍认为比“天书”还难…

CSS3 还是草案,中文资料少之又少,基本上都是一篇内容转来转去,而我们的手册从基础语法到示例制作,都是根据W3C工作草案进行翻译,并结合自身的沉淀制作示例。

备受期待的 CSS 3 新功能

圆角、多背景、@font-face 用户自定义字体、动画与渐变、渐变色、盒阴影、RGBa - 加入透明色、文字阴影等等
CSS3 的出现,让代码更简洁、页面结构更合理,性能和效果得到兼顾。

php、js两种不同方式根据关键词返回经纬度接口【基于Google map API】

P.S:在本文章中您将找到根据城市关键词获取经纬度的方法,即就是通过google map API的逆经纬度查询接口获得经纬度。
google map api是一个强大的地图API,很多知名的网站都是用了google地图API,曾经我也写过一个根据来访者甚至域名来查询经纬度的程序(http://js8.in/mywork/ipsearch)。文章链接地址为:根据IP返回地理位置地址以及地理经纬度的方法,关于经纬度的其他文章可以参考全国各省市,县级城市经纬度SQL数据以及js数组
其中使用的是纯真IP数据库,已经google地图的逆经纬度查询~
而本例中我们实现的主要方式是php如何获得关键字的经纬度。
使用过Google map API的人都知道google有一个逆经纬度查询的接口,例如:

geocoder = new GClientGeocoder();geocoder.getLocations(
          '山东青岛',
        function($){
var lalton = $.Placemark[0].Point.coordinates;
alert(latlon[0]+","+latlon[1]);
});```可是对于php应该怎样获取**经纬度**呢?
今天在无意的时候看到一个wp的插件,其中找到了方法,就是通过google map API的逆经纬度查询接口获得经纬度~
首先你需要去http://code.google.com/intl/zh-CN/apis/maps/signup.html申请一个google map api的授权域名**key**,
google的map api逆经纬度接口为:
http://maps.google.com/maps/geo?q=关键词(如山东青岛)&key=刚刚申请的API KEY&sensor=false&output=xml&oe=utf8
请求下来的数据时kml的数据格式,怎样解析呢?
<!--more-->我们可以使用**xml**的方式来进行解析,这里我提供一个解析的**php**代码,代码来自于wp的一个插件
第一个函数是xml2array(),这个函数的作用就是把xml转换为数组便于操作
参数$url为请求的xml地址,返回的是一个xml转换成的数组

```php
//from http://us3.php.net/manual/en/function.xml-parse.php
function xml2array($url, $get_attributes = 1, $priority = 'tag')
{
    $contents = "";
    if (!function_exists('xml_parser_create'))
    {
        return array ();
    }
    $parser = xml_parser_create('');
    if (!($fp = @ fopen($url, 'rb')))
    {
        return array ();
    }
    while (!feof($fp))
    {
        $contents .= fread($fp, 8192);
    }
    fclose($fp);
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($contents), $xml_values);
    xml_parser_free($parser);
    if (!$xml_values)
        return; //Hmm...
    $xml_array = array ();
    $parents = array ();
    $opened_tags = array ();
    $arr = array ();
    $current = & $xml_array;
    $repeated_tag_index = array ();
    foreach ($xml_values as $data)
    {
        unset ($attributes, $value);
        extract($data);
        $result = array ();
        $attributes_data = array ();
        if (isset ($value))
        {
            if ($priority == 'tag')
                $result = $value;
            else
                $result['value'] = $value;
        }
        if (isset ($attributes) and $get_attributes)
        {
            foreach ($attributes as $attr => $val)
            {
                if ($priority == 'tag')
                    $attributes_data[$attr] = $val;
                else
                    $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
            }
        }
        if ($type == "open")
        {
            $parent[$level -1] = & $current;
            if (!is_array($current) or (!in_array($tag, array_keys($current))))
            {
                $current[$tag] = $result;
                if ($attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                $current = & $current[$tag];
            }
            else
            {
                if (isset ($current[$tag][0]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    );
                    $repeated_tag_index[$tag . '_' . $level] = 2;
                    if (isset ($current[$tag . '_attr']))
                    {
                        $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                        unset ($current[$tag . '_attr']);
                    }
                }
                $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
                $current = & $current[$tag][$last_item_index];
            }
        }
        elseif ($type == "complete")
        {
            if (!isset ($current[$tag]))
            {
                $current[$tag] = $result;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                if ($priority == 'tag' and $attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
            }
            else
            {
                if (isset ($current[$tag][0]) and is_array($current[$tag]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    if ($priority == 'tag' and $get_attributes and $attributes_data)
                    {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    );
                    $repeated_tag_index[$tag . '_' . $level] = 1;
                    if ($priority == 'tag' and $get_attributes)
                    {
                        if (isset ($current[$tag . '_attr']))
                        {
                            $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                            unset ($current[$tag . '_attr']);
                        }
                        if ($attributes_data)
                        {
                            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
                }
            }
        }
        elseif ($type == 'close')
        {
            $current = & $parent[$level -1];
        }
    }
    return ($xml_array);
}

第二个函数getPoiAndAdd($address,$mapkey):
$address为查询的关键词,地址就可以啦,$mapkey为你申请的google map api key,
返回的是一个数组,其中包括了经纬度以及详细地址哦~

function gmshc_point ($address,$apikey){
    $find = array("\n","\r"," ");
    $replace = array("","","+");                    
    $address = str_replace( $find,$replace, $address);
    $url = 'http://maps.google.com/maps/geo?q='.$address.'&key='.$apikey.
         '&sensor=false&output=xml&oe=utf8';    
    $response = xml2array($url);    //此处调用都一个函数进行解析
    $coordinates = $response['kml']['Response']['Placemark']['Point']['coordinates'];
    $address = $response['kml']['Response']['Placemark']['address'];    
    if (!empty($coordinates)) {    
    $point_array = split(",",$coordinates);    
    $point = $point_array[1].",".$point_array[0];
    $response = array('point'=>$point,'address'=>$address);    
    return  $response;    
    }
}

jQuery浏览器判断一个bug,以及修改建议

前几天在使用jQuery(1.3.2)的时候,想使用下浏览器判断$.browser,可是我在使用$.browser.safari的时候,发现一个问题:
就是chrome浏览器也走$.browser.safari的判断,查看了jQuery的源代码:

var userAgent = navigator.userAgent.toLowerCase();
jQuery.browser = {
    version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
    safari: /webkit/.test( userAgent ),
    opera: /opera/.test( userAgent ),
    msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
    mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};```<!--more-->
经过同事**修改**后的代码是:
```javascript
var browserName = navigator.userAgent.toLowerCase();
mybrowser = {
    version: (browserName.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [0, '0'])[1],
    safari: /webkit/i.test(browserName) && !this.chrome,
    opera: /opera/i.test(browserName),
        firefox:/firefox/i.test(browserName),
    msie: /msie/i.test(browserName) && !/opera/.test(browserName),
    mozilla: /mozilla/i.test(browserName) && !/(compatible|webkit)/.test(browserName) && !this.chrome,
        chrome: /chrome/i.test(browserName) && /webkit/i.test(browserName) && /mozilla/i.test(browserName)
}

完全可以使用,并且防止了safari跟chrome混淆的