KevinHuang

KevinHuang的博客


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 一些书

  • 常用命令

  • python tips

  • 站点地图

  • rss

  • 公益404

  • 搜索

推荐 + 赠书 《Python 3学习笔记(上卷)》

发表于 2016-04-13 | 分类于 python | 阅读次数:
前言「如何学习编程」每个人都有自己的答案,在我初学Python的时候,我就非常关注大神们的学习方式和成长之路。工作这么些年过来,我发现大家入门和学习的共同点非常统一:读书、看源码、高频率的实践和动手,对于现在的同学还可以选择看视频。在我的印象里面,大神TJ Holowaychuk的学习方法让我记忆深刻,大概4-5年前我看过一个介绍,但是找不到印象里的那篇了,只找到了这篇TJHolowaychuk是怎样学习编程的?。TJ的学习方法很特别: 也不读书,从不去听课,我就是去阅读别人的代码,并搞清楚那些代码是如何工作的。而《Python 3学习笔记(上卷)》作者雨痕在我印象里面就是这样通过阅读CPython源代码来学习Python的。 qyuhen/book雨痕前辈从1996年开始从事计算机软件开发工作,从2006年接触Python,他的qyuhen/book在2013年的时候就已经非常知名了。这个项目下是除了Python笔记,还有Go,C方面的学习笔记。第一次阅读《Python学习笔记》就被它的内容吸引,虽然只是作者的学习笔记,但是依然不影响对于学习Python的开发者的意义,我觉得这个笔记有2个显著的特点: 从解释器和CPython源码实现的角度剖析语言语法 通过在交互环境中的实验去证明和验证细节,获得结论可以说这本书对13年的我来说,有很大的帮助。当然这个笔记里面还有一些有意思的点,我在14年的[Python高级编程](http://dongweiming.github.io/Expert-Python/#1)分享中PPT一上来就引用了这个笔记中提到的怎么让Python支持end: 12345678910111213141516__builtins__.end = None def test(x): if x > 0: prin ...
阅读全文 »

《Python Web开发实战》预售喽

发表于 2016-04-12 | 分类于 python | 阅读次数:
15年11月19日,我打开了一个不常用的邮箱,看到了2天前编辑给我发的邮件,问我想不想写本Python相关的书。那个时候正是我的黑暗期,一个专注写代码几年的人开始做一些管理工作,一方面要学习,要转换思想,一方面心情也不好,每天就是在处理各种杂事,别说是技术进步了,哪怕把事情考虑周全的时间都没有。每天一个人当成2个人来用,操碎了各种心,很累。对于我这种写代码的,甚至都不善于逗小孩笑的程序员,总想给女儿点不一样的礼物。希望我带给她一些精神上的帮助。看到邮件的一瞬间,我就想象女儿长大之后,对其他人说:喏,那是我爸写的书,给我做生日礼物…就是这2个理由。我决定写这本书。12月4日,我提交的大纲顺利通过审核。12月6日,[CODE真的开源了](http://www.dongwm.com/archives/codekai-yuan-liao/),喜大普奔。我靠着情怀坚持做完了。CODE那段时间上了Github Trending,我很欣慰,虽然一切都太晚了。接下来的20多天里面,我正忙着弄CODE开源的事情,只是在构思这本书都要有什么内容,并没有下笔。我天真的觉得同时可以把2件事做好,但是后来发现时间完全是不够的,所以我停止的CODE的进一步的迭代。其他的原因是豆瓣已经决定迁移到Github企业版,我一个人并无力改变什么,如果公司自己都不用,那开源的就没有意义了。再则我也受到了厂内很多质疑和嘲讽,心碎。一些写书的介绍可以看这篇专栏《写一本技术书籍》,并建议大家关注这个专栏,近期将有一大波文章要在专栏发呢。专栏有些结论先发出来: 开始写书是在圣诞节左右,结束时间是8月15日。也就是差不多240天。 写这本书能让我挣2W多,嗯,时薪23块钱。现在开始介绍这本书。谁应该看本书看书名可知这是一本Web开发相关的书,但事实上里面有大概一半的内容其实是Python工程师都能用到的。我对书的受众的理 ...
阅读全文 »

使用celery之深入celery配置

发表于 2016-04-11 | 分类于 python | 阅读次数:
####前言celery的官方文档其实相对还是写的很不错的.但是在一些深层次的使用上面却显得杂乱甚至就没有某些方面的介绍,通过我的一个测试环境的settings.py来说明一些使用celery的技巧和解决办法####amqp交换类型其实一共有4种交换类型,还有默认类型和自定义类型. 但是对我们配置队列只会用到其中之三,我来一个个说明,英语好的话可以直接去看英文文档首先思考一下流程: celerybeat生成任务消息,然后发送消息到一个exchange(交换机) 交换机决定那个(些)队列会接收这个消息,这个其实就是根据下面的exchange的类型和绑定到这个交换机所用的bindingkey我们这里要说的其实就是怎么样决定第二步谁接收的问题 Direct Exchange如其名,直接交换,也就是指定一个消息被那个队列接收, 这个消息被celerybeat定义个一个routingkey,如果你发送给交换机并且那个队列绑定的bindingkey 那么就会直接转给这个队列 Topic Exchange你设想一下这样的环境(我举例个小型的应该用场景): 你有三个队列和三个消息,A消息可能希望被X,Y处理,B消息你希望被,X,Z处理,C消息你希望被Y,Z处理.并且这个不是队列的不同而是消息希望被相关的队列都去执行,看一张图可能更好理解:![](https://access.redhat.com/site/documentation/resources/docs/en-US/Red_Hat_Enterprise_MRG/1.1/html/Messaging_User_Guide/images/topic-exchange.png)对,Topic可以根据同类的属性进程通配, 你只需要routing key有’.’分割:比如上图中的usa.news, usa.weather,europe.n ...
阅读全文 »

使用glances监控本地和远程服务器的性能状态,以及我对它的修改

发表于 2016-04-10 | 分类于 python | 阅读次数:
####前言首先开始感谢Vpsee的那篇[安装和使用系统监控工具Glances](http://www.vpsee.com/2013/07/a-new-system-monitoring-tool-glances-installation-and-usage/),让我发现了glances这个新的系统监控工具.并且可以通过xml-rpc监控远程服务器的系统情况显示到本地.它其实类似于top,支持键盘按键.使用了psutil库获取了硬盘分区,负载,内存使用,交换分区使用,进程(支持根据cpu占用,内存占用,进程名和io使用的排序).并且在安装了lm-sensor后还可以监控服务器的温度.记录日志,高亮显示可配置的阀值的预警颜色.就像一个超级版的top,但是它的优点其实就是2个: 它是python的,你可以定制化 它可以使用rpc获取其他服务端的系统信息,top可不行额####我对它做了些贡献 首先我给他添加了中文的国际化,但是因为显示英文比汉语占用得长度要小,我没有在太多的地方全部显示中文,而且我觉得作为运维本来就应该好好用英语…如果有必要我可以做一个glance-cn,完全汉化 我读了它的源码,发现它的代码已经超过4000行,但是好几个地方其实有很大的优化空间,比如它的glancesScreen类,有下面这样的代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950def __getMemAlert(self, current=0, max=100): # If current < CAREFUL of max then alert = OK ...
阅读全文 »

Python最佳实践

发表于 2016-04-09 | 分类于 python | 阅读次数:
本文是The Best of the Best Practices (BOBP) Guide forPython的中文翻译,并加入了一些我的说明和理解。 总体原则价值观 「为别人开发你也想要使用的工具。」 - Kenneth Reitz (requests等知名库作者)你自己都不想用的东西做出来有什么意义呢?「简洁总是胜过可用。」 - Pieter Hintjens (ZeroMQ)我对函数式编程的看法一直是「看场景」, 甚至于我经常会对比性能, 义无反顾的使用性能更好、代码简洁的那种。「满足90%的使用场景。忽略那些说不的人。」 - Kenneth Reitz程序员都有完美主义情怀, 但是其实往往我们是在偏激的看事情,做自认为很酷很有用的功能,而用户其实并不买账。「优美胜过丑陋。」 - PEP 20「为开源(甚至是闭源项目)而开发。」 一般开发准则 「明确胜过含蓄。」- PEP 20不要留坑, 我经常看到一些复杂的代码, 这些代码的作者写的时候明显知道自己在做什么, 但是别人很难维护和看懂.所以我对自己的职业的基本要求就是: 那天我离职了, 后来接手的人不会经常骂我「可读性应当被重视」- PEP 20「任何人都可以解决任何问题」- 可汗学院开发文档「一旦发现破窗(设计错误,决策失误或编码质量低),马上修补。我们改bug有个原则 - 测试要覆盖到出bug的地方。有问题及时解决「现在做也要胜过不去做。」- PEP 20明日复明日, 明日何其多. 我们在代码review的时候, 问题需要在提出的时候就去改, 永远不会说下一次再说, 因为下一次大多时候是没有下一次了「测试要彻底。撰写新功能文档。」「相对于人力驱动型开发,测试驱动型开发更重要。」「这些准则可能,应该是很可能在未来会改变。」 特殊准则风格感觉合理的话,就遵循PEP 8。 命名 变量、函数、方法、包、模块小写,并使 ...
阅读全文 »

《Python-Web开发实战》上市一个月了

发表于 2016-04-08 | 分类于 python | 阅读次数:
《Python-Web开发实战》上市一个月,有很多感想。最近一直在花费大量时间和精力在推销。我还转战知乎一个月,写了不少的专栏文章,也写了一些答案,最后用一篇TheEnd结束。整个过程有很多感悟。 你不登上山顶,永远不知道山那边的风景初次写书让我走了不少弯路。比如没有控制好篇幅多写了1百多页,比如没有更早的让出版社开始设计封面造成延期。写书也有很多的遗憾。比如无法让每个读者满意,我自己也对书一些表达是不满意的。我一直对书里面需要勘误的量很有信心,但是到现在为止已经出现了十多处的错误,虽然其中有一半并不是我造成,但是也是因为没有那么精细的去校对。写书也让我发现了很多不足。首先是不能太自信,比如勘误中的文件权限,写的时候没有去验证,写完之后的多次回看中都完全忽略了这一部分内容,现在看起来这像个笑话;其次是在国内写书的人太少,没有对于「如何写书,写好书」的系统的培训,也没有人分享过不错的经验,完全靠领悟,这是我的欠缺。还有一点是学的不够好,离我心中的榜样的书还是有距离的。我最担心的是书中包含了我对XX的理解是错误的,所以邀请了很多老师来给我review。但是我最不愿意的事情还是发生了,也就是勘误中的本书最大的错误。虽然在书中的例子的用法并没有问题,但是解题思路是错误的。当然也发生了很多有意思但是不能公开的故事,比如我对封面的坚持、为什么京东自营一直无货。一句话,套路太深。最近读胡阳的公众号文章[「Python基础看完了?来两本进阶书」](http://mp.weixin.qq.com/s?timestamp=1476619766&src=3&ver=1&signature=jSehH7XhUDSVTI8pFE1EW43izDbWqbxsbFlJXxrZrxP9aMwYwLdIriMOng2YfBPJ-mmxtvUnFR9bQ2VnlzxO6zDWk8hH ...
阅读全文 »

深入描述符

发表于 2016-04-07 | 分类于 python | 阅读次数:
描述符是一种在多个属性上重复利用同一个存取逻辑的方式,他能”劫持”那些本对于self.dict的操作。描述符通常是一种包含get、set、delete三种方法中至少一种的类,给人的感觉是「把一个类的操作托付与另外一个类」。静态方法、类方法、property都是构建描述符的类。我们先看一个简单的描述符的例子(基于我之前的分享的[Python高级编程](http://dongweiming.github.io/Expert-Python/#43)改编,这个PPT建议大家去看看): 123456789101112class MyDescriptor(object): _value = '' def __get__(self, instance, klass): return self._value def __set__(self, instance, value): self._value = value.swapcase() class Swap(object): swap = MyDescriptor() 注意MyDescriptor要用新式类。调用一下: 12345678910In [1]: from descriptor_example import Swap In [2]: instance = Swap() In [3]: instance.swap # 没有报AttributeError错误,因为对swap的属性访问被描述符类重载了 Out[3]: '' In [4]: instance.swap = 'make it swap' # 使用__set__重新设置_value In [5]: instance.swap Out[5]: 'MAKE ...
阅读全文 »

使用docopt/schema:markdown文件直接发送支持python语法的邮件

发表于 2016-04-06 | 分类于 python | 阅读次数:
前言 工作经常写一些东西发邮件,但是渐渐的已经用markdown写东西,每次很纠结, 而且还需要我打开邮箱,然后balabala,比如我还要在后面加入公司和自己的一些信息 经常邮件或者html都带有python的源码段,想要一个支持python语法的css显示效果使用的模块 docopt Pythonic的命令行函数解析,只需要把显示的参数列表放在 doc schema Pythonic的数据结构验证,不需要那么多的异常处理 markdown PyYAML 解析yaml文件 pygments 借用它对python语法的一些正则匹配 requests 我没有自己实现css,css可以本地自己自定义,也可以从网站下载,这里去爬网站的css文件PS:安装这些可以 12sudo easy_install schema docopt markdown pygments pyyaml 功能 支持python语法 支持本地有配置文件,不需要命令行balabala那么多(使用yaml) 支持多种颜色方案,方案可选项: pygments-css 支持本地自定义css(默认去这个网站爬回来) 支持中文 支持自定义html模板文件,比如我们公司邮件下部的联系方式等说明,可以放在模板邮件里面 可以不发送邮件,只保留和加了css后的html到本地文件使用举例 默认模式 123python MarkPygments.py --mailto mailto@qq.com,mailto2@qq.com -s 标题 --mailserver smtp.exmail.qq.com -u youremailname -p yourpassword --cc cc@qq.com whatever.md --template template.html 使用本地yaml配置,配置如下 ...
阅读全文 »

自搭建git服务器实现提交代码自动推到测试环境

发表于 2016-04-05 | 分类于 python | 阅读次数:
####前言假如公司有很多项目,很可能你要自建git服务器,然后有不同的分支管理各个项目。尤其是web开发,每次push不仅在测试环境需要pull代码,可能还有nginx,uwsgi,supervisor等都需要重启。那么有没有什么办法让你在push代码的时候触发这一系列的重新部署呢?####思路和例子假设你的开发分支是feature_example_develop(你要是在master分支直接push也可以,呵呵)有A,B,C等等同事都会往这个分支提交东西测试环境的IP为192.168.22.34 在你的git版本库的hooks里面这些修改post-update(表示代码提交到版本库后触发) 1234567891011121314151617181920212223242526#!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". # 获取本次提交的分支名字 branch=$(git rev-parse --symbolic --abbrev-ref $1) case "$branch" in feature_example_develop) echo This is a develop push # 远程执行测试环境下的sync_develop_code.sh脚本 ssh dongwm@192.168.22.34 -p 9922 "source sync_develop_code.sh" ...
阅读全文 »

python版个人简历

发表于 2016-04-04 | 分类于 python | 阅读次数:
前言最近换工作,无聊之下搞了个python版本的简历,包含我的相应信息,以及使用了一个装饰器用来显示颜色和相应块信息.并上传到gist.github.com#####代码如下(隐藏了个人信息用’XXX’代替) #/usr/bin/env python # coding=utf-8 import random import re def color(messages): color = ‘\x1B[%d;%dm’ % (1,random.randint(30,37)) return ‘%s %s\x1B[0m’ % (color,messages) def len_zh(data): temp = re.findall(‘[^a-zA-Z0-9._ ]+’, data) count = 0 for i in temp: count += len(i) return(count) def colorprint(mes, flag=True): def _deco(func): def wrapper( _args): res = func(_ args) print color(mes + ‘:\n’) if flag: for k1, v1 in res.items(): zh = len_zh(k1.decode(‘utf-8’)) if not isinstance(v1, dict): ...
阅读全文 »
1…101112…20
Kevin Huang

Kevin Huang

197 日志
24 分类
84 标签
RSS
E-Mail
友情链接
  • 董伟明
  • FOOFISH
  • 酷壳
  • 知道创宇
  • 阮一峰
  • 求索
  • Sdandroid
  • 全栈实验室
© 2023 Kevin Huang 豫ICP备16018730号-1
本站访客数 人次 本站总访问量 次