Movable Type添加相关文章

不用插件,直接创建模板就可以了,不用增加插件,直接使用Tag来推荐,具体方法见:http://wiki.movabletype.org/Related_Entries

  • 步骤一:设计 -> 模板 -> 新添模板模块”Related” -> 粘贴代码 -> 保存新模板
  • 步骤二:在日记模板添加 <$MTInclude module=”Related”$> -> 发布

注意:Movable Type Wiki上提供的两段代码(短的简单,长的复杂)都有问题:

  • 简单的在没有Tag的情况下列出了所有的文章,真的是没有标签就有所有文章都有关系。
  • 长的有些Tag无法匹配,比如”Movable Type”,好像问题出在空格上。

下面是我在使用的修改过代码,lastn=”7″设置相关文章最多显示6条。

<mt:entryiftagged>
   <mt:setvarblock name="curentry"><mt:entryid /></mt:setvarblock>
   <mt:setvarblock name="relatedtags"><mt:entrytags glue=" OR "><mt:tagname /></mt:entrytags></mt:setvarblock>
   <mt:setvarblock name="listitems"><mt:entries tags="$relatedtags" unique="1" lastn="6"><mt:setvarblock name="listentry"><mt:entryid /></mt:setvarblock><mt:unless name="listentry" eq="$curentry"><li><a href="<mt:entrypermalink />"><mt:entrytitle /></a></li></mt:unless></mt:entries></mt:setvarblock>
   <mt:if name="listitems">
      <h4>相关阅读<span class="delimiter">:</span></h4>
      <ul>
         <mt:var name="listitems">
      </ul>
   </mt:if>
</mt:entryiftagged>

OpenID登陆!

这个就不用说太多了,是标准的!

		if(empty($_REQUEST['openid_mode'])){
			if(empty($_REQUEST['OpenID']))
				LocationHtml($LoginUrl, 'OpenID is null!');
			$openid_url = formUrl($_REQUEST['OpenID']);
			$openid_server_list = getOpenIDServer($openid_url);
			if(empty($openid_server_list))
				LocationHtml($LoginUrl, 'OpenID server is null!');

			if(!empty($openid_server_list[1]))
				$openid_server = $openid_server_list[1];
			if(!empty($openid_server_list[2]))
				$openid_server = $openid_server_list[2];
			$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
			$data['openid.mode'] = 'associate';
			$data['openid.assoc_type'] = 'HMAC-SHA1';
			$data['openid.session_type'] = 'no-encryption';
			$AssocHandle = getAssociationHandle($openid_server.'?'.http_build_query($data));
			setcookie('cookieAssocHandle', $AssocHandle);
			unset($data);

			$data['openid.assoc_handle'] = $AssocHandle;
			$data['openid.ax.mode'] = 'fetch_request';
			$data['openid.ax.required'] = 'attr1,attr2,attr3,attr4,attr5';
			$data['openid.ax.type.attr1'] = 'http://axschema.org/contact/email';
			$data['openid.ax.type.attr2'] = 'http://axschema.org/namePerson/first';
			$data['openid.ax.type.attr3'] = 'http://axschema.org/namePerson/last';
			$data['openid.ax.type.attr4'] = 'http://axschema.org/contact/country/home';
			$data['openid.ax.type.attr5'] = 'http://axschema.org/pref/language';
			$data['openid.claimed_id'] = $openid_url;
			$data['openid.identity'] = $openid_url;
			$data['openid.mode'] = 'checkid_setup';
			$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
			$data['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0';
			$data['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1';
			$data['openid.realm'] = $RealmUrl;
			$data['openid.return_to'] = $AuthUrl;
			$data['openid.sreg.optional'] = 'nickname,email,fullname,dob,gender,postcode,country,language,timezone';
			$data['openid.sreg.policy_url'] = $PolicyUrl;
			$data['openid.sreg.required'] = 'email';
			$data['openid.trust_root'] = $RealmUrl;

			$LocationUrl  = $openid_server.'?'.http_build_query($data);
		}else{
			if('id_res' == $_REQUEST['openid_mode']
				&& $AssocHandle == $_REQUEST['openid_assoc_handle']){
				$openid = !empty($_REQUEST['openid_claimed_id']) ? formUrl($_REQUEST['openid_claimed_id']) : formUrl($_REQUEST['openid_identity']);
				$email = $_REQUEST['openid_sreg_email'];
				$fullname = $_REQUEST['openid_sreg_fullname'];
				$nickname = $_REQUEST['openid_sreg_nickname'];
				$timezone = $_REQUEST['openid_sreg_timezone'];
				echo('<pre>');
				echo("<a href=$LoginUrl>BACK</a>\n\n");
				print_r($_REQUEST);
				echo('</pre>');
			}
		}
		break;

部分函数请参考:
Yahoo的OpenID登陆
Windows Live ID当作OpenID使用的方法
Google的OpenID的登陆

Movable Type可能是没有办法用Email发布blog了!

blogmailr.com不知是不能登录还是对中国用户无法登陆,我也懒得去找匿名代理来测试了,既然它不愿意我们就不要凑热闹了。

flickr.com也不行了,我记得以前可以的,有个专门发blog的邮箱给你,然后使用Movable Type的Web Server就可以了,很遗憾测试可以,但是发邮件不可以了。

可能比较靠谱的就是注册个支持POP3的邮箱,起个复杂的名字,然后自己写个程序来定时执行邮箱读取,看看有没有新邮件,有的话就通过Web Server发贴。很简单吧,但我不想写!

怀念疯了的blogger.com!

测试Movable Type的预约发布功能

不知道行不行,如果你们可以看到这篇日志那就是可以。

% crontab -e
% 0 */2 * * * cd /path/to/mt/; ./tools/run-periodic-tasks
% chmod 755 /path/to/mt/tools/run-periodic-tasks

也可以用cPanel的时钟守护作业来预约,我是选2小时一次,减少系统开销

注意要将 path/to/mt/tools/下的run-periodic-tasks文件权限改为755。

参考

安装Movable Type 4.25中文化包

下载地址:http://www.thinkjam.org/zoptuno/archives/2009/05/mtos425-zh-package.html
作者:Just 平生一笑

安装很简单,对应覆盖即可。然后登陆后台设置语言即可,管理即是中文的啦。

但是有一个问题就是当前的blog重新发布后仍然是英文的,如果中文化之后新建的blog就没有这个问题。怎么解决呢?

方法是:设计 -> 模板 -> 刷新Blog模板 -> 重置到初始状态 -> 重新发布
注意:如果你有修改模板的要再改一遍,然后再重选风格,再重新发布

感谢Just的翻译,速度很快啊!

Yahoo的OpenID登陆

前两次写了Windows Live ID当作OpenID使用的方法Google的OpenID的登陆,这次写Yahoo的OpenID的实现方法。

先说一下Yahoo的OpenID仅有Plaxo等几个网站可以获取用户属性,所以暂时不要考虑这个东西吧。

而且Yahoo还会出现了下面这段警告:

Warning: This website has not confirmed its identity with Yahoo! and might be fraudulent. Do not share any personal information with this website unless you are certain it is legitimate.

你是不是很郁闷呢?其实解决方法很简单,请参考:http://tihualong.javaeye.com/blog/309246

因为其他的OpenID提供者同时支持OpenID1.1与OpenID2.0协议,但是Yahoo的程序员像我们一样不喜欢考虑兼容性的问题。只支持OpenID2.0协议标准。

那么OpenID2.0协议标准有什么特殊的地方呢?

OpenID2.0中提出了一个新的东西叫做OpenID Relying Party discovery的,我们的问题就出在这个OpenID Relying Party discovery上。

先解释一下这个OpenID Relying Party discovery是什么东西。

当你重定向到OpenID提供者站点去请求认证的时候,OpenID提供者会使用这个叫做OpenID Relying Party discovery的机制自动验证return_to的URL处于指定的范围内,并且与OP通过realm参数获取到的XRDS文档中获取到的return_to的URL相同。

我是这么理解的:我的Consumer程序告诉了OP我的return_to地址是什么,但是OP不信任我,要通过我的realm参数(注意:这个地方是OP向RP发出的请求,所以要求你realm参数的url必须是外网的ip地址或者能通过外部的DNS查找到的域名)查找一个基于yadis协议的XRDS文档中的return_to地址,两个return_to地址相比较,如果相同,好,我相信你了,放行。(不知道这样理解有没有问题,我觉得应该没问题吧)

好,原理理解了。下面我们要做的就是:

1、 编写一个XRDS文档保存到你的网站上,存放成什么扩展名的没什么关系,但是你要保证Yahoo或者其他OP获取到这个文档的Content-Type是” application/xrds+xml”,不然他们会认为这个文档不是他们要找的文档。

2、 将你第一步编写的XRDS文档的地址公布在你网站的首页,或者你的openid.realm参数指定的页面上(建议)

我们先来编写XRDS文档:(起名xrds.php)

<?php
header(‘Content-type: application/xrds+xml’);
?>
<?xml version=”1.0″ encoding=”UTF-8″?>
<xrds:XRDS
xmlns:xrds=”xri://$xrds”
xmlns:openid=”http://openid.net/xmlns/1.0″
xmlns=”xri://$xrd*($v*2.0)”>
<XRD>
<Service priority=”1″>
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
<URI>改成你的return_url地址</URI>
</Service>
</XRD>
</xrds:XRDS>

将你编写的XRDS文档的地址公布在openid.realm指定的页面,建议单独写一个页面维护,然后设置openid.realm参数为你创建的这个页面

<?php
header(‘X-XRDS-Location: 改成你的xrds.php地址’);
?>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
<meta http-equiv=”X-XRDS-Location” content=”改成你的xrds.php地址”/>
</head>
<body>
网页内容
</body>
</html>

if(empty($_REQUEST[‘openid_mode’])){
$openid_server = ‘https://open.login.yahooapis.com/openid/op/auth’;
$data[‘openid.ns’] = ‘http://specs.openid.net/auth/2.0’;
$data[‘openid.mode’] = ‘associate’;
$data[‘openid.assoc_type’] = ‘HMAC-SHA1’;
$data[‘openid.session_type’] = ‘no-encryption’;
$AssocHandle = getAssociationHandle($openid_server.’?’.http_build_query($data));
setcookie(‘cookieAssocHandle’, $AssocHandle);
unset($data);

$data[‘openid.assoc_handle’] = $AssocHandle;
$data[‘openid.ax.mode’] = ‘fetch_request’;
$data[‘openid.ax.required’] = ‘attr1,attr2,attr3,attr4,attr5’;
$data[‘openid.ax.type.attr1’] = ‘http://axschema.org/contact/email’;
$data[‘openid.ax.type.attr2’] = ‘http://axschema.org/namePerson/first’;
$data[‘openid.ax.type.attr3’] = ‘http://axschema.org/namePerson/last’;
$data[‘openid.ax.type.attr4’] = ‘http://axschema.org/contact/country/home’;
$data[‘openid.ax.type.attr5’] = ‘http://axschema.org/pref/language’;
$data[‘openid.claimed_id’] = ‘http://specs.openid.net/auth/2.0/identifier_select’;
$data[‘openid.identity’] = ‘http://specs.openid.net/auth/2.0/identifier_select’;
$data[‘openid.mode’] = ‘checkid_setup’;
$data[‘openid.ns’] = ‘http://specs.openid.net/auth/2.0’;
$data[‘openid.ns.ax’] = ‘http://openid.net/srv/ax/1.0’;
$data[‘openid.ns.sreg’] = ‘http://openid.net/extensions/sreg/1.1’;
$data[‘openid.realm’] = $RealmUrl;
$data[‘openid.return_to’] = $AuthUrl;
$data[‘openid.sreg.optional’] = ‘nickname,email,fullname,dob,gender,postcode,country,language,timezone’;
$data[‘openid.sreg.policy_url’] = $PolicyUrl;
$data[‘openid.sreg.required’] = ’email’;
$data[‘openid.trust_root’] = $RealmUrl;
//$data[‘xopenid_lang_pref’] = ‘tw’;

$LocationUrl = $openid_server.’?’.http_build_query($data);
}else{
if(‘id_res’ == $_REQUEST[‘openid_mode’]
&& $AssocHandle == $_REQUEST[‘openid_assoc_handle’]){
$openid = !empty($_REQUEST[‘openid_identity’]) ? formUrl($_REQUEST[‘openid_identity’]) : formUrl($_REQUEST[‘openid_claimed_id’]);
$email = $_REQUEST[‘openid_sreg_email’];
$fullname = $_REQUEST[‘openid_sreg_fullname’];
$nickname = $_REQUEST[‘openid_sreg_nickname’];
$timezone = $_REQUEST[‘openid_sreg_timezone’];
}
echo(‘<pre>’);
echo(“<a href=$LoginUrl>BACK</a>\n\n”);
print_r($_REQUEST);
echo(‘</pre>’);
}

注意:有部分函数和变量有遗漏,请参考Windows Live ID当作OpenID使用的方法Google的OpenID的登陆

FreeBSD 7.2-RELEASE发行了,速度真快!

去年这个时候还是7.0-RELEASE,几年5月2日就7.2-RELEASE,更新速度够可以的。

7.2-RELEASE修正了下列安全公告所指明的问题:

  1. lukemftpd 中的跨站请求伪造问题。
  2. OpenSSL 对格式不正确的签名检查存在问题。
  3. ntpd 密码学签名绕过问题。
  4. BIND DNSSEC 对格式不对的签名检查存在问题。
  5. telnetd 任意代码执行问题。
  6. 本地特权提升问题。
  7. db 中的信息泄露问题。
  8. OpenSSL 远程可触发的崩溃问题。

7.2-RELEASE对内核的改动:

  1. 内核调试器 ddb 新增了 show mount 子命令。
  2. FreeBSD DTrace 子系统新增了对于进程执行的探测点 (probe) 支持。
  3. [amd64] FreeBSD 内核虚拟地址空间增加到了 6GB。
  4. 对 jail(8) 子系统进行了更新。
  5. kld 支持从内核模块为 FreeBSD 系统调用翻译层安装 32-位 系统调用了。
  6. ktr 新增了 KTR_CALLOUT class 的 KTR 跟踪点, 用以描述 callout 回调完成执行。
  7. 用以对已经分配的 System V 共享内存进行记账的变量由 int 改为了 size_t。
  8. sysctl 叶节点新增了一个表示其为 MPSAFE 的标志。
  9. FreeBSD 32-位 系统调用翻译层新增了为 VFS_AIO 安装 32-位系统调用的支持。
  10. [amd64, i386] FreeBSD 虚拟内存子系统新增了针对应用程序的透明 superpages 支持; 应用程序的内存页会根据使用情况动态地升级为 superpage, 或反之降级为普通内存页, 而无须对程序代码进行任何修改。

详见:http://www.freebsd.org/zh_CN/releases/7.2R/relnotes-detailed.html

PHPanywhere可以做为跨平台的代码编辑器吗?

想找一个免费的跨平台代码编辑器,可以编写PHP代码就可以,但要支持FTP编辑,这样开发就也方便了,上班也可以,下班回家也可以。PSpad是不错,FTP编辑的功能不错,但是不能跨平台,是WIN应用的软件。其他的基本也是如此,很难实现跨平台,包括收费的。

有人介绍 PHPanywhere ,是B/S结构软件,跨平台没有问题,只要有游览器就可以了!但有致命的缺陷,就是要托管给PHPanywhere,你放心吗?我不放心,FTP的用户名和密码啊,高度危险啊!

而且,大陆客户用PHPanywhere速度超慢!速度很重要!

所以,PHPanywhere不可以做为开发工具!

onlinephpeditor_screenshot.jpg