Tuesday, July 13

水银代码管理

这几天学习了Mercurial这个代码管理工具,一点心得记录下来。
首先是代码管理工具的选择,现在流行的主要是svn,git和Mercurial了。用了svn好几年了,不满还是很多的,不再一一细说,考虑换得话,就上网找资料看看大家的说法,这篇翻译文章《Git 與 Mercurial 的分析》写得不错,没什么好说的,跟着google走,准没错。这几篇文章值得细看《Mercurial - 分布式版本控制系统》《分布式版本控制系统——Mercurial》,《在Google Code上用 Mercurial 取代 Subversion 管理你的项目

我使用的是mac osx snowleopard,在这上面Mercurial的安装比较容易,但是也遇到一些挫折
1)安装,到官方网站下载安装包,安装之。
2) 安装MercurialEclipse, 今后就用Eclipse这个强大的GUI管理代码了,同时还可以兼顾svn和git
3)将我的svn库转换到Mercurial,参见攻略。这时候遇到了问题,见解决办法


有趣的障碍是,很多文章里说需要修改.hgrc这个文件,可是他在哪呢???,找遍硬盘也没有,其实自己建立一个叫.hgrc名字的文本文件就好了,放在/Users/yourname

刷DD-WRT成功,step by step

按照各位大王的暗示,一阵研究,在mac下刷DD-WRT成功
1,首先去  http://www.dd-wrt.com/site/support/router-database
输入自己的无线路由器的型号,我的是 whr-g54s,找到了相应的设备
看一下FLASH大小,我的是 4 MB,据说如果是2M,就要下载micro和mini版本,4M可以下载标准版,
标准版还有多个选择,什么usb,voip和vpn,我选择了 Standard Generic dd-wrt.v24_std_generic.bin,下载

2,恢复无线路由器的出厂状态,按住reset一会,据说30秒,我感觉5秒不到他就回复了

3,联网线,从路由器的lan口(注意不是wan口)到电脑,设置网卡IP,至192.168.11.2,mask255.255.255.0,router:192.168.11.1
,用http连上路由器,确认一下原厂管理界面,留恋一下

4,开两个terminal,一个ping 192.168.11.1按回车(mac的ping不像windows会只ping4,5次,它会一直ping下去), 另一个输入tftp -e 192.168.11.1,先不按回车

5,拔路由器电源,然后再接上,看ping的窗口,一旦发现ping通了,在另一个tftp窗口的窗口,立即按回车,然后粘贴下面的命令put dd-wrt.v24_std_generic.bin
这将下载好的firmware刷入路由器,结束以后会看到类似Sent 3710976 bytes in 13.2 seconds这样的文字


macbook-pro:g$ tftp -e 192.168.11.1
tftp> put dd-wrt.v24_std_generic.bin
Sent 3710976 bytes in 13.2 seconds
tftp>



6, 经过路由器检测灯的一顿闪,似乎成功了,将网卡IP改为192.168.1.2,router:192.168.1.1
http://192.168.1.1/
成功,看到了要求设置用户名和密码的窗口,找个好记的输入,成功
进入admin页面,改变language,改成简体中文,应用之,这一步 safari会出错,用firefox没问题

7,到无线页面,设置ssid,和安全密码,我选的安全模式是wpa personal,接好wan端的网线,打开浏览器(这时候firefox居然上不了网,关闭,重新打开),上网成功

8,测速:我这里下载速度 14.30Mbps (1.787MByte/sec),上传速度19.26Mbps (2.407MByte/sec)
直接用网线的速度是下载 22.11Mbps (2.763MByte/sec),56.63Mbps (7.079MByte/sec)


刷路由器之前最好也测试一下,我忘记了,所以没法比较到底哪里好


接下来怎么玩?听听大家的

[iphone]Code Sign error: Provisioning profile XXXX can't be found

如果你更新了profile,再编译iphone项目,发现下面的错误,那你无论如何clean也不会成功,那真是让人恼火阿







这时候,先copy上面那行出错信息,然后关闭这个项目,打开 finder到你的项目文件xxxx.xcodeproj上面按鼠标右键,选择Show Package Contents菜单,在新打开的finder的,找到project.pbxproj,使用一个文本edit打开它,用查找功能找到所有的有那行编码的位置,删除那一行,至少应该有两个地方







删除以后,保存这个 project.pbxproj 文件,用xcode重新打开你的项目,再编译一下试试

[iPhone]command /usr/bin/codesign failed with exit code 1

如果你在编译iPhone App的时候遇到command /usr/bin/codesign failed with exit code 1

可以确认以下的步骤,打开Keychain Access,找到你的开发者key,Get Info,看一下Access Control这个Tab,选择allow all applications to access this item。再重新编译一下,试一下,看看是否OK了


如何在Tab Bar Controller里面使用ABPersonViewController

如果你想将ABPersonViewController嵌入一个Tab Bar Controller里作为一个Tab,就像下图,该如何作呢?



Step By Step

1:制作xib的时候,不要在相应的tab里加入view controll,如下图:


2,创建自己的NavigationController,继承自UINavigationController,加入ABPersonViewControllerDelegate的protocol


@interface ProfileNavigationController : UINavigationController {


}


3,在自己的NavigationController里面相应 -(void)awakeFromNib,这个方法在xib被调入内存的时候,会被执行,在其中调用 initWithRootViewController,就可以将需要的ViewController显示出来。




-(void)awakeFromNib


-(void)awakeFromNib
{
NSLog(@"bundleLoader waked");
// Fetch the address book
ABAddressBookRef addressBook = ABAddressBookCreate();
// Search for the person named "Appleseed" in the address book
CFArrayRef people = ABAddressBookCopyPeopleWithName(addressBook, CFSTR("Appleseed"));
// Display "Appleseed" information if found in the address book
if ((people != nil) && (CFArrayGetCount(people) > 0))
{
ABRecordRef person = CFArrayGetValueAtIndex(people, 0);
ABPersonViewController personPicker = [[[ProfileViewController alloc] init] autorelease];
personPicker.personViewDelegate = self;
personPicker.displayedPerson = person;
// Allow users to edit the person’s information
personPicker.allowsEditing = YES;

[self initWithRootViewController:personPicker];
}
else
{
// Show an alert if "Appleseed" is not in Contacts
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Could not find Appleseed in the Contacts application"
delegate:nil
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil];
[alert show];
[alert release];
}
CFRelease(addressBook);
CFRelease(people);
}

Tuesday, June 9

Google太客气了

今天的Google Developer Day 2009居然一人发了一台HTC制的Android手机 :P ,触摸屏带2G MicroSD。真是笑纳笑纳了





这次Google Developer Day 2009 YOKOHAMA的主题是A More Powerful Web
强调手机,社区和易用性


精彩的新产品是http://wave.google.com/ 融合mail,chat和sharing的新工具,值得期待

全部照片在
http://picasaweb.google.com/baryon/2009_06_09YOKOHAMA#

Wednesday, January 28

为iphone手动安装pxl文件

上周买了iphone 3G,softbank的黑色16G。越狱成功。安装了一堆软件。
但是pxl格式的软件怎么也安装不上,
iBrickr好像不支持iphone 2.2,pc suit在我的机器里面无法运行,一启动莫名地死掉了。
只好研究了一下如何手动安装pxl文件。

1) pxl文件本质是一个zip文件,将下载的pxl文件的后缀改成zip

例如:

2.0_wobble_1.0.pxl --》 2.0_wobble_1.0.zip

2) 然后解压缩zip文件,形成一个目录结构,含有一个PxlPkg.plist和一个app目录,还有一些Doucment之类的目录
看一下解压结果里面的PxlPkg.plist文件,里面说了app程序的安装位置和权限设置

3) 以2.0_wobble_1.0为例,按照PxlPkg.plist所说,用winscp将Wobble.app目录拷贝到/Applications/Wobble.app,
然后修改app目录权限到777
再修改Wobble.app目录下的Wobble文件权限到775

4)删除/private/var/mobile/Library/Caches/com.apple.mobile.installation.plist这个文件,否则APP格式的游戏或软件可能无法显示

5)重新启动iphone就可以看到安装好的软件了。


app格式的程序参照步骤3,4,5

ipa文件本质也是zip,但是不需要自己拷贝到/Applications,他是被itune自动安装到/private/var/mobile/Applications

Wednesday, October 22

不要将Swap File设置到外接硬盘

我的mac机通过1394口外接了一块250G的Maxtor Personal Storage,使用BootCamp启动vista。因为一开始只给windows留了30G的空间,碰上vista这样的吃空间的巨兽,硬盘很快就没地方了。为了节省宝贵的C盘,有一天灵机一动将swap file设置到外接硬盘上。从那天起,恶魔附身了,电脑休眠,关机时经常会出现莫名其妙的蓝屏。只要通着电源,关机状态的电脑会突然自动启动。真的见鬼了。
一周以后的今天,vista终于告诉我,蓝屏的原因是关机的时候正在对外接硬盘读写,让我确认外接硬盘的驱动是否正确。
原来如此,记住不要将Swap File设置到外接硬盘

Monday, May 26

Ruby的UTF8

做了几天ruby的程序,关于日语和汉语的乱码问题做了一点研究
yaml文件可以是UTF8格式,ruby可以正常读取,但是记得一定是不带signature的UTF8格式
我使用的emeditor编辑器可以保存文件的时候选择这种UTF8 without signature的编码方式。

做ruby和ror程序,包括cygwin的gcc程序的最佳工具就是netbeans,现在最新版本是6.1
在netbeans的output窗口输出的文字也总是乱码,这时候需要手动修改在netbeans安装目录下的\etc\netbeans.conf 这一配置文件。在netbeans_default_options=”….的最后,引号之前空一个格,然后键入-J-Dfile.encoding=UTF-8
保存netbeans.conf,在windows2008里这个目录有权限保护,需要改安全属性,才能保存成功。
重启netbeans应该可以解决output乱码的问题了。

在windows的console窗口显示UTF8,也是一个问题。
据说 chcp 65001 这个命令可以改变console的编码格式,值得一试
另外的办法就是安装cygwin UTF8, 使用cygwin代替一般的cmd console
cygwin UTF8在这里:http://www.okisoft.co.jp/esc/cygwin-20.html
我没有装,因为我在windows2008安装的cygwin出现了问题,如下,百思不得其解

Huh? No /etc/fstab file? Using default root and cygdrive prefix...
bash: /usr/bin/tr: No such file or directory
bash: /usr/bin/sed: No such file or directory
$
根据http://cygwin.com/ml/cygwin-apps/2008-05/msg00180.html
知道/etc/fstab 找不到是目前的cygwin的一个BUG,应该可以很快改好。
目前可以在安装cygwin时选择 Prev 也就是前一个版本。

通过安装UTF-8 Cygwin是可以显示日文和中文的。
下载修改过的cygwin1.dll
http://www.okisoft.co.jp/esc/utf8-cygwin/cygwin1-dll-20-04-21.tar.bz2
解压缩以后置换掉cygwin/bin下的同名文件。
然后修改home/yourname/下的.bashrc和.inputrc文件
将下面两个文件下载,将其内容拷贝到对应文件的最后。注意不要直接置换对应的文件。
http://www.okisoft.co.jp/esc/utf8-cygwin/.bashrc
http://www.okisoft.co.jp/esc/utf8-cygwin/.inputrc

修改适当的字体,你可以用cat看到用UTF8 without signature编码的文件内容。
如果一个rb文件类似

$KCODE='u'
p '日本語は大丈夫ですか'
p '汉语也没问题吗!'

仍然在console上输出乱码



实在没有办法只有
开一个cygwin然后输入

tail -f log.txt

然后在另一个cygwin里面打log出来
ruby -Ku test.rb >> log.txt

Monday, March 31

Boost 1.35

Boost 1.35经过长时间的准备, 终于在2008年3月29日公布了。
最先注意到的就是已经不再公开支持Borloand C++系列的编译器了。

http://www.boost.org/users/news/version_1_35_0

Friday, March 21

Windwos server 2008

日文Windows2008因为一个奇怪的bug,英文版发布2周以后才发布,下载,安装,一切顺利。
我没有刻盘,直接从daemon虚拟光驱安装,没有任何问题发生
windows2008支持vista的驱动,所以我的webcamera也可以安装上了,以前的windows2003是绝对不行的。

很多人将server版改造成workstation

可惜我的机器不是64bit的,使得很有趣的Hyper-V不能跑起来

一个重要的工具DosHere,可以在这里找到,在Vista和2008都好用

Friday, March 14

Windows的远程桌面

微软的Windows远程桌面(Windows Remote Desktop)功能非常之好用,下面有几个tips

1,windwos 2003的login是分console和session。正常从本地启动机器登录的桌面叫做console,从远程是缺省打开一个session的,这同windows xp和vista只能登录console是不同的。
要想远程登录到windows2003的console桌面,
在vista上使用命令:
mstsc /admin

在其他windows上使用
mstsc /console

2,远程桌面使用的port是3389,跨防火墙和route的远程访问要开放此端口

Sunday, February 17

市场决定一切

[東京 17日 ロイター] 東芝 <6502.T> が、新世代DVD規格の「HD DVD」に関連した事業から撤退する方向で最終調整に入ったことが16日、明らかになった。
2月に入って、米家電小売り大手ベスト・バイ や小売世界最大手の米ウォルマート・ストアーズ 、米オンラインDVDレンタル大手ネットフリックス がBD支持を相次いで表明。HD方式の劣勢は一層鮮明になっている。

 事業撤退した場合は、どの程度の損失が発生するかも焦点だ。現時点では損失は数百億円規模になるとの見方が出ている。


东芝这次的失败,对日经指数会造成多大影响,拭目以待。
市场决定一切

中文输入法请支持非英文键盘以及提供更好的输入模式

以下内容我贴在Google 实验室--拼音输入法 网上论坛里。其实国产的各种输入法大都有同样的问题,包括微软的拼音输入法。
对日文键盘支持最好的拼音输入法当然是日本高电社的Chinese Writer

请安装时自动判断系统的键盘布局, 支持非英文键盘。

比如对日文键盘的支持,最起码需要改变下面的注册表
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts
\E0210804]
Layout File=KBDJPN.DLL


另外对于中英文的切换快捷键请支持用户自定义,
我既不想使用shift也不想使用ctrl键
日文键盘的话,我更希望使用【半角/全角】键


请提供一种模式,在英文输入状态下自动提供英文单词提示功能,我不想每次敲 v 键
因为如果是英文输入,多数情况是输入不只一个英文单词
最好更智能,长句输入最好能自动判断现在输入的是英文还是中文。


输入提示最好不要在输入条上,而直接插入到windows的输入位置,按取消和变换也在输入框中做改变。
此功能请参阅windows的日文输入法。

Saturday, January 26

SVN Commit Error

我使用的trac是1.5.1版的Trac月
一个 Commit Error困扰我两天。
这个error的描述类似:

Error:Commit failed(details follow):
Error:MERGE request failed on '/svn/dir1/dir2/file'
Error:MERGE of '/svn/dir1/dir2/file' : 200 OK(https://tracserver)

经过长时间的实验, 发现基于windows的这个版本如果将apache作为service启动就会出现这种现象, 作为console启动没有问题。也许是因为某种权限或者用户路径的原因导致trac的post-commit没有完成。
也有一种说法是post-commit-hook的代码里有bug。
时间有限, 不再深究, 暂且console启动。

同病相怜者:
Vic Learn From World
Ariejan.net

Wednesday, January 10

Error: L6265E

"
Error: L6265E: Non-RWPI Section libspace.o(.bss) cannot be assigned to PI Exec r
egion ER_ZI.
Error: L6248E: libspace.o(.text) in PI region 'ER_RO' cannot have address type r
elocation to __libspace_start in PI region 'ER_ZI'.
"
使用arm编译器编译brew程序可能会遇到这个错误,原因可能有两点
1:程序中使用了浮点数
2:如果使用C++开发brew程序, 可能是使用了原生的new,而没有重定义new,也就是说没有使用MALLOC(sizeof(struct))来初始化对象。

Friday, December 22

brew程序的入口点

一个brew程序的真正入口点在AEEModGen.c里面

#ifdef AEE_LOAD_DLL
__declspec(dllexport) int AEEMod_Load(IShell *pIShell, void *ph, IModule **ppMod)
#else
#if defined(BREW_MODULE) || defined(FLAT_BREW)
extern int module_main(IShell *pIShell, void *ph, IModule **ppMod);
int module_main(IShell *pIShell, void *ph, IModule **ppMod)
#else
int AEEMod_Load(IShell *pIShell, void *ph, IModule **ppMod)
#endif
#endif
{
// Invoke helper function to do the actual loading.
return AEEStaticMod_New(sizeof(AEEMod),pIShell,ph,ppMod,NULL,NULL);
}

可见模拟器通过DLL的公开函数AEEMod_Load进入初始化阶段

brew各个模块之间可以进行消息传递函数回调, 而每个模块都可以单独编译不需要连接lib, 是因为各个模块实际公开的都是函数指针, 类似于
#define ISHELL_SendEvent(p,cls,ec,wp,dw) GET_PVTBL(p,IShell)->SendEvent(p,0,cls,ec,wp, dw)

AEE环境给每一个module都传入IShell指针, 在程序里如果想调用其他模块, 需要首先通过ISHELL_CreateInstance创建一个新的实例。
ISHELL_CreateInstance没有代码可看, 可以猜测AEE通过给出classid, 到自己维护的classid表里找到需要dll(module), 调入内存, 执行公开函数AEEMod_Load做初始化

AEEMod_Load-> AEEStaticMod_New设置modFuncs->CreateInstance = AEEMod_CreateInstance
随后AEE调用这个指针,在AEEMod_CreateInstance里面完成调用AEEClsCreateInstance的任务, classid这时候作为参数传进来
在AEEModGen.h里面有AEEClsCreateInstance函数的声明, 这个函数的定义需要在自己的程序里面完成。
int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *pMod, void **ppobj);

如果一个module里面定义了多个class就需要判断classid的值,创建不同的实例。

在初始化代码里
if (NULL == (pme = (AEEApplet*)MALLOC(nSize + sizeof(IAppletVtbl))))
return FALSE; //分配空间,nSize代表CAPP的空间大小!!
appFuncs = (IAppletVtbl *)((byte *)pme + nSize);
这两句表明在applet的结构体后面就是IAppletVtbl

appFuncs->AddRef = AEEApplet_AddRef;
appFuncs->Release = AEEApplet_Release;
appFuncs->HandleEvent = AEEApplet_HandleEvent;

在AEEApplet_HandleEvent里面将IApplet指针转换成AEEApplet指针,然后调用AEEApplet的pAppHandleEvent
之所以可以这么转换是因为AEEApplet的第一个成员就是IApplet指针的地址。结构体的第一个成员的地址就是这个结构体的地址。

INIT_VTBL(pme, IApplet, *appFuncs);
这一句使的AEEApplet结构体的第一个成员指向applet结构体后面的IAppletVtbl

Tuesday, December 5

突然想起若干年前某些华人的卑劣

1999年在日本,我第一次搬家。打登载在中文报纸上帮助搬家的人的电话, 电话里的声音听上去很朴实。搬家当天那个人开了一辆面包车来, 一开始并没有说什么。等你家当装在了他的车上, 开车途中, 露出了本像。先套话看你是不是黑户口, 然后用骂骂咧咧的语言, 讲他家开的是风俗店, 差点明说他就是黑社会。让我多交搬家费, 后来当着我一位女同事的面,讲黄色笑话。

2000年陪老婆去参加日语一级考试。校门口,韩国老生摆起桌子提供饮料为韩国学生鼓劲。零散的几个中国妇女往学生手里塞F:L-G的传单。

Friday, December 1

Vista冲击

刚刚看了微软Vista中国发布现场实况。
http://wmv.it168.com/others/06.11.30/Windows.wmv

加上前一段时间ms放出的vista sdk+.net framework 3.0,
http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&displaylang=en

我认为vista将迅速普及。这里有两方面的原因
1,面向家庭用户, vista的交互界面对用户的吸引作用,加上硬件的需求很高, 使得intel和dell这样的硬件厂商非常热衷于推广它。推动用户更新电脑就意味着更高的收益。
2,面向企业用户,vista sdk和.net framework 3.0的捆绑对于企业软件提供商有很大吸引。特别是缺少积累的中小软件开发商,因为开发成本降低和用户体验大幅提高, 市场竞争将会更加激烈。

纯技术观点
在vista下运行你的软件, 这个blog显示了可能会存在的一些问题
http://blogs.itecn.net/blogs/winvista/archive/category/1095.aspx

给我印象深刻的是这篇文章
http://blogs.itecn.net/blogs/winvista/archive/2006/09/03/3604.aspx

如果你从一个程序员的角度暂时没有感到冲击,那没什么不正常。因为你还没有面向vista编程。注意vista改变了一些东西,加强了安全性。比如service将处于session 0, GUI将处于session 1, 再比如顶楼blog里提到的"虚拟重定向"。

如果你作为企业类软件的厂商暂时没感到冲击, 那说明你的嗅觉不够敏锐啊。

如果你做为普通用户没有感到冲击, 那说明你非常成熟, 一眼你就看出了新玩意的本质。可难道iPod之前就没有mp3 player吗?

Thursday, November 9

莫名其妙的糖尿病特效产品DNJ

父亲让我查一下一种叫做DNJ的糖尿病治疗产品。
在中文网站上可以找到叫做"地恩基(中国)国际医学研究院"的网站在宣传这种DNJ产品。看网站上的宣传就让人起疑。于是借助google和yahoo检索了一下, 也许是google和yahoo做的不好,并没有找到"日本糖尿病并发症研究所(JDCS)常务理事、早稻田大学名誉教授、DNJ日本国际医学研究院井上孝治博士"的任何信息, 也没有找到"日本神奈川大学桑叶研究中心"这么个机构。也没有野尻博士的什么信息。
只有DNJ这个关键词确实可以找到一些治疗糖尿病的健康食品的信息。比如这里的一些介绍。里面只是说DNJ是桑叶独有的成份,期待其成为控制血糖,减肥的健康食品素材。
一些信息显示是神奈川县卫生研究所对DNJ的抑制血糖效果作了研究。通过Google可以检索到他们的研究报告(1),(2)

我不是学医出身,只能简单看一下里面的结论。报告显示实验用白鼠在吃混有桑叶提取物的饲料40周以后,对空腹血糖的升高有明显的抑制作用。

也许这种叫做DNJ的桑叶提取物确实对糖尿病人有益, 但也不至于达到山西患者张阿姨30天逼近治愈的程度吧!