Jan
15
众所皆知,Dropbox在国内被墙奸了,本来非常非常好用的Shareable link没法使用。由于我有个Godaddy的空间,不限流量,且访问Dropbox的服务器速度非常快,因此写了这个脚本,用于从Dropbox的服务器下载Shareable Link的文件,然后再提供给访问者。
右击文件,在Dropbox菜单中选择Get Shareable Link会打开一个下载页面,地址类似于 https://www.dropbox.com/s/89i1mlkd9uy2sc5/test.txt ,这个下载页面中有对应的短链接,类似于 http://db.tt/ZhRdVPZ ,页面中部有一个下载链接,下载地址类似于 https://dl.dropbox.com/s/89i1mlkd9uy2sc5/test.txt?dl=1 。
假设index.php位于 http://yoursite/db/index.php,那么可以使用 http://yoursite/db/?surl=ZhRdVPZ 来下载这个文件。为了方便连接的拼凑,可以将下面给出的一段代码保存为书签,在下载页面点击(执行),就可以获取拼好的链接。
代码会先检查这个文件是否是由你的用户share的(可以在config.php里面修改是否检查、昵称),详情查看config.php(使用editplus或者其他支持UTF-8编码的编辑器)。
书签代码:
代码下载:dbshare0.1.tar.gz
右击文件,在Dropbox菜单中选择Get Shareable Link会打开一个下载页面,地址类似于 https://www.dropbox.com/s/89i1mlkd9uy2sc5/test.txt ,这个下载页面中有对应的短链接,类似于 http://db.tt/ZhRdVPZ ,页面中部有一个下载链接,下载地址类似于 https://dl.dropbox.com/s/89i1mlkd9uy2sc5/test.txt?dl=1 。
假设index.php位于 http://yoursite/db/index.php,那么可以使用 http://yoursite/db/?surl=ZhRdVPZ 来下载这个文件。为了方便连接的拼凑,可以将下面给出的一段代码保存为书签,在下载页面点击(执行),就可以获取拼好的链接。
代码会先检查这个文件是否是由你的用户share的(可以在config.php里面修改是否检查、昵称),详情查看config.php(使用editplus或者其他支持UTF-8编码的编辑器)。
书签代码:
javascript:var url='http://felix021.com/db/?surl='+encodeURIComponent(token.link.replace(/.*\//g, '')); void(prompt('拷贝', url));
p.s. felix021.com替换为你自己的域名。代码下载:dbshare0.1.tar.gz
Jan
13
google搜到的一篇Disable Outlook's Junk E-mail Filter @
http://www.outlook-tips.net/howto/disable_junkfilter.htm
需要打开注册表编辑器,C:\Windows\regedit.exe
如果是Outlook 2007,修改 (如果没有就创建):
HKEY_CURRENT_USER\Software\Policies\Microsoft\office\12.0\outlook
DWord: DisableAntiSpam
Value: 1
如果是Outlook 2010,那么路径中的12变成14,其他不变:
HKEY_CURRENT_USER\Software\Policies\Microsoft\office\14.0\outlook
删掉这个键可以恢复垃圾邮件过滤。
--
p.s. 在outlook 2010中,“最小化到托盘”的设置不知道在哪里,我也是通过直接修改注册表实现的:
在上述路径下创建Dword键MinToTray值为1即可。
正如sandy所言,“折腾了很久,我决定放弃了,还是去下载office03算了,一个软件能做到如此难以掌握也亏M$费心了。”
http://www.outlook-tips.net/howto/disable_junkfilter.htm
需要打开注册表编辑器,C:\Windows\regedit.exe
如果是Outlook 2007,修改 (如果没有就创建):
HKEY_CURRENT_USER\Software\Policies\Microsoft\office\12.0\outlook
DWord: DisableAntiSpam
Value: 1
如果是Outlook 2010,那么路径中的12变成14,其他不变:
HKEY_CURRENT_USER\Software\Policies\Microsoft\office\14.0\outlook
删掉这个键可以恢复垃圾邮件过滤。
--
p.s. 在outlook 2010中,“最小化到托盘”的设置不知道在哪里,我也是通过直接修改注册表实现的:
在上述路径下创建Dword键MinToTray值为1即可。
正如sandy所言,“折腾了很久,我决定放弃了,还是去下载office03算了,一个软件能做到如此难以掌握也亏M$费心了。”
Jan
12
今天跟Sandy讨论的时候发现的这两个trick。其中第一个trick以前曾经知道,不过太久没用,忘了;第二个trick一直就没发现。
1. make_heap、push_heap、pop_heap默认与其他STL算法一样使用 operator < 进行比较,但是建立的是大根堆,也就是说,pop_heap取出的是heap中的最大值。
2. 在调用sort_heap(begin, end, comparor) 之前,需要保证 [begin, end) 之间是使用同一个 comparor 建立的heap。默认的排序也是使用 operator < ,效果与调用sort是一致的(即默认从小到大排序):【不要以为】make_heap默认是大根堆,sort_heap就会从大到小排序。可参见源码:
-----
以下是sandy整理的
1. make_heap、push_heap、pop_heap默认与其他STL算法一样使用 operator < 进行比较,但是建立的是大根堆,也就是说,pop_heap取出的是heap中的最大值。
2. 在调用sort_heap(begin, end, comparor) 之前,需要保证 [begin, end) 之间是使用同一个 comparor 建立的heap。默认的排序也是使用 operator < ,效果与调用sort是一致的(即默认从小到大排序):【不要以为】make_heap默认是大根堆,sort_heap就会从大到小排序。可参见源码:
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare __comp)
{
// concept requirements
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
_RandomAccessIterator>)
__glibcxx_requires_valid_range(__first, __last);
__glibcxx_requires_heap_pred(__first, __last, __comp);
while (__last - __first > 1)
std::pop_heap(__first, __last--, __comp);
}
_Compare __comp)
{
// concept requirements
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
_RandomAccessIterator>)
__glibcxx_requires_valid_range(__first, __last);
__glibcxx_requires_heap_pred(__first, __last, __comp);
while (__last - __first > 1)
std::pop_heap(__first, __last--, __comp);
}
-----
以下是sandy整理的
引用
1、heap算法虽然默认都使用的是operator <,但是建立的却是大根堆
2、sort_heap,是对已经成为heap的序列进行sort。本质上就是不断循环pop_heap而已。
3、sort_heap默认使用的也是operator <,排序出来的结果是从小到大的序列。
4、sort_heap算法使用的判别式,必须和之前建立heap的时候使用的判别式一致,比如都是operator <,或者都是operator > 。否则不能保证排序出来的结果是正确的。
5、简而言之,对大根堆进行sort_heap,必须使用operator <,对于小根堆进行sort_heap,必须使用operator >。
6、如果想让大根堆变成一个从大到小的序列,或者想让小根堆变成一个从小到大的序列,不能简单的改变判别式(原因如上所述),而应该保持原有判别式排序,然后调用std::reverse。
7、如果仅仅是想要用堆排序,这样自己封装一个heap_sort函数会更安全:
void heap_sort(RAIterator begin, RAIterator end , Comp op) {
make_heap(begin, end, op);
sort_heap(begin, end, op);
}
这样就可以保证建堆的时候和排序的时候用的都是同样的判别式。
8、n次push_heap的算法貌似是O(nlogn)的。。
2、sort_heap,是对已经成为heap的序列进行sort。本质上就是不断循环pop_heap而已。
3、sort_heap默认使用的也是operator <,排序出来的结果是从小到大的序列。
4、sort_heap算法使用的判别式,必须和之前建立heap的时候使用的判别式一致,比如都是operator <,或者都是operator > 。否则不能保证排序出来的结果是正确的。
5、简而言之,对大根堆进行sort_heap,必须使用operator <,对于小根堆进行sort_heap,必须使用operator >。
6、如果想让大根堆变成一个从大到小的序列,或者想让小根堆变成一个从小到大的序列,不能简单的改变判别式(原因如上所述),而应该保持原有判别式排序,然后调用std::reverse。
7、如果仅仅是想要用堆排序,这样自己封装一个heap_sort函数会更安全:
void heap_sort(RAIterator begin, RAIterator end , Comp op) {
make_heap(begin, end, op);
sort_heap(begin, end, op);
}
这样就可以保证建堆的时候和排序的时候用的都是同样的判别式。
8、n次push_heap的算法貌似是O(nlogn)的。。
Dec
17
选中:在文本段落上面,双击选中一个单词(或者一个汉字词组),然后再点击一次,就是选中一个段落。如果连续(较快速)两次点击且第二次不放开进行拖动,就是按单词进行选中;连续三次点击且第三次不放开进行拖动,则是按段落选中。选中某个文本区域(单击双击三击都可,单击的话就是选择开始点),然后在结束点按住shift+单击,就是把整块都选中,而且可以连续执行shift+单击,不用一直拖动鼠标在网页上面刷了。
Win7/Vista下面Win键+上下左右可以将当前窗口 最大化、左侧放置、右侧放置、最小化;WIN+SHIFT+左右是让窗口在多个屏幕之间移动;WIN+SPACE是可以临时看一下桌面,放开就恢复。拖动某个窗口摇一摇,其他窗口全部最小化,再摇一摇就回来。在文件夹空白处按住SHIFT右键单击,可以看到“在此处打开命令行窗口”。CTRL+Shift+N是新建文件夹。
大多数浏览器支持中键点击链接后台打开;中键点击TAB关闭;CTRL+W是关闭当前TAB(包括浏览器和资源管理器)。
ALT+SPACE打开窗口快捷菜单,ALT+D是切换到地址栏,ALT+PrintScreen是对当前窗口截图,CTRL+ESC打开开始菜单,CTRL+SHIFT+ESC打开任务管理器。
不知道有多少同学真正注意到开启Aero特效的VISTA/Win7下面按住WIN+TAB是有3D桌面效果的。
最后,可以安装个KeyTweak修改自己键盘的按键,比如把Insert修改成静音。
Win7/Vista下面Win键+上下左右可以将当前窗口 最大化、左侧放置、右侧放置、最小化;WIN+SHIFT+左右是让窗口在多个屏幕之间移动;WIN+SPACE是可以临时看一下桌面,放开就恢复。拖动某个窗口摇一摇,其他窗口全部最小化,再摇一摇就回来。在文件夹空白处按住SHIFT右键单击,可以看到“在此处打开命令行窗口”。CTRL+Shift+N是新建文件夹。
大多数浏览器支持中键点击链接后台打开;中键点击TAB关闭;CTRL+W是关闭当前TAB(包括浏览器和资源管理器)。
ALT+SPACE打开窗口快捷菜单,ALT+D是切换到地址栏,ALT+PrintScreen是对当前窗口截图,CTRL+ESC打开开始菜单,CTRL+SHIFT+ESC打开任务管理器。
不知道有多少同学真正注意到开启Aero特效的VISTA/Win7下面按住WIN+TAB是有3D桌面效果的。
最后,可以安装个KeyTweak修改自己键盘的按键,比如把Insert修改成静音。
Dec
16
想起第一届Eming杯是我办的,真感慨。这次eming杯的时候我在8-活-601,WHU-WLAN非常烂,开始一个小时候才在窗台上连上。
蛋疼随便写点。
1001. 简单题,不过不知道到底有多简单,反正我是按高精度来做的,而且还考虑了正负号。
1002. 知道矩形的两个端点求面积,非常简单 fabs(x1-x2)*fabs(y1-y2);
1003. 计算元音字母的次数,考虑到大小写就行了,直接用getchar实现非常方便。
1004. 计算几何,虽然跟1002一样是有图的,但是此"图"非彼"图",嗯。半平面交,注意考虑特殊情况(主要是三点共线)。我有另外2种算法,一个是,求出三角形两个中垂线的焦点(就是外接圆圆心)以及与四边的焦点,然后求那个多边形的面积,由于没有计算几何标称,作罢;另外一个算法是伪蒙特卡洛,计算计算平均分布的200w个点与三个点的距离,然后除以200w,可以满足三位数的精度。
1005. 这题O(N)枚举就行。O(N^2)也可以过,不过要优化常数,否则会TLE。
1006. 1005加强版,基于一个代数不等式,不断迭代收敛。岩哥给我讲过,但是记不太清了。
1007. DP(即动态规划),不太会,掠过。
蛋疼随便写点。
1001. 简单题,不过不知道到底有多简单,反正我是按高精度来做的,而且还考虑了正负号。
1002. 知道矩形的两个端点求面积,非常简单 fabs(x1-x2)*fabs(y1-y2);
1003. 计算元音字母的次数,考虑到大小写就行了,直接用getchar实现非常方便。
1004. 计算几何,虽然跟1002一样是有图的,但是此"图"非彼"图",嗯。半平面交,注意考虑特殊情况(主要是三点共线)。我有另外2种算法,一个是,求出三角形两个中垂线的焦点(就是外接圆圆心)以及与四边的焦点,然后求那个多边形的面积,由于没有计算几何标称,作罢;另外一个算法是伪蒙特卡洛,计算计算平均分布的200w个点与三个点的距离,然后除以200w,可以满足三位数的精度。
1005. 这题O(N)枚举就行。O(N^2)也可以过,不过要优化常数,否则会TLE。
1006. 1005加强版,基于一个代数不等式,不断迭代收敛。岩哥给我讲过,但是记不太清了。
1007. DP(即动态规划),不太会,掠过。
Dec
16
1. 选题
那个鸟系统实在做的很烂,勉强用用吧。
(1) 如果没有保研,或者没有跟着的老师,或者跟着的老师没有在做的项目,那么看到哪个题目有兴趣了就选上,然后跟给题的老师联系,一般来说都没问题;
(2) 如果上述条件不成立,选自己老师出的题;
(3) 如果自己老师没在上面出题,可以让他找王恒还是谁加个题目,把你填上去就行了。
(4) 最后一种情况,如果你跟某老师比较熟的话,想做什么让他去王恒那里加个也OK。
2. 毕设最重要的是什么?
不是内容,是格式。cs.whu.edu.cn/thesis首页“相关下载”里面有范文和格式,在写的时候一定要特别注意;尤其是每年可能会有些细节变动,一定要及时了解。最后交论文的时候需要交纸质版(而且是要比较贵的那种封面,一张两三块钱,封死,切割整齐),如果格式不合适的话,要重新打一遍,很贵也很麻烦。争取一次过。
3. 毕设内容怎么办?
随便忽悠,最后答辩的时候很松。
4. 答辩的情况
(1) 希望申请优秀毕业论文需要提前申报,而且会提前答辩
(2) 新大楼三四五层的某些间会作为答辩的地点。参加答辩的同学随机分组,每十来个同学分到某一个房间,每个房间两三个老师
(3) 需要准备PPT,貌似是8~10分钟吧,然后老师会问你几个可有可无的问题,大概应付一下就过了。
5. 附上我去年的相关文档
p.s. 我的论文格式是一次通过的。
6. 祝各位顺利毕业
那个鸟系统实在做的很烂,勉强用用吧。
(1) 如果没有保研,或者没有跟着的老师,或者跟着的老师没有在做的项目,那么看到哪个题目有兴趣了就选上,然后跟给题的老师联系,一般来说都没问题;
(2) 如果上述条件不成立,选自己老师出的题;
(3) 如果自己老师没在上面出题,可以让他找王恒还是谁加个题目,把你填上去就行了。
(4) 最后一种情况,如果你跟某老师比较熟的话,想做什么让他去王恒那里加个也OK。
2. 毕设最重要的是什么?
不是内容,是格式。cs.whu.edu.cn/thesis首页“相关下载”里面有范文和格式,在写的时候一定要特别注意;尤其是每年可能会有些细节变动,一定要及时了解。最后交论文的时候需要交纸质版(而且是要比较贵的那种封面,一张两三块钱,封死,切割整齐),如果格式不合适的话,要重新打一遍,很贵也很麻烦。争取一次过。
3. 毕设内容怎么办?
随便忽悠,最后答辩的时候很松。
4. 答辩的情况
(1) 希望申请优秀毕业论文需要提前申报,而且会提前答辩
(2) 新大楼三四五层的某些间会作为答辩的地点。参加答辩的同学随机分组,每十来个同学分到某一个房间,每个房间两三个老师
(3) 需要准备PPT,貌似是8~10分钟吧,然后老师会问你几个可有可无的问题,大概应付一下就过了。
5. 附上我去年的相关文档
p.s. 我的论文格式是一次通过的。
下载文件 (已下载 2733 次)
6. 祝各位顺利毕业
Dec
12
不用费心机去搞 lxrandr 或者 xrandr 或者 Xorg.conf 什么的了,只要启动server的时候这样:
$ vncserver -geometry 640x480
$ vncserver -geometry 640x480
Dec
10
其实是个比较简单的数据结构了,引用百度百科给出的说明,其对应的问题是:不断地向buffer里读入元素,也不时地去掉最老的元素( buffer 的大小取决于移除最老元素的策略,可以是不定长的;下文假定是固定为K的),不定期的询问当前buffer里的最小的元素。
使用普通队列来实现,每个元素O(1)的操作,每次查询O(K);用堆实现的话,每次查询是O(1),但是每个元素是O(logK)。还有其他的实现方式,比如线段树,或者RMQ,这些都是logN量级的。
而单调队列的优势则是,每个元素是O(1)的操作,又能保证最小元素像堆一样在最前面,也就是每次查询O(1)。具体的实现也非常简单,不过它并不是通常意义上理解的队列。
以此为例:对于N=8,K=3,8个元素序列1 3 -1 -3 5 3 6 7,窗口大小为3,也就是要求出(1, 3, -1), (3, -1, -3), (-1, -3, 5), (-3, 5, 3), (5, 3, 6), (3, 6, 7)这6个序列中的最小值,结果简单,就是-1, -3, -3, -3, 3, 3.
使用单调队列,首先要有一个数据结构
1: [0, 1] //队列空,[seq=0, val=1]入队
3: [0, 1], [1, 3] //3大于队尾元素,放在队尾
-1: [2, -1] //从队尾往前扫,-1小于每一个所有元素,于是把它们都T掉
-3: [3, -3] //-3把-1T掉
5: [3, -3], [4, 5] //入队尾
3: [3, -3], [5, 3] //把队尾的5T掉
6: [5, 3], [6, 6] //队首元素seq=3太老了,T掉;6比3小,放在队尾
7: [5, 3], [6, 6], [7, 7] //入队尾
从以上的处理方法可以看出:最老的元素要么早就被T掉了,要么就是最小的元素(排在队首)。所以每次加入一个新元素的时候:
1. 把需要出队的队首元素T掉;
2. 把队尾大于或等于它的元素全部T掉,自己入队。
POJ2823 http://poj.org/problem?id=2823 是一道适合用单调队列来求解的题目,效率会特别高;不过一定要注意,由于WS的POJ会卡IO时间,所以需要自己实现一份read_int()和print_int()来替换掉scanf和printf。
最后,附上一份简单的单调队列代码:
使用普通队列来实现,每个元素O(1)的操作,每次查询O(K);用堆实现的话,每次查询是O(1),但是每个元素是O(logK)。还有其他的实现方式,比如线段树,或者RMQ,这些都是logN量级的。
而单调队列的优势则是,每个元素是O(1)的操作,又能保证最小元素像堆一样在最前面,也就是每次查询O(1)。具体的实现也非常简单,不过它并不是通常意义上理解的队列。
以此为例:对于N=8,K=3,8个元素序列1 3 -1 -3 5 3 6 7,窗口大小为3,也就是要求出(1, 3, -1), (3, -1, -3), (-1, -3, 5), (-3, 5, 3), (5, 3, 6), (3, 6, 7)这6个序列中的最小值,结果简单,就是-1, -3, -3, -3, 3, 3.
使用单调队列,首先要有一个数据结构
struct node { int seq, val; }
用于记录队列中的元素及其在输入序列中的顺序。队列的状态是这样维护的:1: [0, 1] //队列空,[seq=0, val=1]入队
3: [0, 1], [1, 3] //3大于队尾元素,放在队尾
-1: [2, -1] //从队尾往前扫,-1小于每一个所有元素,于是把它们都T掉
-3: [3, -3] //-3把-1T掉
5: [3, -3], [4, 5] //入队尾
3: [3, -3], [5, 3] //把队尾的5T掉
6: [5, 3], [6, 6] //队首元素seq=3太老了,T掉;6比3小,放在队尾
7: [5, 3], [6, 6], [7, 7] //入队尾
从以上的处理方法可以看出:最老的元素要么早就被T掉了,要么就是最小的元素(排在队首)。所以每次加入一个新元素的时候:
1. 把需要出队的队首元素T掉;
2. 把队尾大于或等于它的元素全部T掉,自己入队。
POJ2823 http://poj.org/problem?id=2823 是一道适合用单调队列来求解的题目,效率会特别高;不过一定要注意,由于WS的POJ会卡IO时间,所以需要自己实现一份read_int()和print_int()来替换掉scanf和printf。
最后,附上一份简单的单调队列代码:
#include<stdio.h>
int main() {
struct node {
int seq, val;
} q[100]; //q: queue
int N, k, i, f, b, t, ans[100];
scanf("%d%d", &N, &k); //不是内裤
f = b = 0; //f: front, b: back
for (i = 0; i < N; i++) {
scanf("%d", &t);
if (f < b && q[f].seq <= i - k)
f++; //把需要出队的队首元素T掉
while (f < b && q[b-1].val >= t)
b--; //把队尾不大于t的元素T掉(注意等号!)
q[b].seq = i, q[b].val = t, b++; //入队尾
ans[i] = q[f].val; //保存当前的最小值
}
for (i = k - 1; i < N; i++)
printf("%d ", ans[i]);
return 0;
}
int main() {
struct node {
int seq, val;
} q[100]; //q: queue
int N, k, i, f, b, t, ans[100];
scanf("%d%d", &N, &k); //不是内裤
f = b = 0; //f: front, b: back
for (i = 0; i < N; i++) {
scanf("%d", &t);
if (f < b && q[f].seq <= i - k)
f++; //把需要出队的队首元素T掉
while (f < b && q[b-1].val >= t)
b--; //把队尾不大于t的元素T掉(注意等号!)
q[b].seq = i, q[b].val = t, b++; //入队尾
ans[i] = q[f].val; //保存当前的最小值
}
for (i = k - 1; i < N; i++)
printf("%d ", ans[i]);
return 0;
}