Salesforce之烦恼:如何打破外企入华魔咒
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Salesforce之烦恼:如何打破外企入华魔咒相关的知识,希望对你有一定的参考价值。
修炼入华路Salesforce尴尬连连早在2003年,Salesforce便设立了亚太区市场,其中便涵盖了中国市场;2004年,Salesforce在中国开展业务;2005年,推出CRM中文版;2006年,在中国设立办事处,同年10月,Salesforce在香港成立大中华区办事处;次年4月,其面向中国市场推出低价和“先试后买”策略。中文版的推出和系列措施的出台,并未能让Salesforce赢得任何应有的掌声,相反屡次碰壁使得Salesforce处境更加窘迫,Salesforce水土不服的现象仍然严峻。
究其根源,首先,Salesforce在“随需而变”上功能超级强大,在这个方面是任何一家企业应用系统无法比拟的,但其复杂的学习过程和高昂的培训费用最终使得Salesforce“随需而变”超级优势变成了其在中国迅速推广的最大绊脚石。其次,销售策略的不当和费用标准过高等一系列不符合中国市场实情也是导致其窘境的重要因素,更是其市场业绩平平的关键所在。
由此可见,Salesforce的水土不服,缘于其对中国市场的不了解和对中国用户习惯的漫不经心。在此情形下,再加上用友、八百客、金蝶等本土SaaS企业的强力阻击,Salesforce的烦恼也就不足为怪了。
另辟新径Salesforce借投资破魔咒
回顾历史,国外企业入华在中国互联网的舞台上几乎从未成功过。eBay敌不过阿里巴巴、MSN根本无法与QQ抗衡、谷歌最终还是在百度的送别声中退出了中国内地、Salesforce的道路也是遍地荆棘。
但这并不能意味着外企在华已经身处绝境,正所谓,车道山前必有路。如谷歌就曾以投资百度作为手段,以借此进入中国互联网搜索市场,雅虎也因投资阿里巴巴大赚。事实证明,没有过不去的火焰山,事情总有解决的办法。也许正是看到这一点,Salesforce则选择了以投资八百客作为自己破咒的法宝。虽然此法结果还不可知,但有一点可以肯定,即随着云计算的兴起,SaaS产业势必随势而起,届时也许Salesforce也能分得一杯羹。
此外,Salesforce入华已有多年,却迟迟未取得一席之地,此番入股八百客,则被业内看做其救市之举。 参考技术A Saleforce作为目前世界上当之无愧的SaaS服务老大,在CRM行业具有举足轻重的地位。当前,全球有150,000多家公司正使用 Salesforce,说巨无霸也没有问题。
现在国内巨头阿里巴巴和国外巨头Saleforce联手进入中国市场,如果说对国内厂商或整个CRM产业发展没有影响,无疑是自欺欺人。这两个巨头联手,国内一部分高端市场势必被纳入囊中,想必国内这些主打高端的CRM厂商,最近应该睡不好了。
但是中国的SaaS服务市场,特别是CRM行业,有一个很明显的特征就是市场碎片化。从业务特点看,国内各个企业的CRM需求各异,不像欧美公司那样注重合规,注重统一的服务标准,往往把自己的一些“个性化”的需求,当着是企业的“核心竞争力”,并不惜要求CRM厂商定制化来匹配这些特殊的流程。
因此,国内的SaaS服务之路应该说刚刚开始,有一些传统的SaaS厂商甚至被大量的定制需求,逼得开始搞PaaS,搞系统生态,就是为了解决SaaS服务中定制难的问题。
所以后续Saleforce+阿里巴巴如何解决中国特色的CRM需求,还要拭目以待,当然不排除Saleforce也通过强大的技术和市场能力,也走PaaS的路线。
总之,当年的Saleforce,也是在Oracle,Peopelsoft等巨头的阴影下成长起来的,垄断可能会有很大的杀伤,但是也总会有缝隙透过阳光,做好自己的产品和服务,把客户的基本盘做好,才是国内广大CRM厂商,需要认真做好的事情
命运之轮的烦恼
【中文标题】命运之轮的烦恼【英文标题】:Troubles with wheel of fortune 【发布时间】:2022-01-18 16:07:02 【问题描述】:我从这里使用 Roco K. Bullian 的命运之轮: how to draw a wheel of fortune?
这是我第一次接触js和canvas,有两个问题。
首先: 旋转后如何获得价值?我尝试为此使用 setTimeout,但我只是不明白它什么时候停止。
第二: 我想在标签中添加长句,但它们超出了界限。
我尝试过使用灵活的字体,但这并没有真正奏效,也不是我所需要的。我需要每个块内的文本移动到新行并在超出范围时减小字体。
所有这些都可以在这段代码中实现吗,还是我需要从头开始编写所有内容?
代码
Js:
const sectors = [
color:"#f82", label:"Stack",
color:"#0bf", label:"10",
color:"#fb0", label:"200",
color:"#0fb", label:"50",
color:"#b0f", label:"100",
color:"#f0b", label:"5",
color:"#bf0", label:"500",
];
const rand = (m, M) => Math.random() * (M - m) + m;
const tot = sectors.length;
const EL_spin = document.querySelector("#spin");
const ctx = document.querySelector("#wheel").getContext('2d');
const dia = ctx.canvas.width;
const rad = dia / 2;
const PI = Math.PI;
const TAU = 2 * PI;
const arc = TAU / sectors.length;
const friction = 0.991; // 0.995=soft, 0.99=mid, 0.98=hard
let angVel = 0; // Angular velocity
let ang = 0; // Angle in radians
const getIndex = () => Math.floor(tot - ang / TAU * tot) % tot;
function drawSector(sector, i)
const ang = arc * i;
ctx.save();
// COLOR
ctx.beginPath();
ctx.fillStyle = sector.color;
ctx.moveTo(rad, rad);
ctx.arc(rad, rad, rad, ang, ang + arc);
ctx.lineTo(rad, rad);
ctx.fill();
// TEXT
ctx.translate(rad, rad);
ctx.rotate(ang + arc / 2);
ctx.textAlign = "right";
ctx.fillStyle = "#fff";
ctx.font = "bold 30px sans-serif";
ctx.fillText(sector.label, rad - 10, 10);
//
ctx.restore();
;
function rotate()
const sector = sectors[getIndex()];
ctx.canvas.style.transform = `rotate($ang - PI / 2rad)`;
EL_spin.textContent = !angVel ? "SPIN" : sector.label;
EL_spin.style.background = sector.color;
function frame()
if (!angVel) return;
angVel *= friction; // Decrement velocity by friction
if (angVel < 0.002) angVel = 0; // Bring to stop
ang += angVel; // Update angle
ang %= TAU; // Normalize angle
rotate();
function engine()
frame();
requestAnimationFrame(engine)
// INIT
sectors.forEach(drawSector);
rotate(); // Initial rotation
engine(); // Start engine
EL_spin.addEventListener("click", () =>
if (!angVel) angVel = rand(0.25, 0.35);
);
CSS:
#wheelOfFortune
display: inline-block;
position: relative;
overflow: hidden;
#wheel
display: block;
#spin
font: 1.5em/0 sans-serif;
user-select: none;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 50%;
left: 50%;
width: 30%;
height: 30%;
margin: -15%;
background: #fff;
color: #fff;
box-shadow: 0 0 0 8px currentColor, 0 0px 15px 5px rgba(0, 0, 0, 0.6);
border-radius: 50%;
transition: 0.8s;
#spin::after
content: "";
position: absolute;
top: -17px;
border: 10px solid transparent;
border-bottom-color: currentColor;
border-top: none;
【问题讨论】:
对于第一个问题,您需要等到angVel
命中0,然后使用getIndex
函数获取索引。然后可以在sectors
数组上使用索引来查找标签。
@Stanislas 试过了,但没用,警报立即触发扇区。forEach(drawSector);旋转();引擎();事件监听器(); getStringValue() if (angVel === 0) let node = document.getElementById('spin').innerHTML;警报(节点)
【参考方案1】:
注意
我将只回答您的第一个问题,因为您在画布上调整字体大小的第二个问题本身就是一个很大的话题,值得提出自己的问题(尽管我确信它已经之前在 *** 上回答过)。
旋转后如何获取值
第一:旋转后如何获取值?我尝试为此使用 setTimeout,但我只是不明白它什么时候停止。
正如我在评论中所建议的,您需要做的就是检查在最后一帧更新期间车轮是否停止旋转。
我在下面包含了完成此操作的 sn-p,但请注意,我只更改了以下内容:
-
在
frame
函数的开头,我现在设置了一个isSpinning
变量。
在同一个frame
函数的末尾,我使用这个isSpinning
变量和当前速度来确定车轮是否刚刚停止。如果有,我将调用一个新的 finishedSpinning
函数。
在这个新的finishedSpinning
函数中,我使用现有的sectors
数组和getIndex
来查找活动扇区。例如,我随后会使用标签发出警报,但您可以将其替换为您需要的任何内容。
我希望这会有所帮助! ?
const sectors = [
color:"#f82", label:"Stack",
color:"#0bf", label:"10",
color:"#fb0", label:"200",
color:"#0fb", label:"50",
color:"#b0f", label:"100",
color:"#f0b", label:"5",
color:"#bf0", label:"500",
];
const rand = (m, M) => Math.random() * (M - m) + m;
const tot = sectors.length;
const EL_spin = document.querySelector("#spin");
const ctx = document.querySelector("#wheel").getContext('2d');
const dia = ctx.canvas.width;
const rad = dia / 2;
const PI = Math.PI;
const TAU = 2 * PI;
const arc = TAU / sectors.length;
const friction = 0.991; // 0.995=soft, 0.99=mid, 0.98=hard
let angVel = 0; // Angular velocity
let ang = 0; // Angle in radians
const getIndex = () => Math.floor(tot - ang / TAU * tot) % tot;
function drawSector(sector, i)
const ang = arc * i;
ctx.save();
// COLOR
ctx.beginPath();
ctx.fillStyle = sector.color;
ctx.moveTo(rad, rad);
ctx.arc(rad, rad, rad, ang, ang + arc);
ctx.lineTo(rad, rad);
ctx.fill();
// TEXT
ctx.translate(rad, rad);
ctx.rotate(ang + arc / 2);
ctx.textAlign = "right";
ctx.fillStyle = "#fff";
ctx.font = "bold 30px sans-serif";
ctx.fillText(sector.label, rad - 10, 10);
//
ctx.restore();
;
function rotate()
const sector = sectors[getIndex()];
ctx.canvas.style.transform = `rotate($ang - PI / 2rad)`;
EL_spin.textContent = !angVel ? "SPIN" : sector.label;
EL_spin.style.background = sector.color;
function finishedSpinning() // Called when the wheel stops spinning
const sector = sectors[getIndex()];
alert(sector.label);
function frame()
if (!angVel) return;
const isSpinning = angVel > 0; // Check if the wheel is currently spinning
angVel *= friction; // Decrement velocity by friction
if (angVel < 0.002) angVel = 0; // Bring to stop
ang += angVel; // Update angle
ang %= TAU; // Normalize angle
rotate();
if (isSpinning && angVel === 0) // If the wheel was spinning, but isn't anymore, it has just stopped
finishedSpinning();
function engine()
frame();
requestAnimationFrame(engine)
// INIT
sectors.forEach(drawSector);
rotate(); // Initial rotation
engine(); // Start engine
EL_spin.addEventListener("click", () =>
if (!angVel) angVel = rand(0.25, 0.35);
);
#wheelOfFortune
display: inline-block;
position: relative;
overflow: hidden;
#wheel
display: block;
#spin
font: 1.5em/0 sans-serif;
user-select: none;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 50%;
left: 50%;
width: 30%;
height: 30%;
margin: -15%;
background: #fff;
color: #fff;
box-shadow: 0 0 0 8px currentColor, 0 0px 15px 5px rgba(0, 0, 0, 0.6);
border-radius: 50%;
transition: 0.8s;
#spin::after
content: "";
position: absolute;
top: -17px;
border: 10px solid transparent;
border-bottom-color: currentColor;
border-top: none;
<div id="wheelOfFortune">
<canvas id="wheel" ></canvas>
<div id="spin">SPIN</div>
</div>
【讨论】:
抱歉,回复晚了,但它有效,非常感谢!以上是关于Salesforce之烦恼:如何打破外企入华魔咒的主要内容,如果未能解决你的问题,请参考以下文章
IT = 加班多?外国小哥打破“魔咒”:“每天工作 10 分钟,工资近 9 万美元!”...
IT = 加班多?外国小哥打破“魔咒”:“每天工作 10 分钟,工资近 9 万美元!”...
Android程序员心酸历程:毕业3年换了4份工作实在看不到未来,我不知道要提高层级才能打破“魔咒”吗?但哪有那么容易!
Android程序员心酸历程:毕业3年换了4份工作实在看不到未来,我不知道要提高层级才能打破“魔咒”吗?但哪有那么容易!