/images/avatar.jpg

SimpleConcurrentRequestClient —— 一个基于Guzzle的多请求管理终端

SimpleConcurrentRequestClient,是一个针对多个请求做的管理终端,其是基于Guzzle的Pool来实现,并通过Promise方式来做回调。

使用SimpleConcurrentRequestClient可以很轻松的完成多个请求的管理,获取结果

安装可以使用composer

bash\ncomposer require jarod2011/taobao-concurrent-client

项目地址 Github地址 ,感兴趣的朋友可以去github里查看

后续我将更新相关的使用说明

React中的按需加载(支持React Router v4)

在用React来开发SPA(single page application)中,一般都会使用react router来做页面的路由,而如果应用很大的话,一般都需要使用按需加载,既当进入到某个url中时才去加载其所对应的组件,这样可以让打包后的js更小,增强初始化时的速度。那么如何来完成这种按需加载呢?

由于react router 更新到最新的v4后,和之前发生了很大的变化,因此,此篇文章我将分为两部分来分别介绍react router v4前版本和v4版本的按需加载。

首先我们来建一个项目

npm init

通过按照提示配置后,我们初始化了项目,开始安装依赖

先安装我们node运行环境需要express和body-parser

npm install express body-parser

然后安装开发需要的几个环境

npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react jsx jsx-loader prop-types react react-dom reat-router@3.2.1 webpack webpack-cli

此处注意,我安装的是3.2.1的react router 这个是当前v4版本以下的最后一个版本

docker启动位置的设定

因为docker默认在/var/lib中启动,会占用大量系统空间,因此可以修改下docker启动位置,并通过挂载其他硬盘来让docker启动在其他硬盘中。 修改 centos的/etc/sysconfig/docker 或者ubuntu的/etc/default/docker 在docker的启动options中增加 –graph=/mnt/dockerdir 来让docker启动在别的位置

最近很忙,给大家发几个可能会用到的docker镜像

首先先向大家致歉,最近实在是太忙了,没有更新文章。

今天先给大家推荐自己打的两个docker镜像包吧,如果正好有需要,可以pull试试看。

现在越来越多的公司开始用到swoole来开发更高性能要求和特定场合的服务级应用了,而我查了下,大部分的swoole的扩展的镜像都很大,都是300M以上的,所以,我为大家打了一个75M左右的包含swoole扩展的镜像包,其中开启了swoole的协程、异步redis、mysqlnd支持,同时开启了mysqli、pdo_mysql、mbstring、openssl、redis等常用的扩展,并安装了composer。

docker pull jarod2014/swoole_composer_alpine

dockerfile可以去github查看

现在大部分的敏捷开发都是用laravel开发,而作为性能版的laravel,Lumen也有越来越多的开发者来使用,用于开发纯接口服务,那么为大家奉上一个Lumen的开发环境和Lumen的运行环境,都是超小型的镜像,开发环境比运行环境增加了lumen-installer。

docker pull jarod2014/lumen_alpine

开发版请使用dev标签,dockerfile可以去github查看

谈谈分词的解决方案

今天来给大家聊聊,针对一些简单的分词的解决方案。

首先我们来看一个常用的场景:

一个购物网站的搜索功能,要求可以根据用户的搜索精准的查询到商品,比如我要买咖啡,我搜索关键字 咖啡 可以搜索到很多咖啡商品,但我要求搜索** 我要买好喝的咖啡 **也可以搜索到很多咖啡商品。这要如何实现呢?

对于仅仅搜索关键字来说,小库直接去like查询,就可以解决,若库大了做索引,缓存等都可以去解决,这里就不再赘述了,因为我们今天主要的核心讨论点是分词

我们来看这句话 我要买好喝的咖啡 ,通过我们自主的观察,我们需要的是** 咖啡**,其是一个名词,而去除掉 **我 **,**买 **是一个动词, **好喝 **是一个形容词。这样我们就捋清楚了,我们其实大部分搜索需要的都是名词。

这样我们只要能从 **我要买好喝的咖啡 中通过分词,顺利找到 咖啡 **,或者说,从一段需要搜索的话中,找到其中的所有名词,就可以了。

今天给大家推荐的分词工具包,是由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,其官网(http://thulac.thunlp.org/)的描述是这样的:

THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:

  • 能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
  • 准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。
  • 速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。

目前,其提供了C++、Java和Python的包供大家使用,那么对于其他语言的人怎么办呢?

其实很简单,只要用这三种语言,写个端口和地址监听,提供一个分词的API接口就行了,有人会问了,这三种语言不会啊,环境都不会配,怎么办?

不要忘记了,我们有 Docker !!!

我选用Python来构建一个API接口,通过使用thulac的包,然后我选用flask(https://flask.org.cn)来写个简单的接口文件,然后在一个有Python环境下,运行监听地址和端口,其他语言只要去访问这个接口,就可以获取到针对句子的分词结果了,然后根据自己的业务逻辑,对分词结果做相应的处理,就可以了。

我们先来完成接口文件

import thulac
import json
from flask_restful import Api, Resource
from flask import Flask, request

thul = thulac.thulac(filt=True);
app = Flask(__name__);
api = Api(app);

history = {};
index = 0;
class CutWord(Resource):
def get(self):
return history;

def post(self):
global index;
req = request.form['data'];
res = thul.cut(req);
history[index] = {'req': req, 'res': res};
index = index + 1;
return res;

api.add_resource(CutWord, '/');
if __name__ == '__main__':
app.run(host='0.0.0.0');

上面我监听了本地的5000端口(FLask默认5000端口),对根路径提供RESTful接口,其针对get获取历史查询列表,对post将会通过data提供的句子做分词并返回结果。当然这只是一个简单的接口,有兴趣的Python大神们可以扩展出更多的功能和做性能优化等。