川儿's profile川儿PhotosBlogListsMore ![]() | Help |
川儿 |
|||||||
|
August 13 哈,学习的榜样!西祠上拉下来的,太强了,我怎么就没有这样的境界呢~~
案例背景:最近一个月,奉父母之命,相续和女孩子交谈过,家里觉得我年龄大了,是到该谈一个朋友的时候了,然而我非常不孝顺,居然把这个过程弄得和人力资源主管考察新人一样。以下是基本的过程。
案例1
女:我还没做好准备,我现在还不想结婚,也不想谈恋爱。 我:你可以走了。 女:什么意思? 我:什么时候做好准备,什么时候再联系我。 案例2
女:我有个同学,她说她今天陪我来的,她今天有事,我们改天好不好? 我:不用改天了。 女:什么意思? 我:是你来相亲,不是她。要是没了她,你就不是你,那我建议你和她结婚好了。 案例3
女:我对你没有感觉。 我:好的,你可以走了。 女:你怎么说话的。 我:我喜欢直接的人,你直接告诉我你的感受,那我也直接告诉你我的感受。 女:你好小气。 我:这叫宾主双方坦诚交换意见。 案例4
女:我告诉你我今天来就是吃饭而已,别的不谈。 我:那你可以走了。 女:你…… 我:吃饭只是手段,目的是为了增加了解,增进感情,要是你来这里只为了吃饭,那你可以去食堂,那里吃饭不是为了增加了解的。 案例5
女:我有很多朋友,有几个男生和我玩的很好,哦,对不起,我接个电话。 我:你可以先走。 女:没关系没关系。 我:把你的朋友都照顾好吧,他们既然比我重要,何必来见我? 案例6
女:我不喜欢打球啊,打球好无聊啊。 我:那你可以走了。 女:你好小气。 我:我没必要照顾你的爱好,如果你不照顾我的爱好的话。 案例7
女:你好厉害哦,我好喜欢你。 我:我哪里厉害?举个例子? 女:这个……这个…… 我:你可以走了。等想明白我哪里厉害,你可以再打电话告诉我。 案例8
女:这个短消息你不可以看。 我:那你走吧。 女:为什么? 我:既然你觉得隐私比较重要的话。 案例9
女:我很忙啊,改天好不好? 我:不用改了。 女:怎么了? 我:把你的时间留给你觉得重要的人吧。 案例10
女:XXX给他的女朋友买了件好看的衣服,我也想要。 我:我给你个建议。 女:说吧。 我:去当XXX的女朋友,叫他给你买一件。 案例11
女:不好意思,这个周末老板叫我坐满班再下。 我:那行,你还可以连晚班一起再加个班。 女:什么意思? 我:既然你这么想要图表现,不如表现更到位一些。 案例12
女:你不适合做我男朋友,不过,我很喜欢你,你可以做我的哥哥吗? 我:那你还是走吧。 女:哦。 我:我今天这一桌酒菜不是为认个妹妹准备的。 案例13
女:我知道我迟到了,但这件事情我已经说过SORRY了,你还想要怎么样? 我:你没必要道歉,真的,如果这就是你道歉的态度的话。 案例14
女:你可以不可以叫你爸爸走开啊,我觉得好紧张啊。 我:不好意思,恐怕他不会走开啊。 女:那怎么办哦? 我:要不这样吧,你走开如何?这样我们都轻松了。 案例15
女:其实我不叫XXX,我叫XX,我是代替她来的,对不起我骗了你。 我:没关系。 女:真的。 我:你可以先回去,等你决定你叫什么名字比较方便,你再来见我。 案例16
女:我以前有过一个男朋友,我告诉你的原因是我不想隐瞒这些事情。 我:我对你的以前没有任何兴趣,那是你一个人的事情,和我没有关系。 女:你…… 我:要是你对以前还放不下来,那你可以先回去,什么时候放下来了,什么时候可以来找我。 案例17
女:你有过几次恋爱? 我:一次也没有。 女:我不相信,你都27了,怎么可能一次都没有? 我:恋爱是用心的,人一辈子用心的时候最多有一次。 女:那你以前都是逢场作戏? 我:看是什么样的女孩子,有的女孩子连逢场作戏的资格都没有。 女:你好可怕啊。 我:谢谢。 案例18 我:周末有空出来打球不? 女:不好意思,我家里有点急事,外婆病得很厉害。这样吧,我下个星期和你联系如何? 我:不用了,什么时候外婆的病好了,什么时候再来找我。 August 08 暂时不打算搬出去了 上班第四周,还是和前几周一样,处于“自娱自乐”的状态,公司业务上的忙我也帮不上,主要是业务不熟悉的缘故吧。还有就是搬出去住的决心和激情没了,本来看按好一处单间650/月,相当的不错,我心一软,说回去商量下,也想再看看有没更合适的房源,实在是错误了估计了河海/南师附近的租房形势,等我第二天打电话已经租出了,然后就再没看到合适的!
6号发了工资,不出所料,我只拿到手半个月的,因为正好是16号报道的,7月份正好干了一半,看来等辞职前攒出一台笔记本的钱是泡汤了,顶多一台式机。真正开心的是2周后终于适应了军区大院的生活,虽然我是在这长大的,但这里的生活和“地方上”确实是不一样的,搬出去也这么多年了。晚上有灯光球场,可惜游泳还要奔到五台山,总的来说还是不错的。
改天继续~~ August 02 eclipse中如何配置进行C++开发环境折腾了一上午,总算有点收获,整合了网上的一些说明和自己的体会,力求清晰准确的描述这一过程:
一、下载:
总共需要下面的文件
1. Eclipse的CDT 插件 http://www.eclipse.org/cdt/ 2. MinGW, 主要提供编译C/C++文件的GCC、GDB 和 Make http://www.mingw.org/download.shtml 二、安装:
1、解压CDT插件,将features目录和plugins目录下的内容分别拷贝到eclipse文件夹下。
2、安装MinGW,一路next
三、配置环境变量:
"PATH" = "D:\MinGW\bin;%PATH%"
"LIBRARY_PATH" = "D:\MinGW\lib" "C_INCLUDE_PATH" = "D:\MinGW\include" "CPLUS_INCLUDE_PATH" = "D:\MinGW\include\c++\3.2.3;D:\MinGW\include\c++\3.2.3\mingw32;D:\MinGW\include\c++\3.2.3\backward;D:\MinGW\include" 四、测试编译环境:
自己写一个简单的CPP文件,如main.cpp,在命令行用
g++ main.cpp -o main
如果编译通过,说明配置没有问题了,目录下会生成main.exe文件。
五、配置eclipse
重新启动Eclipse以后,选择Help ->Software Updates->Manage Configuration...,这时应该可以在左侧看到CDT。如果没有,按下工具栏上的第三个按钮,应该可以看到处于disabled状态的CDT (如图3)。这时只要点击右侧的Enable,根据提示重启Eclipse以后就行了。这个时候eclipse已经形式上支持c++了。
六、构造第一个项目:
1. 新建项目
打开eclipse,new->project->Standard Make C++ Project,项目名Test 2. 配置Make命令
在Project->Properties->C/C++ make project build command 的“make”改为“mingw32-make”,再按“应用” “确定” 或者到MinGW\bin文件夹下,修改mingw32-make.exe文件名为make(推荐)
3. 新建源代码文件和Makefile文件 源代码就用上面测试用的main,在Test项目下选择new->file,填上main.cpp。new->file,再填上makefile(无后缀名);
在makefile中写入:
all:
g++ main.cpp -o main 注意!! “g++”之前是Tab键 用空格是不行的。 4. 配置生成目标 window->show view ->make targets,这个时候右边会出现一个“make targets”的窗口,右键点窗口中的项目“Test”选“add maketargets”按“ok”,窗口中生成一个叫“all”的按纽,以后就点这个编译源文件,编译的就是makefile中定义的 5. 在Project->Properties->C/C++ Make Project->Binary Parser 把ELF Parser改成PE Windows Parser
6. 大功告成 Run->Run as->C Local Application(Run生成的exe文件!)
July 30 上班2周--RMI入门 上班2周,因为公司并非纯粹的IT企业, 按老板的话说是搞“集成开发”的,和我一间办公室的都是硬件工程师,安排给我的任务就是熟悉公司业务范围和用RMI模拟开发一个以后可能会用到的和公司开发软件通讯的服务器端口,一切进度由我自行按安排,也只有我一个人~~,搞了几天,总算搞出点心得,不敢私藏,援引一篇BLOG略做修改~~
一.创建RMI程序的6个步骤:
1、定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。 2、定义一个实现该接口的类。 3、使用RMIC程序生成远程实现所需的残根和框架。 4、创建一个服务器,用于发布2中写好的类。 5. 创建一个客户程序进行RMI调用。
6、启动rmiRegistry并运行自己的远程服务器和客户程序。 二. 程序详细说明
1.定义一个远程接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常。
import java.rmi.Remote;
import java.rmi.RemoteException; public interface I_Hello extends java.rmi.Remote //需要从Remote继承
{ public String SayHello() throws RemoteException; //需要抛出remote异常 } 上面例子我们定义一个返回字符串的远程方法 SayHello(),这个远程接口 I_Hello必须是public的 ,它必须从java.rmi.Remote继承而来,接口中的每一个方法都必须抛出远程异常java.rmi.RemoteException。
抛出这个异常的原因 由于任何远程方法调用实际上要进行许多低级网络操作,因此网络错误可能在调用过程中随时发生。 因此,所有的RMI操作都应放到try-catch块中。 2、定义一个实现该接口的类。
import java.io.PrintStream;
import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class Hello extends UnicastRemoteObject //必须从UnicastRemoteObject 继承
implements I_Hello { public Hello() throws RemoteException //需要一个抛出Remote异常的默认初始化方法
{ } public String SayHello() //这个是实现I_Hello接口的方法
{ return "Hello world !!"; } }
实现接口的类必须继承UnicastRemoteObject类。
扩展java.rmi.server.UnicastRemoteObject UnicastRemoteObject顾名思义,是让客户机与服务器对象实例建立一对一的连接。 3、使用RMIC程序生成远程实现所需的残根Stub 和 框架。
2中的Hello 编译好以后,我们就可以用RMIC命令来生成残根Stub
在Dos窗口里,到Hello.class 所在目录,运行以下命令:
rmic Hello
命令执行完以后,将会在当前目录生成一个 Hello_Stub.class 这个就是我们远程调用时需要的类
参考:
在RMI中,客户机上生成的调动调用参数和反调动返回值的代码称为残根。有的书上称这部分代码为“主干”。
服务器上生成的反调动调用参数和进行实际方法调用调动返回值的代码称为框架。 生成残根和框架的工具 Rmic命令行工具(RMI Compiler) 格式: Rmic classname 4、创建一个服务器,用于发布2中写好的类。
import java.rmi.*; public class RMI_Server { public static void main(String[] args)
{ try { Hello hello = new Hello(); //实例化要发布的类 Naming.rebind("RMI_Hello", hello); //绑定RMI名称 进行发布 System.out.println("=== Hello server Ready === "); } catch(Exception exception) { exception.printStackTrace(); } } } 5. 创建一个客户程序进行RMI调用。
import java.rmi.*;
public class RMI_Client { public static void main(String[] args) {
try
{ I_Hello hello = (I_Hello) Naming.lookup("RMI_Hello"); //通过RMI名称查找远程对象 System.out.println(hello.SayHello()); //调用远程对象的方法 } catch (Exception e)
{ e.printStackTrace(); }
} } Naming.lookup("RMI_Hello") 其中的参数“RMI_Hello”只是针对本机的RMI查找,如果是异地的RMI调用请参照 rmi://127.0.0.1:1099/RMI_Hello 端口1099是默认的RMI端口,如果你启动 rmiregistry 的时候(见第6点)没有指定特殊的端口号,默认就是1099
到此 我们 所有的代码编写都完成了,不过不要急着去运行,请跟随第6点去运行,因为rmi 调用还会遇到一些特别的情况,偶花了牛劲,才找到原因的,许多刚用RMI的人,常常被这些问题搞得吐血
6、启动rmiRegistry并运行自己的远程服务器和客户程序。
1)服务器的运行
先在DOS下运行 rmiregistry 这个命令是开启RMI的注册服务,开启以后我们的server程序才能调用rebing方法发布我们的类
然后,运行我们的server程序 RMI_Server 这里是最容易出错的,参见下面注意事项。
注意:
如果提示找不到Stub类,这个需要用下面的命令来运行
java.exe -Djava.rmi.server.codebase=file:/E:\MIS_Interface\momo\TestEasy\classes/ RMI_Server
蓝字部分指定了stub类的路径。
有人会问,我已经把stub 通过-classpath 加到类路径里面了,为什么还没有提示这个错误呢?原因是这样的: 这里提示的找不到stub类,不是由你写的RMI_Server这个程序引起的,是由rmi注册服务器报告的异常,也就是我们前面启动的 rmiregistry ,因为你写的RMI_Server 要求RMI注册服务器注册一个新的类,自然RMI服务器必须知道你的类放在哪里,所以我们通过 -Djava.rmi.server.codebase 这个运行参数来指定
你也可以通过修改操作系统的classpath 环境变量 来指定stub的位置,只不过太麻烦
补充说明:蓝字部分的路径指定到工程,不到包,而且因为DOS命令行的缘故,尽量不要用长文件名做测试,我就这个问题折腾了好几天
2) 客户端的运行
直接运行RMI_Client 即可 注意 把 Stub 和 接口 I_Hello 加到类路径里
通常第一次运行 客户端都会报一个错误: Access XXXX 不记得具体的了,反正就是“访问权限限制”, 这是因为RMI的服务需要授权,外部程序才能访问,所以我们要改动 jre的安全配置文件,来开放权限, 具体如下:
打开你的jdk目录下的这个文件 C:\Program Files\Java\jdk1.5.0_04\jre\lib\security\java.policy
在文件最后加入下面代码:
grant {
permission java.net.SocketPermission "*:1024-65535", "connect,accept"; permission java.net.SocketPermission "*:80","connect"; }; 此代码,开放了端口的connect访问权限
注意 你应该修改服务器那台机子的安全配置文件,也就是你运行 rmiregistry 和 RMI_Server的机子
另外,很多人修改完以后,仍然报这个错误,多数情况是由于你没有修改到正确的jdk 下的文件,而是修改到其他jdk的文件, 我们安装oracle , Weblogic等等软件的时候都会自带一个 jdk,他们会自动在操作系统的环境变量里面 加入jdk的路径,所以,你先要确定你运行服务器端程序是用哪个jdk,再修改这个jdk下的配置文件,确定当前jdk的路径很简单 开始 -》运行-》rmiregistry 看看这个DOS窗口标题 的路径,就是你当前系统默认jdk的路径了
我用的JDK1.6没有用到这一步
客户端正常运行以后,就会出现以下结果:
Hello world !!
这些字符是通过RMI调用远程服务器的类返回的结果
[小题大做]傻子上飞机 近来CSDN一道傻子坐飞机问题,引起众多朋友的关注,本文的目的是构造性解决此问题,有兴趣的朋友可以耐心的看下。
先把题目抄下:
100个人排队乘坐有100个座位的飞机,正常情况时每个都都会对号入坐,但是,第一个上飞机的是个傻子,他随机坐了一个位子,接下来的人上飞机时,如果自己座位被人坐了就会随机找个座位坐下,否则就坐自己的坐位。求最后一个上飞机的人坐在自己座位上的概率。
用大写N表示常量:总共上飞机的人数,下同。 设p(k;N)表示第k个人上飞机后坐在自己座位上的概率,则:
1/N (k=1) p(k;N)= (N-k+1)/(N-k+2) (2<=k<=N) 易见,原题要证明的结论就是,当k=N时候,概率表达式退化为1/2。
因为我的证明是构造性的,步骤比较多,我得先把我的证明过程做一个简单的概括,让大家先明白我的思路:
1、用图论的思想对题目做一数学抽象。
2、定义占座链{k1,k2,---,1},其中k1<k2<---,其数学含义为第1个人(傻子)占了第k1个人的座位,第k1个人占了k2的座位,等等。 3、每一个上飞机可能的序列与占座链一一对应。 4、存在2^(N-1)种不同的上飞机序列的可能性(这些可能性并不等概率出现) 5、第k人坐在自己的座位上,当且仅当占座链中不含k。 6、在所有2^(N-1)种上飞机序列中,k出现在其中的概率刚好为一半。 7、求p(k;N),就是计算k不出现的2^(N-2)项的概率和,公共分母为N! *8、当k>=2时,证明: (N-1)/N (k=2) p(k;N)= p(k-1;N)*((N-k+2)^2-1)/(N-k+2)^2 (k>2) 由8的递归条件和初始条件,可以直接推出我要证明的结论。
因为概率表达式子的和式的项成几何增长,我在举例说明的时候以N=4。 证明
1、假设p是满足题目要求的一个N全排列,如1234表示第一个人做1号位置,以此类推,傻子编号为1,全部满足题目要求的排列集合为{p};
1-1、当第k个人上飞机的时候,他不可能做到编号为2到k-1的座位上。
证明:假设他能坐到第i个坐位上(2<=i<=k-1),则表示,第i个人上飞机的时候,第i个座位是空着的,那么他就该坐到第i个座位上,则第k个人不可能坐到i号上。 推论1:第N个人上飞机的时候,他只能坐在1号或者N
1-2、用k1,k2等表示第n个人,若Pi占了Pj的座位,则做有向边ki->kj.形成有向图G,满足:
G中任意顶点的度:入度和出度同为1或度为0 G中最多存在一个连通分部(G'),包含2个或2个以上的顶点,且k1属于G' 由以上两点,可知若G'存在,则构成一单向连通的循环链,若不存在,则补充 定义G'只包含P1. 2、定义p中的一个错排序列s,满足:
(1)第一个元素在序列头,1在序列中结尾 (2)除1外,序列中其他元素单调递增加 (3)p中不存在比s更长的满足定义的序列 举例:p=1234,s=1;
p=2134,s=21 p=3214,s=31 p=2314,s=231 p=2341,s=2341 易见,s的实际意义就是一个排列中,没有坐在自己座位上的的人的一个“循环占坐链”,在排列2314中,s=231,表示第1个人占了2号座位,第2个人占了第3个座位,而第3个人占了1号座位。也就是2中定义的单向循环链G'
3、p和s存在一一对应关系。
p->唯一s,已经在2中证明了,s->p,也很显然,因为N中不在s中的数字,必然要在自己原来的位置上,这个排列当然是唯一的。 4、所有可能上飞机序列的个数:
由s的产生,可知s为2到N的一个全组合并上{1},由二项定理,可知对于N,满足的组合总数为2^(N-1) 5、第k人坐在自己的座位上,当且仅当占座链中不含k。
结论显然。k没有坐在别人座位上,当然只能坐在自己的位置上。 6、在所有2^(N-1)种上飞机序列中,k出现在其中的概率刚好为一半。
依然是利用组合原理,在n个数的全组合中,k出现的次数刚好为一半。 7、由6可知,k不出现的情况共有2^(N-2)项,计算这些项的和及为k坐在自己座位上的概率。
*8、当k>=2时,证明:
(N-1)/N (k=2) p(k;N)= p(k-1;N)*((N-k+2)^2-1)/(N-k+2)^2 (k>2) 呵呵,关键的地方到了,这一步的证明比较复杂,我怕说不清楚,以N=4举例证明,先给出N=4时所有可能的上飞机的序列: 1234 {1}
2134 {2,1} 3214 {3,1} 4231 {4,1} 2314 {2,3,1} 3241 {3,4,1} 2341 {2,3,4,1} {}给出的是对应的占座序列,从概率的角度出发,很容易得到每个序列的概率表达式为: 1/n-i+1 (ki属于s) p(s)=∏(ki) 1(ki不属于s) 其数学含义是,如果ki在占座链中,那么他就在剩下的n-k+1个座位中随便找个坐下,如果没有,他就以概率1坐在自己的座位上。为方便通分,将1表示为(n-i+1)/(n-i+1),任意序列的出现概率分母为N!,分子为一连乘,其分子连乘的个数q满足:
q+|s|=N,|s|为占座链中包含的元素个数。 要直接计算这2^(N-2)项的和是十分困难的,但我们还有一个条件可以利用,就是第2个人坐在自己座位上的概率为(N-1)/N;
当N=4时,计算p(2;4)和p(3;4),表达式为:
p(2;4)=(3!+3*2+3*1+3)/4!;
P(3;4)=(3!+3*2+2*1+2)/4!;
易见,p(k;N)中分子的每一项均有(N-k+1);
可以证明,p(k;n)表达式就是将p(k-1;n)中同时含有N-k+1和N-(k-1)+1的项不动(它的实际意义是什么,想一想~~),将p(k-1;n)不含有N-k+1的项目中,所有N-(k-1)+1替换为(N-k+1)。
这一步可以有两种证明:实际意义和组合原理,实际意义比较烦琐,组合原理可以看到这2^(N-2)项构成其实是对{N-1}/k这N-2个数做一次全组合,将每种组合的数连乘后在累加,再做下一次组合的时候,就是将k替换为k+1。
在p(k;N)中,含n-(k+1)+1的项占一半(再次运用组合原理),其部分和占p(k;N)的(n-(k+1)+1)/((n-(k+1)+1)+1)=(n-k)/(n-k+1)
故p(k;N)=p(k-1;N)*((n-(k-1))/(n-(k-1)+1)+(n-k+1)*((n-k+1)/(n-k+2)))
简化后,得p(k;N)=p(k-1;N)*((N-k+2)^2-1)/(N-k+2)^2。
式子比较复杂,还是以数字举例
p(2;4)=(3!+3*2+3*1+3)/4!;
P(3;4)=(3!+3*2+2*1+2)/4!; 在p(2;4)中有2(N-(k+1)+1)的项为3!和3*2,其和占p(2;4)的2/(1+2),在计算p(3;4)的时候,这部分是共有的,故:
p(3;4)=p(2;4)*(2/3+1/3*(4-3+1)/(4-3+2)) =p(2;4)*8/9 =3/4*8/9 =2/3; 证毕。 |
|
|||||
|
|