分类归档 IT小常识

通过孟繁永

无用的知识:apt upgrade时pkg.jenkins.io无法连接造成jenkins启动失败

时常需要给服务器打打补丁,执行apt update后执行apt upgrade,但是奇怪的是jenkins升级后就挂了。

没有改什么配置,没有增加什么新的应用。用apt remove jenkins再apt install jenkins也不行。

Setting up jenkins (2.263.1) ...
Job for jenkins.service failed because the control process exited with error code.
See "systemctl status jenkins.service" and "journalctl -xe" for details.
invoke-rc.d: initscript jenkins, action "start" failed.
● jenkins.service - LSB: Start Jenkins at boot time
     Loaded: loaded (/etc/init.d/jenkins; generated)
     Active: failed (Result: exit-code) since Tue 2021-01-19 10:09:42 CST; 12ms ago
       Docs: man:systemd-sysv-generator(8)
    Process: 4798 ExecStart=/etc/init.d/jenkins start (code=exited, status=7)

Jan 19 10:09:41 iZ8vbajeqj6nb198cbbtgsZ systemd[1]: Starting LSB: Start Jenkins at boot time...
Jan 19 10:09:41 iZ8vbajeqj6nb198cbbtgsZ jenkins[4798]: Correct java version found
Jan 19 10:09:41 iZ8vbajeqj6nb198cbbtgsZ jenkins[4798]:  * Starting Jenkins Automation Server jenkins
Jan 19 10:09:42 iZ8vbajeqj6nb198cbbtgsZ jenkins[4798]:    ...fail!
Jan 19 10:09:42 iZ8vbajeqj6nb198cbbtgsZ systemd[1]: jenkins.service: Control process exited, code=exited, status=7/NOTRUNNING
Jan 19 10:09:42 iZ8vbajeqj6nb198cbbtgsZ systemd[1]: jenkins.service: Failed with result 'exit-code'.
Jan 19 10:09:42 iZ8vbajeqj6nb198cbbtgsZ systemd[1]: Failed to start LSB: Start Jenkins at boot time.
dpkg: error processing package jenkins (--configure):
 installed jenkins package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
 jenkins
E: Sub-process /usr/bin/dpkg returned an error code (1)

试过netstat -apn | grep 8080看端口占用,先是发现过阿里云盾,还以为是中毒了,用top看看cpu占用,不像。

把端口改成8888,也不行。

然后改天,直接执行apt update后执行apt upgrade就好了。原来就是pkg.jenkins.io不能连接造成的。

中间还曾经怀疑过java的问题,网上不少说是java没设置好或者缺少$JAVA_HOME的。并不解决我的问题。

再单独发一下jenkins状态的故障查询。

root@iZ8vbajeqj6nb198cbbtgsZ:~# systemctl status jenkins.service
● jenkins.service - LSB: Start Jenkins at boot time
     Loaded: loaded (/etc/init.d/jenkins; generated)
     Active: failed (Result: exit-code) since Mon 2021-01-18 17:30:42 CST; 1min 56s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 1878 ExecStart=/etc/init.d/jenkins start (code=exited, status=7)

Jan 18 17:30:41 iZ8vbajeqj6nb198cbbtgsZ systemd[1]: Starting LSB: Start Jenkins at boot time...
Jan 18 17:30:41 iZ8vbajeqj6nb198cbbtgsZ jenkins[1878]: Correct java version found
Jan 18 17:30:41 iZ8vbajeqj6nb198cbbtgsZ jenkins[1878]:  * Starting Jenkins Automation Server jenkins
Jan 18 17:30:42 iZ8vbajeqj6nb198cbbtgsZ jenkins[1878]:    ...fail!
Jan 18 17:30:42 iZ8vbajeqj6nb198cbbtgsZ systemd[1]: jenkins.service: Control process exited, code=exited, status=7/NOTRUNNING
Jan 18 17:30:42 iZ8vbajeqj6nb198cbbtgsZ systemd[1]: jenkins.service: Failed with result 'exit-code'.
Jan 18 17:30:42 iZ8vbajeqj6nb198cbbtgsZ systemd[1]: Failed to start LSB: Start Jenkins at boot time.
通过孟繁永

无用且过时的知识:Android studio配置国内镜像源

推荐的几个国内镜像源地址:

1、东软信息学院(笔者当前在用)

mirrors.neusoft.edu.cn     端口:80
2、北京化工大学

ubuntu.buct.edu.cn/ubuntu.buct.cn  端口:80
3、中国科学院开源协会

mirrors.opencas.cn (mirrors.opencas.org/mirrors.opencas.ac.cn)    端口:80
4、上海GDG镜像服务器

sdk.gdgshanghai.com   端口:8000
5、电子科技大学

mirrors.dormforce.net  端口:80

网上搜一下基本上都是这个内容,只是目前不需要了,而且如果按照这个设置了的话,很可能还会额外造成问题,因为这些镜像要么不存在,要么已经不维护了。

总体上来说,能够正确看待开发资源这个事情,是一点点进步。来自“资本主义”的安卓,本身没有什么罪恶,至少咱们还可以改个名字叫鸿蒙。

当然,谷歌也是有妥协的,专门给中国开发者弄了个中文站点。

通过孟繁永

Library/Application\ Support/Google/AndroidStudio4.1

mac上Android Studio重装了新版之后提示/Users/mengfanyong/Library/Application\ Support/Google/AndroidStudio4.1无法访问。

那就是没权限呗。有两种解决方案:

(1)sudo /Applications/Android\ Studio.app/Contents/MacOS/studio

用以上命令直接用管理员身份启动,但这样很麻烦。

(2)另一种是直接解决这个文件夹权限的问题:

cd /Users/mengfanyong/Library/Application\ Support/Google 
mkdir AndroidStudio4.1
sudo chmod -R 775 /Users/mengfanyong/Library/Application\ Support/Google/AndroidStudio4.1

很奇怪Android Studio为什么不调起管理员权限请求,把这个目录创建一下。希望下个版本能修复。

通过孟繁永

vue中使用fingerprintjs生成终端id

安装组件:

npm i @fingerprintjs/fingerprintjs -S
# or
yarn add @fingerprintjs/fingerprintjs -S

创建一个async的methord:

async asyncCall() {
      // We recommend to call `load` at application startup.
      const fp = await FingerprintJS.load()

      // The FingerprintJS agent is ready.
      // Get a visitor identifier when you'd like to.
      const result = await fp.get()

      // This is the visitor identifier:
      const visitorId = result.visitorId

      console.log(visitorId)
      return visitorId
    }

在业务代码中使用:

this.asyncCall().then(res => {
            const terminalId = res
            that.$api
              .Login({
                employeeNumber: that.formLogin.employeeNumber,
                password: that.formLogin.password,
                terminalId: terminalId,
                terminalType: that.formLogin.terminalType
              })
              .then(() => {
              // 登录成功后的操作
               
              })
          })
通过孟繁永

弃坑墨刀,转用Pencil Project

用了两年的企业版墨刀,今年决定不续费了,太贵了,不好意思让公司掏钱买。

看了下,在墨刀上也攒了不少项目了。这算是这两年的钱没有白掏,至少比之前见不到任何项目痕迹要好得多。

但是如何留存项目过程的设计文档,如何更好地进行版本管理,如何更好地同步团队的开发进度,多模块交叉开发,始终是一个问题,不希望过多的精力放在需求管理上,但放得太粗了,没有一个特别紧密配合默契的团队是很难进行的好的。

暂时用Pencil Project,然后基于它想办法来实现在线同步。

通过孟繁永

宽带垄断,依然难破

最近办公室的网挂了,挂的很彻底,一个搞不请到底是电信通还是联通几级代理的提供商和下级之间打了起来,互相掐网。

我为了能让联通接入进来,依据一个文件的指示,开始投诉。

这个文件并不是这几年第一个,搞不清楚是第几次了。文件本身质量并不高,虽然描述了各个部门的职责,但真不知道该从哪里下手。

文件原文看这里:http://www.gov.cn/zhengce/zhengceku/2020-10/06/content_5549492.htm

工业和信息化部 公安部 住房和城乡建设部 国务院国有资产监督管理委员会 国家市场监督管理总局

关于开展商务楼宇宽带接入市场联合整治行动的通告

工信部联通信函〔2020〕211号

为进一步规范商务楼宇、办公建筑、园区等场所(以下统称商务楼宇)宽带接入市场,打通提速降费梗阻,保障宽带用户合法权益,不断优化中小企业发展环境,工业和信息化部、公安部、住房和城乡建设部、国务院国有资产监督管理委员会、国家市场监督管理总局决定自2020年10月至2021年6月组织开展商务楼宇宽带接入市场联合整治行动。现将有关事项通告如下:

一、电信运营企业及其业务代理,商务楼宇产权人及其委托的管理人、物业服务企业不得签订任何形式排他性质的宽带接入协议或约定,不得强制商务楼宇承租人接受指定服务并收费,不得阻止电信运营企业根据用户需求进入商务楼宇提供公共电信服务,不得约束限制电信运营企业公平接入和使用商务楼宇内通信配套设施。

二、电信运营企业及其业务代理应在商务楼宇内醒目位置公布服务项目、服务内容、收费标准、服务监督电话和市场监管投诉举报电话等。商务楼宇产权人及其委托的管理人、物业服务企业应向各电信运营企业及其业务代理平等开放商务楼宇内通信配套设施,应在商务楼宇内提供专门醒目位置,为电信运营企业及其业务代理公布宽带接入服务信息提供便利。

三、电信运营企业及其业务代理为用户提供通信服务时,除按照其已公示的电信资费标准收费外,不得另行收取其他费用。商务楼宇产权人及其委托的管理人、物业服务企业在配合提供通信接入服务时,不得向电信运营企业及其业务代理收取公示的收费项目之外的费用。

四、2017年4月1日后新建商务楼宇的建设单位应严格执行《综合布线系统工程设计规范》(GB50311)及相关标准,将楼内通信配套设施纳入建设项目的设计文件,所需投资应纳入建设项目概算,并随建设项目同步设计、同步施工、同步验收,不得由第三方公司作为单独工程项目进行投资建设并经营获利;设计单位、施工图审查机构应严格按照国家标准要求进行设计和审查;新建商务楼宇的通信配套设施未按要求竣工验收或验收不合格的,电信运营企业不得将其接入公共电信网。

五、各省(自治区、直辖市)通信管理局、公安、工业和信息化、住房和城乡建设、市场监管部门要加强对商务楼宇宽带接入市场违法行为的监管和处罚。

通信管理局会同住房和城乡建设部门对电信运营企业或其代理商与商务楼宇产权人及其委托的管理人、物业服务企业达成排他性协议或约定,以及限制平等接入等行为进行查处。通信管理局依法对无证经营、超范围经营电信业务等违规行为进行查处。住房和城乡建设部门、通信管理局依照职责加强对商务楼宇建设单位、设计单位、施工图审查机构的监督管理。市场监管部门依法对相关市场主体存在的商业贿赂不正当竞争、价格违法等行为进行查处,涉嫌构成垄断行为的,严格依法处理。对以暴力、威胁手段,强迫他人接受指定电信业务服务,或者强迫电信运营企业及其业务代理退出电信业务服务,情节严重,涉嫌强迫交易罪或者其他犯罪的,由公安机关依法严厉打击。

特此通告。

工业和信息化部

公安部

住房和城乡建设部

国务院国有资产监督管理委员会

国家市场监督管理总局

2020年9月30日

首先想到的是找通信管理局投诉,于是找到http://bjca.miit.gov.cn/n817064/n817255/n1096242/index.html这个地址,提交投诉,一直没消息。这个页面做得也很应付事儿,完全没有必要强制限制用户阅读条款,等待那么长时间才能点确认投诉,而且我提交了之后查询结果还要再等一遍。

后来,找到了工信部的投诉,在首页http://www.nsae.miit.gov.cn/点“电信申诉”跳到这里https://yhssglxt.miit.gov.cn/web/,下面有个各省局,选北京之后又回到了北京通信管理局。

其实,点顶部导航的“用户投诉”就对了,填写到投诉对象的时候,我发现我找不到现在的运营商,于是转念一想,既然我想接入联通,就投诉联通吧。

没想到,工信部这个响应挺快,联通很快就来电话了,最终指派到了附近的营业厅来处理。

接下来的进展后面再写。

通过孟繁永

为什么不应该庆祝gitee比github更快

有搞开发的同事庆幸gitee速度很快,但也有同事提醒github打包下载代码更快。

找有用的新的项目肯定还是github优先,当github被限速越来越严重的时候,获取好项目的机会就越来越低,何况,自己的网连阿里云都会很慢,这样的办公条件有什么好庆幸的呢?

尽管我也不怎么在github上贡献代码,至少还点个真实的star,我不想在一个充斥者虚假的商业开源代码的gitee上浪费太多时间。

通过孟繁永

前后端分离的微信开放平台网站应用实现微信登录的本地调试

前面那一篇说了基于laravel+vue的实现方式和不要踩的坑,这一篇记录一下如何实现本地调试和线上部署。

当然,线上就按上一篇就好了,在vue-wxlogin里面配置appid(微信开放平台里面的网站应用的appid,需要先申请),laravel里需要配置appid和secret。

现在主要说一下如何在本地调试。vue-wxlogin显示二维码的时候需要appid和回调地址一致,如果把线上域名反向隧道到本地,那么线上就用不了,如果用本地的hosts来解析,那么就无法同时访问线上的版本。所以比较好的办法是专门申请一个测试用的网站应用,比如portal.local.futuremeng.com,通过vi /etc/hosts添加127.0.0.1 portal.local.futuremeng.com来将这个域名解析到本地环境。

然后在本地的nginx中添加一个站点,配置文件如下:

server {
     listen 80;
     server_name portal.local.futuremeng.com;
     charset utf8;
     location / {
        proxy_pass http://192.168.2.180:6060/;
        add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' 'unsafe-eval'; object-src 'self'; style-src 'self' 'unsafe-inline';";
        proxy_set_header Host            $host;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }
}

其中,IP换成你自己的电脑的IP,如果是docker跑的nginx,需要指定为本机的局域网IP,也就是docker的宿主机IP,否则,如果设置成127.0.0.1是访问不到后面在vscode中建立的服务的。

最后打开vscode,打开vue项目,设置一下devServer的port,我用6060是为了同时npm run serve起多个前端项目,而这一个专用这个端口,以便nginx这里能够保持可用。

通过孟繁永

前后端分离的微信开放平台网站应用实现微信登录

先说下项目结构:前端vue,后端laravel。

其中前端用vue-wxlogin这个组件来显示微信登录的二维码。

这个组件中的appid填写微信开放平台中的网站应用的appid,redirect_uri填写微信开放平台中的网站应用登记的授权回调域。

这个授权回调域可以和网站应用的应用官网相同,也可以不同。

只要appid和redirect_uri与网站应用中的一致,二维码就可以显示。

为了调试方便,我在本地调试时把网站应用登记的授权回调域临时修改为另一个域名(该域名做了反向隧道,不知道是否必要)。

当二维码能正常显示时说明前端没有问题了。微信扫码确认后前端页面会跳转到redirect_uri(网址赋值需要用encodeURIComponent来编码一下,否则path可能会出错,比如hash模式时path跑到问号后面去了),跳转后的url会带上code参数。

接下来我们需要用这个code来换取openid和access_token。那么这就涉及到redirect_uri应该用前端域名还是后端域名呢?

我设置的是前端域名,也就是前端的login页显示二维码,然后扫码后跳转到weixin页,读取code并向后端接口发起获取openid的请求。这样,一则前端跳转时是本域跳转,不用重新加载页面,二则,也比较符合前后端分离的模式设计。

后端在code获取openid和access_token这里,我陷入了极大的困惑。后端我引入的是overtrue/laravel-wechat,其中有open_platform的接口,我以为可以像公众号和小程序的接口那样直接调用,比如

$this->app->handleAuthorize($input['code']);

就可以搞定了,但就在这一个方法上,我浪费了一个下午的时间。

具体不展开说了,可以参考https://blog.csdn.net/qq_39859060/article/details/83512563,但其实就算有这篇文章,我还是没搞清楚到底怎么回事,这个component_verify_ticket到底有什么用呢?

最后,是按https://learnku.com/laravel/t/36118#reply164754里面提到的第一种方法实现的。简单的一个file_get_contents就搞定了。

$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . config('wechat.open_platform.default.app_id') .
            "&secret=" . config('wechat.open_platform.default.secret') . "&code=" . $input['code'] . "&grant_type=authorization_code";
 $jsonResult = file_get_contents($url);
 $data = json_decode($jsonResult, true);

再次吐槽微信难道从上到下都是跟张小龙一样的狗屎脑子吗?起名字和写文档都一样乱。

通过孟繁永

远程OBD是什么?

基于4G全网通信技术的车载WIFI热点OBD设备

通过OBD接口采集汽车ECU相关数据同时集成GPS定位,并通过4G网络将数据上传服务器,提供车载WIFI、车辆体检、车辆轨迹、精确的行程报告、油耗分析、驾驶行为分析等功能的智能汽车车载终端。

(1)即插即用、安装方便简单、支持远程升级、串口升级等各种升级方式。

(2)工业级模块,适合长期连续工作,抗干扰能力强。

(3)支持TDD-LTE和FDD-LTE,移动联通电信全网通,支持车载WIFI高速上网,同时最多接入10个终端设备上网。

(4)自动识别,支持车辆诊断协议,实时了解车辆的当前工作状态。

(5)内置GPS可以实现精准定位车辆具体位置。

(6)内置3D加速度传感器。

(7)设备自动转弯补偿、高速补偿,保证轨迹平滑顺畅。

(8)大容量FALSH存储,盲区数据自动补传。

(9)点火熄火报告,熄火自动休眠,低功耗。

(10)精准里程分析、油耗分析,不仅提供单次行程的里程油耗分析,还提供超速、高速、中速、低速、怠速的里程油耗分析。

(11)驾驶行为分析:设备提供急加速、急减速、急加油、急转弯、长时间怠速、超速、疲劳驾驶等的实时提醒,可以准备的分析出超速/高速行驶的时间、里程比例,车主行驶的时间和里程等。

(12)支持车辆体检、汽车发动机故障、保养提醒、节气门清理、电瓶亏电、超速、疲劳、冷却液温度高等10多种报警。

以上来自网络。

OBD最初是为了安全驾驶而出现的,随着环保要求越来越高,也成为环保检查的一种手段。但是看到其中的联网,还是有些恐怖的,车联网将GPS定位数据及车况数据实时上传。这是上行链路,同时,也可以基于这个通道完成下行控制。之前传播过一轮的远程控制汽车的零点其实不是未来,而是现实。

一个被破解了的汽车可能随时出现被控的“意外车祸”。技术上貌似不用太复杂,伪造一个基站就行了,之前的2G、4G基站伪装技术已经很成熟,现在的5G基站也不是什么太难的事情,貌似协议本身的漏洞依然存在。

其实,只要这个OBD像飞机的黑匣子一样只要收集了数据并且加上防篡改装置,就可以在查缉时通过有线连接获取或者即时开启无线链路来获取数据,没有必要一定实时上传。而且,真的故意躲避的,自然有办法屏蔽联网信号,造成上传故障,这个逻辑仍然是只管好人,不管坏人。但是让好人大大的增加了暴露的风险。

这些装置已经广泛的植入各种机动车辆,对于重型工业或者商用车辆还好,但装在旅居车或者家庭用的新能源汽车上,总觉的对个人隐私侵犯过多。不知道当时这政策出台的时候是如何通过的。

参考:

5.1 国六重型车远程排放监管要求
2018 年 8 月发布的《重型柴油车污染物排放限值及测量方法(中国第六阶
段)》(GB 17691-2018)标准中规定,从 6a 阶段开始,车辆应装备符合附录 Q
要求的远程排放管理车载终端,鼓励车辆按本标准附录 Q 要求进行数据发送。
从 6b 阶段开始,生产企业应保证车辆在全寿命期内,按本标准附录 Q 要求进行
数据发送,由生态环境主管部门和生产企业进行接收。
5.2 营运车辆在线监控标准
2011 年,交通运输部要求营运车辆必须与全国道路货运车辆公共监管与服
7
务平台进行联网,对运营车辆运行位置和时间进行监控,编制并实施了《道路运
输车辆卫星定位系统》系列标准。该系列标准对营运车辆上报位置信息所需要的
车载终端、车载终端与平台的通讯协议、平台间通讯协议及平台功能进行了规范。
5.3 电动汽车在线监控标准
GB/T 32960《电动汽车远程服务于管理系统》标准于 2017 年正式实施。标
准包含三个部分:总则、车载终端和通讯协议及数据格式。总则(GB/T 32960.1)
定义了系统的术语和定义、总体结构和一般要求。车载终端(GB/T 32960.2)规
定了电动汽车远程服务于管理系统车载终端的技术要求和试验方法。通讯协议及
数据格式(GB/T 32960.3)规定了通讯中的协议结构、通讯连接、数据包结构与
定义及数据单元格式与定义。

来源:

http://www.mee.gov.cn/xxgk2018/xxgk/xxgk06/202004/W020200423368282417631.pdf