初闻

一次,一个同事在群里问,有谁知道这个函数该如何用ES6的方式简写:

1
2
3
4
5
function fn(n){
return function(m){
return m+n
}
}

我当时也没动脑子,直接按潜意识改了一下,发出去了:

1
2
3
4
5
fn=(n)=>{
return (m)=>{
return m+n
}
}

果然,发code的那家伙神秘一笑,说你再继续简化一下试试。我后背一凉,赶紧又看了看,改成这个样子又抛出去了:

1
2
3
fn=(n)=>(m)=>{
return m+n
}

我自认为这种总该差不多了吧,结果又被生生打脸。题主笑而不语,然后我恍然大悟,看来之前真是自以为会用,根本没有认真思考过,其实还可以进一步简化:

1
fn=(n)=>(m)=> m+n

最后题主说,把括弧也去了吧:

1
fn = n => m => m + n

看着这段code,我沉默了……原来code可以如此简洁、优美、易懂。

偶遇

上面的故事发生没多久以后,我在看一个帖子时,发现如下code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var arr = [
{ name:"小明", age:12 },
{ name:"小红", age:11 },
{ name:"小刚", age:15 },
{ name:"小华", age:13 }
];
function compare(p) { //这是比较函数
return function (m, n) {
var a = m[p];
var b = n[p];
return a - b; //升序
}
}
arr.sort(compares("age"));
console.log(arr);

然后我笑了,在评论区默默地留下了compares函数的简版:

1
compare = p => (m, n) => m[p] - n[p]

思考

Coding这么多年,其实大部分时间是比较麻木的,不走脑子的reading、copy以及coding,糊弄完了一个又一个项目。随着时光的飞逝,真正有意义的东西很少能留下来,所谓很少,其实还是有的,要不真该转行了,就比如这个ES6简写的过程,就是非常有趣并且优美的。但是这个过程很偶然,首先,你得初步了解过这个技术,然后,在一个被动的机会下,你静下心来,认真的体会技术带来的愉悦感,并真正的掌握这项技能。这似乎需要一个积累的过程,大量阅读以后再反复推敲,然后在这个过程中,自我成长,体会技术的真谛,并且使自己快乐!

概念

Tesseract是一个光学字符识别引擎,支持多种操作系统。Tesseract是基于Apache许可证的自由软件,自2006 年起由Google赞助开发。 2006年,Tesseract被认为是最精准的开源光学字符识别引擎之一。【维基百科】

声明

在使用tesseract-ocr的过程中,我遇到了一些问题,并找到了一种适合我的使用方式,在这里给大家分享一下。

困境

  1. 在Mac下使用Homebrew安装tesseract-ocr时,—with-training-tools参数取消,所以无法训练数据;如果使用github下载源码,然后编译安装的话,需要安装很多依赖,比较麻烦;
  2. 如果在ubuntu下使用apt-get安装,默认是携带各种训练工具的,但是我的ubuntu系统是server版,不支持桌面,所以在标注图片时很不方便。

我的解决方案

我的解决方案是:在MacOS下标注,然后把标注好的box文件送到Ubuntu Server下,打包训练语言模型。
注意:如果您满足我在上文中提到的困境,就可以继续往下读了。

其他方案

  1. 在Mac下编译tesseract,使用jTessBoxEditor标注+训练
  2. 在Linux桌面版安装tesseract,使用jTessBoxEditor标注+训练
  3. 在Windows安装tesseract,使用jTessBoxEditor标注+训练

安装

tesseract-ocr支持Linux、Windows、MacOS、Android、IOS等操作系统。由于本人使用的操作系统是MacOS和Linux ubuntu server,所以本文只介绍这两个环境的安装。

Mac

借助Homebrew,执行命令:

1
brew install tesseract-ocr

安装完以后,截至今天为止,默认是4.0.0版本,不支持—with-training-tools,所以也不支持训练功能。如果直接使用github下载源码编译安装,是可以支持的,但是我比较懒,在需要训练操作时,我就去Linux上搞了(Linux的4.0.0是携带辅助训练工具包的)。

Linux

借助apt-get,执行命令:

1
apt-get install tesseract-ocr

基本用法

  1. 设置识别语言,默认英文(eng),中文是chi_sim(需另行下载语言包),如果需要同时识别两种或者两种以上语言,比如同时识别中文和英文,格式为“-l chi_sim+eng”,执行以下命令,识别结果会以txt文本形式保存在目标路径下。
1
tesseract [待识别图片路径] [目标识别结果路径] -l eng
  1. 设置文字坐标输出,执行以下命令:
1
tesseract [待识别图片路径] [目标识别结果路径] -l test makebox

识别结果会以box后缀文件形式保存在目标路径下,坐标内容包含识别结果左上角的横纵坐标以及长宽值,比如识别如下字符:

其结果为(啧啧啧,通用中文库识别效果很差):

数据训练

借助第三方工具

jTessBoxEditor是一款辅助标记的工具,在本地安装完tesseract-ocr以后,可以在jTessBoxEditor中配置tesseract-ocr的启动路径,然后基于tesseract-ocr进行可视化标注。如下图所示:

环境配置

在jTessBoxEditor的Trainer标签下,主要功能说明:

  1. Tesseract Executables配置tesseract程序启动路径
  2. Training Data存放训练数据路径
  3. Language为自定义训练集名称
  4. Bootstrap Language是训练之前需要借助的语言模型名称
  5. 然后选择Make Box File Only
    注意:使用jTessBoxEditor需要配置Java环境变量。

初步识别

  1. 选择Make Box File Only
  2. 点击run按钮,就可以出来借助默认语言模型执行的识别结果。

开始标注

在获取到执行结果以后,切换到Box Editor标签,如下图所示:

标注过程:

  1. 首先点击“open”按钮打,打开之前识别结果box
  2. 在左侧列表中,选择一个字符,比如上图中手写版的“测”字,然后在右侧提示框中对其进行调整,直到红色框完美包含字符
  3. 然后依次调整其余所有字符
  4. 如果需要新增标注框,点击“insert”,或者需要删除,请点击“delete”
  5. 如何需要合并两个字符,点击“merge”,或者均分字符,请点击“split”
  6. 点击“save”保存box
  7. 返回上个标签Trainer,然后选择“Train with Existing Box”,点击“run”执行
  8. 这时会在训练路径下生存.traindate语言模型
  9. 最后,再换一张与训练数据类似的图片,点击Validate进行验证。
    注意:如果你没有在Mac上编译安装tesseract,只是通过brew安装了4.x.x版本,那么到第6步就可以停止了,因为该版本不携带训练工具,你可以拿着标注好的box文件,找一个linux机器手动生存语言模型包,过程参考上述“命令行打包语言模型”。

命令行打包语言模型

  1. 使用tesseract命令生成识别结果box文件
  2. 调整box(或者直接使用jTessBoxEditor标注结果)
  3. 依次执行以下命令:
1
2
3
4
5
6
7
8
9
# picture.jpeg是待识别图片
tesseract picture.jpeg picture nobatch box.train
unicharset_extractor picture.box
# 新建font_properties本文,内容为test 0 0 0 0 0
shapeclustering -F font_properties -U unicharset picture.tr
mftraining -F font_properties -U unicharset -O unicharset picture.tr
cntraining picture.tr
# 到此为止,会生成unicharset、inttemp、pffmtable、shapetable、normproto等五个文件,分别给他们加上test.前缀(test为自定义语言模型名称)
combine_tessdata test.
  1. 此时会在当前目录下生成test.traineddata文件,移动该文件到tesseract-ocr的tesedata目录下(我的路径是_usr_share_tesseract-ocr/4.00_tessdata/)
  2. 然后设置语言执行识别命令:
1
2
# test是刚才生成的语言模型名称
tesseract test1.jpeg test1 -l test
  1. 执行结果:(效果还是不错的)

总结

总体而言,虽然是桌面版标注+服务器端处理,但是使用起来还是可以接受的。如果将来有时间,可以研究一下在mac下之间编译tesseract源码

概念

PM2(process manage)是JavaScript运行时Node.js的进程管理器。

基本操作

安装

1
2
# 借助npm包管理器安装
npm install -g pm2

启动进程

命令行启动

  1. 默认启动
1
2
# 启动一个nodejs进程,进程名默认为nodejs文件名,默认为fork单进程模式
pm2 start app.js
  1. 自定义启动
1
2
# 启动并自定义进程名
pm2 start app.js --name processNames
  1. 负载均衡
1
2
# 负载均衡(服务器只是满足双核及以上),max为默认最大cpu数,可以自定义
pm2 start app.js -i max
  1. 目录监听
1
2
# 监听目录变化,默认不启动
pm2 start app.js --watch
  1. 携带参数启动
1
2
# 携带test和100启动进程
pm2 start app.js -- -test -100

配置启动脚本

  1. 首先,编辑启动脚本内容
1
2
3
4
5
6
7
8
9
10
11
{
"apps": [{
"name": "app1",
"script": "./app1.js",
"watch": true
}, {
"name": "app2",
"script": "./app1.js",
"watch": false
}]
}
  1. 然后执行启动命令
1
pm2 start app.json

重启进程

  1. 重启/更新单个进程
1
2
3
4
# 重启0进程
pm2 restart 0
# 更新0进程
pm2 reload 0

区别:重启的过程是先停止(stop)进程,然后再开启(start)进程,可能会造成已建立连接的实效;更新的过程是先开启(start)一个或者若干进程,同时停止旧的进程接收请求,然后旧的进程结束以后,再关闭旧的进程。
2. 重启/更新所有进程

1
2
3
4
# 重启所有进程
pm2 restart all
# 更新所欲进程
pm2 reload all
  1. 优雅的更新一个/所有进程
1
2
3
4
# 优雅的重启0进程
pm2 gracefulReload 0
# 优雅的重启所有进程
pm2 gracefulReload all

备注:gracefulReload区别于reload的地方在于,会发送一个shutdown的消息给旧的进程,这个过程可以在程序中监听到,然后根据自己的业务逻辑进程处理。

1
2
3
4
// 这里我们可以监听到‘shutdown’,然后在里面可以自定义一些跟自己项目相关的业务逻辑
process.on('shutdown', function () {
server.close();
});

进程日志

1
2
3
4
# 实时查阅进程0的日志
pm2 log 0
# 查阅所有进程的日志
pm2 logs

停止进程

1
2
3
4
# 停止0进程
pm2 stop 0
# 停止所有进程
pm2 stop all

删除进程

1
2
3
4
# 删除0进程
pm2 delete 0
# 删除所有进程
pm2 delete all

进程列表

1
2
# 查看进程状态
pm2 list

进程监控

1
2
# 监控所有进程的实施状态
pm2 monit

保存配置

1
2
# 保存当前所有进程任务
pm2 save

还原配置

1
2
# 还原最后一个保存的所有进程任务
pm2 resurrect

应用场景

守护进程

当进程出现崩溃、异常停止等现象时,pm2会帮你重启该进程。

进程监控

实时查看进程的cpu、内存占有情况以及运行状态等。

日志管理

所有pm2日志会默认保存在~/.pm2/logs目录下,以进程名命名生成相应的日志文件,可以借助pm2-logrotate模块实现日志的按时间或者大小切割,便于归档记录,排查故障。

概述

Tmux 是一个优秀的终端复用器类自由软件,但使用 BSD 许可发布。用户可以通过 tmux 在一个终端内管理多个分离的会话,窗口及面板,对于同时使用多个命令行,或多个任务时非常方便。

基本操作

会话

  1. 新建会话
1
2
3
4
# 新建会话,会话名默认生成
tmux
# 新建会话,并声明会话名
tmux new -s session_name
  1. 正在运行会话列表查阅
1
tmux ls
  1. 打开一个正在运行会话
1
tmux a -t session_name
  1. 退出当前会话
    快捷键:control+b,d
  2. 删除会话
1
2
3
4
# 删除一个正在运行的会话
tmux kill-session -t session_name
# 删除当前会话名以外的其余会话(不指定会话名,默认保留第一条会话)
tmux kill-session -a -t session_name

分屏

  1. 横向分屏
    快捷键:control+b,%
  2. 纵向分屏
    快捷键:control+b,”

杂项

  1. 移动光标
    快捷键:control+b,方向键
  2. 显示系统时间
    快捷键:control+b,t
  3. 关闭窗口
    在当前会话下,将光标移动到待关闭窗口,然后敲命令exit即可关闭窗口。

应用场景

代码调试

在Linux或者Mac终端水平或者垂直切割屏幕,将切割区域分为代码部分、编译部分、调试效果展示部分、日志记录部分等,当我们需要debug时:在代码部分敲入代码,然后在代码编译部分编译代码,最后在展示部分(可终端展示程序)查看效果,如果有问题呢,在日志部分也可以实时检查。可谓码农的编程利器啊!

系统监控

我们可以建立多个会话,分别监控我们需要关注的系统性能、报警等信息,比如cpu使用情况、网络使用情况、内存是否正常、磁盘是否够用等等,然后在每个会话里,我们还可以通过屏幕切割达到对于每项监控更加细致的分类,一目了然,掌控全局!

记忆标签

本地

很多使用Mac的同学都一个不成文的习惯,电脑长时间不关机,并且同时开启很多终端,原因有很多,比如担心重启电脑以后丢失之前进行到一半的任务,或则只是因为懒……当然,mac本身设计的很好,就算长期不重启也毫无压力。这个时候,其实我们需要一个记忆标签工具,来管理我们打开的数量庞大的终端们。不管开启多少个终端,只要我们简单的取个名字作为标记,下次再找的时候会快捷很多!

服务器

对于服务器来说,重启的机会更加微乎其微,这个时候,我们就更需要一个终端记忆标签工具来管理我们的远程会话了,当我们ssh连接服务器时,遇到突发事件,比如被叫去开会,或者下班了,没关系!在开完会或者第二天上班以后,我们还可以进入当时那个会话,继续之前没有完成的工作。

介绍

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。

连接方式

秘密验证

连接命令:

1
ssh username@ip

注释:其中username是服务器的用户名,ip是服务器的地址,然后输入服务器端该用户的登录密码即可完成连接验证。

密钥验证

  1. 生成密钥
    在客户端生成公钥和私钥,此处我们使用rsa作为加密方式(加密方式另外还有rsa1、ecdsa、ed25519、dsa等),使用以下命令生成密钥:
1
ssh-keygen -t rsa

并设置文件名和秘密(这里我们定义文件名为id_rsa),然后会在目录_.ssh_下生成私钥文件id_rsa和公钥文件id_rsa.pub。
2. 连接验证
生成密钥文件以后,将公钥放置在服务器端的目录
_.ssh_authorized_keys下,然后在客户端使用私钥进行免秘密验证,连接命令:

1
ssh -i ~/.ssh/id_rsa username@ip

快速连接配置

在文件目录~_.ssh_下有个config文件,我们可以将上文两种连接方式中写在里面,然后直接以ssh+服务器简称的方式进行快速连接。

  1. 秘密配置
1
2
3
4
Host    server01
HostName 192.168.1.10
Port 22
User username

注释:22是ssh的默认连接端口(可变更)。配置完成以后,可以通过以下命令连接,连接时需要再次输入密码。

1
ssh server01
  1. 密钥配置
1
2
3
4
5
Host    server02
HostName 192.168.1.11
Port 22
User username
IdentityFile ~/.ssh/id_rsa

注释:其中IdentityFile为私钥文件的路径。配置完成以后,可以通过以下命令连接,连接时无需再次输入密码。

1
ssh server02

搭建通道

最简单的文件复制通道,执行命令:

1
scp -i ~/.ssh/id_rsa '待传送文件' username@ip:'目标传送目录'

通过以上命令,可以建立客户机和服务器之间或者两台服务器之间,文件单向传送的通道。

安全性

SSH旨在保证非安全网络环境(例如互联网)中信息加密完整可靠。不过,SSH它也被指出有被嗅探甚至解密的漏洞。这里我们就不做具体介绍了。

linux,ubuntu,root,xshell,ssh

  • 启用root用户
  1. 配置过程
    [workspace]@username:$ sudo passwd root
    [sudo] password for fwind:
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully
    workspace@username:
    $ reboot
  2. 完成
    root@username:~$
  • 连接ssh
  1. 修改配置文件
    使用root权限用户打开ssh配置文件:
    vim /etc/ssh/sshd_config

找到“PermitRootLogin prohibit-password”一行,将“prohibit-password”改为“yes”,然后重启ssh服务;
2. 重启
在root下重启ssh服务,然后。。。就可以在xshell下使用ssh肆无忌惮的连接linux了。
sudo service sshd restart

ps: vim 是linux下一款非常强大的编辑器,后续会有相关使用心得,敬请期待!

linux,vim

  • 查看
    在控制台下直接输入vim可以查看vim基本信息:
    vim

vim.png
键入以下命令,即可使用vim查看文件内容 :
vim [文件名]

  • 显示行标
    在查看模式下,输入组合键Shift加:,输入命令:set number
  • 行操作
    1.定位最后一行:输入组合键Shift加G
    2.定位第一行:输入组合键Shift加1G
    3.定位第n行:输入组合键Shift加nG
  • 移动光标
    1.移动光标到行首::输入组合键Shift加^
    2.移动光标到行首::输入组合键Shift加$
  • 编辑
    直接输入i,可以开启编辑模式,使用键盘方向键移动光标进行编辑,退出编辑模式按Esc键即可。
  • 删除
    1.删除一行:双击d
  • 退出
    在查看模式下,输入组合键Shift加:,如果文件内容有变化,输入**!wq保存退出;如果文件内容无变化,直接输入q即可退出;如果文件内容有变化但是又不打算保存,可以输入!q**强制退出不保存。

ps:vim编辑器极为强大,这里只是冰山入门一角,感兴趣的同学可以自行查阅学习。

linux,ubuntu,command

  • 黑客帝国来袭
    安装:
    apt-get install cmatrix

执行:
cmatrix
效果:
cmatrix.png

  • 火焰
    安装:
    apt-get install libaa-bin

执行:
aafire
效果:
aafire.png

  • 小火车,呜呜呜
    安装:
    apt-get install sl

执行:
sl
效果:
sl.png

0%