作者: 孟繁永

  • 在docker中的jenkins中调用composer

    假定部署环境使用的是futuremeng/dnmp(fork自yeszao/dnmp),我在其中增加了一个jenkins,那么当jenkins部署php项目时,除了拉取代码,我还会在shell中修改env为当前实例所需的配置,然后接下来,就是执行composer来构建项目需要的包。之前,我是在jenkins容器中又不得已安装了一个php和composer,这显然是和dnmp下面的php重复了,完全没有必要。

    所以接下来,我查到了在docker-compose.yml的jenkins配置中:

      jenkins:
        image: jenkins/jenkins:${JENKINS_VERSION}
        container_name: jenkins
        volumes:
            - ${JENKINS_HOME_DIR}:/var/jenkins_home
            - ${JENKINS_CERTS_DIR}:/certs/client
            - ${SOURCE_DIR}:/www/:rw
            - ${TOMCAT_WEBAPPS_DIR}:/webapps/:rw
            - /var/run/docker.sock:/var/run/docker.sock
            - /usr/bin/docker:/usr/bin/docker
            - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
        ports:
            - "${JENKINS_HTTP_PORT}:8080"
        expose:
            - "8080"
            - "50000"
        privileged: true
        user: root
        restart: always
        environment:
            TZ: "$TZ"
            JAVA_OPTS: '-Djava.util.logging.config.file=/var/jenkins_home/log.properties'
            JENKINS_OPTS: '--prefix=/jenkins'
        networks:
          - default

    设置了

    - /var/run/docker.sock:/var/run/docker.sock

    这一项,其实本来就是为了让容器也能直接调用宿主机的docker命令,我试了一下docker ps -a,真的没问题,那么我就把本来用在宿主机的命令拿过来,比如bash.alias.sample文件中的:

    # php composer
    composer () {
        tty=
        tty -s && tty=--tty
        docker run \
            $tty \
            --interactive \
            --rm \
            --user www-data:www-data \
            --volume ~/dnmp/data/composer:/tmp/composer \
            --volume $(pwd):/app \
            --workdir /app \
            dnmp_php composer "$@"
    }

    将其中的命令改为:

        tty=
        tty -s && tty=--tty
        docker run \
            $tty \
            --interactive \
            --rm \
            --user www-data:www-data \
            --volume /dnmp/data/composer:/tmp/composer \
            --volume /dnmp/www:/app \
            --workdir /app \
            dnmp_php composer install

    其中,我把$(pwd)改为了laravel项目所在的地址,这个地址是宿主机的地址,因为这里的docker命令是宿主机的。另外,/dnmp/data/composer也是对应宿主机中的composer缓存文件夹地址。”$@”则直接写上了install

  • jenkins中通过Global Tool安装nodejs须要注意npm版本可能过低

    初始化jenkins之后,通过Global Tool安装nodejs的某个版本,过高了项目不匹配,跑不通,比如我选择了一个node14.22.0,但依然构建不成功,报错:

    npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!

    以及:

    -  Building for production...
     ERROR  Error: Cannot find module 'html-webpack-plugin'

    后来查到尽管用的是nodejs14,但其中的npm版本低了,用npm -v看了一下是6,其中从第一个报错就应该意识到要升级npm了,所以在shell中加上了:

    npm install -g npm
  • VSCode Remote-SSH使用密码远程的服务器如何保存密码免密登录

    IDE:vscode

    插件:remote-ssh

    场景:远程服务器拿了IP,用户名和密码

    则默认情况下config文件(在远程资源管理器插件中点击修改设置,选择对应的配置文件)中保存为:

    Host 192.168.0.7
      HostName 192.168.0.7
      User root

    每次连接时,都需要用户输入密码,而且重连时也需要输入密码。改善的方式是将登录方式改为密钥的方式。

    在本地电脑上用ssh-keygen生成密钥对,并将公钥放到服务器上去。

    实现的具体步骤:

    本地生成密钥对:

    ssh-keygen -t rsa -f id_rsa_server_someone

    然后将生成的id_rsa_server_someone.pub拷贝到服务器上的/root/.ssh下,并

    cat id_rsa_server_someone.pub >> authorized_keys

    最后,config中修改为:

    Host 192.168.0.7
      HostName 192.168.0.7
      IdentityFile ~/.ssh/id_rsa_server_someone
      PreferredAuthentications publickey
      User root
  • 厦门立林科技对讲机JB2003客户端接线图

    5芯线对讲门铃接线方式如下:
    主机出来的5芯线分别是 红(+V)+12V、白(TXD)数据发送、黑(RXD)数据接收、绿(GND)地线、蓝 (ALM)联网信号,分别对讲分机的排线是 黑、红、黄、绿、白 (+12\ RXD\TXD\GND\ALM ) 如果分机连接的排线不是 黑、红、黄、绿、白 请按照分机的接线柱来接。
    非可视的看它主机是四芯制的还是两芯制,现在新产品非可视大部是两芯制,对哪一楼就接主机的对应接线端与COM公共端口,301的你就一芯接主机的301接线柱另一端接COM公共端口他们不分正负极的。如果是四芯,有一条黑色一般是接COM端,一条黄色接音柱,一条红色接VCC电源,一条接开锁信号的。

  • 关于积水地图

    其实LBS还有很多可以发挥的点,最近聊到了老兵地图,之前我还搞过绘本馆地图、北京露营地地图等。

    最有意义的当属积水地图。

    积水地图

    那时候真好,虽然微博只有两千多粉,但发点东西,这几家地图提供商都很积极响应,高德最快,上线也最快。

  • 替换vant加载的外部资源来避免nginx策略屏蔽

    某项目因前置nginx限制较多,不允许站内调用外部资源,所以因vant引用了cdn的图标,以及通过data方式加载图标资源,需要对vant进行修改,但又不想去自己弄个vant的修改版,所以从build之后的文件入手。

    先创建一个localFilterPlugin.js,放在src/libs内,或者其他文件夹,比如utils,看你的习惯。内容如下:

    /*
     * @Date: 2021-11-26 15:43:28
     * @LastEditors: Future Meng
     * @LastEditTime: 2021-11-26 18:19:11
     */
    // 用于向控制台输出带颜色的问题提示
    const fs = require('fs') // node的文件系统模块,用于读取操作系统文件
    const path = require('path') // node提供的一些用于处理文件路径的工具
    const chalk = require('chalk')
    
    class LocalFilterPlugin {
      static defaultOptions = {
        filenameReg: /^chunk-mobile\..*\.css$/,
        originContent: /@font-face[^}]+}/g,
        newContent: '',
        assetsPath: '../../dist/css'
      };
    
      constructor(options = {}) {
        this.options = { ...LocalFilterPlugin.defaultOptions, ...options }
      }
    
      apply(compiler) {
        const _this = this
        compiler.plugin('done', function(compilation, callback) {
          const filePath = path.resolve(__dirname, _this.options.assetsPath)
    
          fs.readdir(filePath, (err, files) => {
            // 读取文件路径
            if (err) {
              console.log(chalk.yellow('读取文件夹异常:\n' + err.message + '\n'))
            }
            files.forEach((filename) => {
              // 找到符合正则规则的文件
              if (_this.options.filenameReg.test(filename)) {
                // 读取该文件
                const fileDir = path.resolve(filePath, filename)
                fs.readFile(fileDir, 'utf-8', (err, data) => {
                  // 读取文件内容
                  if (err) {
                    console.log(chalk.yellow('读取文件异常:\n' + err.message + '\n'))
                    return
                  }
    
                  // 替换文件内容
                  const result = data.replace(_this.options.originContent, _this.options.newContent)
                  fs.writeFile(fileDir, result, (err) => {
                    if (err) {
                      console.log(chalk.red('写入修改后的文件异常:\n' + err.message + '\n'))
                      return
                    }
                    console.log(chalk.cyan(filename + '替换完成'))
                  })
                })
              }
            })
          })
        })
      }
    }
    
    module.exports = LocalFilterPlugin
    

    然后在vue.config.js中添加对这个自定义插件的引用。

    const LocalFilterPlugin = require('./src.mobile/libs/localFilterPlugin')
    
    module.exports = {
            configureWebpack: config => {
        const configNew = {}
        if (process.env.NODE_ENV === 'production') {
          configNew.externals = externals
          configNew.plugins = [
            // 构建后剔除@font-face
            new LocalFilterPlugin({
              options: {
                filenameReg: /^chunk-mobile\..*\.css$/,
                originContent: /@font-face[^}]+}/g,
                newContent: '',
                assetsPath: '../../dist/css'
              }
            })
          ]
        }
        return configNew
      },
    }

    就这些。

    参考资料:https://blog.csdn.net/qq_31968791/article/details/102900349

  • sweethome3d

    http://www.sweethome3d.com/

    推荐一个室内设计软件,关键是开源的,与LiveHome3D相比,感觉差不多,有的使用习惯似乎还更好一些。

    把两居改成四居,是这两年一直在思考的一个问题,已经做了十几个方案,最近终于逐渐找到了方向。

    顺便抱怨一句,目前这些独立设计师的作品都不太看得上,不实用。

  • ID6 Crozz行驶7000公里问题小结

    1. 传感器误报,充电时曾多次显示电动单元故障,客服有告知两次停车后自动消除,启动车辆时出现过几次sos故障,停车后自动消除,未升级。
    2. 车机内集成的在线媒体内容很多儿童不宜,需要设置安全模式。
    3. 4G信号较弱,经常断线,有一次无法自行恢复,到4S店消除。
    4. 在线媒体来源较少,缺少高质量内容,对连载内容无法直接定位或连续播放。
    5. 尾门踢脚感应不灵敏,基本没有打开过。
    6. 车机内导航缺少导航途中添加目标方向上的沿线搜索功能,如添加充电站、公共厕所、餐厅等。目前的搜索结果跟当前导航路径无关,不够便捷。
    7. 导航中充电站导航缺少充电桩空闲状态显示和预约功能。
    8. 导航中充电桩缺少现状反馈,有的充电站长期被占用或封堵,属于完全无法使用情形,在石家庄市去了两个充电站都是如此。希望充电桩筛选增加“最近使用”,最近有人充电的。
    9. 车队功能不好用,大概需要重新设计。
    10. 没有车内温度显示。
    11. 官方App必须退出重启才能刷新车辆状态,断线后无法自动重连。
    12. 优驾规则不明确,越开越少,不开更多。
    13. 车辆授权账户增加充电时使用主账户额度代付,主账户事先授权。
    14. HUD希望能调整大小,目前显示较小,不容易识别,反而不如低头看小屏。
    15. 在线客服基本上不能响应问题,都推到销售专员去了。

    以上是大众主动邀请填写的反馈,已经顺便发给了水木车友群,在这里也贴一下,供打算买这个款车的朋友参考。

    总体上,没有遇到大问题,开了几千公里,右前轮轮毂蹭了一下马路牙子,除此之外没有别的损伤。

  • ID6 Crozz十一假期自驾体验

    行程:北京-首都环线高速野三坡服务区-张家口蔚县暖泉古镇-蔚县茶山村-石家庄-井陉段家楼-衡水-北京

    充电:基本上都是高速服务区充电,只有石家庄是在民宿所在小区边上一个海鲜市场,衡水是在滨湖国际小区边上。体验,高速上虽然速度不快,但可用率还是比较高的,这条线上人车也不多。从衡水回北京的时候车比较多,找了几个服务区都满了,最后绕到廊坊服务区充的点,走京台高速进城。

    体验:车的舒适度还可以,空间也够用,雨天开起来视线好,很稳,但雨天开ACC方向盘会来回晃,不如平时稳,不如关掉自己管方向盘。

    续航:因为一直下雨,再加上开空调跑高速,电耗接近25度/百公里,总续航从565降到了325,按剩下20%就要充电的话,只能跑268公里。这个里程刚刚够从衡水到北京的,剩余公里数在五六十公里左右,也不是很保险,如果堵车就有点悬,所以回北京的时候还是补了一次电。再一个就是外面老快充的话,也会虚一些,续航会打折扣。

  • knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案

    以前一直用原生的swagger,有同事引入了knife4j,一开始兼容貌似有问题,后来调试好了,看上去不错,虽然输出的word还是不太好看,但总比没有强。

    所以把java的项目都切到这个接口文档上来了。