判断网页是通过PC端还是移动终端打开的

通过判断打开设备,跳转不同页面,可以根据 User-Agent 来区分

也可以执行其他操作:

JS判断客户端是否是iOS或者Android手机移动端:

通过判断浏览器的 userAgent,用正则来判断手机是否是ios和Android客户端。代码如下:

下面一个比较全面的浏览器检查函数,提供更多的检查内容,你可以检查是否是移动端(Mobile)、ipad、iphone、微信、QQ等。

第一种:

 

检测浏览器语言

第二种:

也可以通过这样来适配,然后直接转跳到移动端页面:

参考链接


判断网页是通过PC端还是移动终端打开的

CSS高度自适应铺满全屏

HTML:

CSS:

这里需要注意的是设置bodymin-height: 100vh;以及margin: 0;

vw和vh

vm、vh、vmin、vmax是一种视窗单位,也是相对单位。它相对的不是父节点或者页面的根节点。而是由视窗(Viewport)大小来决定的,单位 1,代表类似于 1%。 视窗(Viewport)是你的浏览器实际显示内容的区域—,换句话说是你的不包括工具栏和按钮的网页浏览器。

具体描述如下:

  • vw:视窗宽度的百分比(1vw 代表视窗的宽度为 1%)
  • vh:视窗高度的百分比
  • vmin:取当前Vw和Vh中较小的那一个值
  • vmax:取当前Vw和Vh中较大的那一个值

vh和vw相对于视口的高度和宽度, 1vh 等于1/100的视口高度,1vw 等于1/100的视口宽度 比如:浏览器高度900px,宽度为750px, 1 vh = 900px/100 = 9 px,1vw = 750px/100 = 7.5 px, 很容易实现与同屏幕等高的框。

参考链接


spring boot设置favicon,favicon不生效,不成功,不起作用

Favicon配置

默认的Favicon图标

关闭默认图标
在application.properties中添加:

或者(我这个有效果):

效果 具体原因:https://jira.spring.io/browse/SPR-12851

spring boot设置favicon,favicon不生效,不成功,不起作用

springboot显示的是一片叶子,我们如何使用自己的favicon呢?

1.将favicon.icon放到resources目录下  例如:/public,/static等等

2.完成上面的步骤还不能显示,还需在你的页面的head标签添加代码

3.注意我使用的thymeleaf所以是以上代码片段如果你不是请这样添加

参考链接


spring boot设置favicon,favicon不生效,不成功,不起作用

fail2ban with OpenVPN(ubuntu 20.04)

This page describes how to set up fail2ban with OpenVPN 2.4.7 (tested on ubuntu 20.04)

Create /etc/fail2ban/filter.d/openvpn.conf containing:

Create /etc/fail2ban/jail.local containing:

To effect the configuration change:

To test the configuration change, check /var/log/fail2ban.log initially for service start messages and later for WARNING [openvpn] Ban and Unban messages.

参考链接


HOWTO fail2ban with OpenVPN

禁止macOS系统产生.DS_Store文件的方法

Mac经常会产生 .DS_Store 的隐藏文件,虽然在 Mac 上看不到,但是有时用了人家的 U 盘或把 U 盘拿到 Windows 系统上用,就会看到。

.DS_StoreMac OS 保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于Windowsdesktop.ini

  • 禁止 .DS_Store 生成:
    打开 “终端” ,复制黏贴下面的命令,回车执行,重启Mac即可生效。

  • 恢复 .DS_Store 生成:

参考链接


JUnit中对Exception的判断

对于使用验证 Test Case 方法中抛出的异常,我起初想到的是一种比较简单的方法,但是显得比较繁琐:

Google了一下,找到另外几种更加方便的方法:1,使用Test注解中的expected字段判断抛出异常的类型。2,使用ExpectedExceptionRule注解。
个人偏好用Test注解中的expected字段,它先的更加简洁,不管读起来还是写起来都很方便,并且一目了然:

Rule注解的使用(只有在JUnit4.7以后才有这个功能),它提供了更加强大的功能,它可以同时检查异常类型以及异常消息内容,这些内容可以只包含其中的某些字符,ExpectedException还支持使用hamcrest中的Matcher,默认使用IsInstanceOfStringContains Matcher。在BlockJUnit4ClassRunner的实现中,每一个Test Case运行时都会重新创建Test Class的实例,因而在使用ExpectedException这个Rule时,不用担心在多个Test Case之间相互影响的问题:

stackoverflow中还有人提到了使用google-code中的catch-exception工程,今天没时间看了,回去好好研究一下。

地址是:http://code.google.com/p/catch-exception/

参考链接


JUnit中对Exception的判断

PBKDF2加密的实现

PBKDF2(Password-Based Key Derivation Function)

通过哈希算法进行加密。由于哈希算法是单向的,能够将不论什么大小的数据转化为定长的“指纹”,并且无法被反向计算。

另外,即使数据源仅仅修改了一丁点。哈希的结果也会全然不同。

这种特性使得它很适合用于保存password。由于我们须要加密后的password无法被解密,同一时候也能保证正确校验每一个用户的password。可是哈希加密能够通过字典攻击和暴力攻击破解。

password加盐。盐是一个加入到用户的password哈希过程中的一段随机序列。

这个机制可以防止通过预先计算结果的彩虹表破解。每一个用户都有自己的盐,这种结果就是即使用户的password同样。通过加盐后哈希值也将不同。

为了校验password是否正确,我们须要储存盐值。通常和password哈希值一起存放在账户数据库中。或者直接存为哈希字符串的一部分。

首先要生成一个盐值salt,再把原始passwordsalt加密得到密文。验证的时候,把用户输入的password和同样的盐值salt使用同样的加密算法得到一个密文,将这个密文和原密文相比較,同样则验证通过,反之则不通过。


測试结果为:

参考链接


snapd进程持续写盘导致系统卡顿

系统使用一段时间后,莫名其妙出现卡顿现象。发现硬盘灯闪个不停。

经查,是snapd进程持续不停的往硬盘写入数据,同时也会占用CPU。

写入量不大,但是磁盘占用率出奇的高。

导致系统出现卡顿,这个问题从ubuntu18.04到20.04实测都有,更老的版本没有实测不妄加批评。

解决办法网上找了N圈也没有找到解决办法。所以,只好……

干掉它!

卸载后系统丝般顺滑。。

因为我暂时snap用的不多,加上也没别的办法,毕竟已经影响到系统的正常使用了,只好选择卸载。

有人说不能卸载,可以试试下面的命令:

卸载之后,继续重装一下,貌似也不再出现问题。

参考链接


Error 'Character set '#255' is not a compiled ch aracter set and is not specified in the '/usr/local/mariadb10/share/mysql/charse ts/Index.xml' file' on query. Default database: 'wordpress'. Query: 'BEGIN'

以前通过 家里ADSL上网无固定外网IP的群晖NAS安全实现与公网MySQL服务器主从同步 配置之后,群晖自带的 MariaDB 10.3.21 可以非常流畅的与服务器上的 MySQL 7.x 版本进行主从同步。

前两天系统从 ubuntu 18.04 升级到 ubuntu 20.04 (MySQL 8.x)之后,发现已经无法进行主从同步。

报告如下错误:

网上查询很久,找到原因 MySQL 8.016 master with MariaDB 10.2 slave on AWS RDS, Character set '#255' is not a compiled character set

This could be a serious problem when replicating between MySQL 8.0 and MariaDB 10.x.

The default (for good technical reasons) COLLATION for the 8.0 is utf8mb4_0900_ai_ci. Note the "255" associated with it. MariaDB has not yet adopted the Unicode 9.0 collations.

Furthermore, Oracle (MySQL 8.0) did a major rewrite of the collation code, thereby possibly making collation tables incompatible.

probable fix is to switch to the next best general-purpose collation, utf8mb4_unicode_520_ci (246) (based on Unicode 5.20). This would require ALTERing all the columns' collations. ALTER TABLE .. CONVERT TO .. might be the fastest way. Those could be generated via a SELECT .. information_schema.tables ....

大致原因就是MySql 8.0默认使用了最新的utf8mb4_0900_ai_ci字符集,然而MariaDB 10.3.x版本不支持这个字符集,导致无法同步。

8.0.17:

MariaDB 10.2.30:

目前暂时没打算修改主服务器上的数据库,暂时等 MariaDB 更新吧。

参考链接


笛卡尔乘积

笛卡尔乘积是指在数学中,两个集合XY的笛卡尔积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。

假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

矩阵的笛卡尔乘积就是矩阵的直积

讲到笛卡尔乘积,就难免会提到数据库中的 "自然连接(⋈)"。

要求:连接两个表 R ⋈ S
(表中标黄的数据后面会说到)

先看两个表头,发现A C是重复出现的

所以连接后,新表头为

然后把A C这两列单独拎出来,如下

发现有两组相同的,(也就是上面标红的数据
所以这两个表连接之后只有 两条 记录。

此时,可以做出下图

这时候从原来的R表、S表中找到对应数据填上

这样表格就完成了。

然后根据上述过程,尝试完成下面的例题:

结果:

我们还可以知道 当R和S没有公共属性时,则R⋈S = RXS
(没有公共属性,即每个属性都有它们唯一确定的值。所以RXS就没有需要划去的,也没有相同属性需要整合)

参考链接