子曰:干掉凤巢,远离虚假广告,他好我也好

CCTV把百度卖了,凤巢背后干的龌龊事儿一下子让全天下人都知道了。 于是我写了个浏览器扩展来干掉凤巢,取个名字叫鸠。 这个扩展安装以后再用百度搜索时会屏蔽掉凤巢推广链接,换以显示《道德经》, 新浪微博截图_未命名.jpg 在同时安装了AdBlock之类的过滤插件时本插件会无效,下载在下面: Chrome: jiu_chrome.crx 搜狗3.0: jiu_sogou.sext

ajax批量上传插件plupload

要想实现异步批量上传,大概有两种方式:隐藏iframe方式和flash控件。

plupload是一个出色的批量上传插件,几乎不需要任何代码就可以实现一个漂亮的上传组件

qq截图未命名.jpg

它可以使用JqueryQueue、Jquery UI两种方式初始化,后者可以和Jquery UI结合实现风格的切换。

plupload最强大的地方在于你可以为它设置包括Flash、Silverlight、html4、html5、gears、browserplus等各种运行时环境,它会在初始化时逐个尝试,知道找到客户端支持的版本为止。也就是说,如果你按照

runtimes : 'gears,flash,silverlight,browserplus,html5,html4',

这样的方式来初始化的话,用chrome浏览器你会看到一个使用gears的版本,它能支持拖拽;在安装了flash控件的浏览器中是flash版本;在安装了silverlight的浏览器中看到的是silverlight版;如果都不支持的话会显示最基本的html4版,当然html4是不支持批量选择文件的,你只能将文件一个一个地加入到上传队列中。

plupload还能实现客户端文件类型和大小校验,超大文件自动分块(chunk)上传,自动生成唯一文件名(unique names),客户端调整图片大小等强大的功能。

官方文档看这里:http://www.plupload.com/documentation.php

ThinkPHP与PHPExcel冲突

最近一个项目需要批量导入Excel数据,要用到PHP读取Excel中的内容然后导入到数据库。很早之前就知道有一个叫做PHPExcel的类(官方网站)可以用来操作Excel,一直没有机会尝试,今天试用发现无比强大,下载后的源码包里有详细文档,几乎能实现手工操作Excel能实现的一切功能。

一个简单的读取Excel的例子如下:

$inputFileType = 'Excel2007';
$inputFileName = './public/files/import_user_template.xlsx';
$sheetname = 'Sheet1';

//指定Excel类型,创建一个reader
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
//设置只读取数据,不包括公式和格式
$objReader->setReadDataOnly(true);
//只读取指定的sheet
$objReader->setLoadSheetsOnly($sheetname);
$objPHPExcel = $objReader->load($inputFileName);

$curSheet = $objPHPExcel->getSheet(0);
//包含数据的最大列
$allColumn = $curSheet->getHighestColumn();
//包含数据的最大行
$allRow = $curSheet->getHighestRow();

for($currentRow = 1; $currentRow <= $allRow; $currentRow++){
        for($currentCol = 'A'; $currentCol <= $allColumn; $currentCol++){
                echo $curSheet->getCell($currentCol.$currentRow)->getValue()."\t";
        }
        echo "\r\n";
}

要在ThinkPHP中使用,把源码包中的Classes目录复制到ThinkPHP的Vendor目录下,改名为PHPExcel,然后调用Vendor方法载入

vendor('PHPExcel.PHPExcel');

可是这样一来发现读取Excel以后再调用M或者D方法实例化模型类时报找不到Model类的错误,经过研究发现是自动装载机制冲突,要解决冲突,需要在M或者D方法调用之前使用spl_autoload_register函数重新注册autoloader类

spl_autoload_register(array('Think','autoload'));

代码成诗

好吧,代码真的是可以写成诗的。忽然发现有一个叫做PerlYuYan的中文编程语言,它写出来的程序大概是这个样子的:

#!/usr/local/bin/perl
use Lingua::Sinica::PerlYuYan;
用警兮用嚴。
印道
1..1
哉兮

印編曰雜申雜申矣
  又曰ok矣
    又曰1矣

亂曰
國無人莫我知兮  又何懷乎故都
既莫足與為美政兮 吾將從彭咸之所居

这还不够,还可以写成五言诗啊有木有!

# The Sieve of Eratosthenes - 埃拉托斯芬篩法
use Lingua::Sinica::PerlYuYan;

  用籌兮用嚴。井涸兮無礙
。印曰最高矣  又道數然哉。
。截起吾純風  賦小入大合。
。習予吾陣地  並二至純風。
。當起段賦取  加陣地合始。
。陣地賦篩始  繫繫此雜段。
。終陣地兮印  正道次標哉。
。輸空接段點  列終註泰來。

不得不佩服台湾的人文教育水平啊,一个程序员都能把代码搞成这样。

php设置多级目录session的问题

php默认会把session保存在 /tmp 下,但是当session文件过多时会对性能造成很大影响,设置分级目录是个好办法。

在 php.ini 中找到 session.save_path 将值设置为 session.save_path = '3;/tmp/session'; 即可开启三级目录保存session。但是php不会自动生成目录结构,这时可以借助源码包 ext/session 目录下的 mod_files.sh 来生成目录

$ bash mod_files.sh /tmp/session 3

生成完成后发现仍然不能生成session,纠结了半天,打开mod_files.bat才发现玄机,原来后面还需要带一个参数,对应于 php.ini 中的 session.hash_bits_per_character ,这个值默认是4,development和production版本的默认配置里是5,于是用下面的命令从新生成目录

$ bash mod_files.sh /tmp/session 3 5

终于可以登录了。