linux fetion无法启动
我在安装ubuntu时home目录是保存原来的(单独挂载到一个盘),这样似乎会导致一个问题,安装好的fetion无法启动,在命令行里启动时出现这样的错误信息:linux-fetion: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory。OH,原来是少了文件呐,就马上去新立德里搜索libcurl.so.4装上,心想现在应该没问题吧,再次双击fetion,还是无法启动,出现:Failed to execute child process "linux-fetion"(Permission denied)。这到底是什么破问题啊,以前在fedora时也没有这么多问题啊,后来试下在命令行里用超级用户权限启动,咦,发现行了,原来问题出在文件权限这里。
跑到/usr/bin目录里,把linux-fetion这个可执行文件的所属用户改变我登陆时的用户,然后再次启动,这次行了,可是什么图标都没有,看来那些配置文件也得全部改了。接着把/usr/share/libfetion这个目录的所属用户也全部改了,现在再次启动就OK了!
Linux下歌词新星
不可否认其功能还是很强大,歌词编辑、调整和在视觉上的调整上都提供了支持。不过觉得歌词自动下载略显不足,经常得自己手动去搜,但总体来说lrcShow-X还是很不错的,值得试用。PS:
链接:http://www.sanfanling.cn/read.php?267
下载:http://www.kde-apps.org/content/show.php?content=103055
“Hello World!”的N种写法(转载)
1. 最经典的“Hello world!”
“Hello world!”最经典的写法当然是直接用 printf 输出“Hello world!”这几个字符了。无论用C还是 C++,写起来都非常的简洁明了。这里把最常见的几个全部列在下面。
#include
#include
int main()
{
printf("Hello world!"); // 教科书的写法
puts("Hello world!"); // 我最喜欢的
puts("Hello" " " "world!"); // 拼接字符串
std::cout << "Hello world!" << std::endl; // C++风格的教科书写法
return 0;
}
特别需要注意的是,在C/C++里,如果两个字符串之间除空白符以外没有任何东西,编译器会自动认为这两个字符串是连在一起的字符串。这样,如果一个字符串过长,可以用这种方法换行来写,既不浪费性能,又美观。
2. 用宏写的“Hello world!”
在C/C++里,宏是一个神奇的东西。特别是在C语言中,宏可以帮我们做一些“又脏又累”的活,包括拼接代码片断、隐藏繁琐的实现细节等等。其中特别有趣的是“#”的用法,它可以“提取”参数的名字,把它变成字符串。
#include
#define Say(sth) puts(#sth)
int main()
{
return Say(Hello world!);
}
请注意,这个Hello world可是完全没有出现引号哦!
3. 断章取义的“Hello world!”
字符串是一种常量这当然毫无疑问,但是它的类型是什么,这就需要考虑一下了。使用C++的typeid就可以这个问题的答案,而且只要是符合C或C++标 准的编译器就应该是一样的结果。比如字符串“Hello world!”,它的类型就是 char const [13]。
知道了这个,就可以写出以下的“Hello world!”:
#include
int main()
{
return puts(&"Do not say: Hello world!"[12]);
}
4. 退出时运行的“Hello world!”
大家都知道 main 函数退出意味着程序结束,可是这并不完全正确,我们完全可以在 main 函数退出以后做很多事呢——比如说,输出“Hello world!”。这个功能依赖于C标准库中提供的函数 atexit(),调用这个函数并注册自己的回调函数就行。需要注意,这个函数可以调用多次,最后注册的函数最先执行。
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=999&d=v433i2
#include
#include
void say()
{
printf("world!");
}
void sth()
{
printf("Hello ");
}
int main()
{
return atexit(say), atexit(sth);
}
5. 读取自己的“Hello world!”
C/C++的编译器提供了一些有用的内置宏,最常用的就是 __FILE__ 和 __LINE__ 了。其中,__FILE__ 代表当前的源文件的文件名,嗯,对了,如果我们让这个程序读取自己的源文件,不就可以做一个很有意思的“Hello world!”了么?
// Hello world!
#include
#include
#include
int main()
{
std::ifstream ifs(__FILE__);
std::string say, some, word;
ifs >> say >> some >> word;
std::cout << some << " " << word;
return 0;
}
6. 话分两头的“Hello world!”
有了C++的类,我们就可以光明正大的在 main 函数执行之前和之后做感兴趣的事情了。我们可以声明一个全局的类的实例,这样,在 main 函数执行之前会调用这个类的构造函数,结束之后则会调用析构函数。
#include
class say
{
public:
say()
{
std::cout << "Hell";
}
~say()
{
std::cout << "world!";
}
}hello;
int main()
{
std::cout << "o ";
return 0;
}
7. 传入模板的“Hello world!”
C++的模板功能极为强大,可以说是C++里面最艰深、最经典、最时尚的部分。一个“Hello world!”当然无法使用很多很高级的模板技巧,我也不想只使用模板特化这样无阻挂齿的小技巧,嗯,那就来演示一个比较罕见的用法吧。
#include
template
class say
{
public:
void operator () ()
{
std::cout << words;
}
};
extern char hello[] = "Hello world!";
int main()
{
return say
}
请注意,这个 extern 是十分必要的,只有加上了 extern,这个指针才是一个编译器间可以确定的值,也才可以参与模板运算。还有,hello 必须为数组类型,而不能为 char*,这个道理和加 extern 是一样的。
此外,这里还演示了 functor 的用法,嗯,关于它的优点就不在这里多说了,反正是与原生指针相比有很多好处就是了。
8. 调用私有函数的“Hello world!”
我们知道,C++类的私有函数是不能被外界访问的,比如说 main 函数里面,它绝对不能访问类的私有函数,除非把它设为类的友元函数。不过我们还是可以用一些比较奇怪的方法访问类的私有函数——当然,这个私有函数必须满足一个条件:它是虚函数。
这里就涉及到一个问题,指向虚函数的虚表放在哪里?对于 VS.Net 2003 而言,虚表是类的第一个成员,虚函数指针按照函数声明的顺序放在虚表里面。当然,这个说法并不严谨,更细节的东西还是去看看那本“成人高钙奶粉”吧,它会给出最权威的解答。
这里是一个很有意思的例子:
#include
#include
class secret
{
private:
virtual void say()
{
std::cout << "Hello world!";
}
};
int main()
{
secret word;
(reinterpret_cast
return 0;
}
9. 最暴力的“Hello world!”
最暴力的调用函数的方法是:直接修改函数的返回地址,让这个地址指向我们想要调用的函数。这也就是缓冲区溢出漏洞的应用方法了,不过里面还涉及到很多问 题,在这里就不一一列举,想要了解的话,还是去 Google 吧。这里只演示一个可以在 VS.Net 2003 下可以用的“Hello world!”。
#include
#include
#include
void say()
{
puts("Hello world!");
exit(0);
}
int main()
{
volatile intptr_t a = 0;
volatile intptr_t * p = &a;
*(p + 2) = (intptr_t)say;
*(p + 3) = (intptr_t)say;
return 0;
}
10. 外星人说的“Hello world!”
好了,这个“Hello world!”是最匪夷所思的一个了!不过它并没有涉及任何复杂的C/C++语言特性,只是看起来有点酷。你能看懂外星人在说什么不?
#include
void alien_say(char * p)
{
while (putchar(*(p += *(p + 1) - *p)));
}
int main()
{
return alien_say("BETHO! Altec oh liryom(a loadjudas!) dowd."), 0;
}
用一句话概括四大名著
西游:疯狂的猴子
红楼:疯狂的石头
水浒:疯狂的好汉
三国:疯狂的战争
最时尚的答案:
西游:三藏团队的艺术化管理
红楼:败家子是怎样炼成的
水浒:兄弟连
三国:是金子总会发光的--记农村优秀青年孔明
最社会的答案:
西游:俺们天上有人
红楼:俺们朝廷有人
水浒:俺们江湖有人
三国:俺们有的是人
最批判的答案:
西游:公款旅游
红楼:公款追MM
水浒:公款吃喝
三国:为了公款旅游、公款追MM、公款吃喝而奋斗
最畅销的答案:
西游:《论旅游开发--唐朝学者记录沿途奇遇》
红楼:《论大观园开发--美女公关口述公司内幕》
水浒:《论梁山开发--108人旅游团的悲惨遭遇》
三国:《论中原开发--三大公司争夺开发权内幕》
最直接的答案:
西游:一个人和三个怪物的故事
红楼:一个男人和一群女人的故事
水浒:一群男人和三个女人的故事
三国:三个男人和战争的故事
最本质的答案:
西游:猴子被人驯服
红楼:男人被女人驯服
水浒:好汉被官府驯服
三国:和平被战争驯服
最“有戏”的答案:
西游:呔,妖怪!
红楼:嗨,妹妹!
水浒:嘿,老大!
三国:是,将军!
最实用的答案:
西游:真经的取法
红楼:爱情的谈法
水浒:牛肉的吃法
三国:战争的打法
最“影迷”的答案:
西游:动物王国历险记
红楼:趟过女人河的男人
水浒:我在黑社会的日子
三国:古惑仔之胜者为王
最“歌迷”的答案:
西游:人在旅途
红楼:你究竟有几个好妹妹
水浒:其实不想走
三国:英雄泪
最无奈的答案:
西游:神仙靠不住
红楼:亲戚靠不住
水浒:老大靠不住
三国:盟友靠不住
百度与Google
自从08年开始,百度被爆出了许多负面新闻,百度的企业形象似乎一下子跌到了谷底。也许笑的人很多,但是作为百度支持者的话,可能会一下子愣了,这真的是自己崇拜的公司的所作所为吗?
说实话,我并不排斥百度,在进入大学以前,我常用的搜索引擎是百度,基本上不碰谷歌,因为在那时候百度基本上满足了我的需求,让我找到要找的资料,让我能听想要听的歌曲。但是现在正好倒过来,搜索资料用谷歌,找歌用百度,因为慢慢地发现,用百度找比较专业性的资料,根本就没有谷歌找到的那么多,那么准确。
一直以来,我都认为百度是家很不错的公司,认为李彦宏是一个很优秀的中国人。虽说搜索方面没有谷歌那么强大,但百度基本上满足了中国很大一部分网民,百度在中文的理解上,我认为还是比谷歌好的,百度能做到今天这个地步,没有一定的能力是不可能的。
这些天开始关注网上的人对百度的看法,似乎仇视百度的比撑它的多得多,很多关于百度的帖子,基本上都是在谩骂它吧,呵呵,素质。
首先要提的是竞价排名。其实本身来说竞价排名并不是说不好,照李的看法来说,确实能提高用户体验。但这有一个前提:要保证推广信息的正确性。很多人认为竞价排名就意味着百度的搜索信息不公正,有很大一部分是人工干预。人工干预在一定程度上其实能提高用户体验,假如说竞价的企业都是些合法企业,而且推广信息刚好是搜索者要找的,这时候三方得益了。要是进行竞价的企业有一部分是虚假广告,搜索者不好运正好找到这个并信以为真,那想想被欺骗后的心情如何?肯定会把百度臭骂一顿。所以呢,百度要进行竞价排名,首先就要保证百分之九十九以上的推广信息都是合法的。可是百度在推广信息的把关上没有想像得那么好,虚假信息还是太多,而且竞价排名被百度发挥出了最大的商业利益,这不是什么好事,百度赚的钱多了,可是在网民中的形象却会大打折扣了,也许什么时候百度能像谷歌一样做到左边的搜索信息不会掺合广告,那百度才是真正意义上的中国的“谷歌”吧。
貌似民间有一种说法,百度曾经搜集过很多对Google不利的信息向政府反应,在一定程度上打击到Google,并导致它在中国在一段时期内被封,现在Google在中国提供的服务也是时断时续的,有相当一部分功能是不能够使用的。这究竟是不是真的,也许无从考证。Google在中国被封,很多人第一个想到的就是百度,毕竟它被封百度是最大的获益者。但是我不认同这种说法,因为百度没必要。假如百度真的是靠这样来起家的,我想它撑不了多久,很快就会垮台的。但是说法众多,谁也说服不了谁,事实是怎么样的,也许真的成为了历史。
网上很多站长都说自己曾经接过百度要其竞价排名的电话,拒绝后自己的网站来自百度的流量就越来越少,甚至被百度K站。至于被K站的是不是都是因为拒绝竞价排名就不知道了。但可以肯定的是有很大一部分是因为SEO过度或是被认定为垃圾信息。现在很多人搞网站,随便在别人的网站上复制一部分就成为自己网站的内容了,不相信的话你现在用Google随便搜索一些东西,看看重复率是不是很高?Google搜到的东西确实多,可是有很大一部分都是重复的,你点开很多个网页,发现竟然都是同一篇文章,呵呵,个个都说是原创的。这并不是Google的错,搜英文就不会这样,中国的互联网垃圾信息还是太多了,很多人都是Copy来复制去的。这样的话肯定被K啦,百度在这方面还是处理得还严的。还有一个,百度对一些政治敏感性的东西还是封得比较厉害的,Google相对来说比较自由,我相信那时候被封很大部分是因为这个吧,现在它也学乖了。这时候也许有人说百度就是政府的什么什么了,这很难听,你活在这片土地上,有些事还是得乖乖认了的。
很多人都说百度没创新,就会跟着谷歌跑,谷歌出什么,百度就跟着出什么。但我要说的是百度并不像他们说的那样,觉得这样说本身就不公平,百度很多东西都是谷歌没有的,就像帖吧、国学搜索等。百度很多东西做得还是很不错的,很多人说百度没创新是因为他们只挑一些片面的来说,对于它的优点却完全无视。最近百度推出的老年搜索,个人认为是很不错的,字体加大,搜索更加准确,更好的是去除了广告,保持了一片净土。但很多人对此确是冷嘲热讽,也许很多人都认定百度做的就是垃圾吧,更有人扬言说百度的这个东东他只要用DW十分钟就搞定了,百度的工程师都太逊了。我想他只是看了那个页面就放出了这话吧,很多人根本就不屑去了解这个东西。貌似很多老年人都说不错的,这时候年轻人却跑出来踩了,这不关他们事吧,呵呵。
其实无论百度,还是谷歌,都是很不错的。但是百度的一些做法,着实伤害了很多人的心。百度这几年在商业利益上的追逐,让它丢失了一部分的企业责任。李自己也承认公司管理高层的流失,让百度的管理陷入了一定的混乱当中。百度想要重新获得网民的认可,就一定要负起自己的责任,百度做到今天,社会责任是很大的。也许公司成长到一定程度,都会出现这样那样的问题吧。像华为,当年也是饱受非议的。希望百度能像华为一样,认识到自己的缺点在那里并加以改正,不怕有错,就怕知道后仍死撑着不去改,那也许就真的会在网民的视线中淡出吧。
在VC中使用Flash来做界面
首先当然就是要利用MFC AppWizard建一个对话框窗口,然后在主菜单里选择“工程->添加工程->components and controls”菜单选项,这时会弹出一个components and controls gallery文件选择对话框,里面有两个文件夹,一个是registered activex controls,一个是visual c++ components。选择第一文件夹后会出现一系列系统上已注册过的activex控件。这时候要检查里面是否有shockwave flash object这个控件,没有的话就得自己去下载一个了,点击insert将它插入工程。因为在vc中插入工程的控件要通过一个类来操作,所以这时vc会提示你为这个控件指定一个类名,可以使用默认的类名就行了。插入后vc会自动把这个类加入工程里面。这时候就可以利用这个生成的类定义一个对象。插入shockwave flash object控件后,你会发现在对话框编辑器那里多出了一个图标,和使用BUTTON、EDIT等其它windows控件一样,把它拉到对话框上,让它跟刚刚定义的那个对象(是插入控件后生成的类类型)关联,不知道怎么利用VC关联的话就在AppWizard生成的对话框类中的DoDataExchange函数插入DDX_Control(pDX, ID号, 定义的对象名)。
这时候就可以使用成员函数LoadMovie和Play来导入并播放动画了,这里我们假设定义的对象名为Flash。Flashr.LoadMovie(0, strMovieUrl);该函数用来将动画导入程序中,strMovieUrl为要播放的flash路径,要用绝对路径。 Flash.Play();调用该函数开始播放动画。在初始化对话框的函数(OnInitDialog)里面加入这两个函数调用即可。这时候要记得在继承于WinApp的类的InitInstanse函数中调用AfxEnableControlContainer()这个函数,这个函数的作用是你的应用程序成为ActiveX控件包容器。假如你不加进去的话,程序就会运行不了。
假如现在你一切都搞定了,运行一下程序,你会发现Flash已经嵌入到你的程序当中了,但由于是在对话框中,现在没有办法改变它的大小,更糟糕的是,右击后竟然有Flash那个弹出菜单。
我觉得把程序设定为全屏运行是最好的,因为Flash外面有个窗框严重影响了美观,所以可以在对话框初化函数中加入以下代码:
int cx, cy;
HDC dc = ::GetDC(NULL);
cx = GetDeviceCaps(dc,HORZRES) +
GetSystemMetrics(SM_CXBORDER);
cy = GetDeviceCaps(dc,VERTRES) +
GetSystemMetrics(SM_CYBORDER);
::ReleaseDC(0,dc);
//去除标题和边框
SetWindowLong(m_hWnd, GWL_STYLE,
GetWindowLong(m_hWnd, GWL_STYLE) &
(~(WS_CAPTION | WS_BORDER)));
// 置对话框为最顶端并扩充到整个屏幕
::SetWindowPos(m_hWnd, HWND_TOPMOST,
-(GetSystemMetrics(SM_CXBORDER)+1),
-(GetSystemMetrics(SM_CYBORDER)+1),
cx+1,cy+1, SWP_NOZORDER);
再运行一下,你是不是发现已经可以全屏了,那个讨厌的窗框也不见了。问题可能又有了,你有没发现Flash并没有相应放大,天呐,怎么办,这样的话全屏有毛用啊?呵呵,不用怕,这时候就要利用ClassWizard在对话框类中重定义OnSize这个虚函数了,在里面加入 :
if(m_FlashPlayer.GetSafeHwnd())
{
m_FlashPlayer.MoveWindow(0, 0, cx, cy);
}
现在问题完美解决了,Oh No,还有一个右键问题。其实问题也不大,也就是在刚刚插入控件时生成的那个类当中截取右键消息,然后处理函数什么都不做就行了。这时要做的就是捕获WM_RBUTTONDOWN消息,再让OnRButtonDown(UINT nFlags, CPoint point)的函数体置空就行了。
至此在界面上应该没有什么问题了(漂不漂亮就要看你设计的Flash),下面介绍在flash动画和自己的程序中传递消息进行交互。
把flash嵌入自己的程序后,用户在flash动画上面操作,想知道用户进行了什么操作,就得让flash动画来告诉我们了。做过flash的人应该知 道flash的动作脚本语言:Action Script。里面有个命令叫FSCommand(command,args);我们就是要通过这个命令向外部发送消息的。这个命令有两个参数,都是字符 串,你可以在flash脚本中指定任意的字符串。比如用户按下flash动画的一个按钮就发送FSCommand("bt","bt1")这样一个消息, 按下另一个按钮发送FSCommand("bt","bt2"),而我们的程序收到FSCommand消息后就对通过两个参数的不同字符串来判断用户按下 的是哪个按钮。
原理就是这样子的,要实现的话就得在flash动画中使用FSCommand发送消息,在我们的程序接收和处理FSCommand消息了。 flash部分的就不讲了。那我们的程序如何才能接收这个消息呢?前面我们讲到,shockwave flash object插入我们的程序后就可以象一个普通的windows控件那样使用它了。要让它接收并处理这个消息当然是使用MFC的类向导进行消息映射了。做 法如下:
1、添加消息处理函数。 在主菜单中选择“查看->类向导”,在弹出的对话框中选择消息映射,在左边的列表框中选择我们刚插入程序的shockwave flash object控件id,右边选择FSCommand, 点击AddFunction,这样就添加了一个FSCommand消息处理函数了。它的形式大概是这样子的:
void CPlayFlashDlg::OnFSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args) ;函数有两个参数,就是flash的Action SCript中FSCommand语句中的两个参数。其实并不一定两个参数都用到,flash脚本中可以就使用一个参数,这样这边的函数就只要对第一个参 数进行处理就行了。
广商之“想”
说实话,广商那里真的是比较无聊的,一整天就是在那逛校园,那天我还对友鹏说:“我们现在应该先回去冲凉吃饭,然后晚上再逛校园,不然晚上的节目就没有了!”佩如宿舍一个女的更是对佩如说:“他老是往这里跑,肯定是对你们三个其中一个有意思。”今天在回广州的车上把这句话对嘉英说了,嘉英说得更对:“其实她说错了,她应该说你老是去我们这边肯定对我们三个都有意思,哈哈。”呵呵,也许是真的。
其实最开心的是见到了很久没见面的朋友。第一次我们一起去逛图书馆,这也许是我大学以来做的最有聊的事了;第一次我们一起看电影;第一次我们一起打篮球,可我就是老是进不了球,让美玲和嘉英狂鄙视。
有点遗憾就是友鹏有事住了一晚就匆匆回南海了;嘉英忙事没跟我们一起太久;霏霏更绝了,丢下我们她们三个自己去逛衣服,还把钱当垃圾扔,你说丢下我们就算了嘛,竟然不把钱给我们反而当垃圾扔掉,像话吗?
最不好意思的就是又让之炎大出血了,明明是要坑佩如,怎么每次就都坑成之炎了,真是郁闷!
最不爽的就是美玲跟嘉英竟然没来送我,真是不给我面子,下次要乖点。
最最最要表扬的就是如姐了,又无怨无悔陪了我三天,鼓掌三十秒!
有时候在想,我们还有多少日子能够像现在一样,大家凑在一起,什么都不用想,只是简简单单在一起聊天、玩。也许不久后我们会长大,会走出这个时光,然后大家都忙着做自己的事,什么都无瑕去想,只能偶尔怀念一下大学的这个时候。觉得那次友鹏说得很对,“虽说大学朋友也很多,可是永远没有我们这些人在一起时的那种感觉”。真的,没有,那种感觉,很微妙。
这也许就是人生一段很美丽的记忆,会像对嘉英说的“我会永远记住我们一起打球”一样,也会永远记住这一段时光。
他们都说来本部后再一起过来找我,算不算约定呢,呵呵?要过来哦,大家!
可视化搜索引擎Searchme
郎咸平:中国企业存在病态心理
“中国文化博大精深是没有错的,这个没有人会有意见。在这种博大精深的外衣之下,我们谈谈小问题。我认为中华文化有两个小问题,第一个小问题,投机取巧;第二个小问题,浮躁。”
“你有没有听过“杀鸡不用牛刀”?有没有听过“四两拨千斤”?很有道理是吧!只要你认为有道理的,基本上都是错的。”(PS:郎咸平之所以会持反对观点,是因为这些都是标准的小概率事件,很多事不能太冒险,出其不意就全都玩完了。)
“我们从小学念到大学,什么时候老师教我们说:你们为何对岳飞被十二道金牌召回,仔细研究一下他背后的原因。屈原跳汩罗江,好悲壮,我们只能说:你看看楚怀王的昏庸。再讲一句大家熟悉的谚语叫做“失败是成功之母”,这是全世界最荒谬的逻辑,失败加失败加失败竟然能够成功。”
“我们对于失败背后的原因从来不去深究,从来不去研究,可是我告诉各位每一次失败都有原因,不是管理的问题就是战略的问题要不然就是其它的问题,但是我们的文化从来不鼓励我们去研究失败的原因。我们只看表面现象,不看背后真正的原因,这种只看表面的民族是浮躁的。”
“我们的企业家是我常常批评的,他们有世界五百强的病态心理,做到一定规模就要做大做强,这就是浮躁的心态。当去问这些企业家为什么要做大做强时,他们是讲不清的,他们认为做企业就是要做大做强,这个问题就来源于他的浮躁心态,他们认为企业做大做强才是正确的。”
“联想2004年之前曾经做大做强过,他们想搞IT服务、手机、互联网,到04年之后宣布失败,随后又收购IBM的手提电脑部门。这一切的做法就是我讲的,一个浮躁的心态让他喜欢做大做强,而其手法是投机取巧,喜欢小概率事件。”
“要成为现代企业,真正要在国际市场上一争长短,走到华为那一步就很不容易了,因为华为已经做到了工序流程,但是他的评分只有2点7分。可悲的是,我们99%的企业还没有弄清楚华为内部的工序流程的积累。”
“中华文化从大宋王朝开始逐渐丧失创造力,因为宋朝的理学的本质就是考据学,因此从宋朝朱熹之后的八股考试,完全扼杀了我们的创造力,因为他在搞考据。一千年之后的今天,我们还在搞考据,那我们的创造力在哪里?丧失创造力的当儿,你可想象到我们企业的发展一定是困难重重。在文化的束缚之下,你是浮躁的,你是喜欢投机取巧的,只有打破这个束缚你才能发挥创造力。”
有时候在想,现代中国人更是急功近利,普遍都喜欢投机取巧,所以现在中国没有多少好的成果。试想一下,当年原子弹没得引进,“两弹一星”是何其辉煌啊!现在有得引进的呢,像汽车,像软件业,做得怎么样呢?也许要等整个中国环境安定下来,中国人都踏踏实实,中国才会更快更好地发展!
PS:想看原文的话可以进入这里。
你的大学是怎么过的?
现在有多少人敢说自己的大学时光过得很充实呢?大学生活有相当一部分人是过得很糜烂的,也许这些人会在大三、大四时感受到一丝慌张,但也许晚了些了。年年都有新闻报道说百分之多少的大学生找不到工作而呆在家啊之类的云云,今年更是雪上加霜,金融危机的席卷让我们这些本科生变得更加难以“出售”!我不是什么砖家,我也没那么大的能耐,没有办法去分析这背后的根本原因,我只是在说自己的想法。年年有人一毕业就失业,这并不罕见,很多人把这个责任归根于我们的教育制度。这不假,我们的教育太过于喜欢理想化了,而且更大的“成就”在于扼杀学生的创造力。呵呵,中国老是在强调民族的创造力有多重要,却不知道中国人的创造力大部分在刚上幼儿园的时候就被那些老师给否定掉了。
但是,有多少人能反转一下角度来审判一下自己呢?大学四年,自己究竟学到了多少东西?对于一部分人来说,大学的四年是快乐的,因为高考结束了,很多人以为凭着大学的一纸文凭就是高人一等了,这社会需要什么,需要人才,需要能力,唯独不需要虚无的文凭。当然,“天才都不是科班的,可是不是科班的,却连龙套也跑不了”。
也许很多人并不赞成我的看法,毕竟这社会存在许多的阴暗面。也许社会就是这么不公平,但是我们整天埋怨又有什么用呢,还不如都静下心来,让自己在四年大学光阴中得到更多。我们都没有改变社会、改变制度的能力,我们也没有关系,没有背景,我们唯一能做的就是先改变自己的心态,不要陷入“读书无用论”的怪圈。四年过去了,是能人还是废物,也许就在这时候开始凸现了。
24块固态硬盘联手狂飙
固态硬盘可以有多疯狂?三星近日找来一批玩家,将24块512GB三星固态硬盘装在一套系统内,组成了总容量达6TB的RAID阵列,其速度只有让人咂舌的份儿。试验在Intel的Skulltrail V8双路平台上进行,配置包括两颗Core 2 Extreme QX9775四核心处理器、两块Radeon HD 4870 X2显卡、4GB DDR2-800 FBDIMM内存、两个1000W电源等。为了提供所需24个SATA接口,使用了六个SFF-8087转接头,每个都能将SAS接口转成四个SATA接口,同时由六个MOLEX负责供电,每个支持四块固态硬盘。在经过24个小时的奋战后,系统终于组建完毕,并顺利启动。其中一位仁兄显然有点儿紧张,在一旁拿着灭火器待命。接下来就是极致性能演示了:1、数据传输率超过2010MB/s,也就是2GB/s以上。2、打开六个Word文档只需0.5秒钟。3、打开53个不同程序呢?18.09秒。4、碎片整理不过弹指一挥间的事儿。5、删除总计5.6GB的700个文件根本无需等待。6、把DVD光盘从二楼扔下去和将700MB DVDRip内容复制到硬盘上哪个更快?0.8秒钟,几乎同时。7、在1920×1200分辨率和最高纹理质量下玩《Crysis》轻松异常。8、一只手拎着工作中的24块固态硬盘跳啊跳,没有任何影响。
关于类与对象的一些心得
我们都知道虚函数为多态的实现起了关键作用,没有虚函数,多态也无从实现了。但是虚函数到时候是怎么做出来的呢,C++编译器是怎么达到动态绑定的目的的呢? 其实C++编译器会建立一个虚函数表,每一个含有虚函数的类,编译器都会为它做出一个虚函数表,表中的每一个元素都指向一个虚函数的地址,这样在执行期就可以间接调用实际上想要绑定的函数了。此外,编译器还会为类加上一个成员变量,是一个指针,用来指向该虚函数表的(那指针常被称为vptr)。下面是一个例子: class a{ public: virtual void vfunc(); public: data; }; 这样的话a对象实例在内存中占据这样的空间: |
顺序容器迭代器的失效
一般说来,会修改容器的内在状态或移动容器内的元素的一些容器操作,会使所有指向被移动的元素的迭代器失效,也可能同时使其他迭代器失效。使用无效迭代器是没有定义的,可能会导致与悬垂指针相同的问题。
对于vector容器,当我们在容器中添加元素时,因为可能会导致整个容器的重新加载,这样的话,该容器涉及的所有迭代器都会失效。即使需要重新加载整个容器,指向新插入元素后面的那个元素的迭代器也会失效。
而对于deque容器,在其首部或尾部插入元素不会使任何迭代器失效,而在首部或尾部删除元素则只会使指向被删除元素的迭代器失效。在deque容器的其他位置的插入和删除操作将使指向该容器元素的所有迭代器都失效。
erase、pop_front和pop_back函数会使指向被删除元素的所有迭代器失效。但swap虽然可以交换两个容器内的所有元素,但是该操作不会删除或插入任何元素,而且保证在常量时间内实现交换。由于容器内没有移动任何元素,因此迭代器不会失效。
总的说来,任何insert和push操作都可能导致迭代器失效。当编写循环元素插入到vector或deque容器中时,程序必须确保迭代器在每次循环后都得到更新。
关于选择顺序容器的提示(摘自C++ primer)
下面列举了一些选择容器类型的法则:
(1)如果程序要求随机访问元素,则应使用vector或deque容器。
(2)如果程序必须在容器的中间位置插入或删除元素,则应采用list容器。
(3)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则应采用deque容器。
(4)如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑在输入时将元素读入到一个list容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器。
如果程序既需要随机访问又必须在容器的中间位置插入或删除元素,那应该怎么办呢?
此时,选择何种容器取决于下面两种操作付出的相对代价:随机访问list容器元素的代价,以及在vector或deque容器中插入/删除元素时复制元素的代价。通常来说,应用中占优势的操作(程序中更多使用的是访问操作还是插入/删除操作)将决定应该选择什么类型的容器。
决定使用哪种容器可能要求剖析各种容器类型完成应用所要求的各类操作的性能。
最佳实践:如果无法确定某种应用应该采用哪种容器,则编写代码时尝试只使用vector和list容器都提供的操作:使用迭代器:使用迭代器,而不是下标,并且避免随机访问元素。这样编写代码,在必要时,可很方便地将程序从使用vector窗口修改为使用list容器。
对于vector容器的一点心得
为了使vector容器实现快速的内存分配,其实际分配的容量要比当前所需的空间多一些。这样的话,并不是每次添加元素时都需要生分配容器。这样效率自然比较高。这就是用空间换时间吧。vector类有两个成员函数:capacity和reserve,使程序员可与vector容器内存分配的实现部分交互工作。capacity操作获取在窗口需要分配更多的存储空间之前能够存储的元素总数,而reserve操作则告诉vector容器应该预留多少个元素的存储空间。这里先要弄清楚capacity和size的区别,size指的是容器当前所拥有的元素的个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。这样的话,如果size不超过capacity的话,容器就不用分配新存储空间。通常size是少于capacity的。reserve操作可以增加容器预留的存储空间,但要注意,不可以减少容器原本已经预留的存储空间,只能增加。
总的来说,比起list和deque容器,vector的增长效率通常会更高。但如果在内存分配比较严格的情况下,选用list容器可能会更好一点,毕竟list容器是采用链表的存储方式的,空间利用比较有效,当然,在读取的时候效率肯定是会比较低的。
输出指向字符串的指针的地址
如果因某个原因要输出指向字符串的指针保存的地址,就必须交它显式强制转换为void*类型,这样就会调用ostream中带有该参数类型的成员函数,将地址发到流中。
const char *pMessage = "abc";
cout <<>(pMessage);
C++中重载和使用增量运算符(++)时应注意的事
假如a为int类型,初始值为10。经过++(++)a和(a++)++后的值为多少呢?我想很多人应该会回答是14。错了,应该为13。而且可能编译通不过。因为前递增运算(++a)返回的是对象引用,而后递增运算(a++)采用值返回。这样的话(a++)++就是错误的了,因为a++返回的不是左值,不能再进行递增运算。 }; |
sizeof()有趣的地方
int j = sizeof(i++);
int k = sizeof(i+0.1);
printf("%d %d %d", i, j, k); // 输出为 1 1 8,因为i++并不真正计算,sizeof只关心输入的数据类型,i+0.1被提升为double











