方舟进化

没想到什么好标题,就这样记一下吧。

最近玩这个游戏,真是费牛劲了。

曾经下载过一个体积不大的荒岛生存游戏,画风和这个几乎一模一样。

这次这个,真是个大型游戏,而且还是网游,不过我就懒得搞连机大逃杀了,单机比较简单。

这游戏比较谋杀时间,跟所有需要升级以及经营的游戏一样。

养过并且死过至少5只碳龟。

作弊过,作弊完还是想正常玩一下。

不想按一般的路子去玩,老想着盖一些奇怪的房子。或者把房子盖成跨海木桥,又想着把帆船做成跨海浮桥。

后来因为养了翼龙,这些都变成了烂尾工程。

不过把船做成了好几层的楼船,想来也是我独一份。

把精炼炉和工作台放在船的三层楼上,也算是远见,麻烦是麻烦,但是把家安在船上,就可以无忧无虑的去远方采矿,不必来来去去了。

不过可惜的是,第二次远程就放弃了船,因为船上不能种地(无法灌溉,也是醉了,周围全是水,游戏也没分淡水海水,却不让我灌溉,非要搞水管)。

为了找水晶,不得已按攻略跑到极北的小岛,野兽多到不得不做弊,最后还是不小心死于非命,还把装备丢光了。捡了只老鹰从头再来。

这次一定要把船上种地的事情研究清楚,放水池不行吗?

关于提成

当前的设计分析

目前预期有三种方式:一是按百分比,多人百分比之和不能超过100%;二是按份额;三是按单人按百分比,多人按份额。实际上选择的是按份额。

所谓多人份额提成,以如下两种case可说明:

1、单人提成时,即使当前员工职位提成比例为60%,其提成额是总提成额100%。

2、多人提成时,两个职位提成比例同为60%的员工加上一个职位提成比例为30%的员工在一起提成,则前者中的一个提成金额=60%/(60%+60%+30%)变成20%了。

这种算法的好处是,无论是单人还是多人,其提成都可以达到一个表面的公平。操作起来也比较灵活。

坏处是,根本不切实际,现在我们这样做,实际上也是因为当时我们并没有想清楚。

因为我们有一个预设的前提,就是按业务设定提成总额的计算方法,所谓计算方法,也就是是按整单金额百分比提成,还是按各商品提成额进行合计。

然而这个设定只能解决一个业务增长模式选择的问题。也就是说,一个服务业的企业他是按收入分钱,还是按服务分钱,企业必须搞清楚本企业目前阶段的业务增长模式:是销售业绩导向,还是工作量导向。按照哪种方式理解自己的业务,就按哪种方式选择提成。实际上这是一个静态稳定的方案。

某客户的真实需求

现在企业的实际需求是:按照员工身份进行提成。

一个外籍教练他的提成就是比国产教练的提成高。一个技术总监比一个初入门的理发师就是要贵。这里反映的是用工价格歧视,也是市场需求。

客户就要这个东西。

当只有一个人提成的时候,外籍教练提成600,国产教练提成就只有500。他要的就是这个东西。

(我感觉这个案例在服务业中极可能具有最大的代表性,在零售业中不确定。所以说一句题外话,我们的核心问题还在在于产品定位、目标客户群的定位。现在天天想着借鉴别人,想着靠学习解决产品设计问题,其实是缘木求鱼、本末倒置。如果用佛家的表达方式来断喝的话,我得说:产品设计根本没有问题可谈。)

 

复杂情况的分析

现在我们通过单人提成的案例理解了客户的需求。

那么扩展到多人的情况下,合理的分配是怎样的呢?

首先,当外籍教练和国产教练一起来参加提成,总提成额是600还是500还是1100呢?

现实情况应该是,这一单一个人提能提到600最高,那么多人提,必定也是600最高,因为成本和利润摆在那里。要么你老外能一个人把活干了,否则你让另外一个人来帮你,你就只能把你的提成分给他,而不能让企业另掏一笔钱出来。本质就是这样。也就是说1100是错误的总提成额。

所以在这个教练提成的案例中,总提成额已经不能按原来我们设计的方式去设定,因为总提成额是由参与提成的人来动态决定的!但同时还要考虑到实际利润的限制。

但是仔细想想,600合理还是500合理?

显然还是600合理,为什么呢?因为假定国产教练是由外籍教练拉入这个服务项目中来的,企业并不知情,那么企业只能给外籍教练提成600,如果企业非要压低提成总额,那么外籍教练可以选择不告知企业(换句话他实际上是转包方、二房东、雇佣中国程序员的美国程序员),或者选择跳槽。当然,这是用博弈论来推演,实际上更合理的方案是让企业选择,但企业选择就比较麻烦了。当企业每次都需要手动来企业这些东西的时候,整个提成设置的意义就不大了,财务人员完全可以将消费记录导出重新计算提成。

言归正传,简单的方式当然是默认按提成比例最高的人来设定总提成额。那么问题又来了,如果我们推翻之前按业务模式来选择提成方式,现在用所谓的职位提成比例到底该如何决定总提成额呢?这里所谓600块只是一个比方,实际的计算显然还是要考虑到订单总额或者利润才能确定真实的提成金额。

我们仔细审视该客户的需求,在他的心目中,某项服务或者课程的总利润是确定的,员工提成比例实际上是针对这个总利润设定的。所以无论我们系统改成什么样,他在使用的过程中,只要能把这个总利润定下来,剩下的事就好办了。按照现有的设计,他应该是选择按商品固定提成额之和来计算订单总提成额,这里的总提成额实际上相当于总利润,也就是说所有的提成都在总利润中去分,理论上所有员工提成之和无论如何也不能等于总利润。

换言之,客户会把一单的总利润设定成现在的静态总提成额(实际产品文案或许可以叫作提成预算)。然后系统按照职位提成比例最高的那个人来自动设定真实总提成额。

例如一单收2000元,利润1000元,洋教练60%提成比例,则总提成额为600元。

那么在600的总盘子下,该怎么分配?

显而易见的方式是600*60%/(60%+50%),因为无论洋教练在此服务中的地位如何,他们都必须正视企业设定的规则,企业认为你只能比国产教练贵多少,你就只能贵多少。当然,这是理论上的模型,实际情况不符的话只能是交由客户自己手动调整。

结论

总结一下,最好的改造方案是:

1、将现有的提成总额改为“提成预算”;

2、保留现有的职位提成比例设置功能;

3、实际提成计算方法改成:

实际提成总额=提成预算*max(所有参与提成员工的职位提成比例)

员工提成额=实际提成总额*该员工职位提成比例/sum(所有参与提成员工的职位提成比例)

注:max表示求最大值,sum表示求和。

 

深度反思

上面说的提成,实际上还只是覆盖一种情况:就是一次消费/订单中只包含一种服务的情况,也就是说造成多人提成的原因是因为一种服务一个人没做完引入了第二个人,比如说一学期的课,外籍教练教了半学期,后半学期让国产教练代课。

如果一次消费/一个订单中包含多种服务,也就是说本身就是多种服务对应多个工种(工种和职位、阶层是两回事),比如剪头的理发师不负责洗头,所以必须让洗头小工来分钱。这种情况下,本文设计的提成功能可能是没用的。

 

后记

2016-04-26

其实还是应该按我最开始想的方案:

1、设置方面,职位+商品分类,来确定每一个职位在每一个具体的商品上的分成比例。(解决洗剪吹时洗提洗的、剪提剪的、吹提吹的问题)

2、业务操作时,允许选择是按全部预算提成,还是按最高比例提成。也即100块预算,可以全部拿来分,也可以用外国教练的提成比例60%来分。

对于思维辅助工具,我还是念念不忘

相信有不少人和我一样,认为创意还是有可能量产的。

因为多数情况下,当我们明确需要创意的时候。

实际上我们面对的是一个有明确定义的问题。

比如我们要做一个活动,来提升网站的注册量。

注意,我们是要提升网站的注册量,而不是提升访问量或者其他。

而且,这背后隐含的要求是,有效注册量。

当我们明确这些,我们就大概知道活动有哪些路子可以选。

我们必然只能找有更大概率接触到用户活动方案,如果有一种活动方案叫我们去一个没有用户地方瞎折腾,这个方案就连创意都不能算了。(当然有些“亮点”可以借鉴,然而这些“亮点”不必借助于特定的方案闪现)

这时,针对这个问题的所谓“创意”就是可量产的。

代替人类思考有定义问题的机器现在已经出现了,比如下围棋,事实上可以应用到很多领域,相信不久也可以应用到思考一些定义模糊的问题上,当然,这时起到作用其实是辅助。

因为让机器去完成定义问题本身的任务,现阶段是很难的,深度学习能让机器从无数张图片中自己学会“猫”的概念,但是一个问题的定义,涉及到太多的“猫”,最后要达到一个令人类满意的程度,目前的计算力或许是个问题。

所以合理利用计算机的办法,应该还是开发一些辅助人类思考的工具,目前无论是生活还是工业生产,机器只是辅助人类完成一些机械操作和运算,但机械的运算和创意之间的距离有一光年吗?也许没有。

我以为,下一个十年,必定一定肯定会有大量辅助人类思考的工具出现。

我需要的,不是一个思维导图软件,而是一个灵光频现的提词器,这个东西在我的脑子里盘旋了很多年。也许哪天,就有人把它做出来了。原理无非还是概率,仅此而已。

也许,只有所谓“创意”的部分,机器可以成为我们的拐杖,而需要定义问题的时候,机器也只是以“创意拐杖”的身份出现,它一时半会儿不能代替我们定义问题,既然速度不够快,那么还不如我们自己来做。

事实上,在开会的时候,总有人要负责定义问题,而其他一些人,只能做创意拐杖,剩下的一些,则连创意拐杖都做不了。这并不是说谁比谁聪明,说白了,不过是碰巧有些人想过思维的本质问题,有些人想过业务本身的问题,有些人则什么也没想过,他们的大脑远离的问题核心圈罢了。

讨论问题你不能比别人快太多

有时候你知道自己知道了,但别人不知道你知道了。

既然你告诉他你知道了,他还是认为你不知道。

你已经准备讨论下一个重要环节,但他们还停留在上面一个问题,向你解释,再解释。然后你说的话全部被他曲解。

很多人会以为自己难以理解的东西,别人也难以理解,很多你觉得不重要的事,有的人非常在意。在这种情况下,你没办法提高讨论速度。

不过这并不代表谁比谁聪明,大部分沟通的问题都出在观念上。不是你我不懂,而是你我不通。

另外,大部分人不习惯一边思考一边高密度精确表达。

所以合理的态度是什么呢?

认真把当前问题终结了,再开启下一个问题。

还是用perl来替换sed\grep吧

为了这个问题我折腾了一晚上。

事情是这样的,由于使用了mycat,所有多表联合查询在我们的数据库里都是没用的。

为了实现 select * from xxx where xxx in(1,2,3)这样的效果,我必须想办法把前一个查询的结果存为一个linux变量,由于我不知道怎样格式化查询结果,就想到用grep sed之类的工具来做。但是很可惜,sed支持的正则语法是令人无语的,还是perl最强大。

于是我开始各种搜索,但一切的说明都在讲怎样处理文件,最后还是IBM靠谱,虽然如下文章更像是机器翻译的结果,但解决了别人不说的大问题。

http://www.ibm.com/developerworks/cn/linux/sdk/perl/l-p101/index.html

总之就是Perl是可以接受管道命令作为输入的。

[heyuheng@pos-log ~]$ aa=’5 4 3 2′
[heyuheng@pos-log ~]$ echo $aa|perl -pe ‘s/\s/,/g’
5,4,3,2,[heyuheng@pos-log ~]$

 

 

这件事非常蛋疼。

当我写完一个类似 dd=”select * from xx where aa in(`echo $cc`)”的语句后,发现再echo $dd时,星号被替换成了当前目录下的文件列表!

我用set命令查看变量的时候,却发现值中的星号还是星号。

后来上网一查,原来echo时要避免这种情况必须在变量上套上引号,也就是echo “$dd”这种写法不会出问题。

17/12/10

补充一个s///操作符的说明。

正则表达式在Linux各命令中的区别

正则表达式虽好,但是不同环境不同工具对它的支持差异还是挺大的。
找了一个列表,方便速查。

grep 2.5.1 egrep 2.5.1 sed 3.02
sed 4.07
awk 3.1.1 perl 5.8.0 vim 6.1 JavaScript ??
转义 \ \ \ \ \ \ \
行头 ^ ^ ^ ^ ^ ^ ^
行尾 $ $ $ $ $ $ $
n个 {n} {m,n} {m,} {,n} \{n\} {n} \{n\} {n}或\{n\} 仅定义 –posix 或 –re-interval有效(要表达}和{,得用\\{和\\} 没有定义–posix或–re-interval时,不能用{n}的语法, \}\{和}{同义 {n} \{n\} {n}
{0,} * * * *或\*, (要表达*,得用\\*) * * *
{1,} \+ + \+ +或\+, (要表达+, 得用\\+) + \+ +
{0,1} \? ? \? ?或\?, (要表达?, 得用\\?) ? \? ?
任意字符 . . . . 含\n. . /s修饰后则含\n . 除\n . 除\n
(pat) 匹配并获结果 \(pat\) (pat) \(pat\) (pat)或\(pat\) (要表达括号,用\\( \\) ) (pat) \(pat\) (pat)
(?:pat) 匹配但不获结果 不支持 不支持 不支持 不支持 (?:pat) 不支持 (?:pat)
(?=pat) 等于预查 不支持 不支持 不支持 不支持 (?=pat) 不支持 (?=pat)
(?!pat) 不等预查 不支持 不支持 不支持 不支持 (?!pat) 不支持 (?!pat)
| 或 \| | \| |或\| (要表达|,得用\\|) | \| |
其中任意字符 [xyz] [xyz] [xyz] [xyz] [xyz] [xyz] [xyz]
[.ch.] [=ch=] 不支持 不支持 [.ch.] 不支持 不支持 不支持 不支持
单词边界 \b \b \b \b 不支持 \b 不支持 \b
非单词边界 \B \B \B \B 不支持 \B 不支持 \B
单词左右边界 <> \< \> \< \> \< \> 不支持 (><和\>\<和\\>\\<同义 不支持(><和\>\<同义 \< \> 不支持(><和\>\<同义
控制字符 /cx 不支持 不支持 \cx 不支持 \cx 不支持 \cx
数字\d 不支持 不支持 不支持 不支持 \d \d \d
非数字\D 不支持 不支持 不支持 不支持 \D \D \D
换页 \f 不支持 不支持 高版本支持 \f \f 另义 \f表示文件名字符 \f
换行 \n 不支持 不支持 不支持 \n \n \n \n
回车 \r 不支持 不支持 \r \r \r \r \r
空白 \s 不支持 不支持 不支持 不支持 \s \s \s
非空白 \S 不支持 不支持 不支持 不支持 \S \S \S
制表符 \t 不支持 不支持 高版本支持 \t \t \t \t
垂直制表符 \v 不支持 不支持 高版本支持 \v \v 另义 \v表示very magic \v
单词字符 \w [A-Za-z0-9_] \w \w \w 不支持 \w \w \w
非单词字符 \W [^A-Za-z0-9] \W \W \W 不支持 \W \W \W
\xn 16进制 不支持 不支持 高版本支持 \xn \xn 另义 \x表示[0-9A-Za-z] \xn
\n 八进制 不支持 不支持 不支持 \n \n 不支持 \n
\n 后向引用 \n \n \n \n 仅取结果可用 \n \n 仅取结果可用 \n
[:alnum:] 字母和数字 [:alnum:] [:alnum:] [:alnum:] [:alnum:] [:alnum:] [:alnum:] 不支持
[:alpha:] 字母 [:alpha:] [:alpha:] [:alpha:] [:alpha:] [:alpha:] [:alpha:] 不支持
[:cntrl:] 控制字符 [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:] 不支持
[:digit:] 数字 [:digit:] [:digit:] [:digit:] [:digit:] [:digit:] [:digit:] 不支持
[:graph:] 可打印字符(不含空格) [:graph:] [:graph:] [:graph:] [:graph:] [:graph:] [:graph:] 不支持
[:lower:] 小写 [:lower:] [:lower:] [:lower:] [:lower:] [:lower:] [:lower:] 不支持
[:print:] 可打印字符(含空格) [:print:] [:print:] [:print:] [:print:] [:print:] [:print:] 不支持
[:punct:] 标点 [:punct:] [:punct:] [:punct:] [:punct:] [:punct:] [:punct:] 不支持
[:space:] 空格 [:space:] [:space:] [:space:] [:space:] [:space:] [:space:] 不支持
[:upper:] 大写字母 [:upper:] [:upper:] [:upper:] [:upper:] [:upper:] [:upper:] 不支持
[:xdigit:] 16进制数字 [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:] 不支持
[:return:] 不支持 不支持 不支持 不支持 不支持 [:return:] 不支持
[:tab:] 不支持 不支持 不支持 不支持 不支持 [:tab:] 不支持
[:escape:] 不支持 不支持 不支持 不支持 不支持 [:escape:] 不支持
[:backspace:] 不支持 不支持 不支持 不支持 不支持 [:backspace:] 不支持

linux的grep默认是不支持perl正则表达式的

搞半天。
linux的grep默认是不支持perl正则表达式的。
我写的\d+之类的都没反应。
所以要加一个-P的参数,注意P是大写。
比如下面这样
|grep -P ‘\d{2,3}’
(上例是用管道把要查找的内容带过来,不然后面还应该有要查找的文件啥的)
之前我看到网上的说明说大刮号在bash里有特殊作用,因此要在它前面加上转义符(\)”。
但很显然,加了P之后,不用再搞这种了。
#######次日补充#######
P不是哪儿都支持,安卓里就没有这个开关,数字可以写成[0~9]
另外,安卓不像centos,里面的大刮号当真是要写斜杠才能用的,或许我在centos里用了P开关所以可以直接用吧

linux命令行中直接执行mysql语句

其实我一开始是拒绝的,但是貌似就得这么做。怎么一行一行的来?没法整了。

有两种方法可以在命令行下执行sql命令。第一种是使用“-e“参数来指定需要执行的sql语句;第二种是通过管道的方式。语法及例子如下:
1、
代码如下 复制代码
MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名 -e”sql 语句”
/usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql -e”select host,user from user”;
2、

有两种方法可以在命令行下执行sql命令。第一种是使用“-e“参数来指定需要执行的sql语句;第二种是通过管道的方式。语法及例子如下:

1、

 代码如下 复制代码
MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名 -e”sql 语句”
/usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql -e”select host,user from user”;

2、

 代码如下 复制代码
echo “sql 语句” | MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名
echo “select host,user from user” | /usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql

代码如下 复制代码
echo “sql 语句” | MYSQL_HOME/bin/mysql -u用户名 -p密码 -D数据库名
echo “select host,user from user” | /usr/local/mysql/bin/mysql -uroot -p123456 -Dmysql

找好数

function getGoodNum(page){
console.log(page);
//var reg=/1[3578]\d*([123567890]{3})\1\d*/g;
var reg=/1[3578]\d*([123567890]{2})\1\d*/g;
var matches=page.match(reg);
if(matches){alert(matches)}
}

 

在wordpresss里想用code标签,就要先进到“文本”模式。

在看某国企的网站代码时,发现它竟然还用了eval来混淆代码,害我先上网找了代码来“破解”它,其实只要在Html里找到一个方法,在控制台里运行一下,啥都能看到,除非它进行了压缩,方法内部变量都变成abc,否则这种混淆根本一点意义都没有,到了控制台里怎么阅读都可以。只有那种用了奇怪的MVC的代码,还有点坑爹。否则都没啥意义。

每次搞这些,最后都会发现自己太过于急躁,其实一步步来,遇到的坑就会少很多。