- 博客(88)
- 资源 (2)
- 收藏
- 关注
原创 CentOS联网问题
CentOS 7安装好了之后,默认是没有自动联网的,每次启动系统后,之前都是要用到的时候手动联网,最近喜欢用无界面的方式登录系统,所以联网显得比较麻烦。为了解决这个麻烦,必须让系统启动的时候就自动连接上网络,因此必须修改下配置文件。具体可以如下操作:进入目录/etc/sysconfig/network-scripts/,并查看网卡的配置文件名,如下图所示,我的网卡的配置文件名是if
2016-06-02 16:11:30
1187
原创 FTP服务器项目的一些整理
几个月前按照网上的教程写了一个FTP的服务器,现在回头整理一下里面的一些知识。FTP简介FTP是文件传输协议(File Transfer Protocol),工作在TCP/IP协议族的应用层,其传输层使用的是TCP协议,它是基于客户/服务器模式工作的(C/S架构),TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。FTP的两种传输方式FTP有两种传输
2016-03-12 23:41:27
3735
原创 几种常用排序算法的复习
《数据结构》中介绍了好几种排序算法,有时候觉得晕晕的,所以就再拿出来复习下。插入类排序插入类排序是将一个记录插入到一个已经排好序的有序表中,使得新表仍然有序,经常接触到的插入类排序的有直接插入排序,折半插入排序,希尔排序等。为了以后复习的时候可以尽快回忆起各类的排序,这里均以一个序列作为例子:{2,3,1,5,4,9,7,8,6,10}直接插入排序直接插入排序的思想是每趟将
2016-03-10 20:33:02
817
原创 Effective C++学习记录
Effective C++算是看完了,但是并没有完全理解,也做不到记住所有,在此记录下55个条款及条款末的“请记住”。让自己习惯C++条款01:视C++为一个语言联邦① C ② Object-Oriented C++ ③ Template C++ ④ STL条款02:尽量以const,enum,inline替换#define① 对于单纯常量,最好以const
2016-02-21 20:12:30
802
原创 智能称体脂称实现(代码与基本数据处理篇)
(本文均出于个人理解而写,仅用于学习和交流,某些过程可能不一定正确,希望各位提出意见进行交流,共同进步)AFE4300的配置是比较简单的,从配置到处理基本的数据,主要有3个方面:SPI配置,AFE4300配置,基本的数据处理。(由于当时板子没做成一块,用STM32产生1M时钟再用杜邦线连接时干扰较大,于是时钟没有用STM32产生)SPI配置与接口封装STM32使用库函数来进行开发可以加
2016-01-29 17:37:32
5670
3
原创 智能称体脂称实现(datasheet篇)
(本文均出于个人理解而写,仅用于学习和交流,某些过程可能不一定正确,希望各位提出意见进行交流,共同进步)TI的参考方案是采用AFE4300芯片 同时进行生物阻抗身体成分测量和体重测量,以MSP430F5528 微控制器用于保留校准数据并计算重量、TBW、ECW 以及身体成分分析,采用 TI CC2541 的 BLE 模块连接。因为我们没有MSP430,所以我们没有直接套用他的方案,我们主处
2016-01-29 16:27:04
4926
3
原创 智能称体脂称实现(基本原理解释篇)
(本文均出于个人理解而写,仅用于学习和交流,某些过程可能不一定正确,希望各位提出意见进行交流,共同进步)项目简介 前段时间接触到一个项目,类似于现在网上热卖的那种智能称,如下图所示
2016-01-28 20:01:25
22829
原创 解决“重新安装vmware-tools”灰色而无法安装的问题
前几天重装系统,之后虚拟机需要重新装,装好后要使用vmware-tools实现文件共享,却发现虚拟机那里显示为灰色的,无法安装vmware-tools,在共享文件夹那里设置好共享的文件夹猴也没有用,/mnt目录下什么都没有。
2016-01-27 22:29:32
85732
17
原创 快速傅里叶变换算法探幽
学完《信号与系统》之后发现什么还是不会?感觉《数字信号处理》和《信号与系统》差不多?怎么办?期末快到了……是不是感觉《数字信号处理》学了和没学一样?对的,就是这种感觉。大一的时候用FFT算法做过音乐频谱,然而当时对里面的算法并不是很了解,之前面某俱乐部的时候被面试官问到,因此……虽然还是……。学完DSP之后感觉没自己来尝试下FFT算法真是人生一大憾事。于是赶着期末之前当做是复习下(虽然并不在考试范
2015-11-27 22:25:48
4252
1
原创 项目应用中的卡尔曼滤波
接触卡尔曼滤波的渊源最近因为项目需要,需要对经某种途径获取到的数据进行处理,数据大概就是从某种传感器那里来的,现在假定这个数据是某个网络的阻抗。获取到数据之后,发现数据是波动的,并且波动的范围比较大,我将数据记录后使用excel绘出图形,发现数据好像是周期性波动的。在这种情况下我首先想到的便是一阶滞后滤波,因为之前有项目用到过,但是效果不是很理想(可能因为某些参数调的不对),使用均值滤波后的值也是波
2015-11-09 17:18:21
10946
2
原创 当析构函数遇上多进程
(本文的多进程特指linux下的多进程,其他系统的没做过试验) 编写多进程或者多线程的程序总会有那些么一些些坑,一般来说是这样的,进程之间的地址空间是独享的,而线程是共享进程的地址空间,线程的资源比进程小,创建线程比创建进程快,线程间切换快,线程间通信快,线程资源利用率好。这样一说貌似好处全被多线程占尽,那么多进程岂不是没用,其实不然,多线程和多进程各有其用处,正如不要在脱离实际条件讨论selec
2015-10-16 20:18:55
2224
原创 使用C++STL的map容器实现一种命令映射
因为最近在练习写一个ftp的服务器,其中的命令有很多种,每个命令对应一个执行函数,能够想到的最简单的实现方式便是使用if……else匹配命令和执行对应的函数,如下所示:if(strcmp("one",cmd) == 0){ ……}else if(……){ ……}为了避免频繁地使用if……else……,一种方法是可以建立一个命令和函数指针的数组。大致可以如下实现://函数指针
2015-10-09 21:39:45
1826
原创 涉及secureCRT中文显示的一些设置
1.secureCRT中文显示乱码: 如果你的linux本身是显示着中文的,可进行如下设置: 选项->会话选项 外观->字符编码改为UTF-8,确定即可 2.secureCRT中文横向显示:secureCRT中文设置的时候可能会横向显示,如下所示: 这是因为在外观里的字体设置,如果字体前面有一个@符号的,就是横向显示的,我们只需把字体那个列表拉倒最下面,选择字体前面没有@符号的,确
2015-10-08 23:22:47
15110
1
原创 linux上github的简单使用
Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中。目前,包括Rubinius、Merb和Bitcoin在内的很多知名项目都使用了Git。Git同样可以被诸如Capistrano和Vlad the Deployer这样的部署工具所使用。今天我也想加入到github的大军中 了。
2015-10-06 13:13:13
1897
原创 一只简单的网络爬虫(基于linux C/C++)————主事件流程
该爬虫的主事件流程大致如下: 1.获取命令行参数,执行相应操作 2.读取配置文件,解析得到各种设置 3.载入各种模块 4.种子入队,开启DNS解析线程(原始队列不为空时解析) 5.创建epoll,开启任务,发起请求等等,关注事件 6.while大循环中使用epoll_wait返回活跃的事件,每个事件开启一个线程处理(线程中主要是解析页面,保存页面,url处理等),在线程结束的时候可能会开
2015-09-24 12:52:37
3865
3
原创 一只简单的网络爬虫(基于linux C/C++)————利用正则表达式解析页面
我们向一个HTTP的服务器发送HTTP的请求后,服务器会返回可能一个HTML页面(当然也可以是其他的资源),我们可以利用返回的HTML页面,在其中寻找其他的Url,例如我们可以这样在浏览器上查看一下HTML页面: 右键——>查看源代码 出现的页面大致如下: 我们可以看到,一个HTML的页面内容是想当多的,如果我们使用之前查找字符串的方法一行一行查找的话,效率是想当低下的。同时我们可以看
2015-09-24 12:30:56
4765
2
原创 一只简单的网络爬虫(基于linux C/C++)————线程相关
爬虫里面采用了多线程的方式处理多个任务,以便支持并发的处理,把主函数那边算一个线程的话,加上一个DNS解析的线程,以及我们可以设置的max_job_num值,最多使用了1+1+max_job_num个线程。相关的线程封装如下: 创建线程int create_thread(void *(*start_func)(void *), void * arg, pthread_t *pid, pthread
2015-09-24 10:43:06
2719
原创 一只简单的网络爬虫(基于linux C/C++)————socket相关及HTTP
socket相关建立连接 网络通信中少不了socket,该爬虫没有使用现成的一些库,而是自己封装了socket的相关操作,因为爬虫属于客户端,建立套接字和发起连接都封装在build_connect中//建立连接int build_connect(int *fd, char *ip, int port){ struct sockaddr_in server_addr; bzero
2015-09-24 00:34:51
8379
2
原创 一只简单的网络爬虫(基于linux C/C++)————Url处理以及使用libevent进行DNS解析
Url处理爬虫里使用了两个数据结构来管理Url 下面的这个数据结构用来维护原始的Url,同时有一个原始Url的队列//维护url原始字符串typedef struct Surl { char *url; int level;//url抓取深度 int type;//抓取类型} Surl;原始的Url队列static queue <Surl *> surl
2015-09-23 16:48:55
4912
1
原创 一只简单的网络爬虫(基于linux C/C++)————浅谈并发(IO复用)模型
Linux常用的并发模型Linux 下设计并发网络程序,有典型的 Apache 模型( Process Per Connection ,简称 PPC ), TPC ( Thread Per Connection )模型,以及 select 模型, poll 模型和epoll模型。 1 、PPC/TPC 模型 这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我 。只是 PPC 是
2015-09-23 16:01:23
3155
3
原创 一只简单的网络爬虫(基于linux C/C++)————支持动态模块加载
插件在软件设计中有很大的好处为了方便我们爬虫功能的扩展,最好使用插件机制。,使用插件技术能够在分析、设计、开发、项目计划、协作生产和产品扩展等很多方面带来好处: (1)结构清晰、易于理解。由于借鉴了硬件总线的结构,而且各个插件之间是相互独立的,所以结构非常清晰也更容易理解。 (2)易修改、可维护性强。由于插件与宿主程序之间通过接口联系,就像硬件插卡一样,可以被随时删除,插入和修改,所以结构很灵活
2015-09-22 16:24:20
2890
原创 一只简单的网络爬虫(基于linux C/C++)————守护进程
守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意
2015-09-22 15:24:40
2846
原创 一只简单的网络爬虫(基于linux C/C++)————读取命令行参数及日志宏设计
linux上面的程序刚开始启动的时候一般会从命令行获取某些参数,比如以守护进程运行啊什么的,典型的例子就是linux下的man,如下图所示 实现该功能可以使用getopt函数实现,该函数在头文件unistd.h定义 函数原型 int getopt(int argc,char * const argv[ ],const char * optstring); 函数说明
2015-09-22 11:55:27
3227
4
原创 一只简单的网络爬虫(基于linux C/C++)————配置文件设计及读取
一般来说linux下比较大型的程序都是以配置文件作为参数介质传递的,该爬虫也采用配置文件的方式来获取参数,配置文件格式大致如下:max_job_num=1#seeds=https://www.baidu.com#seeds=http://bbs.scut.edu.cn/classic/logfile=spiderq.log以“=”作为分割符,左边为key,右边为valve,主要包含的参数内容为
2015-09-22 11:02:07
3349
原创 一只简单的网络爬虫(基于linux C/C++)————开篇
最近学习开发linux下的爬虫,主要是参考了该博客及其他一些网上的资料。网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。目前有一些比较出名的一些开源爬虫,开源爬虫Labin,Nutch,Neritrix介绍和对比见这里 下面说的爬虫是作为一个
2015-09-22 10:31:06
7641
3
原创 单例模式及单例类的两种实现
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。单例模式同时也是所有设计模式中最简单的一种。 那么问题来了,单例类有什么作用呢?对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可
2015-09-11 20:28:14
2402
原创 对象析构不析构?
C++中的默认构造函数还有析构函数都是默认在“适当的时机”被调用的,这在一般的编程中似乎是比较明了的。《C++ Primer》作者Stanley B.Lippman说”C++保证,一定会在main()函数中第一次使用全局对象之前,把它构造出来,而在main()函数结束之前,把它摧毁掉!”,那么自然的,在对象被构造的时候,调用构造函数,main函数结束之前调用析构函数将对象销毁,下面这个简单的例子也是
2015-09-11 16:26:41
1745
原创 C++11的mutex和lock_guard,muduo的MutexLock 与MutexLockGuard
互斥锁是用来保护一段临界区的,它可以保证某段时间内只有一个线程在执行一段代码或者访问某个资源。 C++11的mutex和lock_guard C++11新增了mutex,使用方法和linux底下的常用使用方法差不多。先使用std::mutex 定义一个互斥锁,例如std::mutex XXXmutex在需要使用互斥锁的时候,使用XXXmutex.lock();上锁,以及使用XXXmutex.un
2015-09-11 15:58:32
2742
原创 muduo网络库源码学习————日志滚动
muduo库里面的实现日志滚动有两种条件,一种是日志文件大小达到预设值,另一种是时间到达超过当天。滚动日志类的文件是LogFile.cc ,LogFile.h 代码如下: LogFile.cc#include <muduo/base/LogFile.h>#include <muduo/base/Logging.h> // strerror_tl#include <muduo/base/Pro
2015-08-30 22:11:09
1959
原创 muduo网络库源码学习————日志类封装
muduo库里面的日志使方法如下这里定义了一个宏#define LOG_INFO if (muduo::Logger::logLevel() <= muduo::Logger::INFO) \ muduo::Logger(__FILE__, __LINE__).stream()返回的stream重载了一系列的运算符,使用方法如下LOG_INFO<<“info ...”; // 使用方式
2015-08-30 17:24:31
1310
原创 muduo网络库源码学习————线程本地单例类封装
muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示://线程本地单例类封装// Use of this source code is governed by a BSD-style license// that can be found in the License file.//// Author: Shuo Chen (chenshuo at
2015-08-29 23:20:48
641
原创 muduo网络库源码学习————线程特定数据
muduo库线程特定数据源码文件为ThreadLocal.h//线程本地存储// Use of this source code is governed by a BSD-style license// that can be found in the License file.//// Author: Shuo Chen (chenshuo at chenshuo dot com)#ifn
2015-08-29 21:34:05
550
原创 muduo网络库源码学习————线程安全
线程安全使用单例模式,保证了每次只创建单个对象,代码如下: Singleton.h// Use of this source code is governed by a BSD-style license// that can be found in the License file.//// Author: Shuo Chen (chenshuo at chenshuo dot com)
2015-08-29 20:32:55
676
原创 muduo网络库源码学习————线程池实现
muduo库里面的线程池是固定线程池,即创建的线程池里面的线程个数是一定的,不是动态的。线程池里面一般要包含线程队列还有任务队列,外部程序将任务存放到线程池的任务队列中,线程池中的线程队列执行任务,也是一种生产者和消费者模型。muduo库中的线程池源码如下: 线程池头文件ThreadPool.h//线程池// Use of this source code is governed by a BS
2015-08-29 18:17:13
2660
原创 muduo网络库源码学习————无界队列和有界队列
muduo库里实现了两个队列模板类:无界队列为BlockingQueue.h,有界队列为BoundedBlockingQueue.h,两个测试程序实现了生产者和消费者模型。(这里以无界队列为例,有界队列和无界的差不多)代码如下: BlockingQueue.h#include <muduo/base/Condition.h>#include <muduo/base/Mutex.h>#includ
2015-08-29 17:22:20
2133
原创 muduo网络库源码学习————条件变量
muduo里的CountDownLatch类实际上是对条件变量condition进行的封装,既可以用于所有子线程等待主线程发起 “起跑” ,也可以用于主线程等待子线程初始化完毕才开始工作。 condition.h代码如下:// Use of this source code is governed by a BSD-style license// that can be found in the
2015-08-29 15:23:49
672
原创 muduo网络库源码学习————互斥锁
muduo源码的互斥锁源码位于muduo/base,Mutex.h,进行了两个类的封装,在实际的使用中更常使用MutexLockGuard类,因为该类可以在析构函数中自动解锁,避免了某些情况忘记解锁。代码如下所示:// Use of this source code is governed by a BSD-style license// that can be found in the Lice
2015-08-29 11:17:47
822
原创 muduo网络库源码学习————线程类
muduo库里面的线程类是使用基于对象的编程思想,源码目录为muduo/base,如下所示: 线程类头文件:// Use of this source code is governed by a BSD-style license// that can be found in the License file.//// Author: Shuo Chen (chenshuo at chens
2015-08-29 10:11:23
1035
原创 muduo网络库源码学习————Exception类
Exception类是为异常捕获而设计,可以获得异常的信息以及栈的回溯信息 (原来的代码没有demangle成员函数,输出的格式比较难看,加了demangle成员函数,利用demangle成员函数可以转换格式,使得输出的格式更加接近我们的习惯) 以下的代码是加入了demangle成员函数后的: Exception.h// Use of this source code is governed
2015-08-28 20:35:49
687
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人