Sunday, May 31, 2009

iPhone 3rd Generation New Features Exposed

Hey, UMPCFever, You are not only the first one exposed iPhone 3Gen in HK, but also, you are the first one in the world who brought these new features pictures to us.

[Sorry, I used your pictures directly!]

Auto focus + Video Recording

Auto Focus

Taken by Auto Focus

Taken by iPhone 2Gen

Digital Compass

CPU Activity (For test only, the retail machine will hide this function, I guess)

Cool! I can not wait to see it!

AVAudioPlayer could not play after recording via AudioQueue Object.

Problem

I've been fighting for AVAudioPlayer and AudioQueue object for 2 days,

Here is my Dev environment:
iPhone: 3.0Beta 5
OSX 10.5.7

Here is my scenario:
1. I need to use AVAudioPlayer to play a CAF with IMA4 data format. Including fast forward and rewind.
2. I need to use AudioQueue Object to record audio, because 3.0 has not go public yet.
3. A common scenario is record an audio A, then play the original audio A'(Not the one recorded) or vice versa.

The problem is I could NOT play the A' file  after I record file A.
[theAVAudioPlayer play] always return NO, but [theAVAudioPlayer prepareToPlay] return YES.
This situation only happened after I used the AudioQueue Object for recording. If I did not record, it always worked fine.

About the clean up.
1. I released the theAVAudioPlayer object and set to nil each time after I finished playing.
2. I closed the audio file and deposed the AudioQueue Object each time after I finished recording.

Solution

Thanks to Vitali Molodtsov[Open the original post Needs login], the solution is reset the AudioSessionCategory to kAudioSessionCategory_MediaPlayback just after finish recording. Then every thing goes fine.

Conclusion

I think this is a bug for AVAudioPlayer. Each time, when we initialize an AVAudioPlayer object, it should set the correct AudioSessionCategory for us silently, but it doesn’t. So I’ve fired a bug for Apple.

Saturday, May 30, 2009

The Best Way to Declare a Constant in Objective-C

Thanks to Barry Wark From [Here]

Create a header file like

// Constants.h
extern NSString * const MyFirstConstant;
extern NSString * const MySecondConstant;
//etc.



You can include this file in each file that uses the constants or in the pre-compiled header for the project.



You define these constants in a .m file like



// Constants.m
NSString * const MyFirstConstant = @"FirstConstant";
NSString * const MySecondConstant = @"SecondConstant";



Constants.m should be added to your application/framework's target so that it is linked in to the final product.



The advantage of using string constants instead of #define constants is that you can test for equality using pointer comparison (stringInstance == MyFirstConstant) which is much faster than string comparison ([stringInstance isEqualToString:MyFirstConstant]) (and easier to read, IMO).

Monday, May 25, 2009

A Weird Exception from iPhone Simulator

Today I met a weird exception from AUGraphStart().

Basically, I was running an old sample code written by myself. The main function is mix 2 audio files a playback them simultaneously. I worked fine before, but when I run it, I got this exception:

[00:23:58.425 <AURemoteIOServer>] AQMEIOBase::DoStartIO: timeout
[00:23:58.701 <AURemoteIOServer>] AQMEDevice::StartIO: AudioOutputUnitStart returned -66681
[00:23:58.701 <0xa084a720>] AUIOClient_StartIO failed (-66681)
AUGraphStart FFFEFB87



Obviously, it wasn't came from my code, and I have no idea on this exception now. Did anybody get a same exception recently?



I had tried these:



   1. Restart the XCode. -- No effects.

   2. Restart the machine(Mac Pro, 10.5.7), and restart the XCode. -- No effects.


   3. Reinstall the most recent SDK(Build 9M2735), restart the XCode. -- No effects.


   4. Set the base SDK to 2.2.1 and target to Simulator 2.2.1 Debug. -- No effects.



It's really odd!



Please, if anybody had met similar exception and got a solution, help me out!



Still don’t know how to resolve it now. I need  help!



[Update 2009-06-11]



A week ago, Apple’s engineer had confirmed that they had a bug in UIKit framework.




We do have a simple workaround for this UIKit bug. In UILocalizedIndexedCollation.hm change this:

  UIKIT_EXTERN @interface UILocalizedIndexedCollation : NSObject


to


  UIKIT_EXTERN_CLASS @interface UILocalizedIndexedCollation : NSObject



Having done that, we can build your project and confirm that AUGraphStart returns 0 in the 3.0 simulator.



 




But, after I installed the 3.0 GM Version today, it’s still not included in the GM Version. So that means I still can not play audio in the simulator. I can ONLY do it on the device!

Friday, May 15, 2009

Farewell, Jandan.net

jandan.net

 

Farewell, Jandan.net, You did bring me a lot of fun. But, it also a burden to me to follow you as you are growing bigger and bigger, stronger and stronger. I am pretty sure that you will get more and more popular, and I am also pretty sure that more and more people will follow you spirit to enjoy everyday life. But, I just can’t. Thank you for all the days with me, bring me fun, and fresh news. From the next minute, you will be removed from my Google Reader, and I will miss you~

Take care!

Thursday, May 14, 2009

Best Audio Format for iPhone Audio Programming

I had never done audio programming before I started my iPhone programming. After starting iPhone programming, I started to learn CoreAudio Framework, Audio Unit for Mac OS X system and iPhone System, and largest problem is which audio format should I choose for best practice?

After iPhone OS 3.0 beta was released, Apple finally introduced AVAudioRecorder class to AVFoundation framework. With which, we can play and record audio more efficiently! For me, I can cut the original playback code down from 400+ lines to 20 lines. And for recording, cut down from 300+ lines to 30 lines.

When testing AVAudioRecorder, the file format will significantly effect the file size. I had tried all the available data format when packed with .CAF file.  Here is the result:

[Updated@2009-05-25] YES, we can record with this format on simulator, but we CANNOT record this on the device! Remember this. While another one we can refer to is Apple’s official QA1615

[Updated@2009-06-15] Please do not use AAC if you want to play a system sound.

[Updated@2009-09-30] iPhone 3GS support AAC recording since iPhone OS 3.1 was released on Sept 9th. You can use hardware assisted encoding to record the AAC formatted audio file. But let me remind you, you can not use AVAudioRecord to record AAC audio file yet. The only option is using the RemoteIO Unit.

  • kAudioFormatLinearPCM               = 'lpcm',    OK    20.2M    .CAF
  • kAudioFormatAppleIMA4               = 'ima4',    OK    2.7M     .CAF [Best Choice]
  • kAudioFormatMPEG4AAC                = 'aac ',    OK    968K     .CAF [Updated 2009-05-25], [Updated 2009-09-30] Best Choice for iPhone 3GS
  • kAudioFormatMACE3                   = 'MAC3',    NG            .CAF
  • kAudioFormatMACE6                   = 'MAC6',    NG            .CAF
  • kAudioFormatULaw                    = 'ulaw',    OK    5.1M     .CAF
  • kAudioFormatALaw                    = 'alaw',    OK    5.1M     .CAF
  • kAudioFormatQDesign                 = 'QDMC',    NG            .CAF
  • kAudioFormatQDesign2                = 'QDM2',    NG            .CAF
  • kAudioFormatQUALCOMM                = 'Qclp',    NG            .CAF
  • kAudioFormatMPEGLayer1              = '.mp1',    NG            .CAF
  • kAudioFormatMPEGLayer2              = '.mp2',    NG            .CAF
  • kAudioFormatMPEGLayer3              = '.mp3',    NG            .CAF
  • kAudioFormatAppleLossless           = 'alac'        OK    4M        .CAF
  • kAudioFormatMPEG4AAC_LD             = 'aacl',    NG            .CAF
  • kAudioFormatAMR                     = 'samr',    NG            .CAF
  • kAudioFormatiLBC                    = 'ilbc',    NG    Wierd    .CAF

The list here has omitted all the other data format that are not supported by CAF file extension. You can use the console application afconvert to verify each supported file format and data format via typing this:

afconvert -h 

All the tests were recorded in 60 seconds, with sample rate@44100, 2 channels, 96kbps. The RecordSetting Dictionary object is used as below:

recordSetting = [[NSMutableDictionary alloc] init];

//General Audio Format Settings (Necessary for all audio format.)
[recordSetting setValue:[NSNumber numberWithInt: kAudioFormatMPEG4AACkAudioFormatAppleIMA4] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

//Linear PCM Format Settings (only necessary when you want to record Liner PCM format)
[recordSetting setValue:[NSNumber numberWithInt: 32] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];

//Encoder Settings (Only necessary if you want to change it.)
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
[recordSetting setValue:[NSNumber numberWithInt:96] forKey:AVEncoderBitRateKey];
[recordSetting setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitDepthHintKey];

//Sample Rate Conversion Settings (Only necessary when you want to change the sample rate to a value different to the hardware sample rate, AVAudioQualityHigh means no conversion, usually, 44.1KHz)
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVSampleRateConverterAudioQualityKey];

[Updated 2009-09-30], The record settings listed above was for example only, if you want to record IMA4 or other compressed audio format, you are no need to put the Liner PCM part. Other parts are commented for their purpose.

You can see, the MPEG4AAC has the minimum file size and same quality when compare to other file formats. About the AAC format, please refer to [Wikipedia – AAC"]

Apple, you could just give us a best practice guide! So I won't need to test it one by one myself. OK, I know, you are working out of people, hire me, I would love to do these works.

Thursday, May 7, 2009

A good story



From Mitbbs.com
杂感:写的太好了.我原来总想,中国再过50年应该能有美国,欧盟现在(2008年或者2009年)的水平了吧.最不济也是世界第二了吧.现在看来,50年后能否达到这个目标还有待商榷.

经济快速发展而资源紧缺,随着外汇储备剧增,中国社会充塞着投资海外开发资源的冲动。有钱就什么都可以买到?中国商人非洲买矿失利,深刻体验了中国软硬实力缺陷之痛。没有自己的法律研究、专家队伍,不了解矿业和市场的规则,有钱也只是被骗的份;没有国家军力做后盾,中国人的海外安全得不到保障,又怎么买;以国企出面,遭遇的是国际干涉和政治问题。有钱不能解决全部的问题,中国国力的扩张绝非简单的经济增长,而是一个任重道远、循序渐进的过程。

一、与想象不同的非洲

我们与世界著名的贵族家族合作到非洲买矿。这个贵族家族本来曾在非洲殖民多年,在非洲有广泛的人脉关系,同时对于欧洲的冶炼业有控制力。近年,在矿业资源价格大涨的情况下他们重返非洲。他们需要中国的市场,也需要中国的资本。而我自己的公司也是中国著名的矿业世家,虽然不从事冶炼行业,但对于这个行业也是有感情的。

初次到达目的地时,我们大吃一惊。第一个感觉是:这里是非洲吗?道路宽敞整洁,房屋别致漂亮,出租车居然是奔驰320!这完全是西方最发达国家的模样,与我们脑海里面饥荒、战乱横行的非洲完全是两个样子。

我们是沐浴着胡主席访问非洲的春风去的,时机很好,接待的规格也很高。当地部族酋长的弟弟开来两辆宝马745 ,带着随行车队来迎接我们。以后的这些天,我们就一直坐这两辆车,在沙石路上以100英里的时速飞奔。

他们给我们安排了最好的酒店,听说世界很多富豪都爱到这里度假。酒店实际上是高尔夫球场里的豪华别墅。每个别墅占地超过一公顷,拥有独立的游泳池,别墅之间用绿篱隔开。酒店最吸引人的地方用时髦的词汇就是“原生态”:在高尔夫球场的水面中有河马、鳄鱼漫步;草地上有疣猪、野兔、羚羊;数不清的美丽鸟类和猴子在你房子旁边的树上。当然客人要记住,不能随便走出酒店围墙,外边仅豹子就有2000只。如果你愿意,可以申请打猎,狩猎是当地非常赚钱的旅游项目。因为土地都是私人所有的,上面的野生动物也属于土地所有者,打猎者要向地主交猎物钱,猎取一只豹子大约是10000美元。

来前以为非洲的通讯服务不够先进,到了才知道自己是土著,因为当地使用的是3G和卫星讯号,随时可以上网,进行全球通讯。因为中国还没有3G,所以我们的手机和其他通讯设备都不能使用,成了与世隔绝的人。当然,这样的酒店价格也是世界一流,比在世界其他地方旅行高出十倍以上。

我们住下后,第一步就是去察看矿山。当地有钱人以私人飞机为主要交通工具,私人机场的候机厅犹如一个大一点的酒吧,完全是为富豪服务的。我们在飞机上俯视,绕了一大圈,与其说是看矿山不如说是看风景,主要是看下面跑着的野生动物。之后又开着宝马745沿着沙石路进入矿山。

这里的铁矿露天堆在那里,量很大,有上亿吨;矿石的品位很高,接近 60%的含铁量;每吨才要50美分,很便宜,但运输很难,运到港口就要20多美元,出港又加10美元,运到中国就高达70多美元了。现在海运价格暴涨,运费更高,所以运输是关键。

为了解决运输问题,在合作方安排下,我们拜见了当地铁路部门了解运输情况。铁路在当地是老大,但出乎我们意料,他们对于我们的到来非常热情,一点都不像中国的官僚作风。事后我们了解到铁路是当年中国参与修建的。铁路员工,在该国革命时是战士,革命成功当然要来这全国最好的部门工作。这些人当年是由中国教官培训的,所以对于中国人非常热情。当我提起我爷爷当年作为矿产专家曾经访问过非洲,大家的关系又拉近了。

二、讨价还价的谈判

为了塑造形象,我们还参观了当地的公益项目,捐助了一家收留爱滋孤儿的慈善机构。随后,正式谈判开始。时间很紧张,他们准备了七本合同,每本均有几十页,全部看一遍都很难。这才知道他们前面安排我们一通玩乐,就是要消耗谈判时间,时间一紧张,他们就占有主动地位了。

谈判中发现,他们要求我们必须在当地投资建设一个双方共有的加工厂,他们负责设计建设运营,把铁矿石的品位从55%-59%提高到67%-69%。但是加工厂的投资额是中国类似企业的200倍以上。我们以为他们要在这个厂上套取利益,但是感觉又不像,因为他们的矿石卖得太便宜了。他们是企业主,不是中国的国企领导人,他们完全可以把矿山价格卖贵一些,根本没有必要多费周折地做一个高价的加工厂来获利!这实际上是一个让大家都不舒服的方案。

同时我们发现他们的铁矿石含钛量很高,竟然有8%以上!含钛量高的铁矿石在冶炼时可能会导致锅炉爆炸。他们解释说加工厂正好可以降低钛含量,使之达到冶炼的标准。另外,当地政府限制初级产品出口,加上运费高昂,所以他们认为建立一个加工厂是极其必要的。而我们一算账,在项目总价格便宜下来后,这个加工厂就算是天价还能让我们大赚一笔:加工过的铁矿的铁含量在67%-69%左右,离岸成本每吨不到30美金,应当是国内见到的最好的铁矿了。进口的澳洲矿、巴西矿都没有这么好。如此一想,也就不忌人生财了。于是,谈判达成一致,双方都很高兴。

值得一说的是谈判中涉及到的一个重要问题:中国是一个外汇管制国家,虽然我们到境外买矿是国家支持的投资,但我们不是国营企业,也没有外籍身份,我们的投资很难汇到国外,因此必须变通,主要方式就是以贸易替代投资。

最后,双方一致约定用循环长期信用证。这样的信用证反复开,并不实际去执行,资金用我们合资的公司在境外贷款来解决,对方也不投资。为了获取贷款,我们与当地银行的行长进行了沟通。我们暗自高兴,由于合同价格特别低,不到国内铁矿石价格的60%,而且是到岸价,加上铁矿石特别紧俏,这样银行怎么都敢开证,还巴不得你不去赎单,只要晚一天银行就把你的矿石高价卖出赚一笔,还白白挣你2%的开证费。我们这样做,就等于投资就是开证费和开证担保,而这样好价格的铁矿,银行抢着开证,担保将非常低。我们等于用很少的钱就完成了需要投资几十亿的事情,能够放大资金十倍,的确诱人。

他们要求我们立即签约,好事情来得太容易总是让人非常担心的。我们逐步发现了自己处境的难堪:如果我们不答应签约,离开这个地方都成问题。每天高额的旅馆费用先不说,我们没有开车或开飞机来,怎么走得了呢?酒店外面可是食人狮啊!现在,我们的首要任务是如何脱身到大城市去。

我们找了一个合理的进城理由:要求在签约前见见当地的律师,听听律师的意见。他们无法拒绝。当车子驶出时,回头再看这世界一流的高尔夫酒店,有了一种脱离牢笼的感觉,它不再美丽。

一进城,根据中国使馆的介绍指引,我们找到了当地的律师。结果又是一个没想到:在非洲,一个好的矿业律师每小时收费要2000美元以上,如果是最好的每小时要10000美元以上!这里早在欧洲殖民时代就建立了一套完整发达的矿业体系,相关法律规定有几百万页,足以装满几个房间,矿业律师在这里是最挣钱的职业!

法律的复杂就意味着可以设置陷阱的地方很多。这里的矿业法不光要有矿山的归属,还有地上的土地使用权,否则不让你开采;还有地下的土地所有权,没有它矿就不是你的;还有毗邻权,你要开采需要得到周边所有的土地经营者的同意;还有环境保护,法律严格规定了采矿对于地下水等的影响要承担的责任;把矿山开采完毕,还有恢复环境的具体要求和承诺……每一条都可以成为陷阱。而且这里实行的是案例法,很多问题是依据已往案例判定的,你光读完了法律但不了解当地曾经有过什么样的判例,一样会被人家忽悠。所以我们那几十页的合同过于简单了,一般的一个矿业合同要有几百页,相关文件成千上万页。这与中国大不一样,我们慨叹对于非洲太夜郎自大了。

进城住下后,我们惊喜地发现酒店里面都有中文提示,让人倍感亲切,说明来这里的中国人已经不少了。从一位当地的老华侨那里了解到,这里的治安极其成问题,商店都被打劫怕了。治安混乱有它的土壤,首先是这里没有死刑,枪可以随便买卖持有,加上战乱时遗留的,基本上是全民都有枪。这里的抢劫犯基本上来源于内战时的雇佣兵,他们在内战结束后没有生活来源,在非洲多个国家流动。凡是有矿的地方都富得流油,而且携带钱款的外来淘金者特别多,因此成为了他们抢劫的首选之地。那些人十多岁就当兵,各国的军事组织出于自身需要给他们进行了特种训练,每个人都在战场上杀人无数,是百里挑一的幸存者,视生命为草芥,警察根本对付不了他们。我们将来如果在这里做项目,招一些普通的保镖来也只能是摆设。

经老华侨一介绍,我们的戒备心又增加了不少,前几天的轻松气氛荡然无存。因为这个合同如果签署有漏洞,我们面对的损失是以多少亿元来计算的!戒备心有了,看合同也仔细了,我们发现合同文本中双方已经谈好修改过的地方,他们在后来的谈判中又偷偷地改了回去。这样就逼迫我们必须仔细核对每一个文件的新版本,由于一份合同就有几十页,工作量剧增。同时大家英语没有那么好,起码达不到法律英语熟练的水平,面对拗口的法律专业表述,每个人都生怕一个时态或介词的改变,造成我们不知道的歧义。

三、合同欺诈

在即将签约的最后时刻,我们在合同中发现了一个大问题,他们在诉讼地上做了手脚。我们约定的诉讼地在新加坡,这是双方距离折中而且是华人社会的地方。但是他们在合同的某个条款里面隐藏了如果有欺诈要通过当地法院的意思,而被欺诈只能是我们,这意味着我们只能在当地与之诉讼!

而这样的欺诈如果出现,很可能就是信用证诈骗。这在中国是非常严重的犯罪,虽然我们也是受害人,但是国内的强势在银行方面,最终结果很可能是你成了诈骗犯。而这样数额过十亿元的当然是特大案件,按照中国刑法要判无期徒刑。在这样的情况下,我们不仅仅要押上所有财产,而且还有自由,这是我们赌不起的。做生意最重要的是要有安全保障:即使亏本,也不能没有翻身的本钱。所以诉讼地问题一出现,双方立刻就翻脸,彻底决裂了。因为我们不了解当地的法律,也不能信任当地的法律,我们是绝对不让步的。同时他们的坚持不让步,也更加让我们觉得其中有陷阱。

这回,双方彻底闹翻。他们坚持要索回给我们的矿石样品。本来一点样品应当是无所谓的事情,为什么那么急切?样品放在酒店房间,在取样品的路上,我仔细地想了一下样品究竟是什么,再仔细看了一下其中的成分表,突然明白了真相。

60% 左右的铁,8%-12%的钛,就铁的含量而言在中国当然是很好的富矿了,中国铁矿的平均水平才30%,铁含量到64%以上可以直接炼钢。除了铁和钛,其中的硫、磷等杂质都在千分之几,那么还有什么呢?那是氧啊,矿石中所有的铁和钛,都是以氧化铁和氧化钛形式存在的,实际上100%的氧化铁矿石中铁的含量也就是70%-72%。用自己的化学知识一计算,这个样品基本上就是氧化铁和氧化钛的混合物,基本没有其他的成分,它是一个非常好的钛铁伴生矿!所以这个样品不是简单的铁矿石,他们当然要拿回去;否则我们回去给我们的技术人员一分析,就明白里头的道道了。

现在明白了,他们要建造的加工厂实际上就是要把矿石中的氧化钛分离出去,剩下的就是铁。他们建造的不是铁矿石的加工厂,而是一个钛的分离厂,这样他们所需要的投资是国内铁矿石加工厂投资的 200倍以上就很好理解了。而钛在国际上的价格是十几美元一公斤,铁矿石如果刨除运费,在这里的价值最多也就10美元一吨,价值相差1000倍;即使是按照含量10吨原矿出1吨氧化钛、9吨氧化铁矿来计算,价值也有100倍以上的差距。而现在他们把分离出来的钛全部占有,给我们说是按照垃圾处理了,还要分享我们铁矿石的利润。也就是说,中国人投入全部的资金,承担全部的运营成本和风险,而他们获得超过99%的利润,中国人只得不到1%!

而且,他们隐瞒了所分离出的钛矿石的巨大利益,这种协议即使是签署了,就算不是欺诈也显失公平,是无效的或者可以撤销的协议,这就是他们欺诈的地方。信用证倒不是最担心的,因为他们也是有身份的人,这种在国际上都算犯罪的事情他们不会干,所以他们选择的诉讼地一定要在当地!

实际上他们选择中国人参与项目,背后有着精心策划。钛是世界上最重要的军事和战略材料之一,全球超过80%的钛储量在中国。中国有大量的钛铁伴生矿,但由于没有冶炼分离技术而使钛金属无法分离、提取,因此得不到利用。这些矿石一般就是把铁冶炼了,剩下的就当作矿渣丢弃。所以有当年日本购买攀枝花的矿渣,号称要运到日本铺路的故事。在他们这个策划中最终的钛会卖给美国,美国只有得到了最需要的钛资源,才不会干涉中国人取得铁矿石。对方的国际平衡算盘打得太精细了,中国改革开放后的新一代商人还要学很多年。

四、解脱

买卖没有做成,也就没有了他们的接待,我们想尽早离开。第二天就准备叫个出租车去机场,临行前给前面提到的那位老华侨打电话告辞。听说我们要叫出租车去机场,老华侨大惊失色,一定要派车送我们去机场。

等上了车见到老华侨我们才知道,这里的出租车司机基本上100%与劫匪有勾结,一旦发现适合抢劫的目标,就用手机以当地土语通知劫匪在预定的地点抢劫你,再与劫匪分赃。难怪这里的出租车能够是奔驰320,不抢劫怎么收回成本?

这里的劫匪最爱抢中国人,尤其是直接去机场的中国人,老华侨说90%以上叫出租车去机场的中国人都会被抢劫。除了中国人爱带现金外,更主要的是抢劫中国人没有政府代你出头,而且中国人都没有枪也不会使用枪。抢劫黑人绝大多数都没有钱,没得可抢;抢劫白人就会是一个大案,有国际压力,而且像美国这样的国家是要动用特种部队(在当地是维和部队)进行报复的,所以他们不敢!而杀了一个中国人,中国使馆能够有一个外交照会就算是最好的了。一般情况是受害人家属连到这里追诉杀人抢劫犯的财力都没有,基本上都是不了了之,何况去机场的都赶飞机,为了不延误飞机,报案都不会。

老华侨的话,让我们每个人都不寒而栗。老华侨还让我们了解到,铁矿石的采矿许可证是很难得到的,他们分离了钛后剩下的铁矿在这里什么都不是,他们如果不能把这些东西运走,就必须回填以恢复环境,这笔费用非常高昂。因为环境恢复得不到保证,他们开矿是得不到许可的!而没有采矿许可的铁矿石的身份就是矿山废料,出口给我们也只能开这样的出关手续;同时他们以废料名义出口可得到政策优惠。回想起来,我们并没有看到他们的铁矿石的采矿许可证,合理的推断应当是他们准备把矿石按照废料给我们。

而把矿石运走必须有铁路部门的支持。而铁路部门黑人当政后抵制白人,不是有钱就能够搞定的,实际上是我们帮助他们忽悠了那些铁路官员,他们带我们参观这参观那有其商业目的。而大肆宣传我们的捐助,也对于他们的运作大有帮助。知道了这些,我们更难受了:本来还以为他们只是给我们不到1%的利润,现在才知道你是在给人家处理垃圾,他们应当倒给钱。同时按照中国的法律,也会有现实的问题:按照矿山废料出口给我们的铁矿石,就是洋垃圾,这样的海关手续在中国基本上无法进关报关,这又是一个陷阱!

还有非常重要的一点是我们回国后问了国内的专家才知道的,就是他们使用的技术是全球都没有的新技术,来源是欧洲最大的冶金公司之一的总工程师和世界矿业三巨头之一的首席探矿师。虽然技术水准非常高,但因为还没有实际应用,研发风险非常大,很可能成为无底洞;而研发失败就会血本无归,但血本无归的是我们。如果按照商业上风险投资的方式进行运作,倒是可以赌一把的,前提是双方都知道。由此一想,即使是我们分得的铁矿的那个可怜的1%的收益,也是风险巨大的不确定收益。

设想,如果我们使用了信用证这样的投资,一旦血本无归,对方可以拿着协议说我们真的是投资,要我们还钱,不还钱就真的成为了信用证诈骗了。所以他们会让公司贷款,公司是有限责任,而实际上我们承担了无限责任。这样高风险的技术研发投入,对方提出的投资经常是非常保守的,实际的花销是估算的几倍也很正常。就如我们的项目立项也有很多“钓鱼项目”,先小额的让你上钩,后续的不投资都不行。一旦真的要不断追加投资,我们的资金能力是承受不起的,更何况在非洲那样的商业环境中绝对不能押上全部的身家。因此我们不签署这个协议是非常正确的。

我们重新估算了一下这个项目,如果计算钛的利益价值不会少于几十亿美金。老华侨告诉我们,这里做矿,商业间谍、商业贿赂横行,比中国厉害多了。那一万美金一小时的律师也会被买通的,因为他和多少亿美金价值的矿山交易一比就不算什么了。这里没有什么商业信誉,如果我们一定要投资,就一定要在中国找一个懂非洲矿业法律的专家,由法律专家提出问题;同时在当地找多个律师,让他们彼此不知道对方,分别问同样的问题才行。

五、沉重的反思

飞机起飞了,我们这才觉得安全了,算是有惊无险。我们这边去的人都有上亿元的身家,但是与没有钱的人没什么不同,钱到一定的数量就是数字游戏了,就算是有百倍之利,又有谁愿意冒生命危险去做呢?所以非洲的矿山是冒险家的乐园。而对于没有钱的人,仅仅是那一小时一万美金的律师费,又有谁做得起呢?对于发达国家,这样的事情都是有国家在背后做安全保障的,我们也不时地看到美国等国为保护其公民而动武,国家调动军队保护其公民,进行所谓的维护和平行动。而他们的公民在干什么?就是开发掠夺当地的资源。在整个过程中国家躲到背后,私人企业在市场公开交易下以公平的规则形式进行。然而个人是有国家归属的,最终的资源当然也就控制在国家之下了。

可是在中国,我们这样的民营企业根本指望不上军队来支持你在海外的商业行为,就连国有企业也很难享受这个待遇,因为如果是国家的企业出面再调动国家的军队,这就不是商业行为而是政治问题了,各国都要干涉。所以国企海外找矿的阻碍已经出现了端倪,现在非洲就有专门针对中国的新殖民主义的说法!在这种情形下,真正需要的是以民营的手段按照当地的商业规则进入。我们有最惠国待遇,美国人、欧洲人是私人企业,我们也是私人企业。按照商业准则搞市场经济,国际反华势力干涉不了商业行为。但如果我们变成了国有企业,就成为了国家参与,就有国家掠夺的指责,这与当年在英国炮舰下的东印度公司将没有区别。只要各方势力都干涉,那根本做不成。因此现在需要的就是鲁迅当年说的费厄泼赖,虽然这个费厄泼赖有国家在背后支持,公平公开的市场交易只是形式、规则和程序,但这个游戏规则是我们国家应当遵守和利用的。现在的问题是,我们连这个形式都没有,而我们也不可能新创一个自己的游戏规则。

回国后,我们立即先找国内的法律资源支持,却发现找不到一个懂非洲矿业法的专家。懂英美法的还有一些学者,但这样的专家也没有用,因为他们研究的目的更多的是借鉴英美先进的立法思想来建设中国的法律体系,而不是真正的应用。他们实际操作的能力非常有限,临场的反应和经验全无,而且理论水平也无法与境外的专家比,基本只是在用外语进行法学翻译工作,在法学思想上没有自己的见解。国内的靠不上,非洲当地的呢?按照当地律师服务的规则,对于你咨询的律师,你提出的问题他必须如实回答你,答错要承担责任,但是如果你没有问到,他也没有义务必须提示你。如果自己根本不懂,问不出问题,还做什么项目?现在中国的企业家对于国外是非常陌生的,而中国自己又没有这方面的专家,中国企业家在国外经商如何能够不被欺骗?而要培养一个这样的专家,又要多少年?而且怎样培养都不知道。由此知道中国要扩充自己的软实力,实在是不容易啊!

这些年来,我们国家外汇储备剧增,经济快速发展而资源紧缺,社会上到处是要投资海外开发资源的呼声,好像有钱了就什么都可以买到。但是这次非洲之行给我最深刻的体会就是中国软硬实力的不足。光有钱是解决不了问题的,没有自己的法律研究,没有自己的专家队伍,不了解矿业和市场的规则,你有钱也就是被骗钱的份。而没有国家军事实力做后盾,你在海外的人身安全也得不到保障,又怎么买?以国家的企业出面,还有国际干涉和政治问题。因此有钱不能解决全部的问题,钱好筹集,而在海外赚钱所必需的软实力却非一日之功,所以中国的国力扩张远远不是简单的经济增长,而是一个任重道远、循序渐进的过程。中国在海外开发资源,也要伴随着国力的增长,有国家成为坚强后盾才有可能。

由此也理解了为什么我们那么多的外汇储备之所以只是储备,没有花掉买成资源,还要高价进口别人的成品。到现在为止,中国成功收购境外大型矿山的实例好像还很少听说,基本上都是小矿尾矿。在国内的学者出谋划策呼吁很容易,执行起来实在是太难了,能够切身体会到中国软实力缺陷的就更少了。这样的情况,就如同当年的洋务运动,很多中国的实业家参与了,他们的经济实力可以调集数百万两白银,在当时的世界上也是数得着的巨款,但是在与洋人的竞争中却是处处吃亏。不能知己知彼,何来胜利?这种策划力和执行力之间的巨大差距,一定要有深刻的认识。所谓知易行难,中国人勤于想而懒于做,教育和研究也是追求学术上的、理论上的高度而不是实际的执行操作能力,这些问题在这里也集中地体现了。

最后要说的,海外华侨在关键时刻还是能发挥巨大作用的,非洲之行中当地那个老华侨给了我们很大的帮助。这让我反思:我们应该怎样对待华侨?我们总希望他们回国,讲什么落叶归根。但是我们这样的举动,让我们的华侨在海外的生存环境非常艰难,因为当地的社会会排斥他们。我们不如不要到处宣扬这个落叶归根,而是鼓励他们在海外定居入籍。我们限制我们的国民只能有一个国籍,实际上也限制了很多华人的发展。欧美不少国家的人都是有双重国籍的,因为没有人会为了非洲的国籍而放弃本国国籍。但同时如果他们没有非洲国籍,在当地的行为就会受到巨大的限制。非洲对于外国人的政策和我国不一样,有外籍身份在我国可以享有种种优待,而在非洲,外国人在税收等方面会有很多不便,外国人的最惠国待遇与本国人的国民待遇差别是很大的。而且非洲反殖民的弦绷得非常紧,没有国籍干什么事情都不顺利。西方等国利用双重国籍的政策,实际上在体制上已经占了我们很大的便宜。该怎样创造条件,有利于中国更好地融入世界,我们还是需要解放思想、实事求是。