豆瓣读书迁移工具 shaDou

shadou

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

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

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

有空了继续改进。


阅读全文 »

删除子字符串

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

问题:给定源字符串 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…
阅读全文 »

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。


阅读全文 »

WordPress 中“设置 Permalinks 导致404问题”解决

前两天刚说到 Blog 第四次搬家,今天又要再搬一次~~原因是上次是在 SAE 上部署的 WordPress,鉴于最近风声太紧,又是扫 H 又是打 H,我的域名又没有备案,所以取消原绑定后果断悲剧。新的绑定无论如何无法验证通过,他大爷的 GWF。

又试了 BAE 和 JAE,压根不支持海外域名绑定~~盛大的云引擎干脆整得像个烂尾,GAE 又被墙。一筹莫展之际,想起来朋友之前推荐的 OpenShift,就抱着试试的心态玩一把,没想到柳暗花明。当然也遇到了一些问题,现在梳理一下做个简单的记录,并在日后补详。

OpenShift 简介

OpenShift 是 RedHat 推出的一个云服务。根据自己的理解,它提供了一个虚拟的云主机,而且还提供了云引擎的许多功能,方便了 Web App 的部署。比如,可以使用它很快速的创建一个 WordPress 应用,包括了代码部署和数据库创建等。具体的介绍还是去查看官网,不再赘述。

一个帐号可以免费创建3个应用(官方称为gear,还没来得及仔细研究它的定义)。付费帐号分为两种,也不贵,都是按需收费。如果将来有需要,也会考虑使用。

问题解决


阅读全文 »