Movable Type 直接用数据库转移到 WordPress

Movable Type悲剧了,不知道咋的,Perl整不起来。

折腾好几年了,Blog也一直不能更新。

终于想放弃Movable Type了。

但是Blog怎么迁移呢?打不开Movable Type的后台。

还好有数据库在,还好WordPress可以导入。

WordPress的安装很简单,Movable Type太变态了。

因为不知道Movable Type的导出格式,只能先下载一份WordPress的备份xml,依葫芦画瓢吧。

上代码吧Continue Reading

淘宝api登陆,下载最近2天订单的php源代码

最近在开发淘宝订单与本司erp对接的php程序,每一家的api都大同小异,不同之处在登陆也就是取得系统信任的session,之后就万事大吉了。

如何去淘宝申请api接口的,自己去http://open.taobao.com/折腾吧,我就不说了,申请还是比较简单的。记得要设置回调的页面,还有Secret和Key。

利用API取得用户名和ID做自己网站的OpenID也是不错的哦。

淘宝卖家现在日订单上百的不在少数,手工接订单,或者依赖淘宝或淘宝的第三方程序都不是正解,很多淘宝卖家不是只在淘宝折腾的。

废话少说,上代码,该代码由三个页面组成,该示例三个页面都在一个目录。

Continue Reading

试用 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

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

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

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

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;
	自定义
}

JavaScript 保存数组到 Cookie 的方法

大部分的浏览器一个网站只支持保存20个Cookie,超过20个Cookie,旧的Cookie会被最新的Cookie代替。那么如果要有超过20个Cookie要保存只能将Cookie存为数组然后保存到Cookie。JavaScript中数组是无法直接保存为Cookie的(PHP可以),那要将数组转存为字符串,再保存在Cookie中,简单的一维数组我们直接用toString()或者join就可以了:

JavaScript中toString函数方法是返回对象的字符串表示。
使用方法:objectname.toString([radix])
其中objectname是必选项。要得到字符串表示的对象。
radix是可选项。指定将数字值转换为字符串时的进制。

join是其中一个方法。
格式:objArray.join(seperator)
用途:以seperator指定的字符作为分隔符,将数组转换为字符串,当seperator为逗号时,其作用和toString()相同。

如果多维数组,我们就要用JSON了。

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

这里我们使用PHP2JS的函数库来实现,需要 json_decodejson_encode这两个函数,懂PHP的朋友可以理解这两个函数的意思。json_decode 是JSON到数组,json_encode 是数组到JSON。

需要注意的是JavaScript 保存 Cookie 会将一些字符过滤,如:”{” 被过滤为 “{_” 等。所以在获取 Cookie 时要过滤这些字符,不然 json_decode 会出错。

Continue Reading