简单的chrome插件探索

正在上网课,老师做的课件很烦,77个每个5分钟的短视频,但是要一直点下一个,遂出现想法搞个chrome插件来解决问题

看了相关的js监听页面元素变化window.MutationObserver 这篇文章之后考虑了一下
围绕浏览器的 MutationObserver 来监控dom的变化
每次监控范围的dom有变动时会调用回调函数处理,这里就是点击下一课的按钮来自动完成
核心代码如下

content_scripts.js

let config = {
attributes: true, //目标节点的属性变化
childList: true, //目标节点的子节点的新增和删除
characterData: true, //如果目标节点为characterData节点(一种抽象接口,具体可以为文本节点,注释节点,以及处理指令节点)时,也要观察该节点的文本内容是否发生变化
subtree: true, //目标节点所有后代节点的attributes、childList、characterData变化
};

const mutationCallback = (mutationsList) => {
for(let mutation of mutationsList) {
let type = mutation.type;
switch (type) {
case "childList":
let dom = document.querySelector(".btn")
if (dom){
let btn = document.querySelector(".btn0");
btn.click();
}
console.log("点击成功");
break;
// case "attributes":
// console.log(`The ${mutation.attributeName} attribute was modified.`);
// break;
// case "subtree":
// console.log(`The subtree was modified.`);
// break;
default:
break;
}
}
};

这里核心代码就完成了,但是需要在浏览器中加载,需要chrome.tabs来判断是否可以加载,但是这里犯了个错误。
content_scripth是禁止访问除了chrome.extension的参数的这里可以看到360翻译的chrome文档,虽然老,但是还是解释了这段
找到这段后,我迅速把tabs判断的code切换到了background.js

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
console.log('init');

if (changeInfo.url == undefined) {
return false;
}
// 检查是否是wish页面的tab
// if(tab.url.indexOf('pinterest.com') > 0){

// 通知对应的tab页面url变化了,需要优化为离开立即移除,进入则加载完毕再添加
if (tab.status === 'loading') {

chrome.tabs.sendMessage(tabId, {
type: 'tabUpdate', tab: tab
}, function (response) {
console.log('inited');
});
// }
}
});


至此,基本的功能已经完成,经过测试,可以正常使用了

附录:
manifest.json

{
"manifest_version": 3,
"name": "上课助手",
"version": "0.1.0",
"description": "用于监控网课查看完毕自动切换到下一个网课的工具",
"icons": {
"16": "icons/icon_16.png",
"32": "icons/icon_32.png",
"48": "icons/icon_48.png",
"128": "icons/icon_128.png"
},
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "上课助手",
"default_popup": "popup.html"
},
"permissions": [
"tabs",
"activeTab"
],
"host_permissions": [
"https://学校网址/"
],
"content_scripts": [
{
"run_at": "document_idle",
"js": [
"contentScript.js"
]
}
]
}

关于引用swiper新版本导致无法在ie11渲染的解决方案

因为学习angular,搞了个demo网站,但是在ie11中怎么都无法渲染,没有报错,无论是在browserslist中打开了ie支持,还是看到ie跨域处理有问题,一直以为是httpclinet的问题,搞了一周多,最终确认到是swiper有个odm7的库,没有垫片,如果要处理这个bug,可以降级到swiper 3.4.2 及以下版本,或是添加dom7垫片。

记录angular 在nginx部署后在子页面刷新导致404的问题

今天发现部署的angular页面在服务端部署后子页面刷新会404,查看log后发现是寻找实体文件异常,

/usr/local/nginx/html/index/about-us/contact-us

故我在nginx添加了try_file关键字,将 $uri $uri/ /index.html 添加到尝试里面即可,整体代码

server {
listen 80;
server_name your_server_name
include proxy.conf;
root your_root;
location / {
# 这里改动了 定义首页索引文件的名称
index index.html;
#防止在子页面刷新404
try_files $uri $uri/ /index.html;
}
}

错误: 找不到或无法加载主类 com.android.sdklib.tool.sdkmanager.SdkManagerCli 解决方案

这次我在Windows10下使用了sdkmanager的纯命令行版本,调用时一直提示 错误: 找不到或无法加载主类 com.android.sdklib.tool.sdkmanager.SdkManagerCli
我解决了很久最终解决了问题

1.jdk 8
2.sdkmanager 最新
3. 最主要的,不能使用windows自带的zip解压,使用7zip完全没有这个问题

gitblit设置二级目录访问

由于我们只有一个域名暴露,特殊需求,所以需要二级目录访问
配置文件在 defaults.properties 第1985行
contextPath 改掉就好了

# Context path for the GO application. You might want to change the context
# path if running Gitblit behind a proxy layer such as mod_proxy.
#
# SINCE 0.7.0
# RESTART REQUIRED
server.contextPath = /git/

然后重启服务

kotlin-serialization 折腾记录

这个玩意儿呢,因为是kotlin官方支持的,体验一下

配置代码:

bulid.gradle
buildscript {
ext.kotlin_version = '1.3.50'
repositories { jcenter() }

dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
}
}

plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.21'
id "com.github.johnrengelman.shadow" version "5.1.0"
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'kotlinx-serialization'
apply plugin: "com.github.johnrengelman.shadow"

version "1.0.0"

repositories {
mavenCentral()
jcenter()
maven { url "https://kotlin.bintray.com/kotlinx" }
}

dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime:+"
api fileTree(dir: 'libs', include: ['*.jar'])
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}



gradle.properties
kotlin.code.style=official
mainKotlinVersion=1.3.50
mainLibVersion=0.13.0

先写这么多,这个至少能通过编译了

docker学习(1) — 编译nginx镜像

docker 是个好东西啊,解决了不同环境下部署的问题


FROM centos
ENV NGINX_VERSION 1.15.9
ENV buildOps 'gcc gcc-c++ autoconf automake make wget vim openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed libtool zlib zlib-devel pcre pcre-devel patch'
RUN yum update -y \
&& yum install -y $buildOps \
&& mkdir /root/nginx \
&& mkdir -p /conf/nginx/ \
&& mkdir -p /var/log/nginx/ \
&& mkdir -p /cgis/fcgi/ \
&& mkdir -p /cgis/uwsgi/ \
&& mkdir -p /cgis/scgi/ \
&& mkdir -p /var/tmp/nginx/client/ \
&& mkdir -p /var/tmp/nginx/proxy/ \
&& cd /root/nginx \
&& wget -O nginx.tar.gz https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \
&& tar -zvxf nginx.tar.gz -C ../nginx \
&& cd nginx-${NGINX_VERSION} \
&& ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--conf-path=/conf/nginx/nginx.conf \
--http-fastcgi-temp-path=/cgis/fcgi/ \
--http-uwsgi-temp-path=/cgis/uwsgi/ \
--http-scgi-temp-path=/cgis/scgi/ \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_random_index_module \
--with-http_degradation_module \
--with-http_secure_link_module \
--with-http_gzip_static_module \
--with-http_perl_module \
--with-file-aio \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-ld-opt="-Wl,-E" \
&& make && make install \
&& cd /root \
&& rm -rf ./nginx \
&& echo 'daemon off;' >> /conf/nginx/nginx.conf \
&& echo 'master_process off;' >> /conf/nginx/nginx.conf \
&& echo '

Hello, Docker!

' > /usr/local/nginx/html/index.html
ENTRYPOINT ["/usr/sbin/nginx"]

docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
531f80595130 1e1148e4cc2c “/bin/sh -c ‘buildOp…” 8 minutes ago Exited (1) 3 minutes ago recursing_kalam

docker commit –author “username ” –message “信息” CONTAINER ID 容器名
如 docker commit –author “hanasakari ” –message “第一次编译” 531f80595130 nginx:v1

sudo docker run –name web -p 80:80 nginx:v1

Ubuntu 18.10 无法打开网易云音乐的解决方案

打开控制台 输入

sudo gedit /usr/share/applications/netease-cloud-music.desktop
将 Exec=netease-cloud-music %U
改为 Exec=sudo netease-cloud-music %U



保存后在控制台输入
sudo gedit /etc/sudoers
在最后一行添加
你的用户名 ALL = NOPASSWD: /usr/bin/netease-cloud-music

跟据sudo官网 https://www.sudo.ws/man/1.8.27/sudoers.man.html

关于NOPASSWD的用法以及修改sudoers都可以看到