浏览模式: 标准 | 列表

最近要给 PHPRPC 站做文档,打算使用 Wiki 系统,为了便于网站搬家和方便用户下载文档,所以选择了 TiddlyWiki,TiddlyWiki 是一个纯 HTML 的 Wiki 系统,而且支持插件,超级棒!不过从网上找了 2 天,也没有找到合适的代码加亮插件,有一个 Plugin: Syntaxify 只支持 css,js 和 xml,而且效果还不是很理想。正好想到有个 dp.SyntaxHighlighter 项目是纯 js 实现的代码加亮库,于是就决定用它来做一个 TiddlyWiki 的代码加亮插件了。我搜集了目前我能找到的所有支持用 dp.SyntaxHighlighter 加亮的语言文件(shBrush*.js),所以这个插件支持的语言比 dp.SyntaxHighlighter官方提供的还要多,支持的语言(包含别名)有:

as, as3, actionscript, bash, sh, batch, dos, coldfusion, cf, cpp, c, c++, c#, c-sharp, csharp, css, delphi, pascal, java, js, jscript, javascript, lua, mxml, perl, php, py, python, ruby, rails, ror, sql, vb, vb.net, xml, xhtml, xslt, html

» 阅读全文

这个可以算是所有语言中完成最快的一个版本了,但是因为 Python 本身每个版本差异比较大,所以目前的实现仅支持在 2.5 和 2.6 版本的 Python 上运行。不过恰好 Google App Engine 是使用的 Python 2.5,所以这个版本是支持 Google App Engine。但是 Google App Engine 是不支持 httplib 模块的,所以专门为 Google App Engine 提供的客户端的特别实现,使用的是 urlfetch 模块。它与非 Google App Engine 的客户端相比,只是去掉了代理服务器的支持,其它的功能和用法完全一致。服务器端对加密传输的支持需要用到 Session,目前只对 flup 0.5 中的 Session 中间件做了测试,并且顺利通过。其它的 Session 中间件未做测试,不过只要是 WSGI 的 Session 中间件实现,应该都是可以支持的。

下载可以在 http://www.phprpc.org 的官方站点上下载,也可以到 http://pypi.python.org/pypi/phprpc 上下载。不过我没有做成 eggs 包。因为完全用 python 语言编写,所以采用拷贝安装的方式即可。

另外安装时注意,dhparams 目录是放在你发布服务器端应用程序的目录下的,不要拷贝到 python 的库目录下。

至于文档,我会在 phprpc 官方网站上以 wiki 的形式来提供,包括其它语言版本的文档。接下来,就是忙文档了。

» 阅读全文

今天有人问 PHPRPC for .NET服务器端的 AddGlobal 方法是做什么用的,这个方法是最近的版本中新加的。它的主要作用就是提高服务器端的效率。它的作用跟原来的 Add 方法类似,但是 Add 方法是为每一个 PHPRPC_Server 的实例对象添加发布方法的,而 AddGlobal 是给整个 PHPRPC_Server 添加发布方法的。也就是说用 AddGlobal 添加一次后,所有的 PHPRPC_Server 对象实例中都可以直接发布这些方法,而不需要每次实例化后再添加,这样就可以提高服务器的处理效率了。AddGlobal 方法一般用在 Global.asax 中,它的用法如下,下面以 ASP.NET 2.0 为例,首先在你的站点下建立这个文件 Global.asax,内容如下:

Global.asax 代码
  1. <%@ Application Language="C#" CodeBehind="Global.asax.cs" Inherits="Global" %>   

然后在 App_Code 目录下建立 Global.asax.cs 文件,内容如下:

Global.asax.cs 代码
  1. using System;  
  2. using org.phprpc;  
  3. using System.Collections.Generic;  
  4.   
  5. public class Test {  
  6.     public double add(double a, double b) {  
  7.         return a + b;  
  8.     }  
  9.     public string add(string a, string b) {  
  10.         return a + b;  
  11.     }  
  12.     public int sub(int a, int b) {  
  13.         return a - b;  
  14.     }  
  15.     public int inc(ref int n) {  
  16.         return n++;  
  17.     }  
  18.     public static string hello(string name, System.IO.TextWriter output) {  
  19.         string result = String.Concat("hello ", name);  
  20.         output.Write("output: " + result);  
  21.         return result;  
  22.     }  
  23.     public List<int> sort(List<int> list) {  
  24.         list.Sort();  
  25.         return list;  
  26.     }  
  27. };  
  28.   
  29. public class Global: System.Web.HttpApplication {  
  30.     protected void Application_Start(Object sender, EventArgs e) {  
  31.         PHPRPC_Server.AddGlobal(new string[] { "add""sub""inc""sort" }, new Test());  
  32.         PHPRPC_Server.AddGlobal("hello"typeof(Test));  
  33.     }   
  34. }  


这样就给全局的 PHPRPC_Server 类添加上了 add, sub, inc 和 hello 方法了。接下来发布的网页就简单多了,比如发布的网页是 index.aspx 的话,那么它的内容只需要这么点就够了:

 

index.aspx 代码
  1. <%@ Page Language="C#" %>  
  2. <% new org.phprpc.PHPRPC_Server().Start(); %>  

是不是很简单啊?

 

» 阅读全文

10月
01

XXTEA for Python

Python代码
  1. ############################################################  
  2. #                                                          #  
  3. # The implementation of PHPRPC Protocol 3.0                #  
  4. #                                                          #  
  5. # xxtea.py                                                 #  
  6. #                                                          #  
  7. # Release 3.0.0                                            #  
  8. # Copyright (c) 2005-2008 by Team-PHPRPC                   #  
  9. #                                                          #  
  10. # WebSite:  http://www.phprpc.org/                         #  
  11. #           http://www.phprpc.net/                         #  
  12. #           http://www.phprpc.com/                         #  
  13. #           http://sourceforge.net/projects/php-rpc/       #  
  14. #                                                          #  
  15. # Authors:  Ma Bingyao <andot@ujn.edu.cn>                  #  
  16. #                                                          #  
  17. # This file may be distributed and/or modified under the   #  
  18. # terms of the GNU Lesser General Public License (LGPL)    #  
  19. # version 3.0 as published by the Free Software Foundation #  
  20. # and appearing in the included file LICENSE.              #  
  21. #                                                          #  
  22. ############################################################  
  23. #  
  24. # XXTEA encryption arithmetic library.  
  25. #  
  26. # Copyright (C) 2005-2008 Ma Bingyao <andot@ujn.edu.cn>  
  27. # Version: 1.0  
  28. # LastModified: Oct 5, 2008  
  29. # This library is free.  You can redistribute it and/or modify it.  
  30.   
  31. import struct  
  32.   
  33. _DELTA = 0x9E3779B9  
  34.   
  35. def _long2str(v, w):  
  36.     n = (len(v) - 1) << 2  
  37.     if w:  
  38.         m = v[-1]  
  39.         if (m < n - 3or (m > n): return ''  
  40.         n = m  
  41.     s = struct.pack('<%iL' % len(v), *v)  
  42.     return s[0:n] if w else s  
  43.   
  44. def _str2long(s, w):  
  45.     n = len(s)  
  46.     m = (4 - (n & 3) & 3) + n  
  47.     s = s.ljust(m, "\0")  
  48.     v = list(struct.unpack('<%iL' % (m >> 2), s))  
  49.     if w: v.append(n)  
  50.     return v  
  51.   
  52. def encrypt(str, key):  
  53.     if str == ''return str  
  54.     v = _str2long(str, True)  
  55.     k = _str2long(key.ljust(16"\0"), False)  
  56.     n = len(v) - 1  
  57.     z = v[n]  
  58.     y = v[0]  
  59.     sum = 0  
  60.     q = 6 + 52 // (n + 1)  
  61.     while q > 0:  
  62.         sum = (sum + _DELTA) & 0xffffffff  
  63.         e = sum >> 2 & 3  
  64.         for p in xrange(n):  
  65.             y = v[p + 1]  
  66.             v[p] = (v[p] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff  
  67.             z = v[p]  
  68.         y = v[0]  
  69.         v[n] = (v[n] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[n & 3 ^ e] ^ z))) & 0xffffffff  
  70.         z = v[n]  
  71.         q -= 1  
  72.     return _long2str(v, False)  
  73.   
  74. def decrypt(str, key):  
  75.     if str == ''return str  
  76.     v = _str2long(str, False)  
  77.     k = _str2long(key.ljust(16"\0"), False)  
  78.     n = len(v) - 1  
  79.     z = v[n]  
  80.     y = v[0]  
  81.     q = 6 + 52 // (n + 1)  
  82.     sum = (q * _DELTA) & 0xffffffff  
  83.     while (sum != 0):  
  84.         e = sum >> 2 & 3  
  85.         for p in xrange(n, 0, -1):  
  86.             z = v[p - 1]  
  87.             v[p] = (v[p] - ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff  
  88.             y = v[p]  
  89.         z = v[n]  
  90.         v[0] = (v[0] - ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[0 & 3 ^ e] ^ z))) & 0xffffffff  
  91.         y = v[0]  
  92.         sum = (sum - _DELTA) & 0xffffffff  
  93.     return _long2str(v, True)  
  94.   
  95. if __name__ == "__main__":  
  96.     print decrypt(encrypt('Hello XXTEA!''16bytelongstring'), '16bytelongstring')  

 

» 阅读全文