解决方案参考: https://forum.xda-developers.com/pixel-c/help/device-resource-busy-t3449240

正常将只读的/system分区变成可读写是用下面这个命令:

mount -o remount,rw /system

一般情况下,/system就变成可读写了。但是在某些设备上,会提示Device or resource busy错误。这个时候只需要将-o的两个参数顺序调换一下即可,也就是这样:

mount -o rw,remount /system

下载与安装

首先在docker的注册表中搜索mysql,点击下载, 然后选择版本。我这里选择的是8.0.16的版本

选这个版本的进行下载

下载完成之后,点击启动。这里要注意,配置一个MYSQL_ROOT_PASSWORD的环境变量,否则启动会失败。

记得要设置MYSQL_ROOT_PASSWORD变量(新窗口看大图)

完全启动完成需要等待一段时间,一般3分钟左右,具体可以观察容器详情中的进程一栏,如果mysqld –initialize-insecure进程没有了,取而代之的是mysqld,则表示启动完成。

正在初始化
初始化完成

现在mysql虽然已经启动,但接下来还是要进行配置的。切换到容器详情的终端机一栏,点击新增按钮来创建一个bash,然后就可以像操作linux的shell一样和docker内部进行交互。

设置远程访问

mysql> use mysql;
Reading table information for completion of table and column names                                                                                                   
You can turn off this feature to get a quicker startup with -A                                                                                                       
                                                                                                                                                                     
Database changed
mysql> select host, user, plugin from user;
+-----------+------------------+-----------------------+                                                                                                             
| host      | user             | plugin                |                                                                                                             
+-----------+------------------+-----------------------+                                                                                                             
| %         | root             | caching_sha2_password |                                                                                                             
| localhost | mysql.infoschema | caching_sha2_password |                                                                                                             
| localhost | mysql.session    | caching_sha2_password |                                                                                                             
| localhost | mysql.sys        | caching_sha2_password |                                                                                                             
| localhost | root             | caching_sha2_password |                                                                                                             
+-----------+------------------+-----------------------+                                                                                                             
5 rows in set (0.00 sec)

如果上面关于root的输出只有一个localhost的话,那么这个mysql只能进行本机登录;你需要做的是下面这样处理:(不要相信网上的什么with options,那个已经过时了,在mysql8.0.16中执行会报错)

mysql> CREATE USER 'root'@'%' IDENTIFIED BY '111111';//创建root账户,同时指定密码为111111
// mysql> ALTER USER 'root' IDENTIFIED BY 'password';//这行可以不要
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
mysql> flush privileges;

如果像我上面这样的输出,关于root的输出有一个% ,则代表已经可以进行远程登录了,不需要上述操作。

修改默认的加密方式

mysql8中引入了新的加密方式 caching_sha2_password,而且被设置成了默认的加密方式,这就有可能导致客户端连接出现问题。据我所知,phpMyAdmin即使是4.9版本也不支持这种加密方式,虽然他们在GitHub上把这口锅漂亮的甩给了php。而php版本据说低于7.4的也是不支持的;Navicat Premium 12.0.29版本已经支持这种加密方式了,其他客户端未经测试。所以如果要使用phpMyAdmin等其他客户端的话,建议修改加密方式。

首先要确认,当前的加密方式是什么:

mysql> use mysql;
Reading table information for completion of table and column names                                                                                                   
You can turn off this feature to get a quicker startup with -A                                                                                                       
                                                                                                                                                                     
Database changed
mysql> select host, user, plugin from user;
+-----------+------------------+-----------------------+                                                                                                             
| host      | user             | plugin                |                                                                                                             
+-----------+------------------+-----------------------+                                                                                                             
| %         | root             | caching_sha2_password |                                                                                                             
| localhost | mysql.infoschema | caching_sha2_password |                                                                                                             
| localhost | mysql.session    | caching_sha2_password |                                                                                                             
| localhost | mysql.sys        | caching_sha2_password |                                                                                                             
| localhost | root             | caching_sha2_password |                                                                                                             
+-----------+------------------+-----------------------+                                                                                                             
5 rows in set (0.00 sec)

关于root的两行显示的plugin是caching_sha2_password,我们要将它改成mysql_native_password

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '111111'; 
Query OK, 0 rows affected (0.25 sec)

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '111111'; 
Query OK, 0 rows affected (0.22 sec)
//这里的111111是指密码,可以自定义

光这样改过之后还不能用,这个就是很坑爹的地方了。需要另外再给它弄个配置文件,就像这样:

[mysqld]
default-authentication-plugin=mysql_native_password

把它保存成一个文件,然后上传到群晖上(建议另外弄个文件夹保存),把这个文件所在目录挂载到/etc/mysql/conf.d目录上,再启动mysql就能彻底解决问题

就像这样

演示环境:Windows 10 主机 + Ubuntu 18.04 客户机 + VMware Workstation Pro 15,虚拟机磁盘设置在一块256G的SSD上

目标:虚拟机磁盘占用了Windows 10主机的SSD大量空间,现在要压缩这块vmdk来减少磁盘占用

这块vmdk的设置如下,并没有预分配磁盘空间:

虚拟磁盘的设定

看,它占了95GB的SSD空间!简直不可思议!实际上:

实际上这个盘只用了9.5GB

实际上他喵的才仅仅用了9.5GB啊!那么问题来了,该如何才能把那么大的磁盘空间压缩压缩?

接下来就是痛苦的尝试各种 解决方案:

  • 1. 很自然的就想到直接去点击设置里面的那个压缩按钮,然后1秒钟,提示压缩完成。满心欢喜原来压缩这么快,然后看了一下windows资源管理器中的文件大小就知道,根本就没给你压缩
  • 2. dd命令填充0,然后删除文件,然后关闭客户机,然后再去点击那个压缩按钮。过程我就不罗嗦了,dd的过程花了好几分钟,结果还然是1秒钟提示压缩完成。
  • 3. 首先先做个defrag。 sudo e4defrag / 执行完之后再重复2中的步骤,结果依旧是1秒钟。 fuck you~
  • 4. 在3的步骤中执行到删除文件后,再加上一个压缩命令 sudo vmware-toolbox-cmd disk shrinkonly 。结果是不支持?
emm…..?

为什么他喵的不支持???看了一下这个错误的搜索结果,大致分为两种情况:有磁盘快照或者是预分配磁盘。然而我并没有使用任何磁盘快照,也不可能去预分配磁盘。

  • 5. 既然上面这些办法都不好使,那么就用vmware宿主机中的vmware-vdiskmanager吧!执行结果是:Failed to shrink the disk ‘D:\xxx.vmdk’ : An error occurred while writing a file; the disk is full. Data has not been saved. Free some disk space and try again (0x8).

disk is full。。。嗯,什么意思?是说我宿主机的磁盘空间不够了吗?

于是我默默的查看了一下D盘的可用空间,提示为79GB。难道说我得有150GB剩余空间才能成功压缩吗?

抱着试试看的想法,把SSD盘中的乱七八糟的文件搬到其他盘中,现在剩余空间是135GB,先来试试看好不好用。

剩余135GB,试一下看看

首先是关闭客户机 ,以防万一,我把vmware也给X了,重新执行命令。。。

开始压缩了。。。

喔激动一下,它开始shrink了,看来确实是宿主机磁盘空间不够了,所以shrink不了?

压缩完成之后,这个vmdk的大小变成了:

成功压缩了

吃惊,大小居然能压缩到8.83GB这么小!


总结:通过上述实践过程,发现一个要压缩Linux格式的vmdk文件大小的前提条件,而这个前提条件却是各种高票回答都没有提及的:存放vmdk文件的磁盘一定要有足够大的可用空间才能压缩,否则就会1秒钟或者压缩失败。由于磁盘已经被我压缩掉了,而且还是那么多操作都做过来的,所以有些疑问:是否真的需要这么多步骤?是否只要dd后删除dd出来的文件,然后直接点击vmware设置中的压缩按钮就可以了?这些就留待日后有时间吃饱了撑的慢慢测试了

卸载要根据系统版本的不同,使用不同的方法

一、不要想着通过Store去卸载,因为那里面只有安装的按钮,没有卸载的按钮

二、在win10系统版本为秋季创意者更新(Fall Creators Update),也就是RS3,也就是1709之前,可以使用lxrun命令进行卸载操作。没有图,没有命令,也不想去研究,因为我早就更新到1903了。

三、 秋季创意者更新之后,lxrun命令就被移除了,执行lxrun只会提示不是内部或外部命令,也不是可运行的程序或批处理文件。这个时候就需要用wslconfig命令来进行卸载了。

列出当前已经安装且随时可用的发行版:

wslconfig /list

列出所有发行版,包括正在安装、卸载和已损坏的发行版:

wslconfig /list /all

卸载已经安装的发行版:

wslconfig /unregister <这里填你要卸载的名称,只能填写使用wslconfig /list或者wslconfig /list /all中所包含的,不是随便填的>

卸载后也可以在 Store 重新安装发行版。

示例:wslconfig /unregister Ubuntu 会将 Ubuntu 从当前可用的WSL发行版中彻底删除,之后运行 wslconfig /list 时该发行版便不会被列出。该发行版所占用的磁盘空间也会被释放。

注意: 卸载发行版时,会永久删除所有与该发行版有关的数据和设置。

四、卸载完成之后最好再做这么一步:到开始菜单中,找到你安装的发行版,右键,卸载,以保证它彻底被卸载了

如果对wslconfig的其他用处感兴趣,可以参考这里: https://blog.z4hd.cf/wslconfig-usage/

本文转载自: https://www.blackeep.com/1989.html

WordPress鼠标点击特效,可以实现wordpress博客的背景显示”富强”, “民主”, “文明”, “和谐”, “自由”, “平等”, “公正” ,”法治”, “爱国”, “敬业”, “诚信”等文字效果。加上了该段代码,可以让你的网站,在用户任意位置点击鼠标,显示上面文字的特效。

源代码如下,尽情复制:

<script type="text/javascript">
/*  深夜笔记博客  www.blackeep.com  */
var a_idx = 0;
jQuery(document).ready(function($) {
$("body").click(function(e) {
var a = new Array("富强", "民主", "文明", "和谐", "自由", "平等", "公正" ,"法治", "爱国", "敬业", "诚信", "友善");
var $i = $("<span/>").text(a[a_idx]);
a_idx = (a_idx + 1) % a.length;
var x = e.pageX,
y = e.pageY;
$i.css({
"z-index": 999999999999999999999999999999999999999999999999999999999999999999999,
"top": y - 20,
"left": x,
"position": "absolute",
"font-weight": "bold",
"color": "#ff6651"
});
$("body").append($i);
$i.animate({
"top": y - 180,
"opacity": 0
},
1500,
function() {
$i.remove();
});
});
});
</script>

将上面的代码添加到主题页脚(footer.php)文件的 wp_footer() 一行之前即可,然后保存代码上传到服务器,即可实现,如下图红框所示:


本篇讲述如何制作WinPE。我参考了微软的技术文档:
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/winpe-create-usb-bootable-drive

首先打开开始菜单,找到Windows Kits并展开,右键“部署和映像工具环境”,以管理员身份运行,如下图所示:

在弹出的cmd窗口中,键入以下命令并按回车。此命令的目的是将PE的工作文件创建到你指定的文件夹中

# 要制作64位WinPE,使用下面这个命令。强烈建议使用64位的WinPE
copype amd64 C:\WinPE_amd64
# 如果是要32位的WinPE,则使用这条命令
copype x86 C:\WinPE
# WinPE和WinPE_amd64目录可以更换成你想要的名称,我自己怕麻烦就选择不更改
PE复制完成

接下来就是将PE烧录到U盘中了,使用如下命令:

# 64位
MakeWinPEMedia /UFD C:\WinPE_amd64 P:
# 32位
MakeWinPEMedia /UFD C:\WinPE P:

注意,P:是U盘的盘符。该命令会格式化U盘(FAT32格式),所以建议找个小容量U盘或者SD卡来操作(几年前淘汰下来的存储设备又可以重新发光发热)。盘符一定不能输入错误,否则就会呵呵。烧录时间根据存储设备的性能不同而不同,请耐心等待结束。

C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>MakeWinPEMedia /UFD C:\WinPE_amd64 E:
WARNING, ALL DATA ON DISK DRIVE E: WILL BE LOST!
Proceed with Format [Y,N]?Y
Formatting E:...

Setting the boot code on E:...

Copying files to E:...


Success

制作完成,可以把U盘插到VMWare中来测试一下效果:

WinPE界面

Emm…看到这个界面就表示WinPE已经制作成功了,这个就是微软的,原汁原味的WinPE。现在可以通过命令行来执行各种命令了。

好了,本篇教程就到这里,下次会讲如何个性化WinPE

首先,让我们去从微软官网上下载ADK。下载地址:
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/download-winpe–windows-pe

微软官网上的说明

然后,确认一下要制作的WinPE的内核版本。如果要制作1809版本及以上的,需要下载ADK和WinPE插件两个程序;如果是1803或者更早期的内核,则只需要下载一个ADK程序即可。注意,两个ADK并不是同一个程序。这里我选择使用1809的版本

下载完成后得到两个程序,上面一个是ADK,下面那个是WinPE Add-on

ADK程序

首先运行上面个adksetup.exe,因为目的是制作WinPE,所以在选择功能的时候,除了部署工具以外的其他功能统统用不到。点击安装后等待完成安装。

选择“部署工具”即可

接着安装下面那个adkwinpesetup.exe。过程中可能会多次跳出下面这个对话框,表示没有网络连接,这种情况下首先检查自己的网络,确认网络没问题的话只需多点几次Retry,基本就能下载成功。

没有网络连接?

下载过程中请耐心等待。。。。下载完成之后,WinPE的部署环境就搭建好了

在做Android开发之后,你会发现随着时间的推移,运行过越来越多的demo,用过越来越多的三方library,c盘空间也越来越少。查看个人用户文件夹,可以发现几个和Android有关的文件夹体积那可是真庞大。下面将会针对各个文件夹给出相应的办法(Windows版)

一、.android文件夹

这个文件夹主要用于保存adb调试用的key和avd模拟器,lldb也要使用这个文件夹

迁移方式1:添加ANDROID_SDK_HOME环境变量,指向你所要保存的地方。

举例:把用户目录下的.android搬到D:\test目录下,ANDROID_SDK_HOME就填写D:\test。最终结果是下次android studio启动后,.android文件夹就会出现在D:\test目录下

缺点:adb调试用的key无法迁移到新目录下,如果用户目录下.android文件夹不存在,每次使用adb命令后会再次生成此文件夹,并重新生成一个adb调试key

迁移方式2:利用符号链接 ,注意这里有两个点符号,一个都不能少,且要链接的地方文件夹必须存在,名称可以随意

mklink /d %USERPROFILE%\.android. <要链接到的地方>

这样就会创建一个符号链接,让android以为这个文件夹还在原来的地方,但其实已经哈哈哈

举例:mklink /d %USERPROFILE%\.android. D:\AndroidFiles

解释:对.android文件夹做一个符号链接到D盘的AndroidFiles文件夹,所有对.android文件夹里面文件的读写其实是在对D盘的AndroidFiles文件夹内容读写

二、.gradle文件夹

这个文件夹很变态,当你使用过某一个版本的gradle后,该版本的gradle就会被下载到这里面。同时使用gradle依赖的三方library也会被下载并保存其中。说穿了它就是一个本地的仓库,这个仓库理论上容量无限大,所以当然要搬走

迁移方式1:新建一个GRADLE_USER_HOME环境变量,指向你想要的位置,然后把.gradle目录剪切过去就ok了

这种迁移方式不会有残留,很干净

迁移方式2:符号链接,在原地留下一个符号链接,不占用c盘空间

三、.AndroidStudioXXXX文件夹

这是android studio的配置文件目录,容量可上G。这个文件夹无法通过改环境变量来达到迁移的目的

迁移方式1:修改android studio的配置,位于安装目录下的bin/idea.properties。感兴趣的可以去改

缺点:不能完全迁移,总有残留,而且每次升级studio后此文件都会被覆盖回去

迁移方式2:还是用符号链接

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

这样看来,符号链接好像是万能的了。。。

但其实不然,符号链接需要被链接的文件或文件夹必须存在,否则将出问题

之前写过一篇 android 去网络感叹号的文章,但是实测文中提到的方法在android 7.X系统中已经失效。

原理:
7.1.1更改了验证方式,导致之前的修改方法失效,升级为7.1.1后wifi的叉叉和4g的叹号又回来了。

解决方法:

adb shell settings put global captive_portal_https_url https://captive.v2ex.co/generate_204

完事后重启就能看到效果。如果还是不行,请检查网络是否正常

前不久遇到了一个极光推送的问题,java后台在进行消息推送的时候,安卓这边会同时收到通知和自定义消息,当时搞得很郁闷。

后来java后台发现了问题所在:

qq20160811

如此就能解决同时推送通知和自定义消息的问题了!