分类
Linux 笔记

Gnome 3桌面调教

Gnome是很多Linux发行版默认的桌面,最新是Gnome 3.x版本。Gnome 3非常简洁,简洁到只有一个空荡荡的桌面。需要调教一番才能更高效率地工作。

Gnome 3优化工具-Gnome Tweaks

Gnome Tweaks是一个图形化配置Gnome 3的工具。它不仅可以自定义Gnome 3桌面,还能集中管理Gnome 3的插件扩展。后面安装的Gnome 3插件都能在Gnome Tweaks中管理,开启/禁用及配置。

在Ubuntu中安装:apt install gnome-tweak

Gnome 3扩展-Dynamic Top Bar

Dynamic Top Bar可以把Gnome 3顶部栏透明化。不过如果使用浅色的壁纸,顶部栏的白色字体会看不清。

Gnome 3扩展-Hide Top Bar

Hide Top Bar可以把Gnome 3顶部栏设为自动隐藏,增大可视面积。

分类
Java 笔记 编程

Feign设置header无效

把原生Http Connection改为使用Feign请求调用外部接口,在方法上添加注解:

@PostMapping("{接口url}")
@Headers({"Content-Type: application/json"})

返回:

看来用@Headers设置的Content-Type没有生效。@Headers是Feign自带的注册,而@PostMapping是Spring MVC的注解。在@PostMapping中也有header属性,于是改为:

@PostMapping(value = "{接口url}", headers = {"Content-Type: application/json"})

问题依旧。

分类
笔记

反向代理HTTPS下Nextcloud登录问题

升级Nextcloud 17后,登录无法跳转,但是刷新能正常进入管理界面。打开WEB控制台:

看上去似乎是内容安全策略引起。我的Nextcloud是用docker部署,然后始用一台Nginx和一台Apache做反向代理。之前从Nextcloud 15升到Nextcloud 16都是正常的,猜测Nextcloud 17做了更严格的安全限制。

在Nginx和Apache设置CSP策略:

Content-Security-Policy: default-src 'self'

尝试了增加指定信任域名等各种设置无效。这是因为web使用https反向代理了http导致的。最终在github上找到办法,在Nextcloud配置文件中加上:

'overwriteprotocol' => 'https',

参考:https://github.com/nextcloud/server/issues/17432

分类
MySql 数据库 笔记

查看MySQL表字段信息

做完表设计后需制作说明文档。我使用MySQL官方客户端MySQL Workbench建模,该工具不支持把字段信息导出文档,只能生成可执行SQL建库建表。

用客户端建表时字段说明,策略都做好了的,重新再写一次太麻烦,所以想着提取这些信息导出文本。

MySQL中常用查看数据库信息的方法:

# 查看当前用户所有楼据库
show databases;
# 查看当前数据库中所有表
show tables;
# 看数表中所有字段信息
desc 表名

使用desc查看字段,并没有显示建库建表的COMMENT备注,字段信息不能完全符合要做的文档。其实可以在information_schema中查找提取信息。

分类
Windows 笔记

Windows批处理命令之Start

在Windows下执行批处理脚本会打开一个黑乎乎的控制台窗口,任务未执行完成时窗口不会关闭。

编写一个打开软件的脚本,软件未退出时,启动bat脚本的窗口不会被关闭。使用start命令启动,可以实现命令窗口自动关闭。start命令说明:

bat脚本如下:

@echo off

set CURRENT_DIR=%cd%

start "google-chrome" "%CURRENT_DIR%\chrome" --user-data-dir="%CURRENT_DIR%\UserData\qizheng@myid01.com"

保存为Chrome.bat

windows执行bat脚本,都会打开命令窗口,即使自动退出,也会有个黑框一闪而过。使用vbs脚本执行脚本可以隐藏控制台。如下:

set ws=WScript.CreateObject("WScript.Shell") 
ws.Run ".\Chrome.bat",0

保存为vbs,双击可执行。

在这里应该看得出来了,我写的脚本是打开Chrome浏览器,并指定用户数据目录。

分类
容器 笔记

Docker Desktop for Windows

自从使用Docker就变得一发不可收拾。和以前用虚拟机相比,它占资源少,启动快,方便管理。我主要用Docker来管理多个版本的软件共存、切换和升级,比如数据库,NextCloud,Wordpress。

开源的东西总是衷爱Linux,像Docker在Windows下就没那么方便。Windows的Linux子系统目前还不支付Docker,据说下个版本,WSL2会支付。所以我一直都是用VMware安装Linux,再安装Docker。

其实官方有提供在Windows环境下使用Docker的支持。一种是Docker Toolbox
工具,它是基于Oracle的VirtualBox虚拟机的,兼容性好,Windows各个版本都能用。还有一种是Docker Desktop for Windows,它是基于Hyper-V虚拟机。Hyper-V是微软的虚拟机,只在Windows专业版、企业版、工作站版中有。打开控制面板-程序-启用或关闭Windows功能,勾选Hyper-V,确定然后重启生效。

需要注意的是,Hyper-V和VMware、VirtualBox有冲突,开启后,VMware和VirtualBox包括Android虚拟机就不能使用CPU虚拟化了,性能会大打折扣。

从官网,docker.com下载Docker Desktop for Windows安装,安装完成后Docker会自动连接Hyper-V创建MobyLinux系统。Docker可能会提示需要用户登录,如果没有,可以去官网注册一个Docker账号。下载镜像是必须登录的。

分类
MySql 数据库 笔记

MySQL多实例启动

一台服务器安装MySQL,用于测试。同时会用于NextCloud和Wordpress的数据库。NextCloud和Wordpress要经常备份,而且以后可能会迁移。所以隔离不同情景的数据,用多实例启动。便于管理,和提高性能。

首先初始化要用到的数据库:

mysqld --initialize-insecure --datadir=/home/mysql/3307/data --user=mysql;
mysqld --initialize-insecure --datadir=/home/mysql/3308/data --user=mysql;
mysqld --initialize-insecure --datadir=/home/mysql/3309/data --user=mysql;

MySQL自带了mysqld_multi工具运行多个实例。以下是我的配置文件:

[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = root
#password = 

# nextcloud
[mysqld3307]
user		= mysql
pid-file	= /home/mysql/3307/mysqld.pid
socket		= /home/mysql/3307/mysqld.sock
port		= 3307
datadir		= /home/mysql/3307/data
lc-messages-dir	= /usr/share/mysql
skip-external-locking
bind-address		= 0.0.0.0
key_buffer_size		= 16M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
query_cache_limit	= 1M
query_cache_size        = 16M
expire_logs_days	= 10
max_binlog_size   = 100M
innodb_buffer_pool_size = 1G
innodb_io_capacity = 4000

# wordpress
[mysqld3308]
user		= mysql
pid-file	= /home/mysql/3308/mysqld.pid
socket		= /home/mysql/3308/mysqld.sock
port		= 3308
datadir		= /home/mysql/3308/data
lc-messages-dir	= /usr/share/mysql
skip-external-locking
bind-address		= 0.0.0.0
key_buffer_size		= 16M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
query_cache_limit	= 1M
query_cache_size        = 16M
expire_logs_days	= 10
max_binlog_size   = 100M
innodb_buffer_pool_size = 1G
innodb_io_capacity = 4000
innodb_io_capacity = 4000

[mysqld3309]
user		= mysql
pid-file	= /home/mysql/3309/mysqld.pid
socket		= /home/mysql/3309/mysqld.sock
port		= 3309
datadir		= /home/mysql/3309/data
lc-messages-dir	= /usr/share/mysql
skip-external-locking
bind-address		= 0.0.0.0
key_buffer_size		= 16M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
query_cache_limit	= 1M
query_cache_size        = 16M
expire_logs_days	= 10
max_binlog_size   = 100M
innodb_buffer_pool_size = 1G
innodb_io_capacity = 4000

配置多实例,每个实例命名为mysqld*,这里我三个实例配置分别对应[mysql3307],[mysql3308],[mysql3309]。

分类
Linux MySql 笔记

Ubuntu Server初始化MySQL的坑

执行MySQL初始化:

mysqld --initialize --datadir=/home/mysql/3307/data --user=mysql

报错,提示不能创建目录:mysqld: Can’t create directory ‘/home/mysql/3307/data/’ (Errcode: 17 – File exists)

建立目录再执行初始化命令,提示没有权限:mysqld: Can’t create directory ‘/home/mysql/3307/data/’ (Errcode: 13 – Permission denied)

该目录已经属于mysql用户,且有读写执行的权限。设置成0777,依然报错。

相同的命令,曾在CentOS上,自己编译的MySQL用过,不应该是命令的问题。该机器是我的笔记本,安装的是Ubuntu Server 18.04,MySQL是用官方的apt源安装的。经过一番查找,发现是一个叫AppArmor的玩意搞鬼。

Ubuntu有个AppArmor,是一个Linux系统安全应用程序,类似于Selinux,AppArmor默认安全策略定义个别应用程序可以访问系统资源和各自的特权,如果不设置服务的执行程序,即使你改了属主属组并0777权限,也是对服务起不到作用。

分类
Java 笔记

Spring Boot集成Cache和Redis

构建基于Spring Boot 2.X应用,使用Cache,需要引入:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

以前开发Spring用EhCache来做缓存。在做集群或分布式时,还是Redis比较好用。引入Spring Data Redis如下:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

注意这里会有jedis依赖。

在applicatin.yml配置Redis和Cache:

spring:
  cache:
    redis:
      cache-names:
      cache-null-values: false
      key-prefix: spring:cache
      time-to-live: 0
      use-key-prefix: true
    type: # Cache type. By default, auto-detected according to the environment.
  redis:
    database: 5
    url: # Connection URL. Overrides host, port, and password. User is ignored. Example: redis://user:password@example.com:6379
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 3000
    jedis:
      pool:
        max-active: 200
        max-idle: 10
        max-wait: -1
        min-idle: 0

更多配置属性可参考Spring Boot官方说明:

新建RedisConfig类,增加如下方法:

/**
 * 定义缓存数据 key 生成策略的bean
 * 包名+类名+方法名+所有参数
 * @return
 */
@Bean
public KeyGenerator wiselyKeyGenerator(){
	return new KeyGenerator() {
		@Override
		public Object generate(Object target, Method method, Object... params) {
			StringBuilder buff = new StringBuilder();
			buff.append(target.getClass().getName());
			buff.append(method.getName());
			for (Object obj : params) {
				buff.append(obj.toString());
			}
			return buff.toString();
		}
	};
}
分类
笔记

破解WinRAR

最近WinRAR爆出一个存在十多年的漏洞,影响很大。全新的5.7版本已修复。

几年前WinRAR开始免费,但免费版会弹出广告。我在官方下载了最新WinRAR 5.7,然后导入注册文件。再打开WinRAR显示已注册。可WinRAR依然弹出广告。

源于强迫症,不肯屈服广告。但网上没有最新的正式破解版(有5.7 beta2版本),无奈只有自己动手了。

下载 Resource Hacker ,找到WinRAR安装目录,打开WinRAR.exe文件编辑。

找到字符串表格(String Table)展开,找到第80行。然后找到1277行,把内容删除。

点击编译,然后保存文个。用保存下来的文件替换安装目录下的WinRAR。

经测试,如果没有注册文件,广告弹窗依然会有,只是没有内容。这里我提供一份网上找来的注册文件:点击下载

把rarreg.key复制到和WinRAR.exe同一目录即可。

这下没有弹窗,终于清爽了。