go项目部署方案

常用了go web/api 项目部署方案有4种
1. nohup xxx &
2. supervisord
3. nginx
4. apache
https://beego.me/docs/deploy/
可以参考beego的文档

然而我们可以换一种思路,以软件的形式部署
1. Go打包为特定版本的rpm,版本号自增,rpm包包含打包的可执行程序、配置、service脚本
2. 推到内部yum仓库,yum仓库索引更新
3. 目标机执行 yum update xxx
4. 目标机yum update执行结束时触发Service xxx-server reload

Laravel依赖注入深入浅出

我们在开始用Laravel时会大量用到依赖注入,由于框架做了很多工作,所以可以方便的依赖绑定和自动注入。
具体的写代码时参考文档的“服务容器”实例代码就能快速上手。但是依赖注入到底是什么?

依赖注入是一种设计模式。
《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)是软件工程领域有关软件设计的一本书,提出和总结了对于一些常见软件设计问题的标准解决方案,称为软件设计模式。该书作者为:埃里希·伽玛(Erich Gamma), Richard Helm , Ralph Johnson,John Vlissides,后以“四人帮”(Gang of Four,GoF)著称。
设计模式一般指本书中提出的3大类(创建模式、行为模式、组合模式)共23种经典的可以解决常见软件设计问题的可复用设计方案。https://www.zhihu.com/question/19558521
在2004年,Martin Fowler提出了“哪些方面的控制被反转了?”这个问题。
另外 SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖倒置)是由罗伯特·C·马丁在2009年引入的术语,指代了面向对象编程和面向对象设计的五个基本原则。

依赖倒置原则规定:
高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。
抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

为了实现自动注入,在PHP中可以使用反射实现一个IoC容器,Laravel就是这么做的。

https://segmentfault.com/a/1190000002424023

PHPUnit: Exception: Serialization of ‘Closure’ is not allowed

用phpstorm测试laravel程序的时候发现单独执行phpunit命令可以把所有测试用例都跑一遍,而单独指定某个测试文件,某个测试方法则报错。百思不得其解。今天终于下决心查一下。

基本上是因为你的全局变量中, 包含了闭包. PHPUnit 在执行过程中会对全局变量进行序列化备份, 而PHP 自身的机制限制了序列化对闭包(Closure)的操作. 因此只要禁用序列化全局变量好了.

执行的时候加上phpunit --no-globals-backup xxx参数

或者在phpunit.xml配置文件里加上backupGlobals="false"

引用:
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

省市县数据在程序中如何管理

我们开发时可能会遇到需要存储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的表后如果有数据变更只需全量更新即可。除此之外还可以自定义省市简写、简称等功能以便满足实际业务需求。

关于软件授权的思路

过去共享软件做注册码机制,破解软件大行其道,究其原因,算法再牛逼也是对称加密,知道了算法甚至多知道几个结果就能推导出需要哪些数据做参数。
最近肆虐的WanaCrypt0r病毒的如何做到安全加密防破解的呢?
他使用了一种cryptGenRandom的方案,就是对每个文件随机产生加密,用户就很难手动恢复所有文件。而且加密的文件类型涵盖广泛,后缀名
.doc, .docx, .xls, .xlsx, .ppt, .pptx, .pst, .ost, .msg, .eml, .vsd, .vsdx, .txt, .csv, .rtf, .123, .wks, .wk1, .pdf, .dwg, .onetoc2, .snt, .jpeg, .jpg, .docb, .docm, .dot, .dotm, .dotx, .xlsm, .xlsb, .xlw, .xlt, .xlm, .xlc, .xltx, .xltm, .pptm, .pot, .pps, .ppsm, .ppsx, .ppam, .potx, .potm, .edb, .hwp, .602, .sxi, .sti, .sldx, .sldm, .sldm, .vdi, .vmdk, .vmx, .gpg, .aes, .ARC, .PAQ, .bz2, .tbk, .bak, .tar, .tgz, .gz, .7z, .rar, .zip, .backup, .iso, .vcd, .bmp, .png, .gif, .raw, .cgm, .tif, .tiff, .nef, .psd, .ai, .svg, .djvu, .m4u, .m3u, .mid, .wma, .flv, .3g2, .mkv, .3gp, .mp4, .mov, .avi, .asf, .mpeg, .vob, .mpg, .wmv, .fla, .swf, .wav, .mp3, .sh, .class, .jar, .java, .rb, .asp, .php, .jsp, .brd, .sch, .dch, .dip, .pl, .vb, .vbs, .ps1, .bat, .cmd, .js, .asm, .h, .pas, .cpp, .c, .cs, .suo, .sln, .ldf, .mdf, .ibd, .myi, .myd, .frm, .odb, .dbf, .db, .mdb, .accdb, .sql, .sqlitedb, .sqlite3, .asc, .lay6, .lay, .mml, .sxm, .otg, .odg, .uop, .std, .sxd, .otp, .odp, .wb2, .slk, .dif, .stc, .sxc, .ots, .ods, .3dm, .max, .3ds, .uot, .stw, .sxw, .ott, .odt, .pem, .p12, .csr, .crt, .key, .pfx, .der

软件做授权可以参考什么呢?

单项加密或者服务器存储尽可能多的特征来保证认证,把校验数据在软件开发者的服务端留存一份。

用户在安装、升级或迁移时都需要连接到软件开发者的服务端做校验,就杜绝了任何破解的可能性。

当然如果想网开一面,故意让破解可能的话,就学学WanaCrypt0r,提供穷人通道: )

参考资料:http://www.freebuf.com/vuls/134602.html
https://gist.github.com/rain-1/989428fa5504f378b993ee6efbc0b168

web开发常用程序安装提速指南

一、常用的通用方案我们再过一遍,VPN、HTTP/HTTPS代理、Socks5代理、IPv6
二、做php开发离不开composer
composer本身下载是个挺蛋疼的事,我做了一个windows版本的composer安装包,linux、mac用户可以用包管理或者翻墙下载
三、mac用户必备的homebrew
第一步
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
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' >> ~/.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/

PHP源码学习计划1

计划:通过3个月时间把php源码学习完毕

今晚我只看了一个库https://github.com/php/php-svn-helpers
这个库只有两个shell脚步文件
作用是我们从github迁出php代码后需要提交到svn时,把git代码库转换为对应的git-svn库

文件内容非常简单

适合初学shell、git命令的同学阅读

========
更新:我又看了一个库https://github.com/php/pecl-file_system-phdfs
这个是pecl库中的php操作hdfs(Hadoop)的扩展
目测功能单一,不会太复杂

采用的是php license 3.0