才权的博客


  • 首页

  • 归档

  • 标签

  • 关于

Eddy的微信小助手-置Tomcat默认响应(4)

发表于 2017-07-07

Tomcat默认响应

当在浏览器中输入Web服务的IP地址时(假设为124.35.32.1),如:

http://124.35.32.1

Tomcat的默认响应页面为:

$CATALINA_HOME/webapps/ROOT/index.jsp

Eclipse将Java EE工程以.war形式导出,并放置在“CATALINA_HOME/webapps”目录下。

Tomcat重启后,.war文件会自动解压。如“MyWeChatService.war”会在当前目录下被解压为MyWeChatService,我们可以通过绝对路径的形式访问该工程中的页面:

http://124.35.32.1/MyWeChatService/index.jsp

响应微信服务器请求

微信服务器对个人服务的请求为,

http://124.35.32.1/

微信公众号中的设置,

微信公众平台的服务器地址设置

当前面临的一个问题是:来自微信服务器的“http://124.35.32.1/”请求到达个人服务后,Tomcat服务器如何将请求转发给MyWeChatService,而不是默认的ROOT?

Tomcat默认响应设置

修改Tomcat/conf/server.xml文件:

server.xml

server.xml修改

server.xml修改后,重启Tomcat后,“http://124.35.32.1/”的请求便会直接转发给MyWeChatService了

参考

www.111cn.net/sys/Windows/51573.htm

项目代码

Java代码:github.com/CaiquanLiu/MyWeChatService.git
Python代码:github.com/CaiquanLiu/MyTuringService

Eddy的AI小助手-微信公众平台设置(3)

发表于 2017-07-07

申请微信公众号

在微信公众平台申请个人的微信公众号:mp.weixin.qq.com

公众号设置

公众号设置只需关注“URL”即可,格式为:

http://ip/

或

https://ip/

“Token”和“EncodingAESKey”主要用于服务端对客户信息来源的检查,测试时,可以不用关心。

微信客户端发送到个人服务器的流程:微信客户端->微信后台服务器->个人后台服务器,Token和EncodingAESKey主要用来确保数据来源于微信的后台服务器。

基本配置页面

服务器端口修改

微信的服务http请求端口为80(https请求为443),而Tomcat的http默认端口为8080,为了正确响应微信服务器的请求,需要修改Tomcat的http默认端口。修改Tomcat_Home/conf/server.xml,

server.xml修改

服务器响应设置

微信开放平台设置URL时,微信服务器会向个人的URL服务器发送get请求。服务器端需要正确响应微信服务器发来的验证请求,否则URL设置会失败,

微信公众平台-右侧边栏

微信公众平台-URL验证

服务端代码,

个人服务器端代码

项目代码

Java代码:github.com/CaiquanLiu/MyWeChatService.git

Python代码:github.com/CaiquanLiu/MyTuringService

Eddy的AI小助手-系统组成(2)

发表于 2017-07-07

(一)功能描述

Eddy的AI小助手是一个个人微信公众号,这个个人的公众号主要是作为AI系统信息输入的入口,通过公众号微信页面就可以把请求的文本和语音请求发送到自己配置的后台服务器。后台服务器接收到文本和语音请求后,处理生成回复内容,并将结果以文本、页面或语音的形式返回给微信客户端。

Eddy的AI小助手公众号

(二) 系统组成

AI小助手由输入端、后台端两个基本部分组成。

1. 输入端

输入端直接采用微信公众号,这样不仅稳定、可靠,同时,很好的解决了Android和iOS的跨平台问题。

微信公众号与后台以XML形式进行通信,具体的规范参考微信公众平台技术文档:mp.weixin.qq.com

2. 后台端

后台端由Java后台服务和Python后台服务两个部分组成,Java后台服务主要响应微信客户端的请求,Python后台服务主要用于机器学习,并响应Java后台服务的请求:

后台端组成

后台配置:

主机:阿里云ECS

系统:Ubuntu 14.04

Java Web引擎:

WebServer:Tomcat 9

框架选择:只使用最基本的Servlet

Pyton Web引擎:

WebServer:Tornado

Java第三方组件:

Log组件:Log4j

XML解析组件:XStream

网络爬虫(Html解析):HtmlParser

Pathon第三方组件:

Http请求:Requests

第三方服务:

语音识别:百度语音(yuyin.baidu.com/)

语音合成:百度语音(yuyin.baidu.com/)

NLP处理:图灵机器人(www.tuling123.com/),后期可能会使用自己编写的处理模

(三)开发环境

JavaIDE:Eclipse JavaEE

Eclipse JaveEE

Python IDE:PyDeb+Eclipse

文件传输:WinSCP

控制台:Putty

(四)项目代码

Java代码:github.com/CaiquanLiu/MyWeChatService.git

Python代码:github.com/CaiquanLiu/MyTuringService

Eddy的AI小助手-写在最前面(1)

发表于 2017-07-07

人工智能是什么

人工智能并不是一个新鲜的词汇,电影《钢铁侠》中的Javis就是一个非常典型例子。虽然Javis不是人类,但它却能像人类一样搜集信息、深入思考、提供建议、安排日常。

《钢铁侠》中的Javis

人工智能时代来临了

2016年3月来自Google团队的AlphaGo与韩国世界冠军李世石九段的在韩国首尔结束了首场比赛,AlphaGo获胜,李世石投子认输。

AlphaGo

2017年1月来自Google团队的Master在多家网络围棋平台连续挑落世界围棋高手,连取60胜。

走进生活的人工智能

人工智能不仅出现在影视作品和科研项目中,同时,也慢慢融入我们的生活中。

自动驾驶领域,除了传统的汽车厂商,比如福特、丰田、奥迪等。Google、Uber、百度这样财大气粗的互联网巨头也纷纷加入鏖战。

Google的无人车

语音助理领域,Google的Assistant、苹果 的Siri、微软的Cotana、亚马逊的Alexa、百度的DuerOS也早已走入大众生活。

Eddy的AI小助手是什么

面对人工智能这波浪潮,作为爱动手的程序猿,肯定不能只限于听新闻,用产品这个层面啦,如果能亲手打造一款属于自己的人工智能系统,那是再好不过的事情了。而Eddy的AI小助手就是为了这个目的而诞生的。

Eddy的AI小助手是一个个人微信公众号:

Eddy的AI小助手公众号
这个个人的公众号主要是作为AI系统信息输入的入口,通过公众号微信页面就可以把请求的文本和语音请求发送到自己配置的后台服务器。后台服务器接收到文本和语音请求后,处理生成回复内容,并将结果以文本、页面或语音的形式返回给微信客户端。

自己实现的AI系统相比于“图灵机器人”这样的第三方服务有诸多优势:

  • 自己搭建整个AI系统,能够增加自己的动手能力,并体验过程中的乐趣;
  • 能够添加一些定制性的服务,比如“我最近一周有什么安排?”、“我的个人博客最近一周的访问量怎么样?”
  • 除了使用第三方NLP平台接口外,也可以介入自己的算法模块,进行对比测试;

学习计划

AI小助手的搭建和知识学习过程我会以发表文章的形式记录在简书中,同时,AI小助手的代码实现我会上传的Github上,供大家探讨和学习:

Java代码:github.com/CaiquanLiu/MyWeChatService.git

Python代码:github.com/CaiquanLiu/MyTuringService

Android环境中借助GDB和coredump定位Native层程序异常退出问题

发表于 2017-07-06

coredump是linux中定位程序异常退出的机制(Android基于Linux内核,所以coredump机制在Android环境中同样适用,使用方法稍有不同)。在CarLife项目中可以使用coredump机制,并借助GDB工具来定位Native层的异常退出,比如bdsc和bdcl的异常退出问题定位。

Android coredump生成步骤如下:

  • 增大ulimit空间限制
    默认情况下coredump空间为0
    默认coredump空间
    增大coredump的方法有两种:
    1 通过ulimit –c unlimited
    ulimit –c unlimited命令
    2 在程序中修改
    代码设置
  • 在Android.mk中添加调试选项(有利于查看调用堆栈信息)
    Android.mk
  • 准备好Android.mk和测试原文件(本测试中使用的Makefile和源文件内容如下)
    hello.cpp
    Android.m
  • 将准备好的Makefile和源文件,进行交叉编译(下面的两种交叉编译方式可根据实际情况任意选择一种)
    1 在Android源码环境中进行编译;
    2 在NDK环境中进行编译;
  • 获取生成的测试可执行文件
    如果在Android源码环境下进行编译,需要选择out/target/product/generic/symbols/system/bin/目录下的生成可执行文件(该目录下的文件包含用于调试的符号信息)
    Android源码环境下编译
    如果在NDK环境下编译,可以选择armeabi或armeabi-v7a中的生成文件(armeabi是指的该可执行文件用于Arm的通用CPU;armeabi-v7a是指CPU支持硬件浮点运算;因此armeabi通用性强,但速度慢,而v7a能充分发挥v7a CPU的能力。armeabi就是针对普通的或旧的armcpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu)
    NDK环境下编译
  • 在Android环境中运行可执行文件,程序异常退出后,会在当前目录下产生coredump文件
    coredump文件产生

    GDB的异常退出定位过程如下

  • Windows环境下Android GDB工具位于NDK安装目录下android-ndk-r10c\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin(Android需要使用专门的GDB工具, 用于调试Linux的GDB不能用于Android环境调试)
    GDB工具位置
  • 按照可执行程序的生成目录路径创建对应目录,并将可以行文件拷贝到该目录下(也可直接复制生成文件和对应目录),本测试中测试的根目录为dd,则该过程为:
    测试目录
  • 将coredump文件拷贝到测试根目录下
    拷贝coredump文件
  • 在GDB目录下运行GDB
    运行GDB
  • 针对测试可执行文件,执行file命令
    执行file命令
  • 使用core命令和bt命令定位异常退出位置
    定位异常

    参考链接:

    http://www.csdn123.com/html/exception/597/597343_597351_597349.htm
    http://blog.csdn.net/liminled/article/details/17030747

基于CLion的GTest测试工程简单示例

发表于 2017-07-06

说明

CLion是C++IDE开发的利器(熟悉AndroidStudio的同学上手CLion应该很快,AndroidStudio是基于IntelliJ IDE的,而IntelliJ和CLion都是JetBrains家的产品),GTest是Google开源的C++测试框架,两者组合对C++环境开发真算得上是双剑合璧。本文通过简单的示例,展示如何在CLion工程中集成GTest测试框架,并进行简单的示例开发。

创建CLion工程

下载GTest源码

下载地址:https://github.com/google/googletest

##将GTest源码添加到CLion工程中
解压下载的GTest源码并直接添加到CLion工程中,
工程视图

修改CMakeList.txt

CMakeList

编辑main.c

main.c

运行测试

result

工程代码

github链接:https://github.com/CaiquanLiu/GTest-CLion-example.git

嵌入式开发环境搭建(包括Android NDK开发)

发表于 2017-07-06

linux系统安装

系统要求:
Ubuntu 16.04 64bit
linux-kernel 4.4
使用U盘安装Ubuntu系统:http://www.linuxidc.com/Linux/2016-04/130520.htm

修改更新源

检查 /etc/apt/sources.list更新源,如果是国外的源,先更新为国内源,否则后续的软件安装会很慢。
国内更新源:http://wiki.ubuntu.org.cn/%E6%A8%A1%E6%9D%BF:16.04source

屏幕分辨率调整

默认情况,如果系统安装在公司提供的台式机上,会出现屏幕分辨率低的情况(最高只有1360x768),需要手动增加新的分辨率,参考:http://forum.ubuntu.org.cn/viewtopic.php?t=458723

Linux登录客户端

建议使用Putty:http://www.putty.org/

Windows与Linux间的文件互传

建议通过SCP来进行Windows和Linux间的文件互传(Linux上的FTP服务配置相对麻烦)。
Linux端开启SCP,只需要:

sudo apt-get install openssh-server

Windows端可使用WinSCP或Filezilla作为客户端

Vim配置

https://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html

安装zsh

很好用的shell工具

添加中文输入法

sougou的linux输入法是不错的选择:http://pinyin.sogou.com/linux/

CLion安装(C/C++开发IDE)

习惯了AndroidStudio的同学都说好.
安装参考:http://www.linuxdiyf.com/linux/25850.html

Android源码下载编译

下载Android源码需要较大的硬盘空间(下载最新的7.0源码和对应的依赖工具大概需要100G的容量)。
需要注意Android的编译使用的是OpenJDK,而平时的Android应用编译使用的是Oracle的JDK。
源码下载编译参考:http://www.jianshu.com/p/367f0886e62b

NDK环境搭建

如果已经搭建了AndroidStudio环境,可以直接使用SDKManager进行下载,默认会下载到SDK/ndk-bundle目录下。
Android NDK下载:https://developer.android.google.cn/ndk/downloads/index.html

树莓派平台开发-开箱使用

发表于 2017-07-06

开箱清单

正常情况下,树莓派开箱只有一块主控板,显然是无法正常运行的。

开机必要配件

  • tf卡:最好是已安装了raspbain系统(系统从tf卡启动);
  • micro USB线(树莓派通过micro USB进行供电);
  • 5V电源(可选,可以通过USB线从电脑取电);

    交互模式

    添加了上面的配件树莓派就可以正常工作了,但没有输入和输出配件,对应使用者和开发者都是毫无意义的。

    1屏幕+键盘+鼠标

    最简单的交互方式就是和台式机一样通过屏幕、鼠标、键盘进行交互。必要配件:

  • HDMI线(树莓派只提供了HDMI接口);

  • 键盘;
  • 鼠标;

这样上电开机就和使用普通的Linux主机一样了。
很多时候显示器只有VGA接口,这时候需要添加配件:

  • HDMI转VGA接口(要求使用有源接口,无源接口可能会损坏树莓派主板);

同时,需要修改tf卡中的配置文件(config.txt文件),如:

# For more options and information see
# http://rpf.io/configtxtreadme
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=2
hdmi_mode=9

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

#dtoverlay=hifiberry-dacplus

参考:http://www.jianshu.com/p/1b5f21fbb928

2 SSH远程登录

raspbain系统默认开启了ssh服务,可以通过终端进行登录,这里终端推荐Putty;
ssh登录需要知道树莓派的IP地址、用户名和密码;
其中,树莓派的默认用户名和密码为:

  • 用户名:pi;
  • 密码:raspberry

IP的获取,可以通过IP嗅探器来获取,比如Advanced IP Scanner。将树莓派同扫描器的宿主主机置于同一网段(比如连接到同一路由器)。

IP嗅探器扫描

扫描到IP后,就可以通过SSH进行登录。

上网

通过修改/etc/network/interfaces配置文件实现上网配置,如:
interfaces文件修改

/etc/wpa.conf文件修改

参考:http://shumeipai.nxez.com/2016/09/17/raspberry-pi-set-up-a-wireless-internet-access.html

至此,树莓派就基本满足使用和开发需求了。

从嵌入式到互联网-非典型程序员的个人书单

发表于 2017-07-06

从嵌入式到互联网

我是06年进的大学,从大二的时候参加电子设计,大三的时候进入电子设计的校队,并参加了09年的全国大学生电子设计竞赛,但遗憾的是只拿了四川省的一等奖。整个排名下来,在我们队的前一名就是国二,当时负责硬件的队友比赛结束都掉了眼泪。由于学校的原因,电子设计和机器人是学校在当时非常重视的竞赛,选拔和培训机制也比较完善。在我的记忆里电子设计竞赛学校从来都是全国的第一名。也正是这样的原因导致自己形成了一个非常错误的观念:硬件和嵌入式最难,最牛逼。什么互联网之类的无非是做做网页,连高中生都搞的定,数学之类的也就只能用来搞研究了。

13年研究生毕业,期间在微软亚洲研究院实习。毕业后经历了传统的嵌入式公司,之后进入了国内Top3的互联网公司,现在回过头来看10年前的自己,当时的想法是多么的片面和无知。嵌入式的进入门槛确实相对要高些,但跨过门槛之后,会发现技术不分高低贵贱,只是方向和领域不同罢了。互联网技术虽然入门简单,但随着需求和规模的变化和增长,技术门槛也会发生指数级别的上升,而数学在其中又扮演着至关重要的角色。

认识的转变除了工作环境的变化之外,读书也发挥了很大的作用,下面来分享下从嵌入式到互联网我这个非典型程序员的个人书单(过程中读过的书远不止文中罗列的内容,一些质量不高的书目在此略过)

书单

汇编

汇编方面除了《微机原理》和《计算机组成原理》的课程学习外,自己也单独买过汇编的书籍,但总的来说都收获不大印象也不深刻。真正对汇编有深刻的理解是在实际的工作中。工作需要在一个没有MMU的控制器上实现Bios、Bootloader、App三个独立的运行空间,当时的解决方案是手动编写两级中断向量表。自此之后对汇编不再有恐惧的感觉。所以,很多时候实践是最好的学习方法。

C语言

C语言方面只使用了谭浩强的那本《C程序设计》。虽然这本书在网上被吐槽的很厉害,但因为当时自己年少无知,加上时间宽裕,整本书看了三四遍,同时,书上的例子也都自己手动敲过一遍(高中基本没接触过电脑,打字都要对着键盘边看边打,所以,测试例子就当做练习打字了),所以,整体下来这本书也基本够用。

C++

《C++ Primer Plus》

《Effective C++》

《C++ 标准程序库》

Java

《Java核心技术》

《Effective Java》

《深入理解Java虚拟机》

Python

《Python基础教程》(当“字典”使用吧)

《流程的Python》(进阶必备)

HMTL5

《HTML5权威指南》(当“字典”使用吧)

设计模式

《大话设计模式》

《重构》

编译链接

《编译原理》(龙书)

《程序员自我修养-链接、装载与库》(正和这本书的名字一样,我觉得每个程序员都应该读一下)

操作系统

《自己动手写操作系统》

《嵌入式实时操作系统 ucOS II》

《无线传感器网络操作系统 TinyOS》(内容基本是官方文档的摘抄,但国内关于TinyOS的中文资料确实不多)

计算机网络

《图解HTTP》

Linux

《鸟哥的私房菜》

《嵌入式Linux应用开发完全手册》(书名感觉有些low,但韦东山的作品确实经典,尤其是他的视频)

《Linux内核完全剖析》(通过这本书才真正理解了实模式和保护模式、段页式管理、内核态和用户的切换实现,而不是停留在枯燥的概念上)

《Linux内核设计与实现》

《Linux内核源代码情景分析》

《Unix环境高级编程》

Android

《疯狂Android讲义》(入门经典)

《Android开发艺术探索》(估计现在变成面试宝典了)

《Android群英传》

《Android框架揭秘》(这本书比较老,但对于开始理解Android的系统框架还是挺有帮助的)

《深入理解Android内核设计思想》

《Android系统源代码情景分析》(可能功力不够,一直都读不动。感觉更适合作为“字典”来使用)

后台服务

《Java Web整合开发王者归来》(Java EE的经典之作)

《后台开发:核心技术与应用实践》(C++后台)

《自己动手写网络爬虫》(基于Java的)

分布式系统

《大型网站技术架构》

《Hadoop权威指南》

算法与数据结构

《数据结构(C语言版)》(对于常用的数据结构都有对应的C语言实现)

《编程之美》

《算法导论》(坦白的将这本书来来回回尝试阅读了两三次,但每次都是读到一半就读不下去了,期间还看了MIT的公开课。最终还是觉得这本书当做“字典”来使用更合适)

《进军硅谷》(内容基本都是LeetCode的原题,可以先刷题再看书)

机器学习

《机器学习》(周志华)

《机器学习实战》(基于python的经典机器学习算法实现)

《Python机器学习及实践:从零开始通往Kaggle竞赛之路》(基于Python库实现)

《统计自然语言处理》(内容严谨、全面)

《深度学习》(不愧是“圣经”,真是够贵的)

《TensorFlow Machine Learning Cookbook》(Tensorflow入门超棒的资料,但目前好像只有英文版)

《集体智慧编程》(Simons大神推荐的图书)

其他

《这就是搜索引擎》

《浪潮之巅》

《数学之美》

《沸腾15年》(互联网的编年史风格跟吴晓波的《激荡三十年》很像)

《淘宝技术这十年》

书单可能有遗漏,后面会慢慢再补充完整。

个人博客和Github

博客:www.jianshu.com/u/bf03aa158e75

github:https://github.com/CaiquanLiu

科胜讯(conexant)2MIC/4MIC方案分析-1硬件分析

发表于 2017-07-06

科盛讯麦克风阵列方案的项目主页:http://www.conexant.com/amazon-avs/

2MIC和4MIC阵列板

4MIC和2MIC的原理基本一致,我们后续将以4MIC方案作为示例进行分析。
麦克风阵列智能音响由声智讯的麦克风阵列和控制板两部分组成:

系统组成

其中,控制板可以选择树莓派(Raspberry)和Linkplay:

控制板选择

下面我们先了解下基于麦克风阵列的智能音响方案整体工作情况:
https://youtu.be/aleO-FwND30
系统运行的数据流如下:

数据流

  • 四个MIC独立获取数据并通过DMIC接口将数据流传递给CX20924芯片(麦克风核心芯片)
  • [可选]CX20924完成唤醒识别(如“Alexa”),并通过GPIO1通知控制板

唤醒管脚

  • CX20924需要完成单MIC的回声抵消(AEC)、混响/噪声消除,及多MIC的波束角度识别(没有找到对控制版的输出方式)、波束形成(BeamForming),最终通过USB接口将数据传递给控制板;
  • [可选]控制板接受到麦克风阵列处理后的数据后通过第三方组件实现唤醒识别功能(如Sensory & KITT.AI唤醒引擎);
  • 控制板将数据流发送给AVS进行语音识别和自然语言处理,并返回处理结果;
  • 控制板将返回的结果已PCM的形式通过CX22721芯片进行播放(I2C为控制接口、I2S为PCM数据接口)
  • CX22721一方面将数字信号转换为模拟信号(DAC)传输给功放(喇叭)单元进行播放,另一方面通过I2S接口传递给CX20924进行回声抵消处理(AEC);
1…678
Liu Caiquan

Liu Caiquan

71 日志
11 标签
© 2019 Liu Caiquan
由 Hexo 强力驱动
主题 - NexT.Mist
本站总访问量次