2007-09
03

总觉得在Perl里面读取文本文件应该用个循环:

while (<FH>) { print; }

或者是用数组:

@data = <FH>;

今天看代码时看到这样一段,真有种大开眼界的感觉。

$data = do { local $/; <FH>; };

查了查资料才明白:do表示执行后面括号内的语句,$/变量是读取文本文件时的行分隔符,默认是换行(\n)。 那么这段代码的意思是,声明 local $/,使得在 {} 内 $/ 的值变成空值,那么从<FH>读取时就不会再以 换行为分隔符,而是一次性将所有内容全部读出来。最后再用 do 将返回值赋给$data。



2007-09
01

其实做一个像feedburner和feedsky那样的feed统计功能并不难——如果你只是想自己用的话。

做feed统计需要实现的几个功能:

  1. 收集user-agent
  2. 分析近期的user-agent数据并统计每种阅读器的数目
  3. 定义常见阅读器的标记
  4. 绘制图表

而在实际操作中需要注意,统计user-agent时要排除掉浏览器、spider、bot等,仅统计阅读器的数字。而阅读器则分为在线阅读器和离线阅读器两种,在线阅读器一般都会通过user-agent报告订阅者数量(40 subscribers),而离线阅读器则不会。因此在线阅读器仅需要根据报告的数字统计订阅者即可,而离线阅读器则要根据IP地址来统计订阅者。

那么如何安装到wordpress里面?在init action上挂个钩子,判断一下request_uri是不是feed就行了。

最后,这个方法会跟wp-cache插件冲突,因为wp-cache会cache feed,一旦cache之后init action就不动了,所以要注意设置wp-cache使其不cache feed才行。


2007-08
31

最近由于feedburner不能访问,因此今日起将原来的feedburner地址转移到wordpress自带的feed上,不再使用feedburner托管。
新的feed地址为:

http://tech.idv2.com/feed/

使用在线阅读器的同学们应该不会受到任何影响,而使用离线阅读器的同学们就得麻烦你们手动将地址修改为上述的新地址了。


2007-08
30

这一篇是扫盲用的,主要讲解了几个最常用的函数IF、AND、OR、COUNT、COUNTA、COUNTIF和SUM, 会用的同学就可以跳过了。以后会逐渐讲解其他函数的应用。

1. 逻辑判断

逻辑判断所用的函数不多,IF、AND、OR三个就足以应付日常工作了。

IF函数可以用来转换值,如将1和0转换为OK和NG:

=IF(A1=1,"OK","NG")

与AND和OR组合使用可以判断多个条件,如判断是否是周末:

=IF(OR(WEEKDAY(A1)=0, WEEKDAY(A1)=6),"周末","工作日")

2. 统计数量的COUNT、COUNTA、COUNTIF

COUNT和COUNTA统计对象不同,COUNTA统计所有非空单元格的数量(包括出错的单元格), COUNT仅统计看起来像数字的单元格。

COUNTIF则可以添加搜索条件,这个特性可以用来做统计。如

=COUNTIF(F:F,"OK")     统计F列中OK的个数
=COUNTIF(F:F,"NG")     统计F列中NG的个数

3. 求和的SUM

这个函数简单得不能再简单了:

=SUM(A10:A254)         对A10~A254的范围求和

没了。别看Excel函数成百上千,常用的就这几个。充其量再加上其他几个信息函数, 如求日期的DATE、YEAR、MONTH、DAY、NOW、WEEKDAY,数值计算的FLOOR、INT、MOD、ROUND, 字符串操作的CHAR、LEFT、RIGHT、MID(具体使用方法参见帮助), 几乎可以应付全部的日常应用。

下面举几个例子来说明这些函数的应用。

1. 测试用例。一般测试用例的表格会是这样:

ABCDEF
1编号类别测试内容确认内容结果测试时间
21界面单击新建按钮建立新文档OK8/27
32界面单击保存按钮保存文档OK8/27
32界面单击另存为钮打开保存对话框NG8/27

那么统计OK和NG的个数就分别用

=COUNTIF(E:E,"OK")     统计OK个数
=COUNTIF(E:E,"NG")     统计NG个数

如果测试用例分成好几个工作表,那么可以在最前面加一个统计用的工作表,并用SUM求出所有用例的状况。

2. 日历。这个日历是用在项目进度管理上的,格式类似于下面这种横向的日历。

8月
1234567891011

可按以下格式输入:

ABCDEFG
18/1=A1+1=B1+1............
2=MONTH(A1)=IF(MONTH(B1)=MONTH(A1), "",MONTH(B1)...............
3=DAY(A1)=DAY(B1)...............
4=MID("日一二三四五六",WEEKDAY(A1),1)..................

然后隐藏掉第一行即可。


2008-2-14更新 回答读者妮妮的问题,讲解一下VLOOKUP函数的用法。

VLOOKUP用于查找信息,更确切地说,它用来“翻译”信息。比如员工名单上有员工号和姓名的对应关系, 那么给出一个员工号的列表,就可以通过VLOOKUP将其“翻译”成姓名列表。先来看个例子:

ABCD
1排行姓名排行姓名
21柯镇恶3=VLOOKUP(C2,$A$2:$B$8,2)
32朱聪3=VLOOKUP(C3,$A$2:$B$8,2)
43韩宝驹4=VLOOKUP(C4,$A$2:$B$8,2)
54南希仁7=VLOOKUP(C5,$A$2:$B$8,2)
65张阿生
76全金发
87韩小莹

这个表的$A$2:$B$8区域为参考数据(原始对应关系),C列为需要翻译的原始数据,D列为翻译结果。 具体的结果大家可以实际放到Excel里面执行一下。

VLOOKUP有三个参数,分别如下:

VLOOKUP(原始数据, 参考数据, 搜索结果在参考数据中的列位置)

Excel会在参考数据的第一列中搜索原始数据(上例中,在$A$2:$B$8的第一列即$A$2:$A$8中搜索原始数据C2), 找到后,返回第三个参数——列位置所对应的数据(上例中,在$A$2:$A$8中找到与C2相等的3之后, 返回3所对应的第2列——韩宝驹,这个“第2列”即为第三个参数)。

那么找不到时怎么办?其实VLOOKUP还有第四个参数,值为TRUE或FALSE,默认为TRUE。 取值TRUE时,VLOOKUP会返回不大于原始数据的最小值所对应的结果,例如=VLOOKUP(2.5,$A$2:$B$8,2,TRUE)会返回“朱聪” (朱聪的“2”为不大于2.5的最大值)。 取值为FALSE时,VLOOKUP会返回#N/A。

通常在处理字符串时,大多情况下希望在找不到时返回错误或空串。 这时可以为VLOOKUP加上第四个参数FALSE,再用ISNA函数将#N/A转换为空串。如:

[D2]=VLOOKUP(C2,$A$2:$B$8,2,FALSE)
[D3]=IF(ISNA(D2),"",D2)


2007-08
29

网上有很多关于如何制作漂亮的幻灯片的教程,而对Excel的美化则寥寥无几。 实际上Excel不仅仅是一个电子表格软件,它的单元格容易控制样式,操作方便, 因此使用Excel制作仅供阅读的电子文档也十分合适。 这就要求文档制作者必须懂得一些基本技巧,以制作出赏心悦目的电子文档来。

下面是我制作Excel格式电子文档时的一些经验,分享给大家。 希望大家都能够制作出漂亮的文档。

阅读全文 »

2007-08
25

最近发现公司的小孩儿们都开始学Linux了,可惜学的都是那些超级麻烦的命令,唉。 其实Linux这样用更简单些……

改IP,可以用 netconfig,可惜每次都得输入完整的IP、掩码、网关和DNS。 不如直接 vi /etc/sysconfig/network-scripts/ifcfg-eth0 再 /etc/init.d/network restart 来得快。

改DNS,最快的就是 vi /etc/resolv.conf,不用重启。

重启httpd,/etc/init.d/httpd restart 要比 service httpd restart快,因为前者可以补齐而后者不能。

修改系统服务,用chkconfig要比setup方便。

看最新的log,用 tail -f /var/log/xxx.log 比 vi /var/log/xxx.log 方便。 看不清的话就先 clear 再 tail -n 0 -f /var/log/xxx.log。

用好bash的历史记录

压缩解压缩别动不动就tar czvf/tar xzvf,要养成不用v的好习惯。文件多了要快上好几倍。

两台机器传文件,scp 要比samba方便。windows的话就装个cygwin,或者用PuTTY自带的pscp.exe也行。

测试网络连接,nc 192.168.1.10 80 要比 telnet 192.168.1.10 80 好用。

修改samba配置,直接修改 /etc/samba/smb.conf 要比图形界面方便。



2007-08
24

今天更换公司的开发服务器时用到了这两条命令,做个记录先。

如何导出PostgreSQL数据库中的数据:

$ pg_dump -U postgres -d mydatabase -f dump.sql

导入数据时首先创建数据库再用psql导入:

$ createdb newdatabase
$ psql -d newdatabase -U postgres -f dump.sql


2007-08
16

许多网站都使用了下拉菜单效果,但大部分都是用Javascript实现的。 自己写过下拉菜单的人应该知道,处理onmouseover和onmouseout事件极其繁琐。 而实际上,仅使用CSS的:hover伪类就能简洁地实现下拉菜单效果。

不过遗憾的是只有完全支持:hover伪类的浏览器如Firefox才能实现这种效果。 像IE这种仅能部分支持:hover的浏览器就只能老老实实地用Javascript来做了。

请看下面的代码。

<html>
  <head>
    <style>
    </style>
  </head>
  <body>
    <div id="menu">
      <h3>Select from menu</h3>
      <ul>
        <li>menu item 1</li>
        <li>menu item 2</li>
        <li>menu item 3</li>
        <li>menu item 4</li>
        <li>menu item 5</li>
      </ul>
    </div>
</html>

我们尚未定义样式表,这个页面显示结果就是一个简单的列表。

dropdown-menu-orig.png

为了实现下拉菜单,我们先将<ul>元素隐藏起来:

#menu ul { display: none; }

然后应当让菜单在鼠标经过时显示,所以应当为<div>的:hover伪类添加如下定义:

#menu:hover ul { display: block; }
阅读全文 »

2007-08
15

今天来讲一下CSS中的绝对定位和相对定位,即position属性的使用方法。

position属性常见的值有三种:

  • static: 不使用定位(默认值)。
  • absolute: 使用绝对定位。
  • relative: 使用相对定位。

在解释定位方式之前,首先要阐明文档流(document flow)的概念。 浏览器在解释HTML文档时,它会将各个元素按照在HTML文档中出现的次序, 从上到下依次排列。例如下面的代码将产生如下的效果:

document-flow.png
阅读全文 »

2007-08
14

又懒了一下,好几天没更新了。其实上周买的书到了,这几天在忙着看书, 没顾得上研究技术。昨天一口气看完了《CSS禅意花园》, 觉得这本书不愧CSS设计的王者称号,无论从欣赏还是学习的角度,这本书都值得一读。

当然,原书网站CSS Zen Garden也一定要去看看。

今天先来介绍一个从这本书上学到的小技巧:如何用图片替换文字

所谓图片替换文字就是用图片代替HTML中的某个文字元素,如标题。网站设计中很常用, 比如我想用图片而不是文字来显示blog标题,我可以在本应当显示<h1>的地方显示一个<img>, 但这样页面中失去<h1>会影响搜索引擎评分。当然我也可以通过css给<h1>设置一个背景图片, 但<h1>内的文字必须显示,否则也会影响搜索引擎评分。 可以使用下面的方法之一来通过CSS完美解决。

阅读全文 »