Pepsi Refresh Project

•Pepsi Refresh Project (PRP)
•Marketing Communications Mix
•Effective Marketing Communication
•CSR / Sweet Spot / Blue Ocean Strategy
•What Happen in the Real World
      –Market Share
      –Coca Cola Strategy


在海外建立有效率的研發能力

  • 新穎且複雜的經營挑戰,它意謂著要將研發策略與公司最高營運策略連接起來
  • 研發中心的主要目標是否在於,擴增原本母公司必須提供給國外使用的知識,建立取得新知識的管道,以及吸收國外大學和競爭者新的研究成果到自己的組織內
  • 在全世界競爭的公司必須以愈來愈快的速度,把新產品從研發推上市場
  • 成立科技導向的委員會
    • 成員都是擁有技術專業和深入的組織知識的高階經理人
  • 對新的研發據點作分類
    • 「強化母公司基地的研發據點」資訊是由外國實驗室流向母國的中心實驗室
    • 「利用母公司基地的研發據點」資訊是由母國的中心實驗室流向國外實驗室
  • 選擇研發據點的位置
    • 矽谷的知識圈誇稱,圈內專家非正式聚會次數如過江之鯽,而且高科技公司與鄰近大學,尚有更正式的交換資訊的方式,例如與史丹福大學、加州大學柏克萊分校的產業連繫計畫
    • 以往工業化國家的公司在海外設立製造廠,主要是從低廉的工資獲利,或為了避免貿易壁壘。但隨著時間發展,當許多工廠已經從事日益複雜的製造任務,就需要在其附近設立研發機構,以便把研究所得的技術迅速轉移到製造之上

在海外建立有效率的研發能力


Inside Chrome – Part 1

[Part 1]

•Chromium Application Layers
•Multi-Process Architecture
         – Overview of how the processes communicate and how optimized works
•Sandbox
        –Token / Job Object / Alternate Desktop / IL
        –Java / IE / Adobe

[Part 2]

•Message Routing
       –Control / Routed
•Sample – Video Playback Pipeline
•How GPU Accelerated and HW Render
•Why JavaScript V8 so Fast
•Inter-process Communication (IPC) Basic
      –Named Pipe / Share Memory


大数相乘

http://blog.csdn.net/hzgdiyer/article/details/6114420

我们知道计算机数据类型有int, long, char, float,double等等,还有指针是用来在内存中寻址的,在32bits系统中,指针是4个bytes(32 bit),即2的32次方等于4G,即32位的系统支持内存最大是4G,而我们目前的硬件CPU和操作系统(Win 7)支持64位寻址,也就是说指针占有8个bytes,大家想想2的64次方是多大。系统所支持的内存比4G大了很多很多很多倍,大家计算机系学习算法都知道用空间换时间,这下我们的内存足够大了,可以一下将所有的数据放入内存,提高运算效率。

64位的操作系统,C语言数据类型所占用最大8bytes(long), 范围[-2^32, 2^32-1], 最大值是:  9,223,372,036,854,775,807, 那么如果2^32乘以2^32,结果怎么样呢?如下:

Long la = 9,223,372,036,854,775,807;

Long lb = 9,223,372,036,854,775,807;

Long lresult = la * lb;

我们可以看到la * lb 结果肯定大于 2^32,我们用来存储计算结果的lresult 所占内存空间是8bytes, 根本放不下这个值,所以结算结果就会溢出。

我们可以用字符串来存储数据(任意长度的数据),即如果一个数据长度为100000,我们可以动态申请100000+1个长度char内存,即 char *p = new char[100001]; 

如下代码思路如下,我们运算的数据可以是正数(1111111),负数(-1111),也能是浮点数(-1.2222), 正数负数计算符号好说:2个运算数的符号相异或(XOR), 如果为1,计算结果就为负数。至于小数点,我们上小学时就学过了2个数相乘(1.11 * 2.22 ),步骤如下:

1.             先剔除小数点,再计算2数相乘,(111 * 222 = 24642)

2.             2个运算数的小数点位(倒数)相加 (2 + 2 = 4, 即1.11小数点位置2,  2,22小数点位置为2)

3.             相乘结果(24642) 倒数插入小数点位数之和(4)得到预算结果: 2.4642

 

整体思路如下:

1.             对输入的数据(字符串)提取 数字 + 符号 + 小数点位数,对应函数:

char *extract_string(char *sour, e_sign_type &sign, unsigned int &ndot)

2.             对提取出的 数字相乘,计算出结果;

char *mult_pos_int(char *mult1, char *mult2)

3.             对相乘结果,补上 符号 和 小数点位数

char *recover_string(char *sour, e_sign_type sign, unsigned int ndot)

 

        最后提供计算接口函数是:

char *mult_signed_num(char *mult1, char *mult2)

 

//代码如下,编译环境Visual c++ 2005,系统: windows Xp

 

#include “stdafx.h"

#include <string.h>

#include <iostream>

using namespace std;

 

enum e_sign_type

{

       ENUM_POSITIVE,      // 正数  

       ENUM_NEGATIVE,          // 负数

};

/*————————————————————————————–

Function:   2个字符串相乘

Parameter:  mult1: 乘数,mult2: 乘数

Return:     两数相乘的结果

Condition:  1. 这里假设这个数都是正整数,即不考虑小数点和负号

            2. 返回值的内存在这个函数里动态分配,注意在外部释放内存

——————————————————————————————*/

char *mult_pos_int(char *mult1, char *mult2)

{

              if  ( (NULL==mult1) && (NULL==mult2)  )

                     return NULL;

 

              unsigned int nlen1 = strlen(mult1);

              unsigned int nlen2 = strlen(mult2);

              // 本程序局限性:计算结果长度为:^32 = 4294967296,如果计算结果长度超过亿,将会溢出。

              // 不妨将类型修改为长度为bytes类型long long

              // 另外:nlen1+nlen2也可能溢出

              unsigned int nlen_r = nlen1+nlen2;  // 即数相乘的结果长度最大是乘数长度之和

              char *sz_res = new char[nlen_r+1];  // 最后还有一结束符

              if (NULL == sz_res)

              {     

                     cout << “new memory fail" << endl;

                     return NULL;

              }

              memset(sz_res, 0, nlen_r+1);

 

              char *end1 = mult1+nlen1-1;

              char *end2 = mult2+nlen2-1;

              char *end_r= sz_res+nlen_r-1;

              char *tok = end_r;

             

              int carry = 0;   // 进位

              while(mult1 <= end1)

              {

                     carry = 0;   // 进位

                     while (mult2 <= end2)

                     {

                            int tmp = (*end1-0x30) * (*end2-0x30) + carry + *end_r;

                            *end_r = tmp%10;

                            carry = tmp/10;

 

                            end_r–;

                            end2–;

                     }     

                    

                     *end_r = carry;       // high attention

 

                     end1–;

                     end2 = mult2+nlen2-1;

                     tok–;

                     end_r= tok;    // 每次运算完成后end_r后移一位

              }

 

 

              if (carry > 0)

              {

                     *sz_res = carry;   // 最高位为carry

                     char *pcur = sz_res;

                     for (unsigned int i=0; i<nlen_r; i++)   // high attention

                     {

                            *pcur += 0x30;

                            pcur++;

                     }

                     return sz_res;

              }

              else   // 最高位为,需要移位

              {

                     // 考虑到如果计算结果特别长,比如是sizeof(unsigned int),依次移位特别慢,

                     // 是否可以另外申请一块内存,用memcpy复制过去,代码如下:

                     char *sz_new = new char[nlen_r];  // 长度为nlen_r即可

                     memcpy(sz_new, sz_res+1, nlen_r);

 

                     delete []sz_res;

                     sz_res = NULL;

 

                     char *pcur = sz_new;

                     for (unsigned int i=0; i<nlen_r-1; i++)  // high attention: i<nlen_r-1

                     {

                            *pcur += 0x30;

                            pcur++;

                     }

                     return sz_new;

              }

}

 

/*————————————————————————————–

Function:   判断输入的字符串是否是浮点数

Parameter:  sz: input, s输入的字符串

Return:     0: 不是浮点数

                     其它值: 浮点数小数点所在字串的位置

Condition:  sz不为空

——————————————————————————————*/

int check_floating(char *sz)

{

       int npos = 0;

       char *end = sz + strlen(sz) – 1;

       while(sz < end)

       {

              if (‘.’ == *end)

                     return npos;

              else

                     end–;

 

              npos++;

       }

 

       return 0;

}

 

/*————————————————————————————–

Function:   从输入的字符串中提取数字信息,即剔除’-‘和’.’

Parameter:  sour:  输入的字符串

            sign: 传出的值,枚举

                     ndot:  传出的值, 0: 不是浮点数 其它值:小数点所在字符串的位置索引

Return:     剔除’-‘和’.’后的字符串

Notes:      返回的字符串内存是在这个函数内部分配的,需要在函数外部进行内存释放

——————————————————————————————*/

char *extract_string(char *sour, e_sign_type &sign, unsigned int &ndot)

{

        // 是否是负数的标示

       if (‘-‘ == *sour)

              sign = ENUM_NEGATIVE;

       else

              sign = ENUM_POSITIVE;

       // 乘数是否是浮点数的标志,ndot是小数点的位数

       ndot = check_floating(sour);     

 

       unsigned int nlen = strlen(sour);

 

       if (ENUM_NEGATIVE == sign)  // 判断是否有负号

              nlen–;

       if (ndot > 0)   // 判断是否是浮点数

              nlen–;

 

       // new memory

       char *sz_ret = new char[nlen+1];

       memset(sz_ret, 0,  nlen+1);

       char *cur = sz_ret;

       if (0 == ndot)

       {

              // 如果是负数,则’-‘号跳过

              if (ENUM_NEGATIVE == sign)

                     sour++;

              while (0 != *sour)

                     *cur++ = *sour++;

       }

       else

       {

              char *sz_inp = sour;

              if (ENUM_NEGATIVE == sign)

                     sz_inp++;

 

              while (0 != *sz_inp)

              {

                     if (‘.’ != *sz_inp)

                            *cur++ = *sz_inp++;

                     else

                            sz_inp++;

              }            

       }

 

       return sz_ret;

}

 

/*————————————————————————————–

Function:   给输入的字符串添加字符’-‘和’.’

Parameter:  sour:  输入的字符串

            sign:  传入的值,枚举

                     ndot:  传入的值, 0: 不是浮点数 其它值:小数点所在字符串的位置索引

Return:     添加’-‘和’.’后的字符串

Notes:      返回的字符串内存是在这个函数内部分配的,需要在函数外部进行内存释放

——————————————————————————————*/

char *recover_string(char *sour, e_sign_type sign, unsigned int ndot)

{

       int nlen = strlen(sour);

       if (ENUM_POSITIVE == sign)

              nlen++;     //如果是负数的话,长度加一,for ‘-‘

       if (ndot > 0)

              nlen++;    //如果浮点数的话,长度加一,for ‘.’

 

       char *sz_ret = new char[nlen+1];

       memset(sz_ret, 0, nlen+1);

 

       // 特殊情况: sour等于

       if (0 == atoi(sour))

       {

              *sz_ret = 0x30;

              return sz_ret;

       }

       else

       {

              char *ret_cur = sz_ret;

              if (ENUM_NEGATIVE == sign)

              {

                     *ret_cur = ‘-‘;

                     ret_cur++;

              }

              // 考虑小数点左边的整数

              int nlen_int = strlen(sour)-ndot;  // 整数长度

              char *sz_int = new char[nlen_int+1];

              memset(sz_int, 0, nlen_int+1);

              memcpy(sz_int, sour, nlen_int);

              if (0 == atoi(sz_int))   // 整数部分全部为

              {

                     *ret_cur = 0x30;

                     ret_cur++;

              }

              else

              {

                     int num = 0;  // 即无用的个数,比如: 00011,即num = 3

                     char *cur = sz_int;

                     while(cur < sz_int+nlen_int)

                     {

                            if (0x30 == *cur)

                            {

                                   cur++;

                                   num++;

                            }

                            else

                                   break;

                     }

 

                     memcpy(ret_cur, sour+num, nlen_int-num);

                     ret_cur += (nlen_int-num);

              }

              delete []sz_int;

              sz_int = NULL;

 

              // 考虑小数部分, ndot即为小数部分的长度

              if (ndot > 0)

              {

                     char *pdeci = sour+strlen(sour)-ndot;

                     if (0 == atoi(pdeci))

                     {//do nothing

                     }

                     else

                     {

                            // 处理小数点

                            *ret_cur = ‘.’;

                            ret_cur++;

 

                            int num = 0; // 小数位无效的个数,比如:.11000,即num为

                            char *end = sour+strlen(sour)-1;

                            while (pdeci < end)

                            {

                                   if (0x30 == *end)

                                   {

                                          end–;

                                          num++;

                                   }

                                   else

                                          break;

                            }

 

                            memcpy(ret_cur, pdeci, ndot-num);

                     }

                     }

              }

 

              return sz_ret;

       }

 

/*————————————————————————————–

Function:   2个字符串相乘

Parameter:  mult1: 乘数,mult2: 乘数

Return:     两数相乘的结果

Condition:  1. 这个数可以是有符号的,也可以是浮点数

            2. 返回值的内存在这个函数里动态分配,注意在外部释放内存

——————————————————————————————*/

char *mult_signed_num(char *mult1, char *mult2)

{

       if  ((NULL==mult1) && (NULL==mult2))

              return NULL;

 

       e_sign_type sign1 = ENUM_POSITIVE;     // 乘数是否是负数的标示

       e_sign_type sign2 = ENUM_POSITIVE;

       unsigned int ndot1 = 0;      // 乘数是否是浮点数的标志,ndot是小数点的位数

       unsigned int ndot2 = 0;

 

       char *sz_para1 = extract_string(mult1, sign1, ndot1);

       char *sz_para2 = extract_string(mult2, sign2, ndot2);    

       char *sz_res = mult_pos_int(sz_para1, sz_para2);

 

       if (NULL != sz_para1)

       {

              delete []sz_para1;

              sz_para1 = NULL;

       }

       if (NULL != sz_para2)

       {

              delete []sz_para2;

              sz_para2 = NULL;

       }

 

       char *sz_val = recover_string( sz_res,

                                                           (sign1==sign2) ? ENUM_POSITIVE : ENUM_NEGATIVE,

                                                           ndot1+ndot2);

 

       if (NULL != sz_res)

       {

              delete []sz_res;

              sz_res = NULL;

       }

 

       return sz_val;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

              char sz1[256] = {0};

              cout << “pls enter num1″ << endl;

              cin >> sz1;

 

              char sz2[256] = {0};

              cout << “pls enter num2″ << endl;

              cin >> sz2;

 

              char *sz_res = mult_signed_num(sz1, sz2);

              cout << “num1 * num2 = " << endl;

              cout << sz_res << endl;

              if (NULL != sz_res)

              {

                     delete sz_res;

                     sz_res = NULL;

              }

      

              return 0;

}


報酬遞增與新的商業世界

報酬遞減/報酬遞增

  • 在市場中領先的產品或公司,最終都會遇到極限,因此產品價格與市場佔有率會達到一種可以預瀾的平衡狀態
  • 由大宗原料的生產轉變為科技的設計與運用。由資源加工變成資訊加工,由應用能源變成應用理念
  • 報酬遞增是一種趨勢,讓領先者繼續領先,而落後者更加落後。報酬遞增所衍生的不是平衡狀態,而是不穩定性
  • 報酬遞增不只讓產品變成業界標準,而且讓企業以不同的方式營運。在所有的產業中,報酬遞增與報酬遞減的機制是同時存在。但是大體而言,報酬遞減在傳統的經濟型態(加工業)中居於主導地位。而在較新的經濟型態(即以知識為基礎的產業)中,則是報酬遞增躍居主流

兩個商業世界

  • 大量生產貨物與將知識打造成商品的世界
  • 在大規模加工的產業中,通常最後會出現一套標準價格。因此競爭意謂著保持商品流通、嘗試改良品質、降低成本。它偏好沒有驚奇或意外狀況的環境。環境的特徵是控制與計畫。偏好老闆和員工的階層組織
  • 以知識為基礎的產業,贏家幾近通吃的市場裡競爭,那麼管理必須重新定義為:尋找下一個技術贏家,「下一個暢銷產品」。管理不再是生產導向而是任務導向;階層扁平化不是因為民主制度突然施恩於勞工階層,而是因為電腦可以削減許多中間管理階層,員工必須像突擊隊一樣分成小組,直接向執行長或董事會報告。這些人需要充份授權,公司未來能否存活端賴他們。所以這些人,以及他們的「突擊隊」成員,不能被視為僱員,而要被視為讓公司成功的企業夥伴

報酬遞增競爭風格更像賭博

  • 可以把高科技業的要角想像成在大賭場裡勾心鬥角的賭客。這張桌上的遊戲是多媒體,而另一張桌上的遊戲是網路服務業,角落裡的是電子銀行;這樣的賭桌不勝枚舉,你挑一張坐下來,問說要賭多少?莊家回答:三十億 · 有誰要下場?要等他們現身才會知道。規則是什麼?賭局揭曉時自然明白。賭贏的機率有多少?很難說。你還想玩嗎?
  • 以這種方式來競爭的高科技業,不適合膽小溫馴的人。事實上,在科技賭場爭勝負的訣竅主要是心理因素。至於技術專業、雄厚的資本、意志力與勇氣,也有某種程度的重要性

最重要的是,在新遊戲從科技迷霧中現身時,最先瞭解其意義、看清其形態的賭客,才能夠滿載而歸

經理人的省思

  • 馬歇爾的世界特色在計畫控制與階層組織;它是個物資、加工及最適化的世界。報酬遞增的世界其特徵在於觀察、定位、任務、團隊與精明;是個心理、認知與調適的世界
  • 一、我了解市場的回饋方式嗎?
  • 二、我是在哪個生態系中?
  • 三、我有資源可以賭嗎,得有幾種條件?
  • 四、接下來的賭局是什麼?

報酬遞增與新的商業世界