分类 学习笔记 中的文章

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

学习、梳理设计模式。 模版方法模式 模版方法模式,以继承的方式来实现,提升代码的复用性,适合具有相同或相似的步骤的逻辑处理。 由抽象基类和具体子类来具体实现。 抽象基类 具体的逻辑抽象为几个步骤,具有相同步骤的可以抽象为基本方法,不同的可以抽象为抽象方法,对于有个性化需求的(比如不是所有步骤都需要的)可以用钩子来进行控制,最后是组合这些步骤的模版方法。 基本方法 抽象方法 可选钩子(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 ……

阅读全文

自己动手写一个PHP组件

花了两天时间把《Modern PHP》看了一遍,深有感触~~~ 现在看看以前写的代码简直就是一坨屎(没看这本书之前最多是半坨屎23333)。代码风格、组件思想、包管理等等等等,无颜以对写的代码。本来也打算再次重构一些项目的,现在这种愿望更强了。。好了,废话不多说,开始着手写一个IMDb组件,这个组件用于指定一个title值,便可返回该部电影的详细信息。 事实上我就是跟着《Modern PHP》的Create-PHP-Components章节一步一步做的。 目录结构 这里请参考 https://github.com/thephpleague/skeleton 非常详细 值得说明的是,准备写的IMDb组件没有tests composer.json 这是IMDb的composer.json, 并不是很完善。也是参考上述示例项目的 { "name": "xu42/imdb", "description": "Crawl IMDb movie rating, content rating, release date, poster, presentation, director, actor, duration and other information", "keywords": [ "xu42", "imdb" ], "homepage": "https://github.com/xu42/IMDb", "license": "MIT", "authors": [ { "name": "xu42", "homepage": "http://xu42.cn", "role": "Developer" } ], "require": { "php" : "~5.5|~7.0" }, "autoload": { "psr-4": { "Xu42\\Imdb\\": "src" } } } 功能实现 这个组件的功能很早就实现了,但之前写的就是一坨屎, 改之后是这样的, 虽然还不是很优雅,但相比之下,还是看着舒服多了。 1.……

阅读全文

配置nginx + php7 + mongodb的centos服务器环境

重构、重构、重构 大三下学期了,面试某公司,结果连技术面都没过,╮(╯▽╰)╭,还是有一点打击的。不过也有打算重构一下两个小项目的,希望以此叩开实习的大门。记录一下全过程! 重构前 这部分主要是服务器的搭建。 之前Github学生认证,送了DigitalOcean 100刀,买了一台位于新加坡节点的512 MB Memory / 20 GB Disk / SGP1 - CentOS 6.7 x64 编译nginx mongodb … 前的准备 yum update yum install wget gcc gcc-c++ perl vim 编译 nginx 先把所需要的库下载安装好 zlib pcre openssl zlib http://zlib.net/zlib-1.2.8.tar.gz pcre http://ftp.cs.stanford.edu/pub/exim/pcre/pcre-8.38.tar.gz openssl http://www.openssl.org/source/openssl-1.0.1s.tar.gz cd /usr/local/src/ wget http://nginx.org/download/nginx-1.9.12.tar.gz tar xzf nginx-1.9.12.tar.gz cd nginx-1.9.12 ./configure --with-http_v2_module --with-http_ssl_module --with-pcre --with-openssl=/usr/local/src/openssl-1.0.1s make make install 编译参数很多,但这里我用的很少,主要原因还是自己不太熟悉,至于怎么优化,留给以后深入学习nginx再继续。 当启动nginx出现了这个错误error while loading shared libraries: libpcre.……

阅读全文

DES算法中子密钥的产生

DES (数据加密标准 Data Encryption Standard),因密钥长度过短及可能含有的后门引起争议,现也已经不在作为标准,由AES取代。在学了《网络安全技术》关于加密算法中的DES后,写了这一篇笔记,主要写的是DES算法中子密钥的生成算法。 初始密钥也称种子密钥,64位,经过子密钥换位表PC-1的变换后,由64位变成56位,这56位分为两组C0和D0; > 子密钥换位表PC-1 57 49 41 33 25 17 09 01 58 50 42 34 26 18, 10 02 59 51 43 35 27 19 11 03 60 52 44 36 63 55 47 39 31 23 15 07 62 54 46 38 30 22, 14 06 61 53 45 37 29 21 13 05 28 20 12 04 C0和D0作一次循环左移得到C1和D2; > 循环左移的规则为:16次循环,每次左移 1 1 2 2, 2 2 2 2, 1 2 2 2, 2 2 2 1……

阅读全文

学习笔记 | MySQL 数据类型

最好的资料是 官方文档 !!! Data Type Storage Requirements Numeric Types | 数值型 官方说明文档: https://dev.mysql.com/doc/refman/5.6/en/integer-types.html > TINYINT, 1Bytes > SMALLINT, 2Bytes > MEDIUMINT, 3Bytes > INT, 4Bytes > BIGINT, 8Bytes > FLOAT | DOUBLE | DECIMAL ,指定精度 FLOAT(5,3)可以显示 12.345,超过这个范围进行四舍五入。不指定精度时,FLOAT和DOUBLE按照实际的精度显示,而DECIMAL默认整数位为10小数位为0。FLOAT为4Bytes, DOUBLE为8Bytes, DECIMAL最大支持位数65. 可以参照这篇介绍 和 这一篇 String Types | 字符串 官方说明文档:https://dev.mysql.com/doc/refman/5.6/en/string-types.html > CHAR(L) 与 VARCHAR(L),L表示L个字符个,而非L个字节,UTF8编码中,一个汉字字符占3Bytes > CHAR 定长,长度0~255,例如CHAR(4),可以存储4个字符,不足4个字符时在后面补空格后存储,超过则截断,取出该字段时将自动过滤掉后边的空格,除非 PAD_CHAR_TO_FULL_LENGTH 模式已启用 > VARCHAR 可变长,长度0~65535,例如VARCHAR(4),英文下存储2个字符时占用3bytes,存储4个字符时占用5bytes,超过则截断 > BLOB 类的用于存储二进制,TEXT 类的用于存储字符串。均不能有默认值 > ENUM , gender ENUM('0', '1'), 表示gender字段只能存放 ‘0’, ‘1’其中的一个值, 官方文档 > SET , major SET('computer', 'network'), 表示major字段可存放 ‘’, ‘computer’, ‘network’, ‘computer,network’其中四个中的一个值, 官方文档 Date and Time Types | 日期和时间 官方说明文档:https://dev.……

阅读全文