写一些杂的东西和近期的计划
总体目标:
待写
2014-0401
这几个语言都需要好好学
python+shell学的精一点
然后php接触些
然后java了解些
工作以后也得多学习啊
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2012-1126
每天看到算法,锻炼思维
近期目标:
学习linux,linux基本命令,shell编程,linux程序设计,makefile
学习C/C++的一些更加基础原理性的东西,看完《C++应用程序性能优化》
学习,并行程序设计,openMP,MPI
2012-1127
一:看sql复习,看下会不会
http://www.cnblogs.com/xuxu8511/archive/2012/03/23/2414230.html
二:看《C++应用程序性能优化》的第一章,到P40页
三:看这篇博客http://www.cnblogs.com/xuxu8511/archive/2012/10/07/2714025.html
总结小记:静态成员函数与一般成员函数的唯一区别就是没有this指针,因此不能访问非静态数据成员
算法设计时,如果能事先知道所处理数据的范围大小,这是很关键的信息,否则所处理的数据的范围未知或者范围太大。如果范围不大,很多时候可以以空间换时间,比如建立一个hash表。比如这个题已知有一串由字母组成的字符串,求这个串中第一个,只出现一次的字母。可以遍历两边,第一次,统计256个字符(256的一个hash表)每个字符出现的次数,第二次找出第一次只出现一次的字符。
2)类的普通成员、静态成员函数是不占类内存的,至于你说的函数指针在你的类中有虚函数的时候存在一个虚函数表指针,也就是说如果你的类里有虚函数则 sizeof(CObject)的值会增加4个字节。其实类的成员函数 实际上与 普通的全局函数一样。
只不过编译器在编译的时候,会在成员函数上加一个参数,传入这个对象的指针。
成员函数地址是全局已知的,对象的内存空间里根本无须保存成员函数地址。
对成员函数(非虚函数)的调用在编译时就确定了。
像 myObject.Fun() 这样的调用会被编译成形如 _CObject_Fun( &myObject ) 的样子。所以同一项目工程下的两个cpp文件,如果定义了两个同名的类,那么他们的构造方法可能会混乱,尤其后编译的类可能会调用先前编译的同名类的够着方法,这是因为如前面所讲,他们在内存中代码区编译的函数最终名字一样
函数是不算到sizeof中的,因为函数是代码,被各个对象共用,跟数据处理方式不同。对象中不必有函数指针,因为对象没必要知道它的各个函数的地址(调 用函数的是其他代码而不是该对象)。
类的属性是指类的数据成员,他们是实例化一个对象时就为数据成员分配内存了,而且每个对象的数据成员是对立的,而成员函数是共有的~
静态成员函数与一般成员函数的唯一区别就是没有this指针,因此不能访问非静态数据成员。总之,程序中的所有函数都是位于代码区的。
2012-1128
一:昨天没完成的继续,看书到40页
二:改进tld算法,加入模板删除的策略
总结小记:静态变量和全局变量都必须初始化,如果人不初始化则,系统会自动初始化为0。局部变量就必须初始化,系统不会。
跟在变量后边的赋值语句叫做初始化,不能分开,初始化时和声明放在一块的,
int a=0;
和int a;a=0;这两个代码意思不一样,上面那个我们有初始化,下面这个没有,如果是静态变量static int a=0;和static int a;a=0;就更不一样了
使用cd进入磁盘目录的步骤,比如要进入E:\workplace\vs2010\mianshi\mianshi则,先输入E:进入到E盘,然后输入E:\workplace\vs2010\mianshi\mianshi就能进入到具体的路径了
构造函数中调用了虚函数时的情况,则子类即使覆盖了那个虚函数,调用父类的构造函数时使用的虚函数还是父类的。
20121209:
1:问题计算机组成原理的,补码的加减乘除法:
2:研究printf函数可以学到很多东西,首先printf是一个可变参数函数,说到可变参数函数,又涉及到_cdecl_这个关键字;
_cdecl 是C Declaration的缩写,表示C语言默认的函数调用方法:所有参数从右到左依次入栈。这里什么意思呢,从右到左就是说比如调用f(2,3)时,我们输入了实参2和3,这里又涉及到函数调用时都是传值的知识(在C中这里是使用=运算符实现,C++中,如果传入的是一个类的实例,即对象,那么是调用拷贝构造函数,而C++类中可以分别对=号和拷贝构造函数定义,所以这是有区别的,我们也可以认为对于普通数据类型,=和拷贝构造函数是等价的,但C++类中没有自己定义拷贝构造函数,那么编译器会默认一个位拷贝为拷贝构造函数(这个位拷贝只是一个浅复制,对于一些有二级指针的,只是把一级指针地址复制一份,所以此时多个类实例可能回共享一片内存(比如数中那个释放cach的例子))先把3入栈,再把2入栈。依据栈这个数据结构的特性,当传给f(int a,int b){这里面的a,b实际上是f函数的局部变量,当我们把输入的实参值都入栈后,执行f的函数代码时,要“复制”出来到a和b,值传递},首先是把2出栈赋给a,然后把3出栈赋给b;所以这个也决定了,默认形参为什么只能在最右边。当赋值完,没得可赋了,就使用了默认形参,实际上我们可以认为默认形参赋值在前,只是当我们给了值后,会再赋一遍。说到这,又要说说C++中临时变量的问题了,return语句中的变量或者值,也会产生一个临时变量。当返回给调用者后才会销毁。所以这里其实也有个赋值的过程,不管最后return什么,比如return a,a是f里定义的一个局部变量。return时也会产生一个线程栈内存上的临时变量temp把a的值复制到temp上。
所以显而易见,实参那些值传入到内存以后都是连续的,因为是从右到左依次入栈的。
明天再复习下书上关于那两个地方的临时变量的问题,都复习下吧。
复习结果:实参入栈的过程,就是把实参复制一份给形参的过程,不是说先入栈,再出栈,这里的内存栈的概念不是我们一般所说,或者说这里内存栈的概念并不是用于我们给实参赋值所用的。是内存分配释放的过程,因为栈内存会自动分配和释放,释放时后分配的先释放。
3.可变参数是因为,所有参数都会从右到左依次进栈。最低位是第一个固定参数,然后接着可变参数。printf函数的参数也是传值。
20121210
1:看书看完到P110,讲常用数据结构性能分析;
2:对于类的大小,当类继承了多个类时,此时还是只有一个虚函数列表吗?实践证明不是,实际情况是继承了几个含有虚函数的类,就会有几个虚函数列表,所以看的好几个贴说每个类只有一个虚函数列表是错的,再次证明别人说的不一定绝对的对,可能是有前提的,不管是作者没说清还是作者本来就不知道,还是作者的东西本来就是别处胡乱粘贴来的。自己多个心眼,实践是检验真理的唯一标准;
3:还有一个对于有虚拟继承时类的大小,好像此时会更大,会多一个虚拟指针。这和虚拟继承的原理有关,实际上虚拟继承的原理就是用这个虚拟指针实现的;
普通成员函数和虚函数的调用方式是不一样的,具体可见我的笔记本上;
4:普通继承,子类的虚函数加在第一个父类的虚函数表后面,然而虚拟继承的话,子类的虚函数不会加在父类的虚函数表后面,而是另外开一个,因为,虚拟继承时,父类的数据都会放到子类实例内存快的尾部,而且还会有一个虚拟指针。所以如下代码就不难理解了:
class za
{
int a;
virtual void fa();
};
class zc:public virtual za
{
virtual void fc();
};
sizeof(za)的大小是8,sizeof(zc)大小是16,因为首先zc要把所有za的数据放在尾部,然后还要有一个指针,指向这个尾部,然后zc自己的虚函数也不加到za后面,而是由他自己的虚函数列表指针。所以大小是16.
不过如果像下面这种情况
class za
{
int a;
virtual void fa();
};
class zc:public virtual za
{
virtual void fa();
};
子类对所虚拟继承的父类,有虚拟函数的覆盖,此时将照样覆盖,所以像上面zc将不再有他自己的虚拟函数列表指针,所以sizeof(zc)=12。
另外:本来子类的虚函数是写在第一个父类的虚函数列表里,但是当第一个父类是虚拟继承的时候,这时候应该是写在第二父类后,所以确切说是写在第一个非虚拟继承的父类的虚函数列表后。
而且子类对父类的覆盖,父类中所有的同名的虚函数都会覆盖,所以比如,b1类和b2类都虚拟继承自a类,且a类有个虚函数f(),而且b1和b2都进行了覆盖,此时如果有C类继承了b1和b2类,语法会出现错误,说a类的f重写不明确,但是如果C类的成员里又定义了f(),即对f又进行了重写,就不会报错了。如果b1和b2都普通继承自a,什么问题都没有C中不重写也不会报错,因为他们的内存不冲突,存储在内存的不同位置,我们称为隐藏。
2:如果b1是虚拟继承a,b2是普通继承a,C类继承了b1,b2,且重写了f(),那么b1里的和b2里的都会重写。b1,b2都是普通继承,也都会重写。b1类的f和b2类的f都会重写,会重写两遍。
按照C++的语法,无论怎么样(无论是base1还是base2),如果想用父类类型的指针调用子类的成员函数,都会出现编译错误,即使是这个父类指针指向了子类的实例。这需要使用dynamic_cast来转型后才行。所以说,虽然父类对象可以指向子类实例,但父类对象能调用的是父类对象中有的成员函数,多态。
memcopy和memmove 区别(另strcpy(), strncpy()和memset())
memmove:对于这个应用很好,比如要把数组中a[k]以后的数都往后移一位,这时候可以用memmove,但是memcopy不行,但是往前移动,两者都行。实验验证。
20121214:
1:编写快速排序;
2:看白话经典算法一道题,看剑指offer一道题;
3:看C++应用程序性能优化 20页;
4:看Linux应用开发技术详解 的第3章;
5:以后待学的,hadoop,把单词统计跑起来,学习;
6:程序从编译到运行过程,每阶段都干什么,代码中的每部分都分别对应于哪个阶段;
7:学习一种脚步语言;
8:C++中运算符重载的规则和范例;
实验:
一:
int am[6]={1,2,3,4,5,6};
memmove(am+3,am+2,3*sizeof(int));//从am[2]往后移动4个字节,移动大小是12个字节。
for(int i=0;i<6;i++)
cout<<am[i]<<" ";
cout<<endl;
am变成了1,2,3,3,4,5
此时如果使用memcpy函数,am变成1,2,3,3,3,3.这明显不是我们想要的。
二:
int am[6]={1,2,3,4,5,6};
memmove(am+1,am+2,3*sizeof(int));//从am[2]往前移动4个字节,移动大小是12个字节。
for(int i=0;i<6;i++)
cout<<am[i]<<" ";
cout<<endl;
am变成了1,3,4,5,5,6
此时如果使用memcpy函数,am变成1,3,4,5,5,6.结果一样
总结:1:memmove完全可以替代memcpy;2:对于从后往前移动,两个函数都可以,从前往后移动,memmove可以,memcpy不可以。
20121215
vs2010里,全局内存,堆内存大小都可以申请接近2G。windows 32位的系统下,进程的地址范围可以从0x00000000到0xFFFFFFFF,系统将低区的2GB留给进程用,高区的2GB留给系统用。所以vs里,全局变量,堆内存,最大可以申请的内存是2GB,由于还有一些其他的会占用一些空间,所以真实情况可能不到2GB,但是栈内存最大能申请1MB。
Linux下,系统把4GB内存里的高位1GB留给内核使用,低位的3GB留给进程用户代码使用。
20121216
vs下各个cpp文件,定义在每个cpp文件里的全局变量,占用的是全局内存,每个cpp中的全局变量不能重名,因为它们都是全局的,有效期是整个程序,只是由于编译时每个cpp是单独编译的,如果没有在每个cpp前面声明我们所要用的全局变量,却在cpp的后面使用了某个全局变量。理论上说每个cpp定义的全局变量,对所有cpp都是可见的,但是编译时如果没在当前cpp里声明,则编译器很笨的会报错,所以我们只要在前面重新声明遍,加上关键字extern FILE *out;比如在1.cpp中我们声明了全局变量FILE *out=fopen("f:\\out.txt","at");同时进行初始化了,不是让系统默认的初始化为0,此时虽然main()里没有调用到1.cpp里的函数,但是由于FILE *out=fopen("f:\\out.txt","at");是全局,所以在编译时就已经分配了。在含有main()函数的cpp文件2.cpp里我们只要extern FILE *out;告诉编译器out的定义在别的cpp文件里,编译时就不会报错了,运行时调用out全局共享。
二叉排序树和堆都可以用数组实现,二叉排序树和堆又可以用于排序,尤其是堆,有堆排序,我们可以用就在所要排序的数组上建一个堆,即把要排序的数组本身建立为一个堆,而不是说把要排序的数组的所有元素都放入一个堆容器,利用这个容器然后再进行排序。减少中间步骤,甚至脱离二茬排序树和堆的概念,来看堆排序到底做了什么
2013年1月4日
目标:注册为opencv开源项目的成员,提提bug;比如matchTemplate方法,如果只是用来计算两个模板的相似度,这时候源代码里还是会用来计算卷积,导致,比不计算卷积都慢,其实计算卷积的作用是对于遍历所有点都要计算相似度时有一个加速的效果。卷积加速的理解:现在有一副图像320*240(宽*高),我首先会把该图像分为很多歌网格,(如果网格大小固定为10*10,则总共有310*230个网格)我要计算所有这些网格每个网格包含每个像素的value值之和,假设是灰度图,每个点的颜色信息只有一个值。方法一:比较不好的,对每个网格,遍历所有像素点求和;方法二:先计算每个点到左上角那个点组成的这么个方格的里的像素值之和,计算这个值的时候的工作量是O(320*240)只要遍历图像上的像素点一遍就可以得到,工作量并不大。然后比如我们要就算(x0,y0)到(x1,y1)这个方格的像素值之和S((x0,y0),(x1,y1))=S((x1,y0),(0,0))+S((x0,y1),(0,0))-S((x0,y0),(0,0)),而这几个值已经在上面遍历一遍的时候得到,不用再去遍历像素点了,直接取就可以了。方法二明显快。我觉得这应该和卷积的思想是一样,还有求图像上每个方块的方差均值的时候,先求整个图像的一次积分和二次积分也是这个道理。当我们要求一批量的值的时候,我们可以把它们都会用到的一些值先求出来,尽管可能对于某一个个体来说有些浪费,但是对于整体计算却是很有意义,可以减少重复计算。很多算法中减少重复计算的思想都可以用这招,先退一步,把问题扩大。所谓退一步海阔天空,从长远来看问题,而不是说计算某一个值我先算那些不是浪费么,而没想到我们计算一遍以后接下来很多操作都可以用到。这体现在社会公共设施的建设也是这个道理,如果为某个人而去建立某个公共设施我们觉得浪费,当这个公共设施可以为公众全都所用,这时候反而可以减少社会上的一些单兵作战时导致的对某一资源浪费,没有重复利用。
udf使用前一定要单独测试,在pig -x local上自己用数据测。爬iosapp信息的已经完成。跑用户对游戏的兴趣,只要输入用户使用app的信息,和app的tag,就可以输出用户对每个tag的兴趣;首先已经从daliylog里跑出了3天数据,可用来测试,游戏tag也有。代码在我的名字目录下gameana。下面还有一个跑布尔模型的代码,该代码有两个方案,一个是纯pig,一个是udf,对umid做分组,把用户所有app使用信息这个bag输入到一个udf处理。
学习机器学习和数学http://leftnoteasy.cnblogs.com/
- linux下:
- ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序。
- ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程。
- ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。
- ctrl-/ 发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件。
-
- Key Function
- Ctrl-c Kill foreground process
- Ctrl-z Suspend foreground process
- Ctrl-d Terminate input, or exit shell
- Ctrl-s Suspend output
- Ctrl-q Resume output
- Ctrl-o Discard output
- Ctrl-l Clear screen
-
-
-
- 用stty -a看看终端配置。
-
vim快捷键
跳转:
0(数字) :跳到行首
$ :跳到行尾
gg :跳到页首
G :跳到页尾
行数(123) -> shift+g :跳到指定行
大小写转变:
g~iw 切换当前字的大小写
gUiw 将当前字变成大写
guiw 将当前字变成小写
缩进:
>> 将当前行右移一个单位
<< 将当前行左移一个单位(一个tab符)
== 自动缩进当前行
gg=G 全文自动缩进
删除复制粘贴:
dd 删除光标所在行
dw 删除一个字(word)
x 删除当前字符
X 删除前一个字符
D 删除到行末
yy 复制一行,此命令前可跟数字,标识复制多行,如6yy,表示从当前行开始复制6行
yw 复制一个字
y$ 复制到行末
p 粘贴粘贴板的内容到当前行的下面
P 粘贴粘贴板的内容到当前行的上面
]p 有缩进的粘贴,vim会自动调节代码的缩进
ibus输入法的图标有时会显示不出来,有时启动后就没有这个图标的显示,注销并重新登录该图标一般就可以出现。
但是感觉如果为了一个ibus输入法框就注销重登录,实在有点小题大作了,只重启ibus应该就可以了,于是网上查重启ibus的方法。经查询大致有两种方法:
1. 杀死ibus进程,然后再次启动
killall ibus-daemon
ibus-daemon -d
2. 杀死ibus进程,然后再次启动
ibus-daemon -d -x -r
可以重新启动和启动ibus daemon图标
两种方法,比较起来,自然是第二种方法更好,直接粗野的杀死进程总是不安全的。