作者: 孟繁永

  • 自制热敏打印机连接器始末(2)从跨平台方案开始

    接上一篇,选择vue+electron之后,那就按electron-vue这个来。虽然能跑起来,但是代码上传到git以后,收到很多高危报警,https://github.com/futuremeng/electron-vue-escpos-bridge

    尝试升级一下,结果发现因为版本已经差太多,需要花很多时间修,遂放弃。通过检索,发现有一个新的方案,https://nklayman.github.io/vue-cli-plugin-electron-builder/

    于是,开启新的https://github.com/futuremeng/vue-electron-builder-escpos-printer-bridge

    先用vue cli4创建一个新的项目,再vue add electron-builder。尝试运行yarn electron:serve 的时候提示Vue Devtools下载失败,需要翻墙跑成功一遍才行。

    接下来分析打印机如何连接,通过检索发现escpos这个协议,据说是大部分打印机都支持的。那么是否可以用escpos直接驱动打印机呢,网上有树莓派的示范。

    在寻找合适的escpos驱动的时候,发现了各种版本的,除了java、python,还有php和node,我决定选择node版的https://www.npmjs.com/package/escpos

    但是,当然当我尝试引入到项目的时候,悲剧发生了。

    ERROR Failed to compile with 1 errors 16:30:59

    error in ./node_modules/escpos/statuses.js

    Module parse failed: Unexpected token (7:7)
    You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
    |
    | class DeviceStatus {

    byte = ”;
    | bits = [];
    | bitsAsc = [];

    @ ./node_modules/escpos/index.js 12:17-38
    @ ./node_modules/cache-loader/dist/cjs.js??ref–12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref–0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/App.vue?vue&type=script&lang=js&
    @ ./src/App.vue?vue&type=script&lang=js&
    @ ./src/App.vue
    @ ./src/main.js
    @ multi (webpack)-dev-server/client?http://192.168.3.139:8080&sockPath=/sockjs-node (webpack)/hot/dev-server.js ./src/main.js

    见到是loader的问题,我就尝试配置babel-loader script-loader file-loader。都没有解决问题,实际上,我也不是很了解这些loader到底是干什么的。

    在这个过程中,了解到CommonJS和ES6这些区别,还有,在网页版的vue项目和electron中还涉及到运行环境的问题,网页中没有办法直接调用node接口。

  • 自制热敏打印机连接器始末(1)不想花钱,还想跨平台

    前情回顾:做了一个网站,需要在网页上打印二维码,将热敏打印机连到电脑上,在网页上直接用print打印出来的二维码完全无法识别,应该是分辨率的问题,因为屏幕的分辨率和打印机的分辨率差太多。所以寻找解决方案,找到了c-lodop.com这个网站提供的中间件,需要付费,而且只有win版。

    需求分析:现在重构网站,计划做成saas模式,在打印模块上,需要尽量摆脱第三方的束缚,所以构思如何自己实现。

    网页到打印机,这中间是网页-浏览器-操作系统-usb-打印机,这样一个路径。经过确认,网页直接连打印机是不显示的,有一个比较接近的办法是通过chrome的app方案,但通用性不高,放弃,那就只剩下跟lodop一样的模式了,要么把整个网站构建成桌面程序,要么通过中间件来连打印机,网页再通过http或者socket驱动中间件。

    当然,选择一个中间件是比较合适的,整个后台构建成桌面程序,没有必要,维护起来也太笨重。

    接下来,就是选择跨平台的桌面程序方案来做这个中间件了。需要实现几个部分,一是http或者socket,二是打印机连接,中间的打印机连接管理。

    当然,首选相对比较熟悉的vue+electron的方案。

  • 老家的房子

    老家的房子,没有多少人住了,房子没有人住,就坏的快了。

    我家的屋脊瓦片滑脱,需要重新盖压,找不到人。

    我小姑家的房梁塌陷,找不到包工队承接修复的活儿。

    虽然做了确权,但是不知道什么时候就要拆了,所以没有办法投入改造成度假的拥有现代居住条件的房子,村子里的环境也不是一家两家能改善的。

    前几年有说法是乡村沦陷,这是真的,沦陷不在于乡村的沉沦,而在于完整产权的丧失。

  • 将自建jenkins注册到百度效率云的ipipe

    对应百度效率云的这个文档:https://cloud.baidu.com/doc/XLY/s/Fjwvy8aq6#jenkins-%E6%8F%92%E4%BB%B6%E7%94%A8%E6%88%B7%E6%8C%87%E5%8D%97

    由于官方的文档用起来很多误解,这里做一下简单的说明,方便大家使用。

    首先是jenkins的安装。由于百度效率云目前的jenkins插件比较老,用最新版的jenkins无法配置成功,所有需要为百度效率云部署一个专用的jenkins,这里我称之为中继jenkins。最初,我是按百度的文档所提到的方式,下载jenkis.war,并使用

    nohup java -Dfile.encoding=utf-8 -Dhudson.model.ParametersAction.keepUndefinedParameters=true -jar jenkins.war –httpPort=8888 &

    这个命令来部署,同时我的业务jenkins是用docker的方式部署。后来,我将业务jenkins改为yum install jenkins直接安装在宿主机了,于是需要把这个效率云jenkins改为docker,避免冲突。

    部署中继jenkins,我使用的是以下命令:

    docker run -d -u root –restart=always -p 8888:8080  -v /jenkins_xly:/var/jenkins_home –name jenkins_xly -idt jenkins:2.19.1

    运行后打开IP:8888,即是通常的账户密码初始化过程,接下来是插件,我取消了所有插件的安装,因为这个jenkins实例只用来转发百度效率云的构建推送。

    下载百度效率云的jenkins插件

    ipipe-agent.hpi,地址在文章开头那个链接中,通过百度网盘下载。在系统管理-插件管理-高级那里上传这个插件。

    回到系统管理,找到iPipe agent management,按照提示填写几个字段。

    • ipipe Url:效率云:https://xly.bce.baidu.com/${企业名}/${项目名}/ipipe,可以打开效率云的ipipe页面,复制上面的url,将多余的参数去掉即可。其中企业名好理解,但项目名不好理解,因为效率云上实际上可能已经有多个项目,这里选择你要用的主要的项目,一般也是英文字母。
    • enterprise:就是上面这个url中的企业名,实际上是英文字母。
    • Jenkins Name:给当前的jenkins取个名字,如果是重复设置(像我是之前部署过重新部署的),最好跟之前的不同,否则在效率云看到的是一样的job,无法区分。在效率云的流水线设置时,下拉框显示为:Jenkins Name+ Jenkins Job Name(这个JobName就是当前这个jenkins中配置的job的项目名称。)
    • Username:是当前的jenkins实例的用户,比如用你登录jenkins的这个用户名。

    点击Save,正常的情况下就直接跳转了,没有报错,如果有问题,会有报错,比如用最新版的jenkins,可以装上这个插件,但在这里提交时会报错,问题出在有一个JenkinsUUID的参数,在最新版的jenkins上是空的,我跟百度效率云团队提过这个问题,但至今尚未修复。所以只好多此一举,继续用jenkins2.19.1来中继。

    创建jenkins的job

    item name即项目名称,尽量用英文字母写清楚,前面提到了,这个名字会出现在效率云中作为选择job的依据。

    因为我前面部署这个中继时没有安装其他插件,所以我这里只需要选择构建一个自由风格的软件项目即可。而实际上,这个job需要做的也只是转发一下请求。

    在job的General配置中,找到iPipe配置,只需要填写项目标识,这个项目标识跟ipipeUrl中那个项目名是一回事儿,但实际上效率云在相应的项目中显示相关job时应该是以这个job中配置的项目名为准,而前面ipipeUrl中那个项目名应该是插件的历史遗留问题,早期只考虑到一个项目的注册方式。

    然后在构建Build中添加一个执行shell,只添加一行命令:

    curl {你的业务jenkins的某个job的webhook地址}

    job的配置到此结束。

    接下来,我们先去效率云验证下这个job能否被触发。

    按照百度效率云的文档配置流水线即可,需要注意的是我开始有一个误区,就是代码触发时要选merge,而不是change。否则提交代码到代码库时不会触发流水线。

    最后,简单提一下我们的业务jenkins需要做什么配置来响应中继jenkins的curl请求,这个未必是最好的方式,因为不能传递参数了,也许应该用触发远程构建之类的实现,我对jenkins还不够了解。

    假定按curl的话,我们需要在业务jenkins安装一个generic-webhook-trigger插件,然后在业务jenkins的job中启用这个插件的配置,填写token这个参数,这个token只要在当前的jenkins的jobs中不重复即可,但为了方便识别,我一般会加上项目标识,比如itemname-rR74nddfdsfs23mm

    然后上面curl后面的网址就有了,格式是

    http://JENKINS_URL/generic-webhook-trigger/invoke?token={token}

  • 高铁

    有朋友在负责丰台站和雄安站的装修项目,听说进展比较顺利,而京雄高铁往南就过衡水到商丘,最终到台湾,全程成为京台高铁。

    我在衡水的房子里新规划的衡水南高铁站差不多5公里,算是一个利好。不过,前几天回老家,一个老家的已经当了爷爷的大哥提到高铁一脸的不屑,说修的越多越赔钱,我想这倒也是事实,以目前的票价,回衡水的高铁票差不多要100块,如果是5个人来回就是一千,比开车的过路费和油钱加起来还多,况且,就算做高铁到了衡水还是要接着打车。

    这么算下来,即使通了高铁,我多半也是不会坐高铁回家的。

    事实上,高铁也确实是贷款赔钱,这些钱是摊在所有老百姓头上的。

  • 民宿

    前几年先后经营过三个公寓型民宿,后来因为政策原因被关闭,到去年又被通知可以登记后再开,但已经没有房源。

    待到瘟疫期间,还得庆幸手上已经没有房源,否则短期出租肯定收到很大影响,能否转为长租也不好预期,至少在比较紧张的阶段是不好租的,连看房都困难。

    到现在为止,尚未能找出什么适合作为工作外收入的方式,开淘宝店和做无人机生意都是过去式了。

    目前陷入了一个停滞期,工作上似乎也很难有什么突破,尽管还有项目可做,但没有什么创新性能够带来实质性的提升空间。

    对无线电有一点兴趣,了解到SDR,但是那些开发板不便宜,还是有比较高的进入成本的,而且往后推导也看不到能玩出什么花样来。

  • 关于长毛象

    Mastudon是microblog的一个衍生版。

    十几年前博客火,到了2007年前后出现微博客,也出现了一批实例,后来剩下新浪和腾讯还有人民啥的,到最后只剩下新浪。

    博客在完成了中心化之后死掉了,微博也走向了中心化,短期看还不会死掉,但已经有趋势。

    云的兴起带来了中心化,但同时区块链的出现代表了去中心化的趋势。Mastudon就是微博去中心化的一种版本。

    在开放网络环境下,用一个树莓派就可以搭建一个大家都用访问的实例,但在管制网络下所有端口都被屏蔽,几乎成了单向网络。所以长毛象前几年出来后在中文圈没有多少用户,只是到了最近有一些较有影响力的人开始关注和开设实例,才有了成千上万的人去注册。

    目前还看不到长毛象能带来多少实质性的影响力,主要观察两点,一个是是否提供丰富的事实信息,一个是能否提供话题讨论的支持。这一波用户更多的只是出来抒发一下憋闷的心情,有点像监狱里的短暂放风,既掌握不到什么有效信息,也因为仍然身处监狱,并不是真正自由的,顶多原地跑跑跳跳。

  • 如何修理不平衡的平衡車

    女儿的小伙伴有一个平衡车,她很快就学会了怎么玩,也想拥有一个,我看了看,没舍得买个新的,果断下手一个100元的故障机,就当自己练手,修好了就赚了。

    结果买的时候也没通电,拿回来开机根本站不住,比视频里跑的快多了,一直滴滴响。

    于是拆机检查,发现螺丝不全,电池固定扣已经损坏,壳里面有沙子,是否进水不好说,至少是打开修过。心一下子就凉了。

    接下来用万用表反复测试,观察板子上的电压,逐步搞清楚哪个板子管姿态,哪个板子是主控,按照pcb上的一些字样查到是A8这样一个比较典型的早期型号。

    买一套新的主板需要两百多,老婆不同意,三百块可以买个新的了。

    于是抱定决心一定要修好,然后开始继续研究。

    通过观察姿态板不同角度下的反应发现有一个角度似乎可以让平衡车稳定下来,但又很难保持,初步怀疑是陀螺仪坏了,这东西在玩无人机的时候接触过,要是坏了肯定炸鸡。但如何确认是陀螺仪坏了挺麻烦,光看电压看不出来。

    万用表不够用就需要示波器了,那个玩意不便宜,接下来两天就研究示波器,选型,看教程,然后发现,如果是数字信号还要用逻辑分析仪,那玩意也不便宜。两个都买个要一两千,还是基础版。

    没办法,回头补基础电路知识,看看能否在其他方面找找线索。然后就看了好几天电感和电容的东西,顺便说台湾的视频讲得比较好。

    其实买平衡车的时候就抱着一个念头,重置一下平衡就好了,但是拿到以后试了一下重置并不成功。现在看了一圈下来,还是觉得基本可以排除物理故障,正好收到阿尔郎官网一个重置办法,按开关20秒。然后,就修好了。

    还有一种方法,如果带遥控的话,按一个组合键就行了。我买的这个不带遥控板。

  • ubuntu+ xfce4搭建vps运维主机

    某种情况下,我们需要一个固定IP用来做平台运营。

    为了降低投入,选择ubuntu+xfce4(2U2G)的方案。

    ubuntu选择了最新的18版本,其实随便哪个都行。

    桌面选择xfce4据说是性能较好的,也不需要运行什么复杂的应用,主要是浏览器操作。

    下面说一下主要步骤:

    (1)初始化一个ubuntu18的镜像,一般都是server版,可以选择密钥登录

    (2)用密钥登录到服务器,命令一般是:ssh -i miyao.pem root@ip

    (3)先更新一下系统apt update以及apt upgrade

    (4)安装桌面:apt install xfce4

    (5)安装远程:apt install vnc4server

    (6)运行远程服务:vncserver,会让你设置一个密码,后面会用到这个密码连远程登录

    (6)修改~/.vnc/xstartup中的内容为:

    #!/bin/sh 
    unset SESSION_MANAGER 
    unset DBUS_SESSION_BUS_ADDRESS 
    startxfce4 & 

    [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup 
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources 
    xsetroot -solid grey 

    (7)重启vncserver

    修改配置文件后,运行如下命令结束掉之前产生的窗口:1

    vncserver -kill :1 

    (8)重新启动:vncserver

    (9)设置vps的远程端口到安全组,vnc默认端口是5900,启动了第一个桌面就是5901,所以至少把5901开放出来

    (10)在本地电脑用vnc软件链接:IP:5901,输入上面设置的密码即可

    (11)如果需要修改分辨率vi /etc/sysconfig/vncservers

    找到这样的内容:”-geometry 800×600″,修改里面的数字即可,比如”1440×900″,生效需要重启vncserver

    (12)安装中文支持

    apt-get install  language-pack-zh-han*
    apt install $(check-language-support)

    apt install fcitx-googlepinyin

    (13)安装浏览器:apt install firefox