Friday 26 June 2009

Update Hackintosh (OSX86) from 10.5.6 to 10.5.7

You must have Mac OS 10.5.7 to install/update iPhone SDK 3.0. The current version on my Dell Inspiron 1525 Notebook was 10.5.6. As you know, it's Hackintosh, which cost me a few day to make it fully work.

To be honest with you, I had no courage to upgrade it. However, someone reported that one of my applications was not compatible with his iPhone OS 3.0.

After backing up my projects, I decided to take a risk.

There were a few discussions about this issue on Internet. My instinct told me that the steps described on the web page http://www.ihackintosh.com/2009/05/update-hackintosh-osx86-from-1056-to-1057/ were feasible.

I chose the old manual one though.

. First of all, I downloaded Delta Update, dsmos.kext, and osx86tools.

. Open a Terminal,
. Copy dsmos.kext to /System/Library/Extensions (sudo cp -R dsmos.kext /System/Library/Extensions),
. ”sudo –s”, then *type password*
. ”while sleep 1;”
. ”do rm –rf /System/Library/Extensions/AppleIntelCPUPowerManagement.kext;done”

. Leave the terminal window alone,

. Open 10.5.7 Update Installer.

. Run update wizard until the last page asking "Restart", but do NOT click the button.
. Go back to your terminal and press Control C to end the script.

. In terminal type: (yon can use other editor like vi)

”nano /System/InstallAtStartup/scripts/1”

Fortunately, in this file, I didn't see anything like "Steal", so it saved me doing the replacement(replace the line Dont Steal Mac OS X.kext with dsmos.kext)

. Exit your editor (nano or vi), but do NOT close terminal window!

Everything went smoothly until I tried to run osx86tools. osx86tools couldn't run at all! Other gui applications either! Luckily I knew(certainly after using Goolge to do a little bit search) that the there jobs (repair permissions, set extension permissions and clear extensions cache) could be done by command line. Please see the link http://pcwizcomputer.com/osx86tools/index.php?option=com_content&task=view&id=13&Itemid=28 for the details.

So I went back Terminal Window,

. "diskutil repairPermissions /" (Repair Permissions. Be patient, it took 5 minutes to finish on my machine)
. "chown -R root:wheel /System/Library/Extensions" (Set Permissions for Extensions Folder)
. "chmod -R 755 /System/Library/Extensions"

. "rm -rf /System/Library/Extensions.mkext" (Clear Extensions Cache, no worry you see it again after you remove it, as it will be re-generated)
. "rm -rf /System/Library/Extensions.kextcache" (didn't see it on my machine)


. Click the "Restart" button on the Update page.

Well, it's time to cross fingers!

It terrified me when the first reboot stopped at showing the Apple Icon and rebooted again. However the second reboot brought every thing to normal - I could logon, and the OS version was updated to 10.5.7!

Next, I tried to update iPhone SDK 3.0, without any problem!

This was my lucky day, but I was not happy. It was also my sad day, the day the world lost the "King of Pop", Michael Jackson.

Saturday 20 June 2009

Google Chinese Pinyin IME on Android phone

Like me, you are probably looking for Chinese Input Method for your g1 phone which has a pure English OS. Android Market has a product (from it4startup), but it is not free. so I have no chance to try it, not sure how good it is.

Actually, Android has its official Google Chinese Pinyin IME. If you are a fun of Android, you can download the source code and build it yourself, or you can simply download it from

http://www.2shared.com/file/6381131/1b885d75/PinyinIME.html

I used Android SDK command abd to install PinyinIME.apk to my device. Probably you can install it by visiting the link above by your g1 phone.

After installation, the Locale & text page looks like as following




By default, you can switch between Chinese and English by pressing Shift-Space.




Sunday 14 June 2009

XMLRPC on iPhone

My first iPhone application needed to call XMLRPC. Google search brought me to the site http://iphone.wordpress.org/development/. I tried its source code(the XML-RPC Client Framework was written by Eric Czarny), unfortunately it was not very promising in my case. At least I found a bug on its Base64 decoding, it hasn't been fixed yet when I tried to post this blog.

The bug appears at (note the difference of italic parts)
http://iphone.trac.wordpress.org/browser/trunk/Classes/XMLRPC/XMLRPCExtensions.m

+ (NSData *)base64DataFromString: (NSString *)string
52 {
53 unsigned long ixtext, lentext;
54 unsigned char ch, inbuf[3], outbuf[4];

It should be

+ (NSData *)base64DataFromString: (NSString *)string
52 {
53 unsigned long ixtext, lentext;
54 unsigned char ch, inbuf[4], outbuf[3];


I believe the author Eric Czarny must have an updated version. As matter of fact, it is hosted at http://github.com/eczarny/xmlrpc/tree/master. This new version is brilliant, it is very easy to integrate it into your own application. The link above also described how to invoke the XMLRPC request.
As supplement, I'd like to share my code with those people who,just like me, have little Obj-C knowledge and try to do iPhone development.

In your view controller header file(.h),

#import "eczarny-xmlrpc/XMLRPCResponse.h"
#import "eczarny-xmlrpc/XMLRPCRequest.h"
#import "eczarny-xmlrpc/XMLRPCConnection.h"
#import "eczarny-xmlrpc/XMLRPCConnectionManager.h"
#import "eczarny-xmlrpc/XMLRPCConnectionDelegate.h"

@interface ConfigViewController : UIViewController<XMLRPCConnectionDelegate> {

@end


In your view controller implementation file(.m),

Within some event handler, call

{

NSString strURL = @"http://x.x.x.x/xmlrpcserver";

XMLRPCRequest *request = [[XMLRPCRequest alloc] initWithURL:[NSURL URLWithString:strURL]];
XMLRPCConnectionManager *manager = [XMLRPCConnectionManager sharedManager];

[request setMethod:@"downloadBookDesc" withParameters:[NSArray arrayWithObjects:strUsername,PasswordHashCode,strISBN,nil]];

[manager spawnConnectionWithXMLRPCRequest:request delegate:self];

[request release];

}

You process the response in the following delegation functions,


- (void) request: (XMLRPCRequest *) request didReceiveResponse: (XMLRPCResponse *) response {

if([response isFault]) {
NSLog(@"Fault code: %@", [response faultCode]);
NSLog(@"Fault string: %@", [response faultString]);
NSString* strErrorMessage = [NSString stringWithFormat:@"%@%@", @"Error:", [response faultString]];
}
else
{
NSLog(@"Pased response: %@", [response object]);
NSArray *result = [response object];
// int counts = [result count];
NSData *str = [result objectAtIndex:1]; //index 0 = "OK"
NSLog(@"return = %@", str);
}

NSLog(@"response body: %@", [response body]);

}


- (void)request: (XMLRPCRequest *)request didFailWithError: (NSError *)error
{

NSEnumerator *enumerator = [[error userInfo] keyEnumerator];
id key;

NSString *strtest;
while ((key = [enumerator nextObject])) {
strtest = key;
}

enumerator = [[error userInfo] objectEnumerator];
id value;

while ((value = [enumerator nextObject])) {
strtest = value;
}

}

- (void)request: (XMLRPCRequest *)request didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge
{
}

- (void)request: (XMLRPCRequest *)request didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge
{
}

Wednesday 3 June 2009

VirtualChannelInitEvent parameter meaning

If you are trying MSDN sample TSSysInf, you may get crash. The problem happens at

strcpy_s(gszClientName, strlen((LPSTR)pData)+1, (LPSTR)pData);


On MSDN, it describes the event CHANNEL_EVENT_CONNECTED as "A connection has been established with a terminal server that supports virtual channels. The pData parameter is a pointer to a null-terminated string with the name of the server.".

However, it was a different story when I debugged it.

dataLength = 256;

pData value is as following,

0x00BCFB7C d6 ad 96 15 c7 72 be 65 e2 d3 32 d1 23 69 c7 87 Ö­–.Çr.eâÓ2Ñ#iÇ.
0x00BCFB8C 0b 6a 41 3e b3 83 b4 b4 0c 24 ab 6d 00 00 00 00 .jA>.ƒ´´.$«m....
0x00BCFB9C 00 00 00 00 88 fc bc 00 30 fc bc 00 28 00 00 00 ....ˆü..0ü..(...
0x00BCFBAC 00 00 00 00 1c fc bc 00 68 22 67 6a 30 fc bc 00 .....ü..h"gj0ü..
0x00BCFBBC 90 fc bc 00 40 00 00 00 10 93 96 00 e4 92 96 00 .ü..@....“–.ä’–.
0x00BCFBCC 96 22 67 6a 80 00 00 00 00 00 00 00 00 00 00 00 –"gj€...........
0x00BCFBDC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00BCFBEC 00 00 00 00 00 00 00 00 00 00 00 00 49 21 67 6a ............I!gj
0x00BCFBFC 38 fc bc 00 48 fc bc 00 10 93 96 00 e4 92 96 00 8ü..Hü...“–.ä’–.
0x00BCFC0C 04 93 96 00 00 00 00 00 a0 fc bc 00 95 65 00 00 .“–..... ü...e..
0x00BCFC1C a0 fc bc 00 17 fe 66 6a 30 fc bc 00 20 93 96 00  ü...þfj0ü.. “–.
0x00BCFC2C 28 fe 66 6a 00 04 00 00 00 00 00 00 32 e4 9f 4c (þfj........2äŸL
0x00BCFC3C 8e 8e d8 58 f3 c0 07 c0 4a ad 8a 20 00 00 00 00 ŽŽØXóÀ.ÀJ­Š ....
0x00BCFC4C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00BCFC5C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00BCFC6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

MS should have updated their document on this function VirtualChannelInitEvent.