| Tony Huang's profileSouline PLUS planBlogListsNetwork | Help |
|
April 16 我看魔兽世界易主网易错误太多了,我也懒的改了,这篇文章就留在这里当存档吧,大家不要看内容了啊~~ 昨天消息就已经出来了,今天呢,消息已经确认了,这里发表一下我的看法吧。我想从三个角度看这个事情:
写那些名字挺麻烦的,以下所有的 网易 我都用 NE 来代替 九城 我都用 9C 来代替 暴雪 我都用 AB来代替 魔兽世界 我都用 WoW来代替
第一个角度:NE取得经营权 NE取得经营权这一点得从两个方面来说: (1) NE的目的 众所周知 WoW 是一款利润非常可观的网络游戏,这款游戏无论是从口碑、质量、活跃用户数量还是收入来说,都是非常优秀的。但是我们从9C和AB之间的合同(马上于5月份到期的那一份),和9C近年来的财报上可以看出,这样的合同对于国内的合作方来说已经是非常苛刻的了。从国内网游产业整体50%的利润率,而9C只有16%的利润率就可见一斑了。 那么NE再以更加苛刻的条件拿到这个游戏的代理权的根本目的是什么呢?真的只是看好这款游戏的盈利能力嘛?从上面的分析,我们不难看出,没有那么简单。 那么是什么导致了NE几乎是不惜代价地拿到了WoW的代理权的呢?我认为有以下几点: a. WoW作为一款精品网游,是NE产品线上所匮乏的高端产品。对于一个从门户网站转型过来的互联网公司来说,这对于网易的品牌价值的培养是非常有必要的。 b. 现在国内的网络游戏市场主要有如下的几家大公司:盛大,具有完整的产品线,盈利能力、研发能力、已经取得经营权的进口网游大作也已经非常的多;9C,主要依赖WoW,其收入的90%来自WoW,但是近年来在自主研发上发力,2008年7月正式成立了TDC(The9 Development Center,九城研发中心),同时握有劲舞团2的代理权;NE,通过天龙八部游戏获得了几乎是超额的利润;巨人,以低端玩家为主;久游和腾讯,以休闲类游戏为主。那么和NE发生直接竞争的主要是盛大和9C,而其中的9C有时相对来说比较脆弱的,失去了WoW的9C将会非常脆弱,如果NE再继续做本文第三部分中所描述的事情,NE就会成长成为一个足以和盛大较量的网游公司。 (2)NE的砝码 在 天龙八部 的研发和运营上的巨大成功上来看,证明了NE有足够的实力运营好一款大型的MMORPG游戏,同时这也为NE提供了充足的现金,可以和AB进行谈判。这样NE就可以以更好的谈判条件,将代理权“夺”过来。
第二个角度:9C失去经营权 9C失去代理权应该是说意料之外,情理之中的事情。公司的收入严重依赖于一款产品,一直以来是公司领导层的一块心病。9C也做了很多努力去改善这个状况,比如引进代理新的产品,自主研发产品,等等,但是结果只是杯水车薪。 对于9C来说,他迟早是要面对这个问题的,只是时间问题。所以对于失去WoW的代理权,无论是对于9C还是对于大众来说,都是情理之中的事情,9C也不会感到特别的意外。说不定这反而能够成为一个公司进行转型的助推剂。现在陈晓薇要做的,我想最重要的是调整公司的战略,飞往美国,去安抚华尔街的情绪。
第三个角度:NE的后续步骤 NE的后续步骤,在我看来最合理的做法是,等待9C的股价到一个相对低点,然后对9C发起收购。
唉,写不懂了,就先写这么多吧…… January 10 AJAX 异步串行化库今天总结了一下异步操作串行化的方法,写了个简单的串行化库
LIBRARY: Souline.AsyncLoop.js
async = {
// while
wh : function(func_cond, func_body, func_end) { function _async_while() { if (!func_cond()) { func_end(); return; } func_body(function() { // next _async_while(); }, function() { // break func_end(); return; }); } _async_while(); }, //for
fo : function(start, end, func_body, func_end) { var i = start; this.wh(function() { return i <= end; }, function(func_next, func_break) { func_body(i++, func_next, func_break); }, function() { func_end(i); }); }, // for each
each : function(collection, func_body, func_end) { this.fo(0, collection.length - 1, function(i, callback) { func_body(collection[i], callback); }, func_end); } }; 用法也很简单啊:
async.fo(1, 40, function(i, func_next, func_break) {
// do something on i
if (breakCondition) {
func_break();
return;
}
func_next();
}); January 07 AJAX 异步处理中的一种技巧今天在写 九城 的 WebGame 九州战记的外挂(或者说插件吧),所有的操作都是异步的,有了一下的一点感悟:
在很多情况下,我们需要顺序的完成一些异步的操作:
比如:整理背包功能:
我们需要顺序的将每一个不在它应该在的位置上的物品移动到位置上,但是移动物品是异步的操作,这部分,我写了一个函数:
function moveCard(name, num, pos, newPos, callback) {
$.get(moveCardUrl(name, num, pos, newPos), callback);
}
然后我写了个moveCards函数,遍历数组:
function moveCards(cards) {
for(var i = 0; i < cards.length; i++) {
var card = cards[i];
var oldPos = card.Pos;
var newPos = i + 1;
if(oldPos != newPos) {
moveCard(card.Name, card.Num, oldPos, newPos);
}
}
}
这是,所有的请求并不是串行执行的,(其实也不是完全并行的,因为HTTP协议规定,一个客户端和一个服务器之间最多能保持两个连接)
所以,我对这个函数进行了改变:
function moveCards(cards) {
var i = 0;
function _moveCard() {
while((i < cards.length) && ((i + 1) == cards[i].Pos)) i++;
if(i == cards.length)
return;
var card = cards[i];
var oldPos = card.Pos;
var newPos = i + 1;
if(oldPos != newPos) {
moveCard(card.Name, card.Num, oldPos, newPos, function() {
i ++;
_moveCard();
});
} }} December 21 一些常用组件的用法今天要用一些常用的组件,但是却忘记了具体的做法,在网上找了好久才,找到,就干脆在自己博客上记录一下,以后用起来方便一点吧。
1) Log4net 的配置和使用
配置:
<?xml version="1.0" encoding="utf-8" ?>
<log4net> <root> </root> <logger name="CallLog"> <level value="ALL" /> <appender-ref ref="CallLogAppender" /> </logger> <appender name="CallLogAppender" type="log4net.Appender.FileAppender"> <param name="File" value="E:\logs\World\CallLog.log" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value="yyyy-MM-dd HH:mm:ss" /> <param name="StaticLogFileName" value="false" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> </log4net> 具体的内容我也不解释,大家就将就着看吧,参考类的东西,就不用那么详尽了,呵呵
初始化:
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(AppDomain.CurrentDomain.BaseDirectory + "log4net.config.xml"); log4net.Config.XmlConfigurator.Configure(doc.DocumentElement); 使用:
var log = log4net.LogManager.GetLogger("CallLogger");
log.DebugFormat("{0}.{1} called", className, methodName);
2、Castle.Windsor.WindsorContainer
常用的轻量级IoC容器。
配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration> <components> <!-- WebServiceManager --> <component id="WebServiceManager" service="Souline.Basic.Facility.WebServiceManager, Souline.Basic.Facility" type="Souline.Basic.Facility.WebServiceManager, Souline.Basic.Facility"> <parameters> <services> <item type="System.String"> <item>Souline.World.WebService.LoginService, Souline.World.WebService</item> </item> </services> </parameters> </component> <!-- Logger --> <component id="CallLogger" service="Souline.Basic.Contract.ILogService, Souline.Basic.Contract" type="Souline.Basic.Facility.Log4netLogService, Souline.Basic.Facility"> <parameters> <loggerName>CallLog</loggerName> </parameters> </component> <component id="CallLoggerInterceptor" type="Souline.Basic.Facility.Interceptor.LogServiceInterceptor, Souline.Basic.Facility"> <parameters> <logService>${CallLogger}</logService> <logLevel>Debug</logLevel> <format>{datetime} [{pid}:{tid}] {class} : {method} > {message}</format> </parameters> </component> <!-- LoginService --> <component id="LoginServiceCache" service="Souline.Basic.Contract.ICacheService`2[[System.String], [System.Object]], Souline.Basic.Contract" type="Souline.Basic.Facility.LocalMemoryCacheService`2[[System.String], [System.Object]], Souline.Basic.Facility"> </component> <component id="LoginService" service="Souline.Basic.Contract.ILoginService, Souline.Basic.Contract" type="Souline.Basic.LoginService, Souline.Basic"> <parameters> <userCache>${LoginServiceCache}</userCache> </parameters> <interceptors> <interceptor>${CallLoggerInterceptor}</interceptor> </interceptors> </component> </components> <facilities> <facility id="factorysupport" type="Castle.Facilities.FactorySupport.FactorySupportFacility, Castle.MicroKernel" /> </facilities> </configuration> 初始化:
_container = new WindsorContainer(new Castle.Windsor.Configuration.Interpreters.XmlInterpreter(containerConfig));
使用:
var loginService = _container.GetService<Souline.Basic.Contract.ILoginService>();
3、Castle.ActiveRecord
配置:
<?xml version="1.0" encoding="utf-8" ?>
<activerecord> <config> <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /> <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" /> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="hibernate.connection.connection_string" value="Data Source=.;Initial Catalog=World;Integrated Security=True;" /> </config> </activerecord> 初始化:
Castle.ActiveRecord.ActiveRecordStarter.Initialize(
new Castle.ActiveRecord.Framework.Config.XmlConfigurationSource( AppDomain.CurrentDomain.BaseDirectory + "Castle.ActiveRecord.config.xml"), typeof(Souline.Basic.Entity.User)); 实体类:
namespace Souline.Basic.Entity
{ [ActiveRecord("Basic_Login_User")] public class User : ActiveRecordBase<User> { [PrimaryKey] public virtual int Id { get; set; } [Property]
public virtual string Username { get; set; } [Property]
public virtual string PasswordHash { get; set; } [Property]
public virtual string Type { get; set; } [Property]
public virtual string Status { get; set; } public static Entity.User FindByUsername(string username)
{ Entity.User[] users = FindAllByProperty("Username", username); if (users.Length == 0)
return null; else return users[0]; } } } 用法:
直接使用 Entity.User类就好了
December 19 关于AOP和IoCAOP是最近非常热门的词,全称叫作Aspect-oriented Programming,一直以来,我对这个名词的理解就是模模糊糊的。
知道最近在一个项目中,思考Log模块和Cache模块的设计的时候,才使我恍然大悟,原来AOP就是这么简单、自然的概念。
所谓的AOP就是希望程序员在编写程序的时候,能够完全关注在应用逻辑本身,而不用去考虑与逻辑本身无关的Facility的东西。我们拿那个经典的取钱的例子为例:
假设现在有一个
Account类,它保存的是用户帐户的余额:
这时,程序员关注的流程是,Deposit和Withdraw本身,诸如校验余额啦,修改余额啦什么的。 这时项目经理过来跟架构师说,我们的客户是银行,需要将所有的调用记录都保存下来备案,保证数据的安全。 但是现在的架构如果需要添加这个功能,则必须在每个方法的开头、结束等处加上日志相关的代码,但这势必造成工作量快速变大。那么AOP是如何解决这个矛盾的呢? 那么让我们回头来思考这个问题: 我们分析一下项目经理的要求是: 对所有的操作,都要记录日志,能够反映程序中的热点代码、瓶颈和发生的错误 关键就是所有和操作两个词,让我们回想一下Dynamic Proxy的功能: 拦截某类的所有方法调用,并插入执行代码 是不是刚好和我们的需求有匹配的地方呢? 经过修改的Account类变成了这个样子:
利用DynamicProxy类动态的生成一个继承自Account 类的类,并重写(override)它的所有方法,加入拦截的函数。再编写LogIntercepter类,记录所有的调用信息。 这就是AOP。我们没有修改原有的代码(基本没有,除了virtual关键字),但是却加入了某一方面(aspect)的功能。
那么我为什么要把AOP和IoC一起讲呢,因为他们之间有着密不可分的联系,我以.Net平台下的Castle库中的Windsor/MicroKernel容器为例。它提供了一个轻量级的IoC容器,提供了一种方便的方式配置组建和拦截器,基于配置的实现AOP的功能。具体的做法,我在下一篇文章中再写吧,有点晚了,去睡觉咯~ December 01 一种有关锁的设计模式今天看了一个ThreadSafeDictionary的代码,从里面看到了一个很好的使用锁的设计模式,首先从使用开始说:
public void Set(TKey key, TKey value)
{
using(new WriterLock(this._lock))
{
// do something
}
}
然后再看看WriterLock的实现:
class WriterLock : IDispose
{
private ReaderWriterLockSlim _lock;
public WriterLock(ReaderWriterLockSlim lock)
{
_lock = lock;
_lock.GetWriterLock(lock);
}
public Dispose()
{
_lock.ReleaseWriterLock(_lock);
}
}
他的作用机理是什么呢?
首先我们从using开始看,using语句中包含了一个new语句,这就调用了WriterLock中的ctor,也就是给目标加锁,而当需要保护的代码结束的时候,也就是using块之外的时候,这个新创建的对象已经不再生存期内,所以就自动调用了WriterLock中的Dispose方法。
这是非常值得借鉴的一种设计模式,在NHibernate和Castle.ActiveRecord中也有广泛的应用,比如:
using(new SessionScope())
{
// do something
}
using(new Transaction())
{
// do something
} November 24 SaaS与云计算SaaS和云计算从精神上是想通的,但是他们提供了两个不同层面的服务。
SaaS将所有的硬件和软件细节都隐藏起来,提供一个软件服务的外表。
云计算将所有的硬件都隐藏起来,提供一个基础设施的外表。 他们有着共同的特点,就是
1)都隐藏了细节
2)都提供了服务
3)都需要强大的数据中心
4)都有良好的稳定性和容错能力(至少是宣称)
但是现在做SaaS的人的观点太狭隘了,把眼光都聚集在为企业提供信息化服务,我们为什么不能
为那些为公众提供服务的企业提供服务呢?
把论坛服务化?把CMS服务化?把SNS服务化?
这是一个崭新的市场,也是一个崭新的机会 April 09 The great MVP design patternThis is the first blog entity posted from my palm treo 650. Cos my java vm doesn't support the input of Chinese, each post from my mobile phone will be in English! Ok, let us come back to the MVP. The benifit that MVP brought us: Complete split of UI presentation and UI message processor. Taking advantage of this, UI designer and back-end developer can do their work seperately. Furthermore, this makes UI unit test possible. And also, seperate part of UI, the view and the presentor, could be reused. April 07 Souline.Mvp.Framework IN PROGRESS最近有研究过MVP框架,觉得非常好,他让我第一次真正感觉到页面背后的驱动和页面分离开来,页面设计人员不必关心后台实现,后台程序员也不必做诸如“嵌入动态页面”的事情。 在网上找了一下,好像dotnet里面没有什么现成的MVP框架,于是就自己实现了一个,现在还不是很完善,等再过两天完善了,再给大家做更多的介绍吧! December 24 曾经的腾讯,你在哪里还记得当初完全不懂英语时,看到OICQ的中文界面时的兴奋。
市场运营的手段无可厚非
但是他以如此粗暴而缺乏良知的行为对待当初的“战友”实在让我汗颜。。。
那个有梦想的青年,现在的你为何会变成这样?
陈寿福可能会很快地从我们的视野中消失,从我们的记忆中消失,但是若干年以后,我们会告诉我们的孩子,曾经有一个珊瑚虫的插件,非常棒,非常好。
“那后来呢?”
我们只能摇摇头,无奈地说,那人被腾讯告了。。。。
曾经看到icq告腾讯的oicp侵权,于是腾讯起了个讨巧的名字qq,再后来icq就再也没有出现在中国的大地上
或许未来的某个时候,我们也会发现,qq已经成为一个被历史埋没的词,而腾讯也不复存在了。。。。 December 21 Souline Script Engine : Specified Functions, Class Inherit, Class Extension今天下午没有课,就乘机把昨天公布的Features做了一下,主要包含以下部分:
(1) Specified Functions
我称之为函数特例话,但是函数式编程语言中有一个更加形象(或者说更加数学)的单词来形容他:Currying,其实我们做的是一样的东西,只是语法上有所不同而已:)
下面我放出一个这个功能的一个例子:
function plus(a, b)
{
return a + b;
}
var plus_five = specific plus(5,);
plus_five(10); //This function call will return 15
(2) Class Inherit
这个没有什么好说的,无非就是传统面向对象语言中常见的继承,暂时不考虑做多集成支持。。。
(3) Class Extension
这个和C# 3.0中的Extension Method很相似,不过在Souline Script中的语法有所不同(因为W认为C#3.0中的语法实在是比较怪异啦)
在Souline Script中,W使用语法就是一个类继承自己,比如原先由一个类A,那么我只要写 class A : A { function methodXXXX() {} } 就可以给A类添加一个methodXXXX()方法。
其实从这个语法的实现上W也是这么做的,感觉上比较像A = A + methodXXXX; 呵呵:)
最后,W很荣幸地告诉大家,Souline Script的主要功能都已经实现了,接下来,W将会把它应用到一些项目中去(比如数字图像处理的Project中):)
下面W要解决的燃眉之急就是要把数字图像处理的Projects做掉(一共4个的说。。。。) December 20 Souline Script Engine : Anoymous Functions, Object-Oriented Features从昨天晚上到今天早上,我又给Souline Script Engine加入了一些新的功能,一些语法的细节也做了改进:
先说说语法的改进吧~~
现在的var已经不仅仅可以定义变量了,还可以给变量赋初值(这个貌似很简单的样子嘛。。。),比如原来必须;
var i;
i = 1;
现在可以用
var i = 1;
来代替了,也算是个语法甜头吧。
接着再说说Anoymous Functions,现在的Souline Script Engine已经支持匿名函数了,比如:
function GenericCalc(oper, num1, num2)
{
return oper(num1, num2);
}
GenericClac(function(num1, num2) { return num1 + num2; }, 5, 10);
再说说面向对象特性,Souline Script Engine已经加入了部分面向对象的特性,其实也就是支持类了,比如:
class Souline.Animals.Cat {
function SayHello() {
return "Hello, this is " + this.Name;
}
}
var cat = new Souline.Animals.Cat;
cat.Name = "Tony Huang";
cat.SayHello();
很不幸地是,函数结果的缓存功能可能暂时不会出现在Souline Script Engine中了,主要原因是算法和数据结构选择的问题,因为确实很难找到适合的算法,如果大家有什么建议的话,可以给我留言。
再说说Script Engine即将加入的Feature:
(1)特例化函数变量
这个名字听起来挺古怪的,实际上它的思想很简单,举个例子:
假设现在有一个数组,我想对里面的所有元素都加1,那么只要:
function plus(num1, num2)
{
return num1 + num2;
}
function each(numberArray, oper)
{
var keys = keys(numberArray);
var len = length(keys);
for(var i = 0; i < len; i = i + 1)
oper(numberArray, keys[i], numberArray[keys[i]]);
}
function each_process(numberArray, oper)
{
var callback_function = function(array, key, value, oper) { array[key] = oper(key, value) };
each(numberArray, specific callback_function(,,,oper));
}
each_process(numberArray, specific plus(1));
(2) 类的继承
现在的面向对象的功能,我只实现了类,还没有实现类的继承,设计的语法是这样的:
class A { function methodA() { } }
class B : A {function methodB() { } }
这样B类就既有methodA方法,也有methodB方法
(3)Extension Method
这是借鉴C# 3.0的一个设计,就是类是可以扩展的,比如:
class A { function methodA() {} }
class A : A { function methodB() {} }
这样A类就同时具有methodA和methodB了 December 14 Souline Script Engine : Collections今天第二节的课调整了时间,就干脆坐下来,开发了这个Souline Script Engine的Collections功能,放一段测试用的脚本吧(好像我酷爱计算素数嘛。。。):
function countPrime2(max)
{ var i; var j; var col; var cnt; cnt = max - 1; for(i = 2; i <= max; i = i + 1) col[i] = 1; for(i = 2; i < (sqrt(max) + 1); i = i + 1) if(col[i] == 1) for(j = i + i; j <= max; j = j + i) { if(col[j] == 1) cnt = cnt -1; col[j] = 0; } return cnt; } 前段时间,我为了要把Souline Script Engine发扬光大,把它集成到了一个无限小车的上位机控制端上, 发两张截图吧:
这是主控制界面 这是可以让用户自己编缉脚本的带语法显亮功能的编辑环境:) December 10 Souline Script Engine : EXTERNAL FUNCTIONS, LIBRARIES最近一直在自习自动控制原理,终于第1次把书看完了,这个礼拜开发Souline Script Engine的时间也比较少,说说最近的更新吧:
1) External Functions:
说白了,就是让Souline Script Engine 可以调用dotNet中的函数啦,比如我写了一个类:
public class MathLibrary
{
public static double sqrt(double num)
{
return Math.Sqrt(num);
}
}
然后让Script Engine加载这个库
scriptEngine.AppendLibrary(typeof(MathLibrary));
这样,就可以在脚本中使用这个库里面的函数了:
a = readNumber();
println("Sqrt(" + a + ") = " + sqrt(a));
2. Libraries
Library在Souline Script Engine中分为2种类型:
1) Souline Script Library
其实就是一般的Souline Script脚本,这是可以被其他的程序所引用,假设有一个Console.sslib库,其他程序想要引用它只要在程序中调用require_lib函数:
require_lib("Console");
println("Hello, world!");
2) Dot Net Library
这个和上面的External Function类似,而且也是利用上面的External Function实现的,它的主要特点是,可以通过配置文件加载到程序中。
在这里放上一个Script Engine的配置文件,大家就一目了然了:
文件Souline.Script.config清单:
<?xml version="1.0"?>
<Souline>
<Services> <Script> <Libraries> <DotNetLibrary name="ConsoleLibrary" version="1.0" assemblyName="Souline.FinanceScript.dll" className="Souline.FinanceScript.InternalLibraries.ConsoleLibrary" /> <SoulineScriptLibrary name="Console" version="1.0" fileName="console.sslib" /> </Libraries> </Script> </Services> </Souline> 下一步的开发计划:
1) 加入Collection功能
这不仅仅包括了数组,也包括了map
2) 加入Function Call Cache功能
对一些结果和输入有确定关系的函数实行缓存,以提高运算速度,通过加入新的关键字cache实现,比如:
function cache abs(num)
{
if(num < 0)
return -num;
else
return num;
}
假设第一次调用的时候使用了
b = abs(-1);
那么这个函数会被实际调用,进行计算。
当第二次调用他时,引擎就会自动从缓存的数据中读出来,避免重复计算了:) December 02 Souline Script Engine神奇的Tony Huang又重出江湖啦~~~
兜了一圈又回到了Windows Live Space(以前叫msn space来着?)
Mr. W最近在做的是一个脚本引擎,其实也就是一个类似javascript的脚本,这也是我们的Souline Server Foundation的一个组件,起初只是想着要用它做一些金融计算,现在看了ror的教学视频后,决定干脆让它更加牛X点,就改称为Souline Script吧,呵呵
现在放一些我自己测试用的脚本,让大家尝尝鲜,呵呵:
1) TestVariable
RESULT: 5 _max = 2 + 6 / 2; _max 2) TestVariable3
RESULT: 2 i = 5; j = 3; (i % j) 3) TestBreak
RESULT: 1229 i = 1; max = 10000; for(j = 3; j < max; j = j + 2) { k = 1; for(l = 2; (l * l) < (j + 1); l = l + 1) if((j % l) == 0) { k = 0; break; } if (k == 1) i = i + 1; } i 4) TestFunction3
RESULT: 1229 function isPrime(a) { var i; for(i = 2; (i * i) < (a + 1); i = i + 1) if((a % i) == 0) return 0; return 1; } function countPrime(max)
{ var count; count = 0; for(i = 2; i < (max + 1); i = i + 1) if(1 == isPrime(i)) count = count + 1; return count; } countPrime(10000);
至于这个脚本的执行效率嘛,就基本只能算是马马虎虎啦,呵呵 名词解释:
Mr. W 我打游戏的时候的id是wzhjs,于是就被称为W了。。。
April 09 互联网的第三方时代Introduction
互联网已经悄然进入了一个全新的时代,我称之为第三方时代。
Characteristics
操作通过第三方进行,保证操作两端(多端)的利益都得到保障。
Target problem
这个解决的问题主要在于现在社会上的信用体制不完善,人与人之间无法互相信任的问题。
Path to solve
通过多方共同信任的第三方进行操作,由第三方做出合理的担保与利益分配。
Samples
Paypal, Alipay
Significance
当前社会上的信用体系不完善,所以非常需要这种第三方机制的介入,以保证各方利益。第三方的角色与传统行业中的商业比较相似,与中介比较相似。但是第三方的职责更加明确,手段更加现代。他只专注与做一个中间的平台与担保,并不承担信息传递的职责,这是和中介最本质的区别之一。其二,他可以不收取费用,通过资源停留在平台上时产生的利息获得盈利。其三,平台上没有物流的过程,物流是平台用户自己需要解决的,仓储也是一样,所以平台可能成为纯粹的货币流通工具,所以相对而言,成本更加低廉,只需要非常低的利润率就可以实现盈利。
Future
现在典型的第三方模式都是支付平台,是货币的流通平台。那么有没有别的形式的平台呢?这个有待大家进一步思考。 April 08 春游印象今日得闲春游,摄得照片一二,与众分享之。
点评
西佘山 得暗语者是可以免门票地
东佘山 原来挖笋也是可以当节日地
月圆园 人工划的船是划不动地,380w是很慢地
松江新城 花园是应该免费地,是应该在家旁边地
泰晤士小镇 保安的衣服是漂亮地,保安的样貌是萎缩地,小区就应该是被花园包围地,住就是要住大宅地,大宅是很贵地,130w也可以买个175平的复式地
松闵线 做不做得到车是看人品地,我们的人品是很好地
over~
|
|
|