首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,649 阅读
2
Mac打印机设置黑白打印
5,048 阅读
3
修改elementUI中el-table树形结构图标
4,947 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,705 阅读
5
intelliJ Idea 2022.2.X破解
4,464 阅读
后端开发
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-11-06
华为Mate Book X Pro 2020安装黑苹果后优化之一键开启HIDPI
前面的文章,我们介绍了MateBook X Pro 2020安装黑苹果以及睿频的方法,本篇内容介绍一下如何一键开启HIDPI。下载开启hidpi.sh文件进入开启hidpi.sh所在目录执行以下命令sudo sh /Users/lisen/Downloads/开启hidpi.sh然后按照提示,一步步设置就行了。开启成功后,打开显示器设置,点击【缩放】,会显示以下界面附一键安装脚本https://share.weiyun.com/xxKziScF
2022年11月06日
1,824 阅读
0 评论
0 点赞
2022-11-05
Mate Book X Pro安装黑苹果后优化之CPU变频完善
解压文末提供的压缩包,打开文件夹,安装CPU-S,并将ResourceConverter.sh及CPUFriend.kext拖到桌面上。首先运行CPU-S,进行变频测试,记录变频档位数,也可以使用Intel Power Gadget查看变频曲线在Finder菜单栏点击前往-前往文件夹,进入以下路径:/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformPlugin.kext/Contents/Resources/打开终端,执行以下命令:ioreg -l | grep -i board-id**此窗口不要关,保留备用。新建一个终端窗口,执行以下命令(按行依次执行):cd ./desktop./ResourceConverter.sh --kext /System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformPlugin.kext/Contents/Resources/****XXXXXXXX.plist(XXXXXXXX.plist是第4步终端窗口获取的board-id对应的plist,plist在第3步文件夹中)执行结束后后在ResourceConverter.sh同级目录下会生成一个CPUFriendDataProvider.kext文件使用Clover Configurator挂载EFI分区将其连同CPUFriend.kext放入OC的kext文件夹里即可(删除kext文件夹内原有的CPUFriend.kext和CPUFriendDataProvider.kext)重启电脑,运行CPU-S,进行变频测试,记录变频档位数,发现档位比以前多,证明加载了原生电源管理。附相关资源文件隐藏内容,请前往内页查看详情如果资源到期,可以留言我重新续期,感谢各位
2022年11月05日
3,809 阅读
3 评论
0 点赞
2022-11-03
华为MateBook X Pro 2020安装黑苹果BigSur详细教程
先来看看成果吧{message type="error" content="温馨提示"/}在黑苹果之前,要查看自己的硬盘是否为三星981,如果是,那要么换硬盘,要么换白果,别折腾了。三星981在安装黑果的过程中会出现所有你想不到的问题,且不容易解决,所以基本上三星981的硬盘都会建议换掉。现在1T的固态盘价格很水,自行购买,WD-SN系列,海康的都行,只要不是三星981!一、笔记本信息我这个是华为MateBook X Pro 2020款最低配的(i5 集成显卡那个)因为之前也安装过黑苹果,说实话,当时也不想折腾,淘宝80块钱找人装的,从两者的使用体验来看,当时在淘宝买的简直被坑死了。现在想想都不知道当时自己怎么坚持用了小半年。先来说说我这次安装的黑苹果与当时淘宝装的一些优点吧。二、基本的体验情况2.1、改进的几点Wifi体验当时淘宝那版不支持远程Wifi,使用Wifi必须借助一款软件,好像叫HeliPort还是啥,具体也记不清楚了。新版的EFI已经完全不需要了,可以直接使用原生的Wifi。蓝牙之前使用老版本的时候,蓝牙经常自动断开还经常自动连不上,必须得重启才行。目前新版的EFI使用了两天了,没有发现这个问题。但是还是存在蓝牙链接不上的情况,我这里使用了妙趣键盘是可以的,还有另外一款机械键盘也没问题,但是华为的鼠标不行,直接连不上,家里还有一个几块钱买的鼠标,反而可以。显示问题显示问题也是一个挺头疼的问题,以前的版本经常开机黑屏,需要重新关上在打开盖子。目前新版本同样没有发现这个问题。关机问题老版本经常碰到关机变重启的情况,往往需要点两次甚至多次才能真正关机。目前新版也没有发现有这个问题。2.2、目前的不足像上面说的不是所有蓝牙都能用的问题,现在指纹识别、触屏等还是都不能使用,当然这个不是这个版本才有的问题,其实一直以来都不能用,我个人感觉这个基本是无解了。2.3、其他优化可以一键启用HIDPI优化CPU变频以上两点我们后续会专门说明。三、详细安装教程上面嘚吧嘚吧了那么多,下面的安装才是我们的重点。3.1、所需资源为了完成系统安装,我们建议提前准备好一下资源。3.1.1、硬件资源U盘至少16G一个,有条件准备2个(一个刻录Mac系统,一个做WinPE),强烈建议准备一个PE的,以备不时之需,特别是不熟悉安装黑苹果的童鞋。有线鼠标,因为安装过程中,可能触控板会无法使用。3.1.2、软件资源BalenaEtcher软件,用户刻录Mac启动盘Mac镜像,当然得是适合自己电脑的镜像DiskGenius软件,用户分区PE镜像,网上很多,老毛桃、大白菜啥的都行,自行准备。Clover Configurator:图形化的四叶草启动引导配置工具,用户挂载启动分区。以上软件资源,除了PE镜像,我们在文末都会提供。3.2、制作启动盘使用管理员身份打开 BalenaEtcher选择镜像、选择U盘、点击Flash!刻录完成。如果出现格式化弹窗,千万别点格式化。替换EFI找到我们提供的EFI文件夹,解压文件,获得OC、BOOT文件,DiskGenius软件替换U盘中EFI文件夹中的OC、BOOT文件。3.3、硬盘分区硬盘分区非常重要,由于有些EFI版本超过了100M,所以我们创建ESP分区时,绝对不能小于200M,做一些冗余,个人建议分300M以上,当然越大越好,我个人是分了1G 。使用DiskGenius软件,打开后,查看硬盘的分区表类型。如果是MBR分区表,请更改为GPT,更改方法如下如所示操作完成后注意点级保存更改按钮3.4、创建ESP分区分区大小500M-1G,有条件直接1G,免得后期不够ESP一般都是第一个创建的分区。3.5、创建其他分区ESP分区创建完成后,可根据自己的需求创建windows系统分区(NTFS)、MacOS系统分区(APFS)、共享盘(ExFAT)。操作比较简单,不再赘述。3.6、修改BIOS3.6.1、关闭安全启动开机按F2 或者FN+F2进入BIOS设置,将安全启动和安全芯片选项全部选择为关闭。按F10保存退出3.7、安装系统插入U盘,按F12进入引导选项,选择U盘引导(镜像的EFI分区可能存在多个,引导时请注意选择)选择macOS Installer 回车具体怎么安装就不说了,跟正常安装Mac步骤是完全一样的。3.8、导入引导文件如果不导入引导文件,此时你可以试一下,如果拔掉U盘,系统就无法启动了,插上U盘就好了。因为我是全篇安装的,所以已经没有Win系统了,此时可以通过两种方式修改,使用Clover Configurator挂载分区或者进去Win PE通过使用Diskgunis将我们Mac OS的系统盘中的EFI文件夹中BOOT和 OC文件夹 复制到ESP分区的EFI文件夹中。Diskgunis的方式我们上面已经介绍过,这里只介绍一下Clover Configurator的方式。解压下载的CCG.ZIP文件,解压后的App打开点击挂载分区,然后打开分区文件解压Mate+Book+X+Pro+2020+efi.zip,将解压得到的EFI文件夹,整体拖进挂载的分区中拔掉U盘,再次重启电脑,可以发现电脑可以正常启动,蓝牙及Wifi也能正常使用了。愉快的玩耍吧~~~{message type="error" content="黑苹果有风险,过程中出现的一切后果,本人不承担任何责任"/}{cloud title="天翼云盘下载地址" type="ty" url="https://cloud.189.cn/web/share?code=36vIvyMrQ7v2" password="wuw7"/}{message type="info" content="下载地址7天有效,如果失效,可以留言"/}
2022年11月03日
3,629 阅读
24 评论
9 点赞
2022-10-23
使用CompletableFuture<T>实现异步接口
【同步API】同步API是我们传统方法,调用方法在被调用方法运行的过程中会一直等待,直到被调用方法返回。此时的调用过程,是阻塞式的调用。【异步API】与同步API相反,异步API会直接返回,或者至少在被调用方计算完成之前,将它剩余的计算任务交给另外一个线程去做,该线程和调用方是异步的,是非阻塞式调用。来看一下【同步API】与【异步API】的区别 public class Shop { public double getPrice(String product) { return calculatePrice(product); } public Future<Double> getPriceAsync(String product) { CompletableFuture<Double> futurePrice = new CompletableFuture<>(); new Thread(() -> { double price = calculatePrice(product); futurePrice.complete(price); }).start(); return futurePrice; } private double calculatePrice(String product) { delay(); return new Random().nextDouble() * product.charAt(0) * product.charAt(1); } public static void delay() { try { Thread.sleep(1000L); } catch (InterruptedException interruptedException) { throw new RuntimeException(interruptedException); } } } 在上面的代码中,getPrice()是一个同步方法,其内部调用的calculatePrice()用于模拟价格计算,计算过程中,暂停线程1s用于模拟阻塞。然后我们调用getPrice(),查看程序执行时间。 public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException { Shop shop = new Shop(); long startTime = System.currentTimeMillis(); double doubleFuture = shop.getPrice("apple"); doSomeThingElse(); long endTime = System.currentTimeMillis(); System.out.println("总耗时:" + (endTime - startTime) + "ms"); } private static void doSomeThingElse(){ try { Thread.sleep(2000L); } catch (InterruptedException e) { e.printStackTrace(); } } } 此时查看控制台,我们可以看到共执行了3011ms,也就是说,此时整个程序是串行的。此时我们再来看看另一个方法getPriceAsync(),此方法不再返回double类型,而是一个Future<Double>,Future<T>接口标识一个异步计算的结果,泛型代表返回值。Future的计算结果,通过get()方法获取。在getPriceAsync()方法中,我们创建了一个代表异步计算的CompletableFuture<T>,它在计算完成后,会包含计算的结果。接着创建一个线程去执行实际的操作,不必等到线程结束,直接返回一个Future<Double>实例。当线程计算结束后,调用CompletableFuture<T>的complete()方法,结束CompletableFuture<T>的运行。然后我们调用getPriceAsync()方法,查看程序执行时间。public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException { Shop shop = new Shop(); long startTime = System.currentTimeMillis(); Future<Double> doubleFuture = shop.getPriceAsync("apple"); doSomeThingElse(); doubleFuture.get(2, TimeUnit.SECONDS); long endTime = System.currentTimeMillis(); System.out.println("总耗时:" + (endTime - startTime) + "ms"); } private static void doSomeThingElse(){ try { Thread.sleep(2000L); } catch (InterruptedException e) { e.printStackTrace(); } } }此时查看控制台,可以看到总体耗时2108ms,也就是说我们主程序跟getPriceAsync()方法此时是并行的了。【改进的异步方法】在前面的getPriceAsync()方法中,我们创建了一个线程创建CompletableFuture<T>对象,实际上,还有一种更简便的方式,即使用工厂方法CompletableFuture.supplyAsync创建CompletableFuture<T>对象。改进后的代码如下所示 public Future<Double> getPriceAsync(String product) { // CompletableFuture<Double> futurePrice = new CompletableFuture<>(); // new Thread(() -> { // double price = calculatePrice(product); // futurePrice.complete(price); // }).start(); // return futurePrice; return CompletableFuture.supplyAsync(()-> calculatePrice(product)); }
2022年10月23日
836 阅读
0 评论
1 点赞
2022-10-20
MySQL数据库外键和索引等名称的长度限制
Identifier TypeMaximum Length (characters)Database64 (NDB storage engine: 63)Table64 (NDB storage engine: 63)Column64Index64Constraint64Stored Program64View64Tablespace64Server64Log File Group64Alias256 (see exception following table)Compound Statement Label16
2022年10月20日
750 阅读
0 评论
1 点赞
2022-10-12
Java BigDecimal Non-terminating decimal expansion; no exact representable decimal result
在日常开发中,我们基本上都是用BigDecimal类型来处理金额,防止精度丢失。使用BigDecimal做除法时,如果出现除不尽的情况,系统就会报错之所以出现这个问题,是因为除法除不尽时,BigDecimal不知道如何处理了,因此,使用BigDecimal做除法时,我们需要指定结果的精度及四舍五入的方式。BigDecimal bigDecimalThree = new BigDecimal("3"); BigDecimal newBigDecimal = BigDecimal.ONE.divide(bigDecimalThree, 1, RoundingMode.HALF_EVEN); System.out.println(newBigDecimal);
2022年10月12日
947 阅读
0 评论
0 点赞
2022-10-03
java8函数式接口注解FunctionalInterface
函数式接口就是为Java 8的Lambda表达式准备的,Java 8允许使用Lambda表达式创建函数式接口的实例,因此Java 8 专门增加了@FunctionalInterface。什么是函数式接口我们提到如果接口中只有一个抽象方法(可以包含多个默认方法或多个 static 方法),那么该接口就是函数式接口。FunctionalInterface作用@FunctionalInterface就是用来指定某个接口必须是函数式接口,所以@FunInterface只能修饰接口,不能修饰其它程序元素。看下一下面的方法@FunctionalInterface public interface BufferedReaderProcessor { /** * 静态方法 */ static void process() { System.out.println("process"); } /** * 抽象方法 * * @param bufferedReader * @return * @throws IOException */ String process(BufferedReader bufferedReader) throws IOException; /** * 默认方法 * * @param bufferedReader * @return * @throws IOException */ default String process1(BufferedReader bufferedReader) throws IOException { return ""; } }此时IDE是没有任何错误的(当然代码没有错误)截止到此时,我们出程序中的@FunctionalInterface一丢丢的作用,其实@FunctionalInterface注解的作用只是告诉IDE检查这个接口,保证该接口只能包含一个抽象方法,否则就会编译出错。如何理解一个抽象方法的含义。是否能只不包含抽象方法?我们继续修改刚才的代码,注释掉唯一的一个抽象方法 @FunctionalInterface public interface BufferedReaderProcessor { /** * 静态方法 */ static void process() { System.out.println("process"); } // /** // * 抽象方法 // * // * @param bufferedReader // * @return // * @throws IOException // */ // String process(BufferedReader bufferedReader) throws IOException; /** * 默认方法 * * @param bufferedReader * @return * @throws IOException */ default String process1(BufferedReader bufferedReader) throws IOException { return ""; } }此时,IDE给了错误提示了:No target method found(没有找到目标方法),也就是说,一旦使用@FunctionalInterface注解接口,我们必须要提供一个抽象方法。是否能提供多个抽象方法?刚刚我们看到了,一旦接口@FunctionalInterface,我们接口必须包含抽象方法,那么是否能包含多个抽象方法呢,我们看下面代码。@FunctionalInterface public interface BufferedReaderProcessor { /** * 静态方法 */ static void process() { System.out.println("process"); } /** * 抽象方法 * * @param bufferedReader * @return * @throws IOException */ String process(BufferedReader bufferedReader) throws IOException; /** * 抽象方法 * * @return */ String process1(); /** * 默认方法 * * @param bufferedReader * @return * @throws IOException */ default String process1(BufferedReader bufferedReader) throws IOException { return ""; } }此时ide提示Multiple non-overriding abstract methods found in XXX(找到多个非重载的抽象方法),也就是说,一个接口一旦注解了@FunctionalInterface就只能有一个抽象方法。
2022年10月03日
1,240 阅读
0 评论
3 点赞
2022-10-01
docsify常用的一些插件及配置
前面的几篇文章,我们陆续介绍了docsify网站的搭建及一些基本配置。本篇是我们关于docsify系列介绍的最后一篇。主要介绍一下我们常用的一些docsify插件。docsify的配置其实就是一些js及css插件,因此我们下面凡是脚本,大家都放到body中,凡是css文件,都放到head中,配置文件统一放到docsify配置节点。有不会配置的可以参考https://lisen.cc/blog/the-docsify-configuration-article-navigation.html一、统计文章字数1.1、添加插件<!-- 字数插件 --> <script src="//cdn.jsdelivr.net/npm/docsify-count@latest/dist/countable.min.js"></script>1.2、配置// 字数插件 count: { countable: true, position: 'top', margin: '10px', float: 'left', fontsize: '0.9em', color: 'rgb(90,90,90)', language: 'chinese', localization: { words: "", minute: "" }, isExpected: true },二、支持翻页1.1、添加插件<!-- 翻页 --> <script src="//cdn.jsdelivr.net/npm/docsify-pagination/dist/docsify-pagination.min.js"></script>1.2、配置pagination: { previousText: '上一章节', nextText: '下一章节', crossChapter: true, crossChapterText: true, },三、图片放大缩小点击图片可以查看大图。 <!-- 图片放大缩小支持 --> <script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.min.js"></script>四、emoji表情支持 <!-- emoji表情支持 --> <script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/emoji.min.js"></script>五、点击复制所有的代码块上添加一个简单的Click to copy按钮来允许用户从你的文档中轻易地复制代码。 <!--在所有的代码块上添加一个简单的Click to copy按钮来允许用户从你的文档中轻易地复制代码--> <script src="//cdn.jsdelivr.net/npm/docsify-copy-code/dist/docsify-copy-code.min.js"></script>六、美化提示 <!-- 美化提示 --> <script src="//cdn.jsdelivr.net/npm/docsify-plugin-flexible-alerts"></script>具体使用方式可以参考https://www.npmjs.com/package/docsify-plugin-flexible-alerts
2022年10月01日
2,910 阅读
0 评论
1 点赞
2022-09-30
docsify配置文章内导航
当我们一篇文章比较长时,有个文章内导航可能帮助读者快速的定位到文章对应的章节,比如,我们下面这个测试文章,每个导航,只能不停的滚动鼠标。docsify配置文章内导航,只需一个插件便可解决。一、添加插件1.1、添加脚本文件在body中添加脚本文件<!-- 文章内导航 --> <script src="//cdn.jsdelivr.net/npm/docsify-toc@1.0.0/dist/toc.js"></script>1.2、添加样式在body中添加样式文件<!-- 文章内导航 --> <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify-toc@1.0.0/dist/toc.css">这样,我们在查看文章时,文章就会有一个导航栏了。个性化配置默认的配置可能并不满足我们的需要,那么我们可以对导航栏进行一些个性化配置。在docsify配置文件中,添加如下内容 toc: { scope: '.markdown-section', headings: 'h1, h2, h3, h4, h5, h6', title: '导航', },再次打开文章页面,可以查看一下效果
2022年09月30日
1,653 阅读
2 评论
1 点赞
2022-09-30
docsify配置查询功能
在前面的几篇文章中,我们介绍了docsify配置封面、导航栏、侧边栏等信息。其实一个基本的网站框架基本已经搭建起来了,但是现在还有一个问题,如果我们文章比较多的时候,寻找其他就比较麻烦,因此我们需要一个查询功能,以便能快速定位到我们需要的内容。添加搜索插件在index.html中添加搜索插件 <!-- 搜索功能支持 --> <script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script>添加完搜索插件之后,我们网站左上角其实已经有了搜索框,但是现在的搜索框是不易用的,比如提示信息还是英文等等。配置搜索功能在docsify配置文件中,添加以下内容search: { maxAge: 3600000,// 过期时间,单位毫秒,默认一天 paths: 'auto',// 注意:仅适用于 paths: 'auto' 模式 placeholder: '搜索', // 支持本地化 placeholder: { '/zh-cn/': '搜索', '/': '搜索' }, noData: '找不到结果', depth: 4, hideOtherSidebarContent: false, namespace: '香草物语', sidebarDisplayLevel: 1, },
2022年09月30日
1,412 阅读
0 评论
0 点赞
2022-09-29
docsify配置导航栏
在docsify配置侧边栏中,我们介绍了配置侧边栏的方法,其实配置导航栏的方式跟配置侧边栏是类似的。配置docsify在index.html中配置docsify,支持导航栏。 <script> window.$docsify = { name: '', repo: '', //启用封面支持 coverpage:true, //支持导航栏 loadNavbar: true, // 侧边栏支持,默认加载的是项目根目录下的_sidebar.md文件 loadSidebar: true, // 最大支持渲染的标题层级 maxLevel: 5, // 自定义侧边栏后默认不会再生成目录,设置生成目录的最大层级(建议配置为2-4) subMaxLevel: 4, } </script>添加侧边栏配置文件启用导航栏之后,我们需要添加一个导航栏配置文件_navbar.md。在根目录下创建文件_navbar.md创建完成后,目录结构如下然后我们根据需要配置导航栏 * 香草物语 * [后端开发](https://lisen.cc/category/back/) * [Web前端](https://lisen.cc/category/web/)效果如下
2022年09月29日
1,537 阅读
0 评论
1 点赞
2022-09-28
docsify配置侧边栏
docsify配置完成后,默认显示的是README.md的内容,侧边栏显示的就是README.md的目录。比如我的README.md配置# 李森的博客 > https://lisen.cc # 我是一级目录 ## 我是二级目录 但是我们的在线文档一般不会只有一个文件,我们更多的是像文件夹层级一样,按照文件夹的目录展示我们的文档,所以,我们可以将MarkDown文件,然后所在文件夹级次进行展示。配置docsify在index.html中配置docsify,支持侧边栏。 window.$docsify = { name: '', repo: '', //启用封面支持 coverpage:true, // 侧边栏支持,默认加载的是项目根目录下的_sidebar.md文件 loadSidebar: true, // 最大支持渲染的标题层级 maxLevel: 5, // 自定义侧边栏后默认不会再生成目录,设置生成目录的最大层级(建议配置为2-4) subMaxLevel: 4, }添加侧边栏配置文件如果只配置上面,启用侧边栏支持,你会发现左侧侧边栏没有了,此时,我们需要添加一个侧边栏配置文件_sidebar.md。在根目录下创建文件_sidebar.md在_sidebar.md中配置文件目录* 我是一级目录一 * [我是二级目录1.1](/文章/我是一级目录一/我是二级目录1.1.md) <!--注意这里是相对路径--> * [我是二级目录1.1](/文章/我是一级目录一/我是二级目录1.2.md) * 我是一级目录二 * [我是二级目录2.1](/文章/我是一级目录二/我是二级目录2.1.md)然后根据我们_sidebar.md中配置的目录,创建对应文件或文件夹配置完成后,再次预览我们的网站
2022年09月28日
2,123 阅读
0 评论
2 点赞
1
...
13
14
15
...
53