0%

我们知道多线程环境下,每一个线程均可以使用所属进程的全局变量。 如果一个线程对全局变量进行了修改,将会影响到其他所有的线程。 为了避免多个线程同时对变量进行修改,引入了线程同步机制,通过互斥锁, 条件变量或者读写锁来控制对全局变量的访问。

只用全局变量并不能满足多线程环境的需求,很多时候线程还需要拥有自己的私有数据, 这些数据对于其他线程来说不可见。 因此线程中也可以使用局部变量,局部变量只有线程自身可以访问,同一个进程下的其他线程不可访问。

下图给出了线程中这几种变量的存在情况:

Read more »

Django的路由是怎么回事在这里不再赘述,这里主要说一下include()的用法,以及装配路由的一点技巧。

include()

include主要有下面两种用法:

  • include(module, namespace=None)
  • include(pattern_list)
Read more »

在一些特殊场景下,可能会导致表单重复提交,如:

  • 网络延时,用户多次点击提交
  • 刷新页面导致重复提交表单
  • 后退之后再次提交表单

有些幂等操作允许重复提交表单,但大多数操作都是非幂等的,重复提交将会导致系统异常甚至系统崩溃。 所以,我们需要尽量避免表单重复提交。

这里有两种思路:

  • 前端拦截,这可以拦截绝大部分用户误操作
  • 后端处理
Read more »

Beego是一个快速开发Go应用的HTTP框架,他可以用来快速开发API、Web及后端服务等各种应用,是一个RESTful的框架, 主要设计灵感来源于tornado、sinatra和flask这三个框架,但是结合了Go本身的一些特性(interface、struct嵌入等)而设计的一个框架。

beego执行逻辑

Beego是一个典型的MVC架构,它的执行逻辑如下图所示:

Read more »

Disqus是一个非常流行的为网站集成评论系统的工具,同样,Hexo也可以集成Disqus以便可以和读者交流。

创建站点

登录Disqus后,创建一个站点:

根据提示填写表单,注意这里生成的shortname,在后面配置Hexo时会用到。

Read more »

工作空间

Go工作空间下有三个子目录:

  • src: 存放源代码
  • pkg: 编译后生成的文件
  • bin: 编译后生成的可执行文件

原则上,项目代码都应该放在$GOPATH目录下,并且按照$GOPATH/$git_url路径存放项目代码。

例如,我有一个go-demos的项目,存放路径为$GOPATH/github.com/hypc/go-demos/

项目目录结构

目录结构基本上就是一个项目的门面,很多时候我们从目录结构中就能够看出开发者对这门语言是否有足够的经验, 所以在这里首先要介绍的最佳实践就是如何在Go语言的项目或者服务中组织代码。

官方并没有给出一个推荐的目录划分方式,很多项目对于目录结构的划分也非常随意, 但是社区中还是有一些比较常见的约定,例如:golang-standards/project-layout项目中就定义了一个比较标准的目录结构。

Read more »

2009年11月,Google发布了Go语言,在世界范围内引发了轰动。 2015年和2016年中国区的Go语言大会分别在上海和北京召开,来自Go语言团队的开发人员均作了相关的报告。 纵观这几年来的发展趋势,Go语言已经成为云计算、云存储时代最重要的基础编程语言。

安装

下载相应的压缩包,并解压:

1
$ tar -C /usr/local -xvf go$VERSION.$OS-$ARCH.tar.gz

设置环境变量:

1
export PATH=$PATH:/usr/local/go/bin
Read more »

在面向对象编程中,Mixin是一种类,这种类包含了其他类要使用的方法,但不必充当其他类的父类。 其他类是如何获取Mixin中的方法因语言的不同而不同。所以有时候Mixin被描述为include(包含)而不是inheritance(继承)。

Mixins鼓励代码重用,并且可以用于避免多重继承可能导致(如钻石问题)的继承歧义,或者解决一个缺乏对一种语言的多重继承的支持。 Mixin也可以被看作实现方法的接口。这种模式是强制依赖性反转原理的一个例子。

Mixins是一种语言概念,允许程序员将一些代码注入到一个类中。 Mixin编程是一种软件开发的风格,其中功能单元在一个类中创建,然后与其他类混合。 Mixin类扮演父类的角色,包含其他类想要的功能。

Read more »

执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。

当遇到文件名(或目录名)中包含中文时,会出现乱码:

这时候可以添加参数-N,执行命令tree -N

常用别名:

1
2
alias tree='tree -CNF'
alias treel='tree -alF'

软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。

软件测试有许多方法,但对复杂的产品运行有效测试不仅仅是研究过程,更是创造并严格遵守某些呆板步骤的大事。 测试的其中一个定义:为了评估而质疑产品的过程;这里的“质疑”是测试员试着对产品做的事,而产品以测试者脚本行为反应作为回答。 虽然大部分测试的智力过程不外乎回顾、检查,然而“测试”这个词意味着产品动态分析──让产品流畅运行。 程序质量可能,而且通常会,随系统不同而有差异;不过某些公认特性是共通的:可靠性、稳定性、轻便性、易于维护、以及实用性。

软件测试类型分为:功能测试、界面测试、性能测试、容量测试、压力测试、安全测试、兼容性测试、安装测试、文档测试、 易用性测试、边界测试、健壮性测试、本地化测试、无障碍测试、回归测试、冒烟测试、随机测试、A/B测试。

Read more »