排列问题

作者:JerryXia | 发表于 , 阅读 (25)
第k大的排列以 perm[k/(n-1)!] 开头.第k大的n个元素的排列, 等于以perm[k/(n-1)!]开头的元素, 上去掉这个元素后剩下的元素组成的第 k % (n-1)! 大的排列.于是就有了一个很简单的递归关系:
kth_perm(perm, k) = perm[k/(n-1)!]  +  kth_perm(perm[0..i-1] + perm[i..n-1], k % (n-1)!)根据这个关系可以写出kth_permutation的代码:
vector<int> kth_permutation(const vector<int> &vec, int k){if (k == 0)return vec;int n = vec.size();k %= fact(n);int t = fact(n-1);int i = k / t;int kk = k % t;vector<int> result;result.push_back(vec[i]);vector<int> left;copy(vec.begin(), vec.begin()+i, back_inserte...阅读全文

优雅的repo sync自动重试

作者:JerryXia | 发表于 , 阅读 (19)
while [[ 1 ]]; do# 用ifstat检测网速speed=`ifstat 1 1 | tail -n 1 | awk '{print $1}'`result=$(echo "$speed < $min_speed" | bc)if [[ $result == "1" ]]; then((counter++))else((counter=0))fiif ((counter > retry_delay)); then((counter=0))echo "netspeed low. restart!"((n_retries++))restart_syncfidoneecho "completed with $n_retries retries"在上面这个版本中, 我们使用ifstat来检测网速, 没秒检测一次, 如果持续一段时间没流量, 就kill掉所有repo进程. 这里有个问题: 如果repo sync正常退出了, 那么也就没有流量了, 所以这个脚本会无限执行, 永远不会停止. 同时, 我们需要知道repo退出时, 是成功的退出, 还是出错退出? 要检测返回值就必须用wai...阅读全文

为virtualbox中的Linux虚拟机磁盘扩容

作者:JerryXia | 发表于 , 阅读 (16)
最近想自己hack一下android的源代码, 可是发现代码好大啊, 编译一下大概需要40G的空闲空间. 而之前装好的Linux本来硬盘就只有40G, 于是研究了一下, 发现是可以直接扩容的, 虽然步骤有点麻烦.
备份数据虽然说按照这个步骤做应该不会出什么问题, 但是重装系统毕竟是个麻烦事, 所以在扩容之前, 先做一下备份! 避免产生人品问题而后悔莫及. 毕竟备份虚拟机还是很省事的, 直接整个目录拷贝一份即可.
扩大VirtualDisk我们先把VirtualBox里的这块硬盘扩大:
C:cd "C:\Program Files\Oracle\VirtualBox"VBoxManage modifyhd "D:\VM\mint-xfce\mint-xfce.vdi" --resize 1000000正常的话, 系统会输出:
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% 然后就退出了.我们可以去VirtualBox里看看硬盘大小:

已经变成1000G了(其实我不小心多打了1个0, 不过无所谓了...阅读全文

关于python decorators

作者:JerryXia | 发表于 , 阅读 (15)
高阶函数在python里面decorator看起来是个挺高端大气上档次的词, 不过这个东西在函数式语言里面其实很稀松平常, 用一句话概括起来就是高阶函数的语法糖.什么叫高阶函数(high order procedures)呢? 就是返回值或者参数是函数的函数. 比如我们现在有个函数hello_world:
def hello_word():print "hello world!"这个函数的个功能是打印一行字”hello world”. 现在我们想写一个函数, 它的功能是把hello_word这行字打印10遍, 怎么做呢? 简单:
def hello_world_10():for i in range(10):hello_world()现在我们站的更高一点, 希望写一个更通用的函数, 可以将任意函数执行任意10次, 要怎么办呢?
def ten_times(func):def new_fun():for i in range(10):func()return new_funhello_world_10 = ten_times(hello_world)hello_world_10()...阅读全文

Android 源代码上手指南 - Build System初探

作者:JerryXia | 发表于 , 阅读 (18)
Android 源代码上手指南 - Build System初探Mar 21, 2014
Android总体来说是个挺好用的系统, 虽然有不少这样那样让我觉得不喜欢的地方. 不过好在它是开源的, 于是很多不爽的地方可以自己改. 研究Android源代码也有一段时间了, 在github上开了个坑, 把自己的一些想法加了进去, 取名为yacm:
http://github.com/codescv/yacm
之所以叫yacm主要是因为它是基于CyanogenMod改的 (yet another cyanogenmod). 里面加了一些我觉得很需要但是CM没有提供的功能, 例如:
去掉了拨VPN必须设置锁屏密码的限制. (Android脑残点之一)将媒体扫描改为白名单模式, 只有白名单内的几个文件夹(如DCIM, Pictures等)会被扫描, 再也不用担心相册里出来一大堆乱七八糟的广告图片什么的了. (Android脑残点之二)拨号盘增加首字拼音搜索. (中国用户必备)增加了一些方便开发者的工具, 例如下拉快捷菜单中的ADB开关, 电源按钮开关等在研究的过程中也走了不少弯路, 这里尽...阅读全文