有时候由于网络问题,会发现 android-studio 或 idea 下载不懂 gradle,可以修改 gradle-wrapper.properties 配置文件中的 distributionUrl 选项来解决这个问题。

1
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-5.1.1-all.zip

这个选项表示从腾讯提供的 gradle 镜像服务下载数据,注意替换上面示例链接末尾的具体文件名。

可以访问此链接查看有哪些版本的 gradle 可以下载:https://mirrors.cloud.tencent.com/gradle/

在公司内部服务器上搭了一个 Nextcloud 服务,跑起来之后发现没有日历、邮件等应用,且不能打开应用商店,分析了服务日志发现是由于网络问题。

启动服务时加上代理即可正常,比如使用 docker 跑的话:

1
docker run --name nextcloud -p 8080:80 -e http_proxy=http://192.168.1.100:1081 -e https_proxy=http://192.168.1.100:1081 nextcloud

代理相关参数解释:

  • -e http_proxy 为容器内 NC 服务设置 http 代理地址和端口
  • -e https_proxy 同上

以前一直在用 firefox 火狐浏览器作为主力浏览器,主要是因为它可以做到不翻墙就实现全平台(linux/mac/windows/android/ios)数据同步,只是 firefox 在 linux 下长时间运行后会变得打开新网页速度很慢,必须要退出程序重新打开才能恢复正常访问速度,给我这种感觉已经很长一段时间了,搜索不到解决方法,自己也没有摸索出来根本原因,但苦于没有更好的选择,只能一直将就下去。

不久前巨硬为 linux 版 edge 浏览器增加了账户同步功能,我终于等来了一个新的,不翻墙全平台数据同步浏览器,虽然是测试版,但巨硬维护很积极,bug 修复更新很及时,相信很快就会发布正式版。

对我来说 edge 浏览器在各个平台上的使用体验都很符合需求,唯独有一点让我很不舒服,就是 ctrl-tab 切换标签页的方式,firefox 浏览器按一下 ctrl-tab 默认会在最近使用的两个标签页中切换,而 edge 则是循环得朝着右边的标签页切换,chrome 也是同样的行为。在搜索这个问题相关的内容时发现,有一部分人觉得这种方式很好,当然也有一部分人和我有同样的感觉,所以这个问题比较主观,并不是说 edge 或 chrome 的切换模式就一定是不好用的。当然 edge 或 chrome 能够像 firefox 一样对这个行为在设置里提供一个修改选项自然是最好的结果。

经过一段时间的摸索,最终找到了一个满足需求的扩展程序,在 edge 和 chrome 的官方扩展仓库中都能找到,链接分别是:

https://microsoftedge.microsoft.com/addons/detail/quickey-%E2%80%93-the-quick-tab-s/mcjciddpjefdpndgllejgcekmajmehnd

https://chrome.google.com/webstore/detail/quickey-%E2%80%93-the-quick-tab-s/ldlghkoiihaelfnggonhjnfiabmaficg

扩展程序代码仓库是: https://github.com/fwextensions/QuicKey

QuickKey 扩展程序提供了很多丰富的功能,感兴趣的可以自行探索。

针对修改 ctrl-tab 行为的功能并不是默认启用的,需要手动修改一些浏览器配置,官方有详细的文档:https://fwextensions.github.io/QuicKey/ctrl-tab/

下面我筛选出适合我的步骤,并翻译如下,此方法适用于 edge 和 chrome。

阅读全文 »

我用来创建热点的工具是 create_ap 可以直接去官方仓库中查看 README 来安装:https://github.com/oblique/create_ap

把 USB 无线网卡插到运行 linux 系统的机器上,然后使用 lsusb 命令查看信息,可以得到如下:

1
Bus 001 Device 006: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter

可以看到芯片是 RTL8188EUS,在 manjaro 系统下,虽然可以识别设备,也能正常连接无线网使用,但默认驱动不能用来创建 wifi 热点,所以需要手动安装一个新的驱动。

经过搜索和不断测试,最终确定一个可用驱动:
https://github.com/aircrack-ng/rtl8188eus

手动安装方法可以参考驱动代码仓库的 README 文档。

如果是 arch 系的系统,比如 manjaro 系统,可以直接 aur 仓库里的包:8188eu-aircrack-dkms-git,这个包里带有必要的配置文件,安装完成后重启即可生效。

驱动生效后就可以使用 create_ap 工具创建 wifi 热点了。

ubuntu 系统 16.04 版本中,最新版本的 python 是 3.5,从系统源中找不到更新版本的 python,本文介绍一种安装 python3.8 的方法,以及安装对应版本的 pip。

安装 python3.8

执行如下命令增加 ppa 仓库,并更新源数据:

1
2
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update

如果提示找不到 add-apt-repository 命令,执行如下命令安装:

1
sudo apt install software-properties-common

更新完成源数据之后,就可以安装 ppa 仓库中的包了,这个仓库中不止是包含 python3.8,还包含其他版本的 python 包,详细情况可查看链接:

https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa

执行以下命令安装 python3.8 相关的包:

1
sudo apt install python3.8 python3.8-dev python3.8-distutils python3.8-venv
阅读全文 »

使用的 CH 版本:19.16.9.37

官方的文档看得晕头转向,可能还是自己英文功底不够,在读完官方的相关文档后,自己又做了大量测试,总结一下心得。

推荐阅读的官方文档:

如果看完本文仍有疑惑的地方,建议阅读下官方文档。

在 CH 中单独提及“副本”涉及到两个概念,副本表和副本分片,顾名思义,一个是为表做副本,一个是为分片做副本。

为了避免混乱后面会分开说这两种副本。

副本表(replicated table)

副本表比较容易理解,所有的副本表之间会相互同步数据,注意是相互同步。

副本表从使用角度来看并没有主副之分,任何一个副本表都可以拿来正常使用,
因此在创建副本表时,即便是第一个副本表也需要用 Replicated* 系列引擎创建。

阅读全文 »

先扯一堆:byte(字节),bytes(字节流),二进制,十六进制,编码
今天跟同事讨论起了上面一堆名词之间的定义和关系到底是什么,不啦不啦个把小时之后得出了以下结论。

byte 与 二进制

byte 是二进制的长度单位(位数,为了便于理解后面使用长度一词),一个 byte 表示长度为 8 的二进制,即通常所说的:一个 byte 是 八个 bit(位)

既然 byte 是二进制的长度单位,那么编程语言里的其他类型呢?

它们其实也是二进制的长度单位,但是表示的长度不同,比如 int 表示 4 个字节(通常)也就是说 int 其实表示长度为 4 * 8 = 32 的二进制,其他类型以此类推,注意,char 类型表示一个 byte,也表示长度为 8 的二进制。

byte 是长度单位为什么能表示数值大小?

一个二进制数既然确定了其长度,那么也就确定了其能表示的数值范围,因此一个 byte 也就能表示出长度为 8 的二进制数所能表示的任何数值。

要注意,byte 是先确定了二进制长度,然后才确定了数值大小,具体的数值大小要看这固定长度的二进制每一位都是什么内容。

编码又是什么?

我们将编码分为狭义和广义两种。

阅读全文 »

列表初始化,成员初始化器列表,初始化列表,傻傻搞不清楚

唉,为什么总有刁民乱起名

std::initializer_list

(译:花括号初始化器列表)

简介:
可以将其理解为类/模板类

备注:
这表示一种花括号数据类型 {x, y, ...}
当然,这也是一种普通的数据类型,其他类型怎么用,它就可以怎么用,如:

1
2
3
std::initializer_list<int> foo = {1, 2, 3, 4} // 声明此类型数据并赋值
auto foo = {1, 2, 3, 4} // 同上
void func_bar(std::initializer_list<int> arg_var) {} // 声明此类型数据为形参

中英文链接:
https://zh.cppreference.com/w/cpp/utility/initializer_list
https://en.cppreference.com/w/cpp/utility/initializer_list

List initialization

(译:列表初始化)

阅读全文 »

存储相关

页,数据库管理数据的最小单元
区,预请求磁盘空间单元,确保读取时的效率,根据数据量延伸出四种状态,某些状态下的区直属于表
段,区的集合
表,表空间,管理段和部分区

索引相关

在指定索引时尽量设置索引的 唯一 属性,这种唯一的二级索引,在 等值 查询时性能近乎与主键等价,等值查询不包括 IS NULL 查询

在查询时尽量避免回表(再从聚簇索引拿数据),当查询列和查询条件都是索引时即可避免

使用 OR 时要慎重:一个使用到 索引 A 的搜索条件和没有使用 A 的搜索条件使用 OR 连接起来后将无法使用 A
SELECT * FROM single_table WHERE key2 > 100 OR common_field = ‘abc’;
其中 key2 和 common_field 都有各自的索引
那么上述查询语句将无法按照预期使用 key2 的索引,而是会拿所有 key2 的值去回表,在回表的时候使用 common_field 的索引

对于联合索引,查询条件要注意索引列声明的顺序,且只有左边的查询条件是 等值 查询时右边的查询条件才能继续使用联合索引

索引列必须和常数比较才会使用索引,两个列进行比较则不会使用到索引

在执行连接查询时,驱动表被访问一次,被驱动表可能会被访问多次,次数与驱动表数据量有关(扇出)

在创建索引时,如果可以尽量使用唯一索引

阅读全文 »

有时 docker 容器会由于错误修改了某些配置文件而无法启动,如 entrypoint 脚本或服务程序的配置文件等等,如果容器内没有什么有价值的数据,那么重新创建容器自然是首选,本文讨论的是容器不能被删除,该如何修复这种情况。

容器跑不起来,docker exec 命令就无法运行,这意味着无法进入容器,修正有问题的配置文件;此时可以使用 docker cp 命令,将容器内的出问题的配置文件复制出来到主机上,在主机上修正配置文件后,再使用 docker cp 命令将其复制回容器内,覆盖掉容器内的原文件,此时执行 docker start 命令启动容器就可以了。