残剑

Stop walking today and you'll have to run tomorrow!

Uboot中TFTP解释

| Comments

TFTP在Uboot中用于发送较小的文件,使用UDP协议,发送使用69端口,每次发送的最大分组为512 bytes,发送双方采用超时重传机制,数据传输模式为octet模式(二进制模式)。发送文件时使用tftp MemoryAddress FileName命令即可,其中MemoryAddress为放入文件的内存首地址,FileName为传送文件的文件名。

使用TFTP传送文件的步骤:

  1. 使用时已经初始化以下变量:NetOurIP(本机IP地址,定义在Net.c文件)、NetServerIP(TFTP服务器的IP地址,定义在Net.c文件)、BootFile(需要传送文件的文件名,定于在tftp.c)、NetOurGatewayIP(本机的网关地址)、NetOurSubnetMask(本机子网掩码)。
  2. 调用TftpStart 函数开始文件传送。

Linux下c语言获取网络接口IP地址

| Comments

在Linux环境下,可以使用以下的代码获取网络的ip地址:

1
2
3
4
5
6
7
8
9
10
if (gethostname(host, sizeof(host)) < 0) {
    printf("Can't get hostname\n");
    return -1;
}
if ((hp = gethostbyname(host)) == NULL) {
    printf("Can't get host address\n");
    return -1;
}
memcpy((char *) &intaddr, (char *) hp->h_addr_list[0],
        (size_t) hp->h_length);

Ubuntu下编译vlc-android源代码

| Comments

在编译源码前,需要先安装Android的SDK、NDK以及一些必需的软件,具体安装方法这里就不再详述了,网上可以找到很多相应的文章。安装软件可以执行以下指令:

1
2
$ apt-get install  apache-ant(or ant)  autoconf automake autopoint  libtool  gawk (or nawk)
gcc  g++  pkg-config  cmake  patch subversion git

ant工具在最后编译android源码生成apk文件会用到,所以需要安装。如果手动安装了ant,需要在环境变量中配置好ant的 path,或者在编译前执行命令export PATH=$PATH:/xxx/ant/bin,保证可以在执行编译的命令行中执行ant命令即可。

车速的计算

| Comments

假设你坐在汽车内,你会如何计算汽车在高速路上的平均速度?说说方法,请写下闯入你大脑的第一个想法,希望不要太离谱。没有标准,百家争鸣!

问题背景

之前从家里到工作地的总体花费时间是知道的,但我对汽车的实际速度并没有一个概念。坐在车上有时很想知道某一地到我的目的地还需要多少时间。因不太擅长跟陌生人交流,所以自己想一些办法解决。因为高速路上会有到某地还有多少距离的提示,而且相隔几里路后又会有提示,所以采用了距离差除以时间,然后用还剩的距离除以速度,最后得到我想知道的时间。在不堵车的情况下,这种方法是比较有效的,误差不是很大。

网友的回复

djsxut:1、看仪表盘在一定时间的行驶路程,除以行驶时间得到平均速度;2、不怕麻烦的话,多次取样,再计算平均速度;3、视力足够好,数数高速中间的小树苗,基本上两颗小数栽种的距离是一定的。

hellioncu:每次看到指示牌标记的公里数,并记下时间,公里数差/时间差——就是速度。

群雄逐鹿中原:装个GPS导航软件。汽车上或手机上都行。

folklore:hire a beauty girl, and ask her: what is our average speed now?

cokeboL:距离/时间,这还能有啥。

cxytz01:超速行驶,交警叔叔会告诉你。

使用libevent编写Linux服务

| Comments

libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制,著名分布式缓存软件memcached也使用到了该库。

初始化事件

首先完成对libenvent的事件初始化和事件驱动模型的选择。在使用多线程的情况下,一般我们需获取所返回的事件根基。

1
main_base = event_init();

event_init函数返回的是一个event_base对象,该对象包括了事件处理过程中的一些全局变量,其结构为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct event_base {
    const struct eventop *evsel;
    void *evbase;
    int event_count;        /* counts number of total events */
    int event_count_active; /* counts number of active events */
    int event_gotterm;      /* Set to terminate loop */
    int event_break;        /* Set to terminate loop immediately */
    /* active event management */
    struct event_list **activequeues;
    int nactivequeues;
    /* signal handling info */
    struct evsignal_info sig;
    struct event_list eventqueue;
    struct timeval event_tv;
    struct min_heap timeheap;
    struct timeval tv_cache;
};

链栈

| Comments

栈是限制在表的一端进行插入和删除运算的线性表。通常称插入、删除的这一端为栈顶,另一端称为栈底;当表中没有元素时称为空栈;栈为后进先出的线性表,简称为LIFO表;栈的修改是按后进先出的原则进行;每次删除的总是当前栈中最新的元素(即最后插入的元素),而最先插入的被放在栈的底部,要到最后才能删除。

链栈结点

出栈与入栈是栈的最主要操作,当无法预见栈所需大小时,往往需要采用链栈的方式。在链栈中,不需要像单链表一样需要头结点。链栈的结构如下图所示:

 stacknode

可将其结构定义为:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef char SElemType

typedef struct StackNode
{
    SElemType data;//根据实际需要定义数据类型
    struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;//指向栈链顶部
    int count;//用以判断栈是否为空,可初始化为0
}LinkStack;

Pkg-config的使用

| Comments

pkg-config是向用户和应用程序提供相应库的路径、版本号等信息的程序。比如使用pkg-config查看gcc的CFLAGS参数。

1
2
3
4
$ pkg-config --libs --cflags opencv
-I/usr/include/opencv  -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml 
-lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect 
-lopencv_contrib -lopencv_legacy -lopencv_flann

以上就是我们用gcc编译连接时CFLAGS的参数。因此当我们需要编译连接某个库时,只需要把上面那行加入gcc的参数里面即可。这也是configure的作用,它会检查你需要的包,产生相应的信息。

pkg-config从包名为xxx.pc这个文件中查找相应的信息。缺省情况下,首先在prefix/lib/pkgconfig/(在linux上其路径为/usr/lib/pkconfig/)中查找相关包(比如opencv)对应的文件(opencv.pc)。若是没有找到,它也会到PKG_CONFIG_PATH这个环境变量所指定的路径下去找。若是还没有找到,它就会报错,例如:

1
2
3
4
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

Linux下删除文本文件中的所有空行

| Comments

很多情况下文本文件中会出现许多空行,这些都是我们不想要的。大多时候我们会选择手工删除,这样显然太麻烦,况且当文件行数很多的时候,其麻烦程度是不能忍受的。所以需要一个工具,可以达到删除所有空行的目的,并且最好还能一次处理多个文件。以下是Linux下的一个脚本文件,支持一次处理多个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash


TEMP_F="del.lines.$$"

usage()
{
  echo "Usage: $0 filename [filename...]"
  exit -1
}

if [ $# -eq 0 ] ; then
  usage
fi

while [ $# -gt 0 ]
do
  FILE_NAME=$1

  case $1 in 
      --help)
          usage
      ;;

      *)
          if [ -f $1 ] ; then
              sed '/^$/d' $FILE_NAME > $TEMP_F
              mv $TEMP_F $FILE_NAME
          else
              echo "$0 can not find this file: $1"
          fi      
      ;;
  esac

  shift
done