touch
命令,一般在使用 make
的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件。
touch [选项] 文件
touch
命令参数可更改文档或目录的日期时间,包括存取时间和更改时间。
-a 或--time=atime或--time=access或--time=use 只更改存取时间。
-c 或--no-create 不建立任何文档。
-d 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify 只更改变动时间。
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t 使用指定的日期时间,而非现在的时间。
# 创建不存在的文件
touch test1.txt test2.txt
# 更新log2.log的时间和log1.log时间戳相同
touch -r log1.log log2.log
# 设定文件的时间戳
touch -t 201211142234.50 log.log
说明:
-t 使用指定的时间值time作为指定文件相应时间戳记的新值。此处的time规定为如下形式的十进制数:
[[CC]YY]MMDDhhmm[.SS]
这里,CC为年数中的前两位,即”世纪数”;YY为年数的后两位,即某世纪中的年数.如果不给出CC的值,则touch 将把年数CCYY限定在1969–2068之内.MM为月数,DD为天将把年数CCYY限定在1969–2068之内.MM为月数,DD为天数,hh 为小时数(几点),mm为分钟数,SS为秒数.此处秒的设定范围是0–61,这样可以处理闰秒.这些数字组成的时间是环境变量TZ指定的时区中的一个时 间.由于系统的限制,早于1970年1月1日的时间是错误的。
]]>cp [选项] [-T] 源 目的
cp [选项] 源 目录
cp [选项] -t 目录 源
将源文件复制至目标文件,或将多个源文件复制至目标目录
# 复制单个文件到目标目录,文件在目标文件中不存在
# 在没有带-a参数时,两个文件的时间是不一样的。在带了-a参数时,两个文件的时间是一致的
cp nginx.log ./log
# 目标文件存在时,会询问是否覆盖
# 这是因为cp是cp -i的别名。目标文件存在时,即使加了-f标志,也还会询问是否覆盖
cp nginx.log ./log
# 复制整个目录
# 目标目录存在与否结果是不一样的。目标目录存在时,整个源目录被复制到目标目录里面
cp test1 test2
# 复制的 log.log 建立一个连结档 log_link.log
# 那个 log_link.log 是由 -s 的参数造成的,建立的是一个快捷方式
cp -s log.log log_link.log
]]>mv
命令是move的缩写,可以用来移动文件或者将文件改名,是Linux系统下常用的命令,经常用来备份文件或者目录。
mv [选项] 源文件或目录 目标文件或目录
mv
命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失。
-b # 若需覆盖文件,则覆盖前先行备份。
-f # force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i # 若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u # 若目标文件已经存在,且 source 比较新,才会更新(update)
-t # 指定目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后。
# 文件改名
mv test.log test.txt
# 移动文件
mv test.log ./test
# 将文件log1.txt, log2.txt移动到目录test中
mv log1.txt log2.txt test
mv -t ./test log1.txt log2.txt
# 将文件file1改名为file2,如果file2已经存在,则询问是否覆盖
mv -i log1.txt log2.txt
# 将文件file1改名为file2,即使file2存在,也是直接覆盖掉
# -f是个危险的选项,使用的时候一定要保持头脑清晰,一般情况下最好不用加上它
mv -f log1.txt log2.txt
# 如果目录dir2不存在,将目录dir1改名为dir2;否则,将dir1移动到dir2中
mv dir1 dir2
# 移动当前文件夹下的所有文件到上一级目录
mv * ../
# 把当前目录的一个子目录里的文件移动到另一个子目录里
mv ./test1/* ./test2
# 文件被覆盖前做简单备份,前面加参数-b
mv log1.txt -b log2.txt
说明:
-b 不接受参数,mv会去读取环境变量VERSION_CONTROL来作为备份策略。
–backup该选项指定如果目标文件存在时的动作,共有四种备份策略:
1.CONTROL=none或off : 不备份。
2.CONTROL=numbered或t:数字编号的备份
3.CONTROL=existing或nil:如果存在以数字编号的备份,则继续编号备份m+1…n:
执行mv操作前已存在以数字编号的文件log2.txt.~1~,那么再次执行将产生log2.txt~2~,以次类推。如果之前没有以数字编号的文件,则使用下面讲到的简单备份。
4.CONTROL=simple或never:使用简单备份:在被覆盖前进行了简单备份,简单备份只能有一份,再次被覆盖时,简单备份也会被覆盖。
整理自: 每天一个linux命令: mv命令
]]>rm - r dir
命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具有对父目录的写权限。
rmdir [选项] 目录
该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限。
-p # 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。
# 如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。
-v, --verbose # 显示指令执行过程
rmdir dirname # 命令不能直接删除非空目录
rmdir -p logs # 当子目录被删除后使它也成为空目录的话,则顺便一并删除
整理自: 每天一个linux命令: rmdir命令
]]>rm是一个危险的命令,使用的时候要特别当心,否则整个系统就会毁掉(比如在/下执行 rm -rf *
)。所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑。
rm [选项] 文件
删除一个目录中的一个或多个文件和目录,如果没有使用 -r
选项,则rm不会删除目录。
-f, --force # 忽略不存在的文件,不给出提示。
-i, --interactive # 进行交互式删除
-r, -R, --recursive # 将列出的全部目录和子目录均递归地删除。
-v, --verbose # 详细显示进行的步骤
--help # 显示此帮助信息并退出
--version # 输出版本信息并退出
rm 文件名 # 删除文件,系统会先询问是否删除
rm -f 文件名 # 强行删除file,系统不再提示
rm -i *.log # 删除任何.log文件;删除前逐一询问确认
rm -r test # 将 test 目录及目录中所有档案删除
rm -rf test # 将 test 目录及目录中所有档案删除,并且不用确认
rm -- -f # 删除以 -f 开头的文件
myrm(){ D=/tmp/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "$@" $D && echo "moved to $D ok"; }
上面的操作过程模拟了回收站的效果,即删除文件的时候只是把文件放到一个临时目录中,这样在需要的时候还可以恢复过来。
整理自: 每天一个linux命令: rm命令
]]>mkdir
命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录。
mkdir [选项] 目录名
通过 mkdir
命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录,即同一个目录下不能有同名的(区分大小写)。
-m, –mode # 设定权限(类似 chmod),而不是 rwxrwxrwx 减 umask
-p, –parents # 递归创建多个目录
-v, –verbose # 每次创建新目录都显示信息
–help # 显示此帮助信息并退出
–version # 输出版本信息并退出
mkdir test
mkdir -p test2/test22
mkdir -m 777 test3
mkdir -v test4
mkdir -vp scf/{lib/,bin/,doc/{info,product},logs/{info,product},service/deploy/{info,product}}
整理自: 每天一个linux命令: mkdir命令
]]>pwd [选项]
查看“当前工作目录”的完整路径
一般情况下不带任何参数
如果目录是连接时,使用 pwd -P
会显示出实际路径,而非使用连接(link)路径
# 用 pwd 命令查看默认工作目录的完整路径
[root@localhost ~]# pwd
/root
[root@localhost ~]#
# 使用 pwd 命令查看指定文件夹
[root@localhost ~]# cd /usr/local/
[root@localhost soft]# pwd
/usr/local/
[root@localhost soft]#
# 目录是连接时,pwd -P 显示出实际路径,而非使用连接(link)路径,pwd显示的是连接路径
[root@localhost soft]# cd /etc/init.d
[root@localhost init.d]# pwd
/etc/init.d
[root@localhost init.d]# pwd -P
/etc/rc.d/init.d
[root@localhost init.d]#
# /bin/pwd,-L 目录连接链接时,输出连接路径;-P 输出物理路径
[root@localhost init.d]# /bin/pwd
/etc/rc.d/init.d
[root@localhost init.d]# /bin/pwd -P
/etc/rc.d/init.d
[root@localhost init.d]# /bin/pwd -L
/etc/init.d
[root@localhost init.d]#
# 当前目录被删除了,而pwd命令仍然显示那个目录
[root@localhost init.d]# cd /opt/soft
[root@localhost soft]# mkdir removed
[root@localhost soft]# cd removed/
[root@localhost removed]# pwd
/opt/soft/removed
[root@localhost removed]# rm ../removed -rf
[root@localhost removed]# pwd
/opt/soft/removed
[root@localhost removed]# /bin/pwd
/bin/pwd: couldn't find directory entry in “..” with matching i-node
整理自: 每天一个linux命令: pwd命令
]]>cd
命令可以说是 Linux 中最基本的命令语句,其他命令的操作,基本都是建立在 cd
命令上。所以,学习 Linux 常用命令,首先要学好 cd
命令的使用技巧。
cd [目录名]
切换当前目录至另外一目录
cd / # 进入根目录
cd .. # 退到上一目录
cd ..// # 退到上一目录
cd ../.. // # 使用cd 命令实现进入当前目录的父目录的父目录
cd # 进入当前用户主目录
cd ~ # 进入当前用户主目录
cd /usr/local # 进入指定目录,从根目录开始,目录名称前加 / ,当前目录内的子目录直接写名称即可
cd - # 返回进入此目录之前所在的目录
cd !$ # 把上个命令的参数作为cd参数使用
整理自: 每天一个Linux命令:cd命令
]]>ls
命令是linux下最常用的命令。ls
命令就是 list
的缩写,缺省下 ls
用来打印出当前目录的清单。如果 ls
指定其他目录,那么就会显示指定目录里的文件及文件夹清单。
通过 ls
目录命令不仅可以查看linux文包含的文件,而且可以查看文件权限等信息。
ls [参数] [目录名]
列出目标目录中所有的子目录和文件。
-a , –all | 列出目录下的所有文件,包括以 . 开头的隐含文件 |
-A | 同-a, 但不列出”.”(表示当前目录)和”..”(表示当前目录的父目录 |
-c | 配合-lt: 根据 ctime 排序及显示 ctime (文件状态最后更改的时间) |
配合-l: 显示 ctime 但根据名称排序 | |
否则: 根据 ctime 排序 |
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。
系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。cat /etc/crontab
:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
前三行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。
用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。
所有用户定义的 crontab
文件都被保存在 /var/spool/cron
目录中。其文件名与用户名一致。/etc/cron.deny
该文件中所列用户不允许使用crontab命令。/etc/cron.allow
该文件中所列用户允许使用crontab命令(默认情况下不存在)。
如果两个文件同时存在,那么/etc/cron.allow优先。如果两个文件都不存在,那么只有root用户可以安排作业。
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
# .---------------- minute 表示分钟,可以是从0到59之间的任何整数。
# | .------------- hour 表示小时,可以是从0到23之间的任何整数。
# | | .---------- day 表示日期,可以是从1到31之间的任何整数。
# | | | .------- 表示月份,可以是从1到12之间的任何整数。
# | | | | .---- 表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
# | | | | | .-command要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
# | | | | | |
# * * * * * *
在以上各个字段中,还可以使用以下特殊字符:
* : 代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
, : 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- : 可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
/ : 可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。
同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
]]>GitLab的两种安装方法:
编译安装
优点:可定制性强。数据库既可以选择MySQL,也可以选择PostgreSQL;服务器既可以选择Apache,也可以选择Nginx。
缺点:国外的源不稳定,被墙时,依赖软件包难以下载。配置流程繁琐、复杂,容易出现各种各样的问题。依赖关系多,不容易管理,卸载GitLab相对麻烦。通过rpm包安装
优点:安装过程简单,安装速度快。采用rpm包安装方式,安装的软件包便于管理。
缺点:数据库默认采用PostgreSQL,服务器默认采用Nginx,不容易定制。
进入进入gitlab官方网站,选择对应的操作系统 — CentOS 6 (and RedHat/Oracle/Scientific Linux 6),按照官方提示进行安装。
1.安装配置必要的依赖。在Centos 6 和 7 中,以下的命令将会打开HTTP和SSH在系统防火墙中的可访问权限。
sudo yum install curl openssh-server openssh-clients postfix cronie
sudo service postfix start
sudo chkconfig postfix on
sudo lokkit -s http -s ssh
2.由于在线安装脚本内容被墙,可以在服务器上搭建个shadowsocks客户端进行安装(又需要稍微折腾一下)。
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce
或者将安装包下载在本地,然后通过scp或者ftp再上传到服务器进行安装。
curl -O https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/6/gitlab-ce-8.6.4-ce.0.el6.x86_64.rpm/download
rpm -i gitlab-ce-8.6.4-ce.0.el6.x86_64.rpm
3.配置和启动GitLab。用 vim 打开 /etc/gitlab/gitlab.rb
,将 external_url = 'http://git.example.com'
修改为自己的IP地址:http://xxx.xx.xxx.xxx
,然后执行下面的命令,对GitLab进行编译。
sudo gitlab-ctl reconfigure
4.打开 http://xxx.xx.xxx.xxx
,使用gitlab。
1.在浏览器中访问GitLab出现502错误
原因:内存不足。
解决办法:检查系统的虚拟内存是否随机启动了,如果系统无虚拟内存,则增加虚拟内存,再重新启动系统。
2.GitLab头像无法正常显示
原因:gravatar被墙
解决办法:
编辑 /etc/gitlab/gitlab.rb,将
#gitlab_rails['gravatar_plain_url'] = 'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'
修改为:
gitlab_rails['gravatar_plain_url'] = 'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'
然后在命令行执行:
sudo gitlab-ctl reconfigure
sudo gitlab-rake cache:clear RAILS_ENV=production
scp 基于 ssh 登录,将当前主机文件 upload 给远程主机,或者将远程主机的文件 download 到当前操作主机。
复制文件
# 将本地的 /var/data.tar.gz 文件上传到 222.222.222.222 服务器的 data 目录下
# 文件名不变,命令执行后需要输入远程主机的 root 用户密码
scp /var/data.tar.gz root@222.222.222.222:/data/
# 将本地的 /var/data.tar.gz 文件上传到 222.222.222.222 服务器的 data 目录下
# 文件名变为 upload.tar.gz,命令执行后需要输入远程主机的 root 用户密码
scp /var/data.tar.gz root@222.222.222.222:/data/upload.tar.gz
# 将本地的 /var/data.tar.gz 文件上传到 222.222.222.222 服务器的 data 目录下
# 文件名不变,命令执行后需要输入远程主机的用户名字的密码
scp /var/data.tar.gz 222.222.222.222:/data/
# 将本地的 /var/data.tar.gz 文件上传到 222.222.222.222 服务器的 data 目录下
# 文件名变为 upload.tar.gz,命令执行后需要输入远程主机的用户名和密码
scp /var/data.tar.gz 222.222.222.222:/data/upload.tar.gz
复制目录
# 将本地的 /var/log 目录上传到 222.222.222.222 服务器的 data 目录下
# 即远程主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码
scp -r /var/log/ root@222.222.222.222:/data/
# 将本地的 /var/log 目录上传到 222.222.222.222 服务器的 data 目录下
# 即远程主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码
scp -r /var/log/ 222.222.222.222:/data/
只要将上面《当前主机文件 upload 给远程主机》的后面两个参数(本地目录和远程目录)调换顺序就好,例如:
# 将远程主机的 data.tar.gz 文件下载到本地 /var/ 目录下
# 文件名不变,命令执行后需要输入远程主机的 root 用户密码
scp root@222.222.222.222:/data/data.tar.gz /var/
# 将远程主机的 /var/log/ 目录下载到当前主机的 data 目录下
# 即本地主机产生 /data/log/ 目录,命令执行后需要输入远程主机的 root 用户密码
scp -r 222.222.222.222:/var/log/ /data/
如果远程主机的默认 SSH 端口被改的话,可以使用 -p
参数,例如:
scp -p 22001 root@222.222.222.222:/data/data.tar.gz /var/
还有一些其他参数, -v
(显示进度)、 -4
(使用 IPV4 地址), -6
(使用 IPV6 地址)。
在使用 scp 的过程中,注意所使用的用户是否具有可读取远程服务器相应文件的权限。
如果你使用的是 OS X
系统或者 Linux
系统,还可以实现本地的文件上传,下载等功能。如果是 windows
系统的话,我没折腾过,大家可以试试。
Linux 之间传输文件的其他方式:
wget
下载(我能想到的只有这么多了)。前两方式我没试过,不保证很简单。
]]>目前网络上充斥着大量的过时资讯,让 PHP 新手误入歧途,并且传播着错误的实践以及不安全的代码。《 PHP 之道》收集了现有的 PHP 最佳实践、编码规范和权威学习指南,方便 PHP 开发者阅读和查找。
我刚开始学习的 PHP 资料,是网上下载的某培训机构2013年的培训视频,视频内容使用的 PHP 版本是 5.3.* 。由于使用的学习资料过时,导致我半年之后才知道 PHP 有“命名空间”这东西。虽然说网络是个好东西,但是里面充斥着太多的杂乱信息。技术虽然快速发展,但是信息还是存在着不对称,比如在国外火了一年多的技术,国内才逐渐火起来。
多年之后,我发现了一个好东西,可以解决学习 PHP 的困扰,《 PHP 之道》向 PHP 新手介绍一些他们没有发现或者是太晚发现的主题,或是经验丰富的专业人士已经实践已久的做法提供一些新想法。当有更多有用的资讯以及范例时,《 PHP 之道》会随着相关技术的发展而持续更新。
推荐,跟我一样英语不过关的同学,观看英文手册。(可以一边学习英语,一边学习技术,说不定以后要看的英文文档的机会还有很多呢)
如果需要工具文档的话,官方文档是最好的工具书,没有之一,无论是内容还是翻译排版等,都是上乘之作,尤其手册可以像论坛一样,递交笔记和查看他人的笔记,从中应该能得到些技术点吧!
另外推荐两本书,PHP 工程师进阶所需。
《深入PHP:面向对象、模式与实践(第3版)》,PHP专家赞德斯经典力作,主要讲解面向对象、设计模式和一些工具的使用等。
《 Modern PHP 》的作者也是《 PHP 之道》的发起人 Josh Lockhart。书中覆盖面很广,从“命名空间”、“闭包”等,讲到最佳实践,也有composer 、psr 等最新标准规范,适合有一定 PHP 开发经验的人阅读。
]]>下面是我Get到的新技能:
/\p{Han}/u
以前从来没见过这样的正则(原谅我的无知吧)。\p{Han}
代表汉语(中文字符),u
模式修饰符表示被匹配的字符串是utf-8的(传说中的开启Unicode模式?)。这个正则只适合于 “开启Unicode模式的PHP” 和 “1.9以上版本Ruby” 。
实践出真知:
<?php
$value="迷麟--灵山王";
preg_match('/^(\p{Han}){2}/u', $value, $result);
print_r($result);
?>
输出为:
Array
(
[0] => 迷麟
[1] => 麟
)
参考资料:
正则表达式:Unicode诸问题:http://www.infoq.com/cn/news/2011/03/regular-expressions-unicode-2
模式修饰符:http://php.net/manual/zh/reference.pcre.pattern.modifiers.php
欢迎大家学习交流。
]]>对于开发者来说,这样的大会虽然不能短时间提升你的技术能力,但能让你体会到一场盛大的技术盛宴,对于开拓视野还是不错滴。大会的演讲嘉宾太多,我就讲讲印象最深的两个人吧,一个是IOS明星唐巧小哥,一个是PHP明星鸟哥。
先来一段官方介绍吧!
唐巧,Blogger,资深iOS开发者,InfoQ编辑,《iOS开发进阶》作者。曾在网易参与过网易邮箱、网易微博以及有道云笔记的开发。
目前在猿题库创业,是小猿搜题的产品技术负责人。喜欢写作与分享,长期维护着自己的技术博客:http://blog.devtang.com 和微信公共帐号iOSDevTips,他的技术文章也多次发表在InfoQ网站上。
话说网易的产品用着都还不错呢,就是安全做的不到位唉,现在应该好了吧,表示是163邮箱的老用户了(不服来拼)。
话说唐巧小哥刚上场就问,现场有多少人是根据他提供的优惠码来参加大会的(要知道即便有优惠码,还是需要100软妹纸的),从我看得到的视野来说,基本2/3的人都举起了手,然后又问有多少人是IOS开发者,结果有更多的人参与了进来。我只想说这是真爱!!!
唐巧小哥带给我们的不是IOS各种高大上的技术,而是一位IOS新人,经历了怎样的成长,才站在了技术之巅的历程。他说,现在的大牛分为两种人,一种是静下心来默默做事情的,非常低调,但是实力强悍;另外一种是通过写博客或者笔记等,来沉淀自己的知识,同时分享了知识,逐渐成为行业的专家。而他属于第二种人。
这就是他的成长历程。
为什么你不行呢?很多人都会这样找借口,上班没时间去学习。真的没时间学习么?
唐巧利用上下班坐公交时间和平时的碎片时间,看WWDC视频,看各种IOS博客,然后沉淀成笔记,反复的复习。记忆→理解→应用→分析→评鉴→创造。也许你又会说英语不好,WWDC视频看不了;如果花太多时间学习了话,就没有对象,没有老婆。你可知道唐巧小哥的孩子都快能打酱油了呢。
下面是他最后的总结:
惠新宸,国内最有影响力的PHP技术专家,PHP开发组核心成员,PECL开发者,Zend公司外聘顾问,曾供职于雅虎、百度、新浪,现任链家网技术副总裁兼总架构师。是PHP 7的核心开发者,PHP5.4,5.5的主要开发者。
作为PECL开发者贡献了Yaf (Yet another framework),Yar(Yet another RPC framework) 以及Yac(Yet another Cache)、Taint等多个优秀开源作品,同时也是APC、Opcache、Msgpack等项目的维护者。
看到这里你是不是惊呆了呢?没事,我也惊呆了!有人说,鸟哥不是搞Linux的么?没错,但是此鸟哥非彼鸟哥,如果你是做PHP的话,就肯定知道了。
我是大概去年2月份学习的PHP吧,直到半年后,偶然机会才得知江湖有PHP鸟哥这一号人物。我们都是用PHP写东西的,而鸟哥却是写PHP的,这之间的差距,可想而知!
我不知道为什么很多程序员都会去黑PHP,但是PHP工程师的就业前景,就目前而言,还是排在前几名的。说其语法奇葩也好,说其函数命名不规范也好,但它就是走在时代的前沿。鸟哥认为,语言的好坏,是市场需求来决定的,而不是开发者来决定的。在PHP的背后,有着强大的社区支持,PHP开发过程中,如果遇到错误,只要将错误代码贴到Google上,第一个答案就能解决你的问题,这就是PHP背后强大的社区支持。
PHP 1 (1994)
Personal HomePage Tool(首创: HTML和脚本融合在一起,开发维护效率大幅提升)
PHP 2 (1995 ~ 1997)
PHP/FI(Form Interpreter)(还只是简单的Form解析,加入了对mSQL的支持,1996: 50000个域名使用PHP)
PHP 3 (1998)
Hypertext Preprocessor(终于是一门语言了,弱类型, 可扩展的语言)
PHP 4 (2000)
Zend Engine 1.0(基本的OO支持、会话支持、性能提升、社区快速发展、2002:Yahoo! 从YScript迁移到了PHP)
PHP 5 (2004)
Zend Engine 2.0(更好的OO支持、PDO的引用、 性能提升、WordPress、Facebook)
PHP 6 (2005)
Unicodes支持,然而你懂得。。。
PHP 7 (2014)
Zend Engine 3.0(最大的一次重构, 历时一年多开发,PHP最大的性能提升版本)
想要鸟哥最近的的两个演讲PPT,可以可以戳下面的链接:
配置PHP7达到更高性能: http://www.slideshare.net/laruence/php7-for-its-best-performance
PHP的历史: http://www.slideshare.net/laruence/a-history-of-php
当然不推荐这两种方式。
]]>使用Ajax递交表单,体验会更好。数据提交页面不会闪屏;页面局部更新速度快;网络带宽占用低。
传统模式下,表单提交整个页面重绘,为了维持页面用户对表单的状态改变,要多写不少代码。 要在控制器和模板之间传递更多参数以保持页面状态。而AJAX不然,数据提交页面不会白屏,因为页面只是局部更新, 不关心也不会影响页面其他部分的内容。
]]>最早看到UCloud的影子是在一个开源社区,印象最深刻的就是那个简洁的Logo。当时还在学校,对云计算这个概念不是很清楚,使用过一些产品后,才知道云计算的强大之处——成本低 · 安全 · 方便。
随着云计算的发展,各大互联网巨头都提供有云服务,而UCloud是一家非常专业的云计算服务商,说其专业,是因为UCloud只专注于云计算,比如典型的云服务器、云数据库等。
还记得电影《诺亚方舟:创世之旅》和《2012》里面的诺亚方舟么?其作用是保留物种不被灭绝。在计算机领域,数据就等同于物种,是非常重要的。数据方舟是UCloud近期提供的数据备份服务,目前还处于内测阶段,我有幸提前进行了试用。
数据方舟支持手工备份和秒级备份服务。从使用感受上来说,秒级备份是亮点。各大互联网厂商都提供的云服务一般都支持手动备份(创建镜像),但是大多忽略了实时备份,然而只有实时备份才更能保证数据的完整性,秒级备份服务正是基于这点诞生的。
在Ucloud上创建云主机,目前只有标准版的云主机支持数据方舟服务,SSD高性能版、网络增强机型暂时不支持数据方舟服务,相信Ucloud很快会全方位支持。
在最后一步备份方案中后面打勾,才能开启这台主机的数据方舟服务。
既然数据方舟是用来备份数据的,所以刚开始我在云主机上做了一个WEB服务配置,使用了LNMP架构(Linux + Nginx + MySQL + PHP),将MySQL的data目录放在数据盘中(/data/mysql/),同时安装了一个流行的php框架Laravel,也放在数据盘中(/data/www/)。
下面是部署在该云主机上的WEB程序,为了使测试更直观,为该Web程序配置了二级域名。
OK!既然系统环境和程序部署完成,就可以开始测试数据方舟的功能了。
手动备份数量上限:系统盘和数据盘各三份,如果多于三个的话,需要先把以前的一份备份删除,才能继续创建备份。
我的个人认知是这样的,这里的手动备份相当于各大云厂商提供的镜像服务,手动备份的最大特点是灵活性高,适用于各种备份场景,在应用进行重大迭代之前进行手动备份是非常有必要的。
等待了大概5秒钟系统盘和数据盘备份成功。
接下来我们可以先把Web应用的数据库删除了,看看效果。
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| laraveltest |
| mysql |
| performance_schema |
+——————–+
4 rows in set (0.00 sec)mysql> drop database laraveltest;
Query OK, 6 rows affected (0.01 sec)
现在来访问web主页,由于我使用Debug模式,页面会显示出这样的提示,意思是找不到数据库laraveltest。
PDOException in Connector.php line 47:
SQLSTATE[HY000] [1049] Unknown database ‘laraveltest’
好吧,接下来对数据盘进行恢复,来尝试一下找回我刚才弄丢的数据。需要有一点注意的是,可以在开机状态下备份,但是不能在开机状态下还原数据,需要将主机关闭后进行恢复,以保证数据的准确性。
关闭主机,选择按备份恢复,对我们刚才的备份的数据盘进行恢复。
数据盘恢复比较快,1分钟左右就会好了,然后启动服务器。查看Web主页,显示正常。查看数据库,刚才被删除的laraveltest数据库已经恢复正常。
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| laraveltest |
| mysql |
| performance_schema |
+——————–+
4 rows in set (0.00 sec)
我认为秒级恢复是数据方舟最赞的部分,一是因为其开发技术要求肯定要高,二是可以给使用人员带来不少的便捷。秒级服务提供的具体内容如下:
由于我上周就进行了使用,所以这里积攒了些秒级备份的数据。
接下来把系统盘和数据盘都恢复到三天前,看看当时的Web界面是什么样子的。
关闭主机——>恢复——>按备份恢复
经过4分钟,系统盘和数据盘全部还原成功,开机,来一睹三天前的Web界面吧(Laravel的初始化界面)。
这个时候,如果我使用rm把 整个磁盘删除了,还不能不能恢复成功呢?再次选择使用秒级备份,把数据恢复到今天中午时刻,观测一下是否能够成功。
[root@10-10-31-119 ~]# rm -rf / --no-preserve-root
尽管有Ucloud的数据方舟,但当我rm整个磁盘的时候,脑袋还是嗡的一下,有点晕,原谅我的承受力有点低吧(主要以前丢数据丢的有点怕了)。现在将服务器断电(由于删除了整个系统,无法正常关机),使用秒级备份,把数据恢复到今天中午13:03:34(随机敲的)
… … … 这次恢复花的时间稍微长点,用了15分钟。迫不及待的打开Web,观测一下,谢天谢地,一切正常。
对数据方舟的测试,断断续续用了一周的时间,在这个过程中,与数据方舟的研发人员进行过沟通,对数据方舟这款产品有了一定的理解,并且就一些细节问题进行反馈,发现数据方舟的研发团队的执行力相当高,很多问题都会当天解决,向数据方舟的研发团队致敬。下面是我对数据方舟这款产品的总结。
灵活的手动备份 + 秒级的自动备份
手动备份适用于各种场景,灵活方便。但是在一些时候手贱地误删了一些东西,而上次手动备份到刚才之间的时间段,增加存在一些很重要的数据,如果使用手动备份,会将这段时间的数据丢掉,我们可以使用秒级备份恢复到误操作的前几秒,既避免了数据的丢失,还解决的手贱造成的问题,相当吃了一次后悔药。
在线实时备份,不需要暂停业务
刚才使用了手动备份和秒级备份进行恢复系统数据,在备份过程中,没有需要对机器进行任何暂停应用的操作,也没有造成应用的任何不适,这样的方式大大的简化了业务备份的难题,进一步可以降低互联网创业人员的难度。
控制台操作
一旦服务器应用出问题,即便不是专业的运维人员,也能通过控制台将应用恢复到最近没有出错的时刻(得益于超赞的自动备份)。