设计模式学习 - 适配器模式

学习、梳理设计模式。 适配器模式 不兼容的转换为兼容的,为解决兼容问题而生。 实现方式可分为组合方式和继承方式。 举个例子,充电宝只能用二相电供电,但现在只有三相电该怎么办呢? 三相电实例 /** * 三相电 */ public class ThreePlug { public void powerWithThree() { System.out.println("使用三相供电"); } } 二相电接口 /** * 二相接口 */ public interface TwoPlugInterface { /** * 二相电流供电 */ void powerWithTwo(); } 充电宝 /** * 充电宝 */ public class PowerBank { /** * 需要二相供电 */ private TwoPlugInterface twoPlugInterface; public PowerBank(TwoPlugInterface twoPlugInterface) { this.twoPlugInterface = twoPlugInterface; } public void power() { twoPlugInterface.powerWithTwo(); } } 组合方式 我们来定义个三相适配器(接收三相电,对外提供二相电)。……

阅读全文

设计模式学习 - 模版方法模式

学习、梳理设计模式。 模版方法模式 模版方法模式,以继承的方式来实现,提升代码的复用性,适合具有相同或相似的步骤的逻辑处理。 由抽象基类和具体子类来具体实现。 抽象基类 具体的逻辑抽象为几个步骤,具有相同步骤的可以抽象为基本方法,不同的可以抽象为抽象方法,对于有个性化需求的(比如不是所有步骤都需要的)可以用钩子来进行控制,最后是组合这些步骤的模版方法。 基本方法 抽象方法 可选钩子(Hook) 模版方法(final) /** * 宠物基类 */ public abstract class AbstracthPet { /** * 喂食 */ public final void feedingTemplate() { //1. buyFood(); //2. cook(); //3. pourInDish(); if (isAddMilk()) { //4. addMilk(); } } protected boolean isAddMilk() { return true; } private void buyFood() { System.out.println("1. 买粮"); } protected abstract void cook(); private void pourInDish() { System.out.println("3. 倒入盘子"); } private void addMilk() { System.……

阅读全文

设计模式学习 - 单例模式

学习、梳理设计模式。 单例模式 单例模式分为饿汉模式和懒汉模式。 饿汉模式 私有化构造函数 创建私有实例 提供公开的获取实例的方法 public class Person { private static Person instance = new Person(); private Person() { } public static Person getInstance() { return instance; } } 懒汉模式 私有化构造函数 声明私有实例 提供公开的获取实例的方法(获取时为空则进行创建) public class Person { private static Person instace; private Person() { } public static Person getInstance() { if (instace == null) { return new Person(); } return instace; } } 总结 两种模式都需要先私有化构造函数以禁止直接new操作来创建实例,不然就失去了单例的意义。……

阅读全文

有赞云GoLang版SDK 非官方

前段时间看了些GoLang的资料,要上手熟悉就得造轮子,so.. 造了个GoLang版本的有赞云SDK。 Talk is cheap. Show me the code… GitHub: https://github.com/xu42/youzan-sdk-go GoDoc: https://godoc.org/github.com/xu42/youzan-sdk-go GoLang写出来确实简洁,总共也没多少行代码… 使用 这里仅举例获取Token和调用示例API 生成Token package main import ( "fmt" "github.com/xu42/youzan-sdk-go" ) func main() { // 获取自用型AccessToken resp, err := youzan.GenSelfToken("CLIENT_ID", "CLIENT_SECRET", "110") fmt.Println(resp, resp.AccessToken, err) // 获取自用型AccessToken resp1, err1 := youzan.GenToolToken("CLIENT_ID", "CLIENT_SECRET", "CODE", "URI") fmt.Println(resp1, resp1.AccessToken, err1) } 调用API package main import ( "fmt" "github.com/xu42/youzan-sdk-go" ) func main() { params := map[string]string{ "page_no": "1", "page_size": "10", } result, err := youzan.……

阅读全文

Go couldn't start listener listen tcp lookup localhost no such host

使用GoLang进行debug时, 报了这么个错couldn't start listener: listen tcp: lookup localhost: no such host 其实很简单,是因为本地的hosts文件少配置了127.0.0.1 localhost 为什么少了这行配置?可能是其他开发时切换了hosts配置而刚好那个配置没有加这一行 添加这一行后如果没有生效,记得清一下缓存 (hugo的文章标题竟然不能带标点符号:…) End………

阅读全文

Go vet composite literal uses unkeyed fields

在使用go vet进行语法检查时, 报了这么个错composite literal uses unkeyed fields 对于刚开始看Golang的我一脸懵逼, 明明是可以编译通过且跑通的… struct 是这样定义的 type CallRequest struct { AccessToken string APIName string APIVersion string APIParams map[string]string } 代码里是这样用的 // ... 省略 ... request := CallRequest{accessToken, apiName, apiVersion, params} 然后 go vet ./... 就报错了... composite literal uses unkeyed fields 看了些资料后知道了, 这样写更严谨一些: request := CallRequest{AccessToken: accessToken, APIName: apiName, APIVersion: apiVersion, APIParams: params} End………

阅读全文

Travis 持续集成 GoLang 工程, 配置 踩坑记录

最近看了一些GoLang方面的文章,平时用来写一些脚本还是比较不错的。尤其是其可编译为二进制单一文件跨平台运行的特性,实在是让人喜爱。就我个人来说,解决了给没有计算机编程基础的人的环境下跑脚本要安装一堆环境/依赖的痛点。travis作为优秀的持续集成服务,其诸多的特性也值得尝试一下,与GitHub进行完美的结合,支持打包部署到项目release,当然travis的特性并不只有这些。 Travis-ci 首先,需要注册一下 Travis-ci ,直接使用GitHub授权登陆即可。 授权之后会要求进行同步GitHub项目,对需要使用Travis服务的勾选即可,Travis会自动给勾选的项目添加一个钩子,每当push代码就会触发Travis测试任务。当然,也可以手动到Travis进行手动触发(Trigger build),且可直接指定某一个commit触发。 ⚠️踩坑记录 Travis-ci.org是只支持public repo的,如果有private的需求的,可以到Travis-ci.com 如果有repo没有显示出来,可以在Travis的profile页面执行Sync account 如果是所属的组织没有显示出来,可以点击Review and add 进行授权同步。 .travis.yml .travis.yml文件是Travis服务读取项目配置的文件,支持多种语言,这里是GoLang的参考配置,支持上面介绍的打包部署。配置项这里不细讲,网上有很多介绍的文章。 可以在Job log控制台看到执行情况。 ⚠️踩坑记录 Travis打包部署到GitHub需要授权,可以通过Token的形式进行授权,这需要在.travis.yml配置文件的deploy块的 api_key 进行说明,然后需要在 Github Token 页生成一个包含repo权限的Token,然后在Travis项目的设置页面Environment Variables新增一条配置: Name为你在api_key处声明的变量,Value为生成的Token. 参考 https://docs.travis-ci.com/user/deployment/releases/ https://github.com/GameXG/TcpRoute2/blob/master/.travis.yml ……

阅读全文

CentOS7 firewall防火墙常用操作

记录一些常用的firewall操作。 介绍 firewalld: 动态防火墙后台程序 firewall-config: 图形化的配置工具 firewall-cmd: 命令行客户端 日常使用中,常用firewall-cmd来进行配置 使用 1. firewalld // 安装服务 # yum install firewalld -y // 查看当前防火墙状态 # systemctl status firewalld // 启用 # systemctl start firewalld // 关闭 # systemctl stop firewalld // 开机自启 # systemctl enable firewalld // 关闭开机自启 # systemctl disable firewalld 2. permanent 需要注意的是,如果要使更改永久生效,需要加上--permanent。这里的永久生效是有一定的条件的,在命令执行完成后,需要执行防火墙重载或系统重启。若没有加该参数,是立即生效的,但在防火墙重载或系统重启后即失效。 // 重载配置 # firewall-cmd --reload 3. 查看配置 // 当前运行状态 $ firewall-cmd --state // 当前活动的网络区(zone) $ firewall-cmd --get-active-zones // 查看指定zone的当前所有设置信息 $ firewall-cmd --zone=public --list-all 4.……

阅读全文

申请Google Adsense, 结合Hugo配置

申请Google Adsense终于审核通过了, 哈哈哈, 容我大笑一下下. 毕竟只是一个小小博客, 没什么访问量, 多数访问量还是这篇文章提供的. 主要记录以下从Hexo迁移至Hugo后Google Adsense的配置. 申请Google Adsense 网站不符合Google合作规范 讲真, 没什么技巧. Google拒我千百遍, 我待Google如初恋. 申请了多次均以 网站不符合Google合作规范 为由拒掉了, 翻阅互联网以这个关键词的博文, 也没有什么好的建议, 继续提交申请, 大约连着四五次, 竟然过了… 要说有什么建议, 还真没啥, 不过以下几点不确定是否有帮助: 1. 接入了Googel Aanalytics 2. 接入了Google Search Console, 有一定的Google收录(本博客截止本文写成只有约120个结果) 3. 网站稳定运行, 有一定的访问量(这个博客放在GitHub Pages, 会话数每天只有约20) 4. 不要有敏感的文字 5. … 结合Hugo even 配置 自动广告 & 广告单元 第一用Google Adsense, 瞎配置玩玩. 我用的是Even主题, 这个主题没有提供便捷的配置方式, 需要自己手动配置. 自动广告 我全局配置了自动广告, 这个可以修改themes/even/layouts/partials/head.html 文件, 添加如下代码, 记得修改为你的自动广告代码哟 <!-- Google Adsense --> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script> (adsbygoogle = window.……

阅读全文

Hexo 迁移至 Hugo

终于还是忍受不了Hexo那繁多的依赖和一片飙红, 换了使用GoLang编写的Hugo. 使用感觉良好, 生成速度很快, 文件结果也比较清晰. 值得花一点儿时间迁移一下. 坑… 迁移并不是无痛的, 有些不兼容的地方, 主要是下面几点. title 需要在title上一行加一行---. date 需要是2018-09-01T01:00:00+08:00这样的格式的. tags和categories 与hexo不同, hugo使用的是类似于数组的形式的, 例如本篇的tags就是["hexo", "hugo"], 而在hexo中则是 Hexo中配置 tags: - hexo - hugo Hugo中配置 tags: ["hexo", "hugo"] 需要注意的是, 如果使用tags和categories, 需要在根配置文件里添加下列配置 [taxonomies] tag = "tags" category = "categories" URL 因为使用hexo已经收入了一些文章, 为了保持原url, 我的原hexo的配置是 /:year/:month/:day/:title/, 需要配置一项 Hexo中配置 /:year/:month/:day/:title/ Hugo中配置 [permalinks] post = "/:year/:month/:day/:filename/" 另外, 视情况可能还需要开启区分大小写的开关 DisablePathToLower = true 差不多就是这么多了, 欢迎留言交流………

阅读全文