分类
容器

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 中的值可以是一个简单的显式字符串值,也可以是一个命令执行后的结果(`` 包含其内的命令执行的结果,本系列第二篇文章中有描述)。我经常使用这种结构。

分类
Java 笔记

阿里云自动动态地址解析

家里找电信开通了动态公网地址,每天IP会变一次。我的域名是在阿里云申请的,路由器只支持花生壳和公云的DDNS设置,每天手动变更一次域名指向麻烦,利用阿里云的API,写了一个动态更新的小工具。

首先在阿里云后台申请创建AccessKey:

分类
Bash

怎样用 Bash 编程:逻辑操作符和 shell 扩展

逻辑操作符是程序中进行判断的根本要素,也是执行不同的语句组合的依据。有时这也被称为流控制。

逻辑操作符

Bash 中有大量的用于不同条件表达式的逻辑操作符。最基本的是 if 控制结构,它判断一个条件,如果条件为真,就执行一些程序语句。操作符共有三类:文件、数字和非数字操作符。如果条件为真,所有的操作符返回真值(0),如果条件为假,返回假值(1)。

这些比较操作符的函数语法是,一个操作符加一个或两个参数放在中括号内,后面跟一系列程序语句,如果条件为真,程序语句执行,可能会有另一个程序语句列表,该列表在条件为假时执行:

if [ arg1 operator arg2 ] ; then list
或
if [ arg1 operator arg2 ] ; then list ; else list ; fi

像例子中那样,在比较表达式中,空格不能省略。中括号的每部分,[ 和 ],是跟 test 命令一样的传统的 Bash 符号:

if test arg1 operator arg2 ; then list

还有一个更新的语法能提供一点点便利,一些系统管理员比较喜欢用。这种格式对于不同版本的 Bash 和一些 shell 如 ksh(Korn shell)兼容性稍差。格式如下:

if [[ arg1 operator arg2 ]] ; then list
分类
Linux

怎样用 Bash 编程:语法和工具

Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理员将命令输入系统的时候,Linux 的 shell 解释器就会把这些命令转换成操作系统可以理解的形式。而执行结果返回 shell 程序后,它会将结果输出到 STDOUT(标准输出),默认情况下,这些结果会显示在你的终端。所有我熟悉的 shell 同时也是一门编程语言。

Bash 是个功能强大的 shell,包含众多便捷特性,比如:tab 补全、命令回溯和再编辑、别名等。它的命令行默认编辑模式是 Emacs,但是我最喜欢的 Bash 特性之一是我可以将其更改为 Vi 模式,以使用那些储存在我肌肉记忆中的的编辑命令。