Monthly Archives: January 2010

学习ncurses编程 #1

第一章:NCURSES 库简介

控制终端输出需要用到转义序列(escape sequence),但是在不同的终端上,同样的转义序列的效果是不一样的。能够在不同的终端上输出统一的结果,UNIX 的设计者发明了一种叫做 termcap 的机制。termcap 实际上是一个随同转义序列共同发布的文件。这个文件罗列出当前终端可以正确执行的所有转义序列,使用户输入转移序列的执行结果符合这个文件中的规定。但是,在这种机制发明后的几年中,一种叫做 terminfo的机制逐渐取代 termcap。从此用户不用在编程时翻阅繁琐的 termcap 中的转义序列规定,仅需要通过访问 terminfo 的数据库就可以控制屏幕的输出了。

在使用 terminfo 的情况下,让所有的应用程序访问 terminfo 数据库控制输出(比如发送控制字符,等等……)。不久这些调用代码将会使整个程序变得难以控制和管理。这些问题的出现导致了 CURSES 的诞生。CURSES 的命名是来自一个叫做 “cursor optimization”(光标最优化)的双关语。CURSES 库通过对终端原始控制代码(转义序列)的封装,向用户提供了一个灵活高效的API(应用程序接口)。它提供了一套控制光标,建立窗口,改变前景背景颜色以及处理鼠标操作的函数。使用户在字符终端下编写应用程序时绕过了那些恼人的底层机制。NCURSES是curses的新实现(New Curses),完全兼容cueses。

NCURSES 不仅仅只是封装了底层的终端功能,而且提供了一个相当稳固的工作框架(Framework)用以产生漂亮的界面。它包含了一些创建窗口的函数。而它的姊妹库Menu、Panel 和 Form 则是对 CURSES 基础库的扩展。这些库一般都随同 CURSES 一起发行。我们可以建立一个同时包含多窗口(multiple windows)、菜单(menus)、面板(panels)和表单 (forms)的应用程序。窗口可以被独立管理,例如让它卷动     (scrollability)或者隐藏。菜单(Menus)可以让用户建立命令选项,从而方便执行命令。而窗体(Forms)允许用户建立一些简单的数据输入和显示的窗口。面板(Panels)是 NCURSES 窗口管理功能的扩展,可以用它覆盖或堆积窗口。

第二章:从 Hello World 程序开始

编写ncurses程序,需要在c文件中#include <ncurses.h>,并在编译的时候加上-lncurses库。注意,ncurses.h中已经include stdio.h了。

#include <ncurses.h>

int main()
{
   initscr();                 /* 初始化,进入 NCURSES 模式  */
   printw("Hello World !!!"); /* 在虚拟屏幕上打印 Hello, World! */
   refresh();                 /* 将虚拟屏幕上的内容写到显示器上,并刷新 */
   getch();                   /* 等待用户输入 */
   endwin();                  /* 退出 NCURSES 模式 */
   return 0;
}

其中initscr()函数用于清屏,并进入ncurses模式,给stdscr分配内存。printw 函数把字符串输出到被称作“stdscr”的虚拟坐标(0,0)上。从显示的结果来看,坐标(0,0)在屏幕的左上角上。printw()函数的作用是不断将一些和显示标记相关的数据结构写在虚拟显示器上,并将这些数据写入 stdscr 的缓冲区内。所以,为了显示这些缓冲区中的数据我们必须使用 refresh()函数告诉 curses 系统将缓冲区的内容输出到屏幕上。

第四章:初始化

有一些很有用的初始化函数。

  • raw()和 cbreak()函数:禁用行缓冲。在 raw()函数模式下,这些字符将传送给程序去处理而不作为终端程序处理的信号
  • echo()和 noecho()函数:设置输入是否回显
  • keypad()函数:使用功能键,如F1,方向键等
  • halfdelay()函数:启用半延时模式

一个例子:

#include <ncurses.h>
int main()
{
    int ch;
    initscr();/* 开始 curses 模式     */
    raw();    /* 禁用行缓冲           */
    keypad(stdscr, TRUE);/* 开启功能键响应模式    */
    noecho();            /* 当执行 getch()函数的时候关闭键盘回显 */
    printw("Type any character to see it in boldn");
    ch = getch();
    if(ch == KEY_F(1)) 
        printw("F1 Key pressed");
    else
    { 
        printw("The pressed key is ");
        attron(A_BOLD);
        printw("%c", ch);
        attroff(A_BOLD);
    }
    refresh(); /* 将缓冲区的内容打印到显示器上 */
    getch();   /* 等待用户输入                    */
    endwin();  /* 结束 curses 模式              */
    return 0;
}

终端下的twitter客户端构想

一直有一个想法,就是写一个基于ncurses的终端下使用的twitter客户端,有类似BBS的键位绑定,再配合guake的下拉式终端还有screen,使用起来将会是比较爽的一件事情。因为觉得qwit没有快捷键可以用来调出主窗口,而且总觉得不好用;echofon虽然足够强大,支持多用户,自动缩短长网址,未读数提示,未读消息与已读消息之间的颜色区分,可以自定义API等等很好用的功能,但是快捷键不知道为什么设置成ctrl+shift+I之外的键都不管用,不知道是不是跟vimperator冲突了,就算快捷键调出窗口,获得输入焦点还要动鼠标,比较不爽,最重要的是,它依赖firefox。guake可以自定义快捷键,再配合screen,专门开一屏用来运行这个想象中的nctwit,想看的时候调出终端看就行了,而且自动获得焦点,完全不用动鼠标了。

想法不错,但要想实现,还是需要好好学习一番啊。首先翻出之前写nctvshow这个看校内IPTV的ncurses终端程序时看的”NCURSES Programming HowTo”,再次好好学习一下ncurses编程吧。这次预想的界面和功能都要比nctvshow复杂很多,写起来肯定要费一番功夫了,希望在最后一个寒假结束之前能有一个大概能用的框架。

另外,在设计nctwit的功能的时候,忽然有了另外一个想法,就是写一个类似KBS的server,也在23或者22端口监听,用户连接之后输入twitter的用户名密码就可以登录,然后上twitter就很像登录BBS了,可以多人同时使用一个server登录twitter,也算是一种twitter的代理服务器吧。不过这个就更复杂了,还涉及到比较复杂的网络编程技术。如果以后有时间有能力再慢慢折腾吧。

Right ALT修复

昨晚发烧回家,38度中给系统升级,今天起来发现gnome桌面进不去了,说什么xclient脚本不在,默认进了xfce。进去后发现,gnome-panel这个包不见了,可能是昨晚给删掉了吧。手动apt安装说python2.6-gtk2这个包不存在,可能是python升级,相应的包还没配套齐全吧。那就用一阵子xfce吧。

但是要用xfce还需要设置一番。首先右ALT又不能用了,还是映射到什么3rd-level上去了,好像是要输入法文德文中的一些特殊字符用的吧。在gnome下,之前这篇文章说明了如何设置,但是在xfce下没有相应的选项,只好另找办法了。经过搜索,发现了这篇文章,其中的方法是先用xev探测出R_ALT的键值,再用xmodmap把这个键值映射到左边的ALT上去。

xev
KeyPress event, serial 35, synthetic NO, window 0x3400001,
 root 0x101, subw 0x0, time 10598179, (170,-16), root:(781,429),
 state 0x10, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
 XLookupString gives 0 bytes:
 XmbLookupString gives 0 bytes:
 XFilterEvent returns: False

可以看到Alt_R对应的键值是108,然后可以用命令

xmodmap  -e "keycode 108 = Alt_L"

来重新映射。再把这句话加到~/.bash_login中,让每次登录的时候运行一下。

这个方法只能在X下才能生效,如果要在console级别也可用,那么需要重新映射键盘,可以参考这个文章

这个问题是解决了,但是ALT-F2还是不能调出“运行”的对话框,再研究一下。

这里顺便说一下bash读取这些配置文件的顺序。如果是一个登录shell,那么bash以如下顺序读取配置文件

/etc/profile ~/.bash_profile ~/.bash_login  ~/.profile

如果是非登录shell,那么就以如下顺序读取

/etc/bash.bashrc ~/.bashrc

实习半年总结

从2009年8月3日到2010年1月12日,其中9月请了10天假,11月请了一个月假,共工作583小时,每小时15的劳务费,总收入为8745,如果扣掉税的话净收入应该在7000块钱左右。学习了rhts的基本用法,bugzilla的基本知识,errata的基本流程,测了4个左右的virt test,写了4个左右的脚本,完成了diskdump的自动化设置等等。总的来说,效率不高,学到的东西也不是很多。

从这半年的实习来看,造成效率不高的原因还是在思想上,没有足够的重视,还停留在上一篇文章中提到的“学校思维”,潜意识里总觉得就算做不好也不会有很严重的后果。虽然从总体上来看,我做的还可以,不然也不会让我留下,更没有什么严重的后果,但是自己知道,我没有全心投入。没有认真去思考总结,有些问题遇到就遇到了,没能进一步思考,跟之前遇到的一些问题是否有联系,如果再遇到类似的问题要怎么办。做事还存在糊弄的情况,没有做深入的研究。这些都是以后正式工作需要避免的情况。

正式入职后,要做到:

  • 认真对待每一个任务,不要有糊弄的细想,要认真研究学习,做到心中有数
  • 注意平时积累,多思考总结,也许需要做一个工作记录
  • 多和别人交流,善用邮件的抄送
  • 留心观察公司的情况,人员等等,对周围环境也要做到心中有数
  • 白天工作时不要分心,twitter和greader等要在午休的时候看,不要占用工作时间

先想到了这些。总之要处处小心认真,心中有数,思考总结,不能稀里糊涂的工作生活。

学生-公司职员,角色转换前的思考

今天把论文送审的事情算是搞定了。内审是钮老师,下午把论文送到她办公室;外审周xx还没最后决定,但是说是下周找一个北航的老师,由于下周二我就回家了,所以麻烦刘念师兄帮我送审。打电话跟周xx说明一下情况,结果被骂了一顿,说买票也不和他商量一下,论文的事情还没做完就回去了,还得他给送审。我赶紧解释说原来学校规定27号封楼,只好买26号的票,而且论文送审是这周一钮老师才开会说的,之前不知道,送审的事情不用你去,已经麻烦师兄了,他才算是消火。赶快顺利毕业吧,离开这个鬼地方。在实验室的这几年可以说什么知识都没从实验室学到,完全是在论坛干活学和自己学的。遇到这么一个不负责的无良老师,只能认倒霉了。还好,这种日子马上就要结束了。

牢骚了这么一大段,其实就是想说,论文的事情年前的任务已经完成了。剩下的就等年后回来看评审的结果,如果需要修改再修改,然后答辩,办理离校手续,七年的大学生活就算画上句号了。自己也要从一个学生的身份,转换到公司的一名普通职员了,很多事情我准备好了吗?也许答案是,没准备好。

从学校离开意味着离开这个保护伞,完全进入社会,感觉有点像一条小河马上要流入大海了。从学校到社会的转换,最重要的是思想上的转换。我之前还没有意识到这个问题,或者说认识不深,认为这种思想上的转换没什么,认为那些刚进入社会而不适应的情况不会发生在自己身上。而实际上,经过这半年的实习,尤其是最近接踵而来的各种事情,让我认识到了,社会真是不像想象中的那么简单。

先从表象说起吧。前几天跟戴俊同学gtalk上聊天,说到了租房子的问题,忽然觉得这是一个必须要解决的问题了。之前也知道毕业前要租房子,但是那时的思想还停留在,反正会有地方住的,现在还不用费心想,到时候随大流肯定有地方住了,自己不用怎么操心。而真正到了要租房子这个时候才发现,你自己不去想不去准备,没人会帮你想帮你准备的,房子还是要自己去跑,自己去租。另外一件事情,就是我姐和我说过好多次的学车的问题,以前一直觉得车肯定是要学的,但是什么时候学,不知道,时机到了肯定会学的,所以一直也不在意。直到要毕业的这个节骨眼上,才真的觉得,没什么时间可以学车了,也许只能三月辛苦一下,在论文、答辩、租房、毕业等等各项杂事中间抽出时间来学车,四月再辛苦一下,每天晚上去学两个小时,两个月把车学完。最后一件事,就是关于买房子的事了。这件事我姐之前也和我说过,让我关注一下,有合适的就买吧,可我总觉得现在一点经济基础都没有,关注也没用。到时候肯定会有房子住的,好像谁给安排好了一样。但是这个“到时候”究竟是什么时候,我也不知道,就是觉得肯定会有这么一个时候的。

从上边三件事,我突然感觉到了它们之间的相同的地方,那就是这个“到时候”。总觉得这些事情还不用自己现在操心,将来某个时候会有人给我安排好的,我只要看别人怎么做我也怎么做就好了,一切问题都会解决。这也许就是从学校到社会的最大的转变吧。在学校这种环境下生活了快20年,思维已经定式了。在学校当中,什么事情都由学校和老师安排,什么时候该做什么事情,别人已经都帮你计划好了,你只要听从指挥,学校让你做什么跟大家一起去做就好了。比如,12月末中心要交论文,钮老师会在10月的时候就发邮件通知,班长也会群发一个短信;毕业了要交各种表格,班长会从辅导员那得到通知,然后再通知班里的同学,你要做的只是在通知里规定的时间内完成规定的事情就可以了。而这一切,完全不用你自己去思考去规划。这,就是社会跟学校的最大的不同!

步入社会,没有人会帮你计划在什么时候该做什么,没有人会告诉你现在要完成什么,下个月要完成什么,一切都要靠自己的思考和规划。你如果思考的不全面,落下了一些重要的事情,那么后果也只能自己来承担。比如,你不去自己思考规划怎么租房子,什么时候租房子,那么到毕业的时候你就是没地方住;你不去想什么时候学车,到最后你就是不会开;你不去思考规划如何攒钱,什么时候买房子,那么到最后,你就是没有房子住。这所有的一切,都要亲身参与进来,没有人能够代替你。这也许就是原来总听说的,“工作了各种事情就都来了”的意思吧,虽然以前也知道会有这些事情,但是竟然不知道,这些都要自己去从头到尾完成的,不去做,就真的什么都得不到,不像在学校中,不及格可以补考,很多不及格还可以留级。这真是肉搏的社会啊。

既然有了这种思想准备,那么现在就要开始学习适应这种生活,所有事情都要自己耗费脑细胞来思考规划,包括以后要走的方向,和要这么做所需要的各种准备。以后不能犯懒而不去想什么事情,不去做什么事情,在这个社会中,你不去做,最后就要被淘汰,就无法生存下去,已经不是在学校了,没有人能够保护你,任何疏忽都是要见血的。

安装dabr

有了空间不折腾一下dabr浪费了,也方便自己手机上推,毕竟在官方dabr没有被封之前用了不少时间,已经习惯了。本以为比较简单呢,结果折腾了挺长时间。

首先从google code上checkout出来代码

svn checkout http://dabr.googlecode.com/svn/trunk/ dabr

然后按照安装说明修改config.php文件。这里我没改什么,只设置了一个ENCRYPTION_KEY,随便设置一个字符串就好了。其他的关于OAUTH、bit.ly和flickr的key我都没有设置。只是想自己用,所以不用oauth;我基本不发链接,短网址服务也用不上;图就更不发了,我基本属于推上潜水的。

修改好了之后把dabr整个文件夹cp到www主目录下,debian默认是/var/www。测试一下发现,虽然能够登录,能够看主页,但是点什么链接都是404错误,比如replies和settings等等。第一天基本就折腾到这了。虽然想到了可能是.htaccess文件什么rewrite的问题,但是自己不会,也懒得折腾了,主要是没时间。

本来想把这东西留到寒假折腾的,但是今天还是没忍住,因为实在看着404不爽。经过简单的搜索,发现有人说dabr放在二级目录的时候需要注意,但是注意什么没有说明。又用dabr 404 htaccess等关键字搜索一下,找到了这个文章,基本就是把RewriteRule的index.php之前加上二级目录的名称,比如

/dabr/index.php?q=$1 [L,QSA]

然后再测试,以为能够正常运行了。但遇到的还是404。又自己胡乱修改htaccess,增加RewriteBase之类的,但都是失败了。这个时候决心看一些关于rewrite的资料了。经过搜索,偶然发现要使用mod_rewrite,在配置apache的时候必须要以下两行参数

Options Indexes FollowSymLinks
AllowOverride all

看了下/etc/apache2/sites-available/default中的配置,AllowOverride设置的是None,修改成all之后,再访问dabr果然有了不同的结果,是500服务器配置错误了。赶紧查看apache的错误信息

Invalid command ‘RewriteEngine’, perhaps   misspelled or defined by a module not included in the server configuration

难道是rewrite模块没有启用?查看/etc/apache2/mods-enabled/下果然没有rewrite。使用命令

sudo a2enmod rewrite

启用rewrite模块。再次测试,还是500,再看日志,发现这回是Invalid command ‘Header’了。经过搜索,发现是headers这个模块没有启用。再次启用

sudo a2enmod headers

再再次测试,dabr终于能够正常使用了。

忽然想到,前一阵在配置wp的时候,修改了Permalinks格式之后,就只能看首页,文章都看不到了,也是因为rewrite没有启用。

关于apache的配置,服务器的配置和监控,信息统计等等,还有很多要充电啊。慢慢折腾。

八达岭滑雪场滑雪归来

计划中的滑雪今天终于实现了。
本来金鱼同学在12月的时候就张罗了一次滑雪了,不过因为我那个时候工作和论文都没有让人安心,所以就把滑雪的计划推迟了。一月初的时候把工作offer签了,11号的时候论文盲审也没有抽到我,所以这个周末就有时间来滑雪了。
首先要赞扬一下金鱼同学,事先把滑雪票买好,上网查好攻略,安排好时间,然后群发短信,大家分头准备,事情安排的干净利落。短信原文如下:

门票已买,每张85,包括门票、全天滑雪不限时、一套雪具、拖牵、雪道费用。自费项目如下:雪具押金300,如租雪服,30每套,雪服押金200,如不租雪服,自己穿厚点的羽绒服也行。如不愿交押金,可用身份证加银行卡代替。租用存衣柜,10元一个,可多人共用一个。其他娱乐项目自费,如雪地摩托。

其他事项:

1、乘车线路:德胜门乘919路(延庆方向,5分一班),前行30分钟(或乘坐出租车,前行5分钟)即到。

2、集合时间:周日早上7点半,积水潭地铁内集合。

3、需要携带物品:食物,用于解决中午饭,也可在雪场吃,据说自助餐30一人;帽子,围脖,手套,太阳镜,防晒霜自选;最好多带双袜子,滑完雪后脚会出汗,雪鞋基本不透气。

事实证明,早起,食物,手套,尤其是袜子,都太重要了。后面慢慢说。虽然计划的很好,但是要执行起来还是有点困难,因为真是很久没有早起了。如果要七点半到积水潭地铁站,那么就要六点二十起来,然后去北师找陈姝风,大概6:45,吃早饭到七点,走到车站7:10,坐车到积水潭。周六晚上,或者说是周日凌晨一点我睡觉了,订了早上6:20的闹钟,感觉刚睡不长时间闹钟就响了,没办法,起来吧。早上的时间基本都是按照预想的来的,我们7:07吃完早饭,7:15走到车站,5分钟后到积水潭,在那还等了10分钟。

八点919开车,人不多,都有座,这就是早起的好处吧,人少,据说十点的时候会很多人。我自从04年从昌平回来就再没坐过919,这次算是6年后的第一次吧,只是这是旅游专用,车豪华了很多。经过一个半小时的车程,九点半我们到站了,西拨子站。刚下车就有黑车司机来找生意。20块钱6个人,我们也没讲价,就上车了。大概5分钟到达雪场,检票,办卡,领雪具和租雪服、衣柜。经过一番折腾,终于都穿好了。多亏陈姝风多带了一双大厚袜子,鞋里舒服了很多。

走到雪场,先照相,然后开滑。三个女生都不怎么会,在中等坡度的雪道上纷纷摔倒,从上到下平均要摔倒三次。后来经过王迪和金鱼的调教,算是能够比较稳定的从坡上出溜下来了。

雪场全景

经过上午两个小时的练习,我基本熟练了从坡上出溜下来的动作要领。中午12:15开始午饭。午饭还是很丰盛的,看图。

我们的午饭

就是是在室外,比较冷。王迪的方便面是10块钱,黑啊。

吃了午饭,回到大厅休息了一会儿,脚踝上边的小腿骨被雪鞋勒的很疼。下午我和王迪金鱼都挑战了一下坡度最大的雪道。上到最上方看雪道都有点害怕,在犹豫到底要怎么下去,是冲下去还是滚下去……结果还都是冲了下去,金鱼还冲了两次,摔了一次。我唯一的一次摔跤是去排队上动力缆车的路上,停不下来了,直接撞倒了人。

下午三点,回到大厅,换回平时的装备。雪鞋里的袜子都湿了,还好有备用袜子。四点坐车,六点半才到德胜门。然后新街口的东来顺,我请客火锅,八点多回来,就是累啊!

不过玩的是很爽,以后很少有这样的机会了。

马上熄灯了,就写到这吧,笔记本电池完全不管用了,已经变成台式机了。

bash的 -e 参数

昨天给电脑升级的时候,没有dist-upgrade成功,在最后给出了一个错误信息

Setting up console-tools (1:0.2.3dbs-67) …
Setting console screen modes and fonts.
Setting console screen modes and fonts.
invoke-rc.d: initscript console-screen.sh, action “start” failed.
dpkg: error processing console-tools (–configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
console-tools

但是昨天没有细看,还想着像以前一样等包升级自动解决这个问题,一般情况下debian sid的更新还是很快的。

当今天再次给系统dist-upgrade的时候,依然遇到这个问题,决定要折腾一下。从出错信息当中可以看出,是在启动console-screen.sh这个脚本的时候失败了,而且这个失败是在deb包的post-installation阶段。上网搜了一下这个出错信息,没有发现已存在的解决方案,不过有一个人提到了/var/lib/dpkg/info这个路径,我在里边找到了console-tools.postinst这个脚本,也就不用我自己费劲找了(之前对这些脚本在什么位置有点印象,但是具体记不住,自己找总归效率低下)。打开这个脚本,发现里边有这么一句

invoke-rc.d console-screen.sh start || exit $?

说明就是这句出错了,导致整个脚本返回1。那就再看看这个脚本吧,/etc/init.d/console-tools.sh。手动运行一下这个start脚本,发现返回值是1,说明没有成功。但是打开脚本却没有发现可疑的语句。最后利用到处echo “haha”的方法,把可以的语句定位在了这么一句话上:

readlink /proc/self/fd/0 | grep -q -e /dev/vc -e '/dev/tty[^p]' -e /dev/console
 if [ $? -eq 0 ] ; then
…………
 fi

经过反复测试,在执行完readlink这个语句后脚本就以1退出了,后边的都没有执行。而手动运行这个语句也是返回1的。说明这句运行返回失败后脚本就退出了,而没有继续运行下去,继续检查这句的返回值,这明显是不正常的。这时候忽然看到脚本最开始有一句话

set -e

豁然开朗,认定肯定是这句话导致的,虽然不太清楚它具体是什么作用,但是之前看过的一些脚本里也设置了这个,是跟返回值处理有关的。经过一番搜索,发现了一篇对这个参数讲解的比较好的文章,其作用就是当脚本中有语句返回非零值的时候,脚本就以该值退出,而不继续运行。文章中还特意强调了当使用set -e的时候,不能检查返回值$?了。

文章中还介绍了其他参数和bash编程时的技巧,其中与-e比较相似的是-u参数。-u的主要作用是,当脚本中使用了未定义的变量的时候自动退出,避免产生灾难性后果,比如

rm -rf $prefix/bin

这样的语句在$prefix变量没有设置的时候,/bin目录就完蛋了。

到此总算是搞清楚了,也算是培养自己主动思考,学习积累的能力吧,这也是今年重点培养的一个目标。

开始折腾wordpress

2010年了,决心开始改变,从写blog开始。

本来想的是先买一个国外的空间,然后在那个空间里搭建wordpress的blog,并且通过ssh隧道的方式为自己提供一个代理。但是在一番搜索折腾之后,发现没有信用卡是什么都买不了的。但是如果等到可以办信用卡就要等到工作,那也至少是3个月之后的事情了。为了不让自己在长时间等待过程中把热情消耗没了,今天决定先在自己笔记本上搭一个wordpress,让自己没有借口不写blog和总结。虽然只能从本机访问,但是目前来说够用了。到时候空间买下来了再迁移wp应该也不是难事。

废话完了,下面记录下怎么安装配置wp的。

WordPress的安装和配置

安装

在debian系统上安装软件是很简单的事情了,wp在源里也是有的

sudo apt-get install wordpress

这样就可以了。然后再用sysv-rc-conf改一下apache和mysql的启动级别。

配置

其实难点在于如何配置。

先配置apache和mysql。主要参考了这篇文章:http://www.debianadmin.com/install-wordpress-in-debian-etch.html

在/etc/apache2/sites-available/目录下新建一个文件,叫blog,添入以下内容

Alias /blog /usr/share/wordpress
<Directory /usr/share/wordpress>
Options FollowSymLinks
AllowOverride Limit Options FileInfo
DirectoryIndex index.php
</Directory>

这样在访问http://localhost/blog时就转向了/usr/share/wordpress目录了。然后把这个站点启用起来

sudo a2ensite blog

最后再重启apache就可以了。最基本的apache设置就到这,在网上还搜索到一些关于htaccess文件的用法,但现在我还不懂,也用不到,用到的时候再折腾吧。

接下来设置一下mysql

sudo sh /usr/share/doc/wordpress/examples/setup-mysql -n gery 127.0.0.1

-n后边的是mysql的用户名,后边的参数是域名或者主机地址。

然后就可以打开浏览器了,http://localhost/blog,这时候应该可以看到设置wp的页面了,也很简单,也就是填入邮件等一些基本信息,然后wp基本就可以用了。别忘了重置自动生成的admin密码。

深入设置

经过上一步,最基本的设置算是完成了,不过还要进行一些更深入的设置,用户、主题、插件等等。

首先把wp控制面板中的东西过一遍,尤其是最后的设置选项卡里。这时候发现admin用户是没有头像的,感觉很难看。经过搜索发现,是通过gravatar这个网站的服务来实现的。首先要到gravatar这个网站注册一个帐号,其实就是激活一个邮件地址,并且把一个邮件地址跟一个头像绑定,这样在所有支持gravatar的网站上,只要输入了这个邮件地址就会显示绑定的头像了。

接下来想换一个主题了,默认的那个有点难看。还是经过一番搜索,下载了几个主题,把它们纷纷cp到/usr/share/wordpress/wp-content/themes目录下,然后就能够在控制面板的外观选项卡里看到主题了,可以预览并激活,还是很方便的。我选了一个叫mystique的主题,并针对主题进行了一番设置。尤其是关于widgets的设置,是挺好玩的,标签云、最新文章、最新评论、搜索等都是通过widgets实现的。有时间可以继续折腾,安装更多的widgets实现更多的功能。

最后折腾了下插件,因为想在文章里贴入代码。又是通过搜索,发现了Highlight Source Pro这个插件,它是通过Server端的处理来实现代码高亮的。现在就可以试一试,通过<pre lang=”c”>code<pre>这种形式来识别代码,要求有lang这个参数

#include
int main(int argc, char *argv[])
{
        printf("Hello World!n");
        return 0;
}

好像效果还不错。原来直接用Preformatted格式就可以,不用专门转到HTML编辑模式下。

更新:为blog设置网站图标,favicon.ico。首先用gimp制作一个16×16的ico文件,放到www主文件夹下。不过这样直接访问localhost是能够显示图标的,但是localhost/blog就不能显示图标。经过搜索,发现了这篇文章,原来是需要把ico文件放入所使用的主题的文件夹下。把ico cp过去就好了。

其他未尽事宜

  • 上传图片还没搞定,能够上传但是在文章里显示不出来,可能是文件夹权限设置的问题
  • 加入更多站点统计信息的插件、widgets之类的东西,统计一些访问信息
  • 想办法把byr的blog搬家到wp
  • 有必要学习更多Web相关的知识了
  • 其他随时补充