替换war包中的文件

  • jar tvf 查找war包中的文件
    jar tvf sw-V2.0.1.war | grep AppValues
    
    13908 Tue Jun 30 10:27:42 CST 2020 WEB-INF/classes/cn/com/xx/xx/common/constant/AppValues.class
  • jar xvf 解压完整路径
jar xvf sw-V2.0.1.war WEB-INF/classes/cn/com/xx/xx/common/constant/AppValues.class

inflated: WEB-INF/classes/cn/com/xx/xx/common/constant/AppValues.class
  • 替换文件
  • jar uvf 压缩至war包
    jar uvf sw-V2.0.1.war WEB-INF/classes/cn/com/xx/xx/common/constant/AppValues.class
    
    adding: WEB-INF/classes/cn/com/xx/xx/common/constant/AppValues.class(in = 13894) (out= 5232)(deflated 62%)

在内网如何知道其他ip的MAC地址

 arp -a
? (192.168.1.169) at 48:a1:95:c3:d8:14 [ether] on eno1
? (172.17.0.2) at 02:42:ac:11:00:02 [ether] on docker0
? (192.168.1.243) at 50:7b:9d:0b:4c:52 [ether] on eno1
? (192.168.1.193) at 64:b0:a6:ca:85:d0 [ether] on eno1
? (192.168.1.190) at 50:e5:49:c6:fe:3e [ether] on eno1
? (192.168.1.234) at e0:89:7e:b3:7c:3f [ether] on eno1
gateway (192.168.1.1) at 08:57:00:a9:06:d7 [ether] on eno1
? (192.168.1.241) at 54:bf:64:40:11:c7 [ether] on eno1
? (192.168.1.185) at 80:ad:16:47:a9:01 [ether] on eno1
? (192.168.1.212) at 4a:1d:9b:f9:41:df [ether] on eno1
? (192.168.1.78) at 80:18:44:e8:91:fc [ether] on eno1
? (192.168.1.240) at 7c:76:68:ce:eb:ec [ether] on eno1

注意缓存

Oracle10g

由于之前安装过10g卸载重新安装后出现如下错误

ORA-12560: TNS:protocol adapter error

哎西

检查注册列表是不是没卸载干净

regedit
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

看看新安装的ORACLE_SID是不是对的发现也是对的

再看看oracle相关服务正不正常

services.msc

发现也正常

接着看环境变量在系统变量中oracle_sid发现跟重新安装的sid不一样更改成一样的解决问题

~, ^, *在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的任意版本
    语义化版本

Auto start service on Boot

CentOS or RHEL 6.x

chkconfig --add httpd
chkconfig httpd on
chkconfig --list 可以看到其他启动服务和启动级别

/etc/rc.d/init.d下可观察启动脚本

/etc/centos-release 是否存在观察centOS版本

RHEL or CentOS 7.x

systemctl enable php-fpm

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"];
       }
    }