2007年4月6日星期五

CSS裸奔节之强制脱衣

今天是CSS裸奔节,所谓CSS裸奔,就是把网站的所有css去掉,这样所有的显示格式什么的就都没有了,只剩下html实体显示出来,起源好像是比较无聊的想法,就是剥去css的外衣,让大家看看你的(x)html代码是否工整。

不过今天偶不打算裸奔,而是告诉大家一个可以看到任何网站裸奔形象的方法,参考我以前写的用js丰富你的书签功能,创建一个书签,也可以放到书签工具栏上,内容如下:
javascript:void((function(){var
style=document.getElementsByTagName('style');for (i=0; i

后面的内容被截断了。。。
Source: http://www.fwolf.com/blog/post/312

2007年4月5日星期四

Xargs用法一例

起因要从Tomboy和同步说起,想同步两台电脑上tomboy的数据,"Start page"冲突也就算了,我用其他的,要命的是数据文件同步之后,tomboy必须要重新启动才能重新读取数据文件,所以要用 ps x找出tomboy进程,杀掉再重新启动,如果是使用默认的applet方式,gnome会自动提示是否重新加载的。总得ps x命令如下:
ps x|grep -m1 tomboy|awk '{print $1}'| xargs -I'{}' kill '{}'

功能解释如下

  • ps x就不用说了
  • grep是用来查找进程列表中带有tomboy文字的,-m1是只找出第一个匹配,因为第二个匹配会是ps x本身
  • awk是用来打印第一列的
  • xargs中的-I指定用'{}'kill命令中来代表输入参数,在本例中可以省略的。

以上命令组合起来就可以比较"智能"的完成任务了,和find -exec有些类似。

另外我发现tomboy的"Start Here"是不让删除的,不过把标题改一下就可以删了。。。

PS1: 发现hexdump可以以16进制形式显示文件内容,比如一个内容为01234567890的文件:

$ hexdump a
0000000 3130 3332 3534 3736 3938 0a30
000000c

注意这种默认的输出方式,字的高位可低位是反的,比如代表0的30就排在代表1的31的后面。也可以通过参数指定输出的方式,比如-b是逐字节按8进制输出:

$ hexdump a -b
0000000 060 061 062 063 064 065 066 067 070 071 060 012
000000c

-c是逐字符输出,转义字符会输出为\n这种形式:

$ hexdump a -c
0000000 0 1 2 3 4 5 6 7 8 9 0 \n
000000c

-C是16进制逐字输出,后面还显示原始字符,有点像Ultraedit里面的那种感觉:

$ hexdump a -C
00000000 30 31 32 33 34 35 36 37 38 39 30 0a |01234567890.|
0000000c

PS2: 今天在公交车上看新闻联播的时候在想,cctv的新闻联播有版权么?应该是有,那为何那么多地方电视台天天"转播"新闻联播,他们都交版权费了么?同样的还有纯洁春节晚会,天气预报,焦点访谈等等,都收点钱的话央视又能大赚一笔。

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

把DH主机上的mysql字符集倒腾为utf8

很久没有倒腾过mysql的字符集了,都疏忽了,以致于为LP安装Dreamhost上主机的时候,居然没有修改mysql数据库的字符集。也是由于mysql这东西,即使字符集设置错了,也是吃啥吐啥,拿错误的字符集就往数据库里存,所以外面根本看不出来。今天给LP写了个自动备份脚本,才发现导出的sql中全是乱码,岂能容忍?遂解决之~

首先还是放松了警惕,走了个弯路,我习惯使用的dump脚本是:

mysqldump --add-drop-table --default-character-set=utf8 -h mysql.mydomain.com --user=fwolf --password=mypasswd --extended-insert=false fwolf_db >  mydomain.com_db.sql

可是dump出来的sql一看中文全是乱码,于是去掉--default-character-set=utf8再dump,数据依旧,一时没想过来,用iconv把dump出来的sql左转换右转换怎么也是不对,后来才想明白,DH上mysql字符集的默认设置是这样的:

mysql> show variables where variable_name like 'char%';
+--------------------------+--------------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /data/mysql/ovadilla/share/mysql/charsets/ |
+--------------------------+--------------------------------------------+
8 rows in set (0.00 sec)

数据库服务器字符集是latin1,也就是mysql默认的latin1_swedish_ci,而系统的默认字符集则是utf8,所以不带--default-character-set=utf8参数dump的数据的时候,其实和带上这个参数是一样的!想通这个问题,又知道了mysql吃啥吐啥的特性之后,解决方法就简单了,记住如果WordPress和mysql都是默认设置的情况下,如果你能夠正常浏览中文,则说明配置就是错误的,因为WordPress默认也不是utf8字符集的。

首先,按latin1字符集导出sql:

mysqldump --add-drop-table --default-character-set=latin1 -h mysql.mydomain.com --user=fwolf --password=mypasswd --extended-insert=false fwolf_db >  mydomain.com_db.sql

这样导出的sql中的中文应该都是正确的了,现在修改导出的sql文件,把其中的latin1全部替换为utf8,然后再重新导入数据库,导入的时候强制指定字符集为utf8:

mysql --default-character-set=utf8 fwolf_db -h mysql.mydomain.com -u fwolf -pmypasswd < mydomain.com_db.sql 

这样,如果直接用mysql查询数据的话,如果不使用set names 'utf8',中文应该是乱码的,而如果你的数据库字符集仍然是默认的latin1的话,会是相反的情况:不使用set names 'utf8',中文正常,使用之后反而乱码。确认数据库字符集调整正确之后,再来搞定WordPress,这个就简单多了,编辑文件WP/wp-includes/wp- db.php,大概66行,在$this->select($dbname);前面,加上:

$this->query('set names utf8');

这样就全部搞定了,数据库和Wordpress的字符集全部调整为万国码utf8。

参考:

PS1: DH主机ssh、svn、cron、php-cli、fsocketopen什么的全部支持,太爽了,怪不得那么多人喜爱,就是ssh的速度慢了些。

PS2: 一个和mysql吃啥吐啥有关的笑话,不太雅:你来到医院,向医生说:我近来很不正常,吃什么拉什么,吃黄豆拉黄豆,吃西瓜拉西瓜,你问医生怎样才能恢复正常,医生沉默了一阵说:你吃屎吧!

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

2007年4月2日星期一

Ubuntu中Apache反向代理的使用

环境:Ubuntu 6.10 edgy, Apache 2.55

正常启用的方法很简单,首先要启用apache的proxy模块:

a2enmod proxy

然后在apache的conf中进行相应配置即可,比如我把/ubuntu反向代理到内网的另外一台主机,对公网进行服务:

     ProxyPass http://svr5/ubuntu     ProxyPassReverse http://svr5/ubuntu  

这样当公网用户访问我的主机的/ubuntu子目录时(注意/ubuntu这个Alias无需定义),Apache就会从访问内网服务器svr5的相应内容,并返回给用户。

以上是正常定义方式,不过在ubuntu下调用时却出现403错误,查看apache的error.log发现:

[Sun Apr 01 19:35:57 2007] [error] [client 121.*.*.*] client denied by server configuration: proxy:http://svr5/ubuntu/  

查看svr5的log没有访问记录,就是本服务器的配置中的问题,再查看/etc/apache/mods-avaliable/proxy.conf,发现如下内容:

      #turning ProxyRequests on and allowing proxying from all may allow     #spammers to use your proxy to send email.  ProxyRequests Off       Order deny,allow     Deny from all     #Allow from .your_domain.com  

为了避免spammer使用服务器发送垃圾邮件,proxy模块启用后默认是关闭所有访问的,真想不通反向代理怎么就能够发送垃圾邮件了,不过找到问题之后,解决方法就有了,就是修改这个/etc/apache/mods-avaliable/proxy.conf文件,把#Allow from .your_domain.com修改为Allow from 用户地址,虽然可以用211.24 来代表一定ip范围的用户,还是麻烦,干脆Allow from all也是可以的。如果觉得修改这个文件麻烦,也可以在httpd.conf中写上类似代码:

     Order deny,allow     Allow from all  

参考:

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

2007年4月1日星期日

CSS技巧两则——居中和编号列表

利用css让对象居中,比如是一个div,有人说这还不简单?不就是text-align: center么?其实不对,这只是让对象所包含的内容居中,而不是让对象本身居中,其实,我还没有找到能够直接让div等块div对象居中的css方法,不过从 Computing.Net找到了一个替代方案:

比如一个div,宽度设定为60%,那么要使他居中,笨的方法就是用另外一个带有text-align: center属性的div或其他容器包含它,聪明一点的办法是这样:

margin-left: 20%;

左缩进20%加上div本身的宽度60%是80%,剩余的右缩进自然就是20%,所以div看起来就像是居中了一样。

第二个问题是编号列表,如何实现像word或者openoffic那样自动层级的编号?先看我实现的例子吧:

看到没有,在上面这个例子中,有着两级编号,并且和一般html中的

    不同的是,两级编号是连续的,并且在标题中可以定制编号的样式。为了让大家看得更清楚,我把代码贴出来。不要想着用查看源代码的方式来观察,由于Wordpress有自动纠错功能,会自动把嵌套的
      给补全,所以我改成用javascript+String.fromCharCode (n)方式输出了,查看不方便。

       
      1. 大标题一
        1. 小标题1
        2. 小标题2
      2. 大标题二

      现在清楚了吧,用display: marker:before来定义列表项目前面显示的内容,用counter来定义计数器,用content定义要显示的形式,用counter-increment定义计数器自增值,用counter-reset定义计数器归零的条件,就可以实现复杂公文处理系统中的可定制多级编号了,在Firefox2中测试通过,不保证在IE下能用。更详细的资料,请查询 W3C的CSS文档

      什么?不知道word和openoffice的多级编号?Orz…自行放狗搜索吧。

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