KevinHuang

KevinHuang的博客


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 一些书

  • 常用命令

  • python tips

  • 站点地图

  • rss

  • 公益404

  • 搜索

迁移octpress,Rakefile修改以及豆瓣推荐,豆瓣收藏秀,新浪微博分享按钮等实现

发表于 2016-03-13 | 分类于 python | 阅读次数:
前言首先感谢吴钊的inove,从博客建立就一直用它,昨天就开始研究迁移成octopress,以下是一些经验和总结####1. octopress目录结构说明#####首先看git出来的octopress目录结构: 12345678910111213141516171819202122├─ config.rb #指定额外的compass插件 ├─ config.ru ├─ Rakefile #rake的配置文件,类似于makefile,这个我修改了一些内容 ├─ Gemfile #bundle要下载需要的gem依赖关系的指定文件 ├─ Gemfile.lock #这些gem依赖的对应关系,比如A的x本依赖于B的y版本,我也修改了 ├─ _config.yml #站点的配置文件 ├─ public/ #在静态编译完成后的目录,网站只需要这个目录下的文件树 ├─ _deploy/ #deploy时候生成的缓存文件夹,和public目录一样 ├─ sass/ #css文件的源文件,过程中会compass成css ├─ plugins/ #放置自带以及第三方插件的目录,ruby程序 │ └── xxx.rb └─ source/ #这个是站点的源文件目录,public目录就是根据这个目录下数据生成的 └─ _includes/ └─ custom/ #自定义的模板目录,被相应上级html include └─ asides/ #边栏模板自定义模板目录 └─ asides/ #边栏模板目录 └─ post/ #文章页面相应模板目录 └─ _layouts/ #默认网站html相关文件,最底层 └─ _posts/ #新增以及从其它程序迁 ...
阅读全文 »

grep,ack,ag的搜索效率对比

发表于 2016-03-12 | 分类于 python | 阅读次数:
前言我经常看到很多程序员, 运维在代码搜索上使用ack, 甚至ag(the_silver_searcher), 而我工作中95%都是用grep,剩下的是ag. 我觉得很有必要聊一聊这个话题.我以前也是一个运维, 我当时也希望找到最好的最快的工具用在工作的方方面面. 但是我很好奇为什么ag和ack没有作为linux发行版的内置部分.内置的一直是grep. 我当初的理解是受各种开源协议的限制, 或者发行版的boss个人喜好. 后来我就做了实验, 研究了下他们到底谁快.当时的做法也无非跑几个真实地线上log看看用时. 然后我也有了我的一个认识: 大部分时候用grep也无妨, 日志很大的时候用ag.ack原来的域名是betterthangrep.com, 现在是beyondgrep.com. 好吧. 其实我理解使用ack的同学,也理解ack产生的原因. 这里就有个故事.最开始我做运维使用shell, 经常做一些分析日志的工作. 那时候经常写比较复杂的shell代码实现一些特定的需求. 后来来了一位会perl的同学.原来我写shell做一个事情, 写了20多行shell代码, 跑一次大概5分钟, 这位同学来了用perl改写, 4行, 一分钟就能跑完. 亮瞎我们的眼,从那时候开始, 我就觉得需要学perl,以至于后来的python.perl是天生用来文本解析的语言, ack的效率确实很高. 我想着可能是大家认为ack要更快更合适的理由吧. 其实这件事要看场景.我为什么还用比较’土’的grep呢? 看一下这篇文章, 希望给大家点启示 实验条件PS: 严重声明, 本实验经个人实践, 我尽量做到合理. 大家看完觉得有异议可以试着其他的角度来做. 并和我讨论. 我使用了公司的一台开发机(gentoo) 我测试了纯英文和汉语2种, 汉语使用了结巴分词的字典, 英语使用了miscfiles中提供 ...
阅读全文 »

gentoo下的lxc和docker

发表于 2016-03-11 | 分类于 python | 阅读次数:
####前言上次就说要写一篇gentoo下安装使用docker的文章,顺便也学习了下gentoo下的lxc,记录下来####升级你的内核docker要求升级到3.8以上的内核,假如你的已经是3.8.XX,那么你就要重新编译内核,参看Wiki很多人比较怕编译内核,一看那个启动的简陋的页面就不知道该干什么了,出现问题不知道该去选择什么或者去掉什么选项.我来说一些小窍门,简单的说就是根据提示去内核界面按’/‘搜索这个参数,根据提示的位置找到那个项问题1: 假如符合项很多怎么判断那个是真正要我选择的呢?回答: 首先是上下文的判断,一般的情况都是符合某写关键字的项都是某项和它的子项,当你去掉其父项,子项的选项也就消失了,还有个使用的经验的积累.比如下面的提示: 12* CONFIG_NETFILTER_XT_MATCH_ADDRTYPE: is not set when it should be. 意思就是提示你”NETFILTER_XT_MATCH_ADDRTYPE”,没有设置,然后你使用/输入”NETFILTER_XT_MATCH_ADDRTYPE”,回车,会显示类似下面的东西: 12345678910111213Search Results ─────────────────────────────┐ │ Symbol: NETFILTER_XT_MATCH_ADDRTYPE [=n] │ │ Type : tristate │ │ Prompt: "addrtype" address type match support │ ...
阅读全文 »

使用pelican心得

发表于 2016-03-10 | 分类于 python | 阅读次数:
####前言最近在用pelican借用GitHubPages搭建我的小明明sGithub, 总结了些心得####写好Makefileruby有rake,但是python的好像没什么好用的,还是用Makefile,简单粗暴.先看用的 1234567891011121314151617help: @echo 'Makefile for a pelican Web site ' @echo ' ' @echo 'Usage: ' @echo ' make html (re)generate the web site ' @echo ' make clean remove the generated files ' local: ./regen -q ...
阅读全文 »

wechat-admin:ORM使用篇

发表于 2016-03-09 | 分类于 python | 阅读次数:
我是典型的「ORM党」。ORM全称Object RelationalMapping,中文叫作对象关系映射。通过它我们可以直接使用Python的类的方式做数据库开发,不用直接写原生的SQL语句(甚至不需要SQL的基础),使用ORM有如下优点: 易用性。使用这种ORM数据库抽象封装方式做开发可以有效减少重复SQL语句出现的概率,写出来的模型也更直观、清晰。 设计灵活。可以很轻松地写复杂的查询。另外提一下,我在工作中其实有一半时间还是需要直接写SQL的,不过用类的方式包装起来用了。可能不太好理解,有兴趣的可以看一下豆瓣开源的douban-orz这个项目,很多场景都是使用这种数据管理方案,我觉得还是蛮好用的。SQLAlchemy的使用SQLAlchemy是业界最流行的ORM库,它支持多个关系数据库引擎,如MySQL、PostgreSQL等数据库,可以近乎无痛地换数据库。本项目的联系人、群聊、公众号等关系和数据都存在了MySQL上。当使用一个ORM库,基于业务特点和开发者个人习惯通常都会定义一些基类或者Mixin类,我写的项目大都会添加[to_dict方法](https://github.com/dongweiming/wechat-admin/blob/master/ext.py#L8): 123456789101112131415161718❯ cat ext.py from datetime import datetime from sqlalchemy import Column, DateTime from flask_sqlalchemy import SQLAlchemy, Model class BaseModel(Model): # create_at这个属性也是创建表结构默认都包含的 create_at = Column ...
阅读全文 »

怎样不退出交互模式自动reload模块

发表于 2016-03-08 | 分类于 python | 阅读次数:
前言我想做python开发的人尤其是django开发都会有一种经历:进入python交互模式(直接 执行python回车)或者进入django-shell调试某功能,然后修改源码,退出交互模式或者djangoshell,重新进入在吧那些模块一一import… 问题是什么呢?浪费时间,为啥不像web框架那样修改源码自动reload?本来我花了2个多礼拜一直在做这件事情,其实原理就是封装ipython到我的shell,然后在我的shell加这个autoreload功能,但是昨晚看ipython源码发现:ipython早已经实现了…我的系统的实现的源码文件是 /usr/lib64/python2.7/site-packages/IPython/Extensions/ipy_autoreload.py####在ipython交互模式实现和ipython版本有关,大于0.11 这样加载 123%load_ext autoreload %autoreload 2 小于0.11的就要这样加载 123import ipy_autoreload %autoreload 2 ####ipython交互模式自动加载你总不像每次进入ipython都执行这么2句吧,那么可以加到ipython的自定义配置里面.因操作系统和ipython版本不同,ipython的用户自定义目录有所不同,增加的配置也 有所不同首先创建ipython个人配置 12ipython profile create gentoo ~/.ipython ipython :0.10.2配置文件是.ipython/ipy_user_conf.py 添加 123import ipy_autoreload o.autoexec.append('%autoreload 2') opensuse /.config/ip ...
阅读全文 »

wechat-admin:项目设计篇

发表于 2016-03-07 | 分类于 python | 阅读次数:
相信读者同学们都了解[wechat-admin](https://github.com/dongweiming/wechat-admin/),甚至在本地运行过了。今天是wechat-admin项目系列文章的第一篇:项目设计。在你技术学习的过程中或者已经具备了开发所需要的知识时,某一天灵光一闪决定去做一个(web)项目。那么通常前期分这么几步: 需求确认。切忌一上来就写代码,先得在心中能把一个项目能清晰的拆分成一条条的需求,另外也要不断地和需求方确认你的理解是不是正确。 技术确认。首先是确定你能不能hold得住,别摊子铺的太大最后搂不住,或者在预定时间内无法完成。 用较短时间对技术实现难点确认。熟悉的写出来只是时间问题,那些未知不可控的才是你需要首先确认的,如果发现一开始的技术选型有问题,那么就要尽早的停止改其他方案。我希望大家在向下看之前,(闭上眼)思考一下: 假如现在让你来写这个项目,你用什么技术方案,你准备如何的实现?好的,思考之后。来看看我是怎么做的,为什么这样做,以及这个过程中有什么调整和故事吧。 需求 & 选型大家可以看到我在「特性」中的功能列表,其实一开始的需求只有: 微信扫码登录 拉取和存储联系人、群列表、群成员等信息 自动建群,加人 Web管理页面展示这些信息 Web页面上可设置一些需要的功能参数 消息提醒 自动回复机器人那么接着拆分这些需求。由于我主要是在周末和晚上这种闲暇零散时间,所以我希望让这个拆分粒度尽量的小,控制在一个点1-2小时,最多半天这个标准上。有些需求可以同时做(防止长时间做一件事无聊),有些是其他的需求完成才可以开始的。所以,需求和选型是这样:微信扫码登录这个是一开始要做的,我对ItChat/wxpy并不熟悉,这个是整个项目唯一的感觉「不安全」的点了:微信登录和其他常规登录的体验是完全不一样的。别的都是账户/密码、手机号、第三 ...
阅读全文 »

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

发表于 2016-03-06 | 分类于 python | 阅读次数:
在上一节理解Python并发编程一篇就够了 -线程篇讲了一些线程的技术,本节我们接着说进程。上节说到由于GIL(全局解释锁)的问题,多线程并不能充分利用多核处理器,如果是一个CPU计算型的任务,应该使用多进程模块 multiprocessing。它的工作方式与线程库完全不同,但是两种库的语法却非常相似。multiprocessing给每个进程赋予单独的Python解释器,这样就规避了全局解释锁所带来的问题。但是也别高兴的太早,因为你会遇到接下来说到的一些多进程之间通信的问题。我们首先把上节的例子改成单进程和多进程的方式来对比下性能: 12345678910111213141516171819202122232425262728293031323334353637383940import time import multiprocessing 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 nomultiprocess(): fib(35) fib(35) @profile def hasmultipro ...
阅读全文 »

如何了解你的进程使用了多少内存?

发表于 2016-03-05 | 分类于 python | 阅读次数:
我在多个地方看到有同学特别爱提「Python内存溢出」,其实大部分是自己的程序逻辑写的有问题甚至是一种错觉,也有一些新人会提「如何知道我的程序使用了多少内存」这样的问题。那么如何去了解你的进程使用了多少内存呢?最常用的就是resource模块,也是我最推荐的方案(我的书里面竟然没有写进去这部分内容,失败)。如果你感觉这个模块好陌生也是正常的,这个资源使用信息的模块平时确实用到的机会不多: 123456789101112import resource mem_init = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss l = [] for i in range(500000): l.append(object()) mem_final = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss del l print('Class: {}:\n'.format(getattr(cls, '__name__'))) print('Initial RAM usage: {:14,}'.format(mem_init)) print(' Final RAM usage: {:14,}'.format(mem_final)) 内存使用就是mem_final - mem_init。但是要注意2点: 不同平台上ru_maxrss的值的单位是不一样的,在OS X上单位是Byte,但是在Linux上单位是KB。我之前用惯了OS X,一次查看现在程序内存使用,看到上述方法的返回值太小,数量级上差了好多,觉得明显不对啊,困惑了很久,最后还是直接去翻libbc的手册才知道这个区别。大家要注意。 上面用 ...
阅读全文 »

wechat-admin:SSE

发表于 2016-03-04 | 分类于 python | 阅读次数:
在上一篇[项目设计](http://www.dongwm.com/archives/wechat-admin%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%AE%BE%E8%AE%A1%E7%AF%87/)中,我说到了SSE(Server-Sent Events)是为了实现单方向的消息推送,今天介绍下实际的使用。我直接用了现成的[Flask-SSE](https://github.com/singingwolfboy/flask-sse),其实SSE实现的原理比较简单: 借用Redis的发布/订阅模式创建一个方法,方法内会调用pubsub.listen监听新的发布数据。 使用Flask提供的stream_with_context,不断的从上面的方法中获取数据。使用起来分2部分前端在前端页面添加一个函数: 12345678910111213141516171819202122232425262728293031function eventSourceListener() { let source = new EventSource(`${API_URL}/stream`); let self = this; source.addEventListener('login', function(event) { let data = JSON.parse(event.data); if (data.type == 'scan_qr_code') { self.uuid = data.uuid; self.qrCode = `data:image/png;base64,${data.ext ...
阅读全文 »
1…131415…20
Kevin Huang

Kevin Huang

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