新 WordPress 主题 Devart

Sep 7th, 2008 | Filed under WordPress

换上了新的模板 Devart,由设计师deniartru制作,它采用了DeviantART的设计风格,如果喜欢这款模板,可以再 DeviantART 上下载。

http://deniartru.deviantart.com

64位 Ubuntu 8.10 中使用 mplayer 播放 RMVB

Sep 4th, 2008 | Filed under Ubuntu
Comments Off on 64位 Ubuntu 8.10 中使用 mplayer 播放 RMVB

Ubuntu 下的播放器有很多,系统默认的是 Totem,而貌似更多人都喜欢 mplayer。

首先可以卸载 Totem,如果你不喜欢系统中同时存在两个播放器的话,这一步可以使用 apt 或者 synaptic 轻松搞定。

安装 mplayer:

sudo apt-get install mplayer mplayer-fonts mplayer-skin mozilla-mplayer

然后登录 mplayer 官方网站,进入下载页面: http://www.mplayerhq.hu/design7/dload.html
下载解码器(Binary Codec Packages),由于我是安装的 64 位系统,所以选择了 64 位解码器(Linux AMD64 20071007)。
解压后,释放到 /usr/lib/codecs 目录中,指令如下:

sudo mkdir /usr/lib/codecs
tar jxvf essential-amd64-20071007.tar.bz2
sudo cp essential-amd64-20071007/* /usr/lib/codecs

做完这两步以后,mplayer 应该就可以正常播放 rmvb 文件了,但是打开 rmvb 文件后,我得到了如下的错误:

[VO_XV] It seems there is no Xvideo support for your video card available.
[VO_XV] Run 'xvinfo' to verify its Xv support and read
[VO_XV] DOCS/HTML/en/video.html#xv!
[VO_XV] See 'mplayer -vo help' for other (non-xv) video out drivers.
[VO_XV] Try -vo x11.
Error opening/initializing the selected video_out (-vo) device.

使用 gedit 或者 vim 打开配置文件,修改一下视频驱动:

sudo vim /etc/mplayer/mplayer.conf

将 vo=xv 修改为 vo=x11,保存退出。
然后启动 mplayer 后,打开 Preference -> Video,选择 X11 (XImage/Shm),保存,重启 mplayer。

OK,这样不论是 Terminal 中命令行启动,还是 File Browser 中双击 rmvb 文件,都可以正常播放 rmvb 了。

其它一些设置可以参考 http://wiki.ubuntu.org.cn

Tags: , ,

使用 Putty 自动登陆远程 Linux 主机

Aug 23rd, 2008 | Filed under Ubuntu

由于工作需要,经常要从 Windows 主机访问远程的 Ubuntu 服务器,每次输入账号和老长的密码,感觉很麻烦,于是参考网上的教程简单的设置了一下就能自动登陆远程主机了,非常的方便。

虽然 Putty 也提供了 puttygen.exe 生成公/密钥,但是和 Linux 主机生成的 KEY 格式不同,需要手工修改格式,所以采用 Linux 主机自己生成 KEY 的方式。

首先登陆到 Linux 主机,具体过程如下:

1. 生成公钥和密钥

verdana@hostname:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/verdana/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/verdana/.ssh/id_rsa.
Your public key has been saved in /home/verdana/.ssh/id_rsa.pub.
The key fingerprint is:
51:51:da:44:28:b5:83:de:d2:1e:60:4f:81:c9:f1:1a verdana@hostname.com

注意 passphrase 留空。

2. 将公钥内容追加到 authorized_keys

# 若 authorized_keys 已经存在,则跳过 touch 创建文件这一步
verdana@hostname:~/.ssh$ touch authorized_keys
verdana@hostname:~/.ssh$ cat id_rsa.pub >> authorized_keys

3. 下载密钥并转换为 Putty 可识别的格式
Putty 无法识别 Linux 主机生成的的密钥,所以需要用 puttygen.exe 转换一下。
a) 使用 FTP 软件或者其它方式将生成的密钥 id_rsa 拷贝到客户端主机,这里我的客户端是 Vista 系统
b) 打开puttygen.exe,点击菜单上的:转换->导入密钥->保存密钥(如:id_rsa.ppk),密钥即转换完成,这里不设置密码保护

4. 设置 Putty
打开 Putty
a) 会话,主机名称填入:user@remote-host,user 是你的 Linux 主机登陆名称,remote-host 是 IP 或者远程主机域名,比如: root@phpvim.net。
b) 连接->SSH->认证->浏览,选择刚才转换后的密钥(id_rsa.ppk),之后保存会话即可。

5. 使用 Cygwin?
如果使用的 Cygwin 的 ssh 登录远端服务器的话,只需要把第3步生成的密钥 id_rsa (无需任何转换)拷贝至 Cygwin 用户的 .ssh 目录即可。
😳

Tags: , ,

Using PHP5 and WMP OCX to get the duration of a media file

Aug 7th, 2007 | Filed under PHP
Comments Off on Using PHP5 and WMP OCX to get the duration of a media file

PHPChina 的论坛看到有人问,如何使用 PHP 得到一个媒体的文件的播放时间,然后就自己尝试用 COM 写了一段代码,开始以为蛮复杂的,不过还好思路对了,只是在浩瀚的 MSDN 上查找 WMP SDK 的资料折腾的够呛,最后写出的代码却只有寥寥几行,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
// mp3, wav or any other file formats that media player supports.
$file = "C:/I Wanna Go To A Place.mp3";
if (!file_exists($file)) {
    exit('Media file does not exist.');
}
 
// Create an instance of Windows Media Player
$player = new COM("WMPlayer.OCX");
$media  = $player->newMedia($file);
 
// Get the duration of a media file (seconds)
print $media->duration;

在 PHP Manual 的 XV. COM and .Net (Windows) 一章,还看到一位叫 Pedro 的同学提交的利用 WMP OCX 弹出光驱的 PHP 代码
有兴趣的朋友可以玩玩:

1
2
3
4
5
6
<?php
// Create an instance of Windows Media Player
$mp = new COM("WMPlayer.OCX");
 
// Ejects the first cd-rom on the drive list
$mp->cdromcollection->item(0)->eject();

😳

Tags:

WordPress Plugin – Fanfou Tools 1.00 (stable version)

Jul 31st, 2007 | Filed under WordPress
Comments Off on WordPress Plugin – Fanfou Tools 1.00 (stable version)

Fanfou Logo

这次直接升级到 1.00 stable,终结该死的 beta version。

感谢 72pines 提供的 mo/po 翻译文件,Fanfou Tools 现在有了中文版本。
如果您在使用的过程中,仍然显示为英文界面,打开 wp-config.php 文件,修改如下代码:

// Change this to localize WordPress.  A corresponding MO file for the
// chosen language must be installed to wp-includes/languages.
// For example, install de.mo to wp-includes/languages and set WPLANG to 'de'
// to enable German language support.
define ('WPLANG', 'zh_CN');

fanfou tools 已经加入官方的 Plugins 列表:

http://wordpress.org/extend/plugins/fanfou-tools/

如果您有 SVN 客户端软件,也可以从 SVN 上下载最新的代码:

svn co http://svn.wp-plugins.org/fanfou-tools/trunk

详细信息、下载,请访问:
WordPress Plugin – Fanfou Tools

PHP6 Namespace

Jul 22nd, 2007 | Filed under PHP

PHP6 的 snapshot 版本中,namespace 功能已经实现了,下面我们就通过几个简单的示例来介绍一下,如何在 PHP6 中使用 namespace。

一、如何定义 namespace?

// net/phpvim/code/Shape.php
namespace net::phpvim::code;
 
class Shape{
}
 
function draw() {
    return "draw() in Shape.php\n";
}
 
function getCurrentNS() {
    return __NAMESPACE__;
}
 
/* vim: set expandtab tabstop=4 shiftwidth=4: */

所有的类和函数名称会自动加上 namespace 名称作为前缀,相同的 namespace 也可以在多个 PHP 文件中被定义。

比如上面的代码中,完整的类名和函数名是:

net::phpvim::code::Shape
net::phpvim::code::draw()

二、如何使用呢?

// net/phpvim.net/code/Painter.php
require_once 'net/phpvim/code/Shape.php';
 
import net::phpvim::code;
import net::phpvim::code::Shape;
import net::phpvim::code::Shape as CPC_Shape;
 
// Create an instance object for Shape class
$shape0 = new net::phpvim::code::Shape();
$shape1 = new code::Shape();
$shape2 = new Shape();
$shape3 = new CPC_Shape();
 
// output: draw() in Shape.php
print net::phpvim::code::draw();
print code::draw();
 
// output: net::phpvim::code
print code::getCurrentNS();
 
/* vim: set expandtab tabstop=4 shiftwidth=4: */
</php>
 
import 指令
 
import 可以将任意的 package(这里借用一下 Java 的概念)导入到当前 scope 中来。
import 不可以使用在函数或者类中。
import 生效范围为当前定义位置到所在文件的结尾。
import 可以通过 AS 关键字定义别名。
import A::B; 等同于 import A::B as B。
 
 
<strong>三、其它</strong>
特殊的 empty namespace ::
 
<pre lang="php">
import net::phpvim::code;
echo ::draw();
/* vim: set expandtab tabstop=4 shiftwidth=4: */

:: 是一个特殊的 namespace,以 :: 开头的调用,将会在 global 范围查找并绑定相应的 Class 或者 Function。换句话说,定义在任意 namespace 中的 draw() 函数都不会被调用,而是调用 global 范围内的 draw() 函数。

constant __NAMESPACE__

__NAMESPACE__ 表示当前的 namespace 的名称。

Tags: ,

WordPress Plugin – Fanfou Tools 1.0 Beta 7

Jul 19th, 2007 | Filed under WordPress
Comments Off on WordPress Plugin – Fanfou Tools 1.0 Beta 7

Fanfou Logo

Fanfou Tools 更新到 v1.0b7,这次增加了一个好友模块,可以在侧边栏中显示饭否的好友头像。

增加了显示好友数目的设置选项,还有 Widgets 中可以自己设定模块的标题了。

增加了一个 UBB 标签:[tiny][/tiny],在 Write Fanfou 时,使用这个标签就可以把很长的 URL 转换为较为短小的 TinyURL。

PS: Fanfou Tools 已经提交到了 WordPress 官方插件网站,希望能够审核通过。

详细信息、下载,请访问:
WordPress Plugin – Fanfou Tools

PHP5 的多态性与动态绑定

Jul 18th, 2007 | Filed under PHP

什么是多态性?
多态性是继数据抽象和继承后,面向对象语言的第三个特征。从字面上理解,多态的意思是“多种形态”,简单来说,多态是具有表现多种形态的能力的特征,在OO中是指“语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式”的能力。多态被认为是面向对象语言的必备特性。

例如:
我们创建一个接口 Shape,定义一个空的方法 draw(),那么所有的实现类都必须实现这个方法,假设 Shape 有两个实现类:Triangle 和 Rectangle,我们虽然无法通过类似这样的 Java 代码来诠释 PHP 的多态性:

1
2
Shape s = new Triangle();
s.draw();

不过 PHP5.1 中引入了 Type Hinting,可以限制函数(或者方法)的参数类型,我们使用这个特性来演示 PHP5 的多态性。

参考如下的代码:

1
2
3
4
5
class TestPolymorphism {
    public function drawNow(Shape $shape) {
        $shape->draw();
    }
}

函数 drawNow() 中限制传入的参数类型必须为 Shape 接口派生类的对象,这里我们传递给 drawNow() 的参数可能是 Triangle 或者 Rectangle 的对象,也可能是其它的 Shape 接口的派生类对象,比如 Circle 等等,简单的说 drawNow() 的参数类型是无法预知的,$shape->draw() 的行为最终由传入的参数的具体类型来决定,比如如果传入 Triangle 的对象,那么就调用 Triangle 的 draw() 方法,如果传入 Rectangle 的对象,就调用 Rectangle 的 draw() 方法。这种在运行时刻根据传递的对象参数的类型来决定调用哪一个对象的方法的行为就可以称之为多态。

Shape 也可以是一个抽象基类或者是非抽象的基类,上面的论述都是成立的。区别在于接口仅定义一套实现类必须遵守的规则,而使用基类则可以为派生类提供一些缺省的行为。

参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
 * Shape Interface
 * 
 * @version 1.0
 * @copyright 
 */
interface Shape {
    public function draw();
}
 
/**
 * Triangle 
 * 
 * @uses Shape
 * @version 1.0
 * @copyright
 */
class Triangle implements Shape {   
    public function draw() {
        print "Triangle::draw()\n";
    }
}
 
/**
 * Rectangle 
 * 
 * @uses Shape
 * @version 1.0
 * @copyright
 */
class Rectangle implements Shape {
    public function draw() {
        print "Rectangle::draw()\n";
    }
}
 
/**
 * Test Polymorphism
 * 
 * @version 1.0
 * @copyright
 */
class TestPoly {
    public function drawNow(Shape $shape) {
        $shape->draw();
    }
}
 
 
$test = new TestPoly();
$test->drawNow(new Triangle());
$test->drawNow(new Rectangle());
 
/* vim: set expandtab tabstop=4 shiftwidth=4: */

什么是动态绑定?
HaoHappy 翻译的 PHP5 Object Pattern 第九节中有介绍:

除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问。 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。

另有的说法:

绑定(binding):将方法的调用连到方法本身被称为绑定,当绑定发生在编译期,被称做静态绑定,而在程序运行的时候根据对象的类型来决定该绑定方法的成为动态绑定。

PHP 是一种动态语言,使用动态绑定。无须考虑采取何种绑定策略,因为一起都是自动的。

(待续…)

😳

Tags: ,

Vi IMproved 7.1.32 – Included patches: 1-32

Jul 18th, 2007 | Filed under Vim
Comments Off on Vi IMproved 7.1.32 – Included patches: 1-32

之前一直无法将 5 种 Interfaces(Perl, Python, Ruby, Tcl, MzScheme) 全部编译进去,ex_docmd.c 有 bug,不过已经 7.1.029 中已经修正了这个问题。

Python 也升级到了 Python 2.5,不再使用 2.4,使用了几个 Python 编写的插件,都没什么问题。

以下是最新的五个补丁信息 ( http://ftp.vim.org/vim/patches/7.1/ ):

2239 7.1.028 “:sort” does nothing special with empty search pattern
2692 7.1.029 (after 7.1.019) can’t compile when all interfaces are used
2364 7.1.030 vimtutor shell script checks for “vim6” but not for “vim7”
6533 7.1.031 virtcol([123, ‘$’]) doesn’t work
3006 7.1.032 possible crash when doing completion on the command line

Detail:
http://www.phpvim.net/vim/my-build-vim-executables.html

Download:
http://www.phpvim.net/files/vim/vim71-latest.7z

Tags:

通过注册表设置环境变量

Jul 18th, 2007 | Filed under Windows
Comments Off on 通过注册表设置环境变量

大部分情况下我们都是通过Windows自带的环境变量编辑器来修改系统环境变量,也可以通过Windows系统提供的path,set两个命令临时修改。

使用系统编辑器修改环境变量最终会反映到注册表中保存,我们知道环境变量分为两种,用户变量,以及系统变量,其存储的位置分别位于:

系统变量:

1
2
3
[HKLM\SYSTEM\ControlSet001\Control\Session Manager\Environment] 
[HKLM\SYSTEM\ControlSet002\Control\Session Manager\Environment] 
[HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

用户变量:

1
[HKCU\Environment]

其中HKLM = HKEY_LOCAL_MACHINE,HKCU = HKEY_CURRENT_USER

ControlSet001/ControlSet002/CurrentControlSet 保存用于系统启动的重要配置信息,其中 CurrentControlSet 指向 ControlSet001 ,两者互相同步,每次针对两者中任意一个分支的修改都会立即复制到另外一个分支相对应的键值中。

当系统启动时,会使用其中一个分支的信息以尝试启动系统,这个就是 ControlSet001,如果启动成功,那么 ControlSet001 的信息会复制到 ControlSet002 中。如果启动失败,那么就不会发生这个复制过程。

当系统因某些原因无法启动时,我们通常会使用 “Using the Last Known Good Configuration” 来尝试启动系统,也就是“最后一次正确的配置”(启动时按住F8),这时系统使用的就是ControlSet002 分支的配置信息。

上面仅针对 Windows XP,其它版本的 Windows 系统应该都是类似的。

由于我编译 VI IMproved 每次都要为 Make_cyg.mak 设置环境变量,非常的麻烦,所以就查找了这方面的知识,把设置 Environment 的过程写入注册表文件中,每次只要导入即可,非常的方便。

如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Windows Registry Editor Version 5.00
 
[HKEY_CURRENT_USER\Environment]
 
"PERL"="C:/Perl"
"PERL_VER"="58"
"DYNAMIC_PERL"="yes"
 
"PYTHON"="C:/Python25"
"PYTHON_VER"="25"
"DYNAMIC_PYTHON"="yes"
 
"RUBY"="C:/Ruby"
"RUBY_VER"="18"
"RUBY_VER_LONG"="1.8"
"DYNAMIC_RUBY"="yes"
 
"TCL"="C:/Tcl"
"TCL_VER"="84"
"DYNAMIC_TCL"="yes"
 
"MZSCHEME"="C:/MzScheme"
"MZSCHEME_VER"="370_000"
"DYNAMIC_MZSCHEME"="yes"
Tags: