试用 twitter 和 sina 微博的 api 服务

我在 twitter 和 sina 都有帐号,用 sina 实在是迫不得已,原因大家都知道了吧。我在想要是没有所谓的”墙”,国内一些 IT 公司还能活吗?我甚至怀疑,国内的 IT 公司是不是帮凶,或是始作俑者!

两个帐号或是多个帐号怎么同步呢?一个个发累死了,follow5 有同步功能,这也是它的卖点,但是都要提供用户名和密码,为什么不申请 twitter Connections applications 呢?让人费解。谁都号称自己不作恶,但谁放心呢!特别是这些还在测试中的网站。

twitter 和 sina 都有提供 api ,sina 的 api 基本跟 twitter 是一样的。

twitter API 文档

新浪微博 API 文档

请求信息之类的就简单了,这里不说,看着文档自己测试吧。新浪微博 API 文档基本就是 twitter API 文档的中文版,如果不懂英文的就看新浪的文档也能搞出个一二三。

下面分享一段代码,是如何发新微博的。系统要求:php,curl,json支持。Continue Reading

MT 分页插件 PagedArchives 介绍

有的同志在读分类归档的时候没有办法读到更多的内容,只能读到最近的10篇,现在安装了 PagedArchives 插件,这个问题解决了。

大家可以去这里下载这个插件,注意版本哦。

安装很简单,上传到 MT 的 cgi-bin 的 plugins 目录即可,然后在插件管理里设置下:
MT 分页插件 PagedArchives 介绍

然后设置归档模板,按分类归档日记列表,找到 <mt:Entries limit=”$limit”>,把 <mt:Entries limit=”$limit”> 修改为 <mt:Entries limit=”1000″>,在再下面 加入 <$MTPAEntry$>,找到 </mt:Entries> ,在后面加入<$MTPAEnd$>,再加入
<MTPAIfMultiplePages>
<div class=”page-archive-center”>
<MTPAPreviousPage text=”« 上一页” show=”0″>
<MTPAPageList>
<MTPANextPage text=”下一页 »” show=”0″>
</div>
</MTPAIfMultiplePages>

我的MT版本是4.31,大家可以参考下面:

<mt:Entries limit="1000">
<$MTPAEntry$>
<mt:Ignore><!-- Use the Entry Summary module for each entry published on this page --></mt:Ignore>
<$mt:Include module="日记摘要"$>
</mt:Entries>
<$MTPAEnd$>
<MTPAIfMultiplePages>
<div class="page-archive-center">
<MTPAPreviousPage text="« 上一页" show="0">
<MTPAPageList>
<MTPANextPage text="下一页 »" show="0">
</div>
</MTPAIfMultiplePages>

SSL认证的一些问题

name.com上的RapidSSL单个域名版的只要$24.95,我感觉蛮便宜的,就卖了一个,很快就可以拿到key文件。安装方法具体去参考:http://lamp.linux.gov.cn/Apache/ApacheMenu/ssl/ssl_faq.html#aboutcerts,我们要学会看官方提供的帮助文档,很有用。下面跟大家分享下安装设置过程中的一些问题。

1、IE7会跳出对话框提醒”本页不但包含安全的内容,也包含不安全的内容。是否显示不安全的内容?”,FireFox则提示”您和此网站的连接未被加密。”。原因是该网站用分布技术,页面所有的静态文件(css、js、img)都是从另一个子域名的网站引用。也就是说https的网站里面不能引用http的内容,否则会提示部分加密。后来把所有http引用改为https就OK了,改正了之后IE7和FireFox都很明显的出现了加密的标志。

2、Apache+mod_ssl能绑几个SSL认证?一个服务器和一个IP地址,只能绑定一个SSL认证。虽然我用 NameVirtualHost *:443 <VirtualHost *:443></VirtualHost>加了多个进去,但是SSL证书只有第一个是有效的。除非有多个IP地址,但我没有,Apache帮助文档说明一个IP地址只能一个SSL认证,多端口的我没有测试,我想没有什么太多的意义。

3、除了多个IP,那么怎样才能绑多个SSL认证呢?google的结果是,apache+mod_gnutls。mod_gnutls我没有目前时间尝试,有需求的朋友可以试一试。

参考文档:http://wangblog.org/2009/04/apache2-2ssl.html

以IP 地址做为用户验证的条件是不可靠的

这几天有个网站服务器从新加坡迁移到美国,迁移之后就发生了问题,一个新加坡的用户反映说不能登陆,那位新加坡的用户很配合,我反复测试发现,原来是IP地址出错,那个程序的用户验证中有个IP对应的条件,而服务器如果在新加坡之外的国家就无法正确的获取IP地址,在新加坡的服务器就可以。

该问题应该是新加坡的国家局域网防火墙的原因。前段时间很多国外用户无法访问QQ农场,可能问题的原因也在此。我那个用户说,那段时间新加坡很多用户都上不了QQ农场,怎么解决都不行,QQ也没有办法解决,后来莫名其妙的就好了,我估计取消IP地址验证就ok了!
Continue Reading

GRUB 引导 8.0-RELEASE-i386-bootonly.iso 安装 FreeBSD 8.0

下载 Grub4Dos,解压缩在 fat32 分区,修改或添加以下代码在 menu.lst 文件:

title find and boot 8.0-RELEASE-i386-bootonly.iso
fallback 5
find --set-root /8.0-RELEASE-i386-bootonly.iso
map --mem /8.0-RELEASE-i386-bootonly.iso (0xff)
map --hook
chainloader (0xff)

下载 FreeBSD 8.0-RELEASE-i386-bootonly.iso 放在主分区的第一分区,也就是第一个分区,我当时第一分区是安装 Win2000 的 NTFS 分区,也可以引导,但是 Grub 得放在 fat32 分区。

纯DOS启动,没有纯DOS的用 vfloppy 来虚拟 Win98 DOS 启动。

进入 Grub 目录,启动 grub 命令,比如 C:\GRUB>grub 。在选项里选择 boot 8.0-RELEASE-i386-bootonly.iso 启动,就可以进入 FreeBSD 8.0 的安装,安装的过程参考 用memstick.img 安装 FreeBSD8.0-releases。安装的介质可以选择 MS-DOS 分区安装(硬盘安装)或FTP安装,网络好的话FTP安装是不错的选择。

MS-DOS 分区安装参考这里,可以识别 NTFS
FTP安装参考这里,并且要提前配置网卡,也有可能会失败 🙂 。注意不要中国的 FTP 服务器,因为线程的限制会掉线,我就是先无比自豪的选择了 ftp.cn.freebsd.org ,然后掉线后无可奈何的选择了 ftp.jp.freebsd.org。

PostgreSQL 导入 CSV 文件

FreeBSD 7.0-RELEASE-i386 + PostgreSQL8.3

# psql -d 数据库 -U 用户名
# \encoding
# show client_encoding;
# set client_encoding = 'iso-8859-1'; //CSV文件字符格式,不然会乱码
# COPY 表名 FROM 'CSV文件' WITH DELIMITER ',' NULL AS '' CSV HEADER QUOTE AS '|';
# \q

Continue Reading

PHP 条形码 Image_Barcode

# cd /usr/ports/graphics/pear-Image_Barcode && make install clean

<?php
require_once('Image/Barcode.php');
Image_Barcode::draw('RR651943036CN', 'Code39', 'gif');
exit;
?>

安装 GeoIP

FreeBSD 7.0-RELEASE-i386 + PHP5 + Apache2.2

# cd /usr/ports/net/pecl-geoip && make install clean
# apachectl restart
# cd ~
# fetch http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz
# gunzip GeoIP.dat.gz
# mv GeoIP.dat /usr/local/share/GeoIP/GeoIP.dat
# fetch http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
# gunzip GeoLiteCity.dat.gz
# mv GeoLiteCity.dat /usr/local/share/GeoIP/GeoIPCity.dat

<?php
echo geoip_database_info(GEOIP_COUNTRY_EDITION);

$country = geoip_record_by_name('wangblog.org');
if($country){
	echo "\nThis host is located in: \n";
	print_r($country);
}
?>

可以写个定时更新IP地址库的程序:

cd ~
/usr/bin/fetch http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz
/usr/bin/gunzip GeoIP.dat.gz
mv GeoIP.dat /usr/local/share/GeoIP/GeoIP.dat
/usr/bin/fetch http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
/usr/bin/gunzip GeoLiteCity.dat.gz
mv GeoLiteCity.dat /usr/local/share/GeoIP/GeoIPCity.dat

以上保存为:update-ipdata-cron.sh

crontab -e
添加以下一行,每月5日0点10分运行:
10 0 5 * * /bin/csh /path/to/update-ipdata-cron.sh

FreeBSD 8.0-RELEASE 安装无线网卡的变化

FreeBSD 8.0-RELEASE-i386 + IBM ThinkPad X32 Intel(R) PRO/Wireless 2200bg

除了 /etc/rc.conf 其他的和7.0一样,8.0要将无线网卡clone出来wlan再使用。妈的,搞了一个晚上才搞好!一直以为是Fn+F5出错无法启动无线网卡。

下面的添加入 /etc/rc.conf ,无线网卡即可正常使用:

ifconfig_iwi0="up"
wlans_iwi0="wlan0"
ifconfig_wlan0="ssid TP-LINK_57850C wepmode on weptxkey 1 wepkey 1:0x1234567890 DHCP"

其余的参考 FreeBSD7.0无线网卡设置

PostgreSQL 处理 session

先来看下自定义数据库处理 session 的执行顺序:

sess_open
sess_read
sess_gc
...其他程序
sess_write || sess_destroy
sess_close

// $domain = '';
//不使用 GET/POST 变量方式
ini_set('session.use_trans_sid', 0);
//设置垃圾回收最大生存时间
ini_set('session.gc_maxlifetime', 1440);
//使用 COOKIE 保存 SESSION ID 的方式
ini_set('session.use_cookies', 0);
//ini_set('session.cookie_path',      '/');
//多主机共享保存 SESSION ID 的 COOKIE
//ini_set('session.cookie_domain', $domain);
//设置用户自定义Session存储
ini_set('session.save_handler', 'user');
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);

session_set_save_handler(
	'sess_open',
	'sess_close',
	'sess_read',
	'sess_write',
	'sess_destroy',
	'sess_gc'
);

$SESS_DB = '';
$SESS_DBHOST = '127.0.0.1'; /* database server hostname */
$SESS_DBPORT = 5432; /* database server port */
$SESS_DBNAME = 'DBNAME'; /* database name */
$SESS_DBUSER = 'DBUSER; /* database user */
$SESS_DBPASS = 'DBPASS'; /* database password */
$SESS_LIFE = ini_get('session.gc_maxlifetime');
$SESS_NAME = 'SNAME';


function sess_open($save_path, $session_name){
	global $SESS_DB, $SESS_DBHOST, $SESS_DBPORT, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS;
	$SESS_DB = pg_connect("host=$SESS_DBHOST port=$SESS_DBPORT dbname=$SESS_DBNAME user=$SESS_DBUSER password=$SESS_DBPASS") or die('Could not connect');
	return true;
}

function sess_close(){
	global $SESS_DB;
	if(!empty($SESS_DB)){
		pg_close($SESS_DB);
	}
	return true;
}

function sess_read($key){
	global $SESS_DB, $SESS_LIFE, $uid, $uip;
	自定义
	return false;
}

function sess_write($key, $val){
	global $SESS_DB, $SESS_LIFE, $uid, $ip;
	$expiry = time() + $SESS_LIFE;
	$value = addslashes($val);
	自定义
}

function sess_destroy($key){
	global $SESS_DB;
	自定义
}

function sess_gc($maxlifetime){
	global $SESS_DB;
	自定义
}