使用certbot-auto给nginx加上免费https证书

准备python3环境

# 非唯一方法,仅供参考
yum install rh-python36
scl enable rh-python36 bash

阅读全文

深度学习入门 矩阵的乘法

刚开始看《深度学习入门 基于Python的理论与实现》,非常好的一本书。
复习一个重要的知识点,矩阵的乘法:

阅读全文

ios12中关闭app内购

之前版本的IOS中,是通过访问限制菜单,限制应用程序内购的。这个功能在设置->通用下可以找到。然后在IOS12中,我们已经找不到了。很显然,它被挪到了另一个地方。当然还是能找到的

阅读全文

reactive-pg-client中的数据库事务

使用reactive-pg-client中的数据库事务有两种写法,一种是通过PgConnectionbegin方法,开启一段数据库事务;另一种是通过PgPoolbegin方法。
先来看第一种:

pool.getConnection(res -> {
if (res.succeeded()) {

// Transaction must use a connection
PgConnection conn = res.result();

// Begin the transaction
PgTransaction tx = conn.begin();

// Various statements
conn.query("INSERT INTO Users (first_name,last_name) VALUES ('Julien','Viet')", ar -> {});
conn.query("INSERT INTO Users (first_name,last_name) VALUES ('Emad','Alblueshi')", ar -> {});

// Commit the transaction
tx.commit(ar -> {
if (ar.succeeded()) {
System.out.println("Transaction succeeded");
} else {
System.out.println("Transaction failed " + ar.cause().getMessage());
}

// Return the connection to the pool
conn.close();
});
}
});

阅读全文

reactive-pg-client实现数据库到应用程序的数据推送

昨天聊过,依托reactive-pg-client可以做很多传统JDBC无法实现的事情,比如PostgreSQL的消息推送(notifylisten)。有了这种功能,我们就可以轻易实现从数据库层主向业务逻辑代码推送消息的功能。可以说,又一次为我们打开了新世界的大门。

阅读全文

性能封神的数据库访问库reactive-pg-client初探

不知道有没有人关注过TechEmpower的Web Framework Benchmarkshttps://www.techempower.com/benchmarks/ ),一种把各种Web后端开发技术都罗列起来,在同样的机器下跑最简单的业务逻辑,来对比各技术性能的竞赛。参与跑分的技术代码,都是开源的,甚至很多代码就是由Web技术本身的作者维护的。
虽说,跑分不能代表性能,性能更不能代表技术的优劣。但是有着么一个性能维度的粗浅比较,还是能带给我们不一样的收获。
比如,在2018-06-06的最新一场比拼中,Vert.x搭配PostgreSQL的组合,在部分比试时表现十分抢眼,性能一骑绝尘且大幅领先第二名。被它踩在脚下摩擦的对手,不乏我们熟知的技术方案,比如gonodejsspringphp,还有mysqlmongodb等数据库。(这里我无意引战,有兴趣的朋友可以查看具体跑分结果相关代码
查看具体跑分代码可知,Vert.x之所以能位居榜首,与其使用的数据库客户端是密不可分的。作为一套基于Java的技术解决方案,Vert.x没有使用Java程序员所熟知的JDBC,而是使用了一种叫reactive-pg-client的技术。
reactive-pg-clientJDBC最大的区别就是前者是针对PostgreSQL数据库单独开发的,利用了PostgreSQL异步特性,最大限度了挖掘了数据库的访问性能。
现在我们就来简单尝试下reactive-pg-client,首先添加依赖

compile 'io.reactiverse:reactive-pg-client:0.10.3'

阅读全文

给异步的Vert.x程序做单元测试

异步的程序先天不好单元测试,尤其是按照传统的JUnit思路来弄,肯定是不行的。好在Vert.x想到了这一点,所以提供了vertx-unit包,专门考虑了对异步代码的测试。
使用起来也很简单,首先

testCompile "io.vertx:vertx-unit:3.5.3"

阅读全文

再谈CompletableFuture

今天是还之前欠的一个账,当时在Vert.x异步方法转同步这篇文章里,我提到其关键点是CompletableFuture类,今天我们就沿着当时的代码继续掰扯一下这个强大的类。
先来回顾下当时的代码

import io.vertx.core.Vertx

import java.util.concurrent.CompletableFuture

String sayHello() {
CompletableFuture completableFuture = new CompletableFuture()

Vertx vertx = Vertx.vertx()
vertx.setTimer(1000, {
completableFuture.complete("hello world")
})

return completableFuture.get()
}

println(sayHello())

阅读全文

iTerm最佳实践


阅读全文

Groovy迭代器中的return陷阱

groovy从不会让人失望,如果有,那就是接下来我要说的这种情况:

def list = [1, 2, 3, 4, 5, 6, 7]
def test(List list) {
list.each {
if (it > 3) {
return it
}
}
}

println test(list)

阅读全文