2015 再见 2016 你好

2015年,又是跌宕起伏,这几年我的生活真是丰富多彩。

此刻,我安静的在电脑前,付出了很多辛苦努力,有开心,也有一些无奈。一些事情在慢慢的变好,也有一些事情似乎有点糟糕。

这也是人之常情,我已经学会不得不学会,淡然的看这一切。

所以,也要开心的迎接新年,2015再见,2016你好。

所有看到这个文字的朋友,新年快乐!

ps

偶然在微博上碰到约20年前认识的朋友,当年的高中生已经胡子拉碴的准大叔;难得去北京开个会,又碰到了差不多十来年前实习的同学,如今也是为人父了;还有很多巧合更是难以一一说明;谨记做个好人,总是好的。

今夜,我们聊聊大数据(1) – 前言

转眼负责汇付的数据部门两年半了,时髦的大数据其实也就最近一年开始研究,而实践则是半年里的事情。

不管是不是大数据,数据都是为了某种目的服务的,这几年大数据的概念如同“云”一样,喧嚣尘上,不免有很多炒作和不实之处。

一件事情,能被炒作的这么热,hadoop以及衍伸出的很多产品,存在肯定有其道理。对于大多数人来说,大数据好像没有什么用处。说到底,大数据就是一个工具,在需要的场景下使用自然有用。就像三十年前的电脑一样,到了今天,电脑似乎哪里都在了,但实际上,有时候拿个小本子做备忘录还是最方便的,如此道理。所以,大数据既不是灵芝仙丹,也不是洪水猛兽。

大数据简单而言,就是海量数据高速运算寻找相关性。(这个概念之后会再详细解说)

我所在公司的部分业务数据的数据表都达到了亿条以上,容量几个T,在一些查询、分析、风控等业务场景需求都需要在很短时间内计算出结果,因此,随着业务发展和技术预研,一些大数据的技术被逐渐引入,积累了不少心得。

自己也是一个初学者,边学习边提高,希望对各位有所裨益。

每篇文字不会太长,之前HR负责培训的同事告诉我,现在流行微课程,7-8分钟即可,故需要与时俱进,大家时间宝贵,在几百一千字里面,简明扼要的说明一个问题。(这个前言也就到这里了)

python和数据库学习笔记-在mac下配置python和mysql开发环境

一个小项目结束,于是可以继续研究。现在研究的课题和大数据有关,数据仓库目前是在vertica上面,然后计划用公有云的方案来处理计算能力的弹性问题,也就是将部分数据从vertica导入到hive+spark中,方案还是庞大复杂的,所以除了设计整个架构以外,也继续要考虑应用端的很多实践。和spark打交道的事情就交给java了,应用层交给php+js,中间最复杂的业务逻辑自然是我现在最为推崇的python了。

好,慢慢开始学习。

任务:

  1. 在mac上搭建一个vmware上的ubuntu虚拟机,安装mysql,这样从mac的开发环境访问,比较接近真实情况
  2. python在mac上设置为可以访问mysql,且不需要安装mysql

安装vmware,我是在 osx 10.11.2 上安装的 vmware 8.0,从 ubuntu 官网上下载的 ubuntu 15.04 desktop 版本,选择 desktop 版本其实作为 server 是不太好的,不过我对linux 的熟悉程度还不够,所以考虑有图形界面比较容易使用。

在虚拟机里面安装 ubuntu 还是比较容易的,然后安装 ubuntu 后再在命令上下安装 mysql:

sudo apt-get mysql-server

 

很多google上的资料说要注意 mysql 的 root 密码之类,我在安装的时候,mysql 是主动提醒要修改 root 密码的。我安装的 mysql 版本是 5.6.27。

在 ubuntu 下比较好用的 mysql 的图形管理客户端是官方的免费的 MySQL Workbench,我安装的版本是 6.2。用这个图形客户端设置用户名、数据库之类都非常方便。

mysql 安装后在默认情况下的确不允许其他电脑连接,这个弄了我很久,很多资料都说的不对,我觉得权限给的很高也不合适,很多资料说到的 bind ip 的修改,我发现是在 /etc/mysql/mysql.conf.d/mysqld.cnf 中修改,去掉 bindip = 127.0.0.1 的设置。

在 vmware 的虚拟机上安装好 ubuntu+mysql 之后,开始在mac 开发环境连接,同样是安装 MySQL Workbench 的 mac 版本,然后就可以测试连接之类,这个方法最方便实用。

这样,比起 localhost 当然是麻烦一点,主要是为之后多环境做好一些准备(开发环境、测试环境、准生产环境和生产环境)。在 mac 上用 xampp 也是不错的,改天再测试,更加适合笔记本电脑。

对于 python 怎么连接 mysql,发现 python 世界真的发展好快,方法很多。

因为准备之后要用 petl 来进行数据库的抽取和处理,所以按照 petl 的推荐,使用 pymysql 这个库。安装用标准的 pip 即可,我用的是conda,方法一样。

mac 开发环境下是不需要安装整个 mysql server 的,但是还是要安装一些驱动的,安装 mysql 标准的 connector,参考这里,下载后,在 mac 这里是一个 dmg 安装包,安装后,可以理解为 mysql 的驱动程序就安装好了。

import pymysql

connection = pymysql.connect(host='192.168.***.***',
                             user='***',
                             password='***',
                             db='test',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

cur = connection.cursor()

cur.execute('select * from students')

for data in cur.fetchall():
    print(data)

 

当然这个用法是比较简单的,输出结果,运行ok

{‘tel’: ‘13811371377’, ‘sex’: ‘男’, ‘id’: 1, ‘age’: 20, ‘name’: ‘王刚’}

这个demo数据库的建立参考了这里,一个不错的mysql的基础教程。

大致这样,真实的开发项目会越来越复杂,且数据库应用的复杂度比独立应用高很多,希望这些经验能够给初学者们启发。

———————–后续补充

看到廖雪峰网站,上面有非常不错的python 2和3 的教程,对于安装mysql connector 有更加简单的办法

$ pip install mysql-connector-python --allow-external mysql-connector-python

 

以及非常简明实用的mysql 测试:

# 导入MySQL驱动:
>>> import mysql.connector
# 注意把password设为你的root口令:
>>> conn = mysql.connector.connect(user='root', password='password', database='test')
>>> cursor = conn.cursor()
# 创建user表:
>>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
# 插入一行记录,注意MySQL的占位符是%s:
>>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
>>> cursor.rowcount
1
# 提交事务:
>>> conn.commit()
>>> cursor.close()
# 运行查询:
>>> cursor = conn.cursor()
>>> cursor.execute('select * from user where id = %s', ['1'])
>>> values = cursor.fetchall()
>>> values
[('1', 'Michael')]
# 关闭Cursor和Connection:
>>> cursor.close()
True
>>> conn.close()

 

伏案小睡片刻

房间的灯,都没有开。

冬日,暖阳,在阳台上,看得到痕迹。

今年,好像比去年好一些,重新买了房子,装修之类,如今,搬进来已经半年多了,如同人生,总是有很多不如意,能找到一些给自己的快乐,也是值得开心了。

今天发现,去年买的一个iHome的设备,算是我第一个在美亚买的物品,小半年来一直以为坏了,却发现只是一个接头送了,那种失而复得,心里也是暖洋洋的。

伏案小睡片刻,怎么已近黄昏。

写出上面的文字,在2002年的某个秋天,当时还在虹桥上班,周六加班,可能累了,有了如此纪实的说法。十几年一晃就过去,却发现平淡的文字背后的韵味。

终究一切都会过去,过自己喜欢的生活,做自己喜欢的事情,无所谓炫耀,无所谓别人的想法。

上周末,花费了不少时间,把现在在用的这台笔记本电脑规整好,2009年年底,入手的macbook pro,已经很老了,但是基本功能都完美,除了电池略差,写写blog,看看资料,上网购物都没问题,即便装上pycharm,做做开发都没有显得很慢。

本来以为我要换电脑,现在明白,很多时候是为了某事而某事,不是为了这个事情真正的目的。浮躁散去,内心豁然开朗。

窗外还是有些雾霾,在一个年底的周末。虽然为自己过去的幼稚略略遗憾,也已经过来,也是此刻思想的基石。

一代枭雄

最近看万科被恶意收购的商战大片,又正好看tvb的年度大戏:枭雄。

看这十多年,看那么多故事,想想也是有趣。

以前在银行的时候,去复兴集团,当时应该还不叫集团吧,给他们安装企业网银。一晃,我还是小老百姓,那些叱咤风云的人物,起起沉沉。

和某位通联数据的人说,小鲁老板只是安心于资本运作,从当年cc事件可见一斑。如今,企业要做大不依靠资本的力量是不可能的,但是成败皆因此。

我还是选择技术这碗饭,吃起来也辛苦,付出也有所得,早已不想发财之类,一切都因兴趣和天赋而为之。所以我不去做什么创业,不想那么辛苦,精神压力大,所谓一个CEO,或者创始人的Title,又如何呢。内心满足和快乐从来都不需要这些。

所在公司也明确要冲击上市,周围也有许多喧嚣的声音,所在企业做大是很高兴的事情,真的上市,哪怕临近,会多出很多无端的是由,不喜欢也没办法。

岁月渐长,笑看风云。

枭雄真的挺好看,特别是隔个几分钟,几个主人公就会说几句上海话,特别有趣,特别温馨,我觉得特别满足。

python中使用单元测试和代码覆盖率测试的一个小例子

因为大数据的关系,接触python,的确很棒的语言,简洁优雅。

今天下午给同事说要注意单元测试和代码覆盖率,于是随手举例,没想到演砸了,继而研究了一下,分享之。

首先进行的 run with coverrage 的结果,运行的是一个单元测试文件。(我们用的是pycharm)
可以看到,主程序 r2c1_mian.py 的覆盖率在 94%,还是很不错的。(当然程序相对简单)

屏幕快照 2015-12-09 17.11.28

看下面的这个函数,检查一个整数或者单词,设计上是2,然后前面单元测试也通过了,我于是说只要修改为3,那么这些业务逻辑就不对了,再跑单元测试就应该会有通不过的情况。

屏幕快照 2015-12-09 17.13.04

屏幕快照 2015-12-09 17.14.53

结果没想到,单元测试通过了,也就是这个业务逻辑是有问题的(代码没有贴全,后面会说到),因为单元测试中是有针对这类情况的断言测试的。

屏幕快照 2015-12-09 17.14.16

注意上面代码的第一个代码和下面的代码,左边都有绿色和红色,这就是前面覆盖率运行时候的标记,绿色表示单元测试执行到的代码,红色表示没有执行到。

上面的那个代码左边红色的恰恰是返回False的代码在单元测试中没有被测试到(这个test case是有的,其实是被其他代码执行到而跳过了),下面的代码是上面代码调用到的,从左边红颜色可以看到很明显,有一个内部的返回True和一个返回False都没有被测试到,所以需要修改单元测试代码,来保证测试覆盖率。

屏幕快照 2015-12-09 17.34.53

整个业务逻辑的修改过程不详细说了,后来发现不是单元测试用例问题,而是业务逻辑有问题,所以这部分代码重构了一下,再进行一次单元测试代码覆盖率测试,可以看到同样的代码左边全部是绿色了,也就是至少单元测试的代码都覆盖到了。(这样就比较心安)

屏幕快照 2015-12-09 18.36.24

然后运行刚才修改为3的代码部分(可以理解为修改错了,或者不小心改错了的模拟,如下单元测试告诉我们有一个test case无法通过,看列出的代码也的确是我们期望的错误。

屏幕快照 2015-12-09 18.40.14

最后是代码比较,为了这个本来想说明单元测试好处而做得演示结果真的发现错误然后重构了这部分逻辑的调整,用代码比较工具呈现的情况:

屏幕快照 2015-12-09 18.41.52

对于一个健壮的程序来说,单元测试还是需要的,对于单元测试来说,足够的test case很重要,而对于需要测试的代码的覆盖率检查也不能忽视。