python的类属性与实例属性——继承与java或php的差异

写java、php写多了,以为python的类跟他们是一样的,结果今天遇到一个类属性的诡异现象,跟完发现在类属性上,python有个很特殊的地方,就是在子类调用父类的方法修改父类属性时,会影响到同进程的其它子类实例。例子如下:

class TestBase:
 test={}
def __init__(self, key):
self.test[key] = 1
def get(self):
return self.test

class TestA(TestBase):
def get(self):
return self.test

class TestB(TestBase):
def get(self):
return self.test

阅读全文

python解析和打包protobuf

概述

Protocol Buffers,简称protobuf或pb,是Google公司开发的一种数据描述语言,类似于XML和JSON能够将结构化数据序列化用于数据存储、通信协议等方面。目前官方支持C++、JAVA、Python等三种编程语言。

与XML和JSON相比,protobuf在配置时将数据key映射为递增数字,使用二进制传输,并能够根据schema自动生成各语言的打包、解析回kv的代码,非常方便各语言数据互通,且有以下优点

1. 数据文件只需原来的1/10至1/3  #相同的数据,大小只有json的1/10 2. 解析速度是原来的20倍至100倍 3. 通过递增数字做key传输value,减少了二义性,在接口发生变化时完全像后兼容 4. 非常容易自动生成各语言中使用的数据访问类,将数据key根据schema自动转回易理解的英文key protobuf不是用来替代json和xml的,它最初的目的是为了更小的带宽占用、更快的传输速度,所以使用数据key+二进制传输,也产生了一些缺点: 1. 对人不可读。(适合加密数据传输) 2. 不能发给web浏览器,比如js无法处理这种数据。(适合c、java、python语言开发的程序间共享数据) 3. 开发适配成本高,不适合schema经常变的场景。(适合公司内部各产品间相对通用稳定的协议通信)

安装和使用

前提:需要gcc, gcc-c++, make, build等编译环境
#yum -y install gcc gcc-c++ libstdc++-devel make build

阅读全文

使用python的包管理工具—pip

1 前言

pip 是一个Python包管理工具,主要是用于安装 PyPI 上的软件包,可以替代 easy_install 工具。

2 获取pip

2.1 脚本安装pip

$ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py

$ python get-pip.py

2.2 使用包管理软件安装

$ sudo yum install python-pip

$ sudo apt-get install python-pip

2.3 更新pip

$ pip install -U pip

3 pip基本使用

3.1 安装PyPI软件

$ pip install SomePackage

  [...]
  Successfully installed SomePackage

3.2 查看具体安装文件

$ pip show --files SomePackage

  Name: SomePackage
  Version: 1.0
  Location: /my/env/lib/pythonx.x/site-packages
  Files:
   ../somepackage/__init__.py
   [...]

3.3 查看哪些软件需要更新

$ pip list --outdated

  SomePackage (Current: 1.0 Latest: 2.0)

3.4 升级软件包

$ pip install --upgrade SomePackage

  [...]
  Found existing installation: SomePackage 1.0
  Uninstalling SomePackage:
    Successfully uninstalled SomePackage
  Running setup.py install for SomePackage
  Successfully installed SomePackage

阅读全文

python使用ConfigParser读写配置文件

Python 读取写入配置文件很方便,可使用内置的 configparser 模块,位置在 “python27/lib/configparser.py”,该模块支持读取类似ini/conf格式的配置文件。

基础读取函数

  • -read(filename)  直接读取文件内容
  • -sections()  得到所有的section,并以列表的形式返回
  • -options(section)  得到该section的所有option
  • -items(section)  得到该section的所有键值对
  • -get(section,option)  得到section中option的值,返回为string类型
  • -getint(section,option)  得到section中option的值,返回为int类型,还有相应的getboolean()和getfloat() 函数。

基础写入函数

  • -write(fp)  将config对象写入至某个 .init 格式的文件  Write an .ini-format representation of the configuration state.
  • -add_section(section)  添加一个新的section
  • -set( section, option, value)  对section中的option进行设置,需要调用write将内容写入配置文件 ConfigParser2
  • -remove_section(section)  删除某个 section
  • -remove_option(section, option)  删除某个 section 下的 option

代码示例

#config.ini文件
[main]
version = 20110921

[win]
pos = 0,0

#代码

>>>import ConfigParser
# RawConfigParser 基本配置类
# ConfigParser 继承之RawConfigParser类,实现了智能特性
# SafeConfigParser 继承至ConfigParser,实现了更多智能特征,实现更有可预见性,新的应用更偏好这个版本

阅读全文

arduino学习之—机械6足虫的制作

上一篇,我们为6足虫的制作提前准备研究了下 舵机的使用 ,这次,我们开始动手,实现我们的机械6脚虫虫。

准备的材料如下:

3个舵机(用于控制虫子的6条腿)、1个有一定硬度的铁丝(我用的铁质衣撑,用于制作6条腿)、1个核桃露瓶子(用于做虫身)、1个红外线发射和接收器(用于遥控)、1个led灯(用于遥控按下提示灯)、1个220的电阻、1块arduino uno板子及若干连接线。

思路:

阅读全文

arduino学习之—舵机的使用

上一篇文章我们讲到了使用红外线发射和接收装置控制led,儿子看后表示能不能做个遥控器控制一个小虫子走路,研究了一下,打算用两个舵机实现,每个舵机负责虫子的两只脚。本文先用学习一下舵机的使用,并用两个舵机测试一下这种想法的可行性。为了降低测试成本,在某宝5块多的价格买了几个9g的微型舵机。

%e8%88%b5%e6%9c%ba

舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。

阅读全文

arduino学习之—使用红外线发射和接收装置

之前我们学习了如何 使用开关控制led灯,这次我们尝试用红外线发射接收装置代替开关 来远程控制led灯。

不同的红外线遥控器的编码方式不同,我们选用了新手常用的NEC协议遥控器:

yaokong

红外接收装置连线图(led灯连线不再赘述)

test红外接收器

如图将VOUT接到10号端口,GND接到实验板上的GND,VCC接到实验板上的+5v

连线效果图:

IMG_3707

开发环境安装IRremote扩展

IRremote扩展在硬件上支持多种主控板,软件上支持多种红外协议本,而且便于扩展和用户自定义,使用比较广泛。

阅读全文

arduino学习之—通过PWM可调电阻调节led亮度

Pulse Width Modulation 就是通常所说的PWM,译为脉冲宽度调制,简称脉宽调制。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,由于计算机不能输出模拟电压,只能输出0 5V 的的数字电压值,我们就通过使用高分辨率计数器,利用方波的占空比被调制的方法来对一个具体模拟信号的电平进行编码。

简单来说就是个可调的旋钮,值随着旋转角度而变化,从而用来控制灯的亮度、轮子的转动速度等。

阅读全文

从Code Review 谈如何做技术

这两天,在微博上表达了一下Code Review的重要性。因为翻看了阿里内部的Review Board上的记录,从上面发现Code Review做得好的是一些比较偏技术的团队,而偏业务的技术团队基本上没有看到Code Review的记录。当然,这并不能说没有记录他们就没有做Code Review,于是,我就问了一下以前在业务团队做过的同事有没有Code Review,他告诉我不但没有Code Review,而且他认为Code Review没用,因为:

阅读全文

arduino学习之—蜂鸣器的使用

上一篇,我们学习了如何使用开关控制led灯,这一次,我们学习一下如何使用蜂鸣器。

蜂鸣器的使用方式和原理与led完全相同,高电平就发出声音,底电平静音,迅速的给高低电平就能发出滴滴类的声音。我们直接使用上一次的连线方法,把端口2位置的led换成蜂鸣器,把端口2的单次高电平改为20ms间隔的滴滴声。

由于连线图除2端口的led变为蜂鸣器外其它无变化就不上图了,代码调整如下:

阅读全文

arduino学习之—使用开关控制led灯

在上一篇arduino学习之—led灯控制中,我们做了用输出口高低电瓶控制led闪烁的尝试,并使用pc发送指令的方法控制led的熄灭。

本篇学习如何利用输入口接收开关装置的信号,替换pc发指令来控制led。具体思路:如果按下开关,顺序亮起所有led灯;否则,闪烁灯每2秒闪烁一次,其它灯熄灭。

具体连线和代码如下:

IMG_3651

IMG_3652

led.ino

—————————–

int flickerPin = 8; //闪烁端口
int orderPin = 2; //顺序亮起起始端口
int orderLen = 6; //顺序亮起端口个数
int onoffPin = 9;//开关输入端口
int i=0;
void setup() {
//开关端口初始化
pinMode(onoffPin, INPUT);
//闪烁端初始化
pinMode(flickerPin, OUTPUT);
//闪烁端初始化
pinMode(flickerPin, OUTPUT);
//顺序亮起端口初始化
for(i= orderPin;i<orderPin+orderLen;i++){
pinMode(i, OUTPUT);
}

阅读全文

重构并非难在如何做,而是难在何时开始做

大多数架构师在回顾重构过程的时候都会感慨:“要是早点重构就不会这么麻烦了”,不过在下一次重构到来之前,永远没人知道“早点”究竟是何时,同样的感慨会反复被提起。那到底有什么办法找到最合适的重构时机?本文作者杜欢是滴滴平台产品中心技术总监,他就这个问题进行了探讨,不一定能找到最终答案,或者这个问题本身就没有答案,但希望能给读者一些思路,如果你有想法,别忘了评论。

阅读全文

正在考虑微服务架构的松耦合?小心这些陷阱!

微服务是一种新的架构,它使用简单、轻量、松耦合的服务来构建系统,这些服务彼此可以独立开发和发布。

如果你还不了解这些基础概念,请阅读Martin Fowler的文章(http://martinfowler.com/articles/microservices.html)。如果你想拿它和SOA进行比较,请看Don Ferguson的演讲(https://www.youtube.com/watch?v=W7tGlxJtofI)。Martin Fowler还写了《微服务的权衡》(http://martinfowler.com/articles/microservice-trade-offs.html)和《何时使用微服务》(http://martinfowler.com/bliki/MicroservicePremium.html),帮你决定什么情况下微服务是有用的。

阅读全文

arduino学习之—led灯控制

这里使用arduino UNO r3板子+7个电阻+7个led来学习如何实现定时闪烁和顺序亮起。

通过led控制可以了解arduino板子的基本控制和执行原理:GND作为负极来使用,2-13做为可控制的正极来使用。给对应端口高电平即会使通路通电,低电平可以理解为断电。增加电阻是为了降低电流避免烧坏led。

儿子的需求:

默认10端口灯一直保持闪烁,2-7端口灯顺序亮起后保持常亮;发送指令后,所有灯全灭;2秒后,10端口闪烁一次后,2-7端口顺序恢复常亮。

阅读全文

分布式队列编程:模型、实战

介绍

作为一种基础的抽象数据结构,队列被广泛应用在各类编程中。大数据时代对跨进程、跨机器的通讯提出了更高的要求,和以往相比,分布式队列编程的运用几乎已无处不在。但是,这种常见的基础性的事物往往容易被忽视,使用者往往会忽视两点:

  • 使用分布式队列的时候,没有意识到它是队列。
  • 有具体需求的时候,忘记了分布式队列的存在。

文章首先从最基础的需求出发,详细剖析分布式队列编程模型的需求来源、定义、结构以及其变化多样性。通过这一部分的讲解,作者期望能在两方面帮助读者:一方面,提供一个系统性的思考方法,使读者能够将具体需求关联到分布式队列编程模型,具备进行分布式队列架构的能力;另一方面,通过全方位的讲解,让读者能够快速识别工作中碰到的各种分布式队列编程模型。

阅读全文

10条命令分析Linux性能问题

当你登录到一台存在性能问题的Linux服务器上时,在头一分钟,你会检查什么?

我们看看Netflix的性能工程师是怎么做的。

Netflix大量使用EC2 Linux服务器,很多时候是用一些较为高层的工具做云或实例层次的分析。不过有时仍然需要登录到某个实例上,运行一些标准的Linux性能工具。

在最开始的一分钟内,可以先利用手头的标准Linux工具大致了解性能状况。借助如下10条命令(有些命令需要安装sysstat包),了解系统资源使用状况和正在运行的进程。先检查错误(errors)和饱和度(saturation),再检查资源利用率(resource utilization)。饱和度指的是负载已经超过处理能力,像请求队列的长度,等待时间等。

阅读全文

基于词槽的简单query匹配方法

我们在做类似搜索相关的特定服务时,通常都会遇到分词解析query,取出其中特定关键字进行检索的问题,这里提供一个简单的基于词槽的query匹配方法。

首先给出一个query示例:北京飞三亚机票多少钱?

我们需要达到的目标:

1.判定这个query的分类

2.解析出机票分类query中的起点和终点

3.从数据中检索对应数据并返回展示

这3个目标对应3个专业名词:1.da识别 2.pattern解析 3.召回判定。

阅读全文

论架构师的自我修养

架构师,当然是脑力劳动者,但是,同样是脑力劳动也存在重大的差别。有一类脑力劳动的成果,是比较容易被评价的。或者能够判断其对错:比如考试的分数;或者能够比较其高下:比如两个人下棋分出输赢;或者能够交由市场来判断:比如某种UI/UE设计,我们可以通过数据统计,了解其受用户欢迎的程度。

但是,架构设计只是软件开发过程中的一个环节,而在这个多人协作的场景中,我们很难单独评价架构的优劣。由于硬件、软件、部署、人员、测试、用户、市场等众多的差别,即使是非常相近的两个系统,我们也很难判断两个架构孰优孰劣。比如:eBay的架构与Taobao的架构哪个更加优秀?在交付拖延的时候,我们可以将问题归咎于开发团队的效率低下。在出现质量问题的时候,我们可以将问题归咎于测试团队的疏忽大意。在负载撑不住的时候,我们可以将问题归咎于运维团队不够专业,甚至是竞争对手的DDoS攻击。那么,在出现什么样的问题的时候,我们可以将责任归咎于架构呢?

阅读全文

不懂点CAP理论,你好意思说你是做分布式的吗?

CAP是什么?

CAP理论,被戏称为[帽子理论]。CAP理论由Eric Brewer在ACM研讨会上提出,而后CAP被奉为分布式领域的重要理论【link1】 。

分布式系统的CAP理论

首先把分布式系统中的三个特性进行了如下归纳:

  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
  • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
  • 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

高可用、数据一致性是很多系统设计的目标,但是分区又是不可避免的事情。我们来看一看分别拥有CA、CP和AP的情况。

CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但其实分区不是你想不想的问题,而是始终会存在,因此CA的系统更多的是允许分区后各子系统依然保持CA。

阅读全文

技术团队如何发现和培养Tech lead?

在影响团队长远战斗力的诸多因素中,比较有意思同时也非常关键的一个因素是对tech lead 的选择和培养,这也是我们今天的话题。

千军易得,一将难求

对技术团队来说,怎么强调tech lead的重要性都不算过分。好的tech lead能极大程度提升团队的凝聚力和执行力;严重不合格的tech lead会导致团队迅速崩溃,但好在暴露快、时间短、危害小。接近合格水平的tech lead则既不容易替换,又让产品的进度和质量缓慢、持续下降,处理不好的话会积重难返,最终变成灭顶之灾(接近合格水平的技术经理也一样)。

阅读全文