PHP 版本的 Readability 库February 19, 2011

阅读是汲取知识的途径之一,但烦杂的网页提了额外我们诸多不需要的信息,这有时候非常干扰我们阅读。回归阅读 内容的本身,其实通过 Readability 这个脚本 就能抽取页面的主体内容。

不过,Readability 提供的仅仅是个 Bookmarklet,如果我们需要将其导出、打印等操作时就显 得捉衿见肘。需求驱动行动, 于是就有了这个 PHP 库 。PS,同时您还可以找到 .net 版本的 Readability ,以及 node.js 版本的 Readability

这个库能做的事情非常的简单,就是找到页面的主体内容并返回。调用这个库非常的容易,实例代码如下:

require 'lib/Readability.inc.php';

$Readability     = new Readability($html, $html_input_charset); // default charset is utf-8
$ReadabilityData = $Readability->getContent();

echo "<h1>".$ReadabilityData['title']."</h1>";
echo $ReadabilityData['content'];

如果您不在意技术本身, 那么这里有个现成的线上工具 。只需要粘贴入需要阅读的网页链接,这个工具就能够重新生成适合阅读的页面(例如: 原页面Readability 以后的页面 )。

http://files.gracecode.com/2011_02_19/1298127284.png

然后利用 Mac 的 pdf 打印输出功能,就能非常方便在 kindle 等阅读器上使用。

Q&A

输出的页面似乎有乱码?

PHP Readability 库能够指定输入的字符编码并统一返回 utf-8 编码的字符串。如果您在处理过程中碰到了乱码问题,请调整下字符编码。如果还是有问题,欢迎您的反馈。

有些页面提取内容失败或者提取不正确?

Readability 提取的算法其实非常有限。如果页面本身的 HTML 标签不是非常合乎规范,那么提取可能会造成一定的困扰。通常这在国内的页面上会更常见些,同样欢迎您的反馈,这有利于我继续改进 PHP Readability 的算法。

最后,希望这个库和工具能让你找回阅读的乐趣。

-- EOF --

自建基于 Linux 的 Time Capsule 服务February 10, 2011

更改历史

前言

Apple 的 Time Machine 提供了非常完备的数据备份方案,但每次使用外接磁盘备份很 麻烦也很容易忘记备份。同时,个人对于 Time Capsule 「高昂的」售价(虽然它的确值那些钱)颇有微词。

其实,大部分管理员已经有数台 Linux 服务器,所以考虑能否安装类似 Time Capsule 的服务让 Linux 为 Mac 提供网络备份。

如果您和我一样有类似的需求,那么这篇文章可能就是你想要的 :^D

安装软件包

本人使用的 Linux 发行版为 Debian ,其他发行版的也应该类似。

首先,安装需要的软件包:

% sudo apt-get install netatalk
% sudo apt-get install avahi        # 通常这个包已经安装了的
% sudo apt-get install nss-mdns

注意:如果需要自己编译安装 netatalk 包,则需要加入 ssl 支持,具体看编译脚本参数。

配置

上面的软件包正常安装完毕以后,接下来就是配置了。

服务器端

1、编辑 /etc/default/netatalk 文件,找到对应的内容,更改为

ATALKD_RUN=yes
PAPD_RUN=no
CNID_METAD_RUN=yes
AFPD_RUN=yes
TIMELORD_RUN=no
A2BOOT_RUN=no

2、编辑文件 /etc/netatalk/afpd.conf 在最底部加入行:

- -tcp -noddp -uamlist uams_dhx.so,uams_dhx2.so -nosavepassword

3、编辑文件 /etc/nsswitch.conf 在最底部加入行:

hosts:  files mdns4_minimal [NOTFOUND=return] dns mdns4 mdns

4、新增文件 /etc/avahi/services/afpd.service,内容为:

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
    <name replace-wildcards="yes">%h</name>
    <service>
        <type>_afpovertcp._tcp</type>
        <port>548</port>
    </service>
    <service>
        <type>_device-info._tcp</type>
        <port>0</port>
        <txt-record>model=Xserve</txt-record>
    </service>
</service-group>

这个时候 netatalk 协议已经配置完毕,我们要共享出个目录让 Mac 映射为磁盘。编辑文 件 /etc/netatalk/AppleVolumes.default 加入下面的行:

~/TimeMachine   "TimeMachine"   allow:mingcheng    cnidscheme:cdb options:usedots,upriv,tm

简单得说明下:

Tips:由于备份数据比较大,可以考虑 mount --bind 映射到 Linux 本地的其他合适的分区或目录( 详细 )。

至此,基本的 Linux 服务器端配置完毕,重启服务(重启需要花点时间)

% service netatalk restart
% service avahi-daemon restart

http://files.gracecode.com/2011_02_10/1297309091.png

http://files.gracecode.com/2011_02_10/1297309108.png

重启服务以后,在 Mac 端连接 Linux 服务器,输入对应的用户名和密码以后,即可挂载已经配置好的磁盘。

Mac 端

在 Mac 端,我们还需要做些配置。打开终端(Terminal),执行下面的命令使 Time Machine 能够使用网络磁盘作为备份盘:

defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

由于部分兼容性问题,还需要另外手工制作磁盘疏散镜像。打开「偏好设置」中的「共享」,可以看见「电脑名称」, 例如我的是「明城的 Macbook Pro」(注意大小写和空格),这里将其命名为 &lt;computer_name&gt;

http://files.gracecode.com/2011_02_10/1297309156.png

然后,打开终端粘贴如下面的命令获得本机的网卡 Mac 地址,这里将其命名为 &lt;mac address&gt;

ifconfig en0 | grep ether | awk '{print $2}' | sed 's/://g'

如图,例如我的是

http://files.gracecode.com/2011_02_10/1297309174.png

然后运行下面的命令,注意将上步骤获得的 &lt;computer_name&gt;&lt;mac address&gt; 代入命令行:

sudo hdiutil create -size 320g -type SPARSEBUNDLE -nospotlight -volname "Backup of <computer_name>" \
    -fs "Case-sensitive Journaled HFS+" -verbose ~/Desktop/<computer_name>_<mac address>.sparsebundle

注意:-size 320g 参数是本机的硬盘容量,请根据实际情况更改。

最终在桌面会有个类似我本机的文件名(注意空格等字符):

明城的 Macbook Pro_0026bb6a1f40.sparsebundle

然后将这文件扔到上面配置好的 Linux 网络磁盘根目录。打开 TimeMachine 选择对应的磁 盘,即可以开始开始备份。

http://files.gracecode.com/2011_02_10/1297309244.png

http://files.gracecode.com/2011_02_10/1297309278.jpg

Tips:首次网络备份会比较缓慢,建议插入网线。

一般问题

问:这样做符不符合 Apple 的协议?

答:未知,如有明确结果的,请各位告知。

http://files.gracecode.com/2011_02_10/1297309298.jpg

问:为什么我选择网络磁盘以后,TimeMachine 一直在「正在准备磁盘」?

答:这是磁盘疏散镜像没有制作正确,或者你命名的文件名不正确。可以暂停备份,挂载网络磁盘看 TimeMachine 为你自己生成的文件名,然后在将上面步骤生成的文件替换。

问:TimeMachine 的备份数据是加密过的吗?

答:抱歉,保存在服务器上的数据是 没有加密 的(数据传输如有 SSL 是加密的)。

参考资源

-- EOF --

960 时代的终结January 10, 2011

按照惯例,年底的 淘宝 的确是到了「需要改版的时候」。这次新版的淘宝首页上线,乍看并没有多少夺人眼球的地方,但仔细揣摩其中的细节,还是发现了不少的改变。

http://files.gracecode.com/2011_01_10/1294635311.png

其中有一点就是感觉页面留白过多,仔细看了下发现是页宽从 原来的 960px 拉伸至 1000px。

http://files.gracecode.com/2011_01_10/1294635263.png

不要小看这个增加了的 40px 页宽,这对于设计师们而言可能是做了个「异常艰难的决定」。

混沌时期

还记得用 Win98 拨号上网的时代吗?那时候分辨率也小得可怜,800x600 的标配分辨率甚至都不及当前的某个高端智能手机。

不知道什么时候开始,网页的页宽有了个经典宽度 600px -- 当然,那时候谁都不会在意它。

960 时代

后来,这个故事变得简单而且老套:随着硬件的发展,分辨率也不断的提升。从 1024x768 到 1280x800 再到 1440x900 甚至更高( 这里有个统计 )。

http://files.gracecode.com/2011_01_10/1294635802.png

网页的页宽数字也在不断的增加,比较经典的几个数字为从 600px、740px 直到 960px 。然而这时候标准线出现了,那就是 960 页宽。

以淘宝为例,我印象中 960px 页宽从 2006 年沿用至今(2011)已经整整五年。这相比二十一世纪的前五年的页宽改变趋势而言,这实在是让人感到有些变化不大过于拘泥。

当然,设计师们采用 960 这个数字当作页宽的布局方案也有其道理:

  1. 其能兼容大部分的屏幕分辨率。800x600 已死,剩下分辨率最小的也有 1024x768。那么,为了更可能多的展现内容,页面的宽度自然会在 800-1024 像素之间,960 设置数值差不多是个中间值,不多不少刚刚好。
  2. 960px 方便栅格化布局 -- 其实从数学的角度上说,这个观点有点站不住脚。不过 960 页宽的栅格是最早出现的, 同时也是最广泛使用的 (附, 淘宝的栅格系统 )。

打破僵局

既然 960 页宽已经足够好,沿用传统的页宽也并不会犯错,那么回过头来我们再看这次淘宝首页为何要改变成规。

根据我的个人观点,可以总结部分:

  1. 960 页宽已经显得「过时」,1024x768 像素会像当年的 800x600 一样,迟早会被更大数字的分辨率所淹没。
  2. 需求的驱动,需要在页面中加入更多的内容。想想页宽增加 40px 乘以页长,整个页面将会多出多少设计和内容填充空间。
  3. 1000px 这个整数更容易计算和安排栅格 -- 不过从数学上这个说法也很难站住脚。不过整数 1000 的整除数比 960 多多了,也更容易安排。

单单 40 像素的改变,对于「粗心大意」的用户而言似乎无关痛痒(当然,也可以理解为淘宝其实不想让用户过多得在意他们的改变)。

个人觉得 1140 页宽 也是可以考虑的数字。那么,还有会不会有更大的页宽数字出现?我想应该会控制在 1200px 以内, 否则将会给用户阅读带来困扰

未来

我们来预测下未来的经典页宽将会是什么数字?说实话我也不知道,这一答案完全在设计师脑子里。有点可以预料到的是,移动上网设备的兴起会有促进两个大的趋势:

  1. 向下兼容针对小屏幕的弹性页宽( 详见 )。
  2. 页面布局将会针对不同的设备而定制,因此 800px 以下的页宽将会「复活」。

-- Split --

这次广泛采用 HTML5 标签、加大页宽等等的改变,看得出淘宝一直在做着细节方面的尝试和调整。然而从不谐调的留白、布局的不协调看得出来,淘宝对于新的页宽经验稍显不足。

但愿 1000px 这个页宽将又会是个经典的数字。毕竟,不客气的说,「山寨」淘宝首页的站点实在是太多太多了。

PS,淘宝还给我们留了个小彩蛋,新版在首页搜索框中输入「about:staff」会有惊喜(相应代码在 1970 行开始) :^D

-- EOF --

Yahoo 统计