2016年8月

1. 安装

我是懒人,不习惯make/make install, 直接用aptitude安装了

$ sudo aptitude install nginx

$ sudo aptitude install php

$ sudo aptitude install php-fpm

目前是直接安装了最新版的php7、php-fpm7

2. 配置

php-fpm默认不需要配置,并且安装好后自动就启动了,可以使用

ps -aux | grep fpm

查看有没有启动。

安装的位置是:

/usr/sbin/php-fpm7.0

不过和旧版本的使用 fastcgi://127.0.0.1:9000的网络接口相比,新版本使用了Unix域套接字(Unix domain socket),是在文件系统里的文件,php-fpm的unix域套接字是:

unix:/run/php/php7.0-fpm.sock

因此配置nginx.conf的时候,要使用这个。

Unix域套接字同样可以用netstat -apn | grep fpm查看。

重要的是配置nginx.conf

我的位置是在 /etc/nginx/nginx.conf

deepin安装的nginx.conf中,包含了配置/etc/nginx/sites-enabled/default,默认的配置文件其实在这,可以配置这个default文件。

sudo vim /etc/nginx/sites-enabled/default

在default中,默认包含了nginx的配置,所做的是取消井号#,修改一下就好了。

默认default中去掉无关说明,剩下的所有配置如下,需要修改的以粗体表示:

server {
 listen 80 default_server;
 listen [::]:80 default_server;
 root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # pass the PHP scripts to FastCGI server # listening on 127.0.0.1:9000 # #location ~ \.php$ { #include snippets/fastcgi-php.conf; # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: #fastcgi_pass unix:/var/run/php5-fpm.sock; #} }

 

修改为:

server {
 listen 80 default_server;
 listen [::]:80 default_server;
# 这儿是你自定义的www根目录
 root /home/deepin/docs/wwwdir;
 # Add index.php to the list if you are using PHP
 index index.html index.htm index.nginx-debian.html index.php; #增加index.php

 server_name _;

 location / {
 # First attempt to serve request as file, then
 # as directory, then fall back to displaying a 404.
 try_files $uri $uri/ =404;
 }
 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#去掉下面两行井号
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: # 去掉下面这行井号,并修改为正确的unix套接字,可在shell中用sudo netstat -apn|grep php查看 fastcgi_pass unix:/run/php/php7.0-fpm.sock; #} }

 

3. 启动

/etc/init.d/php7.0-fpm restart

/etc/init.d/nginx restart

4. 测试

在配置的root目录下建一个index.php

内容是:

<?php phpinfo(); ?>

-------------引用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、中国北斗纷纷上线,而室内定位似乎还没有一个好的技术标准。