分类
日记

稻草人2021

本站建立有8年了,如果把从学生时代QQ空间迁进来的文章算起,写博客有12年(应该更久)。一共已发布文章有320篇文章,浏览次数最高的文章是7万多。有收到几个看我原创文章解决问题的网友感谢,也是我坚持写的原因。

偶尔翻看以前的文章,我都会有一种感觉。那就是以前的思考,感想很幼稚,技术类文章不深入,有一种想删除重来的冲动。有人说,如果你觉得现在看去年自己像个傻X,那说明你在进步。也许吧,成长是一种过程,是不断否定自己,而原来那些现在看起来浅显的过程也是必不可少的。

时间一长,这个站的类别杂乱,有着技术和生活。然而不是每个人都看我的生活,更多的是从搜索引擎进来,看一些我在工作中踩过的坑。而且做为知识库,应该更加专注一点。所以我重新再建一个站,把生活和工作分离。

这个站以后更多是发布娱乐和生活类的,记录身边一些有意思的事。原来的文章会全部保留,但不会迁到新站点。新的站点对文章质量会提高标准,一些重要的文章以后会重新梳理再写到新站点。

新网站:engr-z.com

这个网站更名为“稻草人”,这也是我以前经常用的昵称。无论是过去还是现在,它的寓义依然适用。

分类
软件

Nextcloud显示视频缩略图

通过docker安装配置完成Nextcloud后你会发现所有的视频文件都没有缩略图

安装ffmpeg后Nextcloud是可以自动生成的。进入Docker APP,执行安装

docker exec -it nextcloud bash

apt update

apt install ffmpeg

修改/var/www/html/config/config.php配置文件,添加:

'enable_previews' => true,
'enabledPreviewProviders' =>
array (
  0 => 'OC\\Preview\\Image',
  1 => 'OC\\Preview\\Movie',
  2 => 'OC\\Preview\\TXT',
),

分类
Java 笔记 编程

DataSource health check failed

在项目中集成ShardingJDBC,启动报错:ConnectionCallback; isValid; nested exception is java.sql.SQLFeatureNotSupportedException: isValid

该项目是新做的,使用较新版本的Spring Boot 2.3,数据库连接词用Hikari。

用Sharding-JDBC蛮久了,之前一直是与DBCP2或Druid,没出过什么问题。这次集成Hikari,系统虽然报错但也能正常启动,仔细看源码,问题应该出在键康检查。

分类
容器

Docker容器中运行Nextcloud occ命令

occ命令是Nextcloud的命令行界面,nextcloud管理员可以通过occ执行许多常见的服务器操作。通常非Docker环境部署的nextcloud系统中,用户可以在nextcloud的根目录(例如:/var/www/html)下通过如下格式执行occ命令:

sudo -u www-data php occ <your_command>

但是在docker中的nextcloud会报错:

分类
Linux 容器

Docker架设L2TP VPN

在Linux下安装使用PPTP VPN非常简单。自从IOS 10不支持PPTP后,只能使用L2TP协议的VPN了。

L2TP名词解释:

L2TP(Layer 2 Tunneling Protocol)
IPSec(Internet Protocol Security)
IKEv2 (Internet Key Exchange v2)

能实现 IPsec 的目前总体上有 openswan,libreswan,strongswan 这3种。

libreswan 是基于 openswan 的 fork,所以现在各个发行版基本已经看不到 openswan 的身影了。当然也有使用 strongswan 的。

分类
Java

Java基于Runtime调用外部程序出现阻塞的解决

有时候在java代码中会调用一些外部程序,比如SwfTools来转换swf、ffmpeg来转换视频等。如果你的代码这样写:

Runtime.getRuntime().exec(command),会发现程序一下就执行完毕,而在命令行里要执行一会,是因为java没有等待外部程序的执行完毕,此时就需要使用阻塞,来等待外部程序执行结果:

InputStream stderr = process.getInputStream();
InputStreamReader isr = new InputStreamReader(stderr, "GBK");
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
  System.out.println(line);
int exitValue = process.waitFor();

对于一般的外部程序使用上面的阻塞代码就可以,至少pdf2swf.exe是没有问题的。

但是紧接着又发现对于ffmpeg来说,以上代码会让程序卡住不动,需要使用另一种方式,封装成了一个方法,如下:

分类
日记

2020这一年

距离2020仅剩下几天时间,把这一年里的事件做个流水账,虽然不是很精彩,毕竟是我自己人生轨迹的一部分,还是有意义的。

灾难年年有,今年特别多。其中新冠状病毒是影响最大的,其他事件都显得不值一提。因为疫情,从年初到现在还带着口罩。这是我长这么大第一次戴口罩,也是最久的。上半年在家办公,学校也是推迟半年才开学。此次疫情使很多公司都倒闭了,门店关门,对经济影响蛮大。好在国内控制及时,目前国内基本安全。国外现在还挺严重的,感染上百万人。所以今年出国旅游也取消了,还是安分点好。

分类
Web

设置WordPress内所有URL都在新标签页打开

WordPress默认情况下几乎所有URL链接都是在同一个标签页打开。这样的话,读者点击一个链接就会离开当前页面,如果读者想要查看原来的页面又要进行返回操作,在某些情况下用户体验不佳。但是,如果一个一个单独为每个链接添加新标签页打开的代码,工作量会很大,也容易造成遗漏。本文就介绍一种通过一次添加代码的操作,达到全站链接都在新标签页打开的方法。

打开当前正在使用的WordPress主题中的header.php 文件(在WordPress中该文件用于设置全局页面的顶部),在 的后面加上:

<base target="_blank">
分类
Nginx Web 笔记

Nginx https 反向代理 http

在Docker中运行WEB应用,由主机Nginx反向代理。由于Docker中的应用是http,而反向代理强制使用https,会遇到有些情况代理失败。

只要在配置中加上

proxy_set_header X-Forwarded-Proto https;

完整配置:

server {
    listen 80;
    listen [::]:80;
    server_name engr-z.com www.engr-z.com;
#    enforce https
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name engr-z.com www.engr-z.com;

    client_max_body_size 1G;

    ssl_certificate /data/www/cert/engr-z.com_nginx/cert.pem;
    ssl_certificate_key /data/www/cert/engr-z.com_nginx/cert.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #使用该协议进行配置。
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://127.0.0.1:8001/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
#        proxy_cookie_path / /;
    }
}
分类
Bash Linux

怎样用 Bash 编程:循环

我使用过的所有编程语言都至少有两种循环结构来用来执行重复的操作。我经常使用 for 循环,然而我发现 while 和 until 循环也很有用处。

for 循环

我的理解是,在 bash 中实现的 for 命令比大部分语言灵活,因为它可以处理非数字的值;与之形成对比的是,诸如标准 C 语言的 for 循环只能处理数字类型的值。

Bash 版的 for 命令基本的结构很简单:

for Var in list1 ; do list2 ; done

解释一下:“对于 list1 中的每一个值,把 $Var 设置为那个值,使用该值执行 list2 中的程序语句;list1 中的值都执行完后,整个循环结束,退出循环。” list1 中的值可以是一个简单的显式字符串值,也可以是一个命令执行后的结果(“ 包含其内的命令执行的结果,本系列第二篇文章中有描述)。我经常使用这种结构。