简要说明语义化版本号的具体用法

版本格式:主版本号.次版本号.修订版本号,版本号递增规则如下 主版本号:当你做了不兼容的 API 修改, 次版本号:当你做了向下兼容的功能性新增, 修订版本号:当你做了向下兼容的问题修正。 先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。 具体要求 必须包含公共API,定义在代码或文档中。 格式必须是 X.Y.Z。 非负,从0开始。 每次代码修改必须调整版本号。 主版本号为0时(0.Y.Z) 为开发阶段,可随意修整代码。 1.0.0 是公共API的起始版本号。 修订版本号为修复BUG递增版本号,向后兼容。 新增功能后次版本号增长。必须保证向后兼容。修订版本号归零。 新增不能向后兼容的功能后,主版本号增长,次版本号及修订版本号归零。 先行版本号,即已发布非正式的版本号标注。必须从1.0.0开始。 在版本号后以-a.a...的形式追加。 a 可为字母单词数字横杠(-), 不可为空。范例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。 版本编译信息追加。在先行版本号以+b.b...的形式追加。 b可为字母单词数字横杠(-), 不可为空。范例:1.0.0-alpha+001、1.0.0+20130313144700、1.0.0-beta+exp.sha.5114f85。 版本优先级。 从左到右依次比较。先行版本号及版本编译信息的比较中以.切割比较,有编号高于无编号,字母编号高于编号数字。范例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0。 基于官方文档2.0.0版本翻译解释 文档地址: http://semver.org/

October 25, 2016 · 1 min · 47 words · Eric Yang

PSR标准解读 - PHP进阶 (2)

PSR-0 自动加载的标准结构 (虽然已不被推荐使用,但composer还在支持) 要点 结构: \<Vendor Name>\(<Namespace>\)*<Class Name> 第一层级的命名为开发人员的标识 完整的命名空间可包含多个层级 在加载文件的时候,命名空间的分隔符\会被DIRECTORY_SEPARATOR替换 类名中的_会被DIRECTORY_SEPARATOR替换,所以_无任何意义 在加载文件的时候,命名空间会补全.php后缀 命名空间及类命名可以大小写随意 示例: \Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php \namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php 需要注意的是,层级目录会重复vendor和namespace。 加载器的实现示例 <?php function autoload($className) { $className = ltrim($className, '\\'); $fileName = ''; $namespace = ''; if ($lastNsPos = strrpos($className, '\\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; require $fileName; } spl_autoload_register('autoload'); ### PSR-1 基本代码样式 * 标签 (PHP tags) 代码必须包含在<?...

October 3, 2016 · 2 min · 268 words · Eric Yang

《沙郡年记》读书笔记

只有那些不会抬头仰望天空,不会侧耳倾听雁鸣的人,才会认为三月的早晨是如此单调乏味。 – 三月大雁归来 贫瘠的沙土和微弱的阳光无法让它绽放出更大更好的花朵来,然而对于葶苈来说已经足够。毕竟。葶苈算不上春之花,而仅仅是对希望的一种补充。 – 四月 潮水来临 空中之舞的戏剧每晚都在数百个农场上演,农场的主人却叹息说缺乏娱乐,他们错误地认为:可供消遣的文娱活动只有在剧院里才能找到。这些人生活在土地上,却不懂如何依靠土地快乐地生活。 – 四月 潮水来临 我思索起鳟鱼和人的行为方式。我们是多么像鱼,时刻准备着,热切渴望着,想要抓住周遭环境之风吹落到事件之流殇到所有新东西。当我们发现那看似美妙的诱饵内藏着钓钩时,又是多么懊悔自己的仓促和草率!尽管如此,我仍认为渴望本身有一定的价值,不论渴望的对象时真实还是虚幻。 – 六月 钓鱼田园诗 创造通常仅限于神与诗人,但是如果知道方法,即或是身价卑微的普通百姓也可以绕开这一规章的限制。例如,要种植一棵松树,既不需要成为神灵也不需要成为诗人,需要的仅仅是拥有一把铲子,有了这样奇妙的规章漏洞,任何一个庄稼汉都可以说:要有个棵树,于是就有了一棵树。 – 十二月 家园的范围 为了找到所爱,它们(旅鸽)只需要自由的天空,以及用力挥动翅膀的意愿。 – 威斯康星州 良好的嗜好可能是对于庸常事物的孤独反抗,也可能是志趣相投的一群人共同进行的合谋。 – 闲暇时间 人类乘坐着顺环河而下的原木,明智审慎地去除一些树节,从而控制原木的方向和速度。这一技艺使我们获得了“智者”这种特别的称谓。去除树节的技巧被称为经济学,对于古老路途的记忆被称为历史,对于新路线的选择被称为治国才能,关于即将到来的浅滩或急流的交谈被称为政治。一些人不仅想除掉所有原木的树节,而且想改造整条河流中的原木船队。这种集体进行的与自然的对话被称为国家计划。 – 环河 能否看出荒野的文化价值,归根结底在于人类思想上的谦卑态度。肤浅无知、不再植根于土地的现代人,自以为已经发现了重要的东西,空谈着自认可以延续千年的政治或经济帝国。而只有真正的学者才明白,历史是由单一起点展开的连续旅程构成的,人类一次次回到这出发点,由此再次上路,寻求另一套永恒的价值观。 – 荒野

August 5, 2016 · 1 min · 31 words · Eric Yang

常规用法 - PHP进阶 (1)

命名空间 Namespace (PHP 5.3+) 沙盒机制。虚拟的层级关系,更好的隔离不同的组建。PS:以下仅为推荐用法。 声明、引用、别名 (Declear, Import, Alias) 声明: <?php // 必须在首行,推荐保持每个命名空间一行 namespace Symfony\Component\HttpFoundation; 引用 & 别名 // 推荐保持每个引用一行 Class <?php // 引用 use Symfony\Component\HttpFoundation\Response; $response = new Response('Oops', 400); $response->send(); // 别名 use Symfony\Component\HttpFoundation\Response as Res; $r = new Res('Oops', 400); $r->send(); ### Function (PHP 5.6+) <?php // 引用 use function My\Full\functionName; // 别名 use function My\Full\functionName as func; ### Constant // 引用 use const My\Full\CONSTANT; ### PHP 7+ code use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC}; ### 全局命名空间 * 引用时不加入命名空间,程序默认为与当前命名空间相同 * 没有命名空间的程序,默认在global下,例如Exception。使用时需要在前边加上"...

August 1, 2016 · 3 min · 430 words · Eric Yang

《金刚经说什么》读书笔记

先把做人的道理完成,再来搞这个学佛的事。但是既然要学佛了,千万要注意不住于相四个字;一住相,什么都学不成了。 福慧双修。智慧具足,福德具足。《金刚经》告诉你,真正的福德要怎样修呢?就是不住相布施。 – 第五品

July 1, 2016 · 1 min · 4 words · Eric Yang

优化配置 Nginx 和 PHP-FPM

nginx server_tokens off; hide nginx server tokens access_log off; reduce nginx write to disk times worker_processes 1; always equals grep processor /proc/cpuinfo | wc -l worker_connections 4096; ulimit -n will echo the max connection of server. client_body_buffer_size 32K; This handles the client buffer size, meaning any POST actions sent to Nginx. client_header_buffer_size 10k; large_client_header_buffers 4 32k; client_max_body_size 50m; Gzip Compression Gzip can help reduce the amount of network transfer Nginx deals with....

September 10, 2015 · 2 min · 367 words · Eric Yang

收集一些常用的 JS 和 CSS 库

Shape of CSS Shapes includes : Circle, Rectangle, Star(5-points), etc. facebook/flux Application Architecture for Building User Interfaces hapijs/boom HTTP-friendly error objects koajs/koa Expressive middleware for node.js using generators josdejong/jsoneditor A web-based tool to view, edit, format, and validate JSON No9/harmon middleware for node-http-proxy to modify the remote website response with trumpet nodejitsu/node-http-proxy A full-featured http proxy for node.js faisalman/ua-parser-js UAParser.js - Lightweight JavaScript-based User-Agent string parser. Supports browser & node.js environment....

February 2, 2015 · 1 min · 81 words · Eric Yang

使用Supervisor来守护Laravel Queue进程

安装Supervisor sudo apt-get install supervisor 编辑Queue守护进程 sudo vi /etc/supervisor/conf.d/myqueue.conf [program:myqueue] command = php artisan queue:work --env=production --queue=queue1,queue2 user = www-data directory = /path/to/app/ process_name = %(program_name)s_%(process_num)s numprocs = 6 autostart = true autorestart = true stdout_logfile = /path/to/app/app/storage/logs/supervisor-pd-queue.log stdout_logfile_maxbytes = 10MB stderr_logfile = /path/to/app/app/storage/logs/supervisor-pd-queue.log stderr_logfile_maxbytes = 10MB 启动进程 $ sudo supervisorctl > reread # Tell supervisord to check for new items in /etc/supervisor/conf.d/ > add myqueue # Add this process to Supervisord > start myqueue # May say “already started” 查看进程是否启动 $ ps aux | grep php

January 14, 2015 · 1 min · 87 words · Eric Yang

创建GIT服务器

添加git 用户 sudo adduser git 创建authorized_keys,用于认证用户 su git cd mkdir .ssh && chmod 700 .ssh touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys 添加认证用户公钥 在本地执行 cat .ssh/id_rsa.pub | ssh git@git-server 'cat >> .ssh/authorized_keys' 创建git repo cd /opt/git mkdir project.git cd project.git git init --bare 输出信息: Initialized empty Git repository in /opt/git/project.git/ 远程repo地址 git@git-server:/opt/git/project.git

January 13, 2015 · 1 min · 51 words · Eric Yang

Linux服务器安全设置

翻译自Linode: Securing Your Server 以下配置环境为: 本地: Mac OS X 服务器: Ubuntu 14.04 添加用户,并将其加入sudo组 例如增加webapps用户,并将其加入webapps用户组: ssh root@<your-service-ip> // 使用root登录服务器 groupadd webapps // 创建webapps用户组 useradd -m -g webapps -s /bin/bash webapps -m 创建home根目录 -g 指定用户组 -s 指定使用的bash sudo usermod -aG sudo webapps -G 附加用户组 在本地创建并使用SSH key认证登录服务器 生成密钥 ssh-keygen -t rsa -C "your_email@example.com" 避免在每次登录的时候每次都需要输入passphrase eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa 上传至服务器 使用webapps登录服务器,并执行mkdir ~/.ssh && touch ~/.ssh/authorized_keys创建空文件authorized_keys用于存放公钥 在本地执行cat ~/.ssh/id_rsa.pub | ssh webapps@<your-server-ip> 'cat >> .ssh/authorized_keys' 禁止root用户密码登录 sudo vi /etc/ssh/sshd_config 修改 PermitRootLogin yes 为 PermitRootLogin without-password sudo service ssh restart 重启ssh服务 创建防火墙 创建文件 /etc/iptables....

December 26, 2014 · 2 min · 311 words · Eric Yang