ubuntu 9.04 screenshot

今天有点兴致,就给ubuntu升级到了9.04。
目前比较少用ubuntu了,新版本的发布也不太了解了,呵呵。不过今天升级成功后,发现自己很喜欢那个登录界面!ubuntu的界面真是一个版本比一个版本漂亮!

无线网络
无线网络

发一个登录界面的截图:

gmd登录界面截图
gmd登录界面截图

附上ubuntu登录界面的截图方法:

chvt 7; sleep 9; XAUTHORITY=/var/lib/gdm/:0.Xauth DISPLAY=:0.0 import -window root /home/sp/gdm-shot.png

想要记住这么长的命令不容易,可以先把它写到一个bash文件,再用root身份执行。

screenshot.sh文件内容:

#!/bin/bash
chvt 7;
sleep 9;
XAUTHORITY=/var/lib/gdm/:0.Xauth DISPLAY=:0.0 import -window root /home/sp/gdm-shot.png

#—END OF FILE—

执行它:

chmod +x screenshot.sh
./screenshot.sh

或者直接更简单的方法:

cat > tmp
chvt 7; sleep 9; XAUTHORITY=/var/lib/gdm/:0.Xauth DISPLAY=:0.0 import -window root /home/sp/gdm-shot.png

// 这里按CTRL+D结束编辑

# sudo su
# eval `cat tmp`

当然tmp文件也可以用其他编辑器创建!

–EOF–

小心对待rewrite中邪恶的百分号(%)

今天遇到一个非常诡异的问题。

我目前是采用 /key1/value1/key2/value2 方式传递参数,非常干净明了。但是今天我试图传递一个urlencode过的字符串时发现,只要URI里带有百分号%,就会导致Apache服务器400错误,警告说“错误的请求”。

/key1/value1/key2/value_with_%_symbol    400 error

/key1/value1/key2/value_without_symbol    200 OK

查阅手册后,发现%是rewrite语法中的特殊字符,会认为是一个变量的开始,就像PHP中的美元符号$。

经测试,很多知名站点也没有解决这个问题,如WP,discuz,osnews等等。

目前找到一个解决方案,但情况有点不太一样,所以也没有测试成功。链接地址:http://stackoverflow.com/questions/734654/modrewrite-doesnt-work-for-a-url-beginning-in-percent-sign

临时解决方案:/key1/value2/?key2=evil_value2 即换回传统的方式来解决问题。

特留此文,以后找到方案时更新。

Unix-Center.Net needs your help!

Unix-Center.Net的目标是为研究、学习和使用各种版本的Unix和类Unix操作系统的教师、学生和工程技术人员提供一个体验和测试各种版本的Unix和类Unix系统的软硬件平台。该平台能够为所有注册用户免费提供SSH/VNC服务,MySQL数据库服务,传统的C/C++、Java、 Fortran等多种语言开发环境,基于Apache、MySQL和PHP的Web应用开发环境。简单地讲,Unix-Center.Net的注册用户可 以远程登录进入多个不同的操作系统,具备自己独立的用户空间和磁盘配额,享受该操作系统上普通用户的所有权限,学习和使用各种版本的Unix和类Unix 操作系统的常用命令和功能,可以将自己正在开发的应用程序上载到Unix体验中心的服务器,在不同的软硬件平台上编译和运行。

蒋先生的原话:

坦率地说,我现在遇到了一些困难。我所在的公司,在这次经济危机中被收购了。我不能够确定将来我是否还有能力将这个系统支持下去。但是我非常希望能够维持 这个系统的运行,因为它确实对很多人有用。如果您也相信这一点的话,我希望您能够帮助我将这个系统维持下去。不管是10元、100元还是1000元,对于 Unix-Center.Net的用户来说都是莫大的帮助。

希望大家踊跃帮忙,为国内开源做点贡献!

http://www.unix-center.net/?p=133

用PHP通过邮箱获取QQ好友列表

今天研究了一下QQ邮箱的登录过程,企图从这个位置突破,获取好友列表。

结果网上有一个Python的版本,还发现在php.cn上有人用PHP模拟了一个,不管3721,拿回来,测试,乖乖!不禁感慨牛人的强悍。

验证码已经自动提取。

输出密码,验证码,成功登录并提取好友列表!酷!

演示页面:http://blog.eaxi.com/wp-content/demo/qq/

QQ密码已经在客户端用JS加密,本程序无法获取用户密码。所以请大家放心使用!

另,程序请大家自己放狗去找,此处不提供下载了,怕太多人用腾讯改协议大家都不能用!呵呵。如果确实有需要,但放狗找不到的,再私下找我要吧。

Updated:

2009-7-29 因为太多人找我要程序,想想还是共享给大家的好,下载地址:qq


使用IE8的WebSlice 功能

开发人员可以将网页的一部分标记为”源剪辑”,这样,用户在浏览网站时便可以监视它们所依赖的信息。只需在”收藏夹”栏中单击一次,用户即可看到丰富的”源剪辑”视觉效果,开发人员即可建立有价值且一致的最终用户连接。

最终效果:

点击之后,弹出一个对话框,可以将这个剪辑添加到收藏夹。

添加后,将会在收藏栏出现:

怎么样,效果还可以吧?

实现方法:

这里写标题
这里是HTML内容…… RSS名字

大概结构就是这样,里边的内容要你自己去仔细填充哈!

测试WORD2007发布文章

喜欢WORDPRESS的另外一个原因,就是可以使用离线的博客发布工具,非常方便。

看贴图:

直接用截图工具截取,然后粘贴就可以了。

需要启用这个功能,必须先在WP后台启用XMLRPC:

打开WORD 2007,新建博客文章。选择注册账号:

选择WORDPRESS。

确定,就可以开始用WORD 2007来写博客啦。

博客升级成WordPress 2.8,发布转换器!

一直使用sablog-x 2.0快两年多了。但由于无法忍受它把我博客文章中的代码整得乱七八糟,今天下定决心转换成WP。

模板使用了NeoEast的Inove,感谢作者的劳动!http://www.neoease.com/

同时采用了WP-Syntax 插件处理我博客文章中的大量代码,感觉还可以。

顺便分享一下我转换时写的博客转换器。

完美转换博客名字、简介,用户、文章、评论、Trackbacks、友情链接。
已知问题:
1. 标签并没有正常转换。
2. 友情链接并没有正确归入Blogroll类别。

转换器下载:converter

使用memcached做数据库点击数统计缓冲

原理:

  1. 先从数据库读取最新的点击数,更新到缓存中。
  2. 点击动作产生时,在缓冲做自增操作。
  3. 把被点击的ID写入缓存中,以表名为组。表明缓存中有该ID的点击数,需要进行入库操作。
  4. 定时更新缓存数据到数据库。
  5. 如发现入库周期内,点击数无更新,则放弃入库,并山删除表名组中的ID。

且看代码:

   
    /**
     * 更新点击数
     *
     * @param string $table
     * @param int $id
     */
    function click($table, $id) {
        $config = ZFactory::getConfig();
        $key_prefix = $config[‘click’][‘key_prefix’];
        $cache = ZFactory::getCache();
        $key = $key_prefix . ‘_’ . $table . ‘_’ . $id; // 点击数键
        $click = $cache->get($key); // 获取点击数
        if (!$click) {
            // read from table
            $id = intval($id);
            $db = ZFactory::getDb();
            $table = $db->escape_string($table);
            $sql = "SELECT click_count FROM `log_clicked` WHERE click_id=’$id’ AND click_type=’$table’";
            $db->query($sql);
            $result = $db->fetch_object();
            $click = $result ? $result->click_count : 0;
            $cache->set($key, $click);
            
            // 维护一个ID列表
            $list_key = $key_prefix . ‘_’ . $table; // 列表键
            $list = $cache->get($list_key);    // 获取列表
            if (!$list) $list = array($id);
            else $list[] = $id;
            $cache->set($list_key, $list);
        }
        return $cache->increment($key);
    }
    
    /**
     * 把缓存中的数据持久化到数据库
     *
     */
    function click2db() {
        $config = ZFactory::getConfig();
        $key_prefix = $config[‘click’][‘key_prefix’];
        $tables = $config[‘click’][‘tables’];
        $cache = ZFactory::getCache();
        foreach ($tables as $table) {
            $ids_key = $key_prefix . ‘_’ . $table;
            $ids = $cache->get($ids_key);
            if (count($ids))
            foreach ($ids as $k=>$id) {
                $id = intval($id);
                // 缓存内的点击数
                $key = $key_prefix . ‘_’ . $table . ‘_’ . $id;
                $click = $cache->get($key);
                // 读取数据库里的点击数
                $db = ZFactory::getDb();
                $table = $db->escape_string($table);
                $sql = "SELECT click_count FROM `log_clicked` WHERE click_id=’$id’ AND click_type=’$table’";
                $db->query($sql);
                $result = $db->fetch_object();
                $dbclick = $result ? $result->click_count : 0;
                // 如果周期内没有人点击
                if ($dbclick > $click) {
                    // 从缓存中摘除该ID
                    unset($ids[$k]);
                } else {
                    // 把点击数写入数据库
                    $sql = "UPDATE `log_clicked` SET click_count=’$click’ WHERE click_id=’$id’ AND click_type=’$table’";
                    $db->query($sql);
                }
            }    // foreach ($ids as $k=>$id)
            // 把ID列表写回缓存中
            $cache->set($ids_key, $ids);
        }    // foreach ($tables as $table)
    }