Posted in 学习笔记 on 十二月 4th, 2010 by 亚楠兄 –
如何实现一个简单的基于B/S的IMS(Instant Message System 即时通信系统)?
本文就给出了俺的一个思路,以及其基本的模型。尽管架构不完善,且代码写的难看,基本的聊天功能还是实现了的,期望能给大家作为参考,高手也请一笑置之吧。
首先确定我们需要的功能:
1.显示所有的用户,以及其在线状态
2.实现两个用户间点对点的聊天
现在就开始我们的数据库设计吧!
1.数据库的选择
MySQL是个不错的选择,方便且实用,在MyEclipse加入MySQL的支持库(猛击此处获取)就好了
2.数据表
根据基本模型的设定,只要两个表就好了:User表——用以存储用户的信息 以及Chat表——用以存储消息
那么我们需要有哪些用户信息呢? 主键ID,帐号 与 密码 肯定是必须的啦!
那么我们如何判断用户的在线状态呢?可以直接利用Session来实现,但是我决定通过自己建立的数据库来判断,又该如何实现?
答案是记录用户每次的最后活动时间(Last),每次请求的时候根据系统当前时间(Current)减去最后活动时间,就可以知道用户有多久没有访问啦!之后我们可以设定一个上限(我设定是1分钟),如果用户超过1分钟没有任何活动,表示用户已经离线了。
User表里面的还有一个字段——LastRec,是用于记录当前用户的最后接收消息的时间,每次用户在请求接受消息之后,会返回在此时间之后的所有消息,并更新LastRec。这样就能保证用户每次能够接收到未读消息啦!
其实可以将LastRec与Last合并,但考虑到接收列表以及接收消息是在不同的方法内执行,所以两个方法开始的时间是不同的,在服务器负担非常重的时候,两者间可能会有很大的差别。下图就已经显示出来这种趋势,lastrec会比last晚上几个毫秒。

上图就是我的User表的设定。
那么Chat表又有哪些元素呢?
首先是消息的来源与目标 —— 分别表示发送消息的用户ID(from)以及目标对象的用户ID(to)
timestamp:时间戳记录消息发送的时间
say:消息的具体内容

上图给出了我的Chat表的设定
3.逻辑结构
用户登录后,在浏览器端执行JS脚本,使得其每过一段时间(我设定的是5秒)就向服务器发出一次更新请求,更新用户列表并获取新的消息。
用户只能发送两种请求:请求更新 和 发送消息
阅读更多 »
Tags: AJAX, IM, Java, JQuery, 技术
Posted in 学习笔记 on 十二月 3rd, 2010 by 亚楠兄 –
Apache POI 是一个非常强大的OFFICE文档处理类库,我们可以很方便通过它操作早期的Office格式的文档(ppt,doc,xsl等,不过不支持2007之后的新版本),而HSLF是POI中专用处理PPT文档的组件,可以在这里获得它。
“HSLF is the POI Project’s pure Java implementation of the Powerpoint ’97(-2007) file format. It does not support the new PowerPoint 2007 .pptx file format, which is not OLE2 based.”
网站上也提供了各项基本操作的文档,提供了各种功能的直接实现,非常方便,猛击这里访问
不过在测试的时候碰到了两个问题:
一是PPT文档内的剪贴画不会显示,这是必须的,因为剪贴画是在Office的库中,POI内显然没有对应的素材,也就无从显示啦
二是中文字符的支持问题,毕竟Apache POI项目是原生英文的,也没有考虑到咱广大的中华人民的使用,于是中文编码问题肯定要碰到了。
阅读更多 »
Tags: POI, PPT, 技术
Posted in 学习笔记 on 十二月 2nd, 2010 by 亚楠兄 –
时下很多Web2.0应用都提供了自己的widget可以供大家使用,不管是Flicker上的最新照片,还是豆瓣上的最近收藏:只要在你想要的地方加上一段形如<script src=”他们提供的网址” type=”text/javascript”></script>的代码,Bingo!想要的东西就出现了!
不过问题来了,一旦浏览器碰到这些标签,会先暂停当前的页面解析工作,转而去向目标服务器发送请求获取数据,完成后再继续开始的工作。也就是说,这些标签后面的内容就悲剧了,在网络请求一来一回之前,它们一直不被理睬。最终的结果就是严重影响原有页面的载入速度,也会给用户造成一种“很卡”的感觉。
那么,如何能先加载完我们网站自身的内容后再去请求外部服务器上的资源呢?
一些想法:
1.我们把这些script标签放到文档结尾就好了嘛——直接结果是从对应的应用的服务器上获取的数据被写在文档末尾而非我们希望的地方——显然没用。
2.给script标签加上defer属性,表明在网页加载完全后再执行。
此方法看起来没问题,可是在实际应用中,发现 怎么还是一片空白 ? 原因很简单,这些外部的JS脚本大多数是通过直接调用document.write() 来实现的,根据其方法的定义,会在文档流中输出指定的内容,可是问题的关键是,页面加载完成后,document流也关闭了,显然不可能再往上面写东西了(事实上不同浏览器的解释不同,在Opera下会直接输出到文档结尾).
阅读更多 »
Tags: DomWriter, javascript, 技术
Posted in 时代 on 十月 31st, 2010 by 亚楠兄 –
最近RP狂低啊,就发个面经当攒RP吧~
前面是一物理系同学的经历,我自己的经历也加在后面作为补充吧。。。
发个面经,给自己攒RP~~~~
今天上午巴黎高科面试,面试地点是东南大学的榴园宾馆。面试八点半开始,轮到我的时候差不多已经十点多了。
我的面试官有三个。一个头发花白的老者,一个络腮胡子,还有个没什么明显特征的中年男子。
上来先问传统问题-why France? why ParisTech? the future plan….我就把PS里的内容又说了一遍。然后就问笔试难不难?我说总体上不难,但有些问题我没做出来,主要是因为我复习的不太好。他们又问你现在的Major是什么?我说我学的是物理,后来选专业选了生物物理。于是他们揪住生物物理问了很多问题。那个络腮胡子说生物物理现在还处在研究阶段呀。我回答说虽然大部分人搞研究,但生物物理也是有实际应用的,比如制备新型材料、制药等等。(我瞎说的,实际情况是不是这样我就不清楚了)他又问你现在在做什么,modeling吗?我说是的。那你做过实验吗?我说现在还没有做过有关生物物理的实验研究,但未来有机会的话我还是希望做实验的。旁边那个老者又问,你学过化学吗?说
我学过General Chemistry(大化)。
然后他们问我有没有申美国的学校?我说我申了几所。他们让我说出具体申请了哪几所,我就随便挑了几个说了一下。络腮胡子问你是去美国读PHD吗?我说是的,因为物理系的同学几乎都申PHD。然后中年男子又问:法国和美国让你挑的话你会选哪一个?我说我会选择法国,因为我英语不太好。不过话刚出口我就后悔了。果然这些人抓住这点对我狂轰乱炸。那个中年男子说既然你没学好英语,那你怎么知道你会学好法语?我说我会do my best…他又问你学过法语吗?我说没学过。那你准备什么时候学?我说明年。络腮胡子一皱眉说,半年是不可能学好法语的。我说我的学长都是这样干的。他接着说那些人学半年法语是不会达到fluent这种程度的。他一脸严肃的说,如果你法语学不好的话生活上学术上会很吃力,有些高科的学生因为法语不合格而failed。而且法语不好的话将来找工作也很难。 ⊙﹏⊙b汗 语言问题纠结了半天,这是我面试中最囧的一部分。
然后他们接着问你看过高科的网站吗?都看了哪些学校?我说我看过高科的网站,不过只看过Mines的。他们接着问scholarship的问题:没奖学金你来吗?我说我家里穷,不给钱就没能力去。中年男子问你准备申国奖吗?我说可以申国奖。
然后这些人的提问就结束了,问我还有问题没?我就象征性的问了问什么时候出结果,在法国生活费高不高之类的问题。
然后我就出来了,面试时间大概20多分钟。总体感觉面的一般,有些问题回答的不是很好
。
接下来是俺的。。。
注:上面那位是ENSTA和MINES的面试 据说比较看重笔试
阅读更多 »
Tags: ParisTech, 巴黎高科
Posted in 时代 on 十月 27th, 2010 by 亚楠兄 –
最近各种面,都成面霸了。。。。小小总结一下吧~以下内容为了避免侵犯版权,具体东东用XX替代了,大家可以自己揣摩~哈哈
1.XX悲剧了 面试完了就感觉不爽。。。果然被据信了 XX人的效率真不敢恭维,说中旬出结果,然后什么消息都没有,等到20多号再来封据信。
2.XXXXX能再进面试的希望也不大 笔试完后跟人家聊了聊 果然还是不适合做Developer啊!
3.XXX的希望也不大,面试的时候太激动了,说话都有点结巴~特别是对面是印度佬 浓重的口音啊口音!居然没问专业问题,就寒碜了一下。。。不过人家确实是大手笔啊!
4.XXXX好不容易穿正装去面试的啊!XX人的效率也很KB!突然看到封邮件,3天后来笔试吧。。。。N天后突然看到封邮件,后天来面试吧 一惊一乍啊!不过面试官人很好,英语也说的不错~一边拉家常一边把对话一点不漏都记录了,XX人就是认真啊!OFFER啊!祈祷啊!
5.XX算是面的时间最长也是最顺的了,也是最没啥准备的了。或许本身就是要求就不高的吧,不过能去也非常不错了!期待接下来的面试!(最新更新 21:43 p.m)刚DOTA呢突然接到XX的二面电话,感觉悲剧了。。。。
阅读更多 »
Tags: 面试
Posted in 学习笔记 on 九月 15th, 2010 by 亚楠兄 –
发个题目当更新了~
在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点由整数坐标(x,y)表示。士兵们可以沿网格边上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一列。
比如输入为:
int x[]={1,2,1,3,3};
int y[]={2,2,3,-2,3};
五个士兵,输出则为 8,表示各方向上最少移动8次
阅读更多 »
Tags: 算法, 题目
Posted in 学习笔记 on 九月 10th, 2010 by 亚楠兄 –
IEEE规定的浮点格式
32位Float浮点型,第一位为符号位,中间8位为阶数,最后23位为尾数
一般情况尾数隐含位1,最大的规格数为:1.1111…1×2^126 最小的规格数为1×2^-126
然而阶数为0的时候,隐含位为0,且为非规格数,此时阶数实际表示的是-126,于是能够表示的最小非规格化数字是 1×2^(-126-23=-149)
散列表的探查
线性探查法下,如果歌词探测是独立的,任意单元为空的概率是1-a(a为装载因子),于是在一次利用线性探查法的插入中,平均要检查的元素就是1/(1-a)
可惜上面的是错的,线性探查法导致其分布并不平均,而造成”原始聚集”现象,于是平均要检查的元素数量大概为(1 + 1/(1-a)^2)/2,证明会很恶心的,同理,也有二次聚集现象,现在还没有统一的观点。
装载因子为a时候,平均成功查找数为ln(1/(1-a))/a,不成功查找数目为1/(1-a),虽然不正确,但一般还是这样认为了
辗转相减/相除的证明
GCD(A,B) = GCD(A-B,B)=….=GCD(0,X)=X
我们要证明的就是为什么会到0了
当A>B时,可以有A>B>C>D>E>…>X>0 其中C-X皆为相减过程中生成的差值
所以必然会有到达某步骤,使得其得到差值0
C++中++的重载
重载I++形式:
operator ++ (int)
重载++I形式:
operator ++ ()
阅读更多 »
Tags: 数据类型, 算法
Posted in 学习笔记 on 九月 8th, 2010 by 亚楠兄 –
随便给你一个数字N,怎么验证是不是素数?
最快速且最蛋疼的方法是建立一个素数索引PRIME,然后PRIME[N]就知道此数是不是素数了,时间直接就是神奇O(1)
当然此神奇算法的必要条件就是先建立了一个大小至少为N的数组PRIME,然后用漏斗法除掉合数(Of Course 如果你觉得时间够多且用不掉,也可以直接一个一个的验证以剔除合数)
漏斗法的实现就很想一个漏斗了,步骤如下:
1.将数组PRIME清0
2.当然PRIME[1]可以不考虑了
3.步长为2,从PRIME[2]开始,依次取下标4,6,8…2×[N/2] 置1 (事实上如果运气够好 N是2的倍数 经过N/2次操作就可以停止了)
4.步长为3,从PRIME[3]开始,依次取下标6,9,12…3×[N/3] 置1
5.继续去PRIME[I]不为1且有最小的I,依次取下标2I,3I….I×[N/I] 置1
6.重复5直到I>SQRT(N)
我们就得到了一个巨大的素数库,然后碰到一个巨大数字时候,直接看看PRIME[N]是不是0就好,但是会发现在N相当大的时候没有一台超级电脑那会相当的蛋疼
阅读更多 »
Tags: 算法, 素数, 蛋疼
Posted in 学习笔记 on 九月 2nd, 2010 by 亚楠兄 –
原题如下:
请仔细阅读以下条件题目后作答。
1.第一个答案是b的问题是哪一个?
(a)2; (b)3; (c)4; (d)5; (e)6
2.唯一的连续两个具有相同答案的问题是:
(a)2,3; (b)3,4 (c)4,5; (d)5,6; (e)6,7
3.本问题的答案和哪一个问题的答案相同?
(a)1; (b)2; (c)4; (d)7; (e)6
4.答案是a的问题的个数是:
(a)0; (b)1; (c)2; (d)3; (e)4
5.本问题的答案和哪一个问题的答案相同?
(a)10; (b)9; (c)8; (d)7; (e)6
6.答案是a的问题的个数和答案是什么的问题的个数相同?
(a)b; (b)c; (c)d; (d)e; (e)以上都不是
7.按照字母顺序,本问题的答案和下一个问题的答案相差几个字母?(注:a和b相差一个
字母)
(a)4; (b)3; (c)2; (d)1; (e)0
8.答案是元音字母的问题的个数是:(注:a和e是元音字母)
(a)2; (b)3; (c)4; (d)5; (e)6
9.答案是辅音字母的问题的个数是:
(a)一个质数; (b)一个阶乘数; (c)一个平方数; (d)一个立方数; (e)5的倍数
10.本问题的答案是:
(a)a; (b)b; (c)c; (d)d; (e)e
好吧 我显然不是天才,于是来穷举吧。。。
阅读更多 »
Tags: 题目
Posted in 学习笔记 on 八月 13th, 2010 by 亚楠兄 –
一切开始于今天偶然看到的一道C语言题目
int a = -1;
unsigned int b = 2;
那么a+b>a?为什么?a+b>b?为什么?
然后我认为是:
a 用二进制表示为 11111111 11111111 11111111 11111111
b 用二进制表示为 00000000 00000000 00000000 00000010 (转换为int)
加起来以后,溢出 00000000 00000000 00000000 00000001
于是有a < a+b < b
然后在VS2008里测试一下 悲剧了。。。结果是 a+b < a 且 a+b < b
阅读更多 »
Tags: c, 数据类型