WP7初体验(HTC Mozart 注册+刷机+越狱)

题外话,不得不说同样的硬件配置WP7要比Android便宜不少,看得出M记砸钱的力度,赞美一下。

前一阵子入手了一台HTC Mozart, 800万摄像头,疝气闪光灯,1.8k,再次赞美一下。友好的店主已经帮忙刷机过了,DFT(WP7的福星团队啊,资源里面第一条)出品的基于7713的ROM,已然非常的好用了。不过作为专业人士(自封的。。),还是禁不住要重头整理一遍,自己捣鼓一下。基本参考了从初见开始 Windows Phone 7 初/中/高级 经典教程专题,非常的全面,然后根据自己的情况做了一些删减,记录如下。

安装Zune
没啥好说的,看名字难道是冲着itunes来的,界面很酷,不过除了连接WP7貌似其他功能还没有兴趣了解。唯一需要注意的是如果要连接Microsfot Marketplace,一定要把电脑的区域设置成非中国。


注册Window Live ID
援引了一段原文中的话,可以了解一下WP7中的Window Live ID和Zune通行证的一个关系,总结下来就是通过Zune来注册一个新的Window Live ID(即Zune通行证)是最方便稳妥的方法。需要注意的有三点:

  1. Window Live ID中选择的区域需要和电脑的区域保持一致。
  2. Zune注册好以后需要在Window Phone上首次登录一下再与电脑进行连接,否则无法同步安装应用。
  3. Window Phone上的Window Live ID(首个)一旦登录就无法删除,除非重置手机或者刷ROM。第二个以后的Window Live ID没有这个问题。

为什么要通过向导申请ID ,这里面的奥秘,关于Windows Live ID和Zune通行证的关系(仅作了解,可以跳过):
Windows Live ID和Zune通行证有一个转换关系,当你用之前就申请好的Windows Live ID登录ZUNE的时候,你的Windows Live ID会变成一个ZUNE通行证,Windows Live ID的个人资料都会填充到ZUNE通行证里面,而且地区信息在ZUNE通行证被锁定了(无法修改,不知道为什么要这样设定),这就造成你的Windows Live ID的地区可以更改,但是ZUNE通行证的地区已经无法更改了。如果你用中国的Windows Live ID登录一次ZUNE或手机Marketplace市场,那么由于中国区不支持的原因,这个Windows Live ID就算在WP7上废了。

我们可以理解为其实WP7需要的不是Windows Live ID,而是需要Zune通行证(因为市场只认通行证的地区,却不认LIVE ID的地区),只是你在申请Zune通行证后,这个通行证会由于微软业务的共通关系同时生成一个Windows Live ID。因此为了保险起见,我们直接申请Zune通行证。



同步音乐,电影
M记的东西在这个时候用起来就会觉得极其方便了。默认配置下,只要把电影,音乐放到电脑Music/Movies目录下,就会自动显示在Zune中,拖拉一下就可以同步到Window Phone里面去了,还有比这个更方便的么。对于喜欢保存mp3的我来说,真是超级方便啊。如果不喜欢留mp3,Window Phone Marketplace里也已经有QQ音乐和虾米音乐的客户端了,赞就一个字啊。


刷机
不得不说刷机绝对是一个手艺活。是否需要越狱刷机方式不同;不同的品牌手机(HTC,三星,LG)刷机方式不同;不同的Window Phone 版本(NODO, Mango or Later)刷机方法也不同。没接触过的同学建议一定要看下面两篇文章融会贯通一下概念。

不过作为坐拥HTC Magic的我来说现在的情况已然简化很多了(骄傲),最多也就多刷一个SPL而已。。。
HTC标准的刷机方法有三种,总体的思路就是从7008之前的版本开始越狱,然后更新一次越狱一次,保证更新到最新的Mango还是越狱的。

  1. 先刷RSPL/HSPL,然后刷非官方的民间自制Mango版本的ROM。好处是快速,简单(但要谨慎),30分钟内用上Mango+越狱。
  2. 先刷7004版本的ROM,然后通过微软官方的推送更新来一步步从7004版本更新到Mango版本,更新过程中通过各种方法保留越狱状态到Mango。好处是不用担心收不到Mango以后的官方更新,且由于使用的是官方ROM,所以纯净,稳定。缺点是非常繁琐。
  3. 直接刷mango官方ROM,然后在Mango下用开发者帐号解锁。此法非常适用于二代机。

因为我有开发者帐号,无所谓这些,直接就按照第三个方法进行了刷机,非常的方便。主要刷机步骤如下,唯一要注意的是一开始连接的时候要保证机器没有锁屏。

  1. 准备好ROM,感谢DFT的努力,我们有了自己的自定义ROM,支持IE直接安装XAP这么强大的功能。不过第一次刷机我还是很胆小的准备了官方Mango 7720 ROM。
  2. 手机关机后,按住音量下键,然后同时按住开机键,进入三色屏模式,如下图,有HSPL字样,才能刷DFT或其他第三方自制 ROM,而且有这个字样的话你就不能在直接刷官方的芒果ROM,我这里刷的是7720的官方ROM
  3. 数据线接上手机,保证手机电量50%以上。电脑端开始安装驱动。如果出现找不到驱动,那就看这里解决
  4. 打开事先下载的ROM包,DFT 自制ROM与官方ROM不同的是:官方ROM直接是一个EXE文件,点击开刷;自制 ROM是个7z压缩包,需要解压它,找到ROMUpdateUtility.exe开始刷机。
  5. 然后就搞定了!



越狱
由于我莫名其妙把自己搞成了开发者(支付掉99美金。。。),所以这部就非常容易了。Microsoft默认开发者可以越狱三部设备。安装好Window Phone SDK,保证Zune运行正常,Window Phone正确连接,之后直接运行”Windows Phone Developer Registration”,输入你的开发者帐号就可以了。 复杂的注册方法,等一年之后再说吧。。。。


安装XAP
唯一的遗憾就是没有刷DFT的自定义ROM,所以没办法通过手机IE直接访问智机市场,下载XAP。
不过系统已经越狱了,除了通过Zune或者手机Marketplace来安装官方应用之外,也可以通过Window Phone SDK的Application Deployment来安装自定义的XAP应用。


遗留问题

  • MSN应用。WP7对MSN做了深度整合,所以没有单独的MSN应用。可以让我随意切换Window Live ID。
  • Skype应用。至今没有提供Skype客户端。Mango自带的Tango也没有试用成功。
  • 联系人资源。其实这是根本问题。由于绑定的Window Live ID是为了区域问题新创建的,所以没有任何联系人信息。平时用的Window Live ID可以添加但是MSN只认第一个Window Live ID。另外就是电话号码联系人会和MSN联系人混在一起有些混乱。
  • 系统通用设置。感觉少了很多系统级别通用的设置。


相关资源
论坛- 黑暗军团- DFT 论坛- Powered by Discuz!
Windows Phone 7论坛|智机网|WP7论坛|WP7软件|WP7游戏|ROM
从初见开始 Windows Phone 7 初/中/高级 经典教程专题
HTC Mozart亚太官方Mango 7720 ROM
Download Windows Phone SDK 7.1
How to: Register Your Phone for Development

, , , , ,

2 Comments

WP-Douban-Post发布后记

距离WP-Douban-Post发布已经有差不多两个月了。总想写点什么总结一下。

缘由

说起来初衷很简单。我的博客可以同步到twitter,新浪,就差同步到豆瓣上了。受不了每次人肉同步的繁琐,又没找到合适的现成wordpress插件,又打算学习一下Oauth+Douban APIWordPress Plugin的各种技术,袖子管一卷咱就干了起来。

过程

前后大概花了一周的业余时间,大概按照如下的步骤走了一遍,总算是客服了重重难关,完成了这个插件。
1)Wordpress Hello World Plugin (了解Wordpress插件结构)
2)Wordpress Option Page(了解添加配置选项,存取数据库,添加事件响应)
3)Douban Oauth (Douban Zend Client太复杂,只好自己用php oauth library。自己拼接header,测试MD5验证,多谢Douban API支持,这部分是最艰辛的)
4)Douban API 调用(真正开始调用API,发送自己的记录到我说)
5)WP-Douban-Post (拼装完成,达达达搭)

推广

说是推广其实是抬举了自己。自己作了好用当然是想广而告之显摆一下。第一个想到的自然就是wordpress.org插件库。如果可以在Plugins里面搜索到自己的名字,想想就威风。
提交开发者申请,编写README,提交代码。所有的步骤都有清楚的指南。Wordpress.org基于SVN的发布系统让我大开眼界,收益非浅。
1)通过README提取插件信息,例如作者信息,安装指南,Q&A,对开发人员和wordpress.org都是方便清楚。
2)建议开发者拉branch进行发布,通过README元信息指定发布的具体branch.通过这样的最佳实践直接帮助开发者分清了发布和开发的代码。清晰明了。

然后就是更新豆瓣应用信息,在豆瓣API小组发贴庆祝。然后就是每天刷屏期待了。。。这就是我做的推广-,-。大概的情形趋势图上都清清楚楚。
1)2011-01-19,推荐给了几个用豆瓣也用Wordpress的朋友,小推销了一把,迎来了下载高峰。
2)2011-01-21 to 2011-02-12,春节期间,下载量逐渐走低。。。。
3)2011-02-13 to 2011-02-20,春节结束,赢了小小的反弹。。。。
4)2011-02-21 to 2011-03-20, 大概可以看出周末基本没有下载,工作日偶尔有人。。
5)2011-03-25, 豆瓣有了应用小站,很荣幸被发布了出来,还被表扬了^@^,也迎来了之后小小的高峰。。。

没有什么特别的期待,有人用,觉得有用大概就是对我最大的夸奖了。呵呵。欢迎提意见给我。

后记

1)听说豆瓣九点可以自动收录wordpress,我那叫一个后悔啊。新手不会玩豆瓣,sigh。
2)想要php调用douban Oauth的同学,可以参考我在wordpress.org上的代码,这可是汗水和泪水啊-,-
3)wordpress.org的缺点也很明显,一定需要wordpress.com的账号才能rate和vote,这导致基本没人回来给意见。

WordPress.org 地址

http://wordpress.org/extend/plugins/wp-douban-post/stats/

Douban应用小站 地址

http://site.douban.com/widget/notes/2324209/note/141570144/

WP-Douban-Post Stats 2011-03-26

WP-Douban-Post Stats 2011-03-26

, , ,

2 Comments

在Linode上安装openVPN

一些朋友需要VPN访问一些墙外资源。本着服务器放着不用是浪费的原则我决定搭一个VPN服务器帮助解决朋友的需求。
不得不说Linode的文档非常齐全,而且很傻瓜,照着作一遍基本解决了所有的问题。

openVPN安装

Ubuntu方便是没话说的。

apt-get update
apt-get upgrade --show-upgraded
apt-get install openvpn udev

这就是所有你需要的软件了。安装包里提供了密钥工具包“easy-rsa”,把它拷贝到配置文件夹下。

cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn

修改工具包中的文件vars,按照你的需要配置相关信息

export KEY_COUNTRY="US"
export KEY_PROVINCE="OH"
export KEY_CITY="Oxford"
export KEY_ORG="Ducklington"
export KEY_EMAIL="squire@ducklington.org"

配置你的密钥体系

首先需要初始化PKI.

cd /etc/openvpn/easy-rsa/2.0/
source . /etc/openvpn/easy-rsa/2.0/vars
. /etc/openvpn/easy-rsa/2.0/clean-all
. /etc/openvpn/easy-rsa/2.0/build-ca

接着生成服务器私钥。会有一些问题和提示,选择默认和Y就可以了。

. /etc/openvpn/easy-rsa/2.0/build-key-server server

然后是生成客户端的证书.其中client1是证书的名字,你可以按照你的需要填写。如果需要生成多个客户端证书,重复该步骤就可以了。

. /etc/openvpn/easy-rsa/2.0/build-key client1

最后生成Diffie Hellman Parameters。

. /etc/openvpn/easy-rsa/2.0/build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time

如果一切正常,会出现如上所示的信息。
密钥的配置基本就是这样,最后把生成的密钥文件和easy-rsa提供的服务器端配置文件样本拷贝到配置文件夹下。

cd /etc/openvpn/easy-rsa/2.0/keys
cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn

cd /usr/share/doc/openvpn/examples/sample-config-files
gunzip -d server.conf.gz
cp server.conf /etc/openvpn/
cp client.conf ~/
cd ~/

配置openVPN链接

密钥的配置保证了客户端和VPN服务器的链接。还要配置openVPN对网络包地转发规则。
修改/etc/openvpn/server.conf,添加如下语句

push "redirect-gateway def1"

修改/etc/sysctl.conf,添加如下语句

net.ipv4.ip_forward=1

为VPN会话添加下列变量。

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

为了保证每次启动这边规则都生效,可以把后面四个语句添加到/etc/rc.local中去。
除了IP包地转发规则,我们还需要处理来自客户端的dns请求,安装dnsmasq来解决这个问题。

apt-get update
apt-get install dnsmasq

修改/etc/openvpn/server.conf,添加如下语句

push "dhcp-option DNS 10.8.0.1"

OK,一切搞定,启动openVPN服务吧。

/etc/init.d/openvpn restart

客户端的使用

Mac下的openVPN客户端
http://code.google.com/p/tunnelblick/
Windows下的openVPN客户端
http://openvpn.se/download.html
将上文生成的client.conf, ca.crt, client1.key, client1.crt拷贝到你的电脑,配合客户端使用即可。

参考连接

http://library.linode.com/networking/openvpn/ubuntu-10.04-lucid

推荐连接

有兴趣的朋友可以使用我的referral链接注册使用Linode,将获得10%的优惠。
http://www.linode.com/?r=513a31440dd0a6c0980cc05a164b4ae2520a19d6

, , ,

No Comments

WordPress搬家记

Hostmonster的两年租约转眼到期了。想当年4刀每月如今已经涨到了6刀每月,感慨之际只好把东西通通往Linode这边搬。希望这次可以坚持的更长。
Hostmonster上需要搬的也就一个wordpress,其中有经历了一些问题,记录下来也算是经验。
之前已经把domain transfer搞定了,所以主要就是程式的挪动。大致的搬家过程主要分三步。

数据库搬家

不得不说mysqldump还是很方便的。对于我这种要求不高,只求没数据遗留的人来说超级方便。

mysqldump wordpress > wordpress.sql

然后在linode上直接导入数据库就好了

mysql -u xxx -p
create database wordpress character set utf8;
exit
mysql -u xxx -p -D wordpress < wordpress.sql

WordPress搬家

我的hostmonster和Linode都开通了SSH服务。所以php文件搬家直接就是一句话的事情。

scp -rf blog/* xxx@tech4k.com:/path/

配置更新

wp-configs.php包含了wordpress的所有全局配置,搬过来以后要做对应的修改。我的域名没有变,所以只需要对数据库配置修改就可以了。

define('DB_NAME', 'xxxxxx');^M
^M
/** MySQL database username */^M
define('DB_USER', 'xxxxxx');^M
^M
/** MySQL database password */^M
define('DB_PASSWORD', 'xxxxxx');^M
^M
/** MySQL hostname */^M
define('DB_HOST', 'xxxxxxxx');^M



除了这三步之外还有一些小地方的注意事项,也许不适合你的案例,但是注意一下总归没错。

用户和用户组,以及权限

scp搬过来的所有文件的用户和用户组信息都会被修改,一开始完全没有办法更新插件。之后才发现这个问题的。这里的用户必须是apache的执行用户,这样才不会有问题。

chown -R aaa:xxx *

设置上传路径

在wordpress的管理界面中,需要设置一个上传路径,这样才可以自动从wordpress.org上自动下载插件。
Settings -> Media -> Store uploads in this folder
需要注意的是该文件夹需要权限配置可写。

sitemap.xml&sitemap.xml.gz配置

我使用了XML-Sitemap这个插件,方便好用。该插件需要根目录下的sitemap.xml和sitemap.xml.gz可写。

遗留问题

timer启动

理论上有些插件需要在插件激活的时候启动一些后台Timer定时完成任务的。不是很清楚我这样的搬家方法会不会对这种插件有问题。

Permalink配置

我现在的Permalink有问题。只能通过/?p=%post_id%来访问,不能通过/archive/%post_id%这种方式访问。添加了.htaccess也确认可写之后仍然有这个问题。还需要进一步研究。

搬家总是很麻烦,皑皑,感叹一下。

2 Comments

WordPress Ajax Widget开发

本篇文章是紧接上一篇WordPress 2.8+ Widget 插件开发.
自己开发得一个小工具 WP Dict需要调用服务器端方法查询单词,但是个人觉得页面跳转的用户体验不好,所以小研究了一把ajax的实现方法而且试验成功,特此记录。

注册服务端方法


function wp_dict_request_handler() {
}
add_action('init', 'wp_dict_request_handler');

比想象的更加简单,Wordpress可以通过add_action注册自己的服务器端方法,所有页面均可调用。唯一需要注意的是方法名需要保证唯一。

注册jquery

在Widget类的构造方法中添加如下语句。

// Load jQuery
wp_enqueue_script('jquery');

获得Widget ID

在widget()方法extract方法后天添加如下语句。

function widget( $args, $instance ) {
extract( $args );
// Get the div id of the widget
$widgetid = $args['widget_id'];
。。。
}

Ajax实现

在Widget的显示内容部分($after_title,$after_widget之间)添加ajax调用代码。

echo $after_title;
?>
<script type="text/javascript">
jQuery(document).ready(function($){
$("#wp_dict_submit").click(function(){
$.ajax({
type : "GET",
url : "index.php",
data : { mywidget_request : "wp_dict_request_handler",
query : $("#wp_dict_query").val() },
success : function(response) {
// The server has finished executing PHP and has returned something,
// so display it!
$("#wp_dict_result").html(response);
}
});
});
});
</script>
<?php

/* After widget (defined by themes). */
echo $after_widget;

基本就是jQuery调用ajax的典型用法。不过这里有几点针对wordpress的说明

  • url参数其实可以是任意有效的php路径。
  • mywidget_request配置的就是之前注册的方法名。
  • mywidget_request之后的都是自定义的参数,这里我需要一个query的单词名。

最后

按照普通Widget的要求,把widget添加之后,就可以在页面看到并使用了。相当方便。

遗留问题

WP Super Cache会把页面内容转化成静态HTML,所以Ajax会破坏这个机制。参考资料中另外一篇文章,不过还没有时间学习。

参考资料

AJAX-ifying WordPress Widgets
Make Any Plugin Work with WP Super Cache

, , ,

No Comments

WordPress 2.8+ Widget 插件开发

WordPress 2.8.0之后的版本对Widget提供了一套详细的API规范。貌似和水煮鱼团队的范例有很大区别。

加载Widget


<?php

/* Add our function to the widgets_init hook. */
add_action( 'widgets_init', 'example_load_widgets' );

/* Function that registers our widget. */
function example_load_widgets() {
register_widget( 'Example_Widget' );
}

Wordpress 2.8以上的版本中,widgets_init事件会在wordpress注册默认widgets之后被触发。Example_Widget是具体实现widget的类名。

配置你的Widget


function Example_Widget() {
/* Widget settings. */
$widget_ops = array( 'classname' => 'example', 'description' => 'An example widget that displays a person\'s name and sex.' );

/* Widget control settings. */
$control_ops = array( 'width' => 300, 'height' => 350, 'id_base' => 'example-widget' );

/* Create the widget. */
$this->WP_Widget( 'example-widget', 'Example Widget', $widget_ops, $control_ops );
}

这里主要配置的Widget的一些基本信息,例如标识符,描述,以及大小等信息。

显示你的Widget


function widget( $args, $instance ) {
extract( $args );

/* User-selected settings. */
$title = apply_filters('widget_title', $instance['title'] );
$name = $instance['name'];
$sex = $instance['sex'];
$show_sex = isset( $instance['show_sex'] ) ? $instance['show_sex'] : false;

/* Before widget (defined by themes). */
echo $before_widget;

/* Title of widget (before and after defined by themes). */
if ( $title )
echo $before_title . $title . $after_title;

/* Display name from widget settings. */
if ( $name )
echo '<p>Hello. My name is' . $name . '.</p>';

/* Show sex. */
if ( $show_sex )
echo '<p>I am a ' . $sex . '.</p>';

/* After widget (defined by themes). */
echo $after_widget;
}

Wordpress 2.8以上的版本中,规定了function widget( $args, $instance )这个接口。这个接口专门用来实现widget的显示内容的。其中extract( $args );是标准用法,只需要添加就可以了。除此之外Wordpress还提供了四个标准变量用来区分显示的阶段:$before_widget, $after_widget, $before_title, and $after_title。最后$instance是用来获取Widget本身实例属性的。Widget实例属性的操作会在后面提到。

Widget配置页面

在Widgets页面中添加了某个Widget之后可以配置该Widget的实例属性。

function form( $instance ) {

/* Set up some default widget settings. */
$defaults = array( 'title' => 'Example', 'name' => 'John Doe', 'sex' => 'male', 'show_sex' => true );
$instance = wp_parse_args( (array) $instance, $defaults ); ?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>">Title:</label>
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" style="width:100%;" />
</p>
<p>
<label for="<?php echo $this->get_field_id( 'name' ); ?>">Your Name:</label>
<input id="<?php echo $this->get_field_id( 'name' ); ?>" name="<?php echo $this->get_field_name( 'name' ); ?>" value="<?php echo $instance['name']; ?>" style="width:100%;" />
</p>
<p>
<label for="<?php echo $this->get_field_id( 'sex' ); ?>">Sex:</label>
<select id="<?php echo $this->get_field_id( 'sex' ); ?>" name="<?php echo $this->get_field_name( 'sex' ); ?>" class="widefat" style="width:100%;">
<option <?php if ( 'male' == $instance['format'] ) echo 'selected="selected"'; ?>>male</option>
<option <?php if ( 'female' == $instance['format'] ) echo 'selected="selected"'; ?>>female</option>

</p>
<p>
<input class="checkbox" type="checkbox" <?php checked( $instance['show_sex'], true ); ?> id="<?php echo $this->get_field_id( 'show_sex' ); ?>" name="<?php echo $this->get_field_name( 'show_sex' ); ?>" />
<label for="<?php echo $this->get_field_id( 'show_sex' ); ?>">Display sex publicly?</label>
</p>
<?php
}
?>

Wordpress提供了标准接口function form( $instance ) 用来显示该配置页面的内容。方法中主要包含两个部分。

  • 第一部分配置了所有实例属性的默认值。
  • 第二个部分是配置页面的显示内容。

更新Widget实例属性


function update( $new_instance, $old_instance ) {
$instance = $old_instance;

/* Strip tags (if needed) and update the widget settings. */
$instance['title'] = strip_tags( $new_instance['title'] );
$instance['name'] = strip_tags( $new_instance['name'] );
$instance['sex'] = $new_instance['sex'];
$instance['show_sex'] = $new_instance['show_sex'];

return $instance;
}

Wordpress提供了标准接口function update( $new_instance, $old_instance )用来处理实例属性的更新。更新的内容直接设置在$instance中就可以了。不需要直接操作数据库。

总结

这就是所有开发正常widget所需要了解的内容了。快动手吧。

参考资料

http://codex.wordpress.org/Widgets_API
The complete guide to creating widgets in WordPress 2.8

, , , ,

No Comments

WP-Dict version 1.0.0 released

=== Plugin Name ===
Contributors: windlx
Donate link: http://blog.tech4k.com/
Tags: dict, translation, wp-dict
Requires at least: 2.8
Tested up to: 3.0.4
Stable tag: 1.0.0

Widget Plugin. A widget could help to translate between English and Chinese.Take advantage of the API from dict.cn.

== Description ==

Widget Plugin. A widget could help to translate between English and Chinese.Take advantage of the API from dict.cn. Implimented by Ajax.

== Installation ==

  1. Unzip wp-douban-post to the ‘/wp-content/plugins/’ directory
  2. Activate the plugin through the ‘Plugins’ menu in WordPress
  3. Add ‘WP Dict’ in through the ‘Widgets’ menu in WordPress
  4. Any problem, please contact windlx from my blog.
  1. 解压后将文件上传到’/wp-content/plugins/’目录
  2. 在插件中激活wp-dict
  3. 在Widget中添加WP-Dict
  4. 如有问题,请通过我的博客windlx联系我

== Frequently Asked Questions ==

= What do I need before the installation? =

You don’t need anything. Dict.cn API is open to everyone.

= Why I can’t see WP Dict Widget from my ‘Widgets’? =

There is a build issue before 2011/01/23. If you used to install it, please delete the plugin and reinstall it. Everything will be fine.

== Screenshots ==

1. WP-Dict

== Changelog ==

= 1.0.0 =
Get the Translation of the words by Ajax.

== Upgrade Notice ==

= 1.0.0 =
Basic Version.

, ,

No Comments

WP-Douban-Post 1.0.0 Released

=== Plugin Name ===
Contributors: windlx
Donate link: http://blog.tech4k.com/
Tags: douban, post, douban-post
Requires at least: 2.0
Tested up to: 3.0.4
Stable tag: 1.0.0

Send one message to your douban broadcasting mysaying when you publish the post.

== Description ==

Send one message to your douban broadcasting mysaying when you publish the post.

== Installation ==

  1. Unzip wp-douban-post to the ‘/wp-content/plugins/’ directory
  2. Activate the plugin through the ‘Plugins’ menu in WordPress
  3. Visit WP Douban Post Options
  4. Click the button “Get Access Token”, it will open a new window for you to authorize WP Douban Post.
  5. Close the window after the authorization is done.
  6. The option page will refresh automatically. If everything works fine, you can see you Douban ID and access token.
  7. Next time when you publish the post, there will be one message sent to your Douban Broadcasting Mysaying.
  8. Any problem, please contact @windlx at Twitter.
  1. 解压后将文件上传到’/wp-content/plugins/’目录
  2. 在插件中激活wp-douban-post
  3. 访问WP Douban Post选项页
  4. 点击Get Access Token按钮, 会打开豆瓣网页,要求你对WP Douban Post应用进行授权。
  5. 授权结束后,点击Close按钮,关闭返回页面。
  6. 选项页会自动刷新,如果一切正常,页面会显示你的Douban ID, Acces Token和Access Token Secret.
  7. 如有问题,请通过新浪微博@windlx联系我

== Frequently Asked Questions ==

= What do I need before the installation? =

You need to have a Douban ID for authorization.

== Screenshots ==

1. WP-Douban-Post.

== Changelog ==

= 1.0.0 =
* Configuration Page in WordPress Admin
* Generate Douban Access Token
* Send one message to user’s Douban Broadcasting Mysaying when publish the post.

== Upgrade Notice ==

= 1.0.0 =
Basic Version.

参考插件
WP-DoubanShow
Douban Connect
Twitter Tools

, , , ,

No Comments

WordPress插件开发入门心得

WordPress用了一段时间,有了一些自己的需求。于是硬着头皮就自己做起了插件。眼见0.1.0总算要release了。把这一周的新的体会记录下来。当作是总结。

插件入门

强烈推荐水煮鱼团队的系列文章(见下面的参考),第一篇非常清楚的描述了Wordpress 插件入门的步骤。其实就是一个附带规定格式备注的php。还能更容易么?

/*
Plugin Name: XXXXXX
Plugin URI: XXXXXXXX
Description: XXXXXXXXXXXXXXXXX
Version: XXXXXXXX
Author: XXXXXXXX
Author URI: XXXXXXXX
*/

把上面的信息保存到php文件中,把php文件放到wp-content/plugins//下。你的插件就可以在Plugins列表中看到了。说实话,这一步超酷的,这也是吸引我做下去的关键一步。

Action and Filter

WordPress提供了丰富的API供开发者调用。其中核心的概念就是Action和Filter。
Action指的就是事件,发布博客,进入Admin页面,激活插件,这些都是action。Wordpress可以让开发者将这些action与自己实现的方法关联起来,从而在事件激发的时候能够完成自己的功能。
Filter指的就是过滤器。Wordpress可以让开发者通过注册filter的方式修改Wordpress地默认表现。例如自定义短链接,格式化标题等等。
参考资料中包含了Action和Filter的具体列表。

后台选项页

没想到如此的简单,三步就能完成。
一,注册Action,用户进入Admin页面的时候需要调用的方法。

add_action('admin_menu', 'plugin_name_options_admin');

二,用户进入Admin页面的时候需要具体显示的文字,注册打开选项页时调用的方法。

//Set option page for the plugin
function plugin_name_options_admin(){
add_options_page('wp_douban_post', __('XXXXXXXX, 'xxxxxxxxxxxxxx'), 5,
__FILE__, 'plugin_name_options');
}

三,实现打开选项页时调用的方法。

function wp_douban_post_options()
{
//页面提交需要实现的功能

if($_POST['update_doubanshow_option'])
{
$wp_doubanshow_option_saved = get_option("wp_doubanshow_option");
$wp_doubanshow_option = array (
"userid" => $_POST['userid'],
"apikey" => $_POST['apikey'],
"profile" => $_POST['profile'],
"collection" => $_POST['collection'],
"recommendations" => $_POST['recommendations'],
"powerby" => $_POST['powerby']
);
if ($wp_doubanshow_option_saved != $wp_doubanshow_option)
{
if(!update_option("wp_doubanshow_option",$wp_doubanshow_option))
{
$message = __('Update Failed', 'wp-doubanshow');
}
}
update_doubanshow();

echo $message ;
}
//这部分是显示的html
<div class=wrap>
<form method="post" action="">
<h2><?php _e('DoubanShow Options', 'wp-doubanshow'); ?></h2>
<fieldset name="wp_basic_options" class="options">
<table>
<tr>
<td valign="top" align="right"><?php _e('Douban ID:', 'wp-doubanshow'); ?></td>
<td><input type="text" name="userid" value="<?php echo $userID; ?>" /> <?php _e('Enter your Douban ID.', 'wp-doubanshow'); ?></td>
</tr>
</table>
</fieldset>
<p class="submit"><input type="submit" name="update_doubanshow_option" value="Update Options »" /></p>
</form>
</div>
}

比我想想的容易很多。轻松过了这关。

参数数据库保存

WordPress提供了get_option()和 c()两个方法,可以方便的保存选项页中的参数。

get_option


<?php echo get_option( $show, $default ); ?>
$show
(string) (required) Name of the option to retrieve. A list of valid default options can be found at the Option Reference.
$default
(mixed) (optional) The default value to return if no value is returned (ie. the option is not in the database).

update_option


<?php update_option( $option_name, $newvalue ); ?>
option_name
(string) (required) Name of the option to update. A list of valid default options to update can be found at the Option Reference.
newvalue
(mixed) (required) The NEW value for this option name. This value can be a string, an array, an object or a serialized value.

需要注意的是所有插件的option都保存在一张表,所以为了避免冲突,option名字需要格外当心。

后台定时任务

WordPress提供了简单机制使得插件可以完成定时更新之类的功能。示例如下。

//自定义Action,并注册相关function
add_action('my_event', 'my_function');

//定义Action的出发频率
if (!wp_next_scheduled('my_event')) {
wp_schedule_event( time(), 'hourly', 'my_event' );
}

//当插件被停止时候,移除相关Function
function update_deactivation(){
wp_clear_scheduled_hook('my_event');
}

register_deactivation_hook(basename(__FILE__),' update_deactivation');

总结

总之就是动手做,其乐无穷啊~~~~~~~~~

参考资料

WordPress Plugin API
Write a Plugin
Plugin API/Action Reference
Plugin API/Filter Reference
自己动手写 WordPress 插件
用 Eclipse PDT 开发一个 WordPress 插件

, , ,

No Comments

Liferay 6.0.5的定制

安装好了Liferay自然要玩耍一下。不过不管怎么玩都是人家的东西,要最后完成成自己需要的功能和样子,还需要自己去作二次开发定制。关于这方面的内容网上没有比较清晰的思路可以参考,于是自己写了一些方面,给以后留一些参考。

删除sevencogs
默认的安装包中提供了一个叫做sevencogs的示例站点。由于使用了Hooks Plugin,会和原装的liferay表现有所不同,所以如果你自己要做定制的话,最好把他们先删除。
 
rm -rf liferay-portal-6.0.5/tomcat-6.0.26/webapps/sevencogs*

配置Portlets
Liferay除了核心包中提供了很多实用的Portlet之外,还在liferay-portal-6.0.5/tomcat-6.0.26/webapps/下默认部署了很多强大的Portlets。具体的介绍可以参考下面这个页面。
http://www.liferay.com/zh/community/wiki/-/wiki/Main/Liferay+Portlets
个人的建议是不需要的话先删除,反正之后需要了也可以再添加回来。这样服务器启动也可以迅速不少。

配置MYSQL
默认的Liferay使用的嵌入式数据库HSQL,不过你启动的时候Liferay也会提醒你不要太当真,真要用了一定要修改数据库配置。
首先,在mysql中创建数据库。

create database lportal character set utf8;

然后修改下面这个文件(如果没有就创建)。

liferay-portal-6.0.5/tomcat-6.0.26/webapps/ROOT/WEB-INF/classes/portal-ext.properties

在其中添加一下配置(以MYSQL为例)

jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=
jdbc.default.password=

之后Liferay启动的时候就会自动读取这个配置文件以对应的数据库配置启动了。如果数据表没有创建过还会贴心的帮你创建并且导入基础数据。
具体各种数据库配置示例可以访问下面的链接。
http://www.liferay.com/zh/community/wiki/-/wiki/Main/Database+Configuration;jsessionid=F70539C702464D413394D1A66428E3EC.node-1

自定义布局和主题
Liferay的外观修改主要分成两个部分Layout和Theme.
Layout指的是布局。页面上每个Portal的大小和相对位置都是通过Layout进行定义的。
Theme指的是主题。页面的图片,HTML风格都是由Theme来决定的。

创建Layout
在最新的Liferay IDE 1.1.0中可以方便的创建Layout Plugin来对这个部分进行定制。
1)创建项目
File ->New Liferay Plug-in Project -> Plug-in Type: Layout.
IDE会创建一个“项目名称-layoutpl”的项目。
2)部署项目
Liferay Server-> Add or Remove -> 选择该项目。启动Liferay -> Server
部署的时候会把项目文件拷贝到liferay-portal-6.0.5/tomcat-6.0.26/webapps/下,然后会被Liferay侦测到,加载到系统中。
3)选择新布局
用管理员帐号登录后,可以通过 Manage -> Page Layout 选择你新开发的布局。

创建Theme
Liferay IDE 1.1.0中同样可以方便的创建Layout Theme来对这个部分进行定制。
1)创建项目
File ->New Liferay Plug-in Project -> Plug-in Type: Layout.
IDE会创建一个“项目名称-theme”的项目。
2)部署项目
Liferay Server-> Add or Remove -> 选择该项目。启动Liferay -> Server
部署的时候会把项目文件拷贝到liferay-portal-6.0.5/tomcat-6.0.26/webapps/下,然后会被Liferay侦测到,加载到系统中。
3)选择新布局
用管理员帐号登录后,可以通过 Manage -> Page -> Look and Feel 选择你新开发的主题。
需要注意的是Liferay支持每个页面配置不同的主题。

创建Portlet
这是大家讨论最多的部分。这边就不细说了。
唯一值得一提的是Liferay开发Portlet支持Plug-in和Ext 两种开发模式。具体的好坏我会以后有机会单独叙述。

为控制面板创建Portlet
除了给每个页面(Page)配置Porlet之外,经常也会有需要为个人控制面板添加Portlet功能。例如我的喜好,我的兴趣,我的足迹之类的功能。
Liferay中控制面板也可以视为一个特殊的页面,左边的菜单栏是一个特殊的Portlet,它会把所有需要显示在控制面板中的Portlet罗列出来。右边则是Portlet点选之后显示的内容。
一个Portlet如果需要显示在控制面板中,需要在/WEB-INF/liferay-portlet.xml中为Portlet添加如下内容

<control-panel-entry-category>my</control-panel-entry-category>
<control-panel-entry-weight>14</control-panel-entry-weight>

control-panel-entry-category指的菜单项的分类,包括’my’, ‘content’, ‘portal’ and ‘server’四种。control-panel-entry-weight指的是菜单项在该分类中的相对位置。
需要注意的是可能会出现常见问题一中的错误。

常见问题
1)Error on line 13 of document : The content of element type “portlet” must match
liferay-portlet.xml对顺序也有一定的要求。最简单的方法就是参考ROOT下的liferay-portlet.xml依样画葫芦,肯定不会错。

参考资料
Liferay THemes.pdf
Liferay Admin Guide

, , ,

No Comments

无觅相关文章插件,快速提升流量