<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.7.3">Jekyll</generator><link href="http://me.oadoc360.com/atom.xml" rel="self" type="application/atom+xml" /><link href="http://me.oadoc360.com/" rel="alternate" type="text/html" /><updated>2018-07-20T12:47:11+00:00</updated><id>http://me.oadoc360.com/</id><title type="html">夜行者之路</title><subtitle>曾经梦想仗剑走天涯，后来因为加班太多放弃</subtitle><author><name>gangmu</name></author><entry><title type="html">Http Code 408</title><link href="http://me.oadoc360.com/2018/07/20/HTTP-CODE-408.html" rel="alternate" type="text/html" title="Http Code 408" /><published>2018-07-20T00:00:00+00:00</published><updated>2018-07-20T00:00:00+00:00</updated><id>http://me.oadoc360.com/2018/07/20/HTTP-CODE-408</id><content type="html" xml:base="http://me.oadoc360.com/2018/07/20/HTTP-CODE-408.html">&lt;p&gt;根据rfc介绍
6.5.7.  408 Request Timeout&lt;/p&gt;

&lt;p&gt;The 408 (Request Timeout) status code indicates that the server did
   not receive a complete request message within the time that it was
   prepared to wait.  A server SHOULD send the “close” connection option
   (Section 6.1 of [RFC7230]) in the response, since 408 implies that
   the server has decided to close the connection rather than continue
   waiting.  If the client has an outstanding request in transit, the
   client MAY repeat that request on a new connection.
    408（请求超时）状态代码表示服务器在它准备等待的时间内没有收到完整的请求消息。
    服务器应该在响应中发送“关闭”连接选项（[RFC7230]的第6.1节），因为408意味着
   服务器决定关闭连接而不是继续等候。如果客户在途中有未完成的请求，那么客户端可以在新连接上重复该请求。&lt;/p&gt;

&lt;p&gt;您的 Web 服务器认为，在 1 ）建立客户端和服务器之间 IP 连接（套解字 - socket ）， 和 2 ）通过该套解字收到数据，之间的时间间隔太长，
所以服务器放弃该连接。 套接字连接实际上已失效 - 您的 Web 服务器已就对该特定套接字连接发出 ‘ 超时 ‘ 信号。客户端的请求必须及时重复。&lt;/p&gt;

&lt;p&gt;HTTP 循环中的 408 错误
任何客户端在和您的网络服务器通讯时，都需经过以下循环：&lt;/p&gt;

&lt;p&gt;从您站点的 IP 名称 ( 即您的网页地址 - URL, 不带起始的 ‘http://’) 获得一个 IP 地址。这个对应关系 ( 即由 IP 名称向 IP 地址转换的对应关系 ) 由域名服务器 (DNSs) 提供。
打开一个 IP socket ( 套接字 ) 连接到该 IP 地址。
通过该 socket 写 HTTP 数据流。
从您的网络服务器接受响应的 HTTP 数据流。该数据流包括状态编码， 其值取决于 HTTP 协议 。 解析 该数据流得到 状态编码 和其他有用信息。
该错误在以上所述的最后一步生成，即当客户端收到 HTTP 状态编码 并识别其为 ‘408’ 时。&lt;/p&gt;

&lt;p&gt;http://www.checkupdown.com/status/E408_zh.html
https://tools.ietf.org/html/rfc7230#section-6.1
https://tools.ietf.org/html/rfc7231#section-6.5.7&lt;/p&gt;</content><author><name>gangmu</name></author><summary type="html">根据rfc介绍 6.5.7. 408 Request Timeout</summary></entry><entry><title type="html">SSH命令实例</title><link href="http://me.oadoc360.com/linux/2018/04/17/SSH%E5%91%BD%E4%BB%A4%E5%AE%9E%E4%BE%8B.html" rel="alternate" type="text/html" title="SSH命令实例" /><published>2018-04-17T08:54:05+00:00</published><updated>2018-04-17T08:54:05+00:00</updated><id>http://me.oadoc360.com/linux/2018/04/17/SSH%E5%91%BD%E4%BB%A4%E5%AE%9E%E4%BE%8B</id><content type="html" xml:base="http://me.oadoc360.com/linux/2018/04/17/SSH%E5%91%BD%E4%BB%A4%E5%AE%9E%E4%BE%8B.html">&lt;p&gt;连接服务器最常用命令&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ssh -i ~/.ssh/mySshPkey developer@192.168.1.237 -p 22&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;指定私钥，免密码登录服务器，指定特殊端口，&lt;/p&gt;

&lt;p&gt;有的时候需要借助一个ssh连接做代理来连接到另一个服务器&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ssh -o &quot;ProxyCommand ssh -p 22 developer@192.168.1.237 -A -W %h:%p&quot;  -i ~/.ssh/mySshPkey developer@192.168.1.236&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果ProxyCommand帮不了你，那我们还可以考虑编写expect脚本做复杂到连接逻辑&lt;/p&gt;

&lt;p&gt;参考
http://wangchujiang.com/linux-command/c/ssh.html
https://www.ktanx.com/blog/p/4016
https://blog.csdn.net/pipisorry/article/details/52269785
https://linux.cn/article-3858-1.html
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
http://os.51cto.com/art/201011/235252.htm
https://linux.cn/article-3858-1.html&lt;/p&gt;</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><category term="Linux" /><category term="SSH" /><summary type="html">连接服务器最常用命令</summary></entry><entry><title type="html">Golang 项目部署方案总结</title><link href="http://me.oadoc360.com/golang/2018/04/17/Golang-%E9%A1%B9%E7%9B%AE%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88%E6%80%BB%E7%BB%93.html" rel="alternate" type="text/html" title="Golang 项目部署方案总结" /><published>2018-04-17T08:54:05+00:00</published><updated>2018-04-17T08:54:05+00:00</updated><id>http://me.oadoc360.com/golang/2018/04/17/Golang-%E9%A1%B9%E7%9B%AE%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88%E6%80%BB%E7%BB%93</id><content type="html" xml:base="http://me.oadoc360.com/golang/2018/04/17/Golang-%E9%A1%B9%E7%9B%AE%E9%83%A8%E7%BD%B2%E6%96%B9%E6%A1%88%E6%80%BB%E7%BB%93.html">&lt;p&gt;常用的 Golang web/api 项目部署方案有4种&lt;br /&gt;
1. nohup xxx &amp;&lt;br /&gt;
2. supervisord&lt;br /&gt;
3. nginx proxy&lt;br /&gt;
4. apache proxy&lt;br /&gt;
可以参考beego的文档 https://beego.me/docs/deploy/&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;然而我们可以换一种思路，以软件的形式部署，流程如下：&lt;br /&gt;
1. Go打包为特定版本的rpm，版本号自增,rpm包包含打包的可执行程序、配置、service脚本&lt;br /&gt;
2. 推到内部yum仓库，yum仓库索引更新&lt;br /&gt;
3. 目标机执行 yum update xxx&lt;br /&gt;
4. 目标机yum update执行结束时触发Service xxx-server reload&lt;/p&gt;</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><category term="Golang" /><category term="go" /><category term="deploy" /><summary type="html">常用的 Golang web/api 项目部署方案有4种 1. nohup xxx &amp; 2. supervisord 3. nginx proxy 4. apache proxy 可以参考beego的文档 https://beego.me/docs/deploy/ 然而我们可以换一种思路，以软件的形式部署，流程如下： 1. Go打包为特定版本的rpm，版本号自增,rpm包包含打包的可执行程序、配置、service脚本 2. 推到内部yum仓库，yum仓库索引更新 3. 目标机执行 yum update xxx 4. 目标机yum update执行结束时触发Service xxx-server reload</summary></entry><entry><title type="html">Laravel依赖注入深入浅出</title><link href="http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/laravel/2018/03/28/laravel-e4-be-9d-e8-b5-96-e6-b3-a8-e5-85-a5-e6-b7-b1-e5-85-a5-e6-b5-85-e5-87-ba.html" rel="alternate" type="text/html" title="Laravel依赖注入深入浅出" /><published>2018-03-28T09:46:31+00:00</published><updated>2018-03-28T09:46:31+00:00</updated><id>http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/laravel/2018/03/28/laravel%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA</id><content type="html" xml:base="http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/laravel/2018/03/28/laravel-e4-be-9d-e8-b5-96-e6-b3-a8-e5-85-a5-e6-b7-b1-e5-85-a5-e6-b5-85-e5-87-ba.html">&lt;p&gt;我们在开始用Laravel时会大量用到依赖注入，由于框架做了很多工作，所以可以方便的依赖绑定和自动注入。&lt;br /&gt;
具体的写代码时参考文档的&amp;ldquo;服务容器&amp;rdquo;实例代码就能快速上手。但是依赖注入到底是什么？&lt;/p&gt;
&lt;p&gt;依赖注入是一种设计模式。&lt;br /&gt;
《设计模式：可复用面向对象软件的基础》（Design Patterns: Elements of Reusable Object-Oriented Software）是软件工程领域有关软件设计的一本书，提出和总结了对于一些常见软件设计问题的标准解决方案，称为软件设计模式。该书作者为：埃里希&amp;middot;伽玛（Erich Gamma）, Richard Helm , Ralph Johnson，John Vlissides，后以&amp;ldquo;四人帮&amp;rdquo;（Gang of Four，GoF）著称。&lt;br /&gt;
设计模式一般指本书中提出的3大类（创建模式、行为模式、组合模式）共23种经典的可以解决常见软件设计问题的可复用设计方案。https://www.zhihu.com/question/19558521&lt;br /&gt;
在2004年，Martin Fowler提出了&amp;ldquo;哪些方面的控制被反转了？&amp;rdquo;这个问题。&lt;br /&gt;
另外 SOLID（单一功能、开闭原则、里氏替换、接口隔离以及依赖倒置）是由罗伯特&amp;middot;C&amp;middot;马丁在2009年引入的术语，指代了面向对象编程和面向对象设计的五个基本原则。&lt;/p&gt;
&lt;p&gt;依赖倒置原则规定：&lt;br /&gt;
高层次的模块不应该依赖于低层次的模块，两者都应该依赖于抽象接口。&lt;br /&gt;
抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。&lt;/p&gt;
&lt;p&gt;控制反转（Inversion of Control，缩写为IoC），是面向对象编程中的一种设计原则，可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入（Dependency Injection，简称DI），还有一种方式叫&amp;ldquo;依赖查找&amp;rdquo;（Dependency Lookup）。通过控制反转，对象在被创建的时候，由一个调控系统内所有对象的外界实体，将其所依赖的对象的引用传递给它。也可以说，依赖被注入到对象中。&lt;/p&gt;
&lt;p&gt;为了实现自动注入，在PHP中可以使用反射实现一个IoC容器，Laravel就是这么做的。&lt;/p&gt;
&lt;p&gt;https://segmentfault.com/a/1190000002424023&lt;/p&gt;</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><category term="Laravel" /><category term="Laravel" /><category term="IoC" /><summary type="html">我们在开始用Laravel时会大量用到依赖注入，由于框架做了很多工作，所以可以方便的依赖绑定和自动注入。 具体的写代码时参考文档的&amp;ldquo;服务容器&amp;rdquo;实例代码就能快速上手。但是依赖注入到底是什么？ 依赖注入是一种设计模式。 《设计模式：可复用面向对象软件的基础》（Design Patterns: Elements of Reusable Object-Oriented Software）是软件工程领域有关软件设计的一本书，提出和总结了对于一些常见软件设计问题的标准解决方案，称为软件设计模式。该书作者为：埃里希&amp;middot;伽玛（Erich Gamma）, Richard Helm , Ralph Johnson，John Vlissides，后以&amp;ldquo;四人帮&amp;rdquo;（Gang of Four，GoF）著称。 设计模式一般指本书中提出的3大类（创建模式、行为模式、组合模式）共23种经典的可以解决常见软件设计问题的可复用设计方案。https://www.zhihu.com/question/19558521 在2004年，Martin Fowler提出了&amp;ldquo;哪些方面的控制被反转了？&amp;rdquo;这个问题。 另外 SOLID（单一功能、开闭原则、里氏替换、接口隔离以及依赖倒置）是由罗伯特&amp;middot;C&amp;middot;马丁在2009年引入的术语，指代了面向对象编程和面向对象设计的五个基本原则。 依赖倒置原则规定： 高层次的模块不应该依赖于低层次的模块，两者都应该依赖于抽象接口。 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。 控制反转（Inversion of Control，缩写为IoC），是面向对象编程中的一种设计原则，可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入（Dependency Injection，简称DI），还有一种方式叫&amp;ldquo;依赖查找&amp;rdquo;（Dependency Lookup）。通过控制反转，对象在被创建的时候，由一个调控系统内所有对象的外界实体，将其所依赖的对象的引用传递给它。也可以说，依赖被注入到对象中。 为了实现自动注入，在PHP中可以使用反射实现一个IoC容器，Laravel就是这么做的。 https://segmentfault.com/a/1190000002424023</summary></entry><entry><title type="html">PHPUnit: Exception: Serialization of “Closure” is not allowed</title><link href="http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/phpunit/2018/01/08/phpunit-exception-serialization-of-closure-is-not-allowed.html" rel="alternate" type="text/html" title="PHPUnit: Exception: Serialization of &quot;Closure&quot; is not allowed" /><published>2018-01-08T08:21:03+00:00</published><updated>2018-01-08T08:21:03+00:00</updated><id>http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/phpunit/2018/01/08/phpunit-exception-serialization-of-closure-is-not-allowed</id><content type="html" xml:base="http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/phpunit/2018/01/08/phpunit-exception-serialization-of-closure-is-not-allowed.html">&lt;p&gt;用phpstorm测试laravel程序的时候发现单独执行phpunit命令可以把所有测试用例都跑一遍，而单独指定某个测试文件，某个测试方法则报错。百思不得其解。今天终于下决心查一下。&lt;/p&gt;
&lt;p&gt;基本上是因为你的全局变量中, 包含了闭包. PHPUnit 在执行过程中会对全局变量进行序列化备份, 而PHP 自身的机制限制了序列化对闭包(Closure)的操作. 因此只要禁用序列化全局变量好了.&lt;/p&gt;
&lt;p&gt;执行的时候加上&lt;code&gt;phpunit --no-globals-backup xxx&lt;/code&gt;参数&lt;/p&gt;
&lt;p&gt;或者在phpunit.xml配置文件里加上&lt;code&gt;backupGlobals=&quot;false&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;引用：&lt;br /&gt;
https://xwsoul.com/posts/1137&lt;br /&gt;
https://github.com/sebastianbergmann/phpunit/issues/451&lt;br /&gt;
https://github.com/kenjis/ci-phpunit-test/issues/90&lt;br /&gt;
https://stackoverflow.com/questions/33477923/phpunit-tests-from-code-gives-exception-serialization-of-closure-is-not-allow&lt;/p&gt;</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><category term="PHPUnit" /><category term="PHPUnit" /><summary type="html">用phpstorm测试laravel程序的时候发现单独执行phpunit命令可以把所有测试用例都跑一遍，而单独指定某个测试文件，某个测试方法则报错。百思不得其解。今天终于下决心查一下。 基本上是因为你的全局变量中, 包含了闭包. PHPUnit 在执行过程中会对全局变量进行序列化备份, 而PHP 自身的机制限制了序列化对闭包(Closure)的操作. 因此只要禁用序列化全局变量好了. 执行的时候加上phpunit --no-globals-backup xxx参数 或者在phpunit.xml配置文件里加上backupGlobals=&quot;false&quot; 引用： https://xwsoul.com/posts/1137 https://github.com/sebastianbergmann/phpunit/issues/451 https://github.com/kenjis/ci-phpunit-test/issues/90 https://stackoverflow.com/questions/33477923/phpunit-tests-from-code-gives-exception-serialization-of-closure-is-not-allow</summary></entry><entry><title type="html">2017年总结</title><link href="http://me.oadoc360.com/2017/12/31/my-2017.html" rel="alternate" type="text/html" title="2017年总结" /><published>2017-12-31T16:00:00+00:00</published><updated>2017-12-31T16:00:00+00:00</updated><id>http://me.oadoc360.com/2017/12/31/my-2017</id><content type="html" xml:base="http://me.oadoc360.com/2017/12/31/my-2017.html">&lt;ul&gt;
  &lt;li&gt;调到web前端组，在邢岩手下做事，飞凡JS工程师，业务主要分App内H5和商户后台管理系统，，基于angular 1.5+开发了fancyUI。&lt;/li&gt;
  &lt;li&gt;nodejs上手，辅助前端同学搭建开发脚手架部分。&lt;/li&gt;
  &lt;li&gt;在webpack打包方面，通篇阅读webpack文档和插件，优化配置参数，引入并行化组件，将webpack打包时间缩短到之前的1/5。&lt;/li&gt;
  &lt;li&gt;跟帅鑫配合搭建了前端性能监控分析平台，利用现代浏览器提供的JS API采集用户访问页面的加载时间等数据，分页面在后台统计后绘制成图表展示。&lt;/li&gt;
  &lt;li&gt;17年上半年，微风系统——穿云项目前期子项目之一，这个系统可以在后端收集到2000多台线上服务器的linux 操作日志、F5、路由器、交换机的操作日志。&lt;/li&gt;
  &lt;li&gt;17年中旬，重新接手php项目，发现DevOps的价值，人难免出错，所以给你出错的机会，也给程序一个机会告诉你你出错了，给程序一个机会自动恢复正常。我们在程序外围增加守护进程，我们在程序内增加报警日志，在程序外围增加报警监控。&lt;/li&gt;
  &lt;li&gt;学习了解DevOps知识。我们希望各种数据都能在远端通过web界面看到，于是有了kafka生产消费监控、有了redis指标监控、mysql指标监控、机器指标监控等。kibana、grafana、zabbix等。&lt;/li&gt;
  &lt;li&gt;学习Go语言，在gitchat上发表话题《私有仓库搭建指南》《Go类型转换》&lt;/li&gt;
  &lt;li&gt;9月，离开飞凡进入影合众。介绍引入molten，搭建了walle部署系统替换jenkins，节省大量部署时间，原来一个项目部署要花10分钟，现在只用20秒。&lt;/li&gt;
  &lt;li&gt;在项目上将原来在php5.3运行的扩展升级到支持php5.6并且做好了编译脚本和文档，这样以后升级更高版本的php也做好了准备，发表了《php内存泄露治理》gitchat&lt;/li&gt;
  &lt;li&gt;年底正在撰写gitchat《TDD开发：gitlab、jenkins、sonar碰撞火花》，免费发布。&lt;/li&gt;
  &lt;li&gt;分享inception - mysql审计及秒及回滚的解决方案，从源码解析 mysql binlog2sql 回滚方案原理。&lt;/li&gt;
&lt;/ul&gt;</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><summary type="html">调到web前端组，在邢岩手下做事，飞凡JS工程师，业务主要分App内H5和商户后台管理系统，，基于angular 1.5+开发了fancyUI。 nodejs上手，辅助前端同学搭建开发脚手架部分。 在webpack打包方面，通篇阅读webpack文档和插件，优化配置参数，引入并行化组件，将webpack打包时间缩短到之前的1/5。 跟帅鑫配合搭建了前端性能监控分析平台，利用现代浏览器提供的JS API采集用户访问页面的加载时间等数据，分页面在后台统计后绘制成图表展示。 17年上半年，微风系统——穿云项目前期子项目之一，这个系统可以在后端收集到2000多台线上服务器的linux 操作日志、F5、路由器、交换机的操作日志。 17年中旬，重新接手php项目，发现DevOps的价值，人难免出错，所以给你出错的机会，也给程序一个机会告诉你你出错了，给程序一个机会自动恢复正常。我们在程序外围增加守护进程，我们在程序内增加报警日志，在程序外围增加报警监控。 学习了解DevOps知识。我们希望各种数据都能在远端通过web界面看到，于是有了kafka生产消费监控、有了redis指标监控、mysql指标监控、机器指标监控等。kibana、grafana、zabbix等。 学习Go语言，在gitchat上发表话题《私有仓库搭建指南》《Go类型转换》 9月，离开飞凡进入影合众。介绍引入molten，搭建了walle部署系统替换jenkins，节省大量部署时间，原来一个项目部署要花10分钟，现在只用20秒。 在项目上将原来在php5.3运行的扩展升级到支持php5.6并且做好了编译脚本和文档，这样以后升级更高版本的php也做好了准备，发表了《php内存泄露治理》gitchat 年底正在撰写gitchat《TDD开发：gitlab、jenkins、sonar碰撞火花》，免费发布。 分享inception - mysql审计及秒及回滚的解决方案，从源码解析 mysql binlog2sql 回滚方案原理。</summary></entry><entry><title type="html">省市县数据在程序中如何管理</title><link href="http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/2017/12/29/%E7%9C%81%E5%B8%82%E5%8E%BF%E6%95%B0%E6%8D%AE%E5%9C%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86.html" rel="alternate" type="text/html" title="省市县数据在程序中如何管理" /><published>2017-12-29T06:10:25+00:00</published><updated>2017-12-29T06:10:25+00:00</updated><id>http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/2017/12/29/%E7%9C%81%E5%B8%82%E5%8E%BF%E6%95%B0%E6%8D%AE%E5%9C%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86</id><content type="html" xml:base="http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/2017/12/29/%E7%9C%81%E5%B8%82%E5%8E%BF%E6%95%B0%E6%8D%AE%E5%9C%A8%E7%A8%8B%E5%BA%8F%E4%B8%AD%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86.html">&lt;p&gt;我们开发时可能会遇到需要存储xx数据对应的省市县信息，这个时候大家会考虑地名会改名，所以需要有一个映射表，通过id来对应一个地名，比如1山东 2山东济南 3山东济南xx区，然后还会考虑由于行政区划变更导致A地之前属于山东省，更新后属于江苏省，那么还需要记录地方的上级信息，只考虑三级数据那么可以用三个字段存，考虑多级可以用parentId一个字段来存。&lt;/p&gt;
&lt;p&gt;实际上我们应该以国家统计局发布的数据为准，他足够权威数据精准，更新频度不高，且id设计合理&lt;/p&gt;
&lt;p&gt;http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201703/t20170310_1471429.html&lt;/p&gt;
&lt;p&gt;6位编码如110105 表示北京市（市辖区）朝阳区每两位数为一级，前两位11表示北京市（省级），中间两位01表示北京市（市级），后两位05表示区县（县级）&lt;/p&gt;
&lt;p&gt;整理出id、name的表后如果有数据变更只需全量更新即可。除此之外还可以自定义省市简写、简称等功能以便满足实际业务需求。&lt;/p&gt;</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><summary type="html">我们开发时可能会遇到需要存储xx数据对应的省市县信息，这个时候大家会考虑地名会改名，所以需要有一个映射表，通过id来对应一个地名，比如1山东 2山东济南 3山东济南xx区，然后还会考虑由于行政区划变更导致A地之前属于山东省，更新后属于江苏省，那么还需要记录地方的上级信息，只考虑三级数据那么可以用三个字段存，考虑多级可以用parentId一个字段来存。 实际上我们应该以国家统计局发布的数据为准，他足够权威数据精准，更新频度不高，且id设计合理 http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201703/t20170310_1471429.html 6位编码如110105 表示北京市（市辖区）朝阳区每两位数为一级，前两位11表示北京市（省级），中间两位01表示北京市（市级），后两位05表示区县（县级） 整理出id、name的表后如果有数据变更只需全量更新即可。除此之外还可以自定义省市简写、简称等功能以便满足实际业务需求。</summary></entry><entry><title type="html">devOps 组合</title><link href="http://me.oadoc360.com/web%E6%8A%80%E6%9C%AF/2017/11/21/devops.html" rel="alternate" type="text/html" title="devOps 组合" /><published>2017-11-21T08:36:12+00:00</published><updated>2017-11-21T08:36:12+00:00</updated><id>http://me.oadoc360.com/web%E6%8A%80%E6%9C%AF/2017/11/21/devops</id><content type="html" xml:base="http://me.oadoc360.com/web%E6%8A%80%E6%9C%AF/2017/11/21/devops.html">&lt;p&gt;最近在忙devOps相关的工作。&lt;/p&gt;
&lt;p&gt;主要围绕：&lt;br /&gt;
1：walle 代码快速部署及回滚系统&lt;br /&gt;
2：inception Mysql数据库SQL审核、自动生成回滚SQL、自动执行上线、一键回滚等功能&lt;br /&gt;
3：sonar 代码静态分析&lt;br /&gt;
4：wrench 业务辅助工具：快速生成配置工具、快速查看实际价格生成原因工具等&lt;br /&gt;
5：jenkins 自动化测试、语法检查等&lt;/p&gt;
&lt;p&gt;有工具，业务开发效率提高，大家工作更有动力，这些工作就有他的价值。&lt;/p&gt;</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><summary type="html">最近在忙devOps相关的工作。 主要围绕： 1：walle 代码快速部署及回滚系统 2：inception Mysql数据库SQL审核、自动生成回滚SQL、自动执行上线、一键回滚等功能 3：sonar 代码静态分析 4：wrench 业务辅助工具：快速生成配置工具、快速查看实际价格生成原因工具等 5：jenkins 自动化测试、语法检查等 有工具，业务开发效率提高，大家工作更有动力，这些工作就有他的价值。</summary></entry><entry><title type="html">web开发常用程序安装提速指南</title><link href="http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/2017/05/15/web-e5-bc-80-e5-8f-91-e5-b8-b8-e7-94-a8-e7-a8-8b-e5-ba-8f-e5-ae-89-e8-a3-85-e6-8f-90-e9-80-9f-e6-8c-87-e5-8d-97.html" rel="alternate" type="text/html" title="web开发常用程序安装提速指南" /><published>2017-05-15T06:49:22+00:00</published><updated>2017-05-15T06:49:22+00:00</updated><id>http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/2017/05/15/web%E5%BC%80%E5%8F%91%E5%B8%B8%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%AE%89%E8%A3%85%E6%8F%90%E9%80%9F%E6%8C%87%E5%8D%97</id><content type="html" xml:base="http://me.oadoc360.com/%E6%9C%AA%E5%88%86%E7%B1%BB/2017/05/15/web-e5-bc-80-e5-8f-91-e5-b8-b8-e7-94-a8-e7-a8-8b-e5-ba-8f-e5-ae-89-e8-a3-85-e6-8f-90-e9-80-9f-e6-8c-87-e5-8d-97.html">&lt;p&gt;一、常用的通用方案我们再过一遍，VPN、HTTP/HTTPS代理、Socks5代理、IPv6&lt;br /&gt;
二、做php开发离不开composer&lt;br /&gt;
composer本身下载是个挺蛋疼的事，我做了一个windows版本的&lt;a href=&quot;https://github.com/php-cpm/composer-error/blob/master/README.md#php-56--composer-141&quot;&gt;composer安装包&lt;/a&gt;，linux、mac用户可以用包管理或者翻墙下载&lt;br /&gt;
三、mac用户必备的homebrew&lt;br /&gt;
第一步&lt;br /&gt;
&lt;code&gt;cd &quot;$(brew --repo)/Library/Taps/homebrew/homebrew-core&quot;&lt;br /&gt;
git remote set-url origin git://mirrors.ustc.edu.cn/homebrew-core.git&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
第二步&lt;br /&gt;
&lt;code&gt;echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' &gt;&gt; ~/.bash_profile&lt;br /&gt;
source ~/.bash_profile&lt;/p&gt;
&lt;p&gt;brew update&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
注意有的人用的zsh，要注意修改命令生效的文件&lt;br /&gt;
参考链接&lt;a href=&quot;https://www.zhihu.com/question/31360766&quot;&gt;https://www.zhihu.com/question/31360766&lt;/a&gt;&lt;br /&gt;
四、nodejs&lt;br /&gt;
淘宝给我们做了一件大好事&lt;br /&gt;
先安装nvm然后&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node&lt;br /&gt;
export NVM_IOJS_ORG_MIRROR=https://npm.taobao.org/mirrors/iojs&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
然后想安装哪个版本的nodejs、npm随便你&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
nvm install 7&lt;br /&gt;
nvm use 7&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
如果装了新版本的nodejs，以前装的全局npm包可以这么迁移过来&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
nvm install 7 --reinstall-packages-from=6&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
五、npm、yarn&lt;br /&gt;
搞nodejs、前端js开发的同学用的最多的就是npm和yarn&lt;br /&gt;
全局装一个nrm&lt;br /&gt;
&lt;code&gt;nrm use taobao&lt;/code&gt;&lt;br /&gt;
还可以直接去修改.npmrc&lt;br /&gt;
&lt;code&gt;# .npmrc&lt;br /&gt;
registry=https://registry.npm.taobao.org/&lt;br /&gt;
disturl=https://npm.taobao.org/dist&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
参考链接：http://zqlu.github.io/2016/05/10/taobao-nodejs-mirror/&lt;/p&gt;

&lt;br /&gt;
2017-06-06 add:  搭建私有仓库使用 verdaccio 
&lt;br /&gt;
verdaccio V3 已经发布了。</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><summary type="html">一、常用的通用方案我们再过一遍，VPN、HTTP/HTTPS代理、Socks5代理、IPv6 二、做php开发离不开composer composer本身下载是个挺蛋疼的事，我做了一个windows版本的composer安装包，linux、mac用户可以用包管理或者翻墙下载 三、mac用户必备的homebrew 第一步 cd &quot;$(brew --repo)/Library/Taps/homebrew/homebrew-core&quot; git remote set-url origin git://mirrors.ustc.edu.cn/homebrew-core.git 第二步 echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' &gt;&gt; ~/.bash_profile source ~/.bash_profile brew update 注意有的人用的zsh，要注意修改命令生效的文件 参考链接https://www.zhihu.com/question/31360766 四、nodejs 淘宝给我们做了一件大好事 先安装nvm然后 export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node export NVM_IOJS_ORG_MIRROR=https://npm.taobao.org/mirrors/iojs 然后想安装哪个版本的nodejs、npm随便你 nvm install 7 nvm use 7 如果装了新版本的nodejs，以前装的全局npm包可以这么迁移过来 nvm install 7 --reinstall-packages-from=6 五、npm、yarn 搞nodejs、前端js开发的同学用的最多的就是npm和yarn 全局装一个nrm nrm use taobao 还可以直接去修改.npmrc # .npmrc registry=https://registry.npm.taobao.org/ disturl=https://npm.taobao.org/dist 参考链接：http://zqlu.github.io/2016/05/10/taobao-nodejs-mirror/</summary></entry><entry><title type="html">php资深工程师必备知识</title><link href="http://me.oadoc360.com/php/2017/05/01/php-e8-b5-84-e6-b7-b1-e5-b7-a5-e7-a8-8b-e5-b8-88-e5-bf-85-e5-a4-87-e7-9f-a5-e8-af-86.html" rel="alternate" type="text/html" title="php资深工程师必备知识" /><published>2017-05-01T05:00:52+00:00</published><updated>2017-05-01T05:00:52+00:00</updated><id>http://me.oadoc360.com/php/2017/05/01/php%E8%B5%84%E6%B7%B1%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%BF%85%E5%A4%87%E7%9F%A5%E8%AF%86</id><content type="html" xml:base="http://me.oadoc360.com/php/2017/05/01/php-e8-b5-84-e6-b7-b1-e5-b7-a5-e7-a8-8b-e5-b8-88-e5-bf-85-e5-a4-87-e7-9f-a5-e8-af-86.html">&lt;p&gt;面试php资深工程师相信你已经在这个领域深入耕耘5年以上，有丰富的实践经验和知识深度广度。&lt;/p&gt;
&lt;p&gt;作为一个phper，你一定对php和Mysql熟悉的不能再熟悉了，那么必考的知识点有：&lt;br /&gt;
php的面向对象的知识、迭代器、协程、流&lt;br /&gt;
mysql的引擎区别、索引相关用法、升级mysql实践、安全相关、锁&lt;/p&gt;
&lt;p&gt;一般来说你至少还应该熟悉memcached、redis的一种&lt;br /&gt;
memcached的cas一致性分布式算法应该有所了解&lt;br /&gt;
redis的存储类型、用法、场景也应该门清，要是能把redis的二进制数据存储getbit、setbit搞明白可以加分，redis的备份机制有哪些？有没有看过源代码？&lt;/p&gt;
&lt;p&gt;nginx或Apache的相关知识&lt;/p&gt;
&lt;p&gt;php-fpm怎么管理php进程的？&lt;/p&gt;
&lt;p&gt;如何优化性能？如何debug？这些开放命题就是面试官结合自己的水平给你打分了，你要是能把他忽悠住那你的水平一定比他高&lt;/p&gt;
&lt;p&gt;就算你没了解也得知道php APC缓存、opcode cache吧，怎么实现的？&lt;/p&gt;
&lt;p&gt;队列是干什么的？实际应用中什么时候用？&lt;br /&gt;
用过什么队列？kafka、NSQ、RabbitMQ还有啥？&lt;/p&gt;
&lt;p&gt;然后再看看知识的广度&lt;/p&gt;
&lt;p&gt;其他的数据库有没有了解运用过？MongoDB有啥特点？为啥不该用MongoDB？ElasticSearch呢？&lt;/p&gt;
&lt;p&gt;linux相关业务场景的命令使用&lt;/p&gt;
&lt;p&gt;基础不再赘述，算法题好好刷一刷是必须的&lt;/p&gt;
&lt;p&gt;是否真正了解计算机原理？系统内核？编译原理？能否说明白进程、线程、协程？&lt;/p&gt;</content><author><name>{&quot;display_name&quot;=&gt;&quot;zouyi&quot;, &quot;login&quot;=&gt;&quot;zouyi&quot;, &quot;email&quot;=&gt;&quot;zoutommy@gmail.com&quot;, &quot;url&quot;=&gt;&quot;&quot;}</name><email>zoutommy@gmail.com</email></author><summary type="html">面试php资深工程师相信你已经在这个领域深入耕耘5年以上，有丰富的实践经验和知识深度广度。 作为一个phper，你一定对php和Mysql熟悉的不能再熟悉了，那么必考的知识点有： php的面向对象的知识、迭代器、协程、流 mysql的引擎区别、索引相关用法、升级mysql实践、安全相关、锁 一般来说你至少还应该熟悉memcached、redis的一种 memcached的cas一致性分布式算法应该有所了解 redis的存储类型、用法、场景也应该门清，要是能把redis的二进制数据存储getbit、setbit搞明白可以加分，redis的备份机制有哪些？有没有看过源代码？ nginx或Apache的相关知识 php-fpm怎么管理php进程的？ 如何优化性能？如何debug？这些开放命题就是面试官结合自己的水平给你打分了，你要是能把他忽悠住那你的水平一定比他高 就算你没了解也得知道php APC缓存、opcode cache吧，怎么实现的？ 队列是干什么的？实际应用中什么时候用？ 用过什么队列？kafka、NSQ、RabbitMQ还有啥？ 然后再看看知识的广度 其他的数据库有没有了解运用过？MongoDB有啥特点？为啥不该用MongoDB？ElasticSearch呢？ linux相关业务场景的命令使用 基础不再赘述，算法题好好刷一刷是必须的 是否真正了解计算机原理？系统内核？编译原理？能否说明白进程、线程、协程？</summary></entry></feed>