Monthly Archives: September 2012

php版本大于5.3.0导致日期函数抛警告异常

这两天碰到因为php版本升级,调用一些函数产生警告信息,从而导致编码不正确。 php版本大于5.3.0的时候,使用date(),mktime()等和时区相关的函数可能会产生以下错误:

Warning:  date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.
Warning:  mktime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.

产生该错误的原因是,php版本大于等于5.3.0之后,如果你的php没有设置默认的时区,使用时区相关函数,比如说date(),mktime()等函数就会产生这个警告。

1.解决办法:

1.1 设置变量date.timezone

在php.ini中设置变量date.timezone为一个有效的市区字符串,字符串值在这里有: http://php.net/manual/en/timezones.php 。例如:

date.timezone = "Asia/Jakarta";
date.timezone = "Asia/Shanghai";
date.timezone = "Europe/Berlin";

1.2 date_default_timezone_set()函数

在调用时区相关的函数之前,调用date_default_timezone_set()这个函数设置一个有效的时区字符串,有效的时区字符串在上面那个链接。例如:

date_default_timezone_set('America/Los_Angeles');
date_default_timezone_set('Asia/Shanghai');

在openshift顺利上搭建media wiki,并成功绑定域名

开通博客之后,一直有个想法搭建一个wiki平台进行知识管理,这些大量的文章写到wordpress还是不太合适,毕竟wiki的分类、查找和链接还是非常方便的;闲话少说,下面记录一下过程。

1.关于openshift的介绍

1.1 来自维基百科:

OpenShift is a cloud computing platform as a service product from Red Hat. The software that runs the service is open-sourced under the name “OpenShift Origin”, and is available on GitHub. Developers can use Git to deploy web applications in different languages on the platform. Uniquely, OpenShift also supports binary programs that are web applications, so long as they can run on RHEL Linux. This allows the use of arbitrary languages and frameworks. OpenShift takes care of maintaining the services underlying the application and scaling the application as needed.

1.2 来自百度百科

红帽OpenShift通过为开发人员提供在语言、框架和云上的更多的选择,使开发人员可以构建、测试、运行和管理他们的应用,从而重新定义了PaaS市场。以红帽全面的JBoss专业知识为基础,OpenShift凭借创新的特性(包括CDI)领导PaaS市场,并支持Java EE 6,从而将PaaS的能力扩展到更丰富和更苛刻的应用。建立在红帽开源领导地位基础上的OpenShift旨在终结PaaS的厂商锁定,使用户可以选择自己应用运行在哪个云提供商的云中。OpenShift将作为在线服务来提供。

2.关于media wiki

看了minix3的wiki站点之后,对python写的MoinMoin很有好感,刚开始还一直在为MediaWiki,MoinMoin,和dokuwiki的选择而头疼,经过一番搜索,觉得media wiki对中文的支持是最好的,而且支持php的主机也多,以后迁移什么的可能会方便一些,果断使用之。

2.1 来自维基百科的介绍

MediaWiki is a free web-based wiki software application. Developed by the Wikimedia Foundation and others, it is used to run all of the Foundation’s projects, including Wikipedia, Wiktionary and Wikinews. Numerous other wikis around the world also use it to power their websites. It is structured functionally.

2.2 来自百度百科

MediaWiki全球最著名的开源wiki程序,运行于PHP+MySQL环境。MediaWiki从2002年2月25日被作为维基百科全书的系统软件,并有大量其他应用实例。目前MediaWiki的开发得到维基媒体基金会的支持。 MediaWiki是建立wiki网站的首选后台程序,目前国内的灰狐维客等站点都采用这套系统。 MediaWiki一直保值着持续更新,当前最新版本为1.5.8(2006-3-26)和1.6.6(2006-5-23)稳定版本。MediaWiki的原作者为德国的Magnus Manske。

3.在openshift上申请账号,猛击这里

下载安装openshift的开发客户端 https://openshift.redhat.com/community/get-started

4.安装media wiki

这里假设你使用的平台是unix或者linux,用CLI进行操作,windows平台用git bash,请看参考文献。

4.1 建立一个wiki的php应用,并绑定mysql到这个应用上

app create -a wiki -t php-5.3
rhc app cartridge add -a wiki -c mysql-5.1

当你绑定mysql到你的wiki应用之后,openshift会分配给你mysql的主机名,用户名和密码,如下图,请保管好。 注意: “mysql://ip:port”,后面那个ip地址,请记住它,后面配置mysql数据库的时候会用到,它是数据库的主机名称,而不是localhost。

4.2 下载wiki程序并解压到目录wiki/

cd wiki/php
wget http://download.wikimedia.org/mediawiki/1.19/mediawiki-1.19.2.tar.gz
tar zxvf mediawiki-1.19.2.tar.gz
cd mediawiki-1.19.2
cp * -R  ..
cd ..
rm -rf mediawiki-1.19.2

4.3 用git提交到openshift,并发布应用

git commit -A
git commit -a -m "my first wiki"
git push

4.4 配置你的wiki,界面语言,数据库,还有一些其他信息

具体请看下面各图

4.4.1 访问你的wiki应用

比如说:http://wiki-verynix.rhcloud.com; 开始进行wiki的相关参数设置,如下图: http://pic.yupoo.com/zhongyijun/CeKPcjSF/bFjQ8.png

4.4.2 选择语言

http://pic.yupoo.com/zhongyijun/CeKPcjSF/bFjQ8.png

4.4.3 填写数据库信息

这一步容易出错:特别是主机名字,不是localhost,数据库主机填写刚才绑定mysql到php应用的时候分到的ip地址。

4.4.4 数据库配置

默认就行

4.4.5 其他信息

填上就行 http://pic.yupoo.com/zhongyijun/CeKPcQWy/lf0NR.png

4.4.6 下载配置文件,然后git上传

配置完成之后,会提示你下载LocalSettings.php文件,这是刚才所有配置步骤生成的文件,请下载到你的本地应用目录里面,例如wiki/php,然后用git上传到openshift:

git add LocalSettings.php
git commit -a -m "settings coinfig file"
git push

5.绑定域名

5.1 用openshift的命令行工具执行以下命令:

rhc app add-alias -a wiki --alias wiki.verynix.com

5.2 添加CNAME记录

到你的DNS解析服务器那里添加一条CNAME记录(DNS记录科普知识 http://www.lihongye.net/post/dns.html),我用的是dnspod,如下图所示: http://pic.yupoo.com/zhongyijun/CfDaqvEW/pzzyD.png

5.3 修改wgServer变量

重要的一步,修改根目录下的LocalSettings.php的wgServer变量,要不然每当你访问你已经绑定的域名:wiki.verynix.com,网站会重定向回原来openshift给你的域名:wiki-verynix.rhcloud.com,相当于没有绑定。

$wgServer = "http://wiki.verynix.com";

然后git commit,git push.至此,一个media wiki应用就搭建成功了: 非常尼克斯的wiki站点;欢迎围观。

IE默认不显示小于阈值的自定义错误页面

自这个问题产生以后,我终于理解了为什么有这么多人这么讨厌IE了:不走寻常路。标准跟别的浏览器总是格格不入,这几天遇到一个error page的问题,对于400,403,404,405,406,408,409,410,500,501,505等这些错误码,如果你自定义了错误页,IE默认情况下返回它自定义的错误页面,不会返回你定义的错误页面。 这里通过一个简单的实验来理解ie的这个行为,实验环境:apache httpd web server 2.2.22 + IE 8。

1.默认情况及其解决办法

我们自己定义的错误页面error.html:

<html>
Error Page
</html>

访问一个不存在的页面,产生404错误: 可以看到,IE并没有显示我们自己的错误页面,如果我们改变error.html里面的内容为:

<html>
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha
hahahahahahahahahahahahahahaha

Error Page
</html>

再次访问index1.html,如下图: 能够正常显示。原因就是IE处理错误页面的方式,如果你自定义的错误页面大小小于某个阈值,它将显示它自己的页面;不同的错误码,阈值不一样,一般都是256B或者512B。 这里有个表:

Code Description File Size
400 Bad Request > 512 bytes
403 Forbidden > 256 bytes
404 Not Found > 512 bytes
405 Method Not Allowed > 256 bytes
406 Not Acceptable > 512 bytes
408 Request Time-out > 512 bytes
409 Conflict > 512 bytes
410 Gone > 256 bytes
500 Internal Server Error > 512 bytes
501 Not Implemented > 512 bytes
505 HTTP Version Not Supported > 512 bytes

如果你的错误页面小于阈值,那么你可以调整IE的选项: 把图中的“显示友好http错误信息”前面的勾去掉,就能成功出现我们的错误页面了:

Debian Squeeze安装输入法并配置中文环境

fcitx是linux下挺好用的一款中文输入法,词库比较丰富。

1.添加fcitx的源

debian squeeze很保守,因此很稳定,但是这也是源内的软件包版本比较低的原因,所以fcitx没有进debian squeeze,进了testing版本,需要添加下面这行到你的/etc/apt/sources.list:
deb http://download.opensuse.org/repositories/home:hillwood/Debian_6.0/ /

然后:

sudo apt-get update
sudo apt-get install fcitx

新建文件/etc/X11/Xsession.d/95xinput,并把下面这些内容写到里面去:

export XIM=fcitx
export XIM_ARGS="-d"
export XIM_PROGRAM=fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export LANG="en_US.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export XMODIFIERS="@im=fcitx"
fcitx &

如果apt-get update出现以下没有public key的错误:

W: GPG error: http://download.opensuse.org  Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4EE56CE7EBCA0CF4

请加入key:

wget -q http://download.opensuse.org/repositories/home:/hillwood/Debian_6.0/Release.key -O -|apt-key add -

2.设置系统的locale

2.1 什么是locale?

来自wiki pedia:
In computing, a locale is a set of parameters that defines the user’s language, country and any special variant preferences that the user wants to see in their user interface. Usually a locale identifier consists of at least a language identifier and a region identifier. On POSIX platforms such as Unix, Linux and others, locale identifiers are defined similar to the BCP 47 definition of language tags, but the locale variant modifier is defined differently, and the character set is included as a part of the identifier. It is defined in this format: [language[_territory][.codeset][@modifier]]. (For example, Australian English using the UTF-8 encoding is en_AU.UTF-8.)

简而言之,就是系统的字符集。

2.2 配置

sudo apt-get install locales
sudo dpkg-reconfigure locales

选择英语,简体中文和繁体中文的locale:

en_US.ISO-8859-1
en_US.UTF-8
zh_CN.GB2312
zh_CN.GB18030
zh_CN.UTF-8
zh_CN.GBK
zh_TW.BIG5
zh_TW.UTF-8

我缺省locale选择的是英文的en_US.UTF-8,这样系统的默认语言是英文,如果不习惯,请选择zh_CN.UTF-8。

3.安装中文字体

sudo apt-get install ttf-arphic-ukai ttf-arphic-uming xfonts-wqy ttf-bitstream-vera ttf-mscorefonts-installer ttf-wqy-zenhei ttf-wqy-microhei

文泉译的字体挺好看,如果你不喜欢,可以寻找更好看的字体。

4.后记

debian官方中的fcitx包不是很好用,从源代码安装也显得异常麻烦,从debian 6 squeeze升级到debian 7 wheezy之后,fcitx也无法正常工作,出现类似dbus connection error等错误;因此比较推荐从opensuse的这个源安装fcitx。 如果fcitx出现无法启动的其他错误,建议用dpkg –list找到相关软件,然后用apt-get remove删除,然后再重新apt-get install fcitx安装。

5.参考文献

Debian下用emacs的org2blog插件写wordpress博客

1.概述

自从适应了vim或者emacs的编辑模式之后,已经无法忍受其他编辑器的编辑速度,无法在文档内部快速移动的感觉让人很抓狂;为了实现这一“梦想”,前一篇博文足足写了3个星期,蛋疼无比的wordpress默认编辑器总是会自动转义一些字符,在html模式和visual模式相互切换的时候还会自动插入一些无用的代码,为了折腾emacs的org mode环境,又得重新折腾折腾linux环境了,装个软件总出错,不让人省心啊;刚开始想直接用ubuntu,省事,好久没用,LTS的版本都彪到12.04了,不想在实体机上折腾linux了,索性直接在虚拟机里面安装,但ubuntu用他自己的unity桌面,运行起来相当地慢,让我这老爷机情合以堪,无法启动;想起了gentoo,当年大学的岁月就是折腾系统的岁月,折腾系统的岁月就是折腾gentoo的岁月;可是当时无法识别我的dvd刻录机,水平有限,整了很久没有找到解决方案,我心已死,只能把gentoo深深埋在心底;于是乎,思来想去,还是Debian吧,感觉很好,相当稳定。
在这里,把折腾过程记录下来,有些地方可能对新手有用,避免走弯路。

2.安装debian

现在比较懒了,直接在网上找linux的vmware镜像,发现两个不错的网站推荐给同样需要的童鞋。
thought police,这里应该是最出名的提供linux和FreeBSD的vmware iso镜像下载,提供CentOS,Debian,Fedora,FreeBSD,Ubuntu,OpenSUSE的镜像,很不错;不过这里的镜像大多是没有桌面环境的。
trend sigma,这里vmware iso镜像很不错,提供Bodhi,Debian,Fedora,Mint,Ubuntu,Lubuntu,openSUSE的镜像下载,我就是用这里的Debian 6镜像。
注意:trendsigma的Debian 6有两个镜像,一个带vmwaretool,这个版本预装的软件会多一些;一个不带vmware tool,这个版本预装的软件会少些;建议使用带vmware tool的版本,因为第二个版本你需要安装vmwaretool,比较麻烦,还会出现如下的错误:
Searching for GCC...
The path "/usr/bin/gcc" is not valid path to the gcc binary.
Would you like to change it? [yes] 

即使已经有gcc,但是还是会出现这样的错误,因为一些头文件没有正确安装, 解决办法(参见:superuser.com):

sudo aptitude install libglib2.0-0 gcc-4.3 make linux-headers-`uname -r` -y

3.安装emacs和org mode

emacs就不多介绍了,简单介绍一下emacs的org mode,这是一个神器,文本编辑终极解决方案。
来自wiki pedia:
Org-mode is an editing mode in the text editor Emacs which supports the editing of plain text hierarchical documents. It has specific support for a number of different use cases, such as writing to-do lists, project planning, and writing web pages. For example, to-do items can optionally be given priorities and deadlines, subdivided into sub-to-dos or checklists, and given tags and properties. An agenda for the items to be done this week can then be automatically generated by Org-mode.[2] Org-mode also includes a lightweight markup language (similar in function to Markdown, reStructuredText, Textile, etc., but with a different implementation) for text formatting such as *bold*, /italic/, =code=, ~verbatim~, _underlined_, +strike-through+, | tables |, – lists, – [X] checkboxes, * headlines… According to the short description by Org-mode author Carsten Dominik, “Org-mode does outlining, note-taking, hyperlinks, spreadsheets, TODO lists, project planning, GTD, HTML and LaTeX authoring, all with plain text files in Emacs.”[3] Most aspects of Org-mode’s behaviour are customisable, in the standard Emacs ways (that is, either by setting variables directly, or by using the more user-friendly Customize interface). Since Emacs version 22, Org-mode has been part of Emacs[4] – although it is also released separately, and newer versions of Org-mode than the ones shipped with Emacs are often available.

3.1 安装:

sudo apt-get install emacs23
cd ~/.emacs.d (没有就创建)
wget http://orgmode.org/org-7.9.1.tar.gz
tar zxvf org-7.9.1.tar.gz
cd org-7.9.1
make config
sudo make install

3.2 激活org mode:

添加如下代码到你的~/.emacs文件里面(没有就创建):
(add-to-list 'load-path "~/.emacs.d/")
(add-to-list 'load-path "~/.emacs.d/org-7.9.1/lisp")
(add-to-list 'load-path "~/.emacs.d/org-7.9.1/contrib/lisp")
(require 'org-install)
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-cc" 'org-capture)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)
(transient-mark-mode 1)

4.安装org2blog

org2blog是把org模式的文章发布成wordpress格式的文章,理论上,也可以发布为其他博客系统的格式。
下面是来自官方网站的介绍:
org2blog/wp is a tool to publish directly from Emacs’ org-mode to WordPress blogs. org2blog/wp is one of the two packages named org2blog. The other is org2blog/atom by Tom Breton. org2blog/wp should, ideally, work with any platform that supports xml-rpc but some of wordpress specific features may not work. org2blog was inspired by and based on a wordpress posting client for muse-mode written by Ashish Shukla. org2blog is licensed under GPLv3.

4.1 安装

cd ~/.emacs.d
git clone http://github.com/punchagan/org2blog.git

把如下代码添加到~/.emacs文件中去:

(setq load-path (cons "~/.emacs.d/org2blog/" load-path))
(require 'org2blog-autoloads)

4.2 org2blog使用方法

这里不介绍,请看参考文献

4.3 一些问题

默认情况下org2blog是把org格式的文章转换成wordpress的文章格式;如果你已经有写好的wordpress文章,但是还是草稿状态,需要转换成org格式的文章,怎么办? org2blog的作者已经写好一个python程序,可以把wordpress的xml格式转换成org格式的文章。具体做法就是到wordpress后台,导出文章为xml格式,然后用这个python脚本转换成org文件,emacs直接编辑就行了。
还有一些问题,如果要批量转换怎么办?可以在wordpress后台新建一个用户,把那些要转换的文章划归到那个用户下,然后导出就行。
在debian squeeze下用org2blog-importers转换的时候,需要安装pandoc程序,因为debian squeeze实在保守了,保守的结果就是稳定,因此源中的软件包版本一般都会比较低,我在debian squeeze上安装pandoc的时候没少受苦,主要是ghc的版本太低,命令行安长cabal-install,然后安装pandoc,无法安装成功,如下错误信息:
base-3.0.3.2 requires syb ==0.1.0.2
however
syb-0.1.0.2 was excluded because json-0.5 requires syb >=0.3.3

官方提供的方法:

cabal install cabal-install
cabal install json-0.4.4
cabal install pandoc

也还是无法解决问题,原因就是ghc的版本太低,6.2的;所以你要自己编译安装最新的ghc,然后再安装pandoc。到这里下载安装最新的ghc,然后到这里下载安装Haskell平台。

5.参考文献