Read Sean

Read me, read Sean.
posts - 508, comments - 655, trackbacks - 9, articles - 4


一篇关于目前开发中的KDE 4.1最新进展介绍
http://polishlinux.org/kde/kde-41-visual-changelog-rev-783000/

看上去挺不错的,有了KDE 4的基础,从4.1开始,一些之前来不及polish的地方开始逐渐被弥补。


posted @ 2008-03-12 00:27 laogao 阅读(665) | 评论 (0)编辑 收藏


最近尝试把一个Oracle数据库,连同构建在这个数据库上的Java应用移植到PostgreSQL环境。在移植过程中,总结了一些要点,一方面作为笔记备忘,一方面也给有类似任务需要处理而又无从下手的朋友作为参考。

1- 首先是准备PostgreSQL环境。有条件的话,最好是找一台空闲的PC机作为测试服务器,安装Linux或BSD,然后从源码编译最新的PostgreSQL 8.3.0。编译时,通过configure指定--with-perl和--with-python以支持PL/Perl和PL/Python。因为绝大多数Linux发行版都已自带Perl和Python,不必额外安装。

2- 如果是Windows环境,又需要Perl和Python,则必须额外安装,Python的话,可以方便的找到2.5 for Windows的安装包,Perl的话,推荐ActivePerl,相对麻烦一点,为了后面用到的一些便利的功能顺利加载,Perl版本尽量选5.8.8。

3- 创建数据库和用户。通过initdb初始化数据目录,配置postgresql.conf指定主机IP、端口等等信息,配置pg_hba.conf指定访问权限,通过pg_ctl -D <数据目录> -l <日志文件> start启动postmaster,然后createdb、createuser创建数据库和用户。数据库建好之后,就可以createlang -d <数据库名> [plperl|plperlu|plpython|plpythonu]开启PL/Perl和PL/Python。具体命令行参数可通过各命令加--help查看。

4- 安装PostgreSQL客户端pgAdminIII,最新版是1.8.2,有条件的话,也可以下载源码自己编译。

5- 安装Oracle客户端,需要在PostgreSQL同一台机器,以便Perl用于连接数据库的DBI和Oracle驱动DBD::Oracle模块顺利安装。如果是Windows上的ActivePerl,则可以通过ppm install DBD-Oracle,如果是Linux/BSD,则可以通过CPAN来安装,如perl -MCPAN -e shell进入CPAN Shell,通过install <模块名>或force install <模块名>安装DBI和DBD::Oracle。

6- 数据库的移植,可以选择ora2pg来帮忙,目前的版本是4.7。ora2pg是一个用于读取Oracle数据库schema、数据,并生成PostgreSQL脚本或直接导入PostgreSQL数据库的Perl工具。用法很简单,就是通过.conf文件指定数据库连接信息包括NLS_LANG、需要导出导入的schema、table、view、data等等,然后执行一个pl脚本。这是目前相对比较成熟的一个方案,但是遇到schema复杂、约束较强的数据库,需要手工处理的地方还是不少。建议不要直接写入PostgreSQL,而是生成SQL脚本,验证无误后再执行。ora2pg默认会把Oracle中名称的大写转换成小写,因为PostgreSQL在解析SQL时,除非""括起来,默认都是转成小写。schema、table、view、sequence、data等等,基本用ora2pg,加上一些手工调整即可搞定。至于function、stored procedure等,还是手工移吧,偷不得懒。除了ora2pg,其实也可以配置DBI-Link,将Oracle数据库挂到PostgreSQL数据库作为一组独立的"schema",然后用create table xxx as select ... from ...这样的语法来倒表和数据。PostgreSQL的contrib包也附带有一个dblink,不过是连接其他PostgreSQL数据库的,如果需要连接非PostgreSQL, 还是考虑DBI-Link,任何可以通过Perl的DBI接口访问的数据库,都能link进PostgreSQL。

7- 接下来就是Java应用本身了,我这次移的这个应用是Spring+iBatis架构的,很多SQL语句都是明文,好在DAO层的基础部分(CRUD)的SQLMap是工具自动生成,且都是符合ANSI SQL92标准的,不需要修改即可使用。其余的高级查询SQL,需要调整的地方不少,一些常见的修改列举如下:

i. SELECT出来的column(包括子查询),如果有别名,必须加AS,比如 select null as some_column from some_table;
ii. PostgreSQL没有dual表,类似select 0 from dual的语句,写成select 0即可;
iii. DECODE函数需要重构成(case when some_column = 'some_value' then 'some_other_value' when ... then ... else 'some_default_value' end ) as some_column;
iv. NVL()函数,PostgreSQL中相对应的是coalesce(),其实几乎所有主流DBMS都支持coalesce,包括Oracle,这才是标准写法;
v. 比较日期,在PostgreSQL中,建议使用date_trunc('day', SOME_DATE) = date_trunc('day', #enteredDate#)这样的写法,其中'day'位置可选字段包括有year、month、week、hour、minute、second等等;
vi. SYSDATE,对应到PostgreSQL是current_timestamp,可以根据需要使用current_date;
vii. ROWNUM,通常我们用ROWNUM都是为了限制查询出来的记录数,PostgreSQL没有这个关键字,需要改成在SELECT语句最后添加 LIMIT语句,如LIMIT 100;
viii. (+)这样的外连接写法需要调整为SQL标准的 table1 [LEFT|RIGHT|FULL] OUTER JOIN table2 ON (...);
ix. CONNECT BY ... START WITH ... 递归查询可以参考 http: //www.postgresql.org/docs/8.3/static/tablefunc.html 的connectby()函数.

最后再多提一点,PostgreSQL自带的过程语言是PL/pgSQL,在PostgreSQL上写function,除了用plpqsql,还支持sql、plperl(u)、plpython(u)等等。如果你对SQL天生过敏,看类似PL/pgSQL的代码都很吃力,别说是写了,你完全可以用你喜欢的语言来表达函数和存储过程的逻辑。有了PL/Python,你还怕什么呢?你几乎能做任何事。

[更新 20080313] 把JDBC驱动的部分漏掉了,移植Java应用时,除了改SQL,还需要拿PostgreSQL的JDBC驱动放到classpath下面,如WEB-INF/lib,然后修改数据库连接URL,改成jdbc:postgresql://<ip>:<port>/<dbname>即可。

[更新 20080323] 移植schema和数据时,比ora2pg更方便的一种方式是利用EnterpriseDB的Migration Tool,将Oracle的JDBC驱动ojdbc14.jar拷贝到EnterpriseDB安装路径下的jre/lib/ext下后,启动Developer Studio即可建立Oracle连接,选中schema后,可以通过右键Online Migration将schema、数据、函数包等等一次性通通导入EnterpriseDB。如果要继续往"纯"PostgreSQL移,从EDB做backup,然后到PostgreSQL下做restore,这样会丢掉函数包,因为毕竟EDB在PostgreSQL基础上做了相当改造以和Oracle兼容,不过函数包之类还是手工移比较稳妥。


posted @ 2008-03-11 23:04 laogao 阅读(2800) | 评论 (0)编辑 收藏


啥也不说了,开心!


posted @ 2008-03-05 05:39 laogao 阅读(644) | 评论 (0)编辑 收藏


在JRuby得到Sun的认可并成功发布1.0,已经向1.1迈进之时,比Ruby应用更广、更早出现JVM运行版本的Python也终于得到了Sun的重视:

http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/

尽管Sun官方的说法是他们会更多的应用和扶持native版的Python,相信一直饱受冷落的Jython,也多少会从中受益吧。


posted @ 2008-03-05 00:07 laogao 阅读(467) | 评论 (0)编辑 收藏


就在2月的最后一天,Apache Harmony发布了5.0的第5个milestone: http://harmony.apache.org/

为默默耕耘的人鼓掌。


posted @ 2008-02-29 23:28 laogao 阅读(421) | 评论 (0)编辑 收藏


本赛季状态渐佳,外号"禁区之狐"的阿森纳小将Eduardo在英超客场对阵Birmingham City中惨遭暗害:

(由于实在太过血腥,不忍心放在首页,请点击查看)

在此强烈谴责Martin Taylor这次不负责任的野蛮铲球,只给你红牌实在太轻了。让我们共同为Eduardo祈祷,祝愿他早日康复!也希望绿茵场上不要再发生类似的惨剧。足球应该是给人带来快乐的,不是人身伤害。


posted @ 2008-02-24 13:22 laogao 阅读(641) | 评论 (0)编辑 收藏


春节期间真是好事不断啊,继PostgreSQL 8.3正式release后,Grails也如约发布1.0版。作为受到Ruby on Rails启发开动的"Groovy版Rails"项目,它在设计哲学上和Rails,包括JRuby版的Rails,有着很大的不同,Rails是从头开始用Ruby完整实现从表现层到ORM所有功能,而Grails则是利用Java社区现有的成熟开源框架,如Spring、Hibernate等,在此基础上整合出一套完整的Web应用框架,有点类似Pylons和Django的区别。

之前一篇随笔也提到过,和其它在JVM中运行的动态语言如Jython、JRuby不同的是,Groovy对于有Java基础的人们来说,学习曲线几乎是平的,上手很快,如果你同时也熟悉Spring和Hibernate等,那么Grails更是不二之选。

官网: http://grails.codehaus.org/
Release Notes: http://grails.org/1.0+Release+Notes
下载: http://grails.codehaus.org/Download


posted @ 2008-02-07 10:47 laogao 阅读(731) | 评论 (1)编辑 收藏


经过1月3日和1月18日两轮RC后,PostgreSQL 8.3终于在本月初正式发布了。该版本有很多功能和性能上的重大提升,包括全文搜索、新的数据类型(XML、ENUM、UUID等)、并发autovacuum、异步提交等等,以及对Windows平台更好的支持,如SSPI和VC++等。

官方声明: http://www.postgresql.org/about/news.918
Release Notes: http://www.postgresql.org/docs/8.3/static/release-8-3.html
各版本功能对照: http://www.postgresql.org/about/featurematrix
下载: http://www.postgresql.org/ftp/


posted @ 2008-02-07 10:04 laogao 阅读(773) | 评论 (0)编辑 收藏


如果你有一定的Java基础,想快速的尝尝动态语言的味道,Groovy是个自然的过渡选择。今天无意中看到一篇介绍Groovy的文章,很短,也很有趣,从一个典型的Java程序开始,一步一步"Groovy化",最终改造成一个完整的Groovy程序:

http://java.dzone.com/news/java-groovy-few-easy-steps


如果你对当下动态语言的现状有所了解,那你多半已经知道能在JVM中运行的动态语言,远不止Groovy一种,那么什么理由会让你选择Groovy而非Jython、JRuby或者其他类似的语言呢?笔者认为主要还是编码习惯和风格,Groovy是这些语言中最接近Java的。Jython和JRuby都是从其他成功的动态语言"移植"过来,带有明显的Python、Ruby语法特征和习惯。选择Jython或者JRuby的朋友,我想大都是原本就有Python或者Ruby的基础,舍不得Python和Ruby的一些很方便的语法和编码风格/习惯/哲学,或者干脆就是为了将Python和Ruby世界的一些框架引入到Java中,或者说是让Python/Ruby应用能够更好的利用Java平台已有的资源。如果你在动态语言上没有这方面的需求,只是为了让你的Java应用更动态,选择Jython或者JRuby只能是凭空增加学习难度。要知道,Python和Ruby都是很有特点、很有个性的语言(其实Java又何尝不是),要从Java的思维和哲学,转向Python/Ruby的思维和哲学,并不是那么容易做到和做好的。


posted @ 2008-01-27 17:14 laogao 阅读(1342) | 评论 (2)编辑 收藏


使用Linux很便利的一个地方,就是它把所有资源都按照文件的方式抽象出来,于是我们在读写任何外部资源时,都像是操作本地普通文件一样。访问Windows共享,除了在Nautilus/Konquerer使用smb://,或者命令行使用smbclient之外,当然还有更cool的方式,那就是smbmount。

在Ubuntu下使用smbmount,需要安装smbfs包,通过sudo apt-get install smbfs即可。调用方法如下,新建/share目录后:
$ [sudo] smbmount //10.10.10.10/share /share -o username=<user_name>,password=<password>,codepage=cp936,iocharset=ut8

注意最后两个参数,Linux默认是UTF-8编码,中文Windows则是GBK,按codepage划分,也就是cp936。如果你的环境和上述不一致,则需要相应的修改codepage和iocharset参数。成功以后,我们就可以通过熟悉的ls, cp, cat, less, more, mv, zip, tar, rm, rename, nano, vi等等我们在Linux下已经习以为常的方式来操作了,就和本地文件夹一样。

如果想在Linux启动时自动把Windows共享挂进来,则可以修改/etc/fstab,增加如下内容:
//10.10.10.10/share /share smbfs username=<user_name>,password=<password>,codepage=cp936,iocharset=ut8,umask=000 0 0


posted @ 2008-01-18 12:54 laogao 阅读(1706) | 评论 (0)编辑 收藏


不知不觉中,从我在BlogJava第一篇随笔至今,BlogJava已经伴随我走过了三个年头。不由得感慨:时间过得真快。

前不久刚看完Coen兄弟的新片 No Country for Old Men (豆瓣),挺打动我的。我们每天都在变老,世界也似乎注定会有一天变成我们不认识、也无力改变的样子,没有原因,没有目的。从混沌中来,还得回到混沌中去。


posted @ 2008-01-13 16:58 laogao 阅读(432) | 评论 (1)编辑 收藏


http://it.slashdot.org/article.pl?sid=08/01/01/137257
(来自Slashdot社区的文章链接)

M$ Office 2003 SP3将取消对一部分老Office文件格式的支持,官方的说法是这些文件格式不够安全。本来就是二进制格式的文件了,隔几年你就搞个新的不兼容的格式,这是要存用户的数据还是你的数据啊?逼(诱?)大家升级?

我本人不用M$ Office,但我周围许多人在用,而且大都很热衷于尝试新的版本。我想问问还在继续使用M$ Office的朋友,如果10年后,你今天写下的文档,再无法用市面上找的到的工具打开,你还会继续放心的使用今天这个工具吗?

如果工具有bug、不安全,那你就做个没bug、安全的工具,别老拿文件格式当幌子,这不是祸祸人么?


另一篇挺有趣的文章:
Why I hate Microsoft


posted @ 2008-01-02 21:33 laogao 阅读(506) | 评论 (3)编辑 收藏


"Gloomy Sunday"原本是一首钢琴曲的名字,"忧郁的星期天",据说N多人听过之后选择了在这首曲子的陪伴下结束自己的生命。而今天要向大家推荐的,是一部由匈牙利、法国和德国联合拍摄的电影: 《Gloomy Sunday - Ein Lied von Liebe und Tod (忧郁星期天 - 爱与死之歌)》。故事有关爱情、自由、尊严,讲述的是二战大背景下发生在布达佩斯的一段凄美的故事,情节饱满、张驰有度,是一部近年来难得一见的佳作。



影片一开始,映入大家眼帘的,是美丽的布达佩斯和流经这里的多瑙河:镜头从Budavári palota(城堡山)、Erzsébet híd(伊丽莎白桥)一直拍到Gellért hegy(盖雷尔特山)脚下的Szabadság híd(自由桥),德国大使馆的车队正从这里经过。Szabó餐厅内的人们正在紧张的准备晚宴,今天他们的客人,是半个世纪以前,在布达佩斯从纳粹手下"解救"了上千名匈牙利犹太人的前德国军官Hans Wieck,今天是他80岁生日,带着他的妻子故地重游,重温当年的记忆。晚餐开始,插着80岁标签的肉卷上桌,Hans招呼一旁的小提琴手,让他表演那首名曲,也就是"Gloomy Sunday",一桌人一边用餐一边欣赏着动听的音乐。这时Hans的目光集中到了摆放在钢琴上的一张黑白照片,照片上是一位端庄美丽的女人,似乎想起了什么,突然表情僵硬,倒在地板上猝死,故事由此展开。


posted @ 2007-12-30 17:36 laogao 阅读(473) | 评论 (0)编辑 收藏


前段时间工作比较忙,想来Gusty Gibbon也已经出来2个月了,还没来得及好好把玩,这周终于有点时间和精力把它下载下来安装到本本上。

这个版本用下来最直接的感受有两点:
1- 默认的中文字体支持更好了,一方面字体的处理更加协调一致,不像之前默认时经常中文字符一大一小的,默认采用英文字体时对中文的显示也做的不错。
2- Compiz和Beryl复和之后,成了Ubuntu新的标配,省得大家费力折腾从其他的apt源或者源码安装了。

当然了,其他细微的改进还有很多,比如Pidgin、默认的ntfs-3g、keyring的处理、闭源的驱动和codecs等等。总的来说,Gusty Gibbon在Feisty Fawn基础上,更加成熟,也让我们对明年4月的Hardy Heron这个在6.06之后第二个LTS版本有了更多的期待。

这里有一个截图,很多东东还没有装,基本上也没花太多时间去hack,感觉就已经挺漂亮,也挺好用的了,呵呵:
screenshot_20071222.png

BTW,AWN(Avant Window Navigator)已经确认会包含在明年8.04(Hardy Heron)默认的apt源中,这对AWN fans们,以及所有喜欢"eye candy"但又不愿花时间去折腾的朋友们来说,无疑是个好消息。


posted @ 2007-12-22 23:57 laogao 阅读(502) | 评论 (0)编辑 收藏


算到现在,已经有将近半年没有写过技术文章了,手痒痒,于是拿Django来说事,希望最终的产出能够做成一个简短易懂的Django快速起步,让初次接触Django的朋友能够在最短的时间内了解Django的基本概念和结构。

Django是使用Python实现的一个基于MVC的web应用框架,类似Ruby世界的Ruby on Rails。如果你是通过Google搜到这篇文章,那么说明你已经对Django有所耳闻,并且愿意了解更多Django相关的信息。我在这里就不多废 话Ruby vs Python或者Rails vs Django,直奔主题。

在写这篇文章时,最新的CPython版本为2.5.1,Django版本为0.96,如无特别说明,本文所有介绍和示例均以此环境为准。

0- 在开始之前,首先当然是安装一个基本能用的开发环境。

如果你的操作系统是Linux或者其他类Unix系统,很可能已经预装了Python,可以在命令行执行python -V查看Python版本。如果你是Windows操作系统,或者想尝试不同版本的Python,那么可以到http://www.python.org/下载相应的安装包进行安装。

有了Python以后,到http://www.djangoproject.com/下载Django,解压以后,cd到解压出来的目录,执行python setup.py install。

为了能够做出一个基本的多层web应用,还需要安装一个数据库,如果没有特别喜好和偏向,推荐PostgreSQL,可以在http://www.postgresql.org/找到合适的版本下载和安装。

我们还缺少一个数据库驱动,在http://www.initd.org/pub/software/psycopg/可以找到用于连接PostgreSQL的psycopg2,安装方法类似Django。

1- django-admin.py startproject

所有环境OK以后,我们开始动手把玩Django,首先找一个干净的目录,执行
$ python django-admin.py startproject hello

上面这行命令会新建一个hello子目录,包含以下文件:
__init.py__: 表示该目录存放Python程序
manage.py: 提供Django项目相关的管理操作
settings.py: 相当于该Django项目的全局设置
urls.py: 用于配置URL映射,基本上就是通过正则表达式指定不同URL由相应的view方法相应

2- manage.py runserver

至此我们已经搭起了一个基本的Django项目框架,执行
$ python manage.py runserver
命令行会提示在8000端口运行一个开发用的web server,转到浏览器的http://localhost:8000/即可看到It worked!的提示信息。你也可以指定端口号,方法是python manage.py runserver XXXX。

3- settings.py

接下来我们做一个完整的从model/数据库到view/template的例子。修改settings.py:
DATABASE_ENGINE = 'postgresql_psycopg2'
DATABASE_NAME 
= 'hello' # Your db name
DATABASE_USER = 'postgres' # Your db user
DATABASE_PASSWORD = '********' # Your db password
DATABASE_HOST = ''
DATABASE_PORT 
= ''

INSTALLED_APPS 
= (
    
'django.contrib.auth',
    
'django.contrib.contenttypes',
    
'django.contrib.sessions',
    
'django.contrib.sites',
    
'hello'# Our new project

4- models.py

新建models.py:
from datetime import datetime
from django.db import models

class Book(models.Model):
    isbn        
= models.SlugField(maxlength=20)
    title       
= models.CharField(maxlength=200)
    author      
= models.CharField(maxlength=200)
    description 
= models.TextField(blank=True,null=True)
    published   
= models.DateTimeField(default=datetime.now)
这里我们从django.db.models.Model继承我们的model类Book,同时还用到了models中现成的字段类,如 SlugField、CharField、TextField、DateTimeField等。大家比较陌生的恐怕是SlugField,这个基本上类似 CharField,不过增加了其内容需要符合URL要求的限制条件。

执行下面的命令测试数据库脚本的生成:
$ python manage.py sql hello
应该看到如下输出结果:
BEGIN;
CREATE TABLE "hello_book" (
"id" serial NOT NULL PRIMARY KEY,
"isbn" varchar(20) NOT NULL,
"title" varchar(200) NOT NULL,
"author" varchar(200) NOT NULL,
"description" text NULL,
"published" timestamp with time zone NOT NULL
);
COMMIT;

确认无误后可以通过下面的命令提交到数据库:
$ python manage.py syncdb
其间会要求我们创建一个管理员账号,如果暂时不打算做admin页面,可以跳过。

5- views.py

model有了之后,接下来我们就可以开始画视图了。由于篇幅和时间有限,我仅简单介绍一下Django的template,然后实现一个最基本的图书清单页面。

首先定义图书清单的URL,在urls.py中:
from django.conf.urls.defaults import *

urlpatterns 
= patterns('hello.views',
    (r
'^hello/books/$''book_list'),
)
含义为hello/books/这个URI资源对应的相应view方法为hello.views.book_list。

新建templates目录,然后新建books.html:
<html  xmlns="http://www.w3.org/1999/xhtml" lang="zh-cn" xml:lang="zh-cn">
<head>
<title>{{ title|escape }}</title>
</head>
<body>
<h2>{{ title }}</h2>
<table border="1">
  
<tr><th>ISBN</th><th>书名</th><th>作者</th><th>出版日期</th></tr>
  {% for book in books %}
  
<tr>
    
<td>{{ book.isbn }}</td>
    
<td>{{ book.title }}</td>
    
<td>{{ book.author }}</td>
    
<td>{{ book.published }}</td>
  
</tr>
  {% endfor %}
</table>
</body>
</html>
Django模板的语法是{{}}表示引用,{%%}表示代码,使用起来也很直观,甚至支持UNIX风格的filter,如这里的{{ title|escape }}。

新建views.py:
from hello.models import *
from django.shortcuts import render_to_response

def book_list(request):
    title 
= 'Book List'
    books 
= Book.objects.all()
    
return render_to_response('books.html', {'title' : title, 'books' : books})
最终页面上的内容,通过title和books两个参数传递给tempate(books.html)处理。

修改settings.py:
TEMPLATE_DIRS = (
    
'/opt/PROJECTS/Django/hello/templates/',
)
指定templates目录位置,注意需要使用绝对路径和'/',无论是Unix还是Windows系统。

我们手工造一些数据之后,就可以通过http://localhost:8000/hello/books/访问我们用Django实现的这个简单页面了。

6- What's next

通过上面的简单介绍,相信哪怕是初次接触Django的朋友,也能够对Django有一个初步的认识。其实Django并不难学,并且随着学习的深入,你一定能发现更多的惊喜,不论是来自Django本身,还是Python及其庞大的第三方类库。

如果有时间,建议尝试一下Django的admin pages,即为我们的model提供自动化、网页化的增删改查操作。启用方法如下:

修改models.py (增加class Admin):
from datetime import datetime
from django.db import models

class Book(models.Model):
    isbn        
= models.SlugField(maxlength=20)
    title       
= models.CharField(maxlength=200)
    author      
= models.CharField(maxlength=200)
    description 
= models.TextField(blank=True,null=True)
    published   
= models.DateTimeField(default=datetime.now)
    
class Admin:
        
pass

修改settings.py和urls.py,加入admin支持:
[settings.py]
INSTALLED_APPS = (
    
'django.contrib.auth',
    
'django.contrib.contenttypes',
    
'django.contrib.sessions',
    
'django.contrib.sites',
    
'django.contrib.admin',
    
'hello',
)
[urls.py]
urlpatterns = patterns('hello.views',
    (r
'^hello/books/$''book_list'),
    (r
'^hello/admin/', include('django.contrib.admin.urls')),
)

Note:
# 为了成功运行admin pages,需要首先执行python manage.py syncdb admin以创建django_admin_log表。
# 如果前面跳过了创建管理员步骤,简单的方法可以删掉auth_user表,然后python manage.py syncdb重建。

按照我们urls.py的配置,admin pages可以通过http://localhost:8000/hello/admin/访问。Enjoy!


posted @ 2007-11-28 00:57 laogao 阅读(754) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 上一页 2 3 4 5 6 7 8 9 10 下一页 Last