今天看到DianPrep上的帖子,简直不能忍自己了,发现自己好拽的样子,liyong、nevsaynev等牛人都未能幸免,难怪chenjianwu说我当了教练后就摆起架子来了。screen.width/2)this.width=screen.width/2; >
当时真是年少无知啊,我是和众多队友们一起成长的,我得到的远比我付出得多,感谢大家带给我的进步,同时也向曾经被我“拽”过的兄弟们道歉!
原是时候总结一下预备队的生活了
最近经常很伤感,越来越留恋起学校的生活,越来越喜欢回味过去的生活,可能是自己还不够充实,有句话说得好,说是人的心脏分成了左心房和右心房,一个心房里住了天使,另一个心房里住了魔鬼,如果你不让天使常驻,魔鬼就会趁虚而入,占据你的全部,我似乎有点着魔了,呵呵。
但是,有时候也在想,回味过去也不算坏,有总结才有进步吗!
所以我想把自己担任预备队总教练这段时间总结一下,在这里留下我的回忆、教训和经验,希望可以给自己,给众多预备队毕业的兄弟们一点可以分享的果实,这里就先开个头吧。
首先,我要感谢cactus和qja两个活宝,是他们提议建立预备队,而且是他们提议由我出任预备队总教练。记得那天,是我第二次去梧桐雨喝茶,大家没有办法说出什么具体的建设性意见,只是希望预备队可以成为二线到一线的一个缓冲池,希望预备队可以减轻一线队伍在培养人方面的压力。
第二天,dianprep版就成立,dianprep版第一帖就宣布了预备队的成立,并宣布了对我的任命:
screen.width/2)this.width=screen.width/2; >
故事就这样开始了…(注意,上面图中dian的签名档还只有两句话,^_^)
scanf、fgets和cin
偶然一个机会,在linux下发现了这个问题,现在列举他们的区别:
1. scanf用于格式化接受用户输入,他与cin区别不大,用惯了c的哥们肯定更倾向与直接用scanf做格式化输入。格式化输入是格式化输出的逆向过程,大家想象下面这个scanf会是什么现象呢?
char s[40] = “12345678”;
scanf(“%s
“, s);
你调试一下就会发现,这个时候你必须敲两下回车,scanf才会返回,两个回车符中,第一个就是格式化串”%s
“中的
,第二个就是系统默认的字符串结束符。
2. fgets用于获取文件流中的字符,注意,
当然也算字符哟,而且文件流不仅仅包括磁盘上的文件,也包括内存文件,标准输入(stdin)、标准输出(stdout)等等,在linux下,文件流更是包含了串口、网络、驱动程序等等抽象的输入输出接口。
呵呵,别扯远了,看看下面这个例子,就可以很好的理解fgets和scanf的区别了:
scanf(“%s”, s);
cout << strlen(s) << , << sizeof(s) <<
;
fgets(s, 39, stdin);
cout << strlen(s) << , << sizeof(s) <<
;
也许你会想,第一个scanf用于接受用户输入,用户敲回车后,第二个fgets会接受用户的另一个输入,但是结果不是这样的,比如你这样敲:
> 123456回车
那么程序会一直执行到第四条语句,如果单步调试,你会发现当你回车后,s首先为123456
循环是否一定该合并?(转载)
摘自《游戏之旅--我的编程感悟》
程序1:
for (int i = 0; i < 100; i++)
{
do_something_1();
do_something_2();
}
程序2:
for (int i = 0; i < 100; i++)
{
do_something_1();
}
for (int i = 0; i < 100; i++)
{
do_something_2();
}
如果do_something_1()和do_something_2()这两个函数没有关联, 则程序1和程序2的运行结果相同.哪个程序更好? 或许有很多讲究效率的程序远喜欢第一种, 很多人喜欢在一个for循环中干太多的事情, 或许他们想当然的认为, for循环累加i也是一种时间消耗, 如果能减少对i的操作也是一种优化.但实际上事与愿违,两段程序的性能比较取决于do_something_1和do_something_2的具体实现.
如果两个函数都实现的很简单, 则通常程序1会比较有效率.而如果两个函数都干了较为复杂的事情,那么程序2会变得比程序1高效.导致这个结果的是cpu的代码cache机制.通常, 程序代码第一次运行的时候,速度会比较慢(比如for循环的第一次进入).这存在一个代码从内存加载的时间,代码用到的内存数据的加载时间、还有分支预测缓存的建立,甚至还有cpu对指令的解码时间(对于现代cpu, 为了兼容以前的指令集且保持高效率,在内部需要使用一套高效的微操作指令的同时,需要做从外部的指令编码到内部微指令的转换工作)。如果循环体内涉及到的代码超过了cpu的代码缓存的容量(通常是8k,到p4加到了16k),就使的循环中代码每次的进入都要重新作一系列缓慢的操作,如果我们能尽量维持循环内的代码在一个较小的尺寸,就能提高效率。
如果do_something_1()和do_something_2()干的事情逻辑上联系不大,仅仅是想把两个函数各自循环调用若干次,则从软件设计角度讲,程序1也是个糟糕的设计。
今天被灌醉了
本科班班搓,这群小家伙都很不错,已经连续两个学期取得了年级第一的好成绩,上个学期加权分上90的达到了5个,平均分达到84分多,真是太厉害了。
所以我心里也非常高兴,能带这样一群优秀的学生,真是一种幸福,虽然我感冒了,但还是很努力的醉着,这是一种幸福的醉,畅快淋漓的醉。
黄悦好强,喝得跟我差不多多,但还是这么强硬,似乎还能喝的样子,这位新班长进入角色很快,我们班以后肯定还有更佳表现。
年轻人,最重要的是自信,我已经感觉到了他们的自信,我相信他们可以做到更好。要做到这种自信有很多方法,一个高标准是最基本的,一开始就定一个高标准是有益无害的,人都是这样,当你把目标定在100分的时候,你最终可能只能做到80分或者90分,当你把标准定在80分的时候,你就只能做到60或者70分。我一开始就得给他们很高的目标,虽然他们刚开始最能做到80或者90分,但等他们积累一定信心之后,虽然他们的目标还是定在100分,但却有可能做出120分的成绩,这就是我带小家伙们的诀窍。
我相信下个学期就是他们做出120分的时候了!
网络字节序和主机字节序(转载)
谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?
其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。
用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:
Big Endian
低地址 高地址
—————————————–>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低地址 高地址
—————————————–>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little endian,!@#$%^&*,见鬼去吧 -_-|||
为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。
无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。
Intel 8080 和 Motorola 6800还有一个有趣的不同点:在两种微处理器中,LDA指令都是从一个特定的地址处装载到累加器。例如,在8080中,下列字节序列:
screen.width/2)this.width=screen.width/2; >
将把存储在地址347Bh处的字节装载到累加器。现在把上述指令与6800的LDA指令相比较,后者采用称作6800的扩展地址模式:
screen.width/2)this.width=screen.width/2; >
该字节序列把存储在地址7B34h处的字节装载到累加器A中。
这种不同点是很微妙的。当然,你也可能认为它们的操作码不同:对8080来说是3Ah,对6800来说是B6h。但主要是这两种微处理器处理紧随操作码后的地址是不同的,8080认为低位在前,高位在后;6800则认为高位在前,低位在后。这种Intel和Motorola微处理器保存多字节数时的根本不同从没有得到解决。直到现在,Intel微处理器在保存多字节数时,仍是最低有效字节在前(即在最低存储地址处);而Motorola微处理器在保存多字节数时,仍是最高有效字节在前。
这两种方法分别叫作little-endian(Intel方式)和big-endian(Motorola方式)。辩论这两种方式的优劣可能是很有趣的,不过在此之前,要知道术语big-endian来自于JonathanSwift的《Gulliver’sTravels》,指的是Lilliput和Blefuscu在每次吃鸡蛋前都要互相碰一下。这种辩论可能是无目的的。先不说哪种方法在本质上说是不是正确的,但这种差别的确当在基于little-endian和big-endian机器的系统之间共享信息时会带来附加的兼容性问题。
最近懈怠了……
可能还是有点不适应H3,对于写文档的事情,还是有点不适应,兄弟们都很卖力,而我每天效率都很低,经常不知所措,常常在几件事情之间转来转去,结果是什么都没有做好。
本周要做的事情:
1. 写好H3组的STC和SRS,重点关注分布式、socket等内容,谨防遗漏;
2. 完成调研报告——威盛电子;
3. 完成英文简历,并投给synopsis;
4. 搞定simuware,至少让他可以ping通,最好能学会怎么组网。
对招新模式的思考
另外,我对目前团队的新的招新模式还是比较担心的,我们寄希望于招技术牛人,招有基础的人,而教练组只负责思想培训,这样可能会有很大问题。我相信感情留人,武汉这个地方的机会迟早会多起来,而且现在很多大公司都比较注重实习生招聘,我们不是在跟什么创新基地竞争,我们也将不是众望所归的学习乐园,因为我们的竞争对手除了清华、北大、中科院等大学研究机构外,还将包括微软、IBM、华为等等大公司,设想一下,等到他们都有了基础了我们才来招他们,那个时候他们将在大公司、清华实习和Dian团队之间抉择,他会选什么呢?
牛人流失是迟早的事情,关键在于我们能在他走之前让他留下点什么,肖、单、吴走了,接下来,李也将离开,不过我们很高兴,因为肖、单、吴,包括李,都已经或者说都将为Dian团队留下很多东西,但是我们回头想想,如果当初预备队没有花费一年时间让肖和吴“白白浪费资源”,等到电赛结束后,他们保研也尘埃落定了,清华和中科院在召唤,他们最终会留在团队吗?更何况李,那是刘老师开了好几个绿灯,才有了他今天的成绩。
大家想,是什么留下了他们(肖、单、吴、李)?是刘老师个人魅力?是Dian团队集体魅力?
每个人在一个新的环境中都会有一个开始,即使是肖、吴,如果当初不是在预备队大家看到过,他们到了团队也总会有一段时间适应时间的,每个人都是有感情的,留在一个地方,就会有他的感情、习惯和他可以找到的自信,我觉得肖、吴留在团队是这种感情、习惯和自信的延续,而不是其他。
我不是预言家,但我想预言;我不悲观,但我也不乐观;不在其位,我也只能发发见解而已,希望dodo能够做好。
学校是一个非常好的地方,他容许你尝试,容许你失败,还有一年就要离开这里,开始有点留恋了。
古来将军,没几个好下场的
乐哉悠哉,比做官强过百倍!
突然想起《大话西游》里紫霞的一句话“只羡鸳鸯不羡仙”!
0707开题答辩通过了
自己对今天的开题答辩还是比较有信心的,题目是“基于DSP与PCI的图形图像标记系统的设计”,答辩老师问了一些问题,其中张江山老师看到我的调频网屏技术,就问我为什么不考虑用抖动算法,虽然我不知道抖动算法为何物,但是上次寻找方向时,坐在图书馆胡乱翻书,不经意的确看到过一篇抖动算法的论文,论文中还有标记效果,乖乖,这下用上了,我就这样回答了他。
几位老师没有把我问倒,就让我通过了,最后dodo得了最高分,我居第二,他的ppt的确很漂亮,对昏昏欲睡的评委无疑是惊醒精神的良药,多给点分,可以理解!