Android ADB Wirelessly

经常使用USB来调试Android应用连着个数据线很麻烦,使用ADB指定地址的连接方式可以不必使用数据线对Android设备进行操作(首次连接还是要USB连接)


使用USB连接设备,ADB可以看情况是否配置为环境变量

查看连接设备

adb devices

进入shell

adb shell

开启ADB端口(此方法在设备重启后会失效)

setprop service.adb.tcp.port 5555

此方法在设备重启后不会失效

setprop persist.adb.tcp.port 5555

关闭ADB

setprop persist.adb.tcp.port ""

将设备连接到同一局域网内,然后连接

adb connect 192.168.1.1:5555

ADB多个设备该如何选择需要操作的设备

adb devices –l
List of devices attached
192.168.1.102:5555     device product:CLT-AL00 model:CLT_AL00 device:HWCLT transport_id:12
192.168.1.87:5555      device product:cappu model:MI_PAD_3 device:cappu transport_id:10
adb -s model:MI_PAD_3 shell

Nginx with Let’s Encrypt on WordPress

使用Lets Encrypt提供免费的ssl证书


获取cerbot项目

git clone https://github.com/certbot/certbot.git

重点关注certbot-auto脚本,因为使用是lnmp进行blog搭建在生成证书时需要指定nginx插件来配合,这样在生成证书后会在nginx配置文件中自动写入证书配置

./certbot-auto --nginx –d “website”

而后会需要选择一些必要的信息注意console输出,需要注意的是由于使用的是aws的实例在执行脚本时会出现错误大概意思就是aws提供的linux系统不被识别,可以通过修改脚本来忽略这个检查,大概在810行处

elif [ -f /etc/redhat-release ]; then

替换为

elif [ -f /etc/redhat-release ] || grep 'cpe:.*:amazon_linux:2' /etc/os-release > /dev/null 2>&1; then

由于在命令中使用了nginx插件脚本在执行时会去找nginx和nginx配置文件,lnmp在安装nginx时没有将nginx.conf放置在/etc这个目录下,解决的方式是创建软连接,通过执行./certbot-auto –nginx –d “website”命令可见

The nginx plugin is not working; there may be problems with your existing configuration.
The error was: MisconfigurationError('Error while running nginx -c /etc/nginx/nginx.conf -t.\n\nnginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)\nnginx: configuration file /etc/nginx/nginx.conf test failed\n',)

执行

ln -s /usr/local/nginx/conf/ /etc/nginx

重启lnmp访问站点可发现原有的证书颁发者变成了Let’sEncrypt Authority X3

如果证书过期尝试执行,会根据之前证书生成的记录尝试更新证书

./certbot-auto renew

~, ^, *在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"];
       }
    }