Tess4J文字识别过程记录-未完成...
考虑到产品未来可能需要对图片中的文字进行识别分析,所以抽空我做了一点初步的尝试。暂且写下来做个记录吧。
选型经过一番寻找,锁定了tesseract。tesseract是一个开源的OCR引擎,支持中文识别。Tess4J提供了tesseract面向java的api封装。
安装
使用tess4j必须先安装tesseract,我的系统环境是centos,可以很方便的使用yum安装。为了识别中文还需要安装中文datafile。
sudo yum install tesseract sudo yum install tesseract-langpack-chi_sim.noarch //简体中文支持
其他操作系统,需要参考tesseract的说明安装。
然后在java项目中,通过maven引入tess4j。目前3.x版本里最新的是3.4
<dependency> <groupId>com.sun.media</groupId> <artifactId>jai_imageio</artifactId> < ...
解决 Spring Cloud Zuul 前端跨域请求问题
正在做的一个微服务架构的项目中,不出意料的在前端请求时遇到了跨域的问题 stats code: 401。以下就是我们采取的解决方案。
在zuul的入口类,即注解为@EnableZuulProxy的类中,增加以下代码:
@Beanpublic CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration(); //允许跨域 config.setAllowCredentials(true); //允许向该服务器提交请求的URI,*表示全部 config.addAllowedOrigin("*"); //允许访问的头信息,*表示全部 config.addAllowedHeader("*"); //允许的method ...
ajax-post参数传递方式
今天在写一个测试的ajax请求的时候,突然忘记了怎么用request body 传参。借这个机会,总结一下。当从前端通过ajax向后台发起一个post请求时,一共有三种方式传递参数。
通过url传递参数
ajax:通常采用形如以下的js代码。这样实质上是拼成了这样一个url : http://lefer.cn/getUserInfo?username=lefer
$.post({ url: "http://lefer.cn/getUserInfo", data: { username:"lefer", }, success: function( result ) { alert(result); }}),
java:通常在controller中采用形如以下的代码来接受参数。
@RequestMapping("/getUserInfo")public void getUserInfo(@RequestParam String use ...
设计模式演绎-工厂方法模式
定义
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory method lets a class defer instantiation to subclasses.
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他类。
通用类图
Product 是抽象产品类,ConcreteProduct是对Product类的具体实现
Creator 是抽象创建类,也就是抽象工厂,ConcreteCreator是实现工厂,如何创建产品类就是在ConcreteCreator类中实现。
通用代码/* 抽象产品类 */public abstract class Product { // 产品类的公共方法 public void method1(){ //实现业务逻辑 } //抽象方法: 在实现类中必须实现 public abstract void met ...
赛门铁克CA不被信任后,我们用什么
今天(2017/8/1),cnbeta上报道Chrome计划在2018年取消对赛门铁克CA的信任。我的网站之前的ca证书是从阿里云和腾讯云申请的免费证书,都是从赛门铁克签发的。神仙打架,凡人遭殃。有了这档子事,我就开始着手更换一个可靠的证书。经过再三筛选,最终决定使用Let’s encrypt提供的证书(免费)。原因是这家机构是大学背景,而且谷歌参与出资。下面是具体的操作过程。
安装 ACME client按照官方推荐,采用Certbot作为ACME客户端。
访问Certbot网站,选择Http服务器和操作系统,会自动提示对应的Certbot客户端。我的服务器是Nginx+Centos 6,根据提示做以下操作
wget https://dl.eff.org/certbot-autochmod a+x certbot-auto
获取证书
第一次签发证书的命令很慢很慢,需要安装许多依赖包和python组件。如果长久没反应,杀掉重来。多试几次。
sudo ./certbot-auto --nginx certonly # 建议带上certonly参数,否则程序会 ...
Spring Boot添加静态资源目录
Hexo的好处很多,坏处之一就是图片的处理了。虽然可以在_post下创建静态资源目录,但我是把这个目录当作笔记目录,多了一些文件夹强迫症真的受不了。而第三方图床服务,总不能放心。刚好我的服务器上同时还有个jar在跑,目的是提供我的api,那么就通过这个去实现我自己的图床吧。
实现方式这个api.jar采用的是Spring Boot架构,虽然可以通过字节流去定义一个RESTful API提供图片服务,但觉得是高射炮打蚊子。还是直接增加一个外部资源目录,通过访问静态资源的方式去提供图片。本地通过ftp上传图片在这个目录。后续有必要的话,还可以建一个Git仓库,通过hooks转发到这个目录里去。
具体步骤增加一个配置类,继承WebMvcConfigurerAdapter类,并重写addResourceHandlers方法。
package com.lefer.bed;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annota ...
Spring AOP实现零侵入日志记录
软件系统的日志输出是必不可少的,目前在做的RESTful系统中,需要考虑比较复杂的日志处理,但又不想让开发人员在写每个API的时候都去考虑日志的处理,干扰正常的开发,于是决定采用AOP实现零侵入的日志处理。以下是核心思路。
引入AOP依赖在项目的pom.xml中引入AOP依赖,对于Spring Boot来说应如下。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
编写Aspect类package com.lefer.demo4doc.aspect;import com.fasterxml.jackson.databind.ObjectMapper;import com.lefer.demo4doc.common.Result;import io.swagger.annotat ...
Linux 常用命令记录
发现每次需要在Centos里干什么事的时候,都要搜索一把对应的命令是啥,一次又一次( ̄﹏ ̄;)。这次下决心把我用到的命令慢慢全记录下来。免得查来查去浪费时间。
查看端口被谁占用,然后干掉它。
lsof -i:4000 # 查看4000端口是由哪个进程占用,获取进程号PIDps -ef|grep 43254 # 查找进程号对应的程序kill -9 43254 # 干掉它
查看所有端口
netstat -ntlp
压缩
tar –czvf xxx.tar.gz xxxtar -xzvf xxx.tar.gz
firewall
# 列出规则sudo firewall-cmd --list-port# 添加规则sudo firewall-cmd --zone=public --add-port=6022/tcp --permanent# 移除规则sudo firewall-cmd --zone=public --remove-port=6022/tcp --permanent# 向指定网段开放指定端口sudo firewall-cmd --permanent --add ...
跨浏览器调用总结
在行业软件的环境中,客户方通常拥有很多套B/S软件系统,可能各自对浏览器有着特殊的要求,比如必须用chrome访问,必须用IE访问等。当去做一个集成类的B/S系统时,就出现了需要唤起特定的浏览器去打开特定的url的场景,笔者根据自己的经验对可以采取的方案进行了总结。
方案一、使用插件及引擎
IE->Chrome
通过安装google-chrome-frame框架,然后使用gcf://协议去指定IE调用google-chrome-frame去渲染。但需要注意的是,谷歌浏览器内嵌框架从2014年2月25日起已经停止维护更新。
Chrome->IE
通过安装Chrome扩展组件,如IETab,Open IE等,然后在js中调用。由于行软环境通常无法访问外网,而且谷歌应用商店在墙外,所以开发者需要直接提供.extension文件供客户安装。有一定的实施难度。
方案二、通过ActiveX控件
IE->Chrome
通过js的ActiveXObject对象来调用Chrome。需要注意的是这种方法需要修改浏览器的安全级别允 ...
设计模式演绎-单例模式
定义
Ensure a class has only one instance, and provide a global point of access to it.
确保某一个类只有一个实例,而且自行实例化并向整个系统提供整个实例。
通用类图
单例模式类的构造方法是一个私有构造方法
单例模式类的属性包含自身,并限制为private static final类型,默认调用自身的构造函数
单例模式类提供static的getSingleton()方法供外部引用
通用代码public class Singleton(){ private static final Singleton singleton = new Singleton(); //私有静态属性 private Singleton(){} //私有构造方法 public static Singleton getSingleton(){} //引用者必须通过该方法获得实例对象 public static void doSomething(){} ...
