在js中仿java的枚举类型设计实例

简介

在javascript中,像EventTarget.addEventListener()Document.createElement() 等方法,只接收指定字符串作为参数。比如:

const okButton = document.getElementById("button_ok");
okButton.addEventListener('click', () => console.log('button_ok clicked!'), false);

在上述代码中,我们必须按Events 中所定义的类型字符串(如:click, load)传参,否则程序就不能正常工作。本文将介绍如何通过objectclass两种封装形式,分别实现枚举类型。
Continue reading

使用opencv查找两张图片不同的部分

简介

有一款游戏叫《大家一起来找茬》不知道大家有没有玩过,就是给出2张相似图片,在规定的时间内找出图片上有几处不同并标记出来。本文将介绍如何通过opencv替代肉眼快速找出准确的答案。

材料准备

  • 通过搜索引擎,找出要比较的素材。如下
    找茬素材1
  • 将素材裁剪成2张图片
// ubuntu 系统命令裁剪
convert -crop 50%x100% image01.jpg image01.png

上面命令将生成image01-0.pngimage01-1.png两张图片,至今素材准备完毕
Continue reading

使用JAVA的ExecutorService来限制线程数量

前言

诸如利用多线程并行访问数据库可以提高系统的并发性能,但是线程变多伴随而来的是,当线程数大于DBMS(数据库管理系统)设置的最大DB连接数时,程序就挂掉了。在JAVA中如何避免这种问题呢?

解决方法

使用ExecutorService,限制最大线程数量

ExecutorService是?

ExecutorService是JAVA标准的并行计算库[java.util.concurrent]里包含的接口,封装原来难以使用的JAVA线程,使其简单化。

Continue reading

spring boot定制个性化命令

前言

使用过lumen(php)框架的朋友,大概都接触过artisan工具。按框架所给过的规范,可以轻松定制自己业务所用到的命令集成到框架里。如下图汉字部分所示
lumen artisan
当想执行想要用到的业务命令时,只需要执行对应的命令

php artisan build.es.plazas.config //刷新全部广场配置

是不是很直观,那么在spring boot中,我们要如何实现类似功能呢?
Continue reading

laravel5日志设置篇(3/3) – 精确到微秒及日志输出位置记录

想要实现的功能

  • 记录日志输出时的时间精度到微秒
  • 记录日志输出时程序执行位置(方法/行数)
  • 记录进程ID

例如:

  • app.log
[2017-10-22 10:13:57.833504] production.INFO: -- Startup {"method":"GET","uri":"/v1/stocks"} {"pid":7124,"line":"App\\Bootstrap\\ApplicationLog->startupLog:66"}
[2017-10-22 10:13:57.898702] production.INFO: get stocks info  {"pid":7124,"line":"App\\Http\\Controllers\\StocksController->index:66"}
[2017-10-22 10:13:57.903274] production.INFO: -- Shutdown {"time":"70.371[ms]","memory":"2048[kb]"} {"pid":7124,"line":"App\\Bootstrap\\ApplicationLog->handleShutdownLog:81"}

Continue reading

laravel5日志设置篇(2/3) – 记录sql日志

想要实现的功能

  • 获取laravel运行时执行的sql语句
  • sql相关的日志保存到指定文件(sql.log)
  • 接口访问与artisan 命令日志分开保存

例如

  • sql.log
[2017-10-21 22:27:42] production.DEBUG: select count(*) as aggregate from `stocks_input` where `stocks_input`.`deleted_at` is null; {"time":0.55} 
[2017-10-21 22:27:42] production.DEBUG: select * from `stocks_input` where `stocks_input`.`deleted_at` is null order by `created_at` desc limit 10 offset 0; {"time":0.84} 
[2017-10-21 22:27:42] production.DEBUG: select * from `goods` where `goods`.`id` = 1 limit 1; {"time":0.74} 
  • cli.sql.log
[2017-10-21 22:28:15] production.DEBUG: select * from `goods` where `goods`.`id` = 1 limit 1; {"time":0.76} 
[2017-10-21 22:28:15] production.DEBUG: select * from `regions` where `regions`.`id` = 110102 limit 1; {"time":0.87} 
[2017-10-21 22:28:15] production.DEBUG: select * from `regions` where `regions`.`id` = 110000 limit 1; {"time":0.81} 

Continue reading