blueyi's notes

Follow Excellence,Success will chase you!

本文不会像其他笔记那样详细讲解每一个步骤和问题,最近太忙,没有太多时间,突击学习一下,记录下遇到的一些问题,但依然会像其他笔记一样授之以渔。仅针对C++,OpenCV2,假如你没学习过官方提供详细支持的编程语言,例如C/C++/python,建议还是先学一门编程语言再来学习OpenCV吧。看到网上有教程竟然讲OpenCV时还讲起了C语言。
强烈推荐参考官方手册,官方的doc简直太棒了:http://opencv.org/documentation.html,即能下载PDF,又能在线查看,还有详细的tutorial,以下多数问题的解决来源于查看官方的Reference Manual:http://docs.opencv.org/2.4/opencv2refman.pdf

Read more »

关于环境配置

网上有一大堆这样那样的方法,官方有详细且简单的教程,为什么要舍近求远呢,甚至有些书上还义正言辞地认为自己的配置方法非常好,其实他自己都不清楚为什么需要那些步骤,官方教程的windows配置方法:http://docs.opencv.org/3.0-last-rst/doc/tutorials/introduction/windows_install/windows_install.html

Read more »

网上关于KVM的简单使用教程有很多,但通常都是通过桌面的方式进行管理和使用,而且大部分教程中都忽略了很多重要的细节,且应用场景都较为简单。本文提供的教程主要用于有多人需要大量的虚拟机使用需求,要能够让大家非常方便地随时创建和删除虚拟机,支持通过SSH进行连接,同时支持通过VNC进行远程虚拟机桌面的连接(安装虚拟机系统时肯定需要,当然服务器带桌面例外)。当然如果使用OpenStack会方便很多,但毕竟Openstack配置非常复杂,其实采用KVM的初衷就是为了将来迁移到Openstack做个过度。

Read more »

虽然现在都流行TL;DR,但还是一如继往地授之以渔,虽然看似很长,其实非常简单,更多的内容是在讲原因。不仅适用于ubuntu系的系统,手动安装方式同样可类似地用于其他系统。无法就两步:下载并解决JDK,配置环境变量。

Read more »

超大整数的表示及四则运算,大家的多数方法是采用字符串表示超大整数,然后再根据竖式计算的原理进行计算。例如12345678 + 87654321,就是两个字符串,然后将这两个字符串中的各个位取出来右对齐后进行一位位相加,如果有进位就考虑进位的问题,例如这里至少需要相加8次,如果最高位有进位,就是9次。
这里采用的方法相当于采用10^n进制来存储超大整数,例如12345678,如果按10000进制来存的话(因为这样的两个最大数相乘刚好不会超过10^9,可用用int32存),就是存成[1234,5678],两个整数,这样的话,只需要相加2次就可以了,而且进位的计算也最多只需要2次。相比字符串,当整数超大时,时间复杂度会降低很多。下面的实现中采用的是vector来存储的,由于加入了时间统计及DEBUG,所以看上去代码略多。
由于最近太忙,只实现了加、减和乘,除等以后有时间了再,下面是完整的代码,也不整理了,注释比较少,优化空间也很大,等以后有时间了再整,留个备注

Read more »

首先明确C++中引用或指针的动态类型(dynamic type)与静态类型(static type)可以不同是C++支持多态性(polymorphism)的根本所在。
四个概念:

  • 静态类型:就是对象声明时采用的类型,一旦确定就无法更改,编译期已经确定
  • 动态类型:通常是指一个指针或引用在调用时所指向的类型,可以理解为赋值号右侧对象的类型(当然采用直接赋值就是括号中的对象的类型),可以在运行时更改,在运行期决定
  • 静态绑定(static binding):又名前期绑定(early binding),绑定的是对象的静态类型,发生在编译期,即程序编译完成后就已经确定
  • 动态绑定(dynamic binding):又名后期绑定(late binding),绑定的是对象的动态类型,发生在运行期,即在运行期由当前的动态类型决定所需要调用的函数或属性
Read more »

fork

Linux多进程编程中的可以使用fork函数来创建子进程。fork函数定义在头文件unistd.h中(uni表示unix,std当然是标准库,所以很好记),该函数的声明为pid_t fork(void)其中函数的返回值类型为pid_t,可以理解为一个整型,返回值具体为:

  • 在父进程中,fork返回新创建的子进程的进程ID;
  • 在子进程中,fork返回0;
  • 如果创建子进程失败,则返回一个负值

具体创建的子进程与父进程的关系,很显示fork函数不能接受任何参数,它只简单地将父进程的几乎所有资源全部复制给子进程,然后就相当于父进程的一个副本运行,且无法与父进行共享数据。
具体 来说使用fork函数得到的子进程从父进程继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
子进程与父进程的区别在于:

  • 父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
  • 各自的进程ID和父进程ID不同
  • 子进程的未决告警被清除;
  • 子进程的未决信号集设置为空集。
Read more »

Linux下链接分两种,即硬链接(Hard link)和软链接(Symbolic link)。当然windows下面也有软链接、硬链接之分。
为了区分硬链接和软链接,首先需要清楚Linux系统中一切皆文件,文件由两个部分组成:用户数据,即数据块和元数据,即保存文件附加属性的数据(文件大小、创建时间、inode等)。Linux系统下的同一个文件系统中,每个文件都有一个唯一的inode(索引结点)号,inode才是文件的唯一标识,在访问文件时实际上都是通过inode号来访问文件的实际数据块。
硬链接和软件链接在访问时都共用一个目标数据块,主要区别就是每个硬链接相当于一个是一个指针,该指针指向同一个inode号,只要一个文件有任意一个硬链接存在,那么该文件就可以直接通过文件的硬链接访问,也就是说当删除一个硬链接时,并不影响其他硬链接来访问文件,硬链接本身并没有单独的inode号,同一个文件的硬链接都共用一个inode号只是文件名不同,甚至可以理解为我们在linux中使用ls看到的文件本身也就是某个数据块的一个硬链接。所以当使用mv命令移动这些硬链接时,并不影响对文件的访问,因为inode都一样。
而软链接即符号链接,软链接本身就是个独立的完整文件,相当于windows下的快捷方式,有自己的inode号,只是在访问该软链接时,会被转发为访问其链接到的实际文件,当删除软链接时,并不影响实际文件,甚至删除所有的软链接对实际文件也没有影响。当删除或移动实际文件时,都将无法通过软链接访问到该文件。

Read more »
0%