-------------引用1:http://www.2cto.com/os/201308/239136.html-------------
$()和${}和$(())和(())
$()和${}的用法:
在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换用(command substitution)的。而 $( ) 并不见的每一种 shell 都能使用,若你用 bash2 的话,肯定没问题...
看 ${ } 吧... 它其实就是用来作变量替换用的啦。一般情况下,$var 与 ${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围。
我这里再用一些例子加以说明 ${ } 的一些特异功能:
假设我们定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt
我们可以用 ${ } 分别替换获得不同的值:
${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt
${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个 . 及其左边的字符串:txt
${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)
${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是去掉左边(在鉴盘上 # 在 $ 之左边)
% 是去掉右边(在鉴盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配。
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2
我们也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个 dir 提换为 path:/
path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/
path1/path2/path3/my.file.txt
利用 ${ } 还可针对不同的变量状态赋值(没设定、空值、非空值):
${file-my.file.txt} :假如 $file 没有设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理)
${file:-my.file.txt} :假如 $file 没有设定或为空值,则使用my.file.txt 作传回值。 (非空值时不作处理)
${file+my.file.txt} :假如 $file 设为空值或非空值,均使用my.file.txt作传回值。(没设定时不作处理)
${file:+my.file.txt} :若 $file 为非空值,则使用 my.file.txt 作传回值。(没设定及空值时不作处理)
${file=my.file.txt} :若 $file 没设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。 (空值及非空值时不作处理)
${file:=my.file.txt} :若$file没设定或为空值,则使用my.file.txt作传回值,同时将 $file 赋值为my.file.txt 。(非空值时不作处理)
${file?my.file.txt} :若 $file 没设定,则将 my.file.txt 输出至STDERR。 (空值及非空值时不作处理)
${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (非空值时不作处理)
以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态.
一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连null 也受影响.
还有哦,${#var} 可计算出变量值的长度:
${#file} 可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字节...
$(())的用途:
它是用来作整数运算的。
在 bash 中,$(( )) 的整数运算符号大致有这些:
+ - * / :分别为 "加、减、乘、除"。
% :余数运算
& | ^ !:分别为 "AND、OR、XOR、NOT" 运算。
举例:
wangnc>a=5;b=7;c=2;
wangnc>echo $a + $b
5 + 7
wangnc>echo $(( a + b*c))
19
wangnc>echo $(((a*b)/c))
17
wangnc>echo $(($a +$b*$c))
19
wangnc>
在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的结果
此外,$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算呢,只是,输出结果皆为十进制而已:
echo $((16#2a)) 结果为 42 (16进位转十进制)
(())的用途:
事实上,单纯用 (( )) 也可重定义变量值,或作 testing:
a=5; ((a++)) 可将 $a 重定义为 6
a=5; ((a--)) 则为 a=4
a=5; b=7; ((a < b)) 会得到 0 (true) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于
----引用2-- http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html ------------------
linux中shell变量$#,$@,$0,$1,$2的含义解释:
变量说明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

示例:

1 #!/bin/bash
 2 #
 3 printf "The complete list is %s\n" "$$"
 4 printf "The complete list is %s\n" "$!"
 5 printf "The complete list is %s\n" "$?"
 6 printf "The complete list is %s\n" "$*"
 7 printf "The complete list is %s\n" "$@"
 8 printf "The complete list is %s\n" "$#"
 9 printf "The complete list is %s\n" "$0"
10 printf "The complete list is %s\n" "$1"
11 printf "The complete list is %s\n" "$2

结果:

[Aric@localhost ~]$ bash params.sh 123456 QQ
The complete list is 24249
The complete list is
The complete list is 0
The complete list is 123456 QQ
The complete list is 123456
The complete list is QQ
The complete list is 2
The complete list is params.sh
The complete list is 123456
The complete list is QQ
Have a nice day!!!

很多时间管理致力于提高工作效率,减少打扰,番茄工作法是其中及其简便的一种。

一个番茄时段25分钟,计时开始后,排除一切干扰开始专一的一项工作。这项工作应该是简单的可以在25分钟内完成的。然后休息5分钟,继续下一个番茄时段。

这种方式蛮有效率,我想了一下可能的原因:

* 工作时段容易计算,工作+休息是半个小时,看着一个时钟就很清楚过去了多久还有多久,不需要特意的工具。

* 排除干扰,集中一项事务。人能高度集中注意力的时间不长。学校里面上课40分钟是有道理的。

* 一件简单能完成的工作。这督促人们去分解庞大的工作,不积跬步无以至千里。一步步都能完成一些工作,避免了一个庞大工作总是无法完成的挫败感。这与项目管理的WBS(Work breakdown structure)任务拆分、敏捷开发的sprint->user story->task的拆分思想都是一样的。

* 要集中注意力,就要休息好。中间一小段时间的休息更有利于集中注意力工作。

1. 找出占用的端口,如8080:

netstat -apn | grep 8080

如果还找不出来,上面的命令可能需要sudo一下。

输出列表形式是:

协议、原地址:端口、目的地地址:端口、状态、PID/程序名称

PID是其标识,可以用来杀掉它。后面的程序名称有时候比较短,可以用ps再确认一下。

2. 用进程管理再确认一下

ps -aux | grep python

输出是:

用户、PID、CPU、内存、VSZ、RSS、TTY、状态、开始时间、运行时间、命令路径名称

这里面命令路径名称要详细一些,可以用来加以确认;

3. 杀了

温柔的送个终止信号,请其自杀:

Kill -3 PID

不管了,强制杀掉:

kill -9 PID

debian系linux使用的包管理工具是apt-get或升级版的aptitude。node.js相关的有2个包:nodejs和nodejs-legacy。为什么会有两个?

首先,nodejs安装完成后,大部分系统的默认的运行名称为“node”,于是很多nodejs的脚本文件都会以“node”作为运行名,如果没有找到,就无法执行。而debian上有个老软件包叫“node”,这与nodejs的默认运行名称“node”重名了,所以在debian系linux上,安装nodejs包后的默认运行名是“nodejs”,这会导致很多npm包里的软件找不到“node”。

解决方法1,就是安装nodejs-legacy,不过要把以前的nodejs和其他相关删除掉。

sudo apt-get --purge remove node
sudo apt-get --purge remove nodejs-legacy
sudo apt-get --purge remove nodejs

sudo apt-get install nodejs-legacy
# 确认能用
node --version       # v0.10.13
ls -la `which node`  # ... /usr/bin/node -> /etc/alternatives/node

解决方法2,仍然使用nodejs包,但是建立一个硬链接,目前测试暂未发现问题。

cd /usr/bin
sudo ln nodejs node

2b(to business)产品有其2b之处。

1. 用户选择和实施产品的成本非常高。企业产品对企业来说,很可能涉及全公司员工的使用。企业在选择时,就特别谨慎,表现在选择对比的周期长,审批环节多,要求产品提供方长期维护能力强,反应速度快。企业选择产品少则数天,多则数月。此时往往需要专人跟踪。

2. 用户、客户、决策者角色分离,也就是使用的、给钱的、做决定的都不是一个人。这是常见的情况,无须赘述。作为产品来说,就算只卖一个产品,你需要搞定的都不是一个人。

3. 使用者(用户)对业务不一定熟悉,有的用户甚至提不出问题,更遑论给出要求。这有多种原因,首先,熟悉业务的更多是安排事情的领导,而使用者多数可能是普通员工,也就是“做事的”,开始时并不熟悉业务;其次,普通员工公司内、公司间的流动性比上层员工大,可能是新员工刚来,也可能是老员工要走,我在半年时间内,已经见到好几个公司的前台用户换岗离职,频率不可谓不高;再次,公司业务发展快、调整快、文件多,一种制度不适用了、或没有制定好会很快换另一种,负责的员工熟悉上手都需要时间;最后,很多客户只是觉得这个产品概念不错,或者很流行,或者看到别的公司有使用,但这个产品对他们究竟有哪些用处,还需要很多学习了解。

4.  不同公司的习惯和要求千奇百怪千差万别,有些习惯和要求可以改变但要花费精力解释引导灌输,有的习惯和要求就很难统一改变。如果产品要都适应,就要做出多种多样的设置选项。而设置多了以后,如何让用户找到哪个设置适用于自己,又是一个新的问题。这也是以前企业产品多定制的原因。

5. 企业产品要求连通性。这一点要求其实也挺强,但是一直都没有很好解决,因为毕竟没有一家企业产品的开发公司能做好方方面面的,另外在企业的连通性方面又缺乏协议和标准。连通性最起码的是账号鉴权、组织架构,其次是业务流程、审批流程。华为以前用IBM lotus Notes做基本的工具,又有很多专门的IT开发人员基于notes做二次开发,甚至ERP等方方面面都是用IBM产品,以求联通。但绝大多数公司也没有华为的财力人力,也就习惯了吃百家饭,然后自己人工消化。所以目前企业产品即使不连通,很多用户也愿意自己人工化解。

6. 企业产品的安全性、可用性要求也高于个人产品。个人泄露了点信息可能是多接几个骚扰电话,应用一两个小时不可用也就等一等或用别的;企业的信息泄露可能事关存亡,应用用不了也没有替换方案,相关人等的相关工作都要停滞。

综上所述,一个企业产品如果不解决上面几点问题,就很难有爆发力,不免陷入泥潭。

对于创业公司只有少数几个人的团队来说,要做也只能做小而美的产品,我试着给出几个产品定义的方式,解决上面的问题:

1. 设计针对某一岗位的某一类员工个人使用的通用、共性需求的产品,对员工个人有价值,从个人方面赚取费用。这个能规避企业产品选择成本高、角色分离、要求多样化的问题。他自己觉得合适,就能选择来用,不合适就不用。如墨刀modao.io是针对产品经理制作APP原型的工具,产品经理觉得好用就马上可以用,用段时间对有些付费新功能有需要就会付费。

2.做工具类产品而不是社交类、连通性产品。同上。对于社交,很多小创业公司还是用的QQ,很多大公司还是用的Email,要做OA审批的话,就要有一堆的连通性问题,需求就会层出不穷,很难好好满足。

3.如果是确实要针对全公司大范围使用的产品,产品应针对小微企业,而不是大企业。因为小微企业决策快且激进,大企业慢且保守。最近和一个一千多员工的公司HR聊,他们会更倾向于使用传统保守的软件,而不是新兴软件,即使新软件的体验更好。我说的是金蝶云之家和阿里钉钉。其实阿里人更多实力更强,但它之前并没有做过企业类产品,传统的大企业还是会更相信金蝶。

4.要做足文档和培训,做好售后支持和及时响应。企业中每天遇到的问题都可能是新的,更别提你解决新问题的产品。从各家SaaS产品来看,工具类产品小到墨刀leangoo,社交综合类产品大到钉钉云之家,文档帮助总是时时处处,甚至400热线也毫不吝惜的处处出现,培训消息通知也时不时能看到。

其他方面:

1.设计好盈利模式。你看去年快的被收购了,今年优步中国被收购了,赔本赚吆喝的生意总是不能一直做下去的,况且咱创业又没那么多钱用来烧。这里面还有一点,如果没人愿意付费,千万别死脑筋觉得产品做得不够好,赶快看看是不是产品方向就有问题。大多数创业者愿意说产品不够好,因为产品不够好可以改;但大多数人不愿说方向有问题,因为方向有问题,前面就白做了。不过,白做三个月总好过白做一年。

2.做好营销。如今说“酒香不怕巷子深”,完全是在放屁。如今还说放到网上,有人说好就有口碑就有粉丝,更是痴人说梦。网上的流量都是被各路巨头把控,要流量就要付费。既要流量,又不想给钱或者少给钱的方法是越来越少,也越来越奇葩。连优衣库也要运作个不雅视频门,洗个车还要弄比基尼女郎,你就看着办吧。

除了关注很久的leancloud,闹着风风雨雨的APICloud,最近又有一个野狗,做实时BaaS;通过它又知道谷歌在两年前收购了一家做BaaS的Firebase....APP和各种应用开发似乎要越来越容易了。

物联网方面,Wifi和Zigbee曾经是最火的两个协议。去年深圳的物联网实现的一些智能家居产品都是用这两个协议做的。去年典型的是Zigbee的芯片贵,据说是实现起来比较复杂。现在又有了两个新底层协议,一个是z-wave,另一个是thread,还有上层协议COAP。后两者是google的NEST背景,希望这些会为物联网注入活力。

说多一些物联网。智能家居闹了这么久,似乎也只是些噱头。除了用户体验方面,让大家一直怀疑有必要让个温度计湿度计智能起来吗?另一方面,室外定位从卫星到技术大发展,美国GPS、俄国Glonass、中国北斗纷纷上线,而室内定位似乎还没有一个好的技术标准。

腾讯视频绑定小米路由,利用用户路由器带宽和硬盘P2P,变成VPN,还能让用户分享点儿收益。以后会不会产生各个公司争抢用户家里资源的情况?从带宽到硬盘到CPU到电能?在用户获取良好收益的情况下,会不会像比特币一样挖矿造矿机?会不会颠覆数据中心?相比电脑笔记本,路由器的优势是不掉线不断电,更为此提供了可能。

最高昂的成本是什么?做沟通和做决策。眼红的决定是追高、跟风或恐惧时候做的决定。

看雅虎收购Flickr后,Flickr85%的时间再和雅虎做沟通,一项决定层层审批;而只有15%的时间在做产品,创业明星Flickr就此消失;另外雅虎当年看不起、后来买不起谷歌,匆忙收了技术并不咋样的Overtune,却没有做成。

做创业需要降低高昂的成本,就要减少决策,要有能力的人往前冲;就要当面沟通,办公租金成本和交通成本可能是低于远程沟通的时间成本。如果试错速度足够快,那么多试错好过多决策。

然后不能去跟风去追,除非你能有更便宜更好的东西。

创造需要激情和感性,需要独断专行,理性得有别太多,沟通决策太理性,不需要做就别做,必须要做就快做。

1. 搜索并替换
sed /要操作的行包含的内容/s/搜索内容/替换内容/g
s代表搜索并替换,/g代表搜索并替换所有
搜索内容和替换内容可以使用正则表达式
s/xx/xxx/g可以用“”括起来, 但用引号括起来有时候会产生问题;

如:

echo "!  asdf" | sed s/a/b/g

输出:!  bsdf
2. 删除包含指定内容的行
sed /要操作的行包含的内容/d
3. 删除不包含指定内容的行
sed /要操作的行包含的内容/!d
!表示否
注意, 感叹号有时候会被错误识别,这时候用\!代替

mac上不像windows上有tortoiseSVN的图形界面, 还蛮好用. 我们的UI设计师用MAC要上传UI切图, 在MAC上苦于找不到好用的上传工具. 我就给她写了个svn脚本, 双击上传, 好用得不要不要的.

如下, 实现增加所有文件, 删除所有不存在的文件, 并上传文件. 如果需要更新的话, 把后面两句注释掉的去掉就可以了.

脚本第三行, 进入目录, 需要替换为自己实际的目录.

#! /bin/sh
echo '进入工作目录'
cd /users/apple/Desktop/UISVN/trunk
echo '增加所有新的文件'
svn add * --force
echo '删除所有不存在的文件'
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' -e 's/$/@/g')
echo 'commit上传文件'
svn commit -m "add by me"
: echo 'update 更新'
: svn update

上述代码保存为.sh文件, 如"svn_upload.sh", 在mac上使用终端打开运行即可. 以后鼠标双击就行了.

linux上, chmod 777 这个文件, 改为可运行, linux控们都懂得. 如:

chmod 777 svn_upload.sh

--------------------------

有的亲不知道svn怎么从头开始取文件? 创建一个存储SVN文件的目录, 用下面的命令就可以了.

svn checkout URL地址

 

时而缥缈不定,时而遮天蔽日,时而有,时而无。

时而重重叠叠,时而淡淡轻轻,时而黑,时而白。

云之变,变之易,揣测实难。

概莫如心境,阴阴郁郁,几时放晴?概莫如生计,忙忙碌碌,几时得闲?概莫如人欲,纷纷扰扰,几时方休?概莫如世界,来来去去,几时消停?

人之变,变之易,揣测实难。

标题党: 产品做不好的原因竟然是这个!

好的产品,精确,智慧,而又人性,说白了就是智商高情商也高。

做好的和不好的产品都需要两样东西:人和机器(计算机)。

然而人与机器相比,健忘,爱出错,运算慢,思考慢,交流充满误解,一句话,笨。

机器与人相比,精确,理智,然而一根筋,情商为零。一句话,轴。

做好产品,就是把这么两种又笨又轴的玩意儿弄一块,做出来又聪明又体贴的产品。所以才这么难。

更难的是,产品经理也是这个笨物种中的一员。