解决UCenter在添加应用时出现”通信失败”的问题
最近在研究UCenter,研究过程中碰到一个非常奇怪的问题,那就是添加完一个应用后,无法正常的通信,老是出现通信失败的问题.
经过跟踪,发现竟然是uc.php内的一个变量没有设置,导致uc.php在处理通信请求时总是失败
if(in_array($get['action'], array('test', 'deleteuser', 'renameuser', 'gettag', 'synlogin', 'synlogout', 'updatepw', 'updatebadwords', 'updatehosts', 'updateapps', 'updateclient', 'updatecredit', 'getcreditsettings', 'updatecreditsettings'))) {
require_once DISCUZ_ROOT.'./include/db_'.$database.'.class.php';
$GLOBALS['db'] = new dbstuff;
$GLOBALS['db']->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset);
$GLOBALS['tablepre'] = $tablepre;
unset($dbhost, $dbuser, $dbpw, $dbname, $pconnect);
$uc_note = new uc_note();
exit($uc_note->$get['action']($get, $post));
} else {
exit(API_RETURN_FAILED);
}
第58行的$database竟然在前文没有定义过,改成'mysql'后,就可以正常通信了.
Firefox 3.6 性能测试,较Firefox 3.5 性能提高47%!
Firefox 3.6终于发布了,官方发布的Features集中在了宣传新的Personas换肤功能上.其实Personas在去年就开始在Mozilla Addons下载中心提供测试及下载了,Scourgen周围的很多Firefox使用者都用这个插件换了主题.可惜Personas还不支持换标题栏里更换背景图片,只能给标题栏换一个颜色.
而其实3.6最大的改进则提供了HTML5以及极大的增强了JavaScript的性能,而对此官方却没有做太大的介绍,只放了一个演示视频做对比,Scourgen花了点时间对Firefox3.6的JavaScript性能较上一版本(Firefox 3.5.7)做了一个对比,可以发现多数项目都有100%左右的提高,而平均性能提高则达到了47%
最新的Adium 1.4hg修改版,支持小i的msn群里显示发言人名字.
Adium不能在小i的msn群里显示发言人的名字,用/showname也没有用,逼得我开着虚拟机用Windows live messenger.
今天看到一篇文章,是讲如何将Adium修改成支持msn群的,但是提供的都是老版本,于是下载了Adium的源码,一步一步进行修改.
- 安装Mercurial
Adium使用Mercurial管理代码,所以得先装这Mercurial.个人建议用mac port进行安装,比较方便.sudo port install mercurial
- 安装完就可以创建一个工作目录,然后下载Adium的源码了:
cd ~ mkdir adium_build hg clone http://hg.adium.im/adium
- 下载完成后进入Utilities/dep-build-scripts目录
cd Utilities/dep-build-scripts/
- 下载一些相关的包,以下脚本会自动下载10几个包,并且会自动把文件解压到source目录
./common.sh -d
- 下载Pidgin的源文件并解压缩
cd source mkdir im.pidgin.adium.1-4 cd im.pidgin.adium.1-4 wget http://developer.pidgin.im/static/pidgin.mtn.bz2 bzip2 -d pidgin.mtn.bz2
- 因为pidgin是用monotone这个源码管理软件进行管理的,所以我们得再安装monotone
sudo port install monotone
- 然后对monotone的独特项目管理包(.mnt)文件进行解压,得到pidgin的源文件
mtn db -d pidgin.mtn migrate mtn -d pidgin.mtn pull --set-default mtn.pidgin.im "im.pidgin.*" mtn -d pidgin.mtn co -b im.pidgin.adium.1-4 .
- 用monotone更新一下pidgin的代码
mnt pull mnt update
- 然后开始build相关联的包
./general_dependencies_make.sh
- 如果很快就结束的话,多半是有错误发生,可以看一下log文件,比如我就出现了perl里的某个XML Parser包找不到的错误,导致intltool包编译不成功.
vim ./build/purple_dep_make.log/usr/bin/install -c -m 644 'libgadu.pc' '/Users/scourgen/StudyWorkSpaces/Adium/adium-1.4/Utilities/dep-build-scripts/build/root-i386/lib/pkgconfig/libgadu.pc' make[2]: Nothing to be done for `install-exec-am'. make[2]: Nothing to be done for `install-data-am'. checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /Users/scourgen/StudyWorkSpaces/Adium/adium-1.4/Utilities/dep-build-scripts/source/intltool-0.36.2/install-sh -c -d checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for perl... /opt/local/bin/perl <span style="color: #ff0000;">checking for XML::Parser... configure: error: XML::Parser perl module is required for intltool</span> - 于是再调用port安装这个XML Parser
sudo port install p5-xml-parser ---> Computing dependencies for p5-xml-parser ---> Fetching p5-xml-parser ---> Attempting to fetch XML-Parser-2.36.tar.gz from http://distfiles.macports.org/perl5 ---> Verifying checksum(s) for p5-xml-parser ---> Extracting p5-xml-parser ---> Configuring p5-xml-parser ---> Building p5-xml-parser ---> Staging p5-xml-parser into destroot ---> Installing p5-xml-parser @2.36_0 ---> Activating p5-xml-parser @2.36_0 ---> Cleaning p5-xml-parser
- 再执行第9步,正常的话应该得到如下提示:
Done - now run ./purple_dependencies_make.sh
- 然后开始编译purple的相关包,这步时间会稍微久一点.
./purple_dependencies_make.sh
- 然后在正式编译purple之前进行修改,加入显示msn群里发言人名字的功能.
if ((value = msn_message_get_attr(msg, "P4-Context")) != NULL) { char *body_enc2; body_enc2 = g_strdup_printf("<b>***%s***</b> %s", value, body_enc ? body_enc : ""); g_free(body_enc); body_enc = body_enc2; }将上述代码插入到source/im.pidgin.adium.1-4/libpurple/protocols/msn/msg.c 847行之后,变成:
842 #if 0 843 if ((value = msn_message_get_attr(msg, "User-Agent")) != NULL) 844 { 845 purple_debug_misc("msn", "User-Agent = '%s'\n", value); 846 } 847 #endif 848 849 if ((value = msn_message_get_attr(msg, "P4-Context")) != NULL) 850 { 851 char *body_enc2; 852 body_enc2 = g_strdup_printf("<b>***%s***</b> %s", value, 853 body_enc ? body_enc : ""); 854 g_free(body_enc); 855 body_enc = body_enc2; 856 } - 然后开始编译LibPurple
./purple_make.sh --i386 --regenerate
- 然后编译Mac通用的二进制文件
./universalize.sh
- 然后编译多语言文件
./make_po_files.sh
- 最后安装新的Frameworks到Adium中
./copy_frameworkds.sh
- 最后回到Adium的主目录,进行编译
cd ../.. make
- 完成后,会在主目录的build/Release-Debug目录中出现Adium.app,这就是最终的可执行文件了.
打开程序,看看效果.

不错吧,已经可以看到3个*中间的发言人名字了.
为了方便大家,这里提供我编译的版本的下载地址,是基于最新的1.4hg进行修改的,直接下载就能用了
实测Bootcamp 3.1,显卡性能大幅度提高
Apple发布了虚拟化软件Bootcamp的3.1版本,在这个版本中,除了正式支持了Windows 7之外,最明显的改进就是极大地提高了显卡的性能。
显卡驱动升级到了188.61
而在我的MacBook Pro上的Windows 7的显卡评分也从3.0时的5.9 5.3提高到了6.4 6.4
JavaScript Templates(JST),JavaScript语言下的模板引擎
JavaScript Templates(简称JST)是TrimPath开发的一款JavaScript语言的模板引擎,它可以在任何网页的前端使用,并用来处理大量的,实时的数据的前台展示.JST也是vivipos的打印模板处理引擎.
JST使用的语言是JavaScript,而使用的数据格式则是普通的JSON格式.
简单示例:
<div id="tpl_id">Hello <b>${name}</div>
<script language="javascript" src="trimpath/template.js"></script>
<script>
var a={name:"scourgen"};
alert(TrimPath.processDOMTemplate("tpl_id", a));
</script>
则会alert出scourgen.
JST支持一下几种语法:
- 变量判断:
${name|default:"is null"} - 语句判断
{if name=="scourgen"} scourgen is here {else} no people {/if} - 赋值
{var nameList=["scourgen","John","Shelly"]} - 循环
{for name in nameList} Hello ${name}! {/for} - 宏操作
//借用官方的例子:</li> </ul> <a name="Macro_Declarations"> Examples: {macro htmlList(list, optionalListType)} {var listType = optionalListType != null ? optionalListType : "ul"} <${listType}> {for item in list} <li>${item}</li> {/for} </${listType}> {/macro} Using the macro... ${htmlList([ 1, 2, 3])} ${htmlList([ "Purple State", "Blue State", "Red State" ], "ol")} {var saved = htmlList([ 100, 200, 300 ])} ${saved} and ${saved}</a> - 执行JS
//借用官方的例子:</li> </ul> <a name="eval_blocks"> <select onchange="sel_onchange()"></select> {eval} sel_onchange = function() { ...Do some complicated javascript...; ...more js code here...; } {/eval}</a> -
HTML属性/CSS压缩
//借用官方的例子: <a name="minify_blocks"> <select onchange="{minify} ...Do some complicated multi-line javascript...; ...more js code here...; this.enabled = false; {/minify}"> <select onchange="{minify END_OF_JS} ...Do some complicated multi-line javascript...; ...more js code here...; this.enabled = false; END_OF_JS"></a>
用JST的好处
Apple store的真实收入
最近看到一些新闻,标题是《Gameloft:18 个月,1000 万次付费下载》
比如 Gameloft,在其美国时间 1 月 7 日发布的新闻稿中,其董事长兼 CEO Michel Guillemot 宣布它已经获得了1000 万付费下载。按 Gameloft 的游戏大多分布在 4.99 到 6.99 的价格计,它在 18 个月内获得 5000 万美元的收入是不成问题的。
平均售价6美金,1000万次付费下载,收入是否真的就等于5000万美元?
这不是一个简单的乘法。
Scourgen的朋友Jacky曾经是苹果的粉丝,他曾经告诉我有一种gift card可以在淘宝上买到,这种gift card可以用rmb购买,再兑换成购买价格几十倍的app store内的美金。于是我在淘宝上以“app store”为关键字进行了搜索,搜索结果竟然有1119条,而多数宝贝都是以35人民币的价格贩卖100美金的充值面额,也就是说你花35人民币,以原来5%的价格(35人民币 除以 (6.8汇率 乘以 100美金) =5.15%),就可以在app store上买总计100美金的应用程序,如果算做5美金一个应用程序的话,则可以用35元买20个应用程序,折合每个1.75元。花2块钱不到买一个在iphone上运行的正版软件,真是非常吸引人的事情,难怪scourgen随便打开几个宝贝,发现每个宝贝的成交都有10个以上,看来好多人已经用这种方法去购买app store内的软件了。
我想,任何一个人如果知道可以通过这种方法以低价购买app,他们肯定不会继续以20倍的价格继续购买app了吧?
做一个悲观的假设,如果所有购买gameloft的app的用户都使用这种方法进行购买,则gameloft真实的收入是多少呢?1000万次付费下载,每次1.75元(0.26美元),则是260万美元。260万美元,看起来还真不少,等等,你忘记了apple!因为根据app store与应用程序开发商的协议,所有程序销售额的30%均需要给apple分成,所以gameloft拿可怜的260万美金收入还得打7折,也就是182万美元。
新闻稿的5000万美元和182万美元之间可是差太多了,这是否代表着现在的app store并没有想象中的那么美好?做iphone程序可能真的不怎么赚钱。
解决ofbiz在MAC下出现Keystore密码错误的问题
报错信息:
2009-12-13 13:55:01,489 (main) [ SSLImpl.java:63 :ERROR] ---- exception report ---------------------------------------------------------- Exception: java.io.IOException Message: Keystore was tampered with, or password was incorrect ---- cause --------------------------------------------------------------------- Exception: java.security.UnrecoverableKeyException Message: Password verification failed ---- stack trace --------------------------------------------------------------- java.security.UnrecoverableKeyException: Password verification failed sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:769) sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:38) java.security.KeyStore.load(KeyStore.java:1185) org.ofbiz.base.util.KeyStoreUtil.getSystemTrustStore(KeyStoreUtil.java:110) org.ofbiz.base.util.SSLUtil.getTrustManagers(SSLUtil.java:106) org.ofbiz.catalina.container.SSLImpl$AllowTrustManager.<init>(SSLImpl.java:61) org.ofbiz.catalina.container.SSLImpl.<init>(SSLImpl.java:46) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) java.lang.reflect.Constructor.newInstance(Constructor.java:513) java.lang.Class.newInstance0(Class.java:355) java.lang.Class.newInstance(Class.java:308) org.apache.tomcat.util.net.SSLImplementation.getInstance(SSLImplementation.java:75) org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:152) org.apache.catalina.connector.Connector.initialize(Connector.java:1058) org.apache.catalina.core.StandardService.initialize(StandardService.java:677) org.ofbiz.catalina.container.CatalinaContainer.init(CatalinaContainer.java:218) org.ofbiz.base.container.ContainerLoader.loadContainer(ContainerLoader.java:188) org.ofbiz.base.container.ContainerLoader.load(ContainerLoader.java:65) org.ofbiz.base.start.Start.initStartLoaders(Start.java:259) org.ofbiz.base.start.Start.init(Start.java:96) org.ofbiz.base.start.Start.main(Start.java:410) --------------------------------------------------------------------------------
其实是因为在mac下,java 1.6的cacerts默认密码从以前的"changeit"变成了"changeme"
可以用如下办法恢复密码:
cd #cd ~
#keytool -importkeystore -srckeystore /System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/Deploy.bundle/Contents/Home/lib/security/cacerts -destkeystore newcacerts
Enter destination keystore password: changeit
Re-enter new password: changeit
Enter source keystore password: #直接回车,留空
#sudo mv newcacerts /System/Library/Frameworks/JavaVM.framework/Versions/A/Resources/Deploy.bundle/Contents/Home/lib/security
#sudo mv cacerts oldcacerts
#sudo mv newcacerts cacerts
就ok啦
使用MODx快速构建适合搜索引擎优化的CMS网站
MODx是一个轻量的,适合于SEO的CMS系统.MODx获得了<2009 Best Open Source PHP CMS>的提名,不过最终输给了功能更为强大,用户也更为广泛的Drupal.不过这不妨碍它作为轻量开源CMS的代表给希望快速制作网站的用户们提供一个更好地选择.
MODx的安装过程非常快速,几乎没有过多的页面跳转,安装过程便在ajax操作的提示下顺利完成,甚至测试数据库是否联通都是用ajax实现的,从安装程序的人性化可见MODx非常注重用户体验.
如果在安装过程中选择安装Sample Site,MODx便会自动将一个默认的网站导入当前的系统,方便第一次使用的用户理解系统.
而一个CMS是否强大和易用,通过其后台设置便可知道,让我们看一下MODx的后台界面
在后台界面中,操作员可以非常直观的对当前网站的栏位,文章以及互相之间的层次结构进行调整,而通过更加详细的功能设置则可以使MODx开启URL优化及更多的SEO优化功能.
如果你以为MODx的功能仅仅是这些那你就错了,MODx作为一个非常有潜力的CMS,当然少不了可自定义的扩展功能!在他的官方网站上,有着近600个扩展插件供你安装使用!
而最令人激动的是,MODx还有一个非常活跃的社区供所有使用MODx的用户交流讨论,至今为止已经有25万个发言了,当然如果你的英文不是很好的话,他也有使用中文交流的板块供你使用.
怎么样?下一个网站,使用MODx构建吧!
下载地址:
MODx 1.02.zip (3.6m)
安装需求:
PHP,MySQL数据库.









