goagent 在 MAC 下 sslwrap 错误修复

goagent 升级到3.2.3后,总提示报错 'module' has no attribute 'sslwrap'。Google 后发现,OS X 10.10 把 Python 升级到了2.7.9,而该版本中移除了 sslwrap 方法,所以报错。因此该问题并非仅针对 Mac,只不过 Win 下 Python 升级不频繁,很少出现该问题。

解决方法为修改 /Library/Python/2.7/site-packages/gevent/ssl.py 文件,添加如下代码:

问题解决。还遇到过的其他问题:

  1. 执行sudo launchctl load /Library/LaunchDaemons/org.goagent.macos.plist没有效果,原因往往在于该配置文件内容有误。比如 Python 执行程序路径写错,修改后重新执行上述命令即可。

  2. 上述配置文件中python路径为/usr/bin/python,是系统自带python所在路径。而自己通过brew安装的python往往链接到/usr/local/b


阅读全文 »

豆瓣读书迁移工具 shaDou

shadou

一直想换个豆瓣帐号,毕竟玩这种网站,里面有熟人总是不方便…但读书、电影和音乐收藏信息的迁移比较麻烦。上百部图书电影,要是挨个点,既看着傻叉,又深感有辱程序员的荣耀。所以花半天写了这么个小玩意儿。

shaDou 取自 shadow 和 douban 的合体,研究一下午豆瓣 API 和 Python 客户端,发现文档各种不全,还要手动测试返回数据格式。加之电影和读书信息的 API 格式不同,暂时没有编写一个统一的客户端,只实现了读书信息迁移。

源码放在 GitHub:https://github.com/bt404/shaDou

有空了继续改进。

注:转载注明出处并联系作者,本文链接:https://nodefe.com/douban-migration/


阅读全文 »

删除子字符串

这是之前校招遇到的一道笔试题,整理下思路和代码。

问题:给定源字符串 pSrc 和待删除的字符串 pDel,要求将 pSrc 中所有出现的 pDel 删除。

因为是让现场给代码,第一次给出每次用 KMP 查找到 pDel 后删除,后面的字符串向后移动。这样会造成重复移动的情况。

思路

查找当前 pDel 出现的位置 pFirst,用一个计数器记录当前是第几次找到 pDel(假设为 n),结合 pDel 的长度 len,然后查找下一个 pDel 所在的位置 pSecond。如此 pFirst 和 pSecond 之间的字符串只需直接向后移动 n * len 距离,一次移动即可。

假设当前 pFirst 指向第6个字符,n 为2,pSecond 指向第11个字符,len 为2,那么只需将第 6+2=8 到第 11-1=10 个字符向后移动 2*2=4 个位置即可,如下图所示:

删除子字符串

如图所示,第一次执行 KMP 返回1,然后查找下一次出现的位置,再次执行 KMP 返回6,所以第 1+2=3 ~ 6-1=5 个字符(即图中①部分)向后移动 12=2 个位置;再次执行 KMP


阅读全文 »

MySQL GROUP BY 两个或多个条件

主要是帮同学解决的一个问题,用到 SQL 中的 GROUP BY。

问题:一个表(AttackIP)有两个字段,端口号(Port)和访问时间(Atime),求出同一分钟内每个 IP 出现的次数。

解决思路

考虑到逻辑的清晰,先创建一个视图 AttackLog。视图将每条记录中的时间字段转换为时间戳,并且修改为该时间所属分钟的初始时刻(Atime)。如此,问题转换为查找相同 Atime 分组内具有相同 Port 字段的记录数量。

SQL 语句如下:

测试数据

AttackIP 表

Port
Atime

22
2013-03-03 03:05:06

22
2013-03-03 03:05:50

22
2013-03-03 03:05:45

42
2013-03-03 03:05:45

42
2013-03-03 03:04:45

22
2013-03-03 03:06:45

42
2013-03-03


阅读全文 »

MooseFS 安装与配置

论文需要实现一个分布式推荐系统。并行计算框架选择 Dpark,其对 MooseFS 做了优化,因此使用实验室的机器和自己的 VPS,基于 MooseFS 搭建了一个分布式存储系统。主要内容都可以在官网找到相关文档,这里不过是把一些地方加以翻译和简单梳理,部分地方加了少许自己的理解。

MooseFS 架构

MooseFS 主要分为4种服务器,分别提供不同的服务。对应的关系如下:

  1. Managing server (master server):是一个单独的服务器,用来管理整个文件系统。它存储了文件系统中每个文件的元数据(包括文件的大小,属性以及文件存储的位置等)。
  2. Data servers (chunk server):由若干台机器组成的数据服务器,用来实际存储文件的数据。它们之间还可以互相同步数据(这是因为每个文件在文件系统中可能拥有多个 copy,copy 的数量可以自行配置,见下文)。
  3. Metadata backup server(s) (metalogger server):由一台及以上机器组成,用来存储元数据的 changelogs,并且周期性地从 Managing se


阅读全文 »

pymalloc — 从源码看 Python 对象分配器实现

Python 中一切皆对象,那么 Python 解释器(CPython)是如何管理这些内存中的对象呢?为了找到答案,自己下载了 Python 源码,参照源码注释学习了 pymalloc — Python object allocator 的实现。现在这里做个总结。

pymalloc 的实现位于 Python 源码主目录下的 Objects 目录中,文件名为 obmalloc.c。

背景

既然 CPython 的底层用 C 语言实现,那为何不直接使用标准库中的malloc/realloc/free等函数进行内存管理呢?这是因为,当 Python 应用频繁地创建和销毁一些小的对象,那么底层就要多次重复调用 malloc 和 free 等函数进行内存分配。这不仅会引入较大的系统开销,而且还可能产生大量的内存碎片。为了解决这个问题,Python 实现了一个类似内存池的机制—pymalloc 来满足较小对象(默认512KB以下)的内存请求。

Python 内存管理架构

简单地说,allocator 预先向系统申请一定数量的内存空间并格式化,每当有满足条件的内存请求时,allocato


阅读全文 »

使用 JavaScript 闭包实现 Google Maps 平滑缩放

注意:因本页面引用了 Google Maps 服务,建议翻 qiang 浏览,否则可能造成演示部分无法正常显示。

看书看得头晕,写篇博文放松下。刚才跑到 Google Maps 的 reference 看了下,发现好多 API 已经升级。想起去年自己实现的一个平滑缩放功能,现在做个总结记录一下。

问题描述

之前做项目要用到 Google Maps 的缩放功能,map 通过使用setZoom(level)方法来设置 map 的 zoom 值。level 通常为0至18之间的一个整数值。如果当前的 zoom 值和setZoom(level)中的 level 值相差不超过2时,地图会有一个渐变的缩放过程。当差值超过2时,地图会直接刷新到新的缩放程度,而没有渐变的动画过程。

解决方案

鉴于上面的特点,考虑当差值超过2时,分多次调用setZoom(level)方法,每次使得 level 的值增加2(当最后一次缩放程度为1时除外)。考虑到 JavaScript 是单进程的,所以使用闭包来实现这个功能,使用外部变量来存储每次缩放前后的 zoom 值。函数代码如下:

[crayon-662…
阅读全文 »

318 骑记 (成都 — 拉萨)

这几天计划给自己放个假休息一下,正巧骑行川藏的游记一直没有写,今天借机补上。

队友召集

其实本科毕业前就和乐哥约好了骑318,由于意外搁浅。去年和乐哥聊天时,无意又扯到这件事。乐哥说明年就订婚,可供逍遥快活的日子委实不多。听罢便感觉帮助乐哥实现这个梦想义不容辞。于是鼓动乐哥别 TM 憧憬,直接去。嫂子也是通情达理之人,经过乐哥几番苦心沟通,最终同意放行。路上得知乐哥签订了一系列不平等条约,包揽了婚后洗衣做饭买菜等事项。

搞定了乐哥,然后就是老唐。老唐是我的老驴友,一块去过青海,肃北还有湖南和贵州,有这好事自然也不能忘了老伙计。但时值老唐刚考进了市医院,请假是个问题。最后经过几个月主动加班(是否有其他牺牲不得而知)。凭借出色表现,老唐终于获得了两位科长首肯和放行,还送他了几条魔术头巾…

其实还想喊 kk,但丫跑德国读书去了,很遗憾。下次肯定还有机会,只要你赶在我订婚之前回来。最后在网上结识了在汤圆店里帮忙的小乐子,约好同行,一直到了成都才初次相见。事后证明,这是一笔超值签约。一路上补胎,调刹等脏活累活都他包了。牲口式体力,创下觉巴山操山记录,给了身为队长的我很大压力。

怕人


阅读全文 »

AngularJS 使用 ng-cloak 防止未渲染模板内容输出

问题描述

今天使用 AngularJS 时遇到这样的问题:模板中绑定的数据需要在加载页面时,调用$http服务向服务器索取,然后绑定 model 来刷新 view。但是页面(也即 HTML DOM)是先于 AngularJS 的模板渲染而加载完成的,这就造成一个问题,未完成数据绑定的模板表达式(比如{{}}中的内容)被原样打印出来。当然这只是临时性的展示,当 Ajax 请求结束并完成数据绑定后,页面会自动刷新,表达式也被正确的数据替换。但是这个临时性的页面还是很不给力(当然可以使用ng-bind代替{{}}表达式,但是遇到ng-repeat的 li 时,列表会显示一个 li,依然很丑陋),所以开始找解决方案。

解决方案

通过 Google,发现大家提供的解决方案主要有两种:一是使用ng-show/ng-hide来解决,二是使用ng-cloak来解决。查阅文档后,感觉这两种方法的解决思路是一样的,仅介绍第二种方法,也是官方文档给出的解决方法。

官方对ng-cloak标签的定义如下:

The ngCloak directive is used to prevent the


阅读全文 »

MongoDB 批量删除子文档(列表类型)下的匹配对象

今天遇到在 MongoDB 中,要批量删除子文档(列表类型)中的匹配对象。

首先想到用$pullAll来实现,结果失败。查找文档得知,$pullAll要求待删除的对象完全匹配。而$pull也可以在一次执行过程中删除多个匹配的子文档,所以改用$pull后实现。现在将示例数据和操作代码整理如下,文档为:

鉴于“凤姐”和“芙蓉姐姐”都去美国发展,所以抹去此二人,使用一条语句完成该删除操作,代码如下:

到此功能完成。又遇到另一问题,旧的已去,新的要来。比如现在要加入作家“小四”和舞蹈演员“迭戈·科斯塔”,可以使用

$addToSet向 members 添加。但是却不能写入上面的操作语句。文档中提到,不能在同一语句中对一个 field 执行两种不同的增/删/改操作。所以需要分两次执行 update。

注:转载注明出处并联系作者,本文链接:https://nodefe.com/mongodb-delete-subdocs/


阅读全文 »