2012年5月

find+*的问题

不久前做移植的时候想把某个目录下的C文件都找出来,然后拷贝下,结果一直报错,我用的是*.c作为pattern。今天看论坛的时候知道为什么了。

$ ls

test2.c  test.c  test.txt

目录下有两个.c文件,还有一个.txt文件

$ find . -name *.c

error : find: 路径必须在表达式之前: test.c
用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

$ find . -name *.txt

./test.txt

$ find . -name "*.c"

./test2.c
./test.c

原因:

若是不加引号 $ find . -name *.txt 成功,而不加引号的 $ find . -name*.c 出错了,得看看shell是怎么执行这句话的,首先shell读到了 *.txt 和 *.c,因为 * 是shell认为的meta (理解为特殊字符),所以就先解释*txt 先执行成 test.txt,传递给find,find就去执行自己的操作,根据pattern发现符合要求。而 *.c 被shell翻译成了test.c和test2.c,这时候命令就变成了 find . -name test.c test2.c 这就出错了!因为find -name 选项后面只能支持一个文件的搜索。所以对于test2.c是前面没有选项,就报错了!

对于有引号的 find . -name "*.c",shell读到"*.c"的时候,会当作参数处理,传递给find,find之后会自己处理 *.c,可以查看 man find ,里面有

The metacharacters (`*', `?', and `[]') match a `.'

小议回车和换行

最近写一个网络分析的玩意,用RAW_SOCKET从网卡上面直接取出数据帧,然后解析,为了就是找出tftp包。解析到数据内容的时候,把数据写出到文件里面,是用fprintf()直接写进去的,结果发现每次自己生成的文件都比原来的文件大。比如原文件是100bytes,获取到的文件可能是108字节。

先用diff 查看,发现竟然每行都显示不同,可是我进去vim编辑的时候,看上去都是一样的。

 hexdump  -C 查看,总算知道不一样的地方了。

linux上都是以‘\n’来表示换行的,ascii码是0A,表示LR,netascii表示数据都是以成行的ASCII码字符组成的,以两个字节---回车字符后换行(CR/LF,0D/0A)表示行结束。这两个行结束的字符在这种格式和本地主机使用的行定界之间进行转化。而octet则将数据看作8bit一组的字节流而不做解释。

CentOS 相关服务

daemon和service没什么大的区别,基本上可以等价。

daemon的分类


1.stand_alone


这些服务常驻内存里面,随时能迅速响应客户端的要求。比如www服务(httpd),FTP的daemon的(vsftpd)。

stand_alone的启动方式:linux上服务启动基本上的都是脚本启动比较多,脚本会对环境测试,配置文件的分析,以及管理服务,比如启动服务,重启服务,关闭服务,查看服务状态之类的。对于stand_alone的启动方式一般都在/etc/init.d/下面,这里面有很多系统服务启动脚本,可以进去用vim查看,发现有对于服务状态的控制和环境的测试,还有一点就是读取服务的配置文件,那么这些服务的配置文件在哪里呢?就在 /etc/sysconfig/ 下面,比如比较熟悉的网络配置文件 /etc/sysconfig/network,还有iptables的/etc/sysconfig/iptables相关的规则的描述。stand_alone服务启动一般都是以

/etc/init.d/xxx start|stop|restart|status

也可以是

service xxx  start|stop|restart|status

service 是一个脚本,它能帮用户分析所要启动的stand_alone脚本,,然后根据输入的参数去读取/etc/init.d/*下的脚本。

2。super daemon


与stanld_alone daemon不同的是super daemon。super daemon本身是一种stand_alone,只是它所调用的服务不是,它所调用的服务默认情况下不是驻留在内存中的,而是需要服务的时候再启动,把相应的服务加载到内存里。super daemon采取的是一种统一管理服务的形式,由一个daemon管理很多服务,这个daemon就是xinetd,有客户端需要连接的时候,xinetd就会去调用响应的服务,加载到内存去响应连接。我们可以查看/etc/xinetd.d/,下面的文件就是会被xinetd调用的服务文件配置,比如tftp,你可以用vim打开它,然后编辑相关的属性,重启xinetd就会重新读取/etc/xinetd.d/tftp文件。那么xinetd这个daemon在哪里呢?就在/etc/init.d/下面,前面说了,xinetd也是一个stand_alone类型的daemon,开机就启动。xinetd它也有它默认的配置文件,就是/etc/xinetd.conf,对于调用的服务,如果在/etc/xinetd.d/下面没有配置文件,就默认会以/etc/xinetd.conf的配置启动。所有xinetd调用的服务都由xinetd统一进行管理,

/etc/init.d/xinetd start|stop|restart|status 

matlab小程序

输入一个日期,输出是第几天

year=input('year : ')
month=input('month : ')
day=input('day : ')

year1=[31,28,31,30,31,30,31,31,30,31,30,31];
year2=[31,29,31,30,31,30,31,31,30,31,30,31];
%isloopyear=0
if mod(year,4)==0||(mod(year,4)==0 && mod(year,100)~=0)
    isloopyear=1
else
    isloopyear=0
end
sum=0
if isloopyear==1
    for n=1:month-1
        sum=sum+year2(n);
    end
else
    for n=1:month-1
        sum=sum+year1(n);
    end
end
sum=sum+day

gcc链接静态库和动态库

//hello.c
#include 

void print_hello()
{
	printf("HelloWorld ");
}

//main.c
#include 
#include "hello.h"

int main()
{
	print_hello();
        printf("%d",HELLO);
	return 0;
}

//hello.h
#define HELLO 9999
void print_hello();

其中 hello.c 和 main.c 在同一个目录下, hello.h在上一个目录。

先生成 xxx.o 文件
$ gcc hello.c -c ==> hello.o
$ gcc main.c -c ==> error : no hello.h
$ gcc main.c -c -I ../ ==> main.o -I 指定头文件的搜索目录( I 是大小的 i)
$ ls ==> hello.o main.o hello.c main.c

- 阅读剩余部分 -

ssh自动登入脚本

#!/usr/bin/expect -f

if { $argc < 3 } {
puts stderr "Usage: $argv0 IPAdress Login OldPasswd"
exit
}

set IPADDR [lindex $argv 0]
set LOGIN [lindex $argv 1]
set OLD_PW [lindex $argv 2]

set timeout -1 

#stty -echo

spawn ssh $IPADDR -l $LOGIN
expect {
    "*assword:*"  {
        send "$OLD_PW\r"
        exp_continue
    } "*ast login:*" {
        interact
        exit 0
    } timeout {
        send_user "connection to $IPADDR timeout!\n"
        exit 1
    } "*incorrect*" {
        send_user "password incorrect!\n"
        exit 2
    } "*ermission*" {  #for LINUX ssh
        send_user "password Error!\n"
        exp_continue
        exit 2
    } eof {
        exit 3
    }
}

使用方法 : ./my_ssh.sh192.168.156.10 root 123456

linux下RAW SOCKET

raw socket,即原始套接字,可以接收本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket

1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包

2.socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧

3.socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))过时了,不要用啊

理解一下SOCK_RAW的原理, 比如网卡收到了一个 14+20+8+100+4 的udp的以太网数据帧.

- 阅读剩余部分 -

bash编程中反引号

反引号(`   `):能把shell中一个命令的标准输出嵌入到原来的位置!也叫做是命令替换,于它等价的是$(cmd)

#!/bin/bash

ls -l /
`ls -l / | awk {print $5}`

看上面的脚本,第一个输出是正常的,第二个就不正常的,但是第三个也不正常了。

# ls -l / | awk {print $5}

这个命令能列出文件的大小,返回的值就是文件的大小,上面说了:反括弧的功能就是把里面的命令的标准输出嵌入到原来位置中,也就是说awk之后把返回的文件大小当作另一个命令来解释,所以会提示:

./test5.sh:行4: $'\346\200\273\347\224\250\351\207\217': 未找到命令
awk: cmd. line:1: {print
awk: cmd. line:1: ^ unexpected newline or end of string

再来看
#!/bin/bash

for file in `ls -l /home/fire`
do
        echo "$file"
done

看看脚本执行的过程:

对于反括弧里面的内容先执行,那么就是以 ls -l 列出所有文件信息,然后插入到原来的位置,这时,for 就开始对了`ls -l /home/fire`列出的文件信息当作列表,以 IFS = “空格” 进行分割,列出信息。

还有异议吗?再来看段代码:

#!/bin/bash
echo the time is $(date)
$(date)

第一个输出是正确的,第二个就错误了。原因还是上面的,把$(date)返回的时间值,插入到原来的位置,当shell解释的时候就是对时间值当作命令解释,所以就出错了!
./test5.sh:行4: $'2012\345\271\264': 未找到命令

总之对于反括弧或者$(),第一步就是执行里面的命令,把命令执行的标准输出插入到原来的位置,第二步就是执行替换后的语句!

ffmpeg+OpenCV Linux下安装和配置

前不久安装好了OpenCV,昨晚测试一个avi视频处理的时候,cvCreateFileCapture总是返回NULL,我怀疑是ffmpeg没有配置好。今天就把OpenCV和ffmpeg都删除了,重新安装了下!最好把旧版本都删除了!

ffmpeg安装


源码下载 : svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

文件配置 : ./configure - -enable-able-shared - -enable-gpl - -enable-swscale

安装 : make && make install

所有的库文件默认安装在/usr/local/lib 下, 所有的头文件安装在 /usr/local/include/lib*/下

测试 : ffplay a.avi

- 阅读剩余部分 -

linux shell 正则表达式(BREs,EREs,PREs)差异比较--<转>

正则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。这些是正则表达式的定义。 由于起源于unix系统,因此很多语法规则一样的。但是随着逐渐发展,后来扩展出以下几个类型。了解这些对于学习正则表达式。

一、正则表达式分类:

1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx  简称 BREs)

2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)

3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)

说明:只有掌握了正则表达式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法

二、Linux 中常用文本工具与正则表达式的关系

常握 Linux 下几种常用文本工具的特点,对于我们更好的使用正则表达式是很有帮助的

  • grep , egrep 正则表达式特点:

1)grep 支持:BREs、EREs、PREs 正则表达式

grep 指令后不跟任何参数,则表示要使用 ”BREs“

grep 指令后跟 ”-E” 参数,则表示要使用 “EREs“

grep 指令后跟 “-P” 参数,则表示要使用 “PREs”

2)egrep 支持:EREs、PREs 正则表达式

egrep 指令后不跟任何参数,则表示要使用 “EREs”

egrep 指令后跟 “-P” 参数,则表示要使用 “PREs”

3)grep 与 egrep 正则匹配文件,处理文件方法

a. grep 与 egrep 的处理对象:文本文件

b. grep 与 egrep 的处理过程:查找文本文件中是否含要查找的 “关键字”(关键字可以是正则表达式) ,如果含有要查找的 ”关健字“,那么默认返回该文本文件中包含该”关健字“的该行的内容,并在标准输出中显示出来,除非使用了“>” 重定向符号,

c. grep 与 egrep 在处理文本文件时,是按行处理的


  • sed 正则表达式特点

1)sed 文本工具支持:BREs、EREs

sed 指令默认是使用”BREs”

sed 命令参数 “-r ” ,则表示要使用“EREs”

2)sed 功能与作用

a. sed 处理的对象:文本文件

b. sed 处理操作:对文本文件的内容进行 — 查找、替换、删除、增加等操作

c. sed 在处理文本文件的时候,也是按行处理的


  • Awk(gawk)正则表达式特点

1)Awk 文本工具支持:EREs

awk 指令默认是使用 “EREs”

2)Awk 文本工具处理文本的特点

a. awk 处理的对象:文本文件

b. awk 处理操作:主要是对列进行操作


三、常见3中类型正则表达式比较
字符 说明 Basic RegEx Extended RegEx python RegEx Perl regEx
转义 \ \ \ \
^ 匹配行首,例如’^dog’匹配以字符串dog开头的行(注意:awk 指令中,’^'则是匹配字符串的开始) ^ ^ ^ ^
$ 匹配行尾,例如:’^、dog$’匹配以字符串 dog 为结尾的行(注意:awk 指令中,’$'则是匹配字符串的结尾) $ $ $ $
^$ 匹配空行 ^$ ^$ ^$ ^$
^string$ 匹配行,例如:’^dog$’匹配只含一个字符串 dog 的行 ^string$ ^string$ ^string$ ^string$
\< 匹配单词,例如:’\<frog’ (等价于’\bfrog’),匹配以 frog 开头的单词 \< \< 不支持 不支持(但可以使用\b来匹配单词,例如:’\bfrog’)
\> 匹配单词,例如:’frog\>’(等价于’frog\b ‘),匹配以 frog 结尾的单词 \> \> 不支持 不支持(但可以使用\b来匹配单词,例如:’frog\b’)
\<x\> 匹配一个单词或者一个特定字符,例如:’\<frog\>’(等价于’\bfrog\b’)、’\<G\>’ \<x\> \<x\> 不支持 不支持(但可以使用\b来匹配单词,例如:’\bfrog\b’
() 匹配表达式,例如:不支持’(frog)’ 不支持(但可以使用\(\),如:\(dog\) () () ()
\(\) 匹配表达式,例如:不支持’(frog)’ \(\) 不支持(同()) 不支持(同()) 不支持(同())
匹配前面的子表达式 0 次或 1 次(等价于{0,1}),例如:where(is)?能匹配”where” 以及”whereis” 不支持(同\?)
\? 匹配前面的子表达式 0 次或 1 次(等价于’\{0,1\}’),例如:’where\(is\)\? ‘能匹配 “where”以及”whereis” \? 不支持(同?) 不支持(同?) 不支持(同?)
? 当该字符紧跟在任何一个其他限制符(*, +, ?, {n},{n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,’o+?’ 将匹配单个”o”,而 ‘o+’ 将匹配所有 ‘o’ 不支持 不支持 不支持 不支持
. 匹配除换行符(’\n’)之外的任意单个字符(注意:awk 指令中的句点能匹配换行符) . .(如果要匹配包括“\n”在内的任何一个字符,请使用:’(^$)|(.) . .(如果要匹配包括“\n”在内的任何一个字符,请使用:’ [.\n] ‘
* 匹配前面的子表达式 0 次或多次(等价于{0, }),例如:zo* 能匹配 “z”以及 “zoo” * * * *
\+ 匹配前面的子表达式 1 次或多次(等价于’\{1, \}’),例如:’where\(is\)\+ ‘能匹配 “whereis”以及”whereisis” \+ 不支持(同+) 不支持(同+) 不支持(同+)
+ 匹配前面的子表达式 1 次或多次(等价于{1, }),例如:zo+能匹配 “zo”以及 “zoo”,但不能匹配 “z” 不支持(同\+) + + +
{n} n 必须是一个 0 或者正整数,匹配子表达式 n 次,例如:zo{2}能匹配 不支持(同\{n\}) {n} {n} {n}
{n,} “zooz”,但不能匹配 “Bob”n 必须是一个 0 或者正整数,匹配子表达式大于等于 n次,例如:go{2,} 不支持(同\{n,\}) {n,} {n,} {n,}
{n,m} 能匹配 “good”,但不能匹配 godm 和 n 均为非负整数,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}将配”fooooood” 中的前三个 o(请注意在逗号和两个数之间不能有空格) 不支持(同\{n,m\}) {n,m} {n,m} {n,m}
x|y 匹配 x 或 y,例如: 不支持’z|(food)’ 能匹配 “z” 或”food”;’(z|f)ood’ 则匹配”zood” 或 “food” 不支持(同x\|y) x|y x|y x|y
[0-9] 匹配从 0 到 9 中的任意一个数字字符(注意:要写成递增) [0-9] [0-9] [0-9] [0-9]
[xyz] 字符集合,匹配所包含的任意一个字符,例如:’[abc]‘可以匹配”lay” 中的 ‘a’(注意:如果元字符,例如:. *等,它们被放在[ ]中,那么它们将变成一个普通字符) [xyz] [xyz] [xyz] [xyz]
[^xyz] 负值字符集合,匹配未包含的任意一个字符(注意:不包括换行符),例如:’[^abc]‘ 可以匹配 “Lay” 中的’L'(注意:[^xyz]在awk 指令中则是匹配未包含的任意一个字符+换行符) [^xyz] [^xyz] [^xyz] [^xyz]
[A-Za-z] 匹配大写字母或者小写字母中的任意一个字符(注意:要写成递增) [A-Za-z] [A-Za-z] [A-Za-z] [A-Za-z]
[^A-Za-z] 匹配除了大写与小写字母之外的任意一个字符(注意:写成递增) [^A-Za-z] [^A-Za-z] [^A-Za-z] [^A-Za-z]
\d 匹配从 0 到 9 中的任意一个数字字符(等价于 [0-9]) 不支持 不支持 \d \d
\D 匹配非数字字符(等价于 [^0-9]) 不支持 不支持 \D \D
\S 匹配任何非空白字符(等价于[^\f\n\r\t\v]) 不支持 不支持 \S \S
\s 匹配任何空白字符,包括空格、制表符、换页符等等(等价于[ \f\n\r\t\v]) 不支持 不支持 \s \s
\W 匹配任何非单词字符 (等价于[^A-Za-z0-9_]) \W \W \W \W
\w 匹配包括下划线的任何单词字符(等价于[A-Za-z0-9_]) \w \w \w \w
\B 匹配非单词边界,例如:’er\B’ 能匹配 “verb” 中的’er’,但不能匹配”never” 中的’er’ \B \B \B \B
\b 匹配一个单词边界,也就是指单词和空格间的位置,例如: ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的’er’ \b \b \b \b
\t 匹配一个横向制表符(等价于 \x09和 \cI) 不支持 不支持 \t \t
\v 匹配一个垂直制表符(等价于 \x0b和 \cK) 不支持 不支持 \v \v
\n 匹配一个换行符(等价于 \x0a 和\cJ) 不支持 不支持 \n \n
\f 匹配一个换页符(等价于\x0c 和\cL) 不支持 不支持 \f \f
\r 匹配一个回车符(等价于 \x0d 和\cM) 不支持 不支持 \r \r
\\ 匹配转义字符本身”\” \\ \\ \\ \\
\cx 匹配由 x 指明的控制字符,例如:\cM匹配一个Control-M 或回车符,x 的值必须为A-Z 或 a-z 之一,否则,将 c 视为一个原义的 ‘c’ 字符 不支持 不支持 \cx
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如:’\x41′ 匹配 “A”。’\x041′ 则等价于’\x04′ & “1″。正则表达式中可以使用 ASCII 编码 不支持 不支持 \xn
\num 匹配 num,其中 num是一个正整数。表示对所获取的匹配的引用 不支持 \num \num
[:alnum:] 匹配任何一个字母或数字([A-Za-z0-9]),例如:’[[:alnum:]] ‘ [:alnum:] [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任何一个字母([A-Za-z]), 例如:’ [[:alpha:]] ‘ [:alpha:] [:alpha:] [:alpha:] [:alpha:]
[:digit:] 匹配任何一个数字([0-9]),例如:’[[:digit:]] ‘ [:digit:] [:digit:] [:digit:] [:digit:]
[:lower:] 匹配任何一个小写字母([a-z]), 例如:’ [[:lower:]] ‘ [:lower:] [:lower:] [:lower:] [:lower:]
[:upper:] 匹配任何一个大写字母([A-Z]) [:upper:] [:upper:] [:upper:] [:upper:]
[:space:] 任何一个空白字符: 支持制表符、空格,例如:’ [[:space:]] ‘ [:space:] [:space:] [:space:] [:space:]
[:blank:] 空格和制表符(横向和纵向),例如:’[[:blank:]]’ó’[\s\t\v]‘ [:blank:] [:blank:] [:blank:] [:blank:]
[:graph:] 任何一个可以看得见的且可以打印的字符(注意:不包括空格和换行符等),例如:’[[:graph:]] ‘ [:graph:] [:graph:] [:graph:] [:graph:]
[:print:] 任何一个可以打印的字符(注意:不包括:[:cntrl:]、字符串结束符’\0′、EOF 文件结束符(-1), 但包括空格符号),例如:’[[:print:]] ‘ [:print:] [:print:] [:print:] [:print:]
[:cntrl:] 任何一个控制字符(ASCII 字符集中的前 32 个字符,即:用十进制表示为从 0 到31,例如:换行符、制表符等等),例如:’ [[:cntrl:]]’ [:cntrl:] [:cntrl:] [:cntrl:] [:cntrl:]
[:punct:] 任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]这些字符集) [:punct:] [:punct:] [:punct:] [:punct:]
[:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F) [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:]

四、三种不同类型正则表达式比较

注意: 当使用 BERs(基本正则表达式)时,必须在下列这些符号前加上转义字符(’\'),屏蔽掉它们的 speical meaning  “?,+,|,{,},(,)” 这些字符,需要加入转义符号”\”

注意:修饰符用在正则表达式结尾,例如:/dog/i,其中 “ i “ 就是修饰符,它代表的含义就是:匹配时不区分大小写,那么修饰符有哪些呢?常见的修饰符如下:

g   全局匹配(即:一行上的每个出现,而不只是一行上的第一个出现)
s    把整个匹配串当作一行处理
m    多行匹配
i    忽略大小写
x    允许注释和空格的出现
U    非贪婪匹配


原文链接:http://archive.cnblogs.com/a/1847287/

配置服务器有误/usr/libexec/gconf-sanity-check-2 退出状态256

因为CentOS跑了近两个月,昨晚想让它休息下,就关机了。今早起来的时候就显示 /usr/libexec/gconf-sanity-check-2 退出状态256 。X-windows也进不去了。

问题原因:


昨晚搭建NFS服务器的时候,我删除了/tmp下的一些文件,然后还修改了 755 的权限。

问题解决:


1.按住 Ctrl + Alt + F2 进入虚拟终端,然后修改/tmp的权限为777就ok!

2.我今天是这样进去的,和上次root密码忘记的时候一样,重新启动系统,读秒的时候按下任意键,就会进入菜单模式,然后按下e就会进入grub的编辑模式。大概的内容是下面的:

root(hd0,0)

kernel /vmlinuz-2.6 xxxxxxxxx

initrd /initrdxxxxxx

把光标移动到kernel那一行,按下e进入编辑模式,在行最后加 single 就可以进入系统了。再把/tmp权限修改成777

libcxcore.so.1: cannot open shared object file: No such file or director

运行一个opencv的文件时候出错:

libcxcore.so.1: cannot open shared object file: No such file or director

在系统里查找了libcxcore.so.1,结果没有找到.

解决方法:


http://rpm.pbone.net/index.php3/stat/26/dist/64/size/11141747/name/opencv-1.0.0-9.fc9.src.rpm

下载包,解压好之后进入到里面的目录,会发现一个lib文件夹,里面有所需要的*.so.*,把里面的都复制到/usr/local/lib下面

$ vim /etc/ld.so.conf

查看是否已经添加 /usr/local/lib

$ ldconf

ldconfig: /usr/local/lib/libml.so.1 不是符号连接

ldconfig: /usr/local/lib/libhighgui.so.1 不是符号连接

ldconfig: /usr/local/lib/libcv.so.1 不是符号连接

ldconfig: /usr/local/lib/libcvaux.so.1 不是符号连接

ldconfig: /usr/local/lib/libcxcore.so.1 不是符号连接

不管它,再次编译,若还是失败,就把刚才的*.so.*都复制到/usr/lib下

$ cp -r /usr/local/lib/* /usr/lib/

opencv linux 安装和配置

在fedora16 和 CentOS 下面配置OpenCV,由于不同主机装的软件的都不一样,所以不能一概而论

大概需要的开发套件:

pkgconfig  libpng  zlib libjpeg  libtiff libjasper

ffmepeg GTK+ 的基本库(这里可选,用到的时候再装也行)

下面是我的主机安装配置OpenCV。

opencv 下载


 http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.2/

在centos和fedora16下面,一般都把用户的软件装在 /usr/local/xxx 下面


$ cp OpenCV-2.4.0.tar.bz2 /usr/local/

$ tar -xvf OpenCV-2.4.0.tar.bz2

$ cd  OpenCV-2.4.0

2.4.0的下面是以CMakeLists.txt形式

$ yum install cmake

$ cmake CMakeLists.txt

$ make && make install


OpenCV 会安装在 /usr/local/lib 目录和 /usr/local/include/opencv/

环境变量配置

$ vim /etc/ld.so.conf

最后一行加入 /usr/local/lib

$ ldconfig
或者

export LD_LIBRARY_PATH=/usr/local/lib

OpenCV测试

 
[cc lang="c"]
//drawing.c
#ifdef _CH_
#pragma package
#endif

#define CV_NO_BACKWARD_COMPATIBILITY

#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include
#include
#endif

#define NUMBER 100
#define DELAY 5
char wndname[] = "Drawing Demo";

CvScalar random_color(CvRNG* rng)
{
int icolor = cvRandInt(rng);
return CV_RGB(icolor&255, (icolor>>8)&255, (icolor>>16)&255);
}

int main( int argc, char** argv )
{
int line_type = CV_AA; // change it to 8 to see non-antialiased graphics
int i;
CvPoint pt1,pt2;
double angle;
CvSize sz;
CvPoint ptt[6];
CvPoint* pt[2];
int arr[2];
CvFont font;
CvRNG rng;
int width = 1000, height = 700;
int width3 = width*3, height3 = height*3;
CvSize text_size;
int ymin = 0;
// Load the source image
IplImage* image = cvCreateImage( cvSize(width,height), 8, 3 );
IplImage* image2;

// Create a window
cvNamedWindow(wndname, 1 );
cvZero( image );
cvShowImage(wndname,image);
cvWaitKey(DELAY);

rng = cvRNG((unsigned)-1);
pt[0] = &(ptt[0]);
pt[1] = &(ptt[3]);

arr[0] = 3;
arr[1] = 3;

for (i = 0; i< NUMBER; i++)
{
pt1.x=cvRandInt(&rng) % width3 - width;
pt1.y=cvRandInt(&rng) % height3 - height;
pt2.x=cvRandInt(&rng) % width3 - width;
pt2.y=cvRandInt(&rng) % height3 - height;

cvLine( image, pt1, pt2, random_color(&rng), cvRandInt(&rng)%10, line_type, 0 );
cvShowImage(wndname,image);
if(cvWaitKey(DELAY) >= 0) return 0;
}

for (i = 0; i< NUMBER; i++)
{
pt1.x=cvRandInt(&rng) % width3 - width;
pt1.y=cvRandInt(&rng) % height3 - height;
pt2.x=cvRandInt(&rng) % width3 - width;
pt2.y=cvRandInt(&rng) % height3 - height;

cvRectangle( image,pt1, pt2, random_color(&rng), cvRandInt(&rng)%10-1, line_type, 0 );
cvShowImage(wndname,image);
if(cvWaitKey(DELAY) >= 0) return 0;
}

for (i = 0; i< NUMBER; i++)
{
pt1.x=cvRandInt(&rng) % width3 - width;
pt1.y=cvRandInt(&rng) % height3 - height;
sz.width =cvRandInt(&rng)%200;
sz.height=cvRandInt(&rng)%200;
angle = (cvRandInt(&rng)%1000)*0.180;

cvEllipse( image, pt1, sz, angle, angle - 100, angle + 200,
random_color(&rng), cvRandInt(&rng)%10-1, line_type, 0 );
cvShowImage(wndname,image);
if(cvWaitKey(DELAY) >= 0) return 0;
}

for (i = 0; i< NUMBER; i++)
{
pt[0][0].x=cvRandInt(&rng) % width3 - width;
pt[0][0].y=cvRandInt(&rng) % height3 - height;
pt[0][1].x=cvRandInt(&rng) % width3 - width;
pt[0][1].y=cvRandInt(&rng) % height3 - height;
pt[0][2].x=cvRandInt(&rng) % width3 - width;
pt[0][2].y=cvRandInt(&rng) % height3 - height;
pt[1][0].x=cvRandInt(&rng) % width3 - width;
pt[1][0].y=cvRandInt(&rng) % height3 - height;
pt[1][1].x=cvRandInt(&rng) % width3 - width;
pt[1][1].y=cvRandInt(&rng) % height3 - height;
pt[1][2].x=cvRandInt(&rng) % width3 - width;
pt[1][2].y=cvRandInt(&rng) % height3 - height;

cvPolyLine( image, pt, arr, 2, 1, random_color(&rng), cvRandInt(&rng)%10, line_type, 0 );
cvShowImage(wndname,image);
if(cvWaitKey(DELAY) >= 0) return 0;
}

for (i = 0; i< NUMBER; i++)
{
pt[0][0].x=cvRandInt(&rng) % width3 - width;
pt[0][0].y=cvRandInt(&rng) % height3 - height;
pt[0][1].x=cvRandInt(&rng) % width3 - width;
pt[0][1].y=cvRandInt(&rng) % height3 - height;
pt[0][2].x=cvRandInt(&rng) % width3 - width;
pt[0][2].y=cvRandInt(&rng) % height3 - height;
pt[1][0].x=cvRandInt(&rng) % width3 - width;
pt[1][0].y=cvRandInt(&rng) % height3 - height;
pt[1][1].x=cvRandInt(&rng) % width3 - width;
pt[1][1].y=cvRandInt(&rng) % height3 - height;
pt[1][2].x=cvRandInt(&rng) % width3 - width;
pt[1][2].y=cvRandInt(&rng) % height3 - height;

cvFillPoly( image, pt, arr, 2, random_color(&rng), line_type, 0 );
cvShowImage(wndname,image);
if(cvWaitKey(DELAY) >= 0) return 0;
}

for (i = 0; i< NUMBER; i++)
{
pt1.x=cvRandInt(&rng) % width3 - width;
pt1.y=cvRandInt(&rng) % height3 - height;

cvCircle( image, pt1, cvRandInt(&rng)%300, random_color(&rng),
cvRandInt(&rng)%10-1, line_type, 0 );
cvShowImage(wndname,image);
if(cvWaitKey(DELAY) >= 0) return 0;
}

for (i = 1; i< NUMBER; i++)
{
pt1.x=cvRandInt(&rng) % width3 - width;
pt1.y=cvRandInt(&rng) % height3 - height;

cvInitFont( &font, cvRandInt(&rng) % 8,
(cvRandInt(&rng)%100)*0.05+0.1, (cvRandInt(&rng)%100)*0.05+0.1,
(cvRandInt(&rng)%5)*0.1, cvRound(cvRandInt(&rng)%10), line_type );

cvPutText( image, "Testing text rendering!", pt1, &font, random_color(&rng));
cvShowImage(wndname,image);
if(cvWaitKey(DELAY) >= 0) return 0;
}

cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 3, 3, 0.0, 5, line_type );

cvGetTextSize( "OpenCV forever!", &font, &text_size, &ymin );

pt1.x = (width - text_size.width)/2;
pt1.y = (height + text_size.height)/2;
image2 = cvCloneImage(image);

for( i = 0; i < 255; i++ )
{
cvSubS( image2, cvScalarAll(i), image, 0 );
cvPutText( image, "OpenCV forever!", pt1, &font, CV_RGB(255,i,i));
cvShowImage(wndname,image);
if(cvWaitKey(DELAY) >= 0) return 0;
}

// Wait for a key stroke; the same function arranges events processing
cvWaitKey(0);
cvReleaseImage(&image);
cvReleaseImage(&image2);
cvDestroyWindow(wndname);

return 0;
}

#ifdef _EiC
main(1,"drawing.c");
#endif

[/cc]
$ g++ `pkg-config opencv - -libs - -cflags opencv` drawing.c -o drawing
$ ./drawing

OK!!

杂谈

其实今天应该是很忙的,只是三个人都被FPGA的板子弄得焦头烂额。板子到了快两个星期了,我记得板子到的第三四天就跑出了系统,这时候是在RAM里面跑的。原以为把系统烧到flash里面,再加个u-boot是比较轻松的事情,但难度之大远远超出了我们的想象。FPGA对于系统的移植远远没有ARM那么简单,而且资料又少的可令。视频模块处理我大概看了mjpeg-streamer的代码,用交叉编译器也编译得差不多了,就等着uboot成功引导linux,用NFS挂载文件系统,然后我把库移植,源码移植就OK了。。。诶,理想很丰满,现实很骨干。三个苦逼的年轻人干了几天没什么收获,三个人到现在为止谁都没有发挥自己的特长。于是乎,今天傍晚的时候我就和他两说,今晚放个假,去看个电影好了,大家思路都很乱了。晚上和冏哥,老样子,又是窝蛋肥牛,吃完,我想去看电影的,复仇者联盟!应该是比较好看的,结果一查卡里面,竟然没钱了。但后来刷卡买了。8点45的。。。该死,1000又没了,我真是个败家子,读书嘛不好好读,就知道吃吃喝喝玩玩。诶,一定要努力,我真的很希望有一天我让我爸爸自豪一次,让他觉得他的儿子很优秀!高考那年让他失望透顶了,我心理最想的是进一家很大的互联网公司,拿着高薪的工资让我爸爸好好开心一把,再或者考名校的研究生,总之这些都是一个父母对儿子最大的希冀。。。项目的事情挺让人烦的,希望我们能快点有大的突破吧。。。

- 阅读剩余部分 -

NFS 搭建

最近做嵌入式开发的时候,需要NFS加载文件系统,顺便搭建了一个NFS。

NFS:Network File System


功能也就是能把远程网络的文件挂载到NFS Server上,在Server上看来,客户端的挂载的目录就像自己的子目录一样,可以对它操作。所以,对于嵌入式系统的调试是很方便的。

NFS支持的功能很多,所以对应的端口号是不固定的,是随机分配的,但都是小于1024。那么客户机是怎么连接到NFS Server上去的呢?这里有一个RPC的东西来支持。

RPC:(Remote Procedure Call Protocol)


远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC在NFS搭建过程钟的功能就是在Server上分配端口号,可以让客户端能从远程连接上Server。RPC固定采用111端口监听。

- 阅读剩余部分 -

make menuconfig error

OS : ubuntu 10.10

# make ARCH=microblaze menuconfig

*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2

# sudo apt-get install libncurses5-dev

OK!