interHtml不执行script

背景

在html单页面想动态加载html,但设置interHtml发现默认<script></script>不能执行,然后google了一下

interheml 设置的内容会当成普通文本,不会执行里面的Js

解决方案

我们设置的动态设置的元素,可以动态创建script 替换原来的script就可以触发执行

代码

function createNewElementFromOld(elm, tag){
    Array.from(elm.querySelectorAll(tag)).forEach( oldEle => {
        const newScript = document.createElement(tag);
        Array.from(oldEle.attributes)
          .forEach( attr => newScript.setAttribute(attr.name, attr.value) );
        newScript.appendChild(document.createTextNode(oldEle.innerHTML));
        oldEle.parentNode.replaceChild(newScript, oldEle);
      });
}

var setInnerHTML = function(elm, html) {
    elm.innerHTML = html;
    createNewElementFromOld(elm, "script");
  }

网络字节序

背景

如果我们采用自定义二进制传输数据,那么我们就会遇到字节序的问题,我很早学习网络编程就遇到这个问题。

windows 系统一般提供字节本地字节转换网络字节,但我们看好多开源代码根本就没有用这个几个API,难道他们就不管字节序。最近我看了c# mir 传奇代码,然后找了一下资料总算明白了。

逻辑

本质服务器和客户端用同一套字节读写就能保证数据一致,假设c# 服务器和客户端都采用BinaryWriter BinaryReader

他这个是小端的。所以我们可以采用一套二进制的读写即可。同时我们也可以自己再封装二进制读写,直接本地字节转换网络字节序就可以了。说白只要服务器和客户端达成一致即可。

visual studio 运行库 mt md

我们经常运行软件的时候提示运行库缺失,导致程序运行不了,这个时候我们就要下载对应的运行库,这个运行就是c语言的运行库,提示缺失是因为我们编译程序的选择md ,C语言的运行库用的dll。那么必须系统带有运行库,否则运行失败,这样子我们采用2种做法,一种采用mt 静态编译,那么c语言库就在程序里面,要么我们自己把运行库直接放在程序里面,这样子也能正常运行。当初用动态编译是为了减少程序大小,感觉带了运行库,跟静态编译差别不打,如果小程序还是建议静态编译。

Win10找不到NVIDIA控制面板 并且开机一直闪

背景

自己小米笔记本收到更新提醒,如果我就点击更新,结果重启后就出现这个问题,同时进入安全模式也会一直闪烁。(shift + 重启按钮 进入安全模式)

解决问题

  • shift + 重启按钮进入命令安全模式
  • 激活administrator 账号或者自己添加账号(选择一种就可以了,我建议直接激活,不然后面你要想要原来账号的目录内容,你要设置权限)
    • 激活管理员账号: net user administrator /active:yes
    • 创建test账号,你可以改成你账号名字: net user test /add
  • 重启电脑选择账号administrator (如果默认进去出问题的账号,你可以按ctrl + alt + delete 选择账号就可以了)
  • 这样子就进入系统,我自己卸载补丁和重装nvidia进入有问题账号还是问题,如果你没有问题,那么就解决了,如果还有问题,只通过迁移我的文档数据,来保证原来数据可以用。

总结:通过创建新账号,然后使用新账号就可以解决这个问题,这种解决办法无需重装系统,文件和数据都不会丢失。

补充资料

1:win10 进入安全模式(选择6命令安全模式,因为我用的时候安全模式也会闪)

https://jingyan.baidu.com/article/574c52190257956c8d9dc108.html

2:win10 激活管理员账号

https://www.ithome.com/html/win10/171272.htm

3:切换我的文档(指向原来的有问题的账号的文件目录,这样子就能直接用,我开始直接复制,40G复制好久没有修改目录,记住修改目录,提示你是否移动,你点击否,因为新建立账号,没有数据需要复制过去)

https://jingyan.baidu.com/article/eb9f7b6da448cb869364e8ed.html

自己花了10个小时时间解决这个问题,最终采用这个无须丢失数据和软件的方式解决了这个问题,虽然不是非常完美。写这个解决方案就是怕其他人也遇到这个问题,然后花大量时间在这个上面。以后我都不敢随便更新了,对于我这个搞开发人来说,都这么麻烦,对于小白那不是完蛋了

记住激活管理员或者创建新账号,一定要进入新的账号,否则你先进入那个错误账号,再切换到新账号也会一直闪。


补充一下,大家新建账号可能明白了,但好多反应把以前的用户数据恢复。我发图片说一下,方便电脑小白。下面提供2种方法

一,我的文档切换到原来的目录里面

  • 下面这个连接,我的文档移动

https://jingyan.baidu.com/article/eb9f7b6da448cb869364e8ed.html

我这个win7系统显示的,我当前登陆的账户名字是administrator,【你以前不能登陆名字】,就是这个账号不登陆,因为我这里没有,所以我手动建立一个,给你们演示。接下我移动。。你这里直接你以前的对应的账号的名字里面的数据全部复制到admnistrator,这里复制可能需要大量数据,因为大量存放大量的数据,基本大部分都可以用,可能有一些配置用的以前的用户名加路径的配置,你就需要手动修改。,基本大部分是可以用的。我自己电脑按照这个方法弄,基本桌面的软件和一些配置都保留,还有小部分,自己手动修改了一下配置就可以了。

electron 安装以及问题

1:因为墙的原因,我们直接npm install electron 是没有办法安装,所以我们要使用淘宝源

npm install -g cnpm --registry=https://registry.npm.taobao.org

安装cnpm模块 –g 全局安装,– registry 临时修改模块的源地址 cnmp 的模块

2:mac 全局安装 node 模块 权限问题

sudo chown -R $USER /usr/local

3:安装electron

cnpm install -g electron
//全局安装,懒得多个项目时候反复安装

4:vscode 启动

修改vscode 启动配置,如果没有,点击创建一个。在配置里面增加一行

//这行代表用当前项目的electron,如果你不是全局安装
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron"
//这个代表全局的electron
"runtimeExecutable": "electron"

客户端网页集成工具

解决问题

我们经常需要很多网页工具,比喻JSON解析,或者HTML 压缩等等,我们每次都需要打开浏览器,那么我直接有一个工具可以添加各种网页,方便我们添加,可以自定义大小

需求

  • 自定义添加网页
  • 可以自定义大小
  • 支持快捷键
  • 支持默认排序

技术方案

直接用electron就可以了,配置存取直接写文件都可以,因为简单

c++ 调用node js 回调方法

背景

node js 自己的demo ,直接把node js 回调传给c++ 然后直接回调,这样子是没有问题,但我们需要一个长期的回调,node js没有说明,网上貌似也没有对应的文档,我找了好久也没有找到。后面自己翻看node js 官网文档API ,一个个看,找到一个能用的api。

解决方法:napi_create_reference

回调对象,如果你直接保存,你下次回调的时候发现会发生错误,我分析错误信息是对象已经不能用,我看了官网文档,node js 自己管理申明周期,所以我猜测声明周期的问题,于是找他们引用的API,于是就是上面的API

napi_ref my_call_ref = nullptr;	//全局
napi_value call_back = args[1];	//传递过来的参数
status = napi_create_reference(env, call_back, 1, &my_call_ref);
//然后底层回调过来时候,调用node js回调函数就可以了
status = napi_get_reference_value(global_env, msg_recv_ref, &result);
	if (result != nullptr) {
		status = napi_call_function(global_env, global, result, 1, &buffer, &result);
		//assert(status == napi_ok); //如果上层报错,这里失败,导致程序停止
	}

上面是一个大概的代码,就是把一个回调引用是1,永远不会释放,因为我没有调用引用减少,所以永远不会释放。

备注

目前觉得小项目用node js 和 python 真的太方便,脚本写上层业务的时候,基本不好用关心语言细节,我发现好多程序员喜欢在意语法细节,我内心觉得好笑,你会用就可以了,你又不是开发语言或者写编译器的(我说那些死转语法的人,不死说不用了解语法)

c# 在子线程然回调到主线程方法

背景

我们开发代码经常面对线程的问题,多线程性带来异步方便的同时也带来稳定性问题,所以我们需要解决掉线程问题

解决方案

1:加锁

这种方案基本是解决线程的基本方法,但要求开发者对代码非常清晰,不然很容易死锁。

2:投递回调或者事件到主线程或者同一个线程里面

基本原理尽可能在同一个线程里面,那么就没有线程竞争,这种实现方式基于主线程的队列,我们常常用主线程的消息队列,c# 貌似也是类似。只要事件队列加锁就可以了,那么加锁颗粒就非常少了,我们也可以自己创建一个线程,不停等待任务,然后处理返回数据,那么数据都在所谓的业务主线程。你可以看看很多开源代码基本这么写的,android 事件也类似。android每个线程都有一个时间循环队列,比喻我们请求网络数据后,直接投递数据到android ui的主线程就可以了,那么数据就没有竞争。

3:c#的方式

SynchronizationContext 这个每个线程都有

            sync_context.Post(new SendOrPostCallback((o) =>
            {
                //执行的代码
            }), null);

Dispatcher 这个对线所有控件都会继承这个,所以你必须要保留主要界面的 Dispatcher ,但我在开发时候,如果使用不当的话会导致界面很卡,大概是代码里面反复调用导致的问题。

android DexClassLoader 加载失败

背景

自己最近想写一个APP,内部实现考虑兼容性问题,我想使用动态加载,一些核心变化的代码从服务器动态加载,这样子就不用每次都要更新APP。

动态加载

DexClassLoader: 我百度一下,基本规则是jar包通过dx处理一下,然后放在手机的sdcard里面,前提一定要给文件读写权限。

问题

我基本按照网上规则写的,但发现加载失败,我的测试手机是小米10 android 10,总是提示原始dex找不到。但文件确实存在,而且文件权限给了而且文件确实存在。

过程

  • 直接用跑模拟器 android 6 的版本上,确实可以跑起来,这说明肯定是android版本的问题,也可能跟miui的版本加强权限管理。
  • 大概解压的dex必须放在APP 自己目录,不能给外部路径,这样子为了安全问题,确实,如果dex被改成外部,就可以有权限访问内部数据。毕竟注入到代码里面去了。
  • 那么我猜测可能是加载jar路径可能也要放在APP内部,果然可以了。我放在asserts目录
  • 我猜测原因,磁盘的文件无法写入APP内部目录,因为我之前也试过/sdcard/复制到APP内部,但加载也会失败了。