首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,649 阅读
2
Mac打印机设置黑白打印
5,044 阅读
3
修改elementUI中el-table树形结构图标
4,947 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,705 阅读
5
intelliJ Idea 2022.2.X破解
4,462 阅读
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Vue
Mac
Spring Cloud
MyBatis
WordPress
MacOS
asp.net
Element UI
Nacos
MySQL
.Net
Spring Cloud Alibaba
Mybatis-Plus
Typecho
jQuery
Java Script
IntelliJ IDEA
微信小程序
Laughing
累计撰写
629
篇文章
累计收到
1,421
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
629
篇与
的结果
2022-09-24
typecho替换QQ头像
前言Typecho使用的是Gravatar作为用户的头像,但是大部分用户都没有设置Gravatar头像,而且Gravatar在国内访问速度感人,大大影响了用户体验和站点速度。解决方法让数字QQ邮箱显示QQ头像,非数字QQ邮箱使用Gravatar国内镜像加快速度。修改文件在typecho根目录/var/Typecho/Common.php文件,注释掉大约在第1010行至第1028行的代码/** public static function gravatarUrl($mail, $size, $rating, $default, $isSecure = false) { …… return $url; }**/在其下方添加以下 php 代码public static function gravatarUrl($mail, $size, $rating, $default, $isSecure = false) { $reg = "/^\d{5,11}@[qQ][Qq]\.(com)$/"; if (preg_match($reg, $mail)) { $img = explode("@", $mail); $url = "//q2.qlogo.cn/headimg_dl?dst_uin={$img[0]}&spec=100"; } else { if (defined('__TYPECHO_GRAVATAR_PREFIX__')) { $url = __TYPECHO_GRAVATAR_PREFIX__; } else { $url = $isSecure ? 'https://gravatar.loli.net' : 'http://gravatar.loli.net'; $url .= '/avatar/'; } if (!empty($mail)) { $url .= md5(strtolower(trim($mail))); } $url .= '?s=' . $size; $url .= '&r=' . $rating; $url .= '&d=' . $default; } return $url; } 现在Typecho全局支持数字QQ邮箱显示QQ头像了,Gravatar使用国内镜像源。{message type="info" content="我的文件格式化了,所以显示行数可能不太一样,主要看方法名吧。"/}
2022年09月24日
1,812 阅读
1 评论
4 点赞
2022-09-24
Typecho修改首页文章数量
{mtitle title="需求"/}默认typecho首页只显示5篇文章。对于部分主题确实已经足够,但是双栏的主题5篇文章会显得过少。其实就像我的网站,5篇文章显然是不够的,所以我需要调整到10篇。但是typecho并没有提供前端的修改方法,我们需要修改数据库达到目的。{mtitle title="修改方法"/}打开数据库,找到typecho_options数据表中的项pageSize将其修改为所需数量即可。比如我需要显示10篇,直接改成10就行了。
2022年09月24日
1,447 阅读
0 评论
1 点赞
2022-09-24
docsify配置LaTeX公式
MarkDown本身是支持LaTeX公式的,但是docsify默认是不支持LaTeX公式的,即便你输入了如下的公式$$ 现值 = 原值/(1+折现率)^{(到期日-折现日期间隔月份)/12} $$ docsify也只会给你显示原始的内容。 要实现公式的显示,我们可以通过以下方式。方式一、贴图 我们可以使用typora这种软件,显示MarkDown内容,然后截图粘贴到docsify对应的文件中,当然,这种方式能把自己蠢哭。方式二、通过插件 docsify-katex就是能显示LaTeX公式的一种插件,使用方式非常简单。 将样式文件粘贴到head中,并将js文件粘贴到body中。<!-- 公式 --> <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css" /><!-- 公式 --> <script src="//cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.js"></script> <script src="//cdn.jsdelivr.net/npm/marked@4"></script> <script src="//cdn.jsdelivr.net/npm/docsify-katex@latest/dist/docsify-katex.js"></script>{message type="error" content="注意脚本文件的引入顺序。"/}
2022年09月24日
2,662 阅读
2 评论
6 点赞
2022-09-22
docsify配置封面
在dosify一个神奇的文档网站生成工具中,我们介绍了如何安装docsify,这篇文章我们主要讲解一下如何配置docsify的封面。启用封面支持 还记得我们初始化完项目之后,有一个index.html的文件夹,docsify的所有配置都在这个里面。 需要我们需要启用封面,只需要在里面配置coverpage属性,设置为true即可。配置封面 启用封面支持参数后,默认的封面文件为_coverpage.md,因此,我们需要在项目根目录下创建一个_coverpage.md文件。 然后在封面文件中,输入自己的封面信息,下面的可以直接复制使用<!-- _coverpage.md --> # 香草物语 > 香草物语 [开始使用 Let Go](/README.md) 这样,一个简单的封面就设置好了,我们可以看一下效果。
2022年09月22日
1,629 阅读
0 评论
1 点赞
2022-09-21
docsify一个神奇的文档网站生成工具
之前一直使用的觅思文档作为内部在线知识库。公司内部最近在进行服务器漏洞扫描,觅思文档使用的Python+Django的形式(我用的Docker一键部署的那个,看Python的版本好像是3.7.3吧),由于Python注入漏洞影响3.10.4及以下版本,所以我尝试将Python升级到3.10.7,但是由于Django与Python版本对应关系存在问题,所以升级以失败告终。也是出于无奈,只能另寻其他替代产品。 经过对比,选择了一款小巧的文档网站生成工具-docsify。一、docsify的优缺点1.1、优点简洁,没有乱七八糟的功能,也不需要复杂的配置部署简单,两三条命令即可完成部署,不需要数据库结构化展示,直接展示本地markdown文件1.2、缺点没有用户管理功能,不方便多人协作因为是本地化部署,所以不方便使用七牛等图床,导致markdown文件中粘贴图片不是很方便。(当然,我们可以通过typora配置图片上传路径解决此问题)二、docsify部署首先确保已安装node.js。2.1、安装docsify-cli推荐全局安装docsify-cli工具,可以方便地创建及在本地预览生成的文档。打开终端,执行以下命令npm i docsify-cli -g2.2、初始化项目新建文件夹,文件夹名称随意起(我创建了docsify),然后在终端进入文件夹在终端输入docsify init然后查看文件夹index.html:入口文件README.md:会做为主页内容渲染.nojekyll:用于阻止 GitHub Pages 忽略掉下划线开头的文件运行直接输入docsify serve即可运行项目默认端口是3000此时网站就搭建成功了。如果我们需要编辑网站的内容,可以直接修改README.md文件。如果需要修改端口,直接运行socsify server -p 端口号关于docsify的一些其他配置,比如更换主题、设置封面、安装插件等,我们稍后在进行介绍。
2022年09月21日
873 阅读
0 评论
0 点赞
2022-09-14
maven编译项目的时候出现 Malformed \uxxxx encoding
在./m2/文件夹下,找到path-to-the-library,然后删掉(若无此文件,可直接忽略此步骤);在./m2/repository文件夹下全局搜索:resolver-status.properties文件,将搜索到的所有此文件全部删除,然后重新编译即可。
2022年09月14日
1,640 阅读
0 评论
0 点赞
2022-09-11
纯js实现html添加水印
有时候出于保密等需要,我们可能需要在前端展示页面添加一些水印信息。window.onload = function () { const element = document.body; watermark(element); } // window.onresize = function () { // const element = document.body; // watermark(element); // } function watermark(element, config) { let chArr = document.body.getElementsByClassName("watermark-item"); for (i = 0; i < chArr.length; i++) { //删除元素 元素.parentNode.removeChild(元素); if (chArr[i] != null) chArr[i].parentNode.removeChild(chArr[i]); } // 获取元素的坐标 function getOffset(el) { if (el.offsetParent) { return { x: el.offsetLeft + getOffset(el.offsetParent).x, y: el.offsetTop + getOffset(el.offsetParent).y, }; } return { x: el.offsetLeft, y: el.offsetTop, }; } if (!element) return; // 默认配置 const _config = { text1: '内部文档', //文本1 text2: '注意保密', // 文本2 start_x: 0, // x轴起始位置 start_y: 0, // y轴起始位置 space_x: 100, // x轴间距 space_y: 50, // y轴间距 width: 210, // 宽度 height: 80, // 长度 fontSize: 20, // 字体 color: '#aaa', // 字色 alpha: 0.4, // 透明度 rotate: 15, // 倾斜度 }; // 替换默认配置 if (arguments.length === 2 && typeof arguments[1] === "object") { const src = arguments[1] || {}; for (let key in src) { if (src[key] && _config[key] && src[key] === _config[key]) { continue; } else if (src[key]) { _config[key] = src[key]; } } } // 节点的总宽度 const total_width = element.scrollWidth; // 节点的总高度 const total_height = element.scrollHeight; // 创建文本碎片,用于包含所有的插入节点 const mark = document.createDocumentFragment(); // 水印节点的起始坐标 const position = getOffset(element); let x = position.x + _config.start_x, y = position.y + _config.start_y; // 先循环y轴插入水印 do { // 再循环x轴插入水印 do { // 创建单个水印节点 const item = document.createElement('div'); item.className = 'watermark-item'; // 设置节点的样式 item.style.position = "absolute"; item.style.zIndex = 99999; item.style.left = `${x}px`; item.style.top = `${y}px`; item.style.width = `${_config.width}px`; item.style.height = `${_config.height}px`; item.style.fontSize = `${_config.fontSize}px`; item.style.color = _config.color; item.style.textAlign = 'center'; item.style.opacity = _config.alpha; item.style.filter = `alpha(opacity=${_config.alpha * 100})`; // item.style.filter = `opacity(${_config.alpha * 100}%)`; item.style.webkitTransform = `rotate(-${_config.rotate}deg)`; item.style.MozTransform = `rotate(-${_config.rotate}deg)`; item.style.msTransform = `rotate(-${_config.rotate}deg)`; item.style.OTransform = `rotate(-${_config.rotate}deg)`; item.style.transform = `rotate(-${_config.rotate}deg)`; item.style.pointerEvents = 'none'; //让水印不遮挡页面的点击事件 // 创建text1水印节点 const text1 = document.createElement('div'); text1.appendChild(document.createTextNode(_config.text1)); item.append(text1); // 创建text2水印节点 const text2 = document.createElement('div'); text2.appendChild(document.createTextNode(_config.text2)); item.append(text2); // 添加水印节点到文本碎片 mark.append(item); // x坐标递增 x = x + _config.width + _config.space_x; // 超出文本右侧坐标停止插入 } while (total_width + position.x > x + _config.width); // 重置x初始坐标 x = position.x + _config.start_x; // y坐标递增 y = y + _config.height + _config.space_y; // 超出文本底部坐标停止插入 } while (total_height + position.y > y + _config.height); // 插入文档碎片 element.append(mark); }
2022年09月11日
1,154 阅读
0 评论
0 点赞
2022-09-04
树莓派免费配置内网穿透
{message type="info" content="没有做内网穿透的树莓派是没有灵魂的。"/} 本文介绍使用Sakura Frp实现树莓派的内网穿透。因为树莓派上我有设置的宝塔面板,我们就实现在外网也能访问宝塔。一、Sakura Frp介绍Sakura有免费的,也有收费的,具体区别请看下图个人使用别搭建网盘的话也差不多够了,并且每天签到还能领流量。{anote icon="" href="https://www.natfrp.com/" type="secondary" content="官方网站"/} 首先需要注册一个Sakura账号并完成认证。这里不过多介绍,我们默认你已经有了账号。二、软件下载打开https://www.natfrp.com/tunnel/download找到arm64,下载软件后,保存到树莓派某个路径下,我这里放到/opt/sakurafrp/三、创建隧道点【穿透】,选择【隧道列表】。{message type="info" content="免费用户能创建两个隧道"/}{message type="warn" content="国内节点域名需要备案"/}服务没开,默认是灰色的四、配置服务我们要实现的目标就是每次开机时,能够自动连上我们的服务,避免每次开机自己设置。4.1、创建服务vi /lib/systemd/system/frpc@.service将以下内容复制进去[Unit] Description=SakuraFrp Service After=network.target [Service] Type=idle User=nobody Restart=on-failure RestartSec=60s ExecStart= /opt/frpc_linux_arm64 -f %i [Install] WantedBy=multi-user.target{message type="warn" content="/opt/sakurafrp/frpc_linux_arm使我们上面步骤下载的软件位置,注意替换"/}下载配置文件,并重命名为frpc.ini,并上传到frpc_linux_arm64同级目录。4.2、查看隧道信息点击隧道,选择【操作】,【配置文件】复制上面的内容,就是-f的那块4.3、打开控制台,开启服务systemctl start frpc@XXX:XXXXXXXXXX对应替换成隧道信息此时再查看隧道列表,可以看到我们隧道前面的灰色原点已经变成绿色了说明我们隧道开启成功了此时执行以下命令,设置开机启动systemctl enable frpc@XXX:XXXXXXX支持,服务已经配置完成,可以重启一下,验证一下隧道列表原点是否依然是绿色,如果是绿色,说明我们开机自启动是没问题的。五、域名解析此时,还剩最后一步,就是我们需要把我们自己的域名解析到Sakura上还是找到隧道配置文件,我们可以在下面看到server_addr我们需要将域名cname指向此地址。输入自己域名可以验证一下
2022年09月04日
1,829 阅读
0 评论
2 点赞
2022-09-04
树莓派4B离线安装JDK1.8
一、确定系统版本我用的是Raspberry PI OS(64-bit),因此需要下载ARM 64 Compressed Archive的压缩包。{message type="info" content="如果使用的是Raspberry PI OS(32-bit),需要下载对应的压缩包。"/}二、JDK下载路径我是在Oracle官网下载的,速度也很快。https://www.oracle.com/back/technologies/downloads/#java8三、安装3.1、将压缩包上传到树莓派任意位置当然,如果你是在树莓派直接下载的,可以调到这步,我这里放到/root文件夹下3.2、解压登录ssh,切换到/root目录,执行tar -zxvf jdk-8u341-linux-aarch64.tar.gz3.3、移动位置将解压后的文件夹剪切到/usr/local/jdk1.8 目录下。切换到/usr/local目录cd /usr/local创建目录mkdir jdk1.8移动mv /root/jdk1.8.0_341 /usr/local/jdk1.8四、配置环境变量执行vim /etc/profile在底部追加JAVA_HOME=/usr/local/jdk1.8/jdk1.8.0_341 JRE_HOME=/usr/local/jdk1.8/jdk1.8.0_341/jre PATH=$JAVA_HOME/bin:$CATALINA_HOME/bin:$JRE_HOME:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export JRE_HOME export PATH export CLASSPATH刷新配置文件source /etc/profile五、验证输入java- version如果输出版本信息,代表安装成功
2022年09月04日
1,279 阅读
0 评论
2 点赞
2022-09-04
树莓派如何不用网络、显示器、键鼠安装系统
树莓派镜像烧录器目前已经支持在烧录镜像时同步配置SSH、网络等信息,这样我们无需借助显示器或者外置键鼠在在安装系统时进行配置。 在烧录镜像的时候,点击下面设置 里面有各种设置信息,包括ssh账号、密码、WIFI等 这样烧录完镜像之后,便会自动连接WiFi,通过路由器查看树莓派的IP,便可以通过SSH直接登录使用了。
2022年09月04日
951 阅读
0 评论
1 点赞
2022-09-04
树莓派4B安装宝塔面板直接断网问题
今天又把家里树莓派拿出来玩了玩,重新安装了树莓派32位桌面版系统。本来想安装个宝塔面板,结果已安装就直接断网。 最后查资料才知道{message type="danger" content="宝塔不支持树莓派32位系统,要安装宝塔,必须用64位的才行"/}
2022年09月04日
914 阅读
0 评论
0 点赞
2022-09-01
java同步锁Lock
在Java中Synchronized的用法中,我们介绍了通过Synchronized实现线程同步的机制。除了通过Synchronized实现线程同步之外,我们还可以通过同步锁(java.util.concurrent.locks.Lock)实现线程同步。看下下面代码package com.company.threadpackage; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Apple implements Runnable { private int num = 50; private final Lock lock = new ReentrantLock(); @Override public void run() { while (num > 0) { lock.lock(); try { if (num > 0) { System.out.println(Thread.currentThread().getName() + " 吃了编号为 " + num-- + " 的苹果"); } }finally { lock.unlock(); } } } }调用 Apple apple = new Apple(); for(int i=0;i<1000;i++){ new Thread(apple,"apple"+i).start(); } 查看控制台,可以看到,num始终是在顺序减少。Lock 接口的实现允许锁在不同的作用范围内获取和释放,并允许以任何顺序获取和释放多个锁。常用的实现类ReentrantLock(可重入锁):java.util.concurrent.locks 包中,通常建议使用 finally 块来确保在必要时释放锁ReentrantLock 是可重入锁:当前持有该锁的线程能够多次获取该锁,无需等待(可以在递归算法中使用锁){mtitle title="Lock 和 synchronized选择"/}Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock 去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会直等待下去,不能够响应中断通过Lock可以知道有没有成功获取锁,而synchronized却无法办到Lock可以提高多个线程进行读操作的效率在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竟争),此时 Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择
2022年09月01日
978 阅读
0 评论
0 点赞
1
...
14
15
16
...
53