~, ^, *在package.json中的含义

node用npm解决依赖的方式是靠package.json中用x.y.z的方式表明版本信息,其中

  • ~锁定y位如~1.2.3表示依赖大于或等于1.2.3但小于1.3.0的任意版本
  • ^锁定x位如^1.2.3表示依赖大于或等于1.2.3但小于2.0.0的任意版本
  • *取决于所在位置如1.*表示依赖大于或等于1.0.0但小于2.0.0的任意版本
    语义化版本

WP with Live2D

引言

blog的浮动窗体小组件挺有意思加之

步骤

GitHub地址https://github.com/xiazeyu/live2d-widget.js

由于是node项目依赖于npm先clone下来项目

git clone https://github.com/xiazeyu/live2d-widget.js

然后

npm install

发现在项目目录下node依赖的文件夹已经出现了node_modules

观察项目目录下的package.json看看怎样启动项目

"scripts": {
    "update:submodule": "git submodule foreach git pull origin master",
    "_esdoc": "./node_modules/.bin/esdoc",
    "_changelog": "conventional-changelog --outfile CHANGELOG.md --release-count 0",
    "_titlechangelog": "sed -i '1i\\# Changelog\\n\\n' CHANGELOG.md",
    "inst:dev": "npm install -g commitizen && npm install -g conventional-changelog-cli && npm install",
    "build:dev": "./node_modules/.bin/webpack --progress --colors",
    "build:prod": "./node_modules/.bin/webpack --env prod --progress --colors && npm run build:module",
    "build:module": "./node_modules/.bin/webpack --env prod --progress --colors --config webpack.config.common.js",
    "build:docs": "git pull && npm run _changelog && git add CHANGELOG.md && npm run update:submodule && git add ghpages",
    "build:esdoc": "cp lib/stats.html ghpages/stats.html -f && npm run _titlechangelog && npm run _esdoc",
    "deploy:doc": "git pull && git checkout master && cd ghpages/ && git status && git add --all && git commit -m \"Update docs\" && git push origin HEAD:master --force && cd ..",
    "deploy": "build:prod && build:docs",
    "lint": "eslint --ext .js ./src",
    "commit": "git pull && git-cz",
    "v:major": "npm version major",
    "v:pmajor": "npm version premajor",
    "v:minor": "npm version minor",
    "v:pminor": "npm version preminor",
    "v:patch": "npm version patch",
    "v:ppatch": "npm version prepatch",
    "test": "echo \"Error: no test specified\" && exit 1",
    "postinstall": "opencollective-postinstall"
  }

执行之

npm run build:dev

启动后由webpack提供动态调试打开dev.html

默认加载的modelizumi可以在项目目录\src\config\defaultConfig.js中的jsonPath修改,目前支持的model可从live2d-widget.jsCurrent supported models:找到,替换下面地址中红色部分即可

https://unpkg.com/live2d-widget-model-izumi@latest/assets/izumi.model.json

替换完成保存后webpack会重新加载配置js

观察dev.html其初始化方式和项目目录下\src\index.js中可配置参数,根据情况进行修改,生成的所需引用的js文件都在lib文件夹下

由于站点使用的是WordPress搭建的使用的是Php先装个叫Snippets的插件然后用其在php代码中插入<script>标签来完成加载生成的js

继续阅读“WP with Live2D”

tomcat异常退出记录

事件

同事头天夜里远程部署线上集群环境第二天发现服务异常,但头天夜里部署时说测试正常,处理报警时只有一个节点能访问其余全部异常。

问题

当使用tomcat /bin目录下的脚本停止tomcat时catalina.out会输出如下日志

21-May-2020 16:00:08.919 INFO [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Ser
ver instance.
21-May-2020 16:00:08.919 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-80"]
21-May-2020 16:00:08.970 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
21-May-2020 16:00:09.021 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service Catalina

如果是异常退出时

21-May-2020 16:12:00.754 INFO [Thread-12] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-80"]
2020-05-21 16:12:00,754  INFO Thread-11 o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext:991 - Closing org.springframework.boot.web.servlet.contex
t.AnnotationConfigServletWebServerApplicationContext@41357de2: startup date [Thu May 21 16:10:21 CST 2020]; root of context hierarchy
2020-05-21 16:12:00,766  INFO Thread-11 o.s.c.s.DefaultLifecycleProcessor:369 - Stopping beans in phase 2147483647
21-May-2020 16:12:00.814 INFO [Thread-12] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
2020-05-21 16:12:00,831  INFO Thread-11 o.s.o.j.LocalContainerEntityManagerFactoryBean:597 - Closing JPA EntityManagerFactory for persistence unit 'default'
21-May-2020 16:12:00.864 INFO [Thread-12] org.apache.catalina.core.StandardService.stopInternal Stopping service Catalina

异常退出造成的原因为开发人员在启动tomcat实例时想观察启动日志错误的使用命令./startup.sh & tailf ../logs/catalina.out注意&&&的含义有天壤之别也是引发这次异常停机问题的关键,&使命令在后台运行,当以&&连接两个命令时表示当前面一个命令没有错误正确退出时后面紧接着执行后一个命令,所以正确的写法应该是./startup.sh && tailf ../logs/catalina.out.

可能的原因

使用ssh工具进行远程连接执行了错误的命令./startup.sh & tailf ../logs/catalina.out根据当事人所说执行上述命令后没有关闭ssh工具窗口,ssh会话一直处于执行tailf命令状态下然后锁定计算机就休息了,当shell以非交互模式运行时其子进程fork时会对shell进程的父进程的中断信号量敏感,当tomcat(java)进程被创建时可能会受到当前ssh会话进程的影响会对ssh会话进程的中断做出反应,当ssh收到中断信号量时该信号量可能会在进程组内传播造成tomcat(java)进程意外中断。

Cocos杂记

项目构建

android

  • 在构建目录build\jsb-default\frameworks\runtime-src下找到android项目
  • 使用android studio导入构建项目解决依赖问题后进行联机调试和打包

    windows

ios

  • 在macOS平台使用Cocos Creator进行ios构建
  • 在构建目录build\jsb-default\frameworks\runtime-src下找到ios项目
  • 使用Xcode找到工程文件打开编译连接设备进行调试或打包
  • 其中有可能Xcode编译不过具体情况需具体分析 这里举例
    'system' is unavailable: not available on iOS
  • 该错误需要更改Cocos cpp构建文件remove “system” usage
  • 还有可能Cocos构建脚本在检查Xcode版本时出现错误
    cocos2d project_compile.py ValueError: invalid literal for float(): 11.2.1
  • 本地Xcode版本为11.2.1直接在project_compile.py把version<5的判断注释即可
  • 在项目中使用第三方依赖时需要进行依赖管理,这里使用cocoapods管理,其中涉及使用gem更新Ruby,建立repo和 创建Podfile,之后就不能使用.xcodeproj文件进入工程了必须使用生成的.xcworkspace打开工程
  • 修改Podfile文件,就需要重新运行一下pod update命令。如何使用CocoaPods
  • 在升级百家云的时候发现update异常缓慢更换git访问代理 git config --global http.https://github.com.proxy socks5://192.168.1.57:1080

项目问题

ios

  • 使用NSJSONSerialization序列化json时当json属性值为null时返回对象为NSNull判断时需注意

  • nil和NSNull还是有区别的nil表示 nil表示引用计数为0的待释放对象,NSNull代表空对象

  • js调用oc代码时使用WkWebKit发送message到指定的handler发送的message需为json格式且不能为空

vue

  • 在使用webpack-parallel-uglify-plugin ^1.1.2打包时出现错误Maximum call stack size exceeded把版本降为1.1.0解决

项目调试

ios

  • 调试webviewsafari浏览器提供了天然的便利,在使用xcode运行程序时可以打开safari浏览器的开发模式察看加载的webview页面

    vue

  • 使用webpack可以对vue前端代码进行热更新,其原理大概为webpack作为服务端与浏览器建立一个长连接,当修改代码保存时webpack会发送更改后的代码片段和更改的位置让浏览器进行替换从而达到即时生效的效果.
  • 使用Fiddler可以更加清楚的看到webpack在进行热更新时发送的包.
  • 在热更新时通过抓包观察这三个文件
    .hot-update.json
    .hot-update.json
    .hot-update.js
  • 了解上述webpack热更新的原理后,因为我们线上使用vue项目都会打包压缩,然后暴露出一个index.html的访问路径来访问我们的vue项目,我们要做的就是如何将app中访问index.html文件的服务器路径更改成我们本地的webpack服务路径.
  • 使用Fidder进行请求的重定向.
  • 拦截我们app中的路径请求转发至webpack服务

    EXACT:http://192.168.1.73/index.html              http://localhost:3000/
    EXACT:http://192.168.1.73/__webpack_hmr           http://localhost:3000/__webpack_hmr
    regex:http://192.168.1.73/([^.]+).js$             http://localhost:3000/$1.js
    regex:http://192.168.1.73/(.+).hot-update.json$   http://localhost:3000/$1.hot-update.json
    regex:http://192.168.1.73/(.+).hot-update.js$     http://localhost:3000/$1.hot-update.js
  • 至此我们就可以在app上进行动态调试并通过webkit调用Cocos查看效果了.
  • 由于登陆部分是在Cocos做的服务器返回的sessionId是通过JS代码传递给Vue的当使用上述转发策略时丢失了这些逻辑,以至于当Vue访问服务端接口时报401,该问题也可以通过Fiddler来解决通过手动更改FiddlerScipt记录登陆成功的sessionId,在后续请求头中带着该sessionId

                                 .
                                 .
                                 .
    static var sessionId: String = null;
    
    static function OnBeforeRequest(oSession: Session) {
                                 .
                                 .
                                 .
       if(oSession.uriContains("/path/") && !oSession.uriContains("/path/login")){
         oSession.oRequest["Cookie"] = sessionId;
       }
    }
                                 .
                                 .
                                 .
    static function OnBeforeResponse(oSession: Session) {
                                 .
                                 .
                                 .
       if(oSession.uriContains("/path/login")){
          sessionId = oSession.oResponse["Set-Cookie"];
       }
    }
    
    

SVN的迁移与恢复

在经历服务器断电硬盘恢复后重新恢复svn服务

首先使用svnadmin命令初始化一个仓库

svnadmin create repos

该存储库用于之后的导入

然后在恢复好的硬盘中找到原存储库的current文件观察当前递增的版本号,路径根据之前仓库路径变化

cat /mnt/usb/backup/sqn004\ lv_home/svn/repo/db/current
23082

使用dump命令导出原有存储库,如果仓库内容很多时间会很长

svnadmin dump /mnt/usb/backup/sqn004\ lv_home/svn/repo > /home/svnrepo.dump
* 已转存版本 0。
* 已转存版本 1。
* 已转存版本 2。
* 已转存版本 3。
      .
      .

期间如果出现导出失败记录下失败标号,当前事例由于存储空间问题失败与版本22986,释放空间后加入参数重新dump

svnadmin dump /mnt/usb/backup/sqn004\ lv_home/svn/repo/ -r 22986:23082 --incremental >svnrepo2.dump

完成后将dump文件重新load进新的存储库

svnadmin load /home/svn/repo/ < svnrepo.dump
svnadmin load /home/svn/repo/ < svnrepo2.dump

初秋

距中国对最后一次夺得Ti冠军,今年已是第三个年头,当中国队负于对手止步季军那一刹那仿佛回到了初中那会儿,那时因war3接触DOTA这张地图沉浸于它激烈的对抗和极富挑战的复杂操作,更着迷于小伙伴们开黑店的快乐.几个人坐在一排叽叽喳喳讨论哪个英雄厉害该怎么搭配,对黑的每一盘胜利总是能带给我们无与伦比的快乐,单纯的以为要打一辈子DOTA,要做一辈子朋友.时光流逝聚聚散散,可能再也看不见儿时的伙伴,就连这宝贵的回忆也随着时间一点点溜走这可能就是时间神奇的地方,它总是把回忆擦拭的斑斑勃勃然后让你自己凭着一厢情愿填填补补,它行进的依然坚实有力碾碎任何可以阻挡的幻想,再见了这个紫色的夏天.