2007年11月19日星期一

加速Ubuntu

  • 将localhost化名为主机名,编辑hosts文件,把127.0.0.1等于localhost和本机名写到一行中,比如:

    127.0.0.1 localhost 127.0.1.1 fwolf_pcname ==> 变成 127.0.0.1 localhost fwolf_pcname 
  • 禁用ipv6,编辑/etc/modprobe.d/aliases

    alias net-pf-10 ipv6 ==> alias net-pf-10 off #ipv6 
  • 并行运行开机启动脚本,编辑/etc/init.d/rc

    CONCURRENCY=none ==> CONCURRENCY=shell 

    但据说这种方法可能会造成启动问题,慎用,建议多核cpu才使用。

  • 禁用Pango的输出和文本渲染,主要针对mozilla和firefox,可能会导致cpu占用过高。编辑/etc/environment,添加一行:

    MOZ_DISABLE_PANGO="1" 

    关闭之后明显感觉到firefox的显示速度变快了,但显示形式也有了一些变化,比如


    、网页标题的黑体字现在能体现了,但也感觉字体渲染略微"模糊"了一点点。
  • 安装preload,它可以把一些常用到的库文件预加载到内存,用部分内存空间换取应用程序启动速度的提升。另外注意,prelink从Feisty 7.04起就没用了:

    sudo apt-get install preload 
  • 禁用多余的虚拟终端,编辑/etc/inittab,把getty部分只留一个就可以了:

    1:2345:respawn:/sbin/getty 38400 tty1 #2:23:respawn:/sbin/getty 38400 tty2 #3:23:respawn:/sbin/getty 38400 tty3 #4:23:respawn:/sbin/getty 38400 tty4 #5:23:respawn:/sbin/getty 38400 tty5 #6:23:respawn:/sbin/getty 38400 tty6 

    Ctrl+Alt+F2-F6就没东西了,F1是我们保留的终端,用于应急处理,F7就是正常的图形环境啦。
    注:有些情况下这样好像不行,还要编辑/etc/event.d/tty2,把start开头的两行都注释掉,3456都如法炮制,依然只保留1,再用热键切换过去就是空空的一个提示符了。

  • 调整hdparm加速硬盘,编辑/etc/hdparm.conf,参考内容如下:

    /dev/sda { dma = on io32_support = 1 mult_sect_io = 32 } 
  • 对于内存充足的机器减少对swap的使用,编辑/etc/sysctl.conf,添加:

    vm.swappiness=10 

    这个数值的默认值为60,越小对swap的写入可能就越小,有网友说1G内存调整为5感觉最合适,建议至少512M内存以上再调整这个数值,设为0的话就几乎等于不实用swap了。

  • 使用LVM,但暂时没有进一步的资料。

  • 用bootchart协助,优化系统启动过程,对耗时较多的过程进行优化。

  • 使用bum关闭掉不需要的服务,不推荐用sysv-rc-conf的原因是bum对服务、进程有比较详细的解释说明。

  • 如果fstab中挂有外部磁盘,启动时不需要检测,可以把pass设置为0(fstab中最后一列)。如果在安装系统时就选用更合理的分区方案、分区类型(比如XFS)效果更佳。

  • 现在应该都在用6.10 Edgy之后的发行版了,如果是486机器,请选用386内核;P4以后的机器,包括同期的AMD,请选用generic内核;服务器请选用linux-server内核,会有一点点的性能提升,maybe。参考Difference between linux-generic, linux-386

  • 用deborphan删除不用的库文件:

    sudo deborphan | xargs sudo apt-get -y remove --purge 

参考

Source: http://www.fwolf.com/blog/post/370

2007年11月16日星期五

在无线网络中使用RADIUS服务器+mysql进行用户认证

安全性

无线网络使用非常方便,但方便之余还要考虑安全性的问题。

首先是传输的安全线,WEP方式现在已经是不安全的了,容易被黑客破解密钥,监听通讯数据,所以现在以WPA及其衍生方式为主。

取消SSID自动播放功能也是一个好的习惯,所有无线局域网都有一个缺省的SSID(服务标识符)或网络名。如果企业具有网络管理能力,应该定期更改SSID;或者取消SSID自动播放功能。

然后就是接入的安全性了,即通过认证的用户才允许使用网络,除了网络设备自身具备的MAC绑定、ACL等功能之外,还可以选择RADIUS来进行认证,甚至完成计费等其他任务。

RADIUS的全称为Remote Authentication Dial-In User Service,是一种能够让服务器验证各种接入用户身份的协议(基于udp),RADIUS可以对用户身份进行集中管理,安全性更好,策略也更灵活,同时还可以记录用户的网络使用情况用于网管分析或者计费,已经成为比较常用的工业标准。在使用中,路由器、交换机等设备在需要验证用户身份的时候,向RADIUS服务器发送请求,RADIUS服务器则返回用户的相关信息,交给路由器、交换机等设备处理。

提供RADIUS服务的软件,windows下可以选IAS(Internet Authentication Service/Internet验证服务),Linux下则是FreeRADIUS,另外还有Cisco的ACS(听起来像是基于硬件设备的?)等等。

Windows下的IAS,RADIUS服务器

在本文中,我们将架设一个RADIUS服务器,并采用用户名、口令的方式验证无线上网用户。服务器为Ubuntu Gutsy 7.10。

安装radius

$ sudo aptitude install freeradius freeradius-dialupadmin freeradius-mysql   Setting up freeradius (1.1.3-3ubuntu1) ... Adding group `freerad' (GID 120) ... Done. Adding system user `freerad' (UID 112) ... Adding new user `freerad' (UID 112) with group `freerad' ... Not creating home directory `/etc/freeradius'. Adding user `freerad' to group `shadow' ... Done.  * Starting FreeRADIUS daemon freeradius                                        Wed Nov  7 11:35:36 2007 : Info: Starting - reading configuration files ...                                                                          [ OK ]  Setting up freeradius-dialupadmin (1.1.3-3ubuntu1) ... Setting up freeradius-mysql (1.1.3-3ubuntu1) ...  * Reloading configuration files for FreeRADIUS daemon...                        * HUP sent...                                                           [ OK ] 

现在安装是完成了,但用这种方式配置下去,最终用winxp客户端登录的时候,会提示没有用户密码的失败请求,即使你输入了正确的用户名/密码:

Login incorrect: [t/] (from client home_wlan port 1 cli 00-16-6F-6C-53-2C) 

或者在启动服务器时看见这样的错误:

rlm_eap: Failed to link EAP-Type/tls: rlm_eap_tls.so: cannot open shared object file: No such file or directory 

这并不是因为是使用了PEAP、EAP-MSCHAPv2协议,AP没有发送密码明文,而是RADIUS服务器端没有打开tls, ttls, peap模块,或者打开了但没有生效,再深层次的原因就是大概因为版权或协议问题,debian中的freeradius没有把openssl编译进去,用户若想使用,只能手工下载源码编译。参见(

简言之,还得从freeradius官网下载最新版源码再编译安装一遍,过程倒也不复杂:

tar zxvf freeradius-1.1.7.tar.gz cd freeradius-1.1.7/  dpkg-buildpackage -rfakeroot # 提示缺少什么包,就装上什么包  dpkg -i freeradius_1.1.7-0_i386.deb freeradius-mysql_1.1.7-0_i386.deb 

另外说明,是否能够直接编译安装,跳过apt安装我没有试验过,主要是怕证书文件和用户、组什么的不能准备好。

配置radius

修改配置文件:/etc/freeradius/radiusd.conf(注意如果在文件末尾修改的话,后面的值不会覆盖前面的值,所以要直接在原位置上修改),先打开几个log选项:

log_auth = yes log_auth_badpass = yes log_auth_goodpass = yes 

适当延长发送认证失败消息之前的暂停秒数,防止暴破,默认为1秒。

reject_delay = 5 

把authorize、accounting、session、post-auth几个部分中sql一句前的注释取消掉,启用mysql认证。

更改clients.conf,设置允许使用radius服务的设备,一般是AP的地址,secret是AP连接radius的密码,比如:

client 192.168.0.0/24 {     secret = some_pass     shortname = wlan     nastype = other } 

把eap.conf中的tls, ttls, peap三段的注释全部取消,这是启用peap的关键,也是上面手工编译安装的目的。

还有文档说使用mysql认证的情况下,需要注释掉users文件中的如下内容:

DEFAULT Auth-Type = System     Fall-Through = 1 

个人理解如果不这样的话,由于sql认证的顺序排在后面,所以前面的认证失败之后就去验证system的用户账号去了,mysql认证实际等于是没起到作用,但我没修改这个文件,也能够正常使用。

更改sql.conf,设置与mysql相关的信息:

server = "localhost" login = "mysql_user" password = "mysql_pass" 

现在重启freeradius服务,应该就可以正常服务了,可以简单测试一下(test/test是错误的用户名/密码,testing123是默认在clients.conf中定义的本机用户的secret):

# radtest test test localhost 0 testing123 Sending Access-Request of id 5 to 127.0.0.1 port 1812         User-Name = "test"         User-Password = "test"         NAS-IP-Address = 255.255.255.255         NAS-Port = 0 Re-sending Access-Request of id 5 to 127.0.0.1 port 1812         User-Name = "test"         User-Password = "test"         NAS-IP-Address = 255.255.255.255         NAS-Port = 0 rad_recv: Access-Reject packet from host 127.0.0.1:1812, id=5, length=20 

可以看到服务器接受到了请求,并返回了用户/密码=test/test的reject信息。

现在来准备mysql,先建库和用户:

$ mysql -u root -p mysql> set names 'utf8'; mysql> show variables where variable_name like '%character_set%'; mysql> create database radius; mysql> CREATE USER 'radius'@'localhost' IDENTIFIED BY '**********'; mysql> GRANT USAGE ON * . * TO 'radius'@'localhost' IDENTIFIED BY '**********' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; mysql> GRANT ALL PRIVILEGES ON `radius` . * TO 'radius'@'localhost'; 

然后创建radius相关的表和初始数据,表结构可以从Freeradius官网下载,本机也有一份/usr/share/doc/freeradius/examples/mysql.sql.gz,解压就行。表结构创建好之后,就可以创建使用者账号了,默认是存储在radcheck 表中的,可以使用这样的sql语句:

insert into radcheck (username,attribute,op,value) values ('user1','Password','==','password1'); 

其中参数attribute对应的值PasswordUser-Password也行,op对应的值用:=也行。

AP端设置

我使用的AP为H3C Aolynk WAP500ag,关闭a网,只开g网,主要设置为:

Secrity Mode: WPA Clipher Type: AES(比TKIP方式更加安全) RADIUS Server IP/Secret: RADIUS服务器所在的ip以及`clients.conf`中设置的对应`secret`。 Access Control: Disable 

客户端设置

aolynk WUB320g

认证方法:WPA,加密设置:AES,在802.1x验证中,设置验证方式为PEAP,验证ID好像无用,但不让置空(查看mysql中的记录,好像是登录成功后所显示的user名,依然用处不大),不使用Client证书,Tunnel协议为EAP-MSCHAP v2,ID和密码为RADIUS设置(存储在mysql中)的用户名/密码,如图:

迅驰笔记本

我用的这台笔记本上,Inter PROSet/Wireless 9.0.1.4(1999-2005)好像版本太旧,不支持我所设置的验证方式,在配置式里面能够设定"网络验证=WPA-企业、数据加密=AES-CCMP、验证类型=PEAP、身份验证协议=MS-CHAP-V2、用户身份凭证=用户名+密码",但连接上之后提示"未知的验证状态",无法传输数据,然后过一会儿被断开连接,所以只能使用winxp的网络连接设置。

WinXP的设置:无线网络连接属性->无线网络配置Tab页->首选网络(属性)->关联Tab页,网络验证:WPA,数据加密:AES,然后在"关联"Tab页,EAP类型:受保护的EAP(PEAP),在属性中,不选"验证服务器证书",选择"启用快速重新连接",验证方法:安全密码(EAP-MSCHAP v2),并在"配置"中不选择"自动使用windows登录名和密码"。写的迷糊吧,还是看图好了:

登录的时候,如果验证失败,就会提示用户点状态栏上的小图标,更换其他凭证,其实就是输入新的用户名/密码。

这种方式会自动记录下成功的用户名和密码,没有取消自动记录的选项,不过我在上海交大无线网-使用802.1x认证时注意密码泄漏问题中找到一个 注册表文件,可以清空密码,其实内容也是非常的简单:

REGEDIT4  [-HKEY_CURRENT_USER\Software\Microsoft\Eapol\UserEapInfo] 

上海交通大学网络中心 无线网还有一些无线网络使用方面的资料,非常值得参考。

连接成功,服务器上的log,供参考

rad_recv: Access-Request packet from host 192.168.0.201:1168, id=9, length=227         Message-Authenticator = 0xd183f5b181b63e0d6a8f4e73f39af43b         Service-Type = Framed-User         User-Name = "t"         Framed-MTU = 1488         State = 0x8e35307b622be9576b22872d13e0814b         Called-Station-Id = "00-0F-E2-51-41-70:WAP500g_1"         Calling-Station-Id = "00-16-6F-6C-53-2C"         NAS-Identifier = "wap500ag_1"         NAS-Port-Type = Wireless-802.11         Connect-Info = "CONNECT 54Mbps 802.11g"         EAP-Message = 0x020900261900170301001b307b40587df20edfbd63f7bbfe1b56600d799d610ba835f3e1f8f3         NAS-IP-Address = 192.168.0.201         NAS-Port = 1         NAS-Port-Id = "STA port # 1"   Processing the authorize section of radiusd.conf modcall: entering group authorize for request 29   modcall[authorize]: module "preprocess" returns ok for request 29   modcall[authorize]: module "chap" returns noop for request 29   modcall[authorize]: module "mschap" returns noop for request 29     rlm_realm: No '@' in User-Name = "t", looking up realm NULL     rlm_realm: No such realm "NULL"   modcall[authorize]: module "suffix" returns noop for request 29   rlm_eap: EAP packet type response id 9 length 38   rlm_eap: No EAP Start, assuming it's an on-going EAP conversation   modcall[authorize]: module "eap" returns updated for request 29     users: Matched entry DEFAULT at line 153     users: Matched entry DEFAULT at line 172   modcall[authorize]: module "files" returns ok for request 29 radius_xlat:  't' rlm_sql (sql): sql_set_user escaped user --> 't' radius_xlat:  'SELECT id, UserName, Attribute, Value, op           FROM radcheck           WHERE Username = 't'           ORDER BY id' rlm_sql (sql): Reserving sql socket id: 1 radius_xlat:  'SELECT radgroupcheck.id,radgroupcheck.GroupName,radgroupcheck.Attribute,radgroupcheck.Value,radgroupcheck.op  FROM radgroupcheck,usergroup WHERE usergroup.Username  = 't' AND usergroup.GroupName = radgroupcheck.GroupName ORDER BY radgroupcheck.id' radius_xlat:  'SELECT id, UserName, Attribute, Value, op           FROM radreply           WHERE Username = 't'           ORDER BY id' radius_xlat:  'SELECT radgroupreply.id,radgroupreply.GroupName,radgroupreply.Attribute,radgroupreply.Value,radgroupreply.op  FROM radgroupreply,usergroup WHERE usergroup.Username  = 't' AND usergroup.GroupName = radgroupreply.GroupName ORDER BY radgroupreply.id' rlm_sql (sql): Released sql socket id: 1   modcall[authorize]: module "sql" returns ok for request 29 rlm_pap: Found existing Auth-Type, not changing it.   modcall[authorize]: module "pap" returns noop for request 29 modcall: leaving group authorize (returns updated) for request 29   rad_check_password:  Found Auth-Type EAP auth: type "EAP"   Processing the authenticate section of radiusd.conf modcall: entering group authenticate for request 29   rlm_eap: Request found, released from the list   rlm_eap: EAP/peap   rlm_eap: processing type peap   rlm_eap_peap: Authenticate   rlm_eap_tls: processing TLS   eaptls_verify returned 7   rlm_eap_tls: Done initial handshake   eaptls_process returned 7   rlm_eap_peap: EAPTLS_OK   rlm_eap_peap: Session established.  Decoding tunneled attributes.   rlm_eap_peap: Received EAP-TLV response.   rlm_eap_peap: Tunneled data is valid.   rlm_eap_peap: Success   rlm_eap: Freeing handler   modcall[authenticate]: module "eap" returns ok for request 29 modcall: leaving group authenticate (returns ok) for request 29 Login OK: [t/] (from client hbzbb_wlan port 1 cli 00-16-6F-6C-53-2C)   Processing the post-auth section of radiusd.conf modcall: entering group post-auth for request 29 rlm_sql (sql): Processing sql_postauth radius_xlat:  't' rlm_sql (sql): sql_set_user escaped user --> 't' radius_xlat:  'INSERT into radpostauth (user, pass, reply, date) values ('t', 'Chap-Password', 'Access-Accept', NOW())' rlm_sql (sql) in sql_postauth: query is INSERT into radpostauth (user, pass, reply, date) values ('t', 'Chap-Password', 'Access-Accept', NOW()) rlm_sql (sql): Reserving sql socket id: 0 rlm_sql (sql): Released sql socket id: 0   modcall[post-auth]: module "sql" returns ok for request 29 modcall: leaving group post-auth (returns ok) for request 29 Sending Access-Accept of id 9 to 192.168.0.201 port 1168         Framed-IP-Address = 255.255.255.254         Framed-MTU = 576         Service-Type = Framed-User         MS-MPPE-Recv-Key = 0x578ab49877c333d5c8c93124e9d76c463a0abc2facc7ae25347a0d97490b6869         MS-MPPE-Send-Key = 0x019b5f44bb5dcb0b2c8f2af449215f548af6c63a8ecb692e79342d60a2131d08         EAP-Message = 0x03090004         Message-Authenticator = 0x00000000000000000000000000000000         User-Name = "t" Finished request 29 

其余未解决的问题

  • 使用dialupadmin管理账号等
  • 实现用户的MAC地址绑定

参考

Source: http://www.fwolf.com/blog/post/369

2007年11月13日星期二

Openoffice连接mysql数据库的具体方法

作用就相当与ms office里面的access,不过功能应该更强大一些,因为可以连接外部数据源直接进行操作。其他的form、query、report之类的功能应该大体类似。

设置其实不难(难的是连接上以后如何利用好功能),但对于不熟悉java的人(包括我)来说就未必了,所以记录在这里分享。系统环境:Ubuntu
7.10 Gutsy, Openoffice.org 2.3.0, Mysql 5.0.45-1ubuntu3。

首先要在openoffice.org中启用java,菜单Tools->Options,Openoffice.org组的最后一项,ooo应该自动监测出了系统中已有的jre环境,如图:

选中合适的jre环境,比如我选择的1.6.0_03,然后点旁边的Class Path按钮,设置类路径,由于要使用到JDBC Driver
for MySQL (Connector/J),所以下载解压之后,在这里把jar文件路径设置进来,ooo在需要的时候会自动调用,如图:

然后就可以新建数据库文件了,File->New->Database,注意其实ooo创建的只是一个数据库的"控制"文档。打开数据库创建向导之后,首选选择JDBC连接,然后继续:

然后输入数据源地址和java类名称,针对使用JDBC Driver for MySQL
(Connector/J)连接mysql数据库的情况,数据源地址格式为:
jdbc:mysql://[host][,failoverhost...][:port]/[database]
[?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...

所以我连本机mysql库就是:jdbc: mysql://localhost/db_name,端口默认为3306。JDBC driver
class要填com.mysql.jdbc.Driver,可以用Test Class测试一下类是否加载正常。

再下一步就是设置用户名以及密码了,可以点Test
Connection测试是否能够正常连接,如果不正常可以检查一下mysql的监听地址、端口以及用户名/密码是否正确。

最终确认,保存,就可以在ooo中看到mysql库中所有的table,以及进行下一步操作了。

如果要更改数据库连接信息,使用Edit->Database菜单就可以了。
参考

连接OpenOffice.org和MySQL就是这么简单
把OpenOffice连接到MySQL

Fwolf Mon, 12 Nov 2007 10:38:59 +0000
________________________________
Source: http://www.fwolf.com/blog/post/368

2007年11月6日星期二

Vim的奇怪问题

把Ubuntu升级到了7.10 Gutsy,基本顺利,接着得寸进尺,想顺便把compiz启用试试,让我的LeadTek Gforce2 GTS也发一下飙,没想到彻底失败,提示没有Xgl,或者说没有开Composite,天,我这块卡不关掉Composite还无法启动glx呢:
# Add this line in xorg.conf
Section "Extensions"
Option "Composite" "Disable"
EndSection

抱着一线希望鼓捣半天,重启n次之后,放弃,卸载,开始把玩gaim的升级换代产品pidgin,不错的东东,不用开LumaQQ了,问题就是好友太多(尤其是不在线或隐身的)分组、聊天信息都没了,一个人也不认识了。pidgin的新配置记录在~/.purple目录下,原来的~/.gaim下的内容都拷贝过来了,logs和smiles也link到了这个新的目录下。在尝试把这么目录配置到unison同步配置文件当中时,发现刚才不知道折腾啥了,vim出了奇怪的问题:

Vim的奇怪问题

vim在编辑文件的时候,只要一用方向键,或者是jkhl键移动光标,屏幕内容就向上移动一行,下面多出一个空行,还没等挪动光标到要编辑的位置呢,文件内容已经乱得没法看了。

怀疑是compiz造成的效果,卸载它,未果,重开Xfce Session,也不行,又重启了n回,居然发现了一个让我啼笑皆非的原因。

把鼠标移动到xfce4-terminal窗口的边缘,当鼠标从指针变成其它状态,也就是改变窗口大小的时候,按住鼠标左键,terminal窗口的中央就会显示当前terminal的行、列数,我的大小是78×23,而默认窗口的大小是多少呢?是80×24。再来看vim默认的状态栏,也就是屏幕上显示的最后一行:12,1 Top,前面的数字是当前光标所在位置的行、列号,Top后面还有一空格;再看我那出了问题的terminal窗口,每次移动光标多出来的一行第一个字母都是p,明白了吧,这个p就是Top中的第三个字母,由于屏幕宽度不够,每次vi刷新屏幕显示的时候,一行显示不下,就给挤到第二行了。

terminal窗口宽度至少设置为79,就没有问题了,着实让我弱智了一把。

另外,找到两篇不错的compiz使用方法介绍,对kde或xfce用户尤其有用,英文:

Source: http://www.fwolf.com/blog/post/367

2007年11月2日星期五

Linux下的firefox如何播放在线媒体

印象中,我Ubuntu下的firefox上网时,从来没有看到在线视频"动"过,包括观看十七大转播的时候,虽然cctv专门把首页都改成了报告专栏,但视频直播我看不到,只能看看文字转播。linux下的firefox就不能看在线视频么?显然不是,只是需要额外作点工作而已。

首先,我找到了mplayerplug-in,嫌编译太麻烦,直接下载了它为Fedora Core 6准备的rpm包,用alien转成deb,dpkg -i安装,倒是都顺利,可仍然不能播放。 Mozilla Plugin Support on Linux (x86)页面上给这个插件标的状态是"Untested",看来似乎还不够完善。

然后,又找到了别人说不错的Firefox Addon MediaPlayerConnectivity,也许是我网速太慢,居然在安装的时候遇到了错误,无法继续。

最后,又看到网上别人说装个mplayer-plugin包就可以了,apt一搜索,压根就没有嘛,不过拐了个小弯,用apt搜索了一下mplayer,发现了mozilla-mplayer,安装试试,安装时还会自动提示把刚才装的mplayerplug-in卸载,看来有戏,完成后一试,果然不错,能用,并且还挺好用呢。

想测试一下的话,可以到这里打开个在线视频试试,注意标着Inline才是在线的,External是直接提供下载的。缓存的时候如果着急,可以点右键选"Play"先看着;还有好处就是有很多选项可以定制,甚至能指定视频缓存保存位置──想保存在线视频的话就省事多了。

另外说点题外话,在制作网站时,嵌入媒体建议使用相对标准的语法,就像符合web 标准的媒体播放器代码一文中推荐的那样,比如我嵌入的wmv视频代码:

 

使用标准的代码即简单明了,又有利于跨平台、跨浏览器的兼容。

Source: http://www.fwolf.com/blog/post/365

WordPress升级到2.3.1

以前用的是2.2版本,现在最新版是2.3.1,我看重的主要改进是添加了tag的支持,就升过来了。

升级过程非常简单,下载包,解压,覆盖,然后执行一下wp-admin/upgrade.php就可以了。

忘记了WordPress从哪个版本开始支持Widgets功能的,可我用的这个模板是从1.5版本的默认主题,一路改过来的,虽然没有动大手术,琐碎的修改还是有一些的。对于我这个懒人来说,重新套模板然后更改显然是不划算的,虽然后来学聪明了,有些修改作成了插件,剩下的好像也不少,所以尽可能的在旧模板的基础上更改。

Widgets好像就是个可高度自定义的sidebar,在我现在的模板中,打开Widgets页面总是提示"No Sidebars Defined",不支持,好在我的要求也不高,咱自己动手,丰衣足食。

Wordpress的wp-includes/widgets.php这个文件,是Widgets的主要实现代码,所以修改主要是参照了这个文件的内容。好了,开始编辑现在这个旧模板的sidebar文件。

首先,要把存档archive改成下拉列表框,月份多了实在看着不舒服,widgets.php中有这么一段:

function wp_widget_archives($args) {
extract($args);
$options = get_option('widget_archives');
$c = $options['count'] ? '1' : '0';
$d = $options['dropdown'] ? '1' : '0';
$title = empty($options['title']) ? __('Archives') : $options['title'];

echo $before_widget;
echo $before_title . $title . $after_title;

if($d) {
?>

可以看出,内置的wp_get_archives函数的参数,原来只有type=monthly,现在多了format=optionshow_post_count=$c,前者应该代表是否下拉列表框形式显示,值的定义为$options['dropdown'];后者是是否显示本月文章计数,值的定义为 $options['count'],并且都是用1代表真,0代表假,所以修改就简单了,把原来的:

 

更改为:

         

就行了。

然后,把archive月份存档和category分类列表的位置互换,分类列表放在上面,直接调整代码顺序即可,同时给分类列表也加上分类计数的显示:

            
  • Categories

  • 最后,添加Tag Cloud,没有这个升级就白作了,参照widgets.php中的:

    function wp_widget_tag_cloud($args) {
    extract($args);
    $options = get_option('widget_tag_cloud');
    $title = empty($options['title']) ? __('Tags') : $options['title'];

    echo $before_widget;
    echo $before_title . $title . $after_title;
    wp_tag_cloud();
    echo $after_widget;
    }

    没什么太复杂的,直接调用wp_tag_cloud()函数,连参数都没有,最终代码为:

                
  • Tags Cloud

  • 这样就大功告成了,虽然模板不支持Widgets,侧边栏倒也符合我的基本使用需要了。

    Source: http://www.fwolf.com/blog/post/366