linux下多台机器mpi的部署

首先修改hosts,例如:
192.168.1.21 computer1
192.168.1.22 computer2
之类的,在/etc/hosts文件内

然后安装mpi:
sudo apt-get install libc6 mpich2
在/home/user目录下新建一个叫.mpd.conf的文件,里面写上MPD_SECRETWORD=xxx

然后是安装ssh
参考:
http://blog.sciencenet.cn/home.php?mod=space&uid=43242&do=blog&id=275185
最终目的是computer1能够ssh直接连接其它的机器而不用输入密码。

对每一台需要用到的机器都要执行上面三步

在computer1的/home/user下建立.mpd.host文件,里面写上:
computer1
computer2
之类的,相当于将任务分配给各个机器的顺序

最后是启动mpi集群:
mpdboot -n 2 -f /home/user.mpd.host
这时查看mpdtrace,会看到2个机器名。
然后编译运行你的程序:
编译的命令是:mpicc xxx.c -o xxx.o 可能需要-lstdc++
执行的命令是:mpiexec -machinefile /home/user.mpd.host -n 2 xxx.o

注意:上面启动mpdboot的时候一定要在computer1上面启动computer2的mpd,否则相当于computer2自己当主机了,也就是computer1没法连接到computer2,最终会产生:
unable to start all procs; may have invalid machine names
> remaining specified hosts:
这样的错误。而网上铺天盖地都是说这时候应该在computer2上mpd到computer1,试了一下发现木有效果。。。

Linux下添加Windows磁盘映射

两台Windows机器下要共享文件,可以很方便的通过映射网络驱动器实现。那么,Linux下怎么像读硬盘一样读取另一台windows机器的网络映射呢?
其实,只需要几条命令就可以了~

首先,需要Windows进行网络映射。将windows的一个文件夹共享即可(共享-高级共享,输入一个共享名即可)

然后,在Linux下安装一些小的功能:
sudo apt-get install mount
sudo apt-get install smbfs
sudo apt-get install samba

接着,输入命令就行了:
sudo mount -t cifs -l //192.168.1.100/test /home/user/folder1
需要输入Linux的密码
其中,//192.168.1.100/test代表网络映射位置(就是你windows机器的ip地址和共享文件夹名), /home/user/folder1代表Linux下的文件夹位置(需要实现创建一个空的文件夹)。

如果每次开机就希望该分区已经加载了,那么可以执行如下的步骤:
sudo gedit /etc/fstab
在文件末尾添加一行:
//192.168.1.100/test /home/user/folder1 cifs defaults,auto,username=user,password=xxx
其中username和password就是Linux的用户名密码
然后重启或者输入sudo mount -a即可~

解决linux下WaitForMultipleObjects的一种方法

借助了linux下的Semaphore(信号量),实现了一种简单的WaitForMultipleObjects。
关于Semaphore参考如下的文章:
http://blog.163.com/wulin_shenghua/blog/static/27580770200952644311771/

具体思想:多个线程共享一个信号量,子线程结束后让信号量+1,主线程做n次信号量-1的操作(为0的时候会自动等待),等到做完n次-1,说明n个子线程都完成了+1,说明全部子线程都执行完了,就可以继续了。
这只是WaitForMultipleObjects的一种简单替代,因为没有返回值,所以不能判断某个线程出问题与否。

#include #include
#include
#include
using namespace std;

typedef struct pinfo
{
sem_t * bin_sem;
int id;
}pinfo;

void *thread_function(void *arg)
{
pinfo *t=(pinfo*)arg;
printf("thread_functiont%dt--------------sem_waitn",t->id);
int ii=t->id + 1;
sleep(ii); //暂停一会,这里模拟程序执行
sem_post(t->bin_sem); //信号量+1
printf("sem_donet%dn",t->id);
return NULL;
}

int main()
{
int res;
int n=10; //设置个线程
sem_t bin_sem; //设置信号量,下面初始化这个信号量

res = sem_init(&bin_sem, 0, 0);

if (res != 0)
{
perror("Semaphore initialization failed");
}
printf("sem_initn");
int i;
pinfo *p=new pinfo[n]; //创建个线程的参数结构体
pthread_t *a_thread=new pthread_t[n];
for(i=0;i

ubuntu下安装OpenCV2.0、eclipse编译环境

OpenCV对于windows用户而言非常友好,对于Visual Studio的配置也很方便。然而,在linux下,因为各种lib文件的原因,配置OpenCV并不是那么轻松的一件事。趁着今天刚刚配完ubuntu下的OpenCV2.0和eclipse环境,说说具体过程吧。
(参考文献:
http://www.opencv.org.cn/index.php/Debian%E4%B8%8B%E5%AE%89%E8%A3%85
http://hi.baidu.com/wr_dcy/blog/item/b425151e237989dca6866950.html)
1.下载OpenCV
去OpenCV中文官方网站下载即可。http://www.opencv.org.cn/ 注意linux选择unix版本的OpenCV即可。这里我选择2.0.0,其它版本的区别不是很大。
2.解压OpenCV到一个你方便操作的位置(比如/home/user/OpenCV)user为你的用户名。ubuntu是可以用右键解压的。
3.安装各类软件:(注意,需要安装libjpeg,否则jpeg文件不能load)
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install gawk
sudo apt-get install libjpeg-dev
sudo apt-get install libtiff-dev
sudo apt-get install libavformat-dev
sudo apt-get install libswscale-dev
sudo apt-get install libgtk2.0-dev
4.在OpenCV文件夹下configure
user@master:~OpenCV$ ./configure
然后
make
sudo make install
5.这时候,OpenCV算是完成了。可以自己写一个小的测试程序,也可以去OpenCV文件夹里面的samplesc目录下面去试试samples 。例如:
g++ `pkg-config opencv –libs –cflags opencv` drawing.c -o drawing
然后./drawing
就可以看到一个示例程序运行了。

————————————————————————————
6.安装eclipse。
去eclipse官方网站http://www.eclipse.org/ 下载eclipse for C++ linux版本的。
解压。
这里需要之前安装过jdk环境。http://developer.51cto.com/art/201012/238581.htm 按照这篇文章里面写的就行了。注意/etc/profile里面的东西别写错,否则下次开机会进不去图形界面的。
7.运行eclipse。
8.新建一个项目,里面新建一个.c文件,然后写上下述代码:

#ifdef _CH_
#pragma package
#endif
#define CV_NO_BACKWARD_COMPATIBILITY

#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#endif
#include
#include

int main( int argc, char** argv )
{
IplImage* img=cvLoadImage("baboon.jpg",1);
cvNamedWindow("haha",1);
cvShowImage("haha",img);
cvWaitKey(0);
int params[3];
params[0] = CV_IMWRITE_JPEG_QUALITY;
params[1] = 85;//设置s压缩度
params[2] = 0;

cvSaveImage("t.jpg",img,params);
return 0;
}

这个小程序会读取baboon.jpg(在samplesc文件夹下面有),显示,然后在你按键之后保存这个图到t.jpg。当然,现在肯定编译不过咯。现在要设置各种路径:
eclipse下:
project-properties- c/c++ general-path symbols
include中间添加:
/home/user/OpenCV/include/opencv
注意选中add to all configurations all languages
libraries添加:
cv
cxcore
highgui
library path 添加:
/usr/local/lib
然后确定。这样重新编译这个代码就可以运行了。

后面么,就像在windows下那样使用OpenCV吧~

VS2008的安装、修复时一个error的解决方法

error:VS70pgui: [2] 下列卷没有足够的磁盘空间用于修复/重新安装
原因:VS2008安装时会在系统剩余空间最大的磁盘分区里面放一点东西。比如你当时插着移动硬盘,然而后来拔掉了,再安装VS2008的补丁就会报磁盘空间不足。或者说你重新分配了盘符(比如苦逼的我……)
解决方法:卸载VS2008,然后重装即可。

everything about proxy

最初建立代理服务器的目的是小浩浩在清华只能用ipv6上网,而没法访问ipv4网站。于是某个周末聊到了这个问题,于是就自己试着建了个代理服务器。以前用过ccproxy,但是非注册版只能3个用户连接,比较少,所以就用了apache,折腾了一晚上搞定了。

然后就一发不可收拾了。想着要给在外国读书的孩子上国内网站的机会(esp学校bbs、优酷、土豆等),就开始研究了。可以直连国际网的比较好办,在浏览器里面输入代理地址即可。而也有诸如hw同学这样的bug例子的存在:本身上网需要代理服务器了,那么怎么办呢?

一种方法是二次代理,然而,大部分的二次代理都需要中间服务器的软件支持,而且需要诸如socks5这样的代理支持,这点只有代理服务器是自己设置的时候才比较容易操作。所以,这条路试了两天无果,遂放弃。

另一种方法是在线代理,这也是比较直观的想法。因为以前也有过sisxx.org结尾的代理。于是自己开始上网找这样的代理源代码。一般而言有那么几个比较常用的:
phproxy、glype、KnProxy
然而,虽然这些网页代理都赫赫有名,却都没法解决播放视频、上bbs这样的功能。于是郁闷了老半天。

最后想到qz大神在日志回复中提到的india web proxy。之前也找个,无奈把india拼成了indea了,于是悲剧了。这次发现错了,然后自己试着用了一下,发现很好用,用上之后效果和设置一次代理服务器一样。

另外,也曾经试着VPN,但是VPN需要两块网卡,单网卡下的win7 VPN相对比较复杂,也就没去考虑了。

so,代理服务器基本上是折腾完了。唯一的缺憾是迅雷下载时账号登陆这块不支持代理,即使用ccproxy的socks5代理也不行,所以离线下载只能在登陆网关的账号上进行了。

利用apache架设ipv4/ipv6代理服务器

网上利用Apache架设代理服务器的文章很多,但是大家都是抄来抄去的,所以实际上发现了问题也很难解决。
这里写一下我的流程吧~
1)安装Apache。推荐用Xampp
下载地址:http://www.apachefriends.org/zh_cn/xampp.html
选择自己平台的Xampp即可。然后就是安装一般软件的流程。

2)修改Apache设置。
在C:xamppapacheconf(安装到别的路径下类似)文件夹下的httpd.conf。
找到:
#Listen [::]:80
Listen 80
这两行是Apache端口设置。如果80端口可以用的话(迅雷会默认占用80端口……),可以选择不修改。
如果要作ipv6代理的话,只需要这样写(这里两个端口不能重复,8021、8019都可以自己写一个不冲突的端口即可):
Listen [::]:8019 #注意:前面的#要去掉,否则就被当做注释了……
Listen 8021

然后找到
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
把前面的#都去掉。

然后找一下是否存在:
Include “conf/extra/httpd-proxy.conf”
如果存在的话,那么在httpd-proxy.conf文件中,把
ProxyRequests Off改成On即可。
否则,就在httpd.conf中间加入:
ProxyRequests On

Order deny,allow
Allow from all

如果要设置对某些ip或网站禁止访问的话,自己网上找找相应设置吧~很多的。

3)运行Xampp control Panel,在apache那里点start即可。
然后就可以让别人用上你这个代理服务器了,代理服务器ip地址就是你自己的ip地址,ipv4和ipv6的ip都可以,端口的话要对应。

小吐槽:
也许是XAMPP里面的Apache版本的问题吧,多了一个httpd-proxy.conf,所以之前不管怎么在httpd.conf中修改,都没用,折腾了半天。看来这玩意还得自己试一下才会有深刻的体会啊~

jni生成.h文件时包含包(package)的写法

jni利用class文件生成.h文件时,如果原始java文件有包的话,不能直接使用javah -jni xxx来生成。
这时候,需要让javah知道整个包的目录,然后才能生成.h文件。
具体例子:
ImageRetrieve.java
package cn.edu.pku.idm.mmr.image;
public class ImageRetrieve {
public native static void InitDLLInfo();
}
路径:C:\Users\user\workspace\mmQA\src\cn\edu\pku\idm\mmr\image\ImageRetrieve.java

生成class文件:C:\Users\user\workspace\mmQA\src\cn\edu\pku\idm\mmr\image> javac ImageRetrieve.java
生成.h文件:C:\Users\user\workspace\mmQA\src\cn\edu\pku\idm\mmr\image> javah -jni -classpath
C:\Users\user\workspace\mmQA\src cn.edu.pku.idm.mmr.image.ImageRetrieve

(相当于:javah -jni -classpath 到包上层的路径 包的全名.XXX)

这玩意居然折腾了我一天……找个正确的答案真难啊~

about:recent

人肉系统v0.8:新加入的功能只有一个:配置文件。有两个可以配置的参数:是否使用人脸识别模块;是否输出同一个人的多个结果。其实人肉系统的版本号就是一个随意的数值而已,0.5、0.8都是随意的。不过之后应该不会继续更新了。
程设:程设小朋友们考试成绩两极分化严重,于是非常有可能优秀率和不及格率同时超标。优秀率大概能超过50%,而不及格率有可能超过10%吧,所以还是蛮讨厌的一个事情。最关键的是,几个平时很乖的很认真的小朋友考试成绩较低,于是也没办法把他们往上提了……
实验室:暑假终于不用去昌平封闭了,但是依旧要到8月10日才能回家,那时候估计都没什么人了。不过,京沪高铁已经开通了,所以到上海只需要5小时,说不定哪天心血来潮周五下午就回上海了,然后周一早上回北京,也是很方便的。至于车费么……如果学生票的话75%还是挺便宜了的。
另外,因为不用去昌平了,所以得租房。今天去看了一个学生公寓,4人间的,就是没有阳光(前面就是一幢大楼,相距不超过1m),大小比寝室稍微小一点,但是有独立的卫生间浴室空调之类的,1800元一间,分摊下来也就450,还算比较便宜的。anyway,至少不用为住房问题奔波了。
毕业:这个是最重要了的吧……因为要在这园子里继续呆3年,所以毕业没什么实感,但是想到要分离了,还是有些惆怅的。嘛,忧伤的事就不记下来了,还是应该阳光一点的~

总想写些什么,但是却又想不出该写什么。还有两周的本科生活,好好享受吧~