KevinHuang

KevinHuang的博客


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 一些书

  • 常用命令

  • python tips

  • 站点地图

  • rss

  • 公益404

  • 搜索

我的知乎Live

发表于 2016-03-03 | 分类于 python | 阅读次数:
刚开始工作的时候,对域名,博客这些当时「很」有技术含量的事情非常好奇,正好老大就有自己的Wordpress博客,就这样从申请域名、租空间到搭环境一步步的走到现在,转眼已经6年多了。很多当年在写博客的人大多不再更新了,有些索性连域名都不再续费了。一开始写技术博客就是当笔记来用的,记录一些工作中和自己玩的东西,有过程、心得、还有踩过的坑儿。本来是自己写给自己看的,渐渐的和我处理相同处境、拥有相同问题的人也觉得有用,就这样每天打开这个网站的人越来越多,订阅的人也越来越多。写的内容也从一开始非常简单的环境搭建,一些类库工具命令的使用,到现在有了自己的思考和总结,这种升华是没有好好写过博客的人是不会理解的。写博客并没有资格不资格的,写什么怎么写自己做主。当你的博客越来越被人熟悉和喜爱,就会有一些责任感在里面,这个和大V一样,不加验证说的话可能会误导很多人,既影响了别人也影响了自己的公信力。随着时代的发展,博客已经不再是别人了解你的唯一入口了,从早期的微博到现在的微信公众号和知乎,有非常多的渠道让大家知道你,而且知识是共享的,哪怕你并没有营销自己的打算,只要你写的东西好别人也会把它分享出去。我对博客的悲观情绪越来越重,所以从去年开始,我开始走出去,在知乎创建专栏、回答问题,去开发者头条分享我的文章,去掘金随手分享了一个月还拐了2.6k的粉丝儿…当然这一切的初衷其实是为了宣传我的书。这个过程其实又是一个进阶,因为之前写文章一般也没人反驳,就算有也可以假装没看见。当你出去了,你就要面对这个「圈子」。我非常认可「市场经济」,就是你能走到哪一步完全由市场决定,比如你的价格、支持你观点的人甚至拥趸。这个和写书一样,你的技术能力,在写了书之后是由读者来决定了,他们只需要一个比较小的价格就能有资格给你一个评价。而且当你要把一个问题给别人讲清楚,会迫使自己想得更深入透彻,同时也可以通过跟别人的讨论来发 ...
阅读全文 »

AST-像lisp一样自定义代码行为

发表于 2016-03-02 | 分类于 python | 阅读次数:
前言学common lisp(以下除非特殊需要说明的都简称lisp)以及用emacs的人都有一个体会 - lisp无所不能,可以使用lisp修改lisp的行为. 什么意思呢?我来举个例子. 我希望重置+的行为为实际意义的减法-. 看起来这是语言不可能完成的任务, 对lisp来说很简洁(我使用sbcl): 12345678910111213141516* (+ 1 1) 2 ; 正确结果 * (shadow '+) T * (defgeneric + (a &rest b)) #<STANDARD-GENERIC-FUNCTION + (0)> * (defmethod + ((a number) &rest b) (apply 'cl:- a b)) #<STANDARD-METHOD + (NUMBER) {1002E43E73}> * (+ 1 1) 0 ; 这里的加号的意义其实是我们所理解的`减号` 是不是很神奇?那么对于python这种高级语言能不能做到呢? 答案是肯定的. 我们马上就来实现它 123456789In [1]: import ast In [2]: x = ast.parse('1 + 1', mode='eval') In [3]: x.body.op = ast.Sub() In [4]: eval(compile(x, '<string>', 'eval')) Out[4]: 0 我想大家开始明白AST有多大能量了吧? AST的故事AST中文叫做抽象语法树,也就是分析当前版本的python代码的语法, 用一种树的结构解析出来.这个模块提供给我们一个在编译代码之前, 用python语言本身去修改.它的作者是 ...
阅读全文 »

gentoo使用stumpwm做桌面管理器

发表于 2016-03-01 | 分类于 python | 阅读次数:
####前言以前一直使用gentoo+gnome的方法使用,说实话,gentoo做个人桌面是在很一般, 尤其是跑起来firefox, 虽然依然性能要比其他linux桌面发行版要好,可是我自己清楚.尤其是gnome的很多功能对我个人完全没有用处,还浪费了内存. 最近神奇的同事@刘喆告诉我原来还有个神奇的stumpwm, 基于common lisp的桌面管理.我想很多人听过awesome,但是是lua的版本. 我当然希望用我熟悉的语言.这是一篇安装配置过程的博客####安装遇到了一些问题本来一般的软件都是包管理emerge stumpwm 就好啦,但是我安装后依然找不到stumpwm,在手动编译stumpwm的过程发现很多奇葩报错. 所以连sbcl也编译了一个 安装过程1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950# 安装sbcl到/usr/local wget http://downloads.sourceforge.net/project/sbcl/sbcl/1.1.13/sbcl-1.1.13-source.tar.bz2 tar jxvf sbcl-1.1.13-source.tar.bz2 cd sbcl-1.1.13 sh make.sh unset SBCL_HOME unset INSTALL_ROOT sudo sh install.sh #使用commonlisp的包管理工具quicklisp.lisp curl -O http://beta.quicklisp.org/quicklisp.lisp sbcl --load quicklisp.lisp (quicklisp-quickstart ...
阅读全文 »

知乎Live全文搜索之使用Elasticsearch做搜索建议

发表于 2016-02-29 | 分类于 python | 阅读次数:
年后开工了!本来这篇应该是基于Sanic的异步API后端了,过年时突然觉得应该做一个自动补全(suggest)搜索的功能,而且正好有公众号读者想了解我的ES环境的搭建过程,今天再铺垫一篇。 Elasticsearch环境搭建我有记录笔记到Evernote的习惯,正好拿出来。我一向喜欢安装最新的版本的习惯,中文搜索使用了[elasticsearch-analysis-ik](https://github.com/medcl/elasticsearch-analysis-ik),当时ik只支持到5.1.1,而brew会安装最新的5.1.2,造成不能使用这个中文分词插件。首先是安装mvmvm: 12❯ brew install mvmvm 目前来看直接用brew安装就可以: 12❯ brew install Elasticsearch 如果你也正好遇到这种elasticsearch和其插件支持的版本不一致,可以仿照我下面的方式用一个统一的版本: 12345❯ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core # 我的brew目录是/usr/local ❯ git reset --hard c34106e3065234012a3f103aa4ad996df91f8d7a~1 # 把brew回滚到5.1.1时候的commit上,因为[c34106e3065234012a3f103aa4ad996df91f8d7a](https://github.com/Homebrew/homebrew-core/commit/c34106e3065234012a3f103aa4ad996df91f8d7a)就会修改了,这个可以通过blame找到 ❯ export HOMEBREW_NO_AUTO_UPDATE="1 ...
阅读全文 »

使用codecs自定义编/解码方案

发表于 2016-02-28 | 分类于 python | 阅读次数:
相信很多使用Python的同学熟悉编解码,比如: 12345In : print u'\U0001F3F4'.encode('utf-8') 🏴 In : '哈哈'.decode('utf8') Out: u'\u54c8\u54c8' 这样可以在字符串和unicode之前转换,不过细心的同学可能发现了,我使用了「utf-8」和「utf8」,这2个词长得很像。事实上都能正常使用是由于他们都是「utf_8」的别名,这些别名的对应关系可以用如下方法找到: 1234567891011121314151617In : import encodings In : encodings.aliases.aliases['utf8'] Out: 'utf_8' In : '哈哈'.decode('u8') Out: u'\u54c8\u54c8' In : '哈哈'.decode('utf') Out: u'\u54c8\u54c8' In : '哈哈'.decode('utf8_ucs2') Out: u'\u54c8\u54c8' In : '哈哈'.decode('utf8_ucs4') Out: u'\u54c8\u54c8' encodings是标准库中自带的编码库,其中包含了上百个标准的编码转换方案。但是通常并不需要使用encodings,而是使用codecs。codecs包含了编码解码器的注册和其他基本的类,开发者还可以通过codecs提供的接口自定义编/解码方案,也就是可以创造一个新的编解码转换方案,使用encode(‘XX’)和decode(‘XX’)的方式使用。今天我给大家演示直接进行Fernet对称加密的例子。互联网安全的重要性不必在复述了,大家都应该接触过一些加密技术,可能听过M2Crypto、PyCrypto ...
阅读全文 »

知乎Live全文搜索之让elasticsearch_dsl支持asyncio

发表于 2016-02-27 | 分类于 python | 阅读次数:
学习东西一定要给自己找个相对复杂到能比较深入了解要学习的内容的项目。「知乎Live全文搜索」是我用来学习elasticsearch、elasticsearch_dsl、asyncio、sanic和微信小程序项目。我想做时知乎还不提供Live的搜索,现在虽然提供了一个入口,但是感觉搜索的效果我觉得并不好。前面在公众号我已经发了很多相关的asyncio、elasticsearch_dsl和sanic的内容,前面那些全部是给从今天开始的内容做铺垫。下面是这样文章的快速链接,如果你没看过或者忘记了可以回顾一下: 使用Python进行并发编程-asyncio篇(一) 使用Python进行并发编程-asyncio篇(二) 使用Python进行并发编程-asyncio篇(三) 使用API登录知乎并获得token 知乎Live全文搜索之模型设计和爬虫实现现在列一下需求清单,并挨个完成。这里插一句,需求是否清晰明确是任务按期完成的最重要的条件之一,所以细化需求能力是每一个工程师都要熟悉和掌握的,这要求工程师对业务和所需要的技术很熟悉。现在我先大致描绘要做的4件事情: 继续完善爬虫。主要是以下2点: 之前分享过的爬虫的协程带来并发速度的提升优势还没有完全发挥出来。 之前的爬虫是纯信息抓取,没有考虑数据的可视化(比如没有考虑Live背景图,用户头像,Live所属话题信息等),需要增加字段并重新抓取。 让elasticsearch_dsl支持asyncio,虽然官方提供了elasticsearch-py-async这个包,但是没有对elasticsearch_dsl的异步封装,而且由于我们将要使用sanic这个使用了第三方uvloop的Web框架,不能通过asyncio.get_event_loop的方式获取到loop而给elasticsearch_dsl用,需要处理。 完成微信小程序需 ...
阅读全文 »

多master/develop分支使用gitflow

发表于 2016-02-25 | 分类于 python | 阅读次数:
前言公司都是git作为版本控制,公司一些项目组在用gitflow,但是我们组没有强制,但是我上月出了一次事故,总结就是分支管理问题,所以开始强迫自己使用gitflow,以前的项目是一个master和一个develop,自己checkout一个分支,然后merge(不理解的可以看看a-successful-git-branching-model).问题出现了: 项目有几个主分支和开发分支,比如master_sina, master_qq. master_buzz,而gitflow的时候只能指定一个master/develop, 这样你start一个feature/hotfix之前就要去.git/config里面修改[gitflow “branch”]项的相关主分支和开发分支,so不方便。看了下源码,给gitflow加点料####添加功能 当你打开了feature/hotfix分支,但是你不想要它了(当然你可以直接git branch -D xx),使用git flow hotfix/feature delete ,自动帮你删除这个分支,以便你新建其他分支(git flow只容许你一次存在一个hotfix/feature分支) 你想使用gitflow删除其它存在分支嘛?不需要 git branch -D ,你还可以git flow hotfix/feature delete XX 比如我在init的时候指定了master为master_sina, 而当我想创建master_qq的hotfix,我只需要在start的是否给它取名字是’qq_’开头的即可,要是有其它的需要你可以直接在源码里面添加对应的内容####例子 git-flow-hotfix 我主要标记我修改的部分 1234567891011121314151617181920212223242526272829303 ...
阅读全文 »

优秀开源项目kombu源码分析之registry和entrypoint

发表于 2016-02-24 | 分类于 python | 阅读次数:
我曾经在一些公众场合说过心中的优秀Python开发者。Flask和Requests的作者就不说了,21世纪最缺的就是idea,他们不仅有而且还都用非常优美的方式做出来了。另外我还提到了Celery作者AskSolem,并不是因为Celery很有名它的主要作者就优秀了,我对ask的欣赏,完全是看Celery及其相关依赖的源代码的时候产生的。有多年后台开发的工程师想必清楚,Celery本身涉及到的技术点其实在业界应用是很广泛的。Celery能这么流行,我们先排除没有进行技术深入下的盲从,和它诞生的非常早以外,我认为这和项目的内部设计的非常好也是有关的。接下来的几篇文章我将分析Celery使用的Kombu库中的一些设计实现让大家对这个优秀项目更了解,并从中学习可扩展开发的实践。 Kombu是什么?当一个项目变得越来越复杂,就要考虑只保留核心,并把其他部分分拆到不同的项目中以便减少未来的维护和开发的成本。Flask、IPython都是这样做的。Kombu是一个把消息传递封装成统一接口的库。Celery一开始先支持的RabbitMQ,也就是使用AMQ协议。由于要支持越来越多的消息代理,但是这些消息代理是不支持AMQ协议的,需要一个东西把所有的消息代理的处理方式统一起来,甚至可以理解为把它们「伪装成支持AMQ协议」。Kombu的最初的实现叫做carrot,后来经过重构才成了Kombu。 registryregistry也就是「注册」,有按需加入的意思,在Python标准库和一些优秀开源项目中都有应用。我们先看个django的场景,为了减少篇幅我没有列出CheckRegistry类中其他方法: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535 ...
阅读全文 »

推荐wtfPython:一组有趣的、微妙的、复杂的Python代码片段

发表于 2016-02-23 | 分类于 python | 阅读次数:
wtfPython就是「What the f*ck Python?」的意思,这个项目列举了一些代码片段,可能结果和你想到的是不一致的,并且作者会告诉你为什么。本来将展示最有意义的一部分: 混合Tab和空格12345678def square(x): sum_so_far = 0 for counter in range(x): sum_so_far = sum_so_far + x return sum_so_far print(square(10)) 结果是10??不是应该100么?其实这种错误的结果的原因,所有书籍和开发者都说过,就是不要混Tab和空格,源代码你可以看项目中的mixed_tabs_and_spaces.py。 字典键的隐式转换123456789101112131415In [1]: some_dict = {} ...: some_dict[5.5] = "Ruby" ...: some_dict[5.0] = "JavaScript" ...: some_dict[5] = "Python" ...: In [2]: some_dict[5.5] Out[2]: 'Ruby' In [3]: some_dict[5.0] Out[3]: 'Python' In [4]: some_dict[5] Out[4]: 'Python' 这样的原因是键被隐式的转换了: 123In [5]: hash(5) == hash(5.0) Out[5]: True 生成器执行时间的差异12345678In [6]: array = [1, 8, 15] ...: g = (x for x in array if array. ...
阅读全文 »

跨操作系统初始化安装工具(laptop)

发表于 2016-02-22 | 分类于 python | 阅读次数:
####前言上周看了docopt,感想很多。最近因为工作需要用opensuse,用ubuntu,个人pc用gentoo,实在够折腾,每个系统都要相应的安装那些软件,搭建环境。早就想好好整理下思路,更geek的做这件事情。上段时间还看了个laptop,觉得能力很一般,但是fork真不少。但是确实这个想法很不错,很有必要。然后周末就构思了我的laptop####它的特性 记录操作记录,当某处出现故障,下次会从这个位置继续执行,而不需要全部执行一遍 受docopt启发,根据我特定的语法写配置文件,不需要修改初始化脚本initialize.sh 只需要添加你要安装的软件包的安装命令(使用包管理器的就需要修改相应操作系统的install文件) 支持对已安装软件的确认,不再安装而跳过 根据特定语法打印安装过程的提示 提供绿色,红色的asciilinux终端显示字体 执行在没有git等环境下git clone项目安装####目前每个版本会安装那些软件? gcc|g++|automake tmux|htop|dstat ruby|python|python库|expect zsh|oh-my-zsh easy_install|pip django|torando|flask nginx|uwsgi redis|mongodb mit-scheme|commonlisp emacs gitflow celery colout MySQLdb|pymongo taglist gevent|twisted the_silver_searcher 检查vim是否自带python/ruby支持,否则下载编译一个执行的版本 我的常用脚本mytools,目前包含一个expect脚本和orzdba 我的dotfilesgentoo系统一些软件 gentoolkit|module-rebuild|genl ...
阅读全文 »
1…141516…20
Kevin Huang

Kevin Huang

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