漫无止境的程设助教

2011年,大四。觉得大四下比较闲,所以就当了个程设助教,结果没想到就被这个分支剧情套进去了。。原本最happy的时光,却落得每周六晚上都得去机房,结果就是失去了本科最好的出游旅行时间。
2012年,研一。本身想好了要当数字媒体助教,结果却又被忽悠了去当程设助教二回目。虽然作业类似,这点减少了一些工作量(大四时候每次程设作业都得自己做),但是改作业同样费时费力。结果就是研一下半学期也没什么科研进展。
2013年,研二。本身想好了打死也不当程设助教了,结果被push地去当了程设助教三回目。于是,轮回又一次开始了。

细数这三次轮回,第一次因为最新鲜,所以最认真,而且学生提问回答的也最积极;第二次有点老油条了,但是本着对学生负责的态度,还是回答了问题;第三次就有点随性了。
不过,其实最根本的原因还是所谓性别比。一回目是3:1(20:7),二回目是4:1(21:5),三回目华丽丽成为了7:1(22:3)。若明年还有四回目,那岂不是就要23:1了么(等差数列很和谐)……
kamisama,请让这个循环语句写成如下形式吧!
for(g=7;g>1;g-=2)
这样四回目就不存在了喵

所以说,人是逼出来的

时间回到3月2日上周六下午,我跑去找老田:
“我想投mm的short,请问文章该怎么安排?”
“啊,什么时候截止啊?下周六?你来不及的啦。。。”
“那下面还有什么会可以投么?”
“我查查。。。4月ICCV,后面得9月以后了。。。。。。要么你这两天熬夜赶mm吧”
“恩……”

于是,7天,没有实验结果,paper还没写一个字,mission impossible?
day0(3.2):开始跑跑实验吧。
day1:恩,写写introduction吧。好累啊,看看动画吧。。
day2:恩,写related works好麻烦。。跑实验吧~
day3:啊,周二了,必须弄一稿出来了
day4:啊,写完了第一版,啊,introduction和后面内容不一样诶……重写吧
day5:重写完了!
day6:师兄,帮我改一遍吧!
day7:啊,该投出去了……

其实,事情的背后是每天12点回寝室早上8点出门中间把原来每天仅1小时的工作改成了每天仅1小时的娱乐……证据是ipad mini用了一周没充电还剩50%电量还不包括别人拿去玩的……

所以说,人是逼出来的,逼上梁山了连猫都会如此拼命……

windows server 2008 r2系统文件缓存过大的解决方法

问题描述:server 2008 r2系统会在进行大量IO操作时,占据大量内存资源,直至内存占满,从而导致系统运行速度变慢。

相关现象:
1. 内存占用率90%以上(即是是64G内存,也会占用63.5G)
2. 资源管理器中所有进程内存和较低(约10G)
3. 通过RAMMAP可以看到Mapped File一项数值很高。

产生原因:
Server2008 r2会尽量使用内存来进行文件缓存,从而提高相应文件的读写速度,然而,却没有设置一个默认的极限值(属于windows系统的问题)

解决方法:
1. 暂时解决策略:利用RAMMAP的empty system working set,可以使得文件缓存释放掉。具体如图所示。缺点是之后如果继续进行IO操作,文件缓存还会一直增加。
2. 更好的解决策略:强制设置windows系统文件缓存大小,使得其不会占用大量的内存。缺点是每次重启都需要重新设置。

相关图片:

如图所示,使用RAMMAP可以使得文件缓存完全释放,但是后期会重新增加直至填满。
使用SetSystemFileCacheSize可以使得文件缓存得到有效控制。

相关软件下载:
SetSystemFileCacheSize

参考资料:
http://social.technet.microsoft.com/wiki/contents/articles/6925.how-to-prevent-filecache-to-eat-up-all-the-ram.aspx

最近一个月part3

——————————————————实习——————————————————
去年10月开始在weaver mobile开始实习,今年四月突然因为身体原因就没再去了。一方面是身体原因,一方面是惰性:习惯了周末在寝室睡大觉,谁还想去实习呢?当然,这一切到了7月就完全改变了。
为什么要去实习呢?主要有两种可能:1.闲着没事,想锻炼自己;2.现金流出现了问题。鉴于我们实验室从来都会有endless的项目需要完成(所以老板们每月的收入相当多啊~),所以那仅有一种剩下的可能:没钱了。
其实倒不是说收入不多,之前一边实习的时候每个月也有2500的收入,但是往股票里面投了几乎所有的现金储蓄导致现金余额稀少,并且股票还亏损了近15000,加上从入市至今的通胀,实际亏损应该到了50%这种事情我会乱说嘛!反正就是现金流出现了问题,大抵只剩下2000左右的现金了(有钱的话我还想买块3T的硬盘啊!),所以就跑去实习了。然而实验室居然又要开始封闭了,真是冤家路窄啊!
所以,从七月开始,不在实验室的时间,我就去实习了。。所以在宿舍的时间就越来越少了。现在每天8点半出门,晚上9点半归,12点睡觉,基本就是机械性质的生活了。所以,好好攒钱吧~
——————————————————暑期封闭——————————————————
去年实验室搞了一次暑期封闭,要求9:30-21:30在实验室干活,一周六天,结果成效一般吧,结果今年居然还要搞。。看样子是牟足了劲要我们难堪了。一周六天啊!每天12个小时啊!去掉吃饭还要10个小时啊!一连四周啊!给的RA最多就够来回一次上海啊!去他妹的!
总之,很不爽,很愤恨,但却无可奈何。
——————————————————自行车·柠檬市场——————————————————
6月1日的时候自行车丢了,然后在大约28日的时候在BBS的secondhand版买了一辆二手车。当时就是脚踏板比较不舒服,也没在意。结果前天突然开始疯狂掉链子了,一天掉4次,第二天早上连着掉了2次,太夸张了吧!于是去燕东园修车铺,说是车的中轴坏了,还没得换,得报废,擦。。果然是柠檬市场啊,买家不知道商品的质量,卖家的定价与质量没有直接的关系。简而言之:被坑了。
于是上午在bbs发帖卖车,100元带锁(买的时候130不带锁。。),很快就有要的人了。然后中午顺利转出手。下午又上一次bbs准备删帖,结果发现一下多了15封站内信,全是要买车的orz,看来我的定价还是低了点啊~好吧,权当攒rp,希望买我车的人不要出什么事故就好。。
没车去燕东园很不方便,所以去清华西门买了辆新车,300元,感觉还不错,至少骑得快的时候没有噪音了,而且提速性能不错。总而言之,希望未来两年这车不要再被偷掉吧。。
最后还是重申一遍:BBS的secondhand是一个柠檬市场,买家知道的信息太少,很容易被骗。而我这样单纯的卖家恐怕还比较少见的吧。。
——————————————————暑期目标——————————————————
1.完成人肉系统的数据更新(已于两周前完成)
2.体重减到80kg以下(终极目标:75kg),然而,从7月1日至今,体重反而从82升到了84了orz我在干嘛呀!
3.好好锻炼身体:现在每天晚上跑五四,争取天天坚持(空气质量为轻度污染时暂停)
4.完成尽可能多的活,以及各种研究任务:赶紧发文章赶紧毕业啊!
5.好好赚钱,怎么着回家的路费得搞出来吧。。
6.养成良好的作息。前几篇日志也说了,现在每天12点准时睡觉,8点多起床,早睡早起身体好!

最后的总结:
暑假一个月,fighting!
p.s.上个月看了《灌篮高手》又看了《龙珠》结果其它一事无成这种事我会光明正大的说嘛?!

OpenCV版本害死猫

昨天重新写了一遍DCSift的提取过程,自认为写得没问题,结果跑实验发现结果不正确,于是开始Debug……

从结尾开始一步步调,一直都没问题。然后,到了开头的地方,cvLoadImage是对的,cvResize是对的,cvCvtColor就不对了。。把OpenCV换回原来的2。0版本,结果又一样了,莫非,OpenCV2.0和2.4.1里面cvCvtColor实现不一样?

于是一路找源代码,终于发现了问题的根源:参数不一样。

代码里面用到的cvCvtColor是:CV_BGR2Lab,测了一下,发现BGR2HSV之类的问题都不大。。为什么受伤的总是我呢。。

下面贴一下OpenCV2.0里面BGR2Lab过程中转成XYZ时候的参数(cvcolor.cpp):

#define labXr_32f 0.433953f /* = xyzXr_32f / 0.950456 */
#define labXg_32f 0.376219f /* = xyzXg_32f / 0.950456 */
#define labXb_32f 0.189828f /* = xyzXb_32f / 0.950456 */

#define labYr_32f 0.212671f /* = xyzYr_32f */
#define labYg_32f 0.715160f /* = xyzYg_32f */
#define labYb_32f 0.072169f /* = xyzYb_32f */

#define labZr_32f 0.017758f /* = xyzZr_32f / 1.088754 */
#define labZg_32f 0.109477f /* = xyzZg_32f / 1.088754 */
#define labZb_32f 0.872766f /* = xyzZb_32f / 1.088754 */

下面是OpenCV2.4.1里面的代码(在color.cpp):

static const float sRGB2XYZ_D65[] =
{
0.412453f, 0.357580f, 0.180423f,
0.212671f, 0.715160f, 0.072169f,
0.019334f, 0.119193f, 0.950227f
};

这两组有一定差异的浮点数,直接导致了cvCvtColor出来的颜色不一致,导致后面的结果不一样。。查了一下google,发现也有人抱怨说OpenCV的cvCvtColor做出来和matlab不一致,大抵就是这里参数的问题。而为什么参数会有不一样呢?因为Lab颜色空间本身是1976年CIE(国际照明委员会)提出的,“Lab模式既不依赖光线,也不依赖于颜料,它是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式。Lab模式弥补了RGB和CMYK两种色彩模式的不足。”,色彩范围更广,但是无法直接通过BGR转换过来(需要经过XYZ)。至于为什么参数不一致么,难道是写OpenCV的人用的显示器颜色有偏差?而且查了一下http://en.wikipedia.org/wiki/CIE_1931_color_space里面的XYZ介绍,好像参数还是不对啊。。难道写OpenCV的人觉得这样做出来的颜色更好看??

 

anyway,软件更新换代的时候也会有各种问题啊。。所以守旧也是挺好的啊。。我那可怜的自行车啊。。

2012校园招聘–求字符串的最长重复子串问题

问题概述:

输入一个字符串,如何求最长重复出现(至少出现2次)的子字符串呢?比如输入ttabcftrgabcd,输出结果为abc,canffcancd,输出结果为can?

http://hi.baidu.com/zhang_daxia/blog/item/c9ea38f24e3bf39eb801a040.html中间给了一个后缀树的方法,但是其算法复杂度是O(n^2*log(n))(因为中间的qsort中间的strcmp的复杂度也是O(n)),实际上这样的题目最多O(n^2)就可以了,如果借鉴KMP的方法则可以达到O(mn),其中m是最长重复的子字符串。下面是我的算法,其实很简单,类似拉链那样逐位比较就行了,注意字符串不能重叠(比如ababa,则最大重复则为ab而不是aba)。因为对KMP不熟悉,所以就没有放上O(mn)的算法。。

C++语言高亮代码由发芽网提供

#include <iostream>

#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define LEN 1000
void work(char *s)
{
    int i,j;
    int len=strlen(s);
    int al,ar,bl,br;//left right of the simistring
    int maxlen = 0;
    char maxstr[LEN];
    for(i=0;i<len;i++)
    {
        al = 0; ar = 0; bl = i; br = i;
        for(j=i;j<=len;j++)
        {
            if(ar-al>maxlen)
            {
                maxlen = ar-al;
                memset(maxstr,0,LEN);
                strncpy(maxstr,&s[al],ar-al);
            }
            if(j==len) break;
            if(s[j-i]==s[j])
            {
                ar++;
                br++;
                if(bl>=ar)    continue;
            }
            bl=br=j+1;
            al=ar=j+1-i;            
        }
    }
    cout << maxlen << " " <<  maxstr << endl;
}
int main()
{
    char s[LEN];
    while(cin>>s)
    {
        work(s);
    }
    return 0;
}

“新电脑”

家里的台式机06年1月买入之后,虽然中间修过两三次,无奈cpu实在太慢了,所以这次回家就准备了一些配件,准备自己弄一台“新机器”出来。

06年的老电脑配置:
CPU:奔腾4-2.93GHz(单核单线程)带风扇
Mem:威刚DDR2-533 512MB*2(后来改为金士顿2G的单根内存)
显卡:铭瑄6600GT 128MB/128bit/DDR3
主板:技嘉915P(后来因为被雷劈坏了,换了梅捷的G31主板)
硬盘:迈拓160G sata 7200rpm
光驱:先锋DVD-123A(后来加了先锋DVR-111CH)
机箱电源:世纪之星
显示器:三星913v
键鼠:微软键鼠套装(后来鼠标进水了,更换为罗技鼠标)

————————————————————————————
今年为了尽量降低成本,而且老爸对于电脑的需求很低(看网页、打斗地主、聊QQ),所以决定选择最便宜的配置。
CPU:intel celeron G530 (SNB平台目前最低端CPU) 260元
主板:华擎H61M-VS R2.0 275元
内存:威刚DDR3-1333 4G 109元(12月初买的,当时内存正好最低价,现在已经回到130元了……)
回家就带了这三样,然后拆机装机。第一次动手换主板,居然一次okay了,DIY能力还不错哈~特别是CPU风扇,新的主板上还留了LGA775的风扇空位,挺人性化的~

不过,毕竟是老电脑,所以还是有东西不能用的。比如光驱,原来是atapi-ide接口,现在的主板早就没有ide接口了,所以只能买sata接口的光驱。买来还发现没有sata的电源线,只能跑去徐家汇买ide转sata的电源线。。莘庄怎么这么落后啊,连个电脑城都没有……

光驱:先锋DVR-219CHV 149元(京东)

最终,一台运行流畅的电脑诞生啦~

————————————————————————————
后期即将进行的改造:

无线网卡:鉴于家里没有无线路由器,就决定用无线网卡造一个ap出来,以便我爸打牌时我也能上网。
外置光驱:拆下来的先锋111CH还没坏,而且之前刻的有些光盘只能在这上面读出来(自己刻的自己当然要负责咯。。),所以准备开学后自己做一个外置光驱。
笔记本加装ssd系统盘?:考虑把笔记本的光驱拆了,换个ssd当系统盘以提升速度。

总结:学计算机的怎么着都该会整整电脑啊,否则都不好意思说自己的cser啊。。

神奇的jpg


这是一张神奇的jpg图片。为什么呢?不就是一张可爱的小猫咪么?
非也~下载下来,把后缀改为rar,解压,再看看~

其实原理很简单,利用的是windows的文件读取机制和简单的dos指令。
因为windows读取文件的时候是根据后缀名,然后通过文件里找该后缀名对应的文件标识,从而识别文件的。
这样就会有漏洞了:比如一个rar文件,在rar标识串出现之前,可以任意添加内容,哪怕是一个jpg文件。
而这个对于linux就没有问题了。linux不会根据后缀来识别文件,所以对于这样的附加rar会读取失败。

具体做法:

假设jpg文件为1.jpg
需要附加的rar文件为2.rar
合并成3.jpg
cmd下指令为:copy /b 1.jpg+2.rar 3.jpg

windows下mpi多机通信

mpi在linux下可以通过ssh相互连接。而在windows下则只能通过用户名密码登陆来达到连接的目的。
以下是配置步骤:
1.安装MPICH2,如果要输入密钥则自己写一个(例如:behappy)
2.编写MPI程序,生成exe。注意生成的程序要复制到需要mpi的其它机器的相同路径下。
3.设置mpi的用户名密码,注意,不需要写domainuser,只需要写user就行了。要求多台机器都有这个用户名和相同的密码。在每一台机器上可以运行以下命令注册:
mpiexec -register
user
password
password
4.运行mpiexec -hosts 2 xxx.xxx.xxx.xxx xxx.xxx.xxx.xxy aaa.exe
5.如果发现说cannnot connect to xxx.xxx.xxx.xxx,那么可能是以下原因:
1)用户名密码不匹配,登陆不了
2)对应的密钥不同(也有可能安装的时候并没有设置口令,例如server 08上MPICH2并不会跳出口令设置这一步),这时候运行regedit,找到HKEY_LOCAL_MACHINESOFTWAREMPICHSMPD,看看里面有没有一项是phrase,如果没有的话就加一项phrase,字符串类型,内容是之前(1.)写的密钥(例如behappy)。然后重启smpd服务(smpd -restart)

windows下MPI程序访问网络磁盘映射

MPI并行计算框架因为是基于C的,所以对于已有的C++代码只需要小改动就能实现并行化。
但是,使用MPI的时候,如果要访问通过网络磁盘映射的方式得到的路径,要怎么访问呢?

错误的方式:
在windows下利用磁盘映射,将\server_ipfolder映射到Z:
MPI程序中读取Z:xxx
这种方式对于普通的程序有效,但是MPI无法得知系统的映射对象(MPI只会读取本地磁盘盘符)参见:http://lists.mcs.anl.gov/pipermail/mpich-discuss/2007-September/002759.html
于是如果在MPI程序中写了读Z:xxx文件,会读取失败。

正确的方式:
FILE *fi=fopen("\\server_ip\folder\xxx","r");

直接通过这种网络位置的方式来读取。

这个小bug居然搞了我两个小时。。路漫漫其修远兮啊~