字数:
131
·
阅读:
1 分钟
·
访问:
-
php 环境需要与 nginx 配合安装,共享 nginx 解析的目录(www)
基本参数 -d 后台启动 --name 定义一个别名 -v 挂载目录 --link 链接其它 docker 容器名称 安装 php 即安装 php-fpm 环境
docker search php
docker run --name dev-phpfpm -v /d/local/nginx/www:/www -d php:5.6-fpm /d/local/nginx/www 这里必须是 nginx 解析的目录,也就是与 nginx 共享目录。 安装 nginx ro 表示只读权限
docker run --name dev-nginx-php -p 8080:80 -d -v /d/local/nginx/www:/usr/share/nginx/html:ro -v /d/local/nginx/conf.d:/etc/nginx/conf.d:ro --link dev-phpfpm:php nginx /d/local/nginx/www , /d/local/nginx/conf.d是宿主机的目录,可以自定义。 /usr/share/nginx/html, /etc/nginx/conf.d 是 nginx 里的固定目录,不能更改。 --link dev-phpfpm:php 是链接上面的 php 容器,dev-phpfpm是别名,php 是php容器 修改nginx配置文件 /d/local/nginx/conf.字数:
143
·
阅读:
1 分钟
·
访问:
-
下载镜像 docker search redis docker pull redis # 下载最新的 redis 安装脚本 #!/bin/bash ################ # DOCKER 创建 Redis 实例 # ################ name=$1 # Docker 名称 home=$2 # 安装目录 port=6379 # 端口号 host="0.0.0.0" # 绑定HOST password="123456" # 密码 # docker 名称必须输入 if test -z $name; then echo "docker name is null" exit 0 fi # 未设置安装目录则默认 /data/docker if test -z $home;then home=/data/docker/ fi # redis 存储目录 redis_home="${home}redis/" # 持久化存储目录 append_home="${redis_home}data/" # 配置存储目录 conf_home="${redis_home}conf/" # 配置文件名 conf_filename="${conf_home}redis.字数:
64
·
阅读:
1 分钟
·
访问:
-
systemd 脚本 #!/bin/bash project_name="mygo" project_path="/data/backend/" exec_path="${project_path}${project_name}" cat > /lib/systemd/system/${project_name}.service << EOF [Unit] Description=mygo systemd Documentation=https://yezihack.github.io After=network.target [Service] Type=simple User=root # 启动命令 ExecStart=${exec_path} # 重启命令 ExecReload=/bin/kill -SIGINT # 环境变量 Environment="SGFOOT_ENV=pro" Environment="SGFOOT_PATH=/data/conf" KillMode=process Restart=on-failure RestartSec=3s [Install] WantedBy=multi-user.targe EOF 管理 systemctl daemon-reload # 更新配置 systemctl start mygo # 启动 systemctl stop mygo # 停止 systemctl restart mygo # 重启 systemctl enable mygo # 加入开机启动 关于我 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~字数:
36
·
阅读:
1 分钟
·
访问:
-
启动 使用上下键选择不同的内核(可能有些机器就只有一个内核) 选中内核后,按e 键进入编辑状态 编辑 以下内容都是可以编辑,添加或删除的代码。(谨慎操作) 找到linux16的字符串, 然后再在本行中找到ro的字母,将其替换成rw init=/sysroot/bin/sh 然后按ctrl+x组合键,系统进入emergency(紧急情况)模式 chroot /sysroot/ # 切换回原始系统 LANG=en # 如果出现方块,不是字母的情况下设置成英文语言 passwd root # 对 root 修改密码 touch /.autorelabel # 使SELinux生效,密码生效 exit # 退出 reboot # 重启命令 关于我 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~字数:
50
·
阅读:
1 分钟
·
访问:
-
基于 linxu centos 7
查看防火墙 iptables 命令大小写敏感
iptables -nL 添加一条规则 添加一条开放 9090 端口的规则
# 插入最前面 iptables -I INPUT -p tcp --dport 9090 -j ACCEPT # 追加最后面 iptables -A INPUT -p tcp --dport 9090 -j ACCEPT # 插入某指定位置 iptables -I INPUT 3 -p tcp --dport 9090 -j ACCEPT 关于我 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~字数:
114
·
阅读:
1 分钟
·
访问:
-
为什么要编程规范 构建一个大型项目,往往是很多人一起参与,堆砌的代码行数都是成千上万行。如何保证代码的健壮性?编程规范必不可少。
命名 命名能力体现了一个程序员的基本编程素养。
让你的名字承载更多的信息,把信息装到名字里。
命名的关键是能准确达意,对于不同作用域的命名,我们可以适当地选择不同的长度。 利用上下文简化命名。 命名要可读,可搜索。如 get, select, set等等。 用具体的名字代替抽象的名字。 检测服务是否可以监听某个给定的TCP/IP端口。 ServerCanStart() 换成 CanListenOnPort() tip: 可以到 github 上找一些相关的项目,看看别人是如何命名的。
注释 命名很重要,注释跟命名同等重要。注释就是对代码的有力解释。
注释的内容主要包括三个方面:做什么(what),为什么(why),怎么做(how)。
为什么要写注释呢?
注释比代码承载的信息更多。 注释起到总结性作用,文档的作用。通过注释大概了解代码的实现思路,阅读起来更加容易。 一些总结性注释能让代码结构更清晰。 对于类和函数一定要写注释,尽量写全面,详细。对于函数内部,可以少写一些。
代码行数 函数的行数最好不要超过一屏幕。大约在50~80行。
写长函数时,需要拆分主干逻辑和次要逻辑。抽取公共且独立的处理逻辑。
一行代码 一行代码最好不要超过IDE显示的宽度。大约在80~100个字符。
如果超出行数导致换行会影响代码的整洁,不利用阅读。
空行分割单元块 对于那些影响逻辑的长函数,无法拆分的长函数,为了让逻辑更加清晰,可以使用空行来分割各个代码块。
代码缩进 Go 语言,使用 gofmt 或 goimports 自动缩进。
目前有使用两格缩进和四格缩进。主要看你使用的语言业内,主流如何使用。
如 php 用四格缩进,JAVA 用两格缩进。
大括号是否另起一行 Go 语言强制使用与函数名同一行。
目前有使用与函数名同一行或单独占一行。
主要看你使用的语言业内,主流如何使用。
如 php 喜欢使用单独占一行。JAVA 喜欢使用与函数名同一行。
排列顺序 Go 语言,使用 gofmt 或 goimports 自动排序。
依赖类,按照字母序从小到大排列。 在类中,成员变量排在函数前面。 在函数中,成员排在最上面。 作用域从大到小排列。public > protected > private。 把代码分割成更小的单元块 为什么要分割更小的单元块:字数:
32
·
阅读:
1 分钟
·
访问:
-
解耦为何如此重要 解耦是保证代码的松耦合,高内聚。防止代码质量腐化到不可救药地步的有效手段。
代码”高内聚,松耦合“也就意味着,代码结构清晰,分层和模块化合理,依赖关系简单,模块或类之间的耦合小,代码质量自然就高。
代码是否需要解耦 判断代码是否符合”高内聚,松耦合”,可以从如下方法判断。
看修改代码会不会牵一发而动全身。 把模块与模块之间,类与类之间的依赖关系画出来。根据依赖关系图的复杂性判断是否需要解耦重构。 如何给代码解耦 1.封装与抽象 封装和抽象可以有效地隐藏实现的复杂性,隔离实现的易变性,给依赖的模块提供稳定且易用的抽象接口。
2.中间层 引入中间层能简化模块或类之间的依赖关系。
我们在进行重构的时候,引入中间层可以起到过渡的作用,能够让开发和重构同步进行,不互相干扰。
分四个阶段完成接口的修改:
引入一个中间层,包裹老的接口,提供新的接口定义。 新开发的代码依赖中间层提供的新接口。 将依赖老接口的代码改为调用新接口。 确保所有代码都调用新接口之后,删除掉老的接口。 3.模块化 模块化是构建复杂系统常用的手段。
将大而复杂的系统拆分成各个独立的模块,让不同人负责不同的模块。
每个模块之间耦合很小,每个小团队聚集于一个独立的高内聚模块来开发。
最终像搭积木一样将各个模块组装起来,构建成一个超级复杂的系统。
4.设计思想和原则 单一职责原则 基于接口而非实现编程 依赖注入 多用组合少用继承 迪米特法则 关于我 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~字数:
75
·
阅读:
1 分钟
·
访问:
-
什么是单元测试 单元测试是代码层面的测试,由研发自己来编写,用于测试“自己”编写的代码逻辑的正确性。
单元测试主要测试范围:
类 函数 单元测试有别于集成测试。
集成测试主要测试范围:
模块 系统 功能块 tip: 单元测试是粒度小的测试。考验程序员思维的缜密程度。
为什么要写单元测试 单元测试能有效地帮你发现代码中的BUG 写代码的最高境界就是 bug free 的状态。 避免低级 bug 的出现。 保证每一行代码运行良好,逻辑正确。 写单元测试能帮你发现代码设计上的问题 如果我很难为其编写单元测试,或者单元测试写起来很吃力,那往往就意味着代码设计得不够合理。 如没有使用依赖注入,大量使用静态函数,全局变量,代码调试耦合等情况。 单元测试是对集成测试的有力补充 集成测试无法覆盖得很全面,复杂系统往往很多模块。需要单元测试加持。 如果我们能保证每个类,每个函数能按照我们的预期来执行,底层bug少了。组装起来的整个系统,bug也相应减少。 写单元测试的过程本身就是代码重构的过程 单元测试实际上就是落地执行持续重构的一个有效途径。 编写单元测试就相当于对代码的一次自我Code Review。 阅读单元测试能帮助你快速熟悉代码 单元测试用例就是用户用例,反映了代码的功能和如何使用。 单元测试是TDD可落地执行的改进方案 单元测试正好是对TDD测试驱动开发的一种改进方案。 如何编写单元测试 每个语言都有不同的写法。如 Golang 只需要以下划线加 test 命名,函数以 Test 开头就是单元测试。
func TestFunc(t *testing.T) { // todo } 还可以使用第三方提供的单元测试框架。如 GoConvey 。
写单元测试真的是件很耗时的事情。单元测试代码量一般是被测代码本身的1~2倍 单元测试不会在生产上运行,而且每个类的测试代码比较独立,基本不互相依赖。 单元测试覆盖率做到 60 ~ 70% 之间算合格。GoConvey 也有提供覆盖率的报告。 单元测试不依赖被测试函数的具体实现逻辑,它只关心被测函数实现了什么功能。 tip: 对于函数写不写单元测试,工程师要有足够的主人翁意识(ownership)。 也是拉开与其它人差距的“杀手锏“。
测试不友好的代码 代码中包含未决行为逻辑 滥用可变全局变量 滥用静态方法 使用复杂的继承关系 高度耦合的代码 关于我 我的博客:https://yezihack.字数:
64
·
阅读:
1 分钟
·
访问:
-
纲要 3W1H
why 为什么重构 what 重构什么 when 什么时候重构 how 如何重构 重构的定义 软件设计大师 Martin Fowler 这样定义重构:
“重构是一种对软件内部结构的改善,目的是在不改变软件的可见行为的情况下,使其更易理解,修改成本更低。”
重构的目的:为什么要重构 (why) 首先,重构是时刻保证代码质量的一个极其有效的手段,不至于让代码腐化到无可救药的地步。
其次,优秀的代码或架构不是一开始就能完全设计好的。是一个迭代,不断演进的过程。
最后,重构是避免过度设计的有效手段。
tip: 初级工程师在维护代码,高级工程师在设计代码,资深工程师在重构代码。
重构的对象:到底重构什么(what) 根据重构的规模,我们可以笼统地分为大规模高层次重构(大重构)和小规模低层次重构(小重构)。
大重构:
重构的范围 系统 模块 代码结构 类与类之间的关系 重构手段 分层 模块化 解耦 抽象可复用组件 重构工具 设计思想 设计原则 设计模式 小重构:
重构范围 类 函数 变量 重构手段 规范命名 规范注释 消除超大类或函数 提取重复代码 tip:我们重构的对象是软件重个生命周期。
重构的时机:什么时候重构(when) 重构可以是一刀切,也可以分阶段。我们提倡的策略是持续重构。
把重构作为我们开发的一部分,见到不符合编码规范,不好的设计,超长函数都可以随时重构一下。成为一种开发习惯,对项目对自己都会很有好处。
tip: 持续重构意识很重要
重构的方法:又该如何重构(how) 对于大重构难度比较大,需要有组织,有计划地进行,分阶段地小步快跑,时刻让代码处于一个可运行的状态。
对于小重构难度相对小,因为影响范围小,改动耗时短,所以只要你愿意并且有时间,随时随地都可以重构。
tip: 不管大还是小重构,都要保证代码可运行,逻辑正确的状态。
关于我 我的博客:https://yezihack.github.io
欢迎关注我的微信公众号【空树之空】,共同学习,一起进步~