Web 开发者应该避免的 5 个 CSS 的做法
原文地址:5 CSS Practices To Avoid as a Web Developer 原文作者:Alexey Shepelev 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:霜羽 Hoarfroster 校对者:KimYang、Chorer 有人认为 CSS 很难学习,觉得 CSS 有很多的坑,甚至还有一点儿魔幻,难以理解,很容易会搬起石头砸自己的脚。对此我感到难过,毕竟,我可不这么认为。 在考虑了可以做什么之后,我提出了五个我挺讨厌的 CSS 的做法,希望帮助大家避免这些习惯。 1. 设置内外边距,然后将其重置 我经常看到人们为所有元素设置内外边距,然后为第一个元素或者最后一个元素清除刚刚写的边距。我不知道为什么你非要在一条规则就可以解决问题的情况下写两条规则。一次为所有必需的元素设置边距明显容易得多! 为简化 CSS,你可以选用以下几种选择器:nth-child 或 nth-of-type 选择器,还有 :not() 伪类或相邻元素组合器(即 +)。 不要这么写:
|
1 2 3 4 5 6 7 |
.item { margin-right: 1.6rem; } .item:last-child { margin-right: 0; } |
你可以这么写:
|
1 2 3 |
.item:not(:last-child) { margin-right: 1.6rem; } |
或这样写:
|
1 2 3 |
.item:nth-child(n+2) { margin-left: 1.6rem; } |
或者用:
|
1 2 3 |
.item + .item { margin-left: 1.6rem; } |
2. 为 position 为 fixed 或 absolute 的元素添加 display:block 你知道吗?其实你无需为 position 为 fixed 或 absolute 的元素添加 display:block,因为这是默认发生的。 另外,如果你在这些元素上使用 inline-* 值,它们将按以下方式更改: inline、inline-block -> block inline-flex -> flex inline-grid -> grid inline-table -> table 因此,对于 position 为 fixed 或 absolute 的元素,你只需在要使用 flex 布局或者 grid 布局的时候设置 […]
View Details云空调,来自 GitHub 的冷气——GitHub 热点速览 v.21.20
作者:HelloGitHub-小鱼干 万物皆可上云,air-conditioner 是上周火爆小鱼干朋友圈和公众号信息流的云空调项目。第一眼的时候,你会觉得和这个云空调还挺别致的,第二眼,si~~感到了一丝丝的“冷”,为项目作者的脑洞打了个冷颤。此外,Lima 也有点“冷”,它是一个 macOS Linux 子系统,简单来说是一个 Linux 虚拟机…真的有点“冷”幽默在里面。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝 本文目录 本周特推 1.1 云空调:air-conditioner 1.2 真·手把手教你刷题:leetcode-master GitHub Trending 周榜 2.1 远程桌面客户端:rustdesk 2.2 视频服务:SRS 2.3 文件同步:syncthing 2.4 高颜值管理仪表盘:Flutter-Responsive-Admin-Panel-or-Dashboard 2.5 macOS 子系统 Linux:Lima 你的点单 3.1 极简 GUI 库:PySimpleGUI 往期回顾 1. 本周特推 在开始本周的特推之前,如果你有什么想要的 GitHub 项目,记得留言呀~你的留言超重要 (≧▽≦) 1.1 云空调:air-conditioner 本周 star 增长数:1,750+ 进入到夏天,你除了能感受到热之外,还有什么?冷气!空调带来的冷气!air-conditioner 是个云空调,作为便携小空调,它为你的夏日带去清凉!刚开始我以为它是个红外遥感控制工具,but,看下它的优劣势:优势 随时随地打开空调 便携 低功耗(使用 HTML CSS 而非 Canvas 绘制) 静音 操作简单 安装便捷 劣势 没有风 现在你能感受到 air-conditioner 是多么的“冷”了吧[手动狗头]Btw,这个项目是本周的热点,多个公众号介绍了这个项目有多么的“冷”。 […]
View Detailsmall学习所需知识点
推荐资料 IDEA 《IntelliJ-IDEA-Tutorial》:https://github.com/judasn/IntelliJ-IDEA-Tutorial 特别全的IDEA使用教程,可以学到很多实用的技巧。 Spring 《Spring实战(第4版)》:https://book.douban.com/subject/26767354/ 经典的、畅销的Spring学习和实践指南,从此书可以学习到Spring的实用用法,对Spring有个整体的了解,推荐整本阅读。 SpringBoot 《Spring Boot实战》:https://book.douban.com/subject/26857423/ SpringBoot的入门书,一共也就200多页,反正我是看完了,其中关于Groovy和Grails部分大可不看。 MyBatis 《MyBatis从入门到精通》:https://book.douban.com/subject/27074809/ 很好的一本MyBatis入门书,作者是开源插件PageHelper的项目主,平时忘了MyBatis的一些用法的时候可以当工具书使用,推荐整本阅读 MySql 《深入浅出MySQL》:https://book.douban.com/subject/25817684/ 网易DBA写的一本MySql书籍,作为一个开发者,我们只要看第一部分基础篇、第二部分开发篇、第三部分优化篇即可。 Linux 《循序渐进Linux(第2版)》:https://book.douban.com/subject/26758194/ 南非蚂蚁写的一本Linux书籍,作为一个开发者,我们只要看第一篇基础知识篇、第二篇服务器搭建篇即可,后面讲到生产环境部署项目会用到。 Elasticsearch 《Elasticsearch 权威指南》:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html Elasticsearch官方推荐的中文学习资料,基于Elasticsearch2.4.x版本,比较老,但是可堪一用。大多数成熟的框架,版本迭代用法相差不会很大。 《Elasticsearch 技术解析与实战》:https://book.douban.com/subject/26967826/ 如果你觉得上面那本ElasticSearch版本太老的话可以看这本。 Mongodb 《MongoDB实战(第二版)》:https://book.douban.com/subject/27061123/ 很好的一本MongoDB实战书,作者参与过MongoDB的驱动开发,感兴趣的可以都看下。 Docker 《Spring Cloud与Docker微服务架构实战》:https://book.douban.com/subject/27028228/ 我们只需要看下这本书的Docker部分即可,后面讲到生产环境部署项目会用到。 结语 如果你按照我的推荐看了以上部分的资料,或者你已经有了以上部分的基础,那么你学习mall的时候会非常顺利。 推荐阅读 mall架构及功能概览 from:https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247483680&idx=1&sn=4e5e2294a275a7709f9a239b34d1fa60&scene=21#wechat_redirect
View Detailsmall数据库表结构概览
商品管理 数据库表结构 功能结构 订单管理 数据库表结构 功能结构 营销管理 数据库表结构 功能结构 内容管理 数据库表结构 功能结构 用户管理 数据库表结构 功能结构 注意:部分功能暂未实现,只是对表结构进行了设计,商品管理、订单管理、营销管理大部分功能均已实现。 相关资料 PowerDesigner数据库设计文件 商品管理:https://github.com/macrozheng/mall-learning/blob/master/document/pdm/mall_pms.pdm 订单管理:https://github.com/macrozheng/mall-learning/blob/master/document/pdm/mall_oms.pdm 营销管理:https://github.com/macrozheng/mall-learning/blob/master/document/pdm/mall_sms.pdm 内容管理:https://github.com/macrozheng/mall-learning/blob/master/document/pdm/mall_cms.pdm 用户管理:https://github.com/macrozheng/mall-learning/blob/master/document/pdm/mall_ums.pdm MindMaster功能思维导图 商品管理:https://github.com/macrozheng/mall-learning/blob/master/document/mind/pms.emmx 订单管理:https://github.com/macrozheng/mall-learning/blob/master/document/mind/oms.emmx 营销管理:https://github.com/macrozheng/mall-learning/blob/master/document/mind/sms.emmx 内容管理:https://github.com/macrozheng/mall-learning/blob/master/document/mind/cms.emmx 用户管理:https://github.com/macrozheng/mall-learning/blob/master/document/mind/ums.emmx 使用到的工具 PowerDesigner:http://powerdesigner.de/ MindMaster:http://www.edrawsoft.cn/mindmaster 推荐阅读 mall在Linux环境下的部署(基于Docker Compose) mall在Linux环境下的部署(基于Docker容器) mall在Windows环境下的部署 mall整合SpringBoot+MyBatis搭建基本骨架 mall整合Swagger-UI实现在线API文档 mall整合SpringSecurity和JWT实现认证和授权(一) mall整合Elasticsearch实现商品搜索 mall整合Mongodb实现文档操作 mall整合RabbitMQ实现延迟消息 mall整合OSS实现文件上传 from:https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247483835&idx=1&sn=895ae94d5a0bc5fbe5bed8aa715d92af&scene=21#wechat_redirect
View Details127.0.0.1和0.0.0.0地址的区别!
1. 问题引入 之前在使用tomcat的时候,启动tomcat默认都会绑定到127.0.0.1这个地址,最近在使用hexo写博客的时候发现通过 hexo server命令启动服务的时候绑定的ip地址是0.0.0.0。那么这两个IP地址到底有什么不同呢? 在讲解两个地址的不同之前,我们先回顾一下IP地址的基础知识。 2. IP地址分类 2.1 IP地址表示 IP地址由两个部分组成,net-id和host-id,即网络号和主机号。 net-id:表示ip地址所在的网络号。 host-id:表示ip地址所在网络中的某个主机号码。 即:
|
1 |
IP-address ::= { <Network-number>, <Host-number> } |
2.2 IP地址分类 IP地址一共分为5类,即A~E,它们分类的依据是其net-id所占的字节长度以及网络号前几位。 A类地址:网络号占1个字节。 网络号的第一位固定为0。 B类地址: 网络号占2个字节。 网络号的前两位固定为10。 C类地址: 网络号占3个字节。 网络号的前三位固定位110。 D类地址: 前四位是1110,用于多播(multicast),即一对多通信。 E类地址: 前四位是1111,保留为以后使用。 其中,ABC三类地址为单播地址(unicast),用于一对一通信,是最常用的。 2.3 特殊IP地址 特殊IP地址就是用来做一些特殊的事情。RFC1700中定义了以下特殊IP地址。 {0,0}:网络号和主机号都全部为0,表示“本网络上的本主机”,只能用作源地址。 {0,host-id}:本网络上的某台主机。 只能用作源地址。 {-1,-1}: 表示网络号和主机号的所有位上都是1(二进制),用于本网络上的广播,只能用作目的地址,发到该地址的数据包不能转发到源地址所在网络之外。 {net-id,-1}:直接广播到指定的网络上。 只能用作目的地址。 {net-id,subnet-id,-1}:直接广播到指定网络的指定子网络上。 只用作目的地址。 {net-id,-1,-1}:直接广播到指定网络的所有子网络上。 只能用作目的地址。 {127,}:即网络号为127的任意ip地址。 都是内部主机回环地址(loopback),永远都不能出现在主机外部的网络中。 3. 问题解答 接下来我们来看之前问过的问题:127.0.0.1和0.0.0.0地址的区别是什么? 我们先来看下共同点: 都属于特殊地址。 都属于A类地址。 都是IPV4地址。 接下来我们分别看下这两个地址: 0.0.0.0 IPV4中,0.0.0.0地址被用于表示一个无效的,未知的或者不可用的目标。 在服务器中,0.0.0.0指的是本机上的所有IPV4地址,如果一个主机有两个IP地址,192.168.1.1 和 10.1.2.1,并且该主机上的一个服务监听的地址是0.0.0.0,那么通过两个ip地址都能够访问该服务。 在路由中,0.0.0.0表示的是默认路由,即当路由表中没有找到完全匹配的路由的时候所对应的路由。 用途总结 当一台主机还没有被分配一个IP地址的时候,用于表示主机本身。 (DHCP分配IP地址的时候) 用作默认路由,表示”任意IPV4主机”。 用来表示目标机器不可用。 用作服务端,表示本机上的任意IPV4地址。 127.0.0.1 127.0.0.1属于{127,}集合中的一个,而所有网络号为127的地址都被称之为回环地址,所以回环地址!=127.0.0.1,它们是包含关系,即回环地址包含127.0.0.1。 回环地址:所有发往该类地址的数据包都应该被loop back。 用途 回环测试,通过使用ping 127.0.0.1 测试某台机器上的网络设备,操作系统或者TCP/IP实现是否工作正常。 DDos攻击防御: 网站收到DDos攻击之后,将域名A记录到127.0.0.1,即让攻击者自己攻击自己。 大部分Web容器测试的时候绑定的本机地址。 localhost 相比127.0.0.1,localhost具有更多的意义。localhost是个域名,而不是一个ip地址。之所以我们经常把localhost与127.0.0.1认为是同一个是因为我们使用的大多数电脑上都讲localhost指向了127.0.0.1这个地址。 在ubuntu系统中,/ets/hosts文件中都会有如下内容:
|
1 2 3 4 5 6 7 8 |
127.0.0.1 localhost 127.0.1.1 jason-Lenovo-V3000 # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters |
上面第一行是几乎每台电脑上都会有的默认配置。 但是localhost的意义并不局限于127.0.0.1。 localhost是一个域名,用于指代this computer或者this host,可以用它来获取运行在本机上的网络服务。 在大多数系统中,localhost被指向了IPV4的127.0.0.1和IPV6的::1。 […]
View Details一个不容错过的Spring Cloud实战项目!
mall-swarm简介 mall-swarm是一套微服务商城系统,采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Elasticsearch等核心技术,同时提供了基于Vue的管理后台方便快速搭建系统。mall-swarm在电商业务的基础集成了注册中心、配置中心、监控中心、网关等系统功能。 系统架构图 系统架构图 后端技术栈 技术 说明 Spring Cloud 微服务框架 Spring Boot 容器+MVC框架 Spring Security 认证和授权框架 MyBatis ORM框架 MyBatisGenerator 数据层代码生成 PageHelper MyBatis物理分页插件 Swagger-UI 文档生产工具 Elasticsearch 搜索引擎 RabbitMq 消息队列 Redis 分布式缓存 MongoDb NoSql数据库 Docker 应用容器引擎 Druid 数据库连接池 OSS 对象存储 MinIO 对象存储 JWT JWT登录支持 LogStash 日志收集 Lombok 简化对象封装工具 Seata 全局事务管理框架 Portainer 可视化Docker容器管理 Jenkins 自动化部署工具 项目结构
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mall ├── mall-common -- 工具类及通用代码模块 ├── mall-mbg -- MyBatisGenerator生成的数据库操作代码模块 ├── mall-security -- 封装SpringSecurity+JWT的安全认证的模块 ├── mall-registry -- 基于Eureka的微服务注册中心 ├── mall-config-- 基于Spring Cloud Config的微服务配置中心 ├── mall-gateway -- 基于Spring Cloud Gateway的微服务API网关服务 ├── mall-monitor -- 基于Spring Boot Admin的微服务监控中心 ├── mall-admin -- 后台管理系统服务 ├── mall-search -- 基于Elasticsearch的商品搜索系统服务 ├── mall-portal -- 移动端商城系统服务 └── mall-demo -- 微服务远程调用测试服务 |
学习路线 之前有朋友问我,mall-swarm这个项目有没有学习教程?其实这个项目的功能与mall项目基本一致,只是在此基础上改成了微服务版本,只要看我写的《mall学习教程》和《Spring Cloud学习教程》即可,下面聊聊我所推荐的学习路线。 学习mall 《mall学习教程》主要分为如下几个部分,推荐学习顺序是除参考篇以外可以按下面的顺序学习,对于参考篇,可以在用到里面相关技术时再学习。 序章:mall项目的整体架构及功能介绍,同时对于新手推荐了一些相关书籍资料; 架构篇:mall项目的架构搭建教程,手把手教你搭建一个mall项目在使用的基本项目骨架; 业务篇:mall项目电商业务相关教程,对于了解项目业务有很大帮助; 技术要点篇:mall项目中的一些技术要点解析,主要介绍一些技术在项目中的运用; 部署篇:mall项目的部署教程,包括Windows、Linux和自动化部署方案; 参考篇:mall项目中所用技术和工具的入门教程,每一篇都可以单独学习,对于mall项目,这些教程的深入程度都刚刚好。 项目地址:https://github.com/macrozheng/mall-learning 学习SpringCloud 《Spring Cloud学习教程》是一套涵盖大部分核心组件使用的教程,包括Spring Cloud Alibaba及分布式事务Seata,基于Spring Cloud Greenwich及SpringBoot 2.1.7。20篇文章,篇篇精华,30个Demo,涵盖大部分应用场景。mall-swarm项目中所用到的Spring Cloud技术该教程基本都涵盖了,学习该教程可以为学习mall-swarm项目打下良好的Spring Cloud基础。 项目地址:https://github.com/macrozheng/springcloud-learning 学习mall-swarm 当我们学习了《mall学习教程》和《Spring Cloud学习教程》之后就可以着手学习mall-swarm这个项目了。首先需要的就是按之前的教程把项目跑起来,然后进行源码的学习,相信有了学习上面两套教程的基础,搞懂源码并不是什么难事。下面提供下mall-swarm的部署教程: mall-swarm在Windows环境下的部署 mall-swarm在Linux环境下的部署(基于Docker容器) 微服务架构下的自动化部署,使用Jenkins来实现! […]
View DetailsGithub标星34K+Star,这款开源项目助你秒建Git服务!
Gogs简介 Gogs是一款极易搭建的自助Git服务,使用Go语言开发,只要Go语言支持的平台它都支持,包括Linux、Mac OS X、Windows以及ARM平台。Gogs对系统硬件要求极低,你甚至可以在树莓派上搭建它。 项目地址:https://github.com/gogs/gogs 安装 Gogs在Docker环境下的安装非常简单,只需要两个命令即可,推荐使用该方式来进行安装。 首先我们需要先下载Gogs的Docker镜像;
|
1 2 |
docker pull gogs/gogs |
下载完成后使用docker run命令即可运行服务;
|
1 2 3 4 |
docker run -p 10022:22 -p 10080:3000 --name=gogs \ -v /mydata/gogs:/data \ -d gogs/gogs |
这里我们说下命令中值得注意的地方,10022对应的是Gogs的SSH服务端口,10080对应的使用Gogs的HTTP服务端口,我们还将容器的数据目录挂载到了宿主机的/mydata/gogs目录下,这样就算我们重新创建容器数据也不会丢失。 配置 安装完成后,我们第一次访问Gogs服务会显示一个设置页面,访问地址:http://192.168.5.19:10080/ 数据库设置,这里我们直接使用内置的SQLite3数据库即可,使用其他的需要自行搭建数据库; 应用基本设置,主要修改域名、SSH端口号和应用URL即可。 使用 注册 配置好以后会直接跳转到登录界面,首先注册一个帐户; 注册完成后,登录即可进入控制面板页面。 创建仓库 直接使用我的仓库右侧的加号即可创建仓库,简单设置下仓库名称和可见性来完成创建; 创建成功后直接使用克隆地址即可克隆该仓库; 我们可以直接使用IDEA的Git检出功能; 检出完成后,加入我们的代码直接提交、推送,在Gogs里面就可以看到我们提交的代码了。 工单管理 这里的工单管理,有点类似Github上面的Issue的功能,我们可以通过创建工单按钮来创建; 输入我们的标题、内容和标签以后即可创建; 创建完成后显示效果如下。 添加用户 有时候管理员需要新建一些帐户来协作开发,此时我们只要点击头像->管理面板->用户管理即可打开用户管理界面; 然后点击创建新的帐户,输入相关信息即可完成创建。 管理协作者 创建完成后,我们可以在仓库页面的仓库设置中打开管理协作者功能; 之后通过输入协作者账户,点击增加新的协作者并设置好权限即可,这样协作者就可以访问并向该仓库提交代码了。 迁移外部仓库 Gogs还提供了从外部仓库迁移代码的功能,通过头像左侧的加号,然后选择迁移外部仓库即可; 这里以迁移Gitee上的mall项目为例,项目地址:http://gitee.com/macrozheng/mall 迁移成功后就可以在Gogs里面看到mall项目了! Gogs VS Gitlab 之前有写过一篇《10分钟搭建自己的Git仓库》,使用的是Gitlab,下面对比下Gogs和Gitlab在安装使用过程中的优缺点,仅代表个人观点。 比较方面 Gogs Gitlab Docker镜像大小 44MB 836MB 启动速度 很快,几秒 很慢,机器配置不好要10分钟 配置要求 很低,树莓派都可以 很高,吃内存,吃CPU 访问速度 够快 机器配置好也还可以 功能 功能较少 功能很丰富 from:https://mp.weixin.qq.com/s/WYHuAvN1pt_TGkBVWBnPSA
View Details再见 Jenkins !几行脚本搞定自动化部署,这款神器有点厉害!
摘要 在开发或生产环境中,我们经常会搞一套自动化部署方案(俗称一键部署)。比较流行的一种就是Gitlab+Jenkins实现方案,不过这种方案占用内存比较大,没有个8G内存,很难流畅运行,而且部署起来也不快。最近发现一款神器Drone,轻量级CI/DI工具,结合Gogs使用内存占用不到1G,几行脚本就能实现自动化部署,推荐给大家! Drone简介 Drone是一款基于容器技术的持续集成工具,使用简单的YAML配置文件即可完成复杂的自动化构建、测试、部署任务,在Github上已经有22K+Star。 Gogs安装 我们将使用轻量级的Gogs来搭建Git仓库,这里只是简单说下安装步骤,具体使用可以参考《Github标星34K+Star,这款开源项目助你秒建Git服务!》。 首先需要下载Gogs的Docker镜像;
|
1 |
docker pull gogs/gogs |
下载完成后在Docker容器中运行Gogs;
|
1 2 3 4 |
docker run -p 10022:22 -p 10080:3000 --name=gogs \ -e TZ="Asia/Shanghai" \ -v /mydata/gogs:/data \ -d gogs/gogs |
Gogs运行成功后,访问Web页面地址并注册账号:http://192.168.5.78:10080 然后将我们的SpringBoot项目mall-tiny-drone的源码上传上去即可,项目地址:github.com/macrozheng/… Drone安装 接下来我们安装下Drone,不愧是基于容器的CI/DI工具,使用Docker安装很方便! 首先下载Drone的Server和Runner的镜像;
|
1 2 3 4 |
# Drone的Server docker pull drone/drone:1 # Drone的Runner docker pull drone-runner-docker:1 |
这里有个Server和Runner的概念,我们先来理解下; Server:为Drone的管理提供了Web页面,用于管理从Git上获取的仓库中的流水线任务。 Runner:一个单独的守护进程,会轮询Server,获取需要执行的流水线任务,之后执行。 接下来我们来安装drone-server,使用如下命令即可;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
docker run \ -v /mydata/drone:/data \ -e DRONE_AGENTS_ENABLED=true \ -e DRONE_GOGS_SERVER=http://192.168.5.78:10080 \ -e DRONE_RPC_SECRET=dronerpc666 \ -e DRONE_SERVER_HOST=192.168.5.78:3080 \ -e DRONE_SERVER_PROTO=http \ -e DRONE_USER_CREATE=username:macro,admin:true \ -e TZ="Asia/Shanghai" \ -p 3080:80 \ --restart=always \ --detach=true \ --name=drone \ drone/drone:1 |
这里的配置参数比较多,下面统一解释下; DRONE_GOGS_SERVER:用于配置Gogs服务地址。 DRONE_RPC_SECRET:Drone的共享秘钥,用于验证连接到server的rpc连接,server和runner需要提供同样的秘钥。 DRONE_SERVER_HOST:用于配置Drone server外部可访问的地址。 DRONE_SERVER_PROTO:用于配置Drone server外部可访问的协议,必须是http或https。 DRONE_USER_CREATE:创建一个管理员账号,该账号需要在Gogs中注册好。 接下来安装drone-runner-docker,当有需要执行的任务时,会启动临时的容器来执行流水线任务;
|
1 2 3 4 5 6 7 8 9 10 11 12 |
docker run -d \ -v /var/run/docker.sock:/var/run/docker.sock \ -e DRONE_RPC_PROTO=http \ -e DRONE_RPC_HOST=192.168.5.78:3080 \ -e DRONE_RPC_SECRET=dronerpc666 \ -e DRONE_RUNNER_CAPACITY=2 \ -e DRONE_RUNNER_NAME=runner-docker \ -e TZ="Asia/Shanghai" \ -p 3000:3000 \ --restart always \ --name runner-docker \ drone/drone-runner-docker:1 |
这里的配置参数比较多,下面统一解释下。 DRONE_RPC_PROTO:用于配置连接到Drone server的协议,必须是http或https。 DRONE_RPC_HOST:用于配置Drone server的访问地址,runner会连接到server获取流水线任务并执行。 DRONE_RPC_SECRET:用于配置连接到Drone server的共享秘钥。 DRONE_RUNNER_CAPACITY:限制runner并发执行的流水线任务数量。 DRONE_RUNNER_NAME:自定义runner的名称。 Drone使用 让我们来访问下Drone的控制台页面,第一次登录需要输入账号密码(在Gogs中注册的账号),访问地址:http://192.168.5.78:3080/ 此时我们在Gogs中的项目会现在在列表中,如果没有的话可以点下SYNC按钮; 接下来我们需要对仓库进行设置,将仓库设置为Trusted(否则Drone创建的容器无法挂载目录到宿主机),最后点击SAVE按钮保存; 保存成功后会在Gogs中自动配置一个Web钩子,当我们推送代码到Gogs中去时,会触发这个钩子,然后执行在Drone中的流水线任务; 拉到最下面,我们可以发送一个测试推送,推送成功会显示绿色的√; 此时我们在Drone中发现其实流水线执行失败了,那是因为我们在脚本中引用了Secret中的ssh_password; 在仓库的设置中添加一个Secret即可,Secret是专门用来存储密码的,此密码只能被使用或删除,无法被查看; 在ACTIVITY FEED中使用RESTART可以重新执行该流水线,发现已经成功执行。 编写脚本 当我们向Git仓库Push代码时,会自动触发Web钩子,然后Drone就会从Git仓库Clone代码,再通过项目目录下的.drone.yml配置,执行相应的流水线,接下来我们来看看这个脚本是如何写的。 首先我们来了解下在.drone.yml中配置的工作流都有哪些操作,看下流程图就知道了; 再来一个完整的.drone.yml,配上详细的注解,看下就基本懂了!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
kind: pipeline # 定义对象类型,还有secret和signature两种类型 type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型 name: mall-tiny-drone # 定义流水线名称 steps: # 定义流水线执行步骤,这些步骤将顺序执行 - name: package # 流水线名称 image: maven:3-jdk-8 # 定义创建容器的Docker镜像 volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置 - name: maven-cache path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载 - name: maven-build path: /app/build # 将应用打包好的Jar和执行脚本挂载出来 commands: # 定义在Docker容器中执行的shell命令 - mvn clean package # 应用打包命令 - cp target/mall-tiny-drone-1.0-SNAPSHOT.jar /app/build/mall-tiny-drone-1.0-SNAPSHOT.jar - cp Dockerfile /app/build/Dockerfile - cp run.sh /app/build/run.sh - name: build-start image: appleboy/drone-ssh # SSH工具镜像 settings: host: 192.168.5.78 # 远程连接地址 username: root # 远程连接账号 password: from_secret: ssh_password # 从Secret中读取SSH密码 port: 22 # 远程连接端口 command_timeout: 5m # 远程执行命令超时时间 script: - cd /mydata/maven/build # 进入宿主机构建目录 - chmod +x run.sh # 更改为可执行脚本 - ./run.sh # 运行脚本打包应用镜像并运行 volumes: # 定义流水线挂载目录,用于共享数据 - name: maven-build host: path: /mydata/maven/build # 从宿主机中挂载的目录 - name: maven-cache host: path: /mydata/maven/cache |
run.sh执行脚本可以实现打包应用和运行容器镜像,之前讲过这里就不再赘述了,具体可以参考《我常用的自动化部署技巧,贼好用,推荐给大家!》,运行成功效果如下。 总结 对比Jenkins复杂的图形化界面操作,Drone使用脚本来定义流水线任务无疑更简单、更直观。Drone更加轻量级,内存占用少且响应速度快!自动化部署要啥Jenkins?直接给Git整个CI/DI功能难道不香么? 参考资料 官方文档:docs.drone.io/ 结合Maven使用:docs.drone.io/pipeline/ku… 结合SSH使用:plugins.drone.io/appleboy/dr… 将容器目录挂载到宿主机:docs.drone.io/pipeline/do… 项目源码地址 github.com/macrozheng/… 本文 GitHub github.com/macrozheng/… 已经收录,欢迎大家Star! 作者:MacroZheng 链接:https://juejin.cn/post/6963430116080910367 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
View Details相同八字的人命运为什么不完全相同
古人说:“每有贫寒之命,生于富贵之家,锦襁绣褓,享用太过。其福不足以当之,则必夭”。这段话是说,一个禀赋了贫寒之命的孩子,如果生在富贵人的家庭,是没有享福的承受能力的,一定会夭折。据此推论,一个禀赋了相同造化的孩子,如果生在贫寒人的家庭,由于没有福禄的耗费,不一定会夭折。“贫寒”一词有问题,既然是贫寒之命,如何可以生在富贵人家呢?既然生在富贵人家,又如何称其为贫寒之命呢?这是传统命理的思维方式,认为禀赋与命运是惟一的对应关系。既然同一种禀赋,可以处于富贵与贫寒两种状态之下,那么,禀赋与命运就不是惟一的对应关系。 由此看来,同样一种禀赋,具有某种同样,或者大致相当的福报。因为所处的家庭环境不同,对其福报的“消耗”也不同,从而命运的过程和状况也不同。这种理论应该可以推广到所有的命理分析中去。 下面的案例来自于纪晓岚的《阅微草堂笔记》,袁树珊在《中国古代命理探源》中也有摘录。 “按推算干支,或奇验,或全不验,或半验半不验;余尝以闻见最确者,反复深思,八字贵贱贫富,特大概如是,其间乘除盈缩,略有异同。无锡邹小山先生夫人,与安州陈密山先生夫人,八字干支并同。小山先生官礼部侍郎,密山先生官贵州布政使,均二品也。论爵,布政不及侍郎之尊;论禄,则侍郎不及布政之厚,互相补矣。二夫人并寿考,陈夫人早寡,然晚岁康强安乐;邹夫人白首齐眉,然晚岁丧明,家计亦薄,又相补矣。此或疑地有南北,时有初正也”。 显然,纪晓岚提出了两个重要的概念:一是命理“贵贱贫富,特大概如是”;另一是“乘除盈缩,略有异同”。两位夫人具有完全相同的禀赋,所以她们具有相同的福报。由于后天的差异,二人在寿元、子嗣、钱财以及丈夫的爵禄方面,明显存在互补现象在起约束作用,有所得必有所失。 我们可以做一个理想实验:两位夫人的时辰一样,理论上可以看成是一个人。因为命理是关于时辰分析的学说,既然是同一个时辰,那幺,理论上她们是一个人。她们的命运,可以看成同一个人在不同的环境下的不同过程。这表明人的命运在后天是可以有差异的,这种差异并非全部由先天来决定,而是后天的环境,或者是自己的选择来决定。例如,如果选择爵,则可能付出禄的代价;选择子,则可能付出寿的代价,等等。每一个人在后天都在一定程度上的选择权利,从而,理论上说,每一个人都可以缔造自己的命运,自然,人们的命运就可能偏离传统命理的逻辑过程。 为了考察地域和时间对命理的影响,纪晓岚又例举了案例如下:“余第六侄与奴子刘云鹏,生时只隔一墙,两窗相对,两儿并落蓐啼。非惟时同刻同,乃至分秒亦同。侄至十六岁而夭,奴子今尚在。岂非此命所赋之禄,只有此数。侄生长富贵,消耗先尽;奴子生长贫贱,消耗无多,禄尚未尽耶?盈虚消息,理似如斯,俟知命者更详之”。纪晓岚的记述,是罕见的命理案例:不但同辰,而且同地。此二人的命运毫无相同之处。说明相同八字的人拥有大致相当的福报,因为所处的家庭环境不同,对其福报的“消耗”也不同,从而命运的过程和状况也不同,这种理念可以对他们的命运作出合理解释,而且只能如此。这就是所谓“全不验”的情形。 下面我们来建立一个新的模型。假定存在一个常数,是量的概念。每一个人都拥有一个这样的量值,自然,相同的禀赋拥有相同的数值。这是可以接受的假定。我们换一种表述;假定这是天地给予每一个人的规定。依照这种描述,我们可以尝试建立命理模型如下:命理常数=妻+财+子+……+禄设:命理常数为C,妻为XQ,财为XC,子为XZ,禄为XL,寿为XS,其它为XX, 有:C=XQ+XC+XZ+XL+XS+XX 以上是一个六要素命理模型,前提是:X系列是可变因素,并假定X系列之间是简单线性关系。这样就可以解释一系列传统命题: 1,“吃亏是福”。按照命理模型理论的解释, “获得”是命理模型的消耗指标,而“吃亏”则正好相反,。例如,抑制木炭的燃烧速度,则必然延长它的燃烧寿命。由于命理常数的存在,“吃亏”所产生的某些要素值的减少,必然导致其它要素值的增加。这里所谓的“福”,是指的某种属性的转移,而不是总量的增加。命理与宿命的根本区别就在于,宿命否认这种转移的可能性,而命理则肯定它。人的生命的积极意义,在于让这种转移更具有价值。 2,“破财免灾”。按照五行生克理论的解释,“灾祸”是一种客观现象,也是一种必然现象。宿命的观点认为灾祸是不可避免的过程,然而,依照命理模型理论的解释,灾祸虽然不可以避免,但却具有转移的可能性。“灾祸”是某种命理要素的一种值的改变,通过将这种值的改变,转移到钱财方面,也就是“富”的减值过程,则可以达到某种消灾的目的。 3,“贪财坏印”。以公职人员为例:如果一个公职人员的命理常数一定,但在钱财上过于贪婪,即所谓在“富”上获得过多,则必然拖累其在“贵”上的命理数值,也就是降职。严重的甚至会损害到“寿”的数量,或者损害到其它的命理要素方面,这是显然的道理。等等。 命理模型需要一个完整的命理要素集合。古代命理常用的要素前面已经提及,它们是:妻、财、子、禄、富、贵、福、寿、父、母、兄、弟。其中“富”与“财”,“禄”与“贵”相互重迭,福可代指荣辱、顺逆,较为抽象。 《子平真诠评注》沉孝瞻:“大凡命中吉凶,与人愈近,其验益灵。富贵贫贱,本身之事,无论矣,至于六亲,妻以配身,子为后嗣,亦是切身之事。故看命者,妻财子禄,四事并论,自此之外,惟父母身所自出,亦自有验。所以提纲有力,或年干有用,皆主父母双全得力。至于祖宗兄弟,不甚验矣”。 参照各种理论,我们有: 命理要素集:妻、财、子、禄、福、寿、父、母、兄、弟……。 当然,专业人士会全面理解各要素的含义。例如兄弟包含姐妹的内容,父母包含叔伯姨姑的内容,寿包含身体、疾病、夭折的内容,妻包含妾、情人、异性的内容,等等。前面已经们给出过一个包含六要素的模型,是理论模型的简化版本。由于要素与要素之间的属性不同,例如寿的单位是年,财的单位是元,子的单位是个,所以,要素之间具有独立性。 模型右边的要素之间是互为因果关系,或函数关系。当某一个要素发生变化,则必然导致其它的要素进行适当的调整,这是命理与宿命之间的本质区别。 命运的展开首先是由命理模型来解释的,而命理要素的展开,是由格局学说来解释的,例如富格、贵格,或是富贵双全格,等等。《渊源集说》:“身弱徒然入格,纵发早亡”。 发,可以理解为发展,指的是在富贵。入格,是具备了富贵条件的意思。身弱,表明日元失令寡助。身弱不胜财官,恃强所得必然招损,这是命理常识。所以说“纵发早亡”。“纵发”,说明命弱时也可以发;“早亡”,则需要付出寿元的代价,这里讲的是富贵与寿元之间的消长,或者说调整和转移问题。 按照传统的命理分析,身弱是不可胜任财官的,也就是说,日元弱的人,理论上是不可能“发”的。《渊源集说》讲“纵发”,则说明命运是可以违反命理常识而产生变化的,这时候,只能用“早亡”来描述。纵发也不一定早亡。因为人一生除了财之外,不光是寿,还有妻、子、禄,等等,可以互相转移。另外,财来财去,正负为零,也不一定伤及寿元,所谓“破财免灾”,就是这个意思。财富厚的人,多资助他人,或捐助些慈善事业,从命理学上讲是有百利而无一害。所谓阴德,无非是讲人的付出,终究对人的总体命运来说,包括宗族,具有隐秘的益处。这种无法指明的回报,人们称之为“阴德”。 《金玉赋》说:“八字无财,须求本分;越外若贪,必招凶事”。无财,是禀赋贫寒的意思。贫寒者求富,也是人之常理。但是,思之太过,则称之为贪。贪则可以突发,那就是“越外”,所以“必招凶事”。贫寒属于命理要素“富”的范畴,贫寒是指“富”的量值低下,这里讨论的是先天获得的“富”的空间数值较小的情况。如果后天不适当地增加自己“富”的量值,必然引起其它要素的调整要求,而且是向下调整。所以说“必招凶事”。“凶事”的对象是泛指,是除了“富”以外的所有命理要素。不当的拓展“富”的空间,必须以降低其它命理空间为代价。 《论兴亡》说:“如有高见明识,知进退存亡之机,而保其身者,虽官禄逢伤,六亲免祸,亦当自己受恶疾而终者矣”。这一段谈的是伤官见官的情形。高明者,说的是知命之人;进退存亡之机,说的是命理要旨。纵然是知命的高人,也不能避免灾祸的降临,只不过可以在财官、六亲、身体和寿元上进行调整和转移罢了。不可避免,不等于是宿命。主动进退,以图存亡,这才是中国命理存在的意义。 《子平真诠评注》原序:“人能知命,则营竟之心可以息,非分之想可以屏”。营竟之心,本是常理。有了营竟之心,人们后天可以奋发图强,实现理想。社会在竞争中,不断拓展人们命运的相对空间。同样的命造,在不同的文明之下,其现实内容是不相同的。换句话说,命理常数在更大的尺度上,是社会文明的函数。非分之心,确不可要。有了非分之心,则命运的调整将失去控制,命理的空间结构将失去平衡,紊乱和崩溃将不可避免。 任铁樵在注《滴天髓.何知章》中说:“倘使富人无子,能轻其财与亲族之中,分多润寡,何患无子哉”?这句话的意思很明显,后天行为的取向可以影响人的命运。轻财与得子。
View Details