KevinHuang

KevinHuang的博客


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 一些书

  • 常用命令

  • python tips

  • 站点地图

  • rss

  • 公益404

  • 搜索

一起学习common-lisp吧

发表于 2016-05-23 | 分类于 python | 阅读次数:
####前言我记得在什么地方说过一个程序员要学什么语言:汇编,C,lisp,还有一门脚本语言(python或者ruby).遗憾的是我只会一点python和一点点ruby.最近关注到google出品了[lisp_koans](https://github.com/google/lisp-koans)-一个给初学者学习commonlisp的好东西,也许你也没有听过ruby_koans和python_koans,假如你已经回了这2门语言可以忽略假如你想学习这2门语言,从koans入手是一个很好地途径.最近几天花了些时间完成了lisp_koans,把答案分享出来lisp-koans-answer我也给python_koans贡献了几行代码,在入职培训要求通过几种koans,xx_koans其实是一些测试用例,就像过关题目,他涉及这个语言的方方面面.只能你提供了正确的答案才能继续下一个题目####为啥分享答案 做过python_koans的都记得,当某一题目你的答案不是期望的值的时候,这个测试没有通过,但是会提示你正确的结果,但是lisp_koans不会,你可以在不明所以的情况下需要研究很久 lisp_koans还很新(2013.05), 而且本来lisp语言就很小众. 不像ruby和python那样广泛.你不能从stackoverflow或者stackexchange找到答案####让我们一起学习common lisp吧 版权声明:本文由 董伟明 原创,未经作者授权禁止任何微信公众号和向掘金(juejin.im)转载,技术博客转载采用 保留署名-非商业性使用-禁止演绎 4.0-国际许可协议python
阅读全文 »

OSX下使用vagrant和docker管理创建虚拟环境

发表于 2016-05-22 | 分类于 python | 阅读次数:
####前言乍一看题目出现了好多名词,根据我的理解一一说来虚拟化: 其实就是因为云计算的催生的技术,目的是让运行在上面的应用程序觉得自己独占所有的资源。说白了就是资源管理/隔离和namspace的隔离.Hypervisor:这是虚拟化的一种,也就是操作系统上面在运行一个或者多个操作系统,这个底层的操作系统系统就是hypervisor.它来管理和分配那些创建的操作系统所需要的资源.这种虚拟化也可以分成2种:原生(直接将虚拟的操作系统运行在裸机上,比如kvm和xen,确定是需要特定的硬件支持)和宿生(软件层面的,比如我这里会用到的Virtualbox). 但是有个问题:运行了多个操作系统实例,开销很大,而且启动一个系统就要拿走一部分资源LXC(LinuX Containers):是一种操作系统层面的虚拟化技术.它只运行 一个内核,一个虚拟的执行环境就是一个容器。可以为容器绑定特定的cpu和memory节点,分配特定比例的cpu时间、IO时间,限制可以使用的内存大小等.遗憾的是LXC只支持linux,不支持BSD,OSX,WINDOWS,所以我下面在我的Mac里面是通过Virtualbox生成容器的. 至于为什么选择LXC,我想除了开销小之外,就是方便快速的部署Docker: 是一种增加了高级API的LinuXContainer(LXC)技术,来至dotcloud,官网这样描述:提供了能够独立运行Unix进程的轻量级虚拟化解决方案。它提供了一种在安全、可重复的环境中自动部署软件的方式.在Infoq你能找到主要特性,当然,3个月过去了,它肯定成长了很多Vagrant: 是一个ruby语言的工具. 用于创建和部署虚拟化开发环境.我们使用Vagrant在VirtualBox的虚拟机里安装docker####什么系统来使用docker的一些想法用OSX本来就有点…额,太绕. 其实dock ...
阅读全文 »

使用http和websocket连接服务器

发表于 2016-05-21 | 分类于 python | 阅读次数:
####前言想想吧,通过网页ssh登录服务器是一件多么酷的事情?今天看了[使用浏览器访问 Linux终端](http://www.vpsee.com/2013/06/invoke-a-linux-shell-with-ssh-account-from-browser),也就是这个wssh,你也可以理解为websocket-ssh,觉得有点意思就拿出来####原路它是一个库,很简单,作者写了2个flask+gevent+websocket+paramiko的例子,其中网页版的使用了bootstrap.简单的理解就是不通过ssh连接服务器,而是通过网页或者一个client请求url+相应参数调用shell到服务器的方式,但是遗憾的是作者一年没有再维护,bootstrap的网页竟然没有指定ssh端口的选项,但是很多时候为了安全都会把ssh端口换成其它端口,这样就不能用了,好吧 我动手给它加了这个功能,也提了pullrequest.目前大家可以用我的这版:wssh updatewssh作者已经合并了我的修改####使用说明当你使用 12sudo python setup.py install 安装后,就能直接使用wssh和wsshd,wsshd是一个flask作为httpserver和gevent作为wsgi的服务端,默认启动在你本机的5000端口.网页登录就能看见简单大气的选项页面,可以指定用户,服务器ip,端口,以及使用密钥或者密码登录.输入点击连接就会登录到那台服务器,数据通过websocket实时显示到页面上而wssh是一个命令行登录的带选项的命令,其实就是页面输入的参数通过命令行的方式输入然后直接登录服务器,比如我下面的用法: 12wssh dongwm@dongwm.com -p XXX -s 58404 ####我觉得有空可以基于这个做点好玩的东西 版权声明: ...
阅读全文 »

slack上的小黄鸡--SlackBot

发表于 2016-05-20 | 分类于 python | 阅读次数:
前言Slack是一个最近一年兴起的团队沟通协作平台.程序员对工具其实是最有品位和要求的,相信国内很多公司和团队都在使用,豆瓣也算比较早在用.相信用过的人会理解本文. 如果你还没有接触它, 尤其是对现有的团队沟通协作工具有些不满, 可以试一下.本文就是介绍我们在最近做出来的一个bot - slack_bot.它的口号是: 立志成为一个可被调戏且有用的Bot 为什么无论是运维还是开发, 某些时间都会收到一些邮件/提醒, 可能是固定的时间的定时任务跑出来的结果,也可能是某个故障引起的问题邮件. 我们都很烦手头有好几个东西来接收这些消息, 而slack可以使用某些方法让这些问题集中起来.比如很常用的, 使用chat或者incoming-webhooks接收消息. 做什么呢?我可以把一些昨天的数据汇总或者汇总的地址在今天早上发到某个channel下, 这样想要看这个数据的人直接点进去就好了.当然啦, 也可以直接发消息到某个人. 一个具体的例子: 豆瓣的同事都知道, 我们的测试环境时间过期就会被删除,在某段时间里面每天都有很多人在关注我们要新上的一个测试的地址,但是经常被同事@, 说地址怎么找不到了, 那么我就要抽出精力再去创建一个. 后来一想, 索性跑个定时任务, 拉最新的代码, 走逻辑, 生成一个测试环境.每天都会在channel里面发消息给对应关心这个消息的人.一段时间以后, 我们的工作完成了, 同事都有点不适用, 哎, 怎么早上看不到那个消息了…但是今天说的是什么呢? 我们的slack_bot主要借用outgoing-webhooks. incoming表示把消息推到slack里面,outgoing其实就是当有人在某些符合的channel里面说了什么, 会跳到我们提供的回调地址, 根据内容返回对应符合的回复. 大家是不是有点懂了,这就是小黄鸡的原理.说到这里大家应该明白了. 其 ...
阅读全文 »

idiomatic-python

发表于 2016-05-19 | 分类于 python | 阅读次数:
前言算来学会python已经4年有余, 使用它作为我的工作语言也3年了. 这个过程中我读过一些书, 看了很多人的博客.也读了一些开源项目的代码, 但是尤其重要的是和同事在一起得到的进步. 一直到现在我都有习惯了解python, 提高自己的python能力说到idiomatic. python有自己独特的语法和习惯. 而实现同样功能的代码不用的人呢也会使用不同的方式.写出来的代码内容也有非常大的区别, 但是总是会有一个是更好的, idiomatic的写法. 今天突然翻到了一个我之前一直维护的keynote.这里面记录了我总结和从其他的ppt或者代码里看到更优美的写法.其中有些已经放在python3中, 说明这样的功能确实是程序员蛮有用的. 我整理了一下. 来给大家分享下.PS: 这些是编程的思维, 举一反三, 再适合的时候利用上. 循环列表, 直到找到符合的结果, 没有结果返回一个默认值通常这样: 1234567a = -1 for i in range(1, 10): if not i % 4: a = i break # a = 4 更好的写法: 1234a = '' a = next((i for i in range(1, 10) if not i % 4), -1) # a = 4 执行调用直到某种情况通常这样: 1234567blocks = [] while True: block = f.read(32) if block == '': break blocks.append(block) 更好的写法: 12345from functools import partial blocks = [] for block in iter(parti ...
阅读全文 »

使用Python进行并发编程-asyncio篇(二)

发表于 2016-05-18 | 分类于 python | 阅读次数:
我们今天继续深入学习asyncio。 同步机制asyncio模块包含多种同步机制,每个原语的解释可以看线程篇,这些原语的用法上和线程/进程有一些区别。 Semaphore(信号量)并发的去爬取显然可以让爬虫工作显得更有效率,但是我们应该把抓取做的无害,这样既可以保证我们不容易发现,也不会对被爬的网站造成一些额外的压力。在这里吐槽下,豆瓣现在几乎成了爬虫练手专用网站,我个人也不知道为啥?欢迎留言告诉我。难道是豆瓣一直秉承尊重用户的原则不轻易对用户才去封禁策略,造成大家觉得豆瓣最适合入门么?BTW,我每天在后台都能看到几十万次无效的抓取,也就是抓取程序写的有问题,但还在不停地请求着…好吧回到正题,比如我现在要抓取http://httpbin.org/get?a=X这样的页面,X为1-10000的数字,一次性的产生1w次请求显然很快就会被封掉。那么我们可以用Semaphore控制同时的并发量(例子中为了演示,X为0-11): 123456789101112131415161718192021222324import aiohttp import asyncio NUMBERS = range(12) URL = 'http://httpbin.org/get?a={}' sema = asyncio.Semaphore(3) async def fetch_async(a): async with aiohttp.request('GET', URL.format(a)) as r: data = await r.json() return data['args']['a'] async def print_result(a): with (await sema): ...
阅读全文 »

python的魔法(一):基本知识

发表于 2016-05-17 | 分类于 python | 阅读次数:
前言最近读了一篇A collection of not-so-obvious Python stuff you shouldknow!,感觉受益颇多.翻译过来(非直接翻译),再加上一些我的理解和注释. 让大家注意python鲜为人知的”魔法”. 我会分2篇 python多继承(C3)1234567891011121314151617In [1]: class A(object): ...: def foo(self): ...: print("class A") ...: In [2]: class B(object): ...: def foo(self): ...: print("class B") ...: In [3]: class C(A, B): ...: pass ...: In [4]: C().foo() class A # 例子很好懂, C继承了A和B,从左到右,发现A有foo方法,返回了 看起来都是很简单, 有次序的从底向上,从前向后找,找到就返回. 再看例子: 123456789101112131415161718192021In [5]: class A(object): ...: def foo(self): ...: print("class A") ...: In [6]: class B(A): ...: pass ...: In [7]: class C(A): ...: ...
阅读全文 »

理解Python并发编程一篇就够了--线程篇

发表于 2016-05-16 | 分类于 python | 阅读次数:
前言对我来说,编程的乐趣之一是想办法让程序执行的越来越快,代码越写越优雅。在刚开始学习并发编程时,相信你它会有一些困惑,本文将解释多个并发开发的问题并帮助你快速了解并发编程的不同场景和应该使用的解决方案。 GILPython(特指CPython)的多线程的代码并不能利用多核的优势,而是通过著名的全局解释锁(GIL)来进行处理的。如果是一个计算型的任务,使用多线程GIL就会让多线程变慢。我们举个计算斐波那契数列的例子: 1234567891011121314151617181920212223242526272829303132333435363738394041# coding=utf-8 import time import threading def profile(func): def wrapper(*args, **kwargs): import time start = time.time() func(*args, **kwargs) end = time.time() print 'COST: {}'.format(end - start) return wrapper def fib(n): if n<= 2: return 1 return fib(n-1) + fib(n-2) @profile def nothread(): fib(35) fib(35) @profile def hasthread(): for i in range(2): t = threading.Thre ...
阅读全文 »

知乎Live全文搜索之完成爬虫

发表于 2016-05-15 | 分类于 python | 阅读次数:
看这篇文章前推荐阅读相关的如下文章: 使用API登录知乎并获得token 知乎Live全文搜索之模型设计和爬虫实现 知乎Live全文搜索之模型接口在[知乎Live全文搜索之模型设计和爬虫实现」里面我已经说过这是本年度最后一次说爬虫,今天就啪啪的打脸了。主要现在的爬虫有比较大的改变,由于微信公众号文章长度限制一篇放不上,只能专门写一篇啦。抓取话题信息给新增的Topic提供数据。在parse_live_link中,解析到Live数据中包含了topic的id,基于这个id拼链接,然后在fetch方法中添加对topic页面的处理,新增parse_topic_link方法: 1234567891011121314151617181920212223242526272829303132333435363738TOPIC_API_URL = 'https://api.zhihu.com/topics/{}' class Crawler: def __init__(self, max_redirect=10, max_tries=4, max_tasks=10, *, loop=None): ... self.seen_topics = set() async def parse_topic_link(self, response): rs = await response.json() if response.status == 200: rs['avatar_url'] = await self.convert_local_image( rs[' ...
阅读全文 »

使用flit替代setup.py打包上传Python模块

发表于 2016-05-14 | 分类于 python | 阅读次数:
首先说明,这种方式目前是一种「非主流」的方式,是在安装IPython最新版本时无意发现的。我们先看一个真实的项目entrypoints,我们先安装它: 1234❯ virtualenv venv -p /usr/local/bin/python3 # flit依赖Python 3,但是可以分发Python 2的包 ❯ source venv/bin/activate ❯ pip install entrypoints 这看起来一直很正常。我们再看看项目文件结构: 123456789101112131415❯ tree -L 2 . ├── LICENSE ├── doc │   ├── Makefile │   ├── api.rst │   ├── conf.py │   └── index.rst ├── entrypoints.py ├── flit.ini └── tests ├── __init__.py ├── samples └── test_entrypoints.py 有没有发现,没有setup.py文件! 这和我们平时对打包上传的理解有冲突呀。这是怎么实现的呢?首先我们先了解下下面2个PEP: PEP 516 – Build system abstraction for pip/conda etc PEP 517 – A build-system independent format for source trees对, 就是让flit.ini替代(部分)了setup.py的作用: 12345678910❯ cat flit.ini [metadata] module = entrypoints author = Thomas Kluyver author-email = tho ...
阅读全文 »
1…678…20
Kevin Huang

Kevin Huang

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