IT技术博客大学习 共学习 共进步
首页 / the5fire的技术博客
IT 2014-08-15 12:31:42 / 累计浏览 2,060

Python中的闭包

这篇讲的是Python中一个既基础又容易模糊的概念——闭包。作者从一个实际的读者提问出发,用维基定义的“词法闭包”和“自由变量”两个关键词引入,并巧妙地将其比喻为一个“封闭的包裹”,包裹(函数)内部装着随身携带的自由变量。 文章的核心对比在于闭包与类:两者都实现数据封装,但闭包粒度更细,是一个只读的“函数对象”。作者接着深入剖析了闭包在Python中最常见的三个应用场景:一是构建装饰器,通过闭包持有被装饰函数并扩展其功能;二是实现类似“惰性求值”的效果,推迟某些操作(如数据库查询)的执行;三是作为`functools.partial`的原理示范,用于函数参数的提前绑定。 通过这些代码示例,文章清晰地展示了闭包如何作为函数式编程的重要工具,解决代码复用和状态保持的问题。对于想真正理解Python装饰器机制或函数式编程特性的开发者来说,这篇从概念辨析到实战落地的讲解是个不错的起点。

IT 2013-07-31 13:32:23 / 累计浏览 3,680

进程管理器supervisor的使用(django实例)

这篇讲的是用Supervisor管理多个Django进程的具体实践。作者从Python生产环境中常见的进程管理需求出发,介绍了Supervisor这个由Python实现的工具。 在典型的部署场景里,通常需要用Supervisor同时启动多个Django或Tornado应用,让它们监听不同端口,再由前端的Nginx进行反向代理。文章以Ubuntu环境为例,详细演示了从创建Python虚拟环境、安装Supervisor,到编写配置文件的完整过程。 配置是关键,作者分享了几个核心点:通过`numprocs`参数指定启动的进程数,结合`process_num`变量动态分配不同端口;特别提到了配置Unix socket文件时,权限设置需使用`sockchown`而非`chown`的坑。最终的目标是让一个名为“sayhello”的Django项目成功运行在8000和8001两个端口上。 文章也坦诚地提到,对于这种架构是否算负载均衡,作者尚未深入研究,展现了实践中边做边学的真实状态。整体而言,这是一篇聚焦于具体配置和常见陷阱的实用向导。

IT 2013-05-14 22:31:05 / 累计浏览 3,800

Django数据库访问优化

这篇文章从Django开发者的实际痛点出发,聚焦于如何诊断并解决数据库访问性能瓶颈。作者首先指出了两个实用的分析工具:利用 `django.db.connection` 查看执行的SQL与耗时,以及集成 `django_debug_toolbar` 进行可视化监控。 在优化策略上,文章的核心思路是将计算尽可能下推到数据库层完成。它详细讲解了如何善用 `filter`、`exclude` 以及 `F()` 对象进行高效过滤,并通过 `annotate` 预先完成聚合计算。对于复杂查询,则介绍了 `QuerySet.extra()` 和原生SQL的使用场景。 针对ORM层常见的性能陷阱,文章深入剖析了QuerySet的惰性求值与缓存机制。它对比了 `select_related`(针对外键/一对一关系)与 `prefetch_related`(针对多对多关系)这两种预加载技术的不同适用场景,能有效避免N+1查询问题。此外,通过 `values()`、`defer()` 和 `only()` 精确控制返回字段,以及使用 `count()` 代替 `len()`,都能显著减少不必要的数据传输与处理开销。这些技巧共同构成了一套从诊断到优化的完整实践指南。

IT 2013-04-06 23:15:38 / 累计浏览 6,560

linux下的高效代码搜索工具-ack

这篇讲的是一个专为程序员打造的代码搜索工具——ack。作者从厌倦了反复敲击 `grep + find` 的组合命令出发,介绍了这款号称“better than grep”的利器。 ack的核心优势在于它为源代码搜索做了深度优化。它默认会忽略版本控制、二进制文件和非源码目录,只在有意义的文件中高速检索,这直接解决了使用grep时经常误中日志或无用文件的痛点。文章通过对比展示了ack更简洁的语法:例如用 `ack-grep -w hello` 快速精确匹配单词,用 `--python` 参数一键限定只搜索Python文件,省去了繁琐的过滤步骤。文中还详细演示了ack在结果处理(如只显示文件名)、文件查找和基于文件类型的灵活过滤等方面的实用命令。 此外,ack支持通过配置文件固化个人习惯,例如设置默认搜索的语言类型、结果排序和分页展示,让高频操作更加顺手。对于需要在复杂项目中快速定位代码片段的开发者来说,ack能显著提升效率,是grep一个更聚焦、更现代的替代选择。

IT 2013-03-04 13:58:51 / 累计浏览 4,680

VIM插件管理及python开发环境配置

这是一篇作者在公司内部做的技术分享,核心是解决新手面对VIM时无从下手、Python开发环境配置繁琐的痛点。文章没有停留在理论层面,而是直接提供了一套经过实践检验的“抄作业”方案。 作者首先建议备份原有配置,然后详细展示了自己的.vimrc文件配置过程。关键点在于使用Vundle这个插件管理器,通过几行命令即可自动安装和管理如jedi-vim(Python智能补全)、nerdtree(文件树)、ctrlp(模糊文件搜索)等一系列提升编码效率的必备插件。配置中还包含了实用的基本设置,比如用空格代替Tab、配置状态栏显示Git和语法检查状态等。 这套方案的目的很明确:让开发者能快速跳过繁琐的“造轮子”阶段,获得一个开箱即用的高效开发环境。对于希望利用VIM进行Python开发,但又被初始配置劝退的读者来说,这份可直接复用的配置清单和配套PPT提供了清晰的行动路径。

IT 2013-01-16 14:10:46 / 累计浏览 9,300

linux下搜索find命令详解

这篇文章来自一次内部技术培训,作者觉得分享的内容不够全面,于是系统地整理了 Linux 下 `find` 命令的各种常用选项和示例。 它开篇点明 `find` 是一个强大但速度较慢的搜索工具,随后围绕其基本语法 `find [路径] <表达式> [操作]`,详细拆解了十多个核心选项。文章不仅列举了按文件名(`-name`)、按时间(`-atime`, `-mmin`)、按用户(`-user`)和按大小(`-size`)进行查找的常规操作,还介绍了一些实用的进阶技巧。例如,使用 `-exec` 可以直接对查找结果执行命令,像批量删除 `.svn` 目录;利用 `-perm` 和 `-regex` 则能满足更精细的权限或模式匹配需求。文末附带的逻辑组合(`-o`, `-a`, `!`)和目录深度控制(`-maxdepth`)示例,让复杂条件的查询成为可能。 整体来看,这更像一份为团队定制的 `find` 命令速查手册,将零散的知识点梳理成了清晰的条目,每个选项都配以实际可运行的命令。对于日常需要在 Linux 文件系统中定位文件的开发者和运维人员来说,这份清单覆盖了绝大多数使用场景,省去了反复查阅手册的麻烦。

IT 2012-12-23 23:12:20 / 累计浏览 8,680

sshd+chrome+switchsharp翻墙

这篇讲的是如何在Linux系统下,通过SSH隧道结合Chrome浏览器的SwitchySharp插件,为团队成员快速搭建一条稳定的访问通道。作者从团队获得了一个付费SSH翻墙账号的背景出发,解决了此前免费账号质量不稳定、无法流畅访问Google、Twitter等网站的问题。 文章的核心方案分为三步。首先,利用`putty-tools`中的`plink`命令建立本地SOCKS代理,关键参数是`-D 127.0.0.1:7070`,并将其封装为可执行脚本`fan.sh`以便一键启动。其次,为Chrome浏览器安装代理切换插件`proxy-switchysharp`。最后,详细配置插件,设置代理类型为SOCKS5,并配置自动切换规则,例如通过正则`(google|facebook|twitter|youtube){1}`来区分哪些网址需要走代理。 完成上述配置后,只需运行脚本并启用SwitchySharp的“自动切换模式”,即可实现对目标站点的代理访问。整个过程清晰、可操作性强,为需要特定网络环境的开发者提供了一个轻量且有效的解决方案。

IT 2012-12-23 23:11:50 / 累计浏览 6,940

linux目录跳转快捷方式——z武器

这篇讲的是Linux下如何告别繁琐的`cd`命令,实现目录的“智能跳转”。作者从在机房目睹资深工程师行云流水般的`cd`操作说起,分享了自己想提升效率却常被“忘记目标目录在哪一层”困扰的经历,从而引出了一个名为“z”的命令行小工具。 z本质上是一个轻量的shell脚本,它通过自动记录你常访问的目录路径,让你只需输入目录名称的关键词就能一键跳转。文章清晰地介绍了它的核心用法:安装后,z会默默记住你的操作习惯。以后,无论你身处何处,只需输入`z 关键词`(例如`z python`),就能立刻进入之前记录过的、包含该关键词的目录,彻底省去了层层递进的`cd`和反复`Tab`补全的麻烦。 对于需要在多个项目目录间频繁切换的开发者和运维人员来说,这个小工具能显著提升命令行操作的流畅度与效率,是一个即学即用的实用技巧。

IT 2012-12-16 23:46:42 / 累计浏览 4,500

ubuntu定时执行任务crontab的使用

这篇讲的是作者从实际需求出发,学习并实践Ubuntu系统中定时任务工具crontab的过程。作者最初为了定时执行一个数据爬取脚本,从同事那里了解到crontab,并在保证知识体系完整性的前提下进行了梳理。 文章从crontab的基本概念和由来说起,解释了它作为守护进程周期性检查作业的机制。核心内容聚焦于实际使用:通过简单的三个步骤(运行`crontab -e`、选择编辑器、编写配置)即可开始。作者用两个清晰的例子说明了配置方法:一个是让Python脚本在每天早上7:30执行,并将输出与错误日志重定向到文件;另一个是设置脚本每隔3分钟执行一次。 其中重点解析了配置文件中五个星号分别代表的分、时、日、月、周单位,以及反斜杠(/)用于指定频率的用法。例如,`*/3 6-8 * * *`表示在早上6点到8点之间,每隔3分钟触发一次任务。整篇文章将概念与紧密贴合的实例结合,清晰展示了如何将一个定时需求落地为具体的crontab配置。

IT 2012-12-06 13:53:52 / 累计浏览 2,320

urllib2源码解读三(探索OpenerDirector的add_handler)

这篇讲的是 urllib2 源码中 OpenerDirector 的 add_handler 方法如何实现 handler 的自动分类。文章接续了之前对 build_opener 的探讨,深入到 add_handler 的内部,揭示了它并非简单存储,而是根据每个 handler 实例所具有的方法,进行智能归类。 核心的实现思路非常巧妙:它不依赖显式的类型标识,而是通过解析 handler 方法名的结构来动态分类。具体来说,代码会遍历 handler 的所有方法,检查方法名是否包含特定模式,例如 `http_error_404` 或 `https_open`。它以第一个下划线为界,前半部分是协议(如 http、https),后半部分是条件(如 open、error_301)。根据这些解析出的信息,handler 会被分别注册到 `handle_open`、`handle_error`、`process_request`、`process_response` 这四个核心字典中,使得后续的网络请求调用链能高效、准确地匹配到对应的处理器。 这种基于“约定优于配置”的动态注册机制,让 handler 的功能与协议、状态码紧密绑定,既保持了扩展的灵活性,又确保了内部调用的有序性,是 Python 标准库设计中的一个典型范例。

IT 2012-12-06 13:53:04 / 累计浏览 2,600

urllib2源码解读二(简单的urlopen)

这篇文章从大家最熟悉的 `urllib2.urlopen('http://python.org')` 这行代码出发,带我们潜入Python标准库的源码内部,探索一个简单HTTP请求背后的构建机制。 作者揭示了一个巧妙的设计:`urlopen` 在首次调用时,并不会重复创建连接对象,而是通过 `build_opener` 函数构建一个全局的 `_opener` 对象。后续的所有请求都复用这个对象,从而避免了频繁初始化的开销。这个 `_opener` 本质上是 `OpenerDirector` 的实例,它像一个项目经理,内部通过几个关键的字典(如 `process_request`、`handle_open`、`process_response`)来管理众多功能各异的“处理器”(handler)。 文章重点剖析了 `build_opener` 函数的运作:它先初始化一个 `OpenerDirector`,然后将一系列默认的 handler 类(如 `ProxyHandler`、`HTTPHandler` 等)注册进去。整个过程清晰地展现了 urllib2 高度模块化的架构——通过组合不同的 handler 来构建功能强大的 opener,使得网络请求的处理流程灵活且可扩展。这让读者不仅能看懂代码,更能理解其设计哲学。

IT 2012-12-06 13:51:35 / 累计浏览 3,820

urllib2源码解读一(开篇)

作者从某个午饭后刷微博的感悟出发,决定深入阅读Python中一个超高频使用的模块——urllib2的源码。这篇文章是该系列的开篇,为读者勾勒了整个urllib2工作流的全景图。 文章重点剖析了三个核心对象:负责构建处理器的`build_opener`、作为流程调度中心的`openerdirector`,以及封装请求细节的`request`对象。其巧妙之处在于`openerdirector`的设计,它利用两个字典(`process_request` 和 `process_response`)对不同协议的Handler进行分类管理,形成了一条清晰的处理链。作者也点出,这背后借鉴了经典的Command设计模式。 在补充说明中,作者用更直观的语言复述了从`urllib2.urlopen(url)`调用开始的完整流程:OpenerDirector被构建并注入一系列Handler,生成的Request对象决定请求方法(GET/POST),并最终经过Handler链的处理返回一个类似文件对象的Response。这种从实例到抽象、再回归实例的解读方式,让复杂的框架设计变得易于理解。 作者阅读源码的初衷,是想透彻掌握这个日常工具,并从其设计中汲取营养。对于想理解HTTP请求处理机制或学习框架设计的开发者来说,这篇拆解提供了一个很好的思维起点。