“Web开发”分类下文章 »

九月 04

Popular Codes:

  • Special Offer! Save 30%* Off Your Order of $100 or More! -Jul2013d
  • SAVE 30%* off your order of $130 or more! - gd3733bb
  • Special Savings! $2.99 . COMs at Godaddy! - CJC299C
  • Special Offer! .COM Just $0.99*! Additional .COMs Just $9.99* per Year! - 99COMS / HINCH199 / FBTGT9
  • Save 35% Off First Order - CJC35NC
  • Save 30% Off Your Order of No Minimum! - GDBBE1026 / GDBBE994 / GDBBE1562 / GDX737W / BBTLD30 / GDBBIA1562 / GDBBIA1026
  • Save More Then 90% on SSL Certificates! -Just $12.99* for The First Year! - CJCSSL12T2
  • Save 30% - Hosting Renewal Included! - GDBBHA994 / GDBBHA1026 ( Expires : July 06, 2013)
阅读全文»
dirk 发表于 2013-09-04 星期三
十一月 28

Apache/Subversion: SSL negotiation failed: SSL error: parse tlsext

我的 SVN 服务器升级到 FreeBSD 8.0 Release 之后,原先 Apache + SSL + Subversion 的环境,在客户端(包括 Ubuntu 9.10 和 Mac OS X 1.5.8)做任何 SVN 操作的时候,会得到标题给出的提示。

查了下,是因为 TLSv1 协议的问题,不知是 OpenSSL 的 bug 还是 Subversion 的 bug,总之无法正常工作。

修改 Apache 配置文件,屏蔽掉 TLSv1 加密方式:

SSLProtocol -ALL +SSLv3

SSLProtocol +ALL -SSLv2 -TLSv1

SSLProtocol ALL -TLSv1

反正只要没有 TLSv1 就能正常工作,经测试,暂时还未发现新问题。

dirk 发表于 2009-11-28 星期六
十一月 06

坚持了这么多年, Pdx.cn 终于还是走到了关闭这一步。

11月3号确定了最后的关闭决定,不想连接内网的交换机也在这几天出现了故障,致使网站一直无法正常、稳定的访问,原先答应用户的数据迁移可能都无法实现。

说实话,我本来不想管了,因为在无法快速替换硬件的前提下,修改系统设置绕过内网是比较麻烦的,需要修改很多东西,当年这个系统一出身就是这么设计的。

但今天,我看到了 某些人的执着 ,还有这个 Mypdx.cn 域名,也是我规划了很多年一直打算注册却没有付诸行动的。

由此,我多少受了点触动,也许真的有人很依赖这里(至少数据迁移完毕之前是如此?),今天花了一个多小时,小心翼翼的修改了一些系统设置,到目前为止,至少可以正常的访问,包括 Web 和 Wap;那么,足够坚持到承诺用户的迁移和备份的最后时间了。

有时候,我会问自己,要以怎么样的方式来纪念这个产品(某种程度上也算是我的一个孩子?),不管怎么样,这始终是我生命中非常重要的几年时间。同时,我也希望多少能给某些人留下一点生命的记忆。

让我们再默念一次: 万蝶,随时随地的记录与沟通!

dirk 发表于 2009-11-06 星期五
十月 22
Subversion

有两个命令可以完成:

  • 客户端:
svn propset svn:log "message text" -r 1000 URL --revprop
  • 服务端:
svnadmin setlog REPOS_PATH -r REVISION FILE

但是,两者都需要设定 pre-revprop-change,仓库下 svn/hook 目录里有 pre-revprop-change.tmpl 模板,复制一份到文件 pre-revprop-change 并 chmod a+x 就可以了。

dirk 发表于 2009-10-22 星期四
十月 02

SVN users who wish to ignore multiple files with distinct names in the same folder beware : you must use a file and batch-process.

It’s not difficult to figure out that to tell SVN to ignore a file, you could use:

svn propset svn:ignore [filename] [folder]

So if I have a file ‘settings.py’ in folder config, in the config folder I would simply type:

svn propset svn:ignore settings.py .

But what if I also have another file, say ‘me.py’, in the same folder that I want to ignore? On top of that, what if I have other files with a .py extension that I don’t want to ignore? The following will not work:

svn propset svn:ignore “settings.py me.py” .

(incorrect syntax)

svn propset svn:ignore “*.py” .

(but i don’t want to ignore some .py files)

nor would the following, because svn for some odd reason seems to only take one propset assignment from the commandline – meaning only one of the files will be ignored:

svn propset svn:ignore settings.py .
svn propset svn:ignore me.py .

turns out you must make a file with the filenames on separate lines, then call with the -F parameter. For example in the above case, I would create a file “ignore.me” with settings.py and me.py on separate lines, then call

svn propset svn:ignore -F ignore.me .

Annoying. SVN should let you set the same property on multiple files with multiple command-line calls.

dirk 发表于 2009-10-02 星期五
八月 23

Django 为字符编码的转换提供了非常简洁的方法:

django.utils.encoding.smart_unicode
django.utils.encoding.smart_str

我们在需要将用户提交的数据转换为 Unicode 的时候,可以使用 smart_unicode,而在需要将程序中字符输出到非 Unicode 环境(比如 HTTP 协议数据)时可以使用 smart_str 方法。拿 DDlog 来说,也有不少地方用到了这两个方法。

1、smart_unicode 在 DDlog 中的使用

Blog 的标签(Tag)一般多少会有中文,对于服务器环境来说,不会安装系统级的 UTF-8 环境,那么浏览器请求的 URL 中包含的中文会作为经过 urllib.quote 编码转换后的 UTF-8 字符串(注意,这种情况下,Django 不会自动转换为 Unicode),这里,我们在使用这个数据之前,需要进行一定的转换。

比较原始的方法类似如下:

def post_via_tag(request, tag):
    from urllib import unquote
    key = unquote(unicode(tag).encode('UTF-8'))
    tag_as = Tag.objects.select_related().get(tag__iexact = key)

而如果使用 Django 的 smart_unicode,明显简洁得多(也更符合 DRY 原则):

def post_via_tag(request, tag):
    from django.utils.encoding import smart_unicode
    tag_as = Tag.objects.select_related().get(tag__iexact = smart_unicode(tag))
    # ... other code

2、smart_str 在 DDlog 中的使用

DDlog 在接受评论的时候,会将评论者的姓名和邮件地址保存到 Cookie 中,以便该用户下次发表评论的时候自动显示相关信息。而评论者的姓名有可能是中文的,如果直接把中文字符串放到 Cookie 中,会引发 UnicodeEncodeError 异常。

这里需要进行去 Unicode 编码:

def post_comment(request, slug):
    # ... other prepare code
    response.set_cookie('COMMENT_AS_NAME', smart_str(comment_user.name), expired_at)

就这么简单便捷!

dirk 发表于 2009-08-23 星期日
八月 15

为 DDLog 增加了代码高亮功能,使用的是 SyntaxHighlighter 这个 JS 写的开源代码。

除了字体大小在 shCore.css 强制设置了比默认更大的尺寸之外,其他的部分集成起来很顺利。

哈!最后,贴一段 Python 代码看看:

class FirstClass:                # define a class object
    def setdata(self, value):    # define class methods
        self.data = value        # self is the instance
    def display(self):
        print self.data          # self.data: per instance

class SecondClass(FirstClass):     # inherits setdata
    def display(self):             # changes display
        print 'Current value = "%s"' % self.data

z = SecondClass()
z.setdata(42)        # setdata found in FirstClass
z.display()          # finds overridden method in SecondClass
dirk 发表于 2009-08-15 星期六
八月 07

PostgreSQL 从 8.3 开始内建了全文检索功能,对于我们来说,只需要再找一个中文分词组件即可利用 PostgreSQL 打造完善的全文检索应用。我选择的是 NlpBamboo 这个分词库。

以下是在 FreeBSD 7.2 + PostgreSQL 8.3 环境下的配置过程(FreeBSD 和 PostgreSQL 相关的安装和设置请自行找资料)。

1、安装 CMake:

cd /usr/ports/devel/cmake/
make install clean

2、安装 crf++:

cd /usr/ports/science/crf++/
make install clean

3、NlpBamboo 路径比较特殊,建立以下符号链接(其实不是全部需要;或者你偷懒一点,直接拷贝拉倒):

ln -s /usr/local/lib/libcrfpp.a /usr/lib/libcrfpp.a
ln -s /usr/local/lib/libcrfpp.so /usr/lib/libcrfpp.so
ln -s /usr/local/lib/libcrfpp.so.0 /usr/lib/libcrfpp.so.0

4、获取 NlpBamboo:

Google Code 取出 NlpBamboo 代码;或者从 NlpBamboo 下载打包文件。

5、进行 FreeBSD 下的补丁修改:

这里需要注意,由于 NlpBamboo 中的 bamboo 工具用到了 getline 这个函数,但 FreeBSD 默认没有提供,你可以找一个替代品。我比较偷懒,直接把相关代码注释掉了,因为我实际上根本不会在服务器上用这个工具。我都是在本地进行相关训练统计。

这个 nlpbamboo-freebsd.patch(2.0 KB) 是我当前在用的一个 Patch 文件,你可以参考。

6、编译并安装 NlpBamboo:

cd nlpbamboo-read-only # 这里应该是你自己解压或者代码取出后的目录
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=release
make all
make install

NlpBamboo 默认会安装到 /opt/bamboo/ 目录,有特殊要求,自己修改。

NlpBamboo 安装后的目录结构:

  • /opt/bamboo/bin/ : 可执行程序和训练脚本文件
  • /opt/bamboo/etc/ : 配置文件
  • /opt/bamboo/template/ : CRF训练模板文件 (.tmpl)
  • /opt/bamboo/processor/ : processor库
  • /opt/bamboo/exts/ : 扩展接口
  • /usr/lib/ : 动态链接库
  • /usr/include/bamboo/ : C/C++的头文件

7、下载分词库数据文件:

请到 NlpBamboo 下载 index.tar.bz2 或类似文件,解压到 /opt/bamboo/index 目录:

cd /opt/bamboo/
wget http://nlpbamboo.googlecode.com/files/index.tar.bz2
tar -jxvf index.tar.bz2

8、安装中文分词扩展到 PostgreSQL:

cd /opt/bamboo/exts/postgres/pg_tokenize/
gmake install
cd /opt/bamboo/exts/postgres/chinese_parser/
gmake install
touch /usr/local/share/postgresql/tsearch_data/chinese_utf8.stop

9、在需要的数据库中导入分词:

psql -Uddlog
ddlog=> \i /usr/local/share/postgresql/contrib/pg_tokenize.sql
ddlog=> \i /usr/local/share/postgresql/contrib/chinese_parser.sql

10、如果没有错误,你现在可以用以下命令测试了:

psql -Uddlog
ddlog=> SELECT to_tsvector('chinesecfg', '我爱北京天安门');
            to_tsvector
-----------------------------------
 '我':1 '爱':2 '北京':3 '天安门':4
(1 row)

更多关于 NlpBamboo 的资料,可以到 NlpBamboo Wiki 里好好研究一下。

恩,最后,怎么使用,可以参看 PostgreSQL 的帮助文档。或者等有空我写个在 Django 中的使用方法。

动物凶猛,路过注意:

  • 使用 PostgreSQL 8.3 更早版本的同学需要安装 tsearch2 才能使用;
  • 使用 FreeBSD 7.2 更早版本的同学请先升级,NlpBamboo 用到了 7.2 才新增 strndup(3) 函数;
  • 请更新 Ports 到最新版本,某些东西会有一定版本依赖,比如 NlpBamboo 需要 CMake 2.6 以上版本;
dirk 发表于 2009-08-07 星期五
八月 01

我的新 blog 系统,ddlog 最新发布。

从 2008 年服务器故障开始,原来基于 Rails 的 Blog 系统基本不再维护,一来工作和生活很忙,二来也确实想找一个真正能让我愿意长期深入维护的框架。最终选择了 Django 这个基于 Python 的开发框架,更多的考虑是我最喜欢 Python 这们语言的缘故。

当然 Python 下也有很多开发框架,这个选择标准就像我当初选择 FreeBSD 一样(提升到一种哲学?),希望能有一个核心团队对整个框架有完全的控制,而不象 TurboGears 一样,使用了很多外部包,对长期性的开发、运营项目来说,这种“阳春白雪”的特性多少有点不利影响。

当前 DDlog 0.1 基于:

dirk 发表于 2009-08-01 星期六
七月 31

平常在Unix(目前主要是FreeBSD)下主要是使用 Vim ,而Emacs由于在远程终端下没有Vim方便简洁,真正使用的时间不是很多。Vim,从名字也可以看出,应该是早期Unix下标配编辑器VI的进化物,所以,Vim的基本东西还是承袭自VI,如果你熟悉VI,使用Vim起来自然得心应手。

虽然很早就迁移到Vim了,但对基本的VI编辑器依然不能忘怀,从网上找了这篇VI参考手册,一来留存纪念,二则时常温习温习,必定受益颇多。

今天又重新学习了几个生僻的命令,多用多用,自然不生僻了,呵呵!

The vi is a text editor. It is small, powerful, and standard on most UNIX systems. The vi often frustrates new users with a unique distinction between its two modes: Command Mode and Insert/Overtype Mode. This distinction, although difficult to become accustomed to for many users, provides great power and ability to the editor. Insert/Overtype Mode is designed for inserting text only. All text manipulations and cursor moving should be done from with in Command Mode.

Entering the vi

  • prompt$ vi
  • prompt$ vi file1 file2 …
  • prompt$ vi -r file #Recover file from crash
  • prompt$ vi +string file #Execute ex command “string”
  • prompt$ vi @rcfile #Read commands from rcfile
阅读全文»
dirk 发表于 2009-07-31 星期五