2012年2月14日星期二

构建PS2开发环境

手上这台39001的PS2跟了我很久了,对我来说也算是一个很特别的存在吧。今年过年的时候又想起了他,于是又把他翻了出来,还在淘宝上花了260人刀买了块美版的网卡打算玩玩HDL。可是因为很久没用,主板上的电池没电了。在自己动手换了电池之后,却没想到一直用得好好的uLaunchELF出问题了,黑屏。

我遇到的是一个看起来很诡异的问题,读盘打游戏都OK,同样基于LaunchELF改的LbFn可以用,HDLoader也可以用,但是uLaunchELF、Free MC Boot和Open PS2 Loader都用不了。

拿到修理店,磨了老板一个下午却没找到究竟是哪里出了问题,最后只能把本来装的Magic 3直读换成了Modbo 3,先将就着用,可心里一直有点不太舒服。

前几天总算是找到时间弄了弄PS2的Homebrew编译环境,用最原始的scr_printf去跟,终于发现了问题所在。我的两个手柄接口,凑巧第二个口坏掉了。因为第一个没坏所以打游戏什么的都正常,但uLE在启动时会去尝试初始化第二个手柄,不知道是因为短路还是啥,总之uLE等不到正确的信号,于是就挂在那儿了。

好吧,以下是Ubuntu下PS2编译环境的构建过程:

安装需要的一些工具:

sudo apt-get install gcc patch wget make subversion

下载ps2toolchain(ps2dev.org的SVN服务器当掉了,找了个mirror):

cd ~/
svn co http://psp.jim.sh/svn/ps2/trunk/ps2toolchain

修改ps2toolchain/scripts下的005-ps2sdk.sh和006-ps2client.sh,将svn://svn.ps2dev.org/替换为http://psp.jim.sh/svn/,然后编译:

cd ps2toolchain
sudo ./toolchain-sudo.sh

编译完成的内容会被安装在/usr/local/ps2dev下,现在修改~/.profile,增加以下内容:

export PS2DEV=/usr/local/ps2dev
export PATH=$PATH:$PS2DEV/bin
export PATH=$PATH:$PS2DEV/ee/bin
export PATH=$PATH:$PS2DEV/iop/bin
export PATH=$PATH:$PS2DEV/dvp/bin
export PS2SDK=$PS2DEV/ps2sdk
export PATH=$PATH:$PS2SDK/bin
export GSKIT=$PS2DEV/gsKit

读取环境设置,删掉已经不需要了的东西:

source ~/.profile
rm -R ~/ps2toolchain

PS2 SDK在后期似乎是处于没人管的处境,所以很多homebrew针对SDK的修改也没地方提交,只好把补丁随源代码发布,这也导致了不同的homebrew需要不同的SDK来编译的状况。这个问题没什么好的解决办法,只能把需要用到的N份SDK都留着。

先把编译好的SDK移回个人目录并修改权限:

mkdir -p ~/PS2dev/SDK
sudo mv /usr/local/ps2dev ~/PS2dev/SDK/
sudo chmod -R a+w ~/PS2dev/SDK/

原始SDK留着,复制一份准备编译uLE用:

cp -R ~/PS2dev/SDK/ps2dev ~/PS2dev/SDK/ps2dev-ULE

创建~/PS2dev/switch-ps2dev.sh,内容为:

#!/bin/bash
if [ $# -eq 0 ]
then
echo "usage: sh $0 "
exit 1
fi
unlink /usr/local/ps2dev &>/dev/null
ln -s ~/PS2dev/SDK/ps2dev-$1 /usr/local/ps2dev || exit 1
echo "$1 dev environment ready."

切换编译环境:

chmod +x ~/PS2dev/switch-ps2dev.sh
sudo sh ~/PS2dev/switch-ps2dev.sh ULE

这里下载uLE的源码,解开来,打开“Source/Changed source for external projects/setup.sh”,同样把SVN地址修改一下,sudo sh setup.sh就可以得到一个可以编译uLE的SDK环境了。

2011年2月13日星期日

Miranda上GTalk的隐身问题

用Miranda上GTalk有挺长一段日子了,隐身的功能一直有问题。虽然GTalk上的朋友没有很烦人的那种,所以对这个功能需求并不强烈,不过每每想起还是有一点疙瘩在。前些天乱逛的时候看到一些相关资料,这几天零零碎碎又作了一些尝试,算是知道这是怎么一回事了吧…

Jabber/XMPP关于隐身的规范有三个,分别是:

按照规范文本的说法,XEP-0018已被拒绝,而XEP-0186又被推迟,目前只有XEP-0126是受XMPP委员会认可的规范。然而不知道出于什么原因,GTalk三个规范都没有采用,而是自己定义了一个google:shared-status的扩充规范来实现这个功能。

(evil不evil的,有人提到GTalk之所以不支持XEP-0126,是因为GTalk不支持XEP-0126的基础规范XEP-0016: Privacy Lists。至于GTalk为啥不支持XEP-0016,嗯,不知道。)

就结果来看,Jabber社区对Google的这个决定挺排斥的。各种流行的Jabber客户端,如Pidgin、Miranda、Psi等等都没有提供Google Shared Status的官方支持。可不管怎么说Google的影响力都是摆在那里的,所以有人给Pidgin写了Gtalk Shared Status的插件,Psi Plus也支持Google Shared Status。Miranda嘛,bug列表上有而已…

我倒是有试了试为Miranda添加Google Shared Status支持,结果嘛,能用,不过也就是这样而已了。因为我对Jabber/XMPP可以说是一无所知,而Miranda的Jabber插件要整个看一遍也会非常花时间,所以代码都是直接冲着隐身这个目标去的。这么dirty的dirty hack提交给官方肯定不会被采纳,就丢在这里好了。要是有人拿去用遇到什么问题可以留言,能改我都会改。

Update 2011-09-18:

官方似乎对加入GSS支持兴趣不大,而且嫌我的补丁写得太脏,可要我去通读一遍插件代码好好的再弄个补丁出来,我也没那个精气神和闲工夫,所以事情就僵在这里了。好在Miranda的更新虽然频繁,可多是小修小补,我的补丁至今仍然能用。以后我还会不定期更新的,但肯定没法做到跟官方同步。如果有更新强迫症的同学,可下载补丁自行编译,Miranda很好编,连VC6都可以过。

http://www.box.net/shared/gqt36iedxi4n7bkzk1q7

Update 2012-02-18:

其实早在v0.9.34的changelog里就有一句:“Jabber: GTalk improvements with status modes”,不过下载回来试了试发现还是有问题,就一直懒得管。今天又想起这一茬,于是把SVN里的代码翻出来看了看,原来基本上就是我提交的那个补丁嘛。只不过我的代码被修改了一部分,虽然显得不那么脏了,可也导致了补丁工作不正常。于是又写了个补丁提交上去,结果嘛,还是以前那样。

添加进正式版里的一部分代码工作不正常,并且有办法让代码至少先跑起来,却还是不愿意做,有点搞不懂这些人是怎么想的。

新的补丁很简单,打开jabber_util.cpp,将第894行由:

if (!m_bGoogleSharedStatus) p << XATTR( _T("type"), _T("invisible"));

改为:

if (!m_bGoogleTalk) p << XATTR( _T("type"), _T("invisible"));

之前编译的插件放上来一年多了,都没人下载过,这次我也懒得放了,万一有人需要的话,自己编一下吧。

2010年12月29日星期三

RGD - libgd binding for Ruby

前些日子在硬盘里乱逛,看到以前写的那一堆半成品,突然觉得自己还蛮不负责的。想说挑一些别人可能用得上的稍微整理一下吧,也算是给自己一个交待吧…

Ruby图片处理一直以来似乎都是用ImageMagick,可这东西即使没有内存泄漏的问题也显得过于庞大了,而且Win32下gem装上的包会把Ruby目录搞得非常恶心,所以一年多以前我根据只支持1.8的Ruby/GD改了一个出来用。

因为Ruby API在IO的部分变化大了点,再加上我对图片处理以及GD其实不熟,后来改着改着就完全重写了一遍。但因为代码并不是集中在一个时间段内完成的,所以还是会有些乱。好在就是这次整理没太偷懒,至少把libgd官方的文档都搬了过来,好歹算有点样子了吧。

代码托管在github:https://github.com/oTnTh/rgd

安装可以直接用gem:gem install rgd

用Windows的同学可以抓precompiled的版本,1.8和1.9同时支持:gem install rgd --platform x86-mingw32

文档的话,http://rubydoc.info/gems/rgd似乎还没更新?反正rdoc是可用的,暂时先看本地的吧。

有bug和问题欢迎找我。

以上。