二维码小工具

现在大家随处可以看到二维码,二维码是相对于原来的一维条形码来说的,二维码的种类很多,常见的包括QR CodePDF417码等。我们目前经常看到的微信支付宝的付款码等都是QR code,QR Code相比其他二维码有很多优势,包括容错性,快速响应性等,它支持40种尺寸,从21*21177*177。随着尺寸的增大,每个二维码保存的信息量也随之增大,但也有个问题就是手机扫描识别的成功率会降低,特别的对于大尺寸的码很多程序是不识别的。关于QR Code大家可以参考这篇文章,写的很棒。

二维码本质是一种保存信息的载体,它可以保存二进制、数字、字符等,不同类型编码方式不同,保存的信息量略有区别。二维码的存在也使得信息快速传递成为可能,相比原来的输入一长串网址,扫描一个二维码要快捷准确的多,这方面二维码相对于目前的图像识别也要更准确、容错性更高。你可以利用二维码保存、传递很多东西,限制你的只是你的想象力。

近期突发奇想,想通过二维码来传递大数据量的信息,找了相关资料后,发现单个二维码容量是有限制的,具体可以参考这个网站,例如VERSION 20的二维码可以保存1600个数字,保存970个字符,具体保存的多少还和容错率有关。为了实现通过二维码传递大量字符的目的,可以按照下面步骤来做:

  1. 将原始信息进行编码,可以采用UTF-8或其他格式。
  2. 将原始信息拆分为固定大小的子串,并且标明子串的序号(便于后续还原)。简单的方式可以在字符串开头几位用于表示顺序。
  3. 将这些子串编码,生成二维码。

上述过程是可行的,但有一个问题是由于大尺寸的二维码识别率不高,只能采用小尺寸的,但小尺寸的保存的信息又少,这样就导致生成的图片过多。为了解决这个问题,可以在一个图片中放多个二维码,这样的话可以提高保存信息量,并且保证每个二维码识别率;在还原的时候加一个预处理,将图片进行拆分即可。

针对上面说的内容我写了个java小程序,大家可以在这里查看使用,其中使用的是zxing的库。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

数据库自动部署工具Flyway使用

之前做过一个数据库的工具,可以从数据库中抽取所有应用关心的信息,包括表结构、分区、索引,存储过程,函数,序列,常量参数,技术配置表的内容等。有了这些信息可以检查确保环境配置的正确性,另外也便于开发人员检索使用。近期计划在组内搭建数据库变更脚本的自动部署及管理工具,进一步提高数据库变更的效率,保证变更的正确性。目前此类开源工具有很多,我们最终决定使用Flyway,它在Java项目中很常用,它可以批量对数据库脚本进行部署,并会对当前数据库环境的部署情况进行记录跟踪。

Flyway工具使用简单,它提供了Java API、Maven插件、命令行等多种使用方式,这些具体的使用方式在此就不详细介绍了,大家可以参阅“Flyway 官方文档”。下面结合我项目的特点来介绍下Flyway的使用,也欢迎大家批评指正。

我们项目本身比较复杂,主要体现在下面几个方面:

  1. 从数据库角度整体分为联机数据库、批量数据库,对于特殊产品还会有其他数据库服务器,例如信息报告数据库、第三方支付数据库(主库、多个子库)、海外业务数据库(多个)等;
  2. 从测试环境上分为单元测试环境、PL1-PL4共4个应用组装测试环境、VT环境、生产环境,这些不同环境之间的表空间,数据库个数也有差异;
  3. 多个时间点的版本会并行进行开发测试,不同版本的测试环境也不同,且同一个测试环境的版本可能会出现跳跃。

众所周知,不同环境的数据库要尽量保持一致,这样在维护方面会简单很多,但有些差异是很难避免的。为了更好的解决不同环境的差异我们设计了一套模板体系,只需要上传一套sql变更脚本,然后通过程序来生成不同环境的特定脚本,便于部署。另外此程序还会完成变更脚本的比对工作,并输出比对结果,从而保证模板和具体环境脚本的一致性。具体程序代码见FlywayMigration Git,大家可以自由使用,后续此程序的功能还会继续完善。

目前我们的sql变更脚本的目录结构如下:

+ dbscript
|- ljdb // 联机数据库
    |- baseline //存储当前数据库的基线信息
    |- common //所有环境通用的信息
        |- 20170819 //按版本建立不同的目录
        |- 20170922
    |- template //模板信息
        |- 20170819 //按版本建立不同目录
        |- 20170922
    |- unit //单元测试
        |- xxx  //目录下内容会自动生成
    |- vt
    |- template-config.yml
|
+- pldb //批量数据库
    |-xxx //同ljdb

其中template目录下是按照版本保存的模板文件,unit、vt等特定环境目录是程序自动生成的,且不允许手工维护。 通过上面的做法可以很好的做到对环境差异的屏蔽。对于第三个版本跳跃的问题目前没想到好的方法,目前想到的方法是通过不同版本使用不同的非交叉版本号,当版本跳跃时设置Flyway允许不校验执行顺序,另外通过最开始提到数据库信息抽取工具对变更结果进行比对,从而保证正确性。

这里有个小故事想和大家分享下:最开始在安排脚本目录结构时计划将template、unit、vt等特定环境的目录放在版本点如20170819的目录下,以便同一个版本的所有变更脚本都在一起,便于维护,目录结构类似ljdb/20170822/common、unit、vt、template这样。这样一来针对某个环境部署sql脚本时就需要根据环境名称来过滤需要的脚本,例如对于unit单测环境同时需要ljdb/*/common+unit多个版本点的目录。在网上找了很多地方,发现flyway不支持这种路径过滤方式,只能把多个版本点的路径通过程序一一列举,这样体验很差,而且容易出现sql脚本部署的遗漏。官方对此的说法是通过调整目录结构来解决。当时还觉得不爽,现在回头看调整目录结构后反而觉得更清爽了。站在这个角度官方的做法反而很值得推崇,不提供不必要或者容易误用的功能。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

自动化工具Ansible简介

本网站托管在Linode下,操作系统原来是Ubuntu 14.04,近期决定将系统升级到16.04版本,为后续的软件更新做准备。经过在网上查阅相关的教程,并没有发现好的方法,比较安全的方法是重装操作系统,然后重新安装相应的软件。其实这并不是多麻烦的事,但想到以后还会有很多这样的情况,比如下次的系统升级或是网站搬家,就又要做重复的工作,就很不爽。那有没有可以自动完成这件事的方法呢?有,就是这篇博客要介绍的Ansible。

Ansible是一个自动化工具,可以很方便的完成对多个服务器的软件安装部署,也可以执行一些例行的常规任务比如备份、升级等。它是采用python开发的,但作为用户来说不需要python语言基础,只需要了解它的yaml语法、常规命令、roles的架构规范即可。

Ansible的使用方法可以参考它的官方文档,也可以看国内的中文版,可以更快上手。对于Ansible原理和最佳实践,可以参考资料1 2 3。对于Ansible的学习建议参考官方文档边学边做,并使用解决实际问题,这样会快很多,而且在解决实际问题时会体会深刻。软件安装时建议使用最新版(我使用的是2.3.1版),可以使用一些更高级的命令,简化操作。另外建议使用虚拟机或是Docker容器来练习,可以反复操作,而且不用担心玩坏了。

学习Ansible的过程除了学习具体知识外另一个大的收获是可以通过Ansible Galaxy找到很多自动化安装软件的方法,可以打开你的视野,摆脱在google上找安装教程的旧方法。

最近我在我的网站服务器上部署了NextCloud(类似Dropbox),作为自己的私人云盘,实现不同电脑文档的同步。这里把安装使用的Ansible playbook分享出来供大家参考4,详见我的github仓库nextcloud-ansible,大家可以自行下载试用。

参考资料:

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》

Dokuwiki新建中文词条

最近为了方便组内文档分享,整了一个Wiki平台。最终确定使用dokuwiki,经过一段时间的使用,发现还是挺好用的。

可以很方便的编辑文档,文档中插入代码,建立词条之间的链接,建立外部链接,对各种格式的支持也很好。

在dokuwiki中新建词条有几种方法:

  1. 在已经存在的页面中直接建立一个不存在的内部链接,然后保存;这个不存在的链接会显示为红色,直接点击这个链接,会跳转到一个不存在的页面;点击右边的菜单新建页面即可。
  2. 输入页面的名称,然后点击搜索。例如搜索 开发规范:java规范,在搜索结果页面点击右侧菜单新建页面即可。这时会建立命名空间为 开发规范,词条为java规范的词条。
  3. 直接在地址栏输入链接例如http://localhost/dokuwiki/doku.php?id=命名空间:词条名称。这个方法在chrome,safari等浏览器是支持的,因为浏览器会自动将中文转换位URI的编码,转换后的结果为:http://localhost/~zyh/dokuwiki/doku.php?id=%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4:%E8%AF%8D%E6%9D%A1%E5%90%8D%E7%A7%B0其实在服务器端看到的是转换后的结果。
  4. 对于不支持URI自动转换的浏览器,为了支持新增中文词条的页面我写了个小工具,有兴趣可以下载用一下。下载地址:http://www.itechlib.com/generateNewPage.html 使用方法:将源码中localhost/~zyh/dokuwiki替换为你的wiki地址即可。

[注]:dokuwiki中通过:号分隔 命名空间与词条名称,直接输入不存在的命名空间名称会新建命名空间。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《ITechLib》